Distributed Memory Generator 是一个用 LUT、RAM来实现存储的ip核,可用作一个大型查找表。本文仅讨论其中的 ROM 的使用。
目录
ROM 的配置
首先创建 coe 文件,(创建一个txt文件,改后缀为coe)coe 文件的格式如下,第一行的 10 代表十进制,第三行及往后为数据,换成自己需要的数据。
memory_initialization_radix = 10;
memory_initialization_vector =
1,
2,
3,
4,
5,
6,
7,
8
在 IP Catlog 中搜索 dist_mem_gen,双击开始配置
点ok,配置完毕。
ROM 的调用、代码及仿真结果
代码
定义端口并例化
module rom(
input clk,
input rst,
output [15 : 0] qspo
);
reg [6 : 0] addr;
//读地址自增
always @ ( posedge clk ) begin
if ( rst )
addr <= 7'd0;
else
addr <= addr + 1'b1;
end
dist_mem_gen_0 rom_inst (
.a (addr ), // input wire [5 : 0] a
.clk (clk ), // input wire clk
.qspo (qspo ) // output wire [15 : 0] qspo
);
endmodule
写testbench
module rom_tb(
);
reg clk;
reg rst;
wire [15 : 0] qspo;
initial clk = 1;
always#5 clk = ~clk;
initial begin
rst = 1;
#11;
rst = 0;
end
rom rom_tb_inst(
.clk (clk ),
.rst (rst ),
.qspo (qspo )
);
endmodule
仿真结果
由于我创建的 coe 文件中仅有 8 个数据,因此当读地址为 9 的时候,没有数据读出。拉到后面看到读地址为 65 的时候又读出了 1 、2 、3 、……,因为设置的 ROM 深度为64,可能是 65 除以 64 的余数为 1 , 所以读了地址 1 处的数据。
若是配置的第二页,output options 选择 Non Registered,则输出与地址 addr 同步,不会滞后一拍,input options 和 output options 都选择 Registered 输出则会滞后地址一拍,即地址 1 对应的数据直到下一个时钟上升沿才被输出。