2016-08-31 3 views
1

私はトップモジュールの結果に応じていくつかのデータを保存するRAMを表すと思われるこのモジュールを作成しました。FPGAのアルテラDE1-SOCでラムを使用したいのですが、正しい方法を採用していますか?

module RAM_OUT (pix_val, w_mem_out, set_ram); 


input [2:0] w_mem_out; 
input [31:0] pix_val; 
input set_ram; 



reg [15:0] addr_out; 


reg [31:0] mem_out1 [0:57599]; 
reg [31:0] mem_out2 [0:57599]; 
reg [31:0] mem_out3 [0:57599]; 

/////////// ram out /////////////// 

always @ (w_mem_out or set_ram) 
begin 

if (set_ram) 
addr_out = 0; 

else 
    begin 

     if (w_mem_out == 1) 

       begin 
       mem_out1 [addr_out] = pix_val; 
       mem_out2 [addr_out] = 32'b11111111_000000000000000000000000; 
       mem_out3 [addr_out] = 32'b00000000_000000000000000000000000; 

       addr_out = addr_out + 16'b0000000000000001; 
       end 

     else if (w_mem_out == 2)   

       begin 
       mem_out1 [addr_out] = 32'b11111111_000000000000000000000000; 
       mem_out2 [addr_out] = pix_val; 
       mem_out3 [addr_out] = 32'b00000000_000000000000000000000000; 

       addr_out = addr_out + 16'b0000000000000001; 
       end 

     else if (w_mem_out == 3)   

       begin 
       mem_out1 [addr_out] = 32'b11111111_000000000000000000000000; 
       mem_out2 [addr_out] = 32'b11111111_000000000000000000000000; 
       mem_out3 [addr_out] = pix_val; 

       addr_out = addr_out + 16'b0000000000000001; 
       end 

     else  

       addr_out = addr_out; 

    end 
end 

endmodule 

プログラムが既にシミュレーションに完全に正常に動作しますが、私は私のFPGAにロードすることを計画していますから、私は私の意図がフルSOCを作ることです(ボードで利用可能なSDRAMメモリを使用する場合、 SDRAMにデータをロードし、そのデータを処理するために私の設計を使用する必要があります)。

私はSDRAMのプログラミングが上記のコードで行ったことから離れているのだろうかと思います。あなたは私が "思い出"にしたいデータを保存するために書き込んだロジックがあるのがわかりますが、これがSDRAMを実行するときに同じかどうかわからない、または後でこのデザインを変更する必要があります。私のシステムはすでにシミュレーションでうまくいっているので、これは好きではないでしょう)。

私は上記のコードをalteraのドキュメントから読みましたが、これはRAMを作る方法だと言いますが、これは合成可能ですか? FPGAで実際に何が起こっているのですか、FPGAチップのゲートを使用してメモリを引き出すか、ボードの実際のメモリを利用しますか?入力データは57600 32ビットの数値で構成されています。

答えて

2

あなたが書いたコードは、内蔵RAMブロックまたはLUTベースのRAMに合成することでしょう。彼らはない基板上SDRAMを利用する

FPGAの内部RAMは、一般に、単一クロックサイクルのアクセスを有しており、これらのRAMを通るパスは、通常配置とした後に実行される静的タイミング解析に含まれています経路(PAR)。

オンボードのSDRAMを使用する場合は、FPGA内部で有限のロジックを消費する専用のSDRAMコントローラを組み込む必要があります。これらのオンボードSDRAMのアクセス時間は、通常、数クロックサイクルであり、事実上バースト的である。あなたには、いくつかのヒントを言う

外部のSDRAMは、一般的に、オンチップのRAMがなどのヘッダー、一時的な処理の結果、

+0

などのローカルデータを格納するために使用されている間、パケットのペイロードまたは同等など大量のデータを格納するために使用されていますSDRAMを実装して上記のRAMを置き換える方法については? NIOS-IIやQSYSを使わずにコードでこれを行うことはできますか? – sujeto1

+1

Quartus II、私は外部SDRAMとのインターフェースのためのMegawizardコアを持っていると思います。 Tools - > MegaWizard Plugin Managerに移動し、Newウィンドウを開きます。この新しいウィンドウで、Interface - > External Memoryに行き、必要な適切なSDRAMコアを選択する必要があります – Prashant

+0

57.000 32ビットの2進数を1回だけ処理してメモリに1つずつ読み込むように保存する必要がある場合。内部メモリやSDRAMのどちらを使う方が便利ですか? – sujeto1

0

RAMを合成するFPGAを使用している場合は、悪い考えではありません。それを行う良い方法は、RAMのように動作するモジュールを設計し、残りのコードでそのモジュールをインスタンス化することです。だから、

私は)あなたのRAMモジュールは、適切な入力と出力が必要です:アドレスバス(SES)、入力データバス、出力データ・バス、制御信号(ETCライトイネーブル)、クロックを...

II) RAMモジュールには配列が含まれている必要があります

iii)RAMの動作を実装するには、RAMモジュールに1つまたは複数のalwaysブロックおよび/またはassignステートメントを含める必要があります。ここで

は、FPGAのシンセサイザーを使用してRAMに合成するべきか、例を次に示します。

module RAM(
    input  clock,   // best to make it synchronous 
    input  write_enable,  // a simple active high write enable 
    input [3:0] address,   // a single address bus in this example 
    input [7:0] data_in,   // input data 
    output [7:0] data_out);  // output data 

    reg [7:0] mem [0:15];   // here is the array; make this the size you need 

    always @(posedge clock) 
    if (write_enable) 
     mem[address] <= data_in; 

    assign data_out = mem[address]; 

endmodule 
関連する問題