2010-12-01 843 views
8

我正试图在FPGA上实现一个微控制器,并且我需要为它的程序提供一个ROM。如果我使用$ readmemb,是否会正确合成到ROM?如果不是,那么标准的做法是什么?

回答

15

我会修改乔治的答案,说它取决于综合工具$readmemb是否可综合。

Altera的Recommended HDL Coding Styles指南包括例如10-31(10-38页),这表明从$readmemb推断一个ROM(下面再现):

module dual_port_rom (
    input [(addr_width-1):0] addr_a, addr_b, 
    input clk, 
    output reg [(data_width-1):0] q_a, q_b 
); 
    parameter data_width = 8; 
    parameter addr_width = 8; 
    reg [data_width-1:0] rom[2**addr_width-1:0]; 
    initial // Read the memory contents in the file 
      // dual_port_rom_init.txt. 
    begin 
     $readmemb("dual_port_rom_init.txt", rom); 
    end 
    always @ (posedge clk) 
    begin 
     q_a <= rom[addr_a]; 
     q_b <= rom[addr_b]; 
    end 
endmodule 

同样,Xilinx公司的XST User Guide指出:

$readmemb$readmemh系统 任务可用于初始化块 回忆。欲了解更多信息,请参见:

初始化RAM从外部文件 代码示例

使用$readmemb为 二进制和$readmemh十六进制 表示。为避免XST与模拟器 行为之间可能的差异,赛灵思建议您使用 这些系统中的索引参数 任务。请参阅以下编码 示例。

$readmemb("rams_20c.data",ram, 0, 7);

+1

mrkj的答案是比我好得多。我已经删除它。 – George 2011-02-15 11:31:50