Verilog 我想在基于SDRAM的DE1-SOC中实现一个电路,我应该从哪里开始?(我已经完成了一部分)

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

我想做一个简单的项目,我在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_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