EDITORIAL言葉
プロジェクトの設計では、我々は、多くの場合、2つのモジュール間でデータを転送する必要がある、同じの2つのモジュールのデータ処理速度がとても自然に問題がなければ、あなたはデータのドッキングを指示することができます。しかし、2つのモジュールの場合、データ処理速度が違うのですか?スピードデータ受信モジュールとデータ送信モジュールの矛盾、欠落や誤りが必然的にデータ収集につながります。だから、どのように我々はこの問題を解決するのですか?スリーパー翼ブラザーのアプローチは、それらの間でデータのバッファを追加することで、全てのデータがキャッシュバッファを経由して、データへの入力は、受信モジュール。したがって、このセクション、夢の翼の兄弟と私たちが持つデータ・キャッシュ・メモリの研究に使用中のIPコア-FIFOのデザインを。
プロジェクトの要件
二つのモジュールを作成し、モジュールは、データ伝送である、別のデータ受信モジュールのような一つ。モジュールを送信すると、検出した FIFOを開始するために空になるのFIFO までの書き込みデータをFIFOがアップいっぱいです。データ受信モジュールが検出さ FIFOが満杯であるがから開始されたFIFO までのデータを読み込むFIFO 読んで、空まで。
ステップ
右側には IP コアの検索フィールド、入力FIFO し、[ダブルクリック FI
言語の種類を選択したVerilogを、と命名
クリックして [OK]
提供される FIFO のメモリ深さと収納スペースのそれぞれのビットの数、選択入力と読み出しクロックは同じではない、 FIFOが読み出されるクロックとライトクロック
クリックして [次へ]を、次のようにポートを選択
クリックし、[NEXT]
my_fifo_inst.v選択したファイルを、その後、[クリックして終了して完了]。
FIFOはポート信号を読みます |
FIFO 書き込み信号ポート |
||
ポート名 |
ポートの概要 |
ポート名 |
ポートの概要 |
いっぱい |
フル信号(読むrdfull )、FIFOがいっぱいになると、すべての一切の読み出しは、存在しない完全な真の値 |
いっぱい |
充填された信号(wrfull )、FIFO 充填完全な真の値を |
空の |
空の信号(読むrdemptyをするとき)、FIFO のすべてのデータを読み出した、空の真の値 |
空の |
ヌル信号(書き込みwrempty )、FIFO はデータが書き込まれていない、空の真値 |
注:ある時間差の数がかかりますポート出力ポートを読み、書き、FIFO 内部構造が発生しています。
トップレベルのアーキテクチャ設計
FIFOは、我々は制御モジュール対応に設計され、重要なデータバッファであるFIFOは、私たちによると、読み取りおよび書き込みFIFO 情報のセットアップウィザードを学んだ、我々は持っているFIFO 今、意味ポートを便宜上(図の設計アーキテクチャを以下の私たちが理解し、私たちが選ぶここに読むために / ライト・データ・クロックを同じです)
モジュールの機能
モジュール名 |
機能説明 |
Wr_fifo |
FIFOへの書き込み |
Rd_fifo |
FIFOを読み出すために、 |
My_fifo |
データバッファ |
FIFO |
サブモジュールのカスケードを担当するトップレベルのモジュールシステム、 |
そして、ポートは、インターコネクタを説明します
トップレベルのモジュールのポートの説明
ポート名 |
ポート説明 |
CLK |
システムクロック入力 |
RST_N |
システムリセット |
Q |
データ出力 |
導入された内部配線システム
接続名 |
配線の手順 |
wrreq |
書き込み要求信号 |
wrfull |
満たされた信号 |
wrempty |
写空信号 |
RDREQ |
要求信号を読みます |
rdfull |
フル信号を読みます |
rdempty |
读空信号 |
データ |
データ入力FIFO |
コードの説明
Wr_fifoのモジュールコード
/ ************************************************* *** *エンジニア: ドリーム・ブラザーウイング * QQ:761664056 *モジュール機能:へのFIFO 書き込み**************************************** ************* / 00 モジュール wr_fifo ( CLK 01 、 // モジュールの入力クロック RST_N 02 、 // モジュールのリセット Wrfull 03 、 // 満たさ信号 Wrempty 04は、 // 空の信号を書きます データ05 、 // FIFO 入力データ 06 wrreq // 書き込み要求信号 07 ); 08 // モジュール入力 09 入力 CLK ; // モジュールの入力クロック 10 INPUT RST_N ; // モジュールをリセット 11 input wrfull;// 写满信号 12 input wrempty;//写空信号 13 //模块输出 14 output reg [7:0] data;//fifo的输入数据 15 output reg wrreq;//写请求信号 16 //定义中间寄存器 17 reg state; //状态寄存器 18 19 always @ (posedge clk or negedge rst_n) 20 begin 21 if (!rst_n)//复位时,将中间寄存器和输出清零 22 begin 23 data <= 0; 24 wrreq <= 0; 25 state <= 0; 26 end 27 else 28 begin 29 case (state) 30 0 : begin 31 if (wrempty)//写空时,写请求拉高,跳到下一个状态 32 begin 33 state <= 1; 34 wrreq <= 1; 35 data <= 0; 36 end 37 else 38 state <= 0; 39 end 40 41 1 : begin 42 if (wrfull)//写满时,写请求拉低,跳回上一个状态 43 begin 44 state <= 0; 45 data <= 0; 46 wrreq <= 0; 47 end 48 else 49 begin 50 data <= data + 1; //没有写满的时候,写请求拉高,继续输入数据 51 wrreq <= 1; 52 end 53 end 54 endcase 55 end 56 end 57 58 endmodule |
rd_fifo模块代码
/**************************************************** * Engineer : 梦翼师兄 * QQ : 761664056 * E_mail : [email protected] * The module function:对fifo进行读出 *****************************************************/ 00 module rd_fifo ( 01 clk, //模块输入时钟 02 rst_n, //模块复位 03 rdfull,//读满信号 04 rdempty,//读空信号 05 rdreq//读请求 06 ); 07 //模块输入 08 input clk;//模块输入时钟 09 input rst_n;//模块复位 10 input rdfull;//读满信号 11 input rdempty;//读空信号 12 //模块输出 13 output reg rdreq;//读请求 14 //定义中间寄存器 15 reg state;//状态寄存器 16 17 always @ (posedge clk or negedge rst_n) 18 begin 19 if (!rst_n)//复位时,将中间寄存器和输出清零 20 begin 21 rdreq <= 0; 22 state <= 0; 23 end 24 else 25 case (state) 26 0 : begin 27 if (rdfull)//读满时,读请求拉高,跳到下一个状态 28 begin 29 rdreq <= 1; 30 state <= 1; 31 end 32 else 33 state <= 0; 34 end 35 36 1 : begin 37 if (rdempty)//读空时,读请求拉低,跳回上一个状态 38 begin 39 rdreq <= 0; 40 state <= 0; 41 end 42 else 43 begin 44 rdreq <= 1;//没有读空的时候,读请求拉高,继续读出数据 45 state <= 1; 46 end 47 end 48 endcase 49 50 end 51 52 endmodule |
顶层连接模块
/**************************************************** * Engineer : 梦翼师兄 * QQ : 761664056 * The module function:顶层连接模块 *****************************************************/ 00 module fifo ( 01 clk, //系统输入时钟 02 rst_n, //系统复位 03 q //输出数据 04 ); 05 //系统输入 06 input clk; //系统输入时钟 07 input rst_n; //系统复位 08 //系统输出 09 output [7:0] q; //输出数据 10 //定义中间连线 11 wire wrfull; // 写满信号 12 wire wrempty;//写空信号 13 wire [7:0] data;//fifo的输入数据 14 wire wrreq; //写请求信号 15 wire rdfull;//读满信号 16 wire rdempty;//读空信号 17 wire rdreq;//读请求 18 // 实例化wr_fifo模块 19 wr_fifo wr_fifo ( 20 .clk(clk), //系统输入时钟 21 .rst_n(rst_n), //系统复位 22 .wrfull(wrfull), // 写满信号 23 .wrempty(wrempty), //写空信号 24 .data(data), //fifo的输入数据 25 .wrreq(wrreq)//写请求信号 26 ); 27 // 实例化rd_fifo模块 28 rd_fifo rd_fifo ( 29 .clk(clk), //系统输入时钟 30 .rst_n(rst_n), //系统复位 31 .rdfull(rdfull), //读满信号 32 .rdempty(rdempty), //读空信号 33 .rdreq(rdreq)//读请求 34 ); 35 //实例化my_fifo 36 my_fifo my_fifo_inst ( 37 .data ( data ),//fifo的输入数据 38 .rdclk ( clk ),//读时钟 39 .rdreq ( rdreq ),//读请求 40 .wrclk ( clk ),//写时钟 41 .wrreq ( wrreq ),//写请求 42 .q ( q ),//输出数据 43 .rdempty ( rdempty ),//读空信号 44 .rdfull ( rdfull ),//读满信号 45 .wrempty ( wrempty ),//写空信号 46 .wrfull ( wrfull )//写满信号 47 ); 48 49 endmodule |
编写完可综合代码之后,首先查看RTL视图如下:
由RTL视图可以看出,代码综合以后成的电路和我们所设计的系统框图一致,说明顶层模块连接正确,接下来编写测试代码如下:
/**************************************************** * Engineer : 梦翼师兄 * QQ : 761664056 * The module function:fifo的仿真测试 *****************************************************/ 00 `timescale 1ns/1ps //时间单位和精度定义 01 module fifo_tb; 02 //系统输入 03 reg clk; //系统输入时钟 04 reg rst_n; //系统复位 05 //系统输出 06 wire [7:0] q; //输出数据 07 08 initial begin 09 clk = 1; 10 rst_n = 0; 11 # 200.1 12 rst_n = 1; 13 end 14 15 always # 10 clk = ~clk; //50MHz的时钟 16 17 //实例化fifo 18 fifo fifo ( 19 .clk(clk), //系统输入时钟 20 .rst_n(rst_n), //系统复位 21 .q(q) //输出数据 22 ); 23 24 endmodule |
仿真分析
复位结束后,由于fifo中没有任何数据,所以写空信号为1,当写入一个数据之后,写空信号变成0,写满信号一直为0。
当输入数据到达256个的时候写满信号变高,并且经过几拍之后读满信号变成1(这是由fifo内部结构导致的),当读出一个数据之后,读满信号马上就拉低。
当读出的数据达到256后,读空信号变高,经过几拍之后写空信号变高(由fifo内部结构决定),之后开始重新写数据,开始循环。