我想在我的FPGA Altera DE1-SOC中使用ram,我采取了正确的方法吗?

时间:2016-08-31 06:14:53

标签: verilog fpga ram synthesis quartus

所以我创建了这个模块,假设它代表一个RAM,我将相应的数据存储在我的顶层模块上。

module RAM_OUT (pix_val, w_mem_out, set_ram);


input [2:0] w_mem_out;
input [31:0] pix_val;
input set_ram;



reg [15:0] addr_out;


reg [31:0] mem_out1 [0:57599];
reg [31:0] mem_out2 [0:57599];
reg [31:0] mem_out3 [0:57599];

/////////// ram out ///////////////

always @ (w_mem_out or set_ram)
begin

if (set_ram)
addr_out = 0;

else 
    begin

        if (w_mem_out == 1)

                begin
                mem_out1 [addr_out] = pix_val;  
                mem_out2 [addr_out] = 32'b11111111_000000000000000000000000;
                mem_out3 [addr_out] = 32'b00000000_000000000000000000000000;

                addr_out = addr_out + 16'b0000000000000001;
                end

        else if (w_mem_out == 2)        

                begin
                mem_out1 [addr_out] = 32'b11111111_000000000000000000000000;
                mem_out2 [addr_out] = pix_val;  
                mem_out3 [addr_out] = 32'b00000000_000000000000000000000000;

                addr_out = addr_out + 16'b0000000000000001;
                end

        else if (w_mem_out == 3)        

                begin
                mem_out1 [addr_out] = 32'b11111111_000000000000000000000000; 
                mem_out2 [addr_out] = 32'b11111111_000000000000000000000000;
                mem_out3 [addr_out] = pix_val;

                addr_out = addr_out + 16'b0000000000000001;
                end

        else    

                addr_out = addr_out;

    end
end

endmodule

该程序在模拟方面已经完全正常工作,但由于我计划将其加载到我的FPGA中,我想使用电路板中可用的SDRAM存储器(我的目的是制作完整的SOC,而我需要将数据加载到SDRAM,然后使用我的设计来处理这些数据。)

所以,我想知道SDRAM的编程是否与我在上面的代码中所做的相差太远。你可以看到我写了一些逻辑,以便将我想要的数据保存到"记忆中。但我不确定在做SDRAM时这是否相同,或者我将不得不稍后改变我的设计(我不喜欢这个,因为我的系统已经在模拟中运行良好)。

我写了上面的代码,从altera文档中读取,他们说这是制作RAM的方法,但这可以合成吗?在FPGA中真正发生了什么,它使用FPGA芯片中的门提供存储器还是利用电路板的实际存储器?请注意,输入数据由57600个32位数组成。

2 个答案:

答案 0 :(得分:2)

您编写的代码将合成到内部RAM块或基于LUT的RAM。他们将利用主板上的 SDRAM

FPGA的内部RAM通常具有单个时钟周期访问,并且通过这些RAM的路径包含在静态时序分析中,该分析通常在布局布线(PAR)之后执行。

如果您希望使用板载SDRAM,则必须包含一个专用的SDRAM控制器,它将消耗FPGA内部的有限逻辑。这些板载SDRAM的访问时间通常是几个时钟周期,并且本质上是突发性的。

外部SDRAM通常用于存储大量数据,如数据包有效负载或等效数据,而片上RAM则用于存储本地数据,如标头,临时处理结果等。

答案 1 :(得分:0)

如果您正在使用FPGA合成RAM并不是一个坏主意。一个好的方法是设计一个行为类似于RAM的模块,然后在其余代码中实例化该模块。所以,

i)你的RAM模块应该有合适的输入和输出:地址总线(ses),输入数据总线,输出数据总线,控制信号(写入启用等),时钟......

ii)你的RAM模块应该包含一个数组

iii)您的RAM模块应包含一个或多个always块和/或assign语句,以实现RAM的行为。

这是一个例子,它应该使用FPGA合成器合成到RAM:

module RAM(
  input        clock,            // best to make it synchronous
  input        write_enable,     // a simple active high write enable
  input [3:0]  address,          // a single address bus in this example
  input [7:0]  data_in,          // input data
  output [7:0] data_out);        // output data

  reg [7:0] mem [0:15];          // here is the array; make this the size you need

  always @(posedge clock)
    if (write_enable)
      mem[address] <= data_in;

  assign data_out = mem[address];

endmodule