まず、プロジェクトの目的
主な機能は、FIFO IPコアロジックに同意する必要があり、対応する論理機能を書き込み、読み出し制御に従って、クライアントを書き込み、制御器の出力は、タイミングFIFO IPコアに従うべきです。
1、ユーザーがコントローラーを書き込み
分析用の書き込み制御部に最初に以下。書き込みポート専用FIFO IPコアは、キャッシュされたデータとすることができる2つのFIFOインタフェースを含み、別のコマンドをキャッシュすることができます。データを確保するように、DDR3 SDRAM、データと矛盾バースト長の量は、我々はFIFO、送信された書き込みコマンドに関連するFIFOコマンド情報における最初のデータに書き込まれるデータを保存することができない行に書き込まれますFIFO IPコアは、データが正しく送信されることができるバースト長を受信した後にコマンドを使用して確保することができます。
図2に示すように、ユーザは、コントローラ・フレームワークを書きます
あなたがチャートから見ることができ、データはWR_EN WR_DATA効果的な記号で書かれたことを、我々は、書き込みポートFIFO IPコアWR_DATAが必要とする情報を生成するために実装する必要があり、このモジュールに入力WR_EN、そして最終的にはFIFO IPコアの書き込みデータポートFIFOフラグは、クライアントの書き込み完了信号を生成します。
図3に示すように、モジュールの各変数説明
図4に示すように、書き込み制御のタイミング図でUE
図からわかるように、我々は、入力データの末尾が、書き込みのようなコマンドFIFOポート情報及びイネーブル生成する際に、着信データに応じて、入力されたバースト長の数を決定することができます。FIFO IPコアコマンドFIFOコマンドを受信した後、データはDDR3 SDRAMアウトFIFOに書き込まれると、我々はデータの立ち上がりエッジは、FIFOが空のロゴ表示されているFIFOエンプティフラグに応じた処理を完了するかどうかを判断することができ、考えられています突然空フラグは、我々は、信号を生成することができ、その場合、DDR3 SDRAMに書き込まれた可能な外部モジュールuser_wr_endこのバースト書き込み終了します。
計算されたアドレスは:それは128ビットのデータを8つの16ビットのDDRメモリを行う場合DDR3は、アドレスが16ビットのデータが書き込まれる表す1つずつインクリメントされ、16ビット・データ・アドレスです。
コード:
タイムスケール1nsの`/ 1PS // ******************************************* ******************************* // ***名前:user_wr_ctrl.v // ***著者:tedyma / / ***ブログ:https://www.cnblogs.com/tedymafpga/ // ***日:2019年8月10日 // ***説明:あなたは、ロジックを記述し、それがより制御するための制御インタフェースのわずかな量を必要と多くのコマンド // **************************** ***************************** モジュールuser_wr_ctrl // ================= ======= <ポート> ======================================== == ( INPUT ワイヤー SCLK、 INPUTの ワイヤー RST、 入力 線 WR_EN、 入力 線 [ 127:0 ] WR_DATA、 出力 配線 p2_wr_en、 出力 線 [ 127:0 ] p2_wr_data、 出力 線 [ 15:0 ] p2_wr_mask、 出力 配線 p2_cmd_en、 出力 線 [ 6:0] p2_cmd_bl、 出力 線 [ 2:0 ] p2_cmd_instr、 出力 線 [ 27:0 ] p2_cmd_addr、 出力 配線 user_wr_end、 入力 線 p2_wr_empty )。 // ------------------------------------------------ -------------------------- // -参数化 // ---------------- -------------------------------------------------- -------- パラメータ BURST_LEN = 64 。//バースト長 パラメータ START_ADDR = 0 ; // 開始アドレス パラメータ STOP_ADDR = 785920 ; // 1024 768から512 * 512 = 64 16分の128(ここで設定された解像度は1024 * 768である) パラメータ ADDR_ADD = 64 * 128 / 16 ; // あなたがアドレスを増やす必要があるたびに // --------------------------------------- ----------------------------------- // -信号の定義 // ------- -------------------------------------------------- ----------------- REGの wr_en_r、 REG [ 127:0 ] wr_data_r。 REG p2_cmd_en_r; REG [ 27:0 ] p2_cmd_addr_r。 REG [ 6:0 ] data_cnt。 REG p2_wr_empty_r0、p2_wr_empty_r1、p2_wr_empty_r2。 REG user_wr_end_r; // ------------------------------------------------ -------------------------- // -输出的接口信号 // -------------- -------------------------------------------------- ---------- 割り当て p2_wr_data = wr_data_r。 割り当て p2_wr_en = wr_en_r。 割り当て p2_cmd_en = p2_cmd_en_r。 割り当て p2_wr_mask = 0 。 割り当て p2_cmd_bl = BURST_LEN。 割り当て p2_cmd_instr = 3 ' D0。 割り当て p2_cmd_addr = p2_cmd_addr_r。 割り当て user_wr_end = user_wr_end_r。 // ------------------------------------------------ -------------------------- // -数据和写命令 // ---------------------------------------- ---------------------------------- 常に @(posedge SCLK)を開始する 場合(RST)から始まる wr_en_r <= 1 「B0; wr_data_r <= " D0; 終了 他 始める wr_en_r <= WR_EN。 wr_data_r <= WR_DATA。 エンド・ エンド // ---------------------------------------------- ---------------------------- // - wr_cmd_en命令 //-------------------------------------------------- ------------------------ 常に @(posedge SCLK)を開始する 場合(RST)から始まる p2_cmd_en_r <= 1 " B0; 終了 他の 場合(WR_EN == 1 ' B 0 == 1 && wr_en_r ' B1)から始まる p2_cmd_en_r <= 1 " B1を。 終了 他 始める p2_cmd_en_r <= 1 " B0; エンド・ エンド //-------------------------------------------------- ------------------------ // -地址 // ------------------- -------------------------------------------------- ----- 常に @(posedge SCLK)を開始する 場合(RST)を開始 p2_cmd_addr_r <= START_ADDR。 終了 他の 場合(p2_cmd_addr_r == STOP_ADDR && p2_cmd_en_r == 1 ' B1)開始 p2_cmd_addr_r <= START_ADDR。 終了 他の 場合(p2_cmd_en_r == 1 " b1)が始まる p2_cmd_addr_r <= p2_cmd_addr_r +ADDR_ADD; エンド エンド // -------------------------------------------- ------------------------------ // -余りに2拍(FIFO空信号入力の上部に上部モジュール、必要性2拍、役割は同じではありません) // --------------------------------------- ----------------------------------- 常に @(posedgeの SCLK)開始 p2_wr_empty_r0 <= p2_wr_empty; p2_wr_empty_r1 <= p2_wr_empty_r0; p2_wr_empty_r2 <= p2_wr_empty_r1; 終了 // ---------------------------------------- ---------------------------------- // -ユーザエンド信号 //-------------------------------------------------- ------------------------ 常に @(posedge SCLK)を開始する 場合(RST)を開始 user_wr_end_r <= 1 " B0を。 終了 他の 場合(p2_wr_empty_r1 == 1 ' B1 && p2_wr_empty_r2 == 1 ' B0)を開始 user_wr_end_r <= 1 " B1を。 終了 他 始める user_wr_end_r <= 1 " B0; エンド・ エンド ENDMODULE
第二に、UEの読みの実装
1、クライアントの読出しコントローラはじめに
FIFOコントローラは、コマンドFIFOであるコア2 FIFOインターフェイス用に予約IPポートを、読み出した後に、FIFO他のデータは、我々は、FIFO順でコマンドFIFO、IPコアが検出されたコマンドFIFOに対応する情報を送信する必要が、FIFOは、バースト長データへの送信データに対応するコマンド情報に基づいて、我々はデータのFIFOメモリ必要量で十分なデータを検出し、対応するデータを読み出すことができます。
図2に示すように、コントローラは、ユーザサイドフレームを読み出します
クライアントモジュールはrd_start信号が有効になった後IPコアに対応するFIFOコントローラは、送信バースト長情報に基づいて、後に、コマンドFIFO出力モジュールは、p1_cmd_bl、p1_cmd_en p1_cmd_instr p1_cmd_addr信号及び必要に応じて、入力として読み取らrd_startを必要としますデータFIFOへのデータは、我々は、FIFOはデータの量と一致するデータのデータ量が必要なときにFIFOデータp1_rd_countにおける値決意データは、我々がデータFIFOにp1_rd_en信号を生成することができる量に応じてすることができ、データは、データを読み込むFIFOアウト。
3、ポート変数を説明しました
図4に示すように、読み出し制御のUEタイミング図
有効rd_startは、信号はFIFOが必要なポートコマンドは、これらの信号がFIFOに書き込まれ読み出さ有効p1_cmd_en終わりにリードコマンドを生成する。図4から分かるように、コントローラはDDR3 IPコアを送信しますFIFOは、端末読み出されたデータに必要なデータは、我々は、この値を満たすがp1_rd_countか否かに応じてバーストFIFOデータのデータ量を決定することができ、その後、場合読み出し、このデータバーストp1_rd_en最終の読み出しが満たされた生成しますデータ信号の後user_rd_end生成することができます。