因此,我创建了这个模块,这个模块应该表示一个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位数字组成的。
发布于 2016-08-31 15:50:59
您编写的代码将被合成到内部RAM块或基于LUT的RAMs中。他们将而不是利用板上的SDRAM
FPGA的内部RAM通常有一个时钟周期访问,通过这些RAM的路径包括在静态时序分析中,通常是在位置和路由(PAR)之后执行。
如果您想使用星上SDRAM,您必须包括一个专用的SDRAM控制器,这将消耗有限的逻辑在FPGA内。这些星载SDRAM的访问时间通常是几个时钟周期,本质上是突发的。
外部SDRAM通常用于存储大量数据,如数据包有效负载或等效数据,而片上RAM用于存储本地数据,如报头、临时处理结果等。
发布于 2016-08-31 07:43:53
如果你使用的是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];
endmodulehttps://stackoverflow.com/questions/39242007
复制相似问题