Menu Close

Quartus 工具 In-System Memory Content editor 使用

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]

rom_7SEG_VIO.zip

[/content_control]

Posted in FPGA, FPGA 教材教案, Verilog, 教材与教案, 文章

发表回复

相关链接