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

I want to use the ram in my FPGA Altera DE1-SOC, am I taking the correct way?

所以我创建了这个模块,它假设代表一个 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 进行编程与我在上面的代码中所做的相差太远。你可以看到我写了一些逻辑,以便将我想要的数据保存到 "memories" 中,但我不确定在做 SDRAM 时这是否相同,否则我将不得不为此更改我的设计(我不喜欢这样,因为我的系统已经在模拟中运行良好)。

上面的代码是我从altera文档中读到的,他们说这是制作RAM的方法,但这是可综合的吗? FPGA 中到底发生了什么,它是使用 FPGA 芯片中的门推断内存还是使用电路板的实际内存?请注意,输入数据由 57600 个 32 位数字组成。

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

i) 您的 RAM 模块应具有合适的输入和输出:地址总线 (ses)、输入数据总线、输出数据总线、控制信号(写使能等)、时钟...

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

iii) 您的 RAM 模块应该包含一个或多个 always 块 and/or 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

您编写的代码将被合成到内部 RAM 块或 LUT-based RAM 中。他们将不会利用板上的SDRAM

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

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

外部 SDRAM 通常用于存储大量数据,例如数据包有效载荷或等效数据,而 on-chipRAM 用于存储本地数据,例如 headers、临时处理结果等。