原始声明:该原始教程是由信义电子技术(上海)有限公司(ALINX)创建的。
版权归我们公司所有。
如果需要重印,则需要授权并注明出处。
适用于板子型号:AXU2CGA / AXU2CGB / AXU3EG / AXU4EV-E / AXU4EV-P / AXU5EV-E / AXU5EV-P / AXU9EG / AXU15EG实验Vivado项目为“ ram_test”。
RAM是FPGA中常用的基本模块,可以广泛用于数据缓冲。
它也是ROM和FIFO的基础。
该实验将介绍如何使用FPGA内部的RAM以及程序对RAM进行数据读写。
1.实验原理赛灵思在VIVADO中为我们提供了RAM的IP内核,我们只需要通过IP内核实例化一个RAM,并根据RAM的读写时序来读写存储在RAM中的数据。
在实验中,通过VIVADO集成的在线逻辑分析仪ila,我们可以观察RAM的读写时序以及从RAM读取的数据。
2.创建一个Vivado项目,在添加RAMIP之前创建一个新的ram_test项目,然后将RAMIP添加到该项目中,如下所示:2.1单击下图中的IPCatalog,在右侧的弹出界面中搜索ram,找到BlockMemoryGenerator,并双击打开它。
2.2将ComponentName更改为ram_ip,然后在“基本”列下,将MemoryType更改为SimpleDualProtRAM,它是伪双端口RAM。
一般来说,“ SimpleDualPortRAM”指的是“ SimpleDualPortRAM”。
是最常用的,因为它是两个具有独立输入和输出信号的端口。
2.3切换到PortAOptions列,并将RAM位宽度PortAWidth更改为16,这是数据宽度。
将RAM深度PortADepth更改为512。
深度是指RAM中可以存储多少数据。
使能引脚EnablePortType更改为AlwaysEnable。
2.4切换到PortBOptions列,将RAM位宽PortBWidth更改为16,并将启用引脚EnablePortType更改为AlwaysEnable。
当然,您也可以使用ENENBPin,这等效于读取使能信号。
PrimitivesOutputRegister是未选中的,其功能是在输出数据中添加一个寄存器,可以有效地改善时序,但是读取的数据将滞后于地址两个周期。
在许多情况下,此功能被禁用,并且数据在地址后面保持一个周期。
2.5在OtherOptions列中,无需初始化RAM数据(例如ROM),我们可以在程序中写入数据,因此可以配置默认值,只需单击OK。
2.6单击“生成”,然后单击“生成”。
生成RAMIP。
3. RAM端口定义和时序SimpleDualPortRAM模块端口的描述如下:信号名称方向描述clkain端口A时钟输入weain端口A使能addrain端口A地址输入dinain端口A数据输入clkbin端口B时钟输入addrbin端口B地址输入doutbout端口B数据输入和输出RAM数据的写入和读取在时钟的上升沿进行。
当写入端口A数据时,需要将wea信号设置为高电平,并同时提供要写入的地址和数据。
下图显示了将输入写入RAM的时序图。
RAM写入时序和端口B无法写入数据,并且只能从RAM读取数据,只要提供了地址即可,在正常情况下,可以在下一个周期中收集有效数据。
RAM读取时序4.测试程序的编写以下是RAM测试程序的编写。
由于具有测试RAM的功能,我们将一系列连续数据写入RAM的端口A,仅写入一次,然后从端口B读取,然后使用逻辑分析仪查看数据。
代码如下:timescale1ns / 1ps ////////////////////////////////////////// ////////////////////// moduleram_test(inputclk,// 25MHz Clock inputrst_n // reset Signal,低级别有效); // ----------------------------------------- ----------------- reg [8:0] w_addr; // RAMPORTA写地址reg [15:0] w_data; // RAMPORTA写数据regwea; // RAMRAMA启用reg [8:0] r_addr; // RAMPORTB读取地址线[15:0] r_data; // RAMPORTB读取数据//生成RAMPORTB读取地址always @(posedgeclkornegedgerst_n)beginif(!rst_n)r_addr以便能够看到实时对于在RAM中读取的数据值,我们在此处添加了ila工具,以观察RAMPORTB的数据信号和地址信号。
有关如何生成ila的信息,请参阅“ PL”的“ HelloWorld” LED实验”。
程序结构如下:绑定Pin ################## CompressBitstream ####################### ########## CompressBitstream ################################ CompressBitstream #################################################################################################################################################################################################################################################### ################################################ ################################################ ############################## get_portsclk] create_clock-period40.000-nameclk-波形{0.00020.000-nameclk-波形[0.00020.000-nameclk-波形{0.00020.000-named_s