2016-09-23 3 views
0

내가 만드는 논리 유닛에 대한 입력으로 준비된 알테라 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 : 내 목표는 "시뮬레이션 된 숫양"에서 내 논리 단위를 "분리"하는 것입니다. 왜냐하면 내가 프로그래밍 한 것처럼 추측하고 있기 때문에 로직 리소스를 소비 할 것이고 주요 목표는 영역을 계산하는 것입니다. , 에너지 및 속도 소비 내 논리의 메모리 부담없이.

감사합니다.

+1

10 개의 숫자 만있는 경우 온칩 메모리 대신 SDRAM을 사용하려는 이유가 (사용하기 쉽습니다)? – wilcroft

+0

사실 이것은 전체 데이터를 단순화 한 것입니다. 원래 데이터는 수천 개의 숫자를 가지고 있지만 학습 목적으로 여기에 10 개의 숫자 만 사용하고 있습니다. – sujeto1

+0

@wilcroft 57.600 32 비트 이진수는 온칩 메모리를 사용할 때 여전히 편리하다고 생각합니까? – sujeto1

답변

1

키워드 (QSYS, megawizard, uniphy)는 알테라를 나타냅니다. SDRAM을 시뮬레이션하려고한다면 괜찮습니다. 때로는 실제 칩에 인터페이스를 가져 오는 것이 처음에는 털이납니다.

시뮬레이션을 수행하는 중이라면 QSYS를 사용하여 SDRAM 컨트롤러 모듈을 생성합니다. DDR3을 할 수 있다면 예제 디자인을 생성 할 수 있습니다. 이렇게하면 DDR3에 대한 인터페이스가 어떻게 작동하는지 확인할 수 있습니다. 실제로 그것은 이미 가야합니다.

참고로, 읽기에는 더 많은 대기 시간이 필요하므로 응답을 기다릴 필요가 있거나 파이프 라인 아키텍처가 있어야합니다. 여기에서 여러 개의 읽기를 동시에 수행 할 수 있습니다.

+0

SDRAM에 데이터를로드 할 때 레이턴시가 발생하거나 SDRAM을 읽을 때 대기 시간이 발생하게됩니까? SDRAM이 이미 채워지고 읽을 준비가되면 내 논리 장치에 어떤 일이 발생하는지 알기 때문에 걱정하지 않는 첫 번째 경우입니다. – sujeto1

+0

데이터를 읽을 때입니다. 컨트롤러는 사용자 (호스트)와 RAM 사이에 위치합니다. 컨트롤러에는 레지스터가 있으므로 결과를 얻으려면 몇 가지 추가 클럭이 필요합니다. –

+0

SDRAM을 사용하면 대기 시간을 나타냅니다.이 경우에는 온칩 메모리를 사용하는 것이 좋습니다. 나는 57.600 32 비트, 이진수를 읽고 처리해야한다. 각각의 프로세싱은 매우 복잡한 산술이기 때문에 많은 사이클을 필요로합니다 (예를 들어 포스트와는 달리). – sujeto1

1

"FPGAs Now What?" 튜토리얼은 SDRAM 시뮬레이션에서 (자일링스 플랫폼의 경우 특정 케이스와 일치하지 않는) 몇 가지 조언을 제공한다. 기본적으로 사용 가능한 Verilog/VHDL 모델을 갖춘 SDRAM 벤더를 찾아 시뮬레이션 테스트 벤치에 연결합니다. (이 모델들은 합성 가능하지 않을 것이라는 점에 유의하십시오.)

http://www.xess.com/static/media/appnotes/FpgasNowWhatBook.pdf

+0

합성 할 수없는 이유는 무엇입니까 합성 할 수있는 올바른 방법은 무엇일까요? – sujeto1

+1

FPGA가 64MB 용량의 SDRAM을 구성하기위한 내부 구성 요소를 거의 갖추고 있지 않기 때문에 합성 할 수없는 분명한 이유가 있습니다. 실제 이유는 SDRAM 벤더가 단순히 SDRAM 기능을위한 기능적 아키텍처를 제공하지 않는 시뮬레이션 지원을 도우려고한다는 것입니다. –

+1

나는 당신의 질문을 오해했다고 생각합니다. SDRAM 모델은 합성이 가능하지 않습니다. FPGA를 구성하지 않고 SDRAM 칩을 회로 기판에 꽂아 구현합니다. FPGA 인터페이스에서 SDRAM으로 작성한 코드는 합성 가능해야합니다. –

0

알테라 DE1-온칩 보드 QSYS를 사용 니오스 II 시스템()로 SDRAM을 연결하는 가이드를 갖는다. 당신이 당신의 자신의 컨트롤러를 구현 (또는 HW에만 IP 코어를 사용)하는 경우

ftp://ftp.altera.com/up/pub/Altera_Material/16.0/Tutorials/Verilog/DE1-SoC/Using_the_SDRAM.pdf

는 튜토리얼은 또한뿐만 아니라 SDRAM에 대한 타이밍 정보가 있습니다.

+0

게시 한 링크는 Qsys 시스템을 사용하여 SDRAM 컨트롤러를 만드는 방법을 제공하지만 SDRAM에 대한 읽기 및 쓰기 (실생활에서)가 어렵 기 때문에 특히 SDRAM에 액세스하는 방법을 제공하지 않습니다. –

+0

@ Andy_A̷n̷d̷y OP OP는 Nios II CPU 사용 가능성에 대해 특별히 질문했습니다. 시스템을 구현 한 후에는 메모리 읽기 및 쓰기가 쉽지 않습니다. – wilcroft