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