내가 만드는 논리 유닛에 대한 입력으로 준비된 알테라 DE1-SOC의 SDRAM에 10 개의 숫자를로드하는 간단한 프로젝트를 만들고 싶습니다.SDRAM을 기반으로하는 내 DE1-SOC 회로를 구현하고 싶습니다. 어디에서 시작해야합니까? (이미 부품을 마쳤습니다)
로직 유닛은 단지 "Y = (X + 1) * (X-1), X는 입력이고 Y는 출력"이라는 간단한 산술 연산을 수행합니다. SDRAM에서 값을 하나씩 선택하여 계산하고 뱉어냅니다 그 결과 다른 SDRAM 배열이된다.
그런 다음 SDRAM에이 데이터를 저장해야합니다. 예를 들어이 데이터를 DE1-SOC에서 PC로 가져오고 싶습니다. 이 코드를 한 적이 지금까지
, (경우에 확인하는 것이 필요하다) :
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 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
이
내가 입력 데이터의 RAM으로 "시뮬레이션"메모리입니다이 출력 데이터 :
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
[email protected](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에 대해 "시뮬레이션 된"RAM을 대체하고 싶습니다. 실제로이를 수행하는 가장 실용적인 방법이 무엇인지 모르겠습니다.
QSYS, NIOS-II를 사용하거나 Megawizard IP 라이브러리를 학습하고 UniPHY 변형을 생성해야만합니까? 난 그냥 FPGA를 사용하는 법을 배우므로이 부분에서 다소 혼란 스럽다. 자세한 내용을 알기 위해 적절한 매뉴얼과 튜토리얼을 다운로드하고 싶지만 여러분이 나에게 방향을 바꿀 수 있기를 바랍니다.
PD : 내 목표는 "시뮬레이션 된 숫양"에서 내 논리 단위를 "분리"하는 것입니다. 왜냐하면 내가 프로그래밍 한 것처럼 추측하고 있기 때문에 로직 리소스를 소비 할 것이고 주요 목표는 영역을 계산하는 것입니다. , 에너지 및 속도 소비 내 논리의 메모리 부담없이.
감사합니다.
10 개의 숫자 만있는 경우 온칩 메모리 대신 SDRAM을 사용하려는 이유가 (사용하기 쉽습니다)? – wilcroft
사실 이것은 전체 데이터를 단순화 한 것입니다. 원래 데이터는 수천 개의 숫자를 가지고 있지만 학습 목적으로 여기에 10 개의 숫자 만 사용하고 있습니다. – sujeto1
@wilcroft 57.600 32 비트 이진수는 온칩 메모리를 사용할 때 여전히 편리하다고 생각합니까? – sujeto1