我想在我的 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、临时处理结果等。
所以我创建了这个模块,它假设代表一个 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、临时处理结果等。