【IP】Block Memory Generator IP核
简单介绍一种利用Block Memory Generator IP核生成ROM,实现查找表功能的例子
一、Basic
Interface Type:Native
Memory Type:single port ROM
二、Port A Options
enable port type:always enable
勾选上primitives output register,在输出时会再打一拍,这对时序收敛和提高系统频率有帮助。
但是也会带来summary中total port A read latency:2 Clock cycles
也就是说第一个地址送过来后,等两个时钟周期后数据才会放在总线上。
三、other options
在Memory Initialization中勾选 load init files,用来创建COE文件
ROM初始化COE文件制作
1、Xilinx的COE文件用于对ROM做初始化赋值
2、memory_initialization_radix后是数据格式,COE文件中的数据格式可以是二、十或十六进制
3、memory_initialization_vector后是初始化数据。
memory_initialization_radix = 16;
memory_initialization_vector =
0000,
……
ffff;
在外面配置好COE文件后,要在工程里重新添加(加载)COE文件。
“对于所有IP核,都可以在IP Sources-对应IP-Instantiation Template里找到VHDL和Verilog的例化模板代码”
// Design Part blk_mem_gen_1 sine_wave_LUT ( .clka(i_clk), // input wire clka .addra(i_data), // input wire [7 : 0] addra .douta(o_gray) // output wire [7 : 0] douta ); reg [1:0] r_vld; always @(posedge i_clk) begin // 拍两下输入时能,使输出使能匹配ROM的输出 if (!i_rst_n) r_vld <= 'b0; else r_vld <= {r_vld[0], i_en}; end assign o_vld = r_vld[1];
//测试激励产生 initial begin i_en <= 1'b0; i_data <= 'b0; @(posedge rst_n); @(posedge clk); i_en <= 1'b1; i_data <= 'b0; @(posedge clk); repeat (1023) begin i_data <= i_data+1; @(posedge clk); end i_en <= 'b0; i_data <= 'b0; # 1000; $stop; end always @(posedge clk) begin if (o_vld) $display("%d", o_gray); else; end