Я хочу реализовать схему в моем DE1-SOC на основе SDRAM, с чего мне начать? (Я уже закончил часть)
Я хочу сделать простой проект, в котором я загружаю 10 номеров в SDRAM моего Altera DE1-SOC, готового для ввода в качестве входного сигнала для логической единицы, которую я создаю,
логический блок выполняет только простую арифметику " Y =(X+1)*(X-1), X - это вход, а Y - это выход". Он будет выбирать значения (одно за другим) из SDRAM, вычислять и выплюнуть результат в другой договоренности SDRAM.
Затем SDRAM должен хранить эти данные, я хочу перенести эти данные из DE1-SOC на ПК, например.
До сих пор я делал этот код (на случай, если необходимо проверить):
module mem_prue1 (rst_n, clk, fin);
input clk, rst_n;
output fin;
wire [6:0] data_X;
reg [6:0] sec_A, sec_B, s_sec_A, s_sec_B;
reg [13:0] rslt_Y, s_rslt_Y;
reg save_sec_A, save_sec_B, save_rslt_Y, set_ram;
reg clear, enable, next_num, no_num, fin, w_mem_out;
reg [1:0] state, nextstate;
reg [3:0] indx;
parameter S0 = 0; parameter S1 = 1; parameter S2 = 2; parameter S3 = 3;
RAM_IN RAM_IN_inst1 (
.data_X (data_X),
.indx(indx)
);
RAM_OUT RAM_OUT_inst1 (
.s_rslt_Y (s_rslt_Y),
.w_mem_out (w_mem_out),
.set_ram (set_ram)
);
always @ (posedge clk or negedge rst_n)
begin
if (~rst_n)
begin
set_ram <= 1;
indx <= 0;
no_num <=0;
enable <= 1;
s_sec_A <= 0;
s_sec_B <= 0;
s_rslt_Y <= 0;
state <= S0;
end
else if (clear)
begin
enable <= 0;
state <= nextstate;
no_num <= 0;
indx <= 0;
set_ram <= 1;
fin <= 1;
end
else
begin
set_ram <= 0;
state <= nextstate;
if (save_sec_A)
s_sec_A <= sec_A;
if (save_sec_B)
s_sec_B <= sec_B;
if (save_rslt_Y)
s_rslt_Y <= rslt_Y;
if (next_num)
begin
if (indx >= 9)
begin
indx <= 0; /// resetea el indice de la memoria
no_num <= 1; // se informa que no hay numeros
end
else
indx <= indx + 4'b0001;
end
end
end
always @ (*)
begin
w_mem_out = 0;
sec_A = 0; sec_B = 0; rslt_Y = 0;
save_sec_A = 0; save_sec_B = 0;
save_rslt_Y = 0; clear = 0;
next_num = 0;
case (state)
S0:
begin
if (~enable)
nextstate = S0;
else
begin
sec_A = data_X + 7'b0000001;
save_sec_A = 1;
nextstate = S1;
end
end
S1: begin
sec_B = data_X - 7'b0000001;
save_sec_B = 1;
nextstate = S2;
end
S2: begin
rslt_Y = s_sec_A * s_sec_B;
save_rslt_Y = 1;
nextstate = S3;
end
S3: begin
w_mem_out = 1;
next_num = 1;
nextstate = S0;
if (no_num == 1)
clear = 1;
end
default:
nextstate = S0;
endcase
end
endmodule
Это память, которую я "симулировал" как ОЗУ для ввода данных:
module RAM_IN (data_X, indx);
input [0:3] indx;
output [6:0] data_X;
reg [6:0] data_X;
reg [6:0] in_ram [0:9];
always @ (indx)
data_X = in_ram [indx];
initial
begin
$readmemb("C:/altera/15.0/PROYECTOS/mem_prue/in_ram.txt", in_ram);
end
endmodule
и это для выходных данных:
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
Итак, сейчас я хочу заменить эту "симулированную" ОЗУ на реальную SDRAM, я не знаю, какой самый практичный способ сделать это.
Должен ли я использовать QSYS, NIOS-II или только изучая IP-библиотеку Megawizard и генерируя вариацию UniPHY. Я только учусь использовать FPGA, поэтому я немного запутался в этой части. Я хочу скачать соответствующие руководства и учебные пособия, чтобы узнать это подробно, но я бы хотел, чтобы вы, ребята, могли сориентировать меня.
П.Д.: Моя цель состоит в том, чтобы "изолировать" мой логический блок от "симулятора оперативной памяти", потому что я предполагаю, что если я буду программировать так же, как я, это будет потреблять логические ресурсы, а моя главная цель - рассчитать площадь, энергию и скорость. потребление моей логики ТОЛЬКО, без нагрузки на память.
Благодарю.
3 ответа
Ваши ключевые слова (QSYS, megawizard, uniphy) обозначают Altera. Если вы просто собираетесь симулировать SDRAM, все будет в порядке. Иногда, превращая этот интерфейс в настоящую микросхему, в первый раз становится сложно.
Если вы просто делаете симуляцию, я бы использовал QSYS для генерации модуля контроллера SDRAM. Если вы можете сделать DDR3, то есть возможность создать Пример дизайна. Если вы сделаете это, вы сможете увидеть, как работает интерфейс к DDR3. На самом деле это должно быть уже идти.
Однако, как к сведению, при чтении будет больше задержка, поэтому вам нужно либо дождаться ответа, либо иметь конвейерную архитектуру, в которой вы можете одновременно выполнять несколько операций чтения в полете.
"FPGAs Что теперь?" Учебное пособие предлагает несколько советов (для платформы Xilinx, которая явно не соответствует вашему конкретному случаю) по моделированию SDRAM. По сути, это сводится к тому, чтобы найти поставщика SDRAM с доступной моделью Verilog/VHDL и подключить его к испытательному стенду для моделирования. (Обратите внимание, что эти модели не будут синтезируемыми.)
http://www.xess.com/static/media/appnotes/FpgasNowWhatBook.pdf
Altera имеет руководство по подключению SDRAM к системе Nios II (с использованием Qsys) на плате DE1-SoC.
ftp://ftp.altera.com/up/pub/Altera_Material/16.0/Tutorials/Verilog/DE1-SoC/Using_the_SDRAM.pdf
Если вы реализуете свой собственный контроллер (или используете только HW IP Core), в руководстве также есть информация о синхронизации для SDRAM.