【问题标题】:I want to use the ram in my FPGA Altera DE1-SOC, am I taking the correct way?我想在我的 FPGA Altera DE1-SOC 中使用 ram,我采取了正确的方法吗?
【发布时间】:2016-08-31 06:14:52
【问题描述】:

所以我创建了这个模块,它假设代表一个 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 位数字组成。

【问题讨论】:

    标签: verilog fpga ram synthesis quartus


    【解决方案1】:

    您编写的代码将被综合到内部 RAM 块或基于 LUT 的 RAM。他们将不会使用板上的 SDRAM

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

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

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

    【讨论】:

    • 你能说一些关于如何实现 SDRAM 来替换我打算做的上述 RAM 的提示吗?不使用 NIOS-II 或 QSYS 可以通过代码实现吗?
    • Quartus II,我相信有一个用于连接外部 SDRAM 的 Megawizard 内核。您需要导航到工具 -> MegaWizard 插件管理器,这将打开一个新窗口。在这个新窗口中,您需要转到 Interface -> External Memory 并选择所需的适当 SDRAM 内核
    • 如果我必须存储 57.000 个 32 位二进制数,只有在处理并存储在内存中后才能读取,一一存储。哪种方法更方便使用,内部存储器还是 SDRAM?
    • @sujeto1 当您说“读取一个”时,您的意思是在 FPGA 上电和配置的整个持续时间内只有一次,并且永远不会直到它断电和重新配置,那么我相信外部SDRAM 更好。
    【解决方案2】:

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

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      相关资源
      最近更新 更多