2011-10-03 30 views
17

哪个代码在写入RAM时更好?在Verilog中编码RAM的更好方法

  1. always块分配data_out

    module memory(
        output [7:0] data_out, 
        input [7:0] address, 
        input [7:0] data_in, 
        input write_enable, 
        input clk 
    ); 
        reg [7:0] memory [0:255]; 
    
        always @(posedge clk) begin 
         if (write_enable) begin 
          memory[address] <= data_in; 
         end 
        end 
    
        assign data_out = memory[address]; 
    
    endmodule 
    

任何建议:

module memory(
    output reg [7:0] data_out, 
    input [7:0] address, 
    input [7:0] data_in, 
    input write_enable, 
    input clk 
); 
    reg [7:0] memory [0:255]; 

    always @(posedge clk) begin 
     if (write_enable) begin 
      memory[address] <= data_in; 
     end 
     data_out <= memory[address]; 
    end 

endmodule 
  • 使用assign语句中给data_out

  • +4

    你不需要16个地址位来访问256个存储单元。你应该使用'输入[7:0]地址;'。 – toolic

    回答

    8

    这取决于您的要求。

    1. 这注册你的记忆输出。如果你正在把它合成到门,你将会有比触发器多16个触发器。这意味着你使用更多的区域。这也意味着,与情况2相比,您的输出相对于时钟的传播延迟更少。此外,输出数据将在下一个时钟周期之前不可用。

    2. 您的输出数据将在与写入时相同的时钟周期内可用,尽管相对于时钟传播延迟较长。

    您需要根据您的要求决定使用哪一个。

    第三个选项是使用生成的RAM,它是一个硬宏。与案例1和案例2相比,这应该具有面积,功耗和时间优势。

    5

    要添加到工具的答案 - 如果使用异步读取方法(案例2),它不会映射到RAM块FPGA,因为我知道所有主要体系结构中的RAM块都具有同步读取功能。

    -1

    在第二个程序中,会出现编译错误,因为我们无法为'Reg'指定一个值。 它会给一个错误,说:“注册是在连续赋值的左侧非法”

    1

    两种形式都有效,这取决于流水线你想要的类型。我始终建议遵循Xilinx RAM编码准则 - 这是确保代码综合到适当的FGPA结构中的好方法。因为它是同步读取,并且您的示例2将合成到Xilinx Distributed Ram(因为它是异步读取),所以您的示例1将合成到Xilinx BRAM(即专用块Ram)中。

    请参阅RAM HDL编码技术部分中的Xilinx文档UG901(Vivado Design Suite用户指南)中的编码准则。它也很好地描述了RAM的同步读取和异步读取之间的区别。