HDLFPGA学习笔记二十四:Vivado ROM IP核的使用

it2026-04-04  5

一、ROM IP核配置

ROM 要比之前说的RAM简单的多,因为它只有读数据的端口,没有写数据的端口。不过还是可以配置成单端口或者双端口,这里的双端口指的都是读数据的端口。因为比较简单,这里就不做过多介绍,下面是我本次实验的ROM IP核的配置情况:

1、查找 ROM IP核

可以看到,其实和之前的RAM是一样的。

2、选择单口ROM

3、设置数据位宽和深度

4、初始化ROM

这里使用的是coe文件,文件内容如下:

MEMORY_INITIALIZATION_RADIX=16; //表示ROM内容的数据格式是16进制 MEMORY_INITIALIZATION_VECTOR= 11, 22, 33, 44, 55, 66, 77, 88, 99, aa, bb, cc, dd, ee, ff, 00, a1, a2, a3, a4, a5, a6, a7, a8, b1, b2, b3, b4, b5, b6, b7, b8; //每个数据后面用逗号或者空格或者换行符隔开,最后一个数据后面加分号

二、实例

在该实例中,我们就简单的依次读取ROM中的数据,其中读数据地址递增。

1、RTL代码

`timescale 1ns / 1ps module rom_test( input sys_clk, //50MHz时钟 input rst_n //复位,低电平有效 ); wire [7:0] rom_data; //ROM读出数据 reg [4:0] rom_addr; //ROM输入地址 //产生ROM地址读取数据 always @ (posedge sys_clk or negedge rst_n) begin if(!rst_n) rom_addr <= 10'd0; else rom_addr <= rom_addr+1'b1; end //实例化ROM rom_ip rom_ip_inst ( .clka (sys_clk ), //inoput clka .addra (rom_addr ), //input [4:0] addra .douta (rom_data ) //output [7:0] douta ); endmodule

2、仿真程序

`timescale 1ns / 1ps module vtf_rom_tb; // Inputs reg sys_clk; reg rst_n; // Instantiate the Unit Under Test (UUT) rom_test uut ( .sys_clk (sys_clk), .rst_n (rst_n) ); initial begin // Initialize Inputs sys_clk = 0; rst_n = 0; // Wait 100 ns for global reset to finish #100; rst_n = 1; end always #10 sys_clk = ~ sys_clk; //20ns一个周期,产生50MHz时钟源 endmodule

3、仿真结果 可以看出,读取的数据和上述的coe文件中的内容是一样的,说明实验成功!!!

最新回复(0)