Quartus 中,提供一个功能:In-System Memory Content Editor 应用,这个应用主要是可以帮助用户进行在线的调试功能。它可以在线的修改ROM, RAM 里面的内容, 同时这个功能也有和Xilinx VIO 类似的效果,可以实现虚拟的输出功能。本文参考文章Quartus ROM 的生成与配置详解中的单端口ROM的例化说明 In-System Memory Content Editor的使用。
1.使用 In-System Memory Content Editor 下载sof 文件
文章Quartus ROM 的生成与配置详解中,在例化ROM的IP核中勾选了Allow In-System Memory Content Editor 功能,如图1所示。本文使用这个功能对ROM进行在线的调试。在线调试包括:在线调试读ROM 里面的内容, 在线调试写ROM 里面的内容等。

图1
p1_rom.mif 内容
% file name : p1_rom.mif% DEPTH = 32; -- The size of memory in words WIDTH = 8; -- The size of data in bits ADDRESS_RADIX = HEX; -- The radix for address values DATA_RADIX = HEX; -- The radix for data values CONTENT -- start of (address : data pairs) BEGIN 00 : 40; --memory address : data 01 : 79; 02 : 24; 03 : 30; 04 : 19; 05 : 12; 06 : 02; 07 : 78; 08 : 00; 09 : 10; 0A : 08; 0B : 03; 0C : 46; 0D : 21; 0E : 06; 0F : 0e; END;
In-System Memory Content Editor 实验代码如下所示:
module rom_7SEG #
(
parameter SIM_DEBUG = "FALSE"
)
(
input inclk, //50Mhz
input rst,
output [5:0] SEAT,
output [6:0] SEVEN_SEG
);
reg [26:0] div;
reg f_s;
reg [3:0] seg_addr;
assign SEAT = 6'b11_1110;
localparam PARAM_1S = (SIM_DEBUG == "FALSE") ? 49999999 : 9;
always@(posedge inclk or posedge rst) //分频
if(rst)
begin
div = 0;
f_s = 0;
end
else
begin
if(div == PARAM_1S)
begin
div = 0;
f_s = 1'b1;
end
else
begin
div = div + 1;
f_s = 0;
end
end
always@(posedge inclk or posedge rst) //地址计数
if(rst)
begin
seg_addr = 0;
end
else
begin
if(f_s)
seg_addr = seg_addr + 1;
end
p1_rom p1_rom_inst
(
.address ({4'h0,seg_addr}),
.clock (inclk),
.q (SEVEN_SEG) //ROM.q是8位输出,这里只用了低7位
);
endmodule
管脚分配如表1所示:
表1:

完成管脚分配后,编译工程。在之前的例子中,将编写好的工程下载到开发板时,会使用programmer 功能。

图2
而在使用 In-System Memory Content Editor 功能是需要使用 In-System Memory Content Editor这个应用下载sof 文件

图3

图4
1)选择jtag 下载器
2)选择需要下载的sof文件
3)下载sof文件
下载sof完成后,显示

图5
2.读取ROM 里面的内容

图6
1)选择instance ID
2)点击读取button
从图6中可以看出,instance ID = NONE, 这个设置和图1中显示的内容是一致的。并且可以看出从ROM里面读出的内容和我们之前的例子中使用*mif文件中的内容一致。
3.写ROM 里面的内容
这个功能用于在线调试中, 更改ROM里面的内容。

图7
1)选择instance ID
2)更改instance 的内容
3)点击写button
当写入后,我们会发现这时开发板上的内容已经改变了。
这样,我们就可以使用In-System Memory Content editor 这个应用,实现对ROM,RAM等存储单元进行在线调试了
4.使用In-System Memory Content editor 实现虚拟output 功能
在vivado 软件中,我们可以使用VIO 这个IP 实现虚拟的IO 功能:Vivado软件 调试工具的使用进阶(VIO的使用)
在Quartus软件中也有类似的功能,但只能实现output功能, 没有input功能。input功能也可以使用signal tap Logic Analyzer 来实现。
还是有以之前的7seg 工程为例:
在rom_7SEG.v 中例化lpm_constant 模块 ,这个模块类似xilinx 的vio。
图8
生成IP 为ALTERA_VIO

图9

图10
1)选择 1 bit 的output ,当然,根据自己项目的调试需要, 可以增加output 个数。
2)选择 output 的缺省的输出值
3)勾选In-System Memory Content editor
4)指示 Instance ID 为 DP

图11
IP 核制作结束。
将制作的IP(ALTER_VIO)添加到rom_7SEG.v中
module rom_7SEG #
(
parameter SIM_DEBUG = "FALSE"
)
(
input inclk, //50Mhz
input rst,
output DP,
output [5:0] SEAT,
output [6:0] SEVEN_SEG
);
reg [26:0] div;
reg f_s;
reg [3:0] seg_addr;
assign SEAT = 6'b11_1110;
localparam PARAM_1S = (SIM_DEBUG == "FALSE") ? 49999999 : 9;
always@(posedge inclk or posedge rst) //分频
if(rst)
begin
div = 0;
f_s = 0;
end
else
begin
if(div == PARAM_1S)
begin
div = 0;
f_s = 1'b1;
end
else
begin
div = div + 1;
f_s = 0;
end
end
always@(posedge inclk or posedge rst) //地址计数
if(rst)
begin
seg_addr = 0;
end
else
begin
if(f_s)
seg_addr = seg_addr + 1;
end
//assign DP = 1'b1;
p1_rom p1_rom_inst
(
.address ({4'h0,seg_addr}),
.clock (inclk),
.q (SEVEN_SEG) //ROM.q是8位输出,这里只用了低7位
);
ALTERA_VIO ALTERA_VIO_inst
(
.result(DP)
);
endmodule
1)添加DP管脚,pin location 是pin_128
2)添加了ALTERA_VIO IP
3)对整个工程编译生成sof文件,使用In-System Memory Content editor 下载sof 文件

图12
可以看到ALTERA_VIO IP 制作时Instance ID 在界面中有显出出来的。
5.读取ALTERA_VIO output的当前值:

图13
1)选择instance ID = DP
2)点击读button
3)在内容栏中可以看到 DP的值为0
我们会发现,读取的当前值和 IP设置时的缺省值 0 是一致的。
真实的开发板上的数码管显示为:

图14
我们发现,小数点显示出来了
6.写ALTERA_VIO output的值:

图15
1) 选择instance ID = DP
2)修改output 值为 1
3)点击写button
真实的开发板上的显示

图16
这时, 小数点没有显示了。
总结:
这里,我们学些了quartus 软件中的In-System Memory Content editor 软件的使用, 这个软件可以:
1)下载sof 文件到FPGA开发板
2)在线调试ROM, RAM 等IP (IP 生成时需要勾选 In-System Memory Content Editor)
3)可以使用LPM_CONTSTANT 实现虚拟输出功能
工程代码下载:(Quartus)
[content_control]
[/content_control]
