【IP】Block Memory Generator IP核

发布时间 2023-04-23 18:14:54作者: AnchorX

简单介绍一种利用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