FPGA的调试-在线存储器内容编辑工具(In-system Memory Content Editor)

对于FPGA调试,主要以Intel FPGA为例,在win10 Quartus ii 17.0环境下进行仿真和调试,开发板类型EP4CE15F17。主要包括一下几个部分:

- FPGA的调试-虚拟JTAG(Virtual JTAG)

- FPGA的调试-在线存储器内容编辑工具(In-system Memory Content Editor)

- FPGA的调试-内嵌逻辑分析仪(SignalTap)

- FPGA的调试-LogicLock

- FPGA的调试-调试设计的指导原则

上述内容主要参考《通信IC设计》,有兴趣的可以自己购买书籍进行研读。

FPGA的调试-在线存储器内容编辑工具(In-system Memory Content Editor)

这部分主要参考这篇博客,传送门
In-System Memory Content Editor,其主要功能就是能实时更改RAM,ROM中的数值,同时也可以修改FPGA内部定义的常数值。它是通过JTAG调试接口去完成RAM,ROM中的数据读写,是一种在线调试工具。注意目前该功能只能用于单口ram,不支持双口ram。下面就介绍下如何通过In-System Memory Content Editor去读取或修改RAM中的数据以及常数值的修改。
(1)首先肯定是新建一个工程。名为 test(下图是我已经例化好IP后的工程)

这里写图片描述
该工程例化了2个IP核,一个是单口ram,一个是constant 常数设置IP核,利用常数IP的输出值作为单口ram的读地址。这样当我通过In-System Memory Content Editor更新了一个常数值,即更新了ram的读地址。而ram默认写wren使能为低,则为读我更新地址的数值。
(2)例化一个单口ram IP核。
单口ram位宽为8 ,深度为32

  • Widths/Bclk Type/Clks 设置如下
    这里写图片描述

  • Regs/Clken/Byte Enable/Acls 设置 如下
    这里写图片描述

  • Read During Write Option 默认设置
    这里写图片描述
  • Mem Init 注意:该页设置时,需要勾选上红框1 ,表示允许In-System Memory Content
    Editor独立地去读取和修改RAM中的数据。另外还需在红框2处给该RAM取个例化ID名:RAM8 用于区分多个实例

这里写图片描述

  • 最后finish 就例化好了一个单口RAM。

(3)同样再例化一个constant IP核。
设置成如下图所示
设置输出数据位宽为5
初始化设置该数值为0
勾选使能In-System Memory Content Editor
取一个ID名:CONS
其余页设置为默认 ,点击finish即可。
这里写图片描述

(4)完成后,在工程中做如下例化,同时添加系统时钟管脚
这里写图片描述

module test (
    input clk   // Clock


);

wire [4:0] address;
reg [7:0] data;
reg  wren;

wire [7:0] out_data;

RAM RAM_inst   //ID:RAM8
(
.address  (address),
.clock    (clk),
.data     (data),
.wren     (wren),
.q        (out_data)

    );

wire [4:0] result_sig;
assign address=result_sig;

constant    constant_inst //CONS
(
    .result ( result_sig )
    );

endmodule

(5)进行全编译
(6)为了验证In-System Memory Content Editor是否能修改memory的数值,需要加入Singal Tap ii 对信号进行抓取。加入需要抓取的信号,第一个即是常数值信号。采样时钟就用系统时钟clk。深度为512,其余设置保持默认。
这里写图片描述
(7)再次全编译,完成后将.sof文件通过JTAG下载到FPGA芯片中。
(8)Tools ->In-System Memory Content Editor打开In-System Memory Content Editor工具调试界面
这里写图片描述
In-System Memory Content Editor工具调试界面如下图所示,从图上可以看到我们例化的两个IP核
这里写图片描述
(9)读取操作
在下图中左键选择你要读取的信号,比如这里要读取Instance ID 为CONS的常数信号的值,则选中它,然后鼠标右键->鼠标左键 Read Data from In-System Memory。
这里写图片描述
在下图中,就读出了CONS的数值为0x00 ,跟我们在例化IP核时设置的数值一致。
这里写图片描述
同样在signaltapii中抓取constant_ip 核的输出也是 0x00。
这里写图片描述
(10)更改数值操作
首先把ram里地址从0x00到0x04 5个地址的值更新为0x01,0x02,0x03,0x04,0x05。
这里写图片描述
接着在上面窗口中选中该ID ,鼠标右键->左键单击Write Data to In-System Memory项。通过JTAG将ram里地址从0x00到0x04存储的值修改成0x01,0x02,0x03,0x04,0x05。
这里写图片描述
此时可以通过signaltapii 查看ram里的值是否已经被修改,此时由于地址0存储的数是0x01,读地址没变还是0,那ram的输出值应该是0x01,signaltapii 抓取发现ram的输出值是0x01.证明通过In-System Memory Content Editor成功修改了ram的地址为0的值。
这里写图片描述
接着可以通过In-System Memory Content Editor修改常数值(ID位CONS)为0x01,即更新了ram的地址为0x01。
这里写图片描述
同样通过signaltapii去获取对应信号的值,看是否与设置的一致。从下图可以看出ram的地址为0x01读出的数为0x01与In-System Memory Content Editor设置的一致,同时常数值(ID位CONS)为0x01也与In-System Memory Content Editor设置的一致。

这里写图片描述

扫描二维码关注公众号,回复: 3509061 查看本文章

到这里,结束


猜你喜欢

转载自blog.csdn.net/Pieces_thinking/article/details/82421142