Verilog 我想在基于SDRAM的DE1-SOC中实现一个电路,我应该从哪里开始?(我已经完成了一部分)
我想做一个简单的项目,我在Altera DE1-SOC的SDRAM中加载10个数字,准备作为我正在创建的逻辑单元的输入 逻辑单元只做一个简单的算术“Y=(X+1)*(X-1),X是输入,Y是输出”。它将从SDRAM中逐个选取值,计算并在另一个SDRAM排列中输出结果 然后SDRAM应该存储这些数据,例如,我希望将这些数据从DE1-SOC中取出到PC 到目前为止,我已经完成了这段代码(以防需要检查): 对于输出数据:Verilog 我想在基于SDRAM的DE1-SOC中实现一个电路,我应该从哪里开始?(我已经完成了一部分),verilog,fpga,synthesis,qsys,Verilog,Fpga,Synthesis,Qsys,我想做一个简单的项目,我在Altera DE1-SOC的SDRAM中加载10个数字,准备作为我正在创建的逻辑单元的输入 逻辑单元只做一个简单的算术“Y=(X+1)*(X-1),X是输入,Y是输出”。它将从SDRAM中逐个选取值,计算并在另一个SDRAM排列中输出结果 然后SDRAM应该存储这些数据,例如,我希望将这些数据从DE1-SOC中取出到PC 到目前为止,我已经完成了这段代码(以防需要检查): 对于输出数据: module RAM_OUT (s_rslt_Y, w_mem_out, set
module RAM_OUT (s_rslt_Y, w_mem_out, set_ram);
input [13:0]s_rslt_Y;
input set_ram, w_mem_out;
reg [3:0] addr_out; // tamano de 57600 datos
reg [13:0] mem_out [0:9];
always @ (w_mem_out or set_ram)
begin
if (set_ram)
addr_out = 0;
else if (w_mem_out == 1)
begin
mem_out [addr_out] = s_rslt_Y;
addr_out = addr_out + 4'b0001;
end
else
addr_out = addr_out;
end
endmodule
以及试验台:
module mem_prue1_tb ();
wire fin;
reg clk, rst_n;
mem_prue1 mem_prue1_inst1 (
.clk(clk),
.rst_n (rst_n),
.fin (fin)
);
initial
begin
rst_n <= 1;
#1 rst_n <= 0;
#2 rst_n <= 1;
clk <= 1;
end
always
begin
#5 clk = ~clk;
end
//---------------------------
integer out,i;
initial begin
out=$fopen("C:/altera/15.0/PROYECTOS/mem_prue/mem_out.txt");
end
always@(posedge clk) begin
if(fin==1)
for(i=0;i<=9;i=i+1) begin
$fdisplay(out,"%b",mem_prue1_inst1.RAM_OUT_inst1.mem_out[i]);
if(i==9)begin
$stop;
end
end
end
endmodule
模块mem_prue1_tb();
线翅;
注册时钟,rst\u n;
记忆记忆记忆记忆记忆记忆记忆记忆(
.clk(clk),
.rst_n(rst_n),
.财务部(财务部)
);
最初的
开始
rst\n您的关键字(QSYS、megawizard、uniphy)指示Altera。如果你只是想模拟SDRAM,你应该没问题。有时,在真正的芯片中使用该接口在第一次使用时会出现问题
如果您只是在进行模拟,我将使用QSYS生成SDRAM控制器模块。如果您可以执行DDR3,则可以生成示例设计。如果您这样做,您将能够看到DDR3的接口是如何工作的。事实上,它应该已经走了
仅供参考,在读取过程中会有更多的延迟,因此您需要能够等待响应,或者需要有一个管道体系结构,可以同时进行多个读取 您的关键字(QSYS、megawizard、uniphy)指示Altera。如果你只是想模拟SDRAM,你应该没问题。有时,在真正的芯片中使用该接口在第一次使用时会出现问题
如果您只是在进行模拟,我将使用QSYS生成SDRAM控制器模块。如果您可以执行DDR3,则可以生成示例设计。如果您这样做,您将能够看到DDR3的接口是如何工作的。事实上,它应该已经走了
仅供参考,在读取过程中会有更多的延迟,因此您需要能够等待响应,或者需要有一个管道体系结构,可以同时进行多个读取 关于SDRAM模拟的“FPGA现在做什么?”教程提供了一些建议(对于Xilinx平台,它显然不符合您的具体情况)。基本上,它归结为找到一个具有可用Verilog/VHDL模型的SDRAM供应商,并将其插入模拟测试台。(请注意,这些模型是不可合成的。)
关于SDRAM模拟的“FPGA现在做什么?”教程提供了一些建议(对于Xilinx平台,它显然与您的特定情况不匹配)。基本上,它归结为找到一个具有可用Verilog/VHDL模型的SDRAM供应商,并将其插入模拟测试台。(请注意,这些模型是不可合成的。)
Altera提供了一个将SDRAM连接到DE1 SoC板上Nios II系统(使用Qsys)的教程
如果您正在实现自己的控制器(或使用仅硬件的IP核),本教程还提供了SDRAM的时序信息。Altera提供了将SDRAM连接到DE1 SoC板上Nios II系统(使用Qsys)的教程
如果您正在实现自己的控制器(或使用仅硬件的IP核),本教程还提供了SDRAM的计时信息。如果您只有10个数字,您为什么要在onchip内存上使用SDRAM(更易于使用)?事实上,这只是对完整数据的简化,原始数据有数千个数字,但出于学习目的,我在这里只使用了10个数字。@wilcroft您认为对于57.600 32位的二进制数字,使用片上内存仍然方便吗?也许吧?你当然可以试一试。您需要57600*32=1800KB的内存;DE1 SoC上的CV FPGA有3970kbit,所以它使用的内存块不到一半。如果你只有10个数字,你为什么要在onchip内存上使用SDRAM(更容易使用)?事实上,这只是对完整数据的简化,原始数据有数千个数字,但出于学习的目的,我这里只使用10个数字。@wilcroft你认为对于57.600位的32位二进制数字,使用片上内存仍然方便吗?也许吧?你当然可以试一试。您需要57600*32=1800KB的内存;DE1 SoC上的CV FPGA有3970kbit,因此它使用了不到一半的内存块。你是说将数据加载到SDRAM时会有延迟,还是读取SDRAM时会有延迟?第一种情况我一点也不介意,因为我只关心当SDRAM已经填满并准备好读取时,我的逻辑单元会发生什么情况。这是当你读取数据时。控制器位于您(主机)和RAM之间。控制器中有寄存器,因此需要几个额外的时钟才能得到结果。如果使用SDRAM表示延迟,那么在这种情况下使用片上内存会更好吗?我需要读取和处理57.600 32位二进制数。每次处理都需要很多周期,因为这是一个非常复杂的算法(不像我文章中的例子)。还有一件事,我对你提到的“如果你只是在做模拟”有很大的困惑,我正在尝试设计可以执行特定应用的逻辑单元,这个逻辑单元在某个时候应该成为一个真正的芯片,所以我认为它应该是可合成的。如果devkit已经存在一段时间了,那么您在使用SDRAM进行合成时会遇到较少的问题。我的问题通常是,我们使用的是仍在开发中的最新FPGA,内存控制器IP需要由供应商调整。如果你在DE1上,你会没事的。你的意思是当loa时会有一个延迟
module RAM_OUT (s_rslt_Y, w_mem_out, set_ram);
input [13:0]s_rslt_Y;
input set_ram, w_mem_out;
reg [3:0] addr_out; // tamano de 57600 datos
reg [13:0] mem_out [0:9];
always @ (w_mem_out or set_ram)
begin
if (set_ram)
addr_out = 0;
else if (w_mem_out == 1)
begin
mem_out [addr_out] = s_rslt_Y;
addr_out = addr_out + 4'b0001;
end
else
addr_out = addr_out;
end
endmodule
module mem_prue1_tb ();
wire fin;
reg clk, rst_n;
mem_prue1 mem_prue1_inst1 (
.clk(clk),
.rst_n (rst_n),
.fin (fin)
);
initial
begin
rst_n <= 1;
#1 rst_n <= 0;
#2 rst_n <= 1;
clk <= 1;
end
always
begin
#5 clk = ~clk;
end
//---------------------------
integer out,i;
initial begin
out=$fopen("C:/altera/15.0/PROYECTOS/mem_prue/mem_out.txt");
end
always@(posedge clk) begin
if(fin==1)
for(i=0;i<=9;i=i+1) begin
$fdisplay(out,"%b",mem_prue1_inst1.RAM_OUT_inst1.mem_out[i]);
if(i==9)begin
$stop;
end
end
end
endmodule