[ZYNQ Ultrascale + MPSOC FPGA教程]第7章FPGA片上ROM测试实验

原始教程是由信义电子技术(上海)有限公司(ALINX)创建的。

版权归我们公司所有。

如果需要重印,则需要授权并注明出处。

适用于板子型号:AXU2CGA / AXU2CGB / AXU3EG / AXU4EV-E / AXU4EV-P / AXU5EV-E / AXU5EV-P / AXU9EG / AXU15EG实验Vivado项目为“ rom_test”; FPGA本身是SRAM体系结构,断电后程序消失了,那么如何使用FPGA实现ROM?我们可以使用FPGA内部的RAM资源来实现ROM,但这不是真正的ROM,但是每次打开电源时,初始化值都会写入RAM。

该实验将介绍如何使用FPGA内部的ROM以及程序从ROM读取数据。

1.实验原理Xilinx在VIVADO中为我们提供了ROM的IP内核,我们只需要通过IP内核实例化ROM,并根据ROM的读取顺序读取ROM中存储的数据。

在实验中,通过VIVADO集成的在线逻辑分析仪ila,我们可以观察ROM的读取时序和从ROM读取的数据。

2.程序设计2.1创建ROM由于初始化文件是ROM,我们必须事先准备好数据,然后在FPGA实际运行时,我们可以直接读取ROM中预存储的数据。

XilinxFPGA的片上ROM支持初始数据配置。

如下图所示,我们可以创建一个名为rom_init.coe的文件。

注意,后缀必须为“ .coe”。

当然,可以随意更改以前的名称。

ROM初始化文件的内容格式非常简单,如下图所示。

第一行定义数据格式,16表示ROM数据格式为十六进制。

从第3行到第34行,它是此32 * 8bit ROM的初始化数据。

在每行数字之后使用逗号,并在最后一行数字的末尾使用分号。

写入rom_init.coe之后,保存它,然后我们开始设计和配置ROMIP内核。

2.2添加ROMIP核心在添加ROMIP之前,创建一个新的rom_test项目,然后将ROMIP添加到该项目。

方法如下:2.2.1单击下图中的IPCatalog,在右侧的弹出界面中搜索rom,找到BlockMemoryGenerator,然后双击将其打开。

2.2.2将ComponentName更改为rom_ip,然后在“基本”列下,将MemoryType更改为SingleProtROM。

2.2.3切换到PortAOptions列,将ROM位宽度PortAWidth更改为8,将ROM深度PortADepth更改为32,将使能引脚EnablePortType更改为Always,并取消PrimitivesOutputRegister 2.2.4切换到OtherOptions列,检查LoadInitFile,单击浏览,然后选择之前创建的.coe文件。

2.2.5单击“确定”,单击“生成”以生成ip core。

3. ROM测试程序ROM的编程非常简单。

在程序中,只要我们每个时钟改变ROM的地址,ROM就会输出当前地址的内部存储数据,实例化ila,以观察地址和数据的变化。

ROMIP的实例化和程序设计如下:`timescale1ns / 1psmodulerom_test(inputsys_clk,// 25MHz时钟输入,rst_n //复位,低电平有效); wire [7:0] rom_data; // ROM读取数据reg [4:0] rom_addr; // ROM输入地址//生成ROM地址以始终读取数据@(posedgesys_clkornegedgerst_n)beginif(!rst_n)rom_addr绑定引脚### ############ CompressBitstream ######################## set_propertyBITSTREAM.GENERAL.COMPRESSTRUE [current_design] set_propertyPACKAGE_PINAB11 [get_portssys_clk] set_propertyIOSTANDLVCMOS33 [get_portssysclock-period4 namesys_clk-waveform {0.00020.000} [get_portssys_clk] set_propertyIOSTANDARDLVCMOS33 [get_ports {rst_n}] set_propertyPACKAGE_PINW13随仿真结果在{line_s}上。

像RAM读取数据一样,数据滞后于地址一个周期。

5.板载验证将地址0作为触发条件,您可以看到读取的数据与仿真一致。