データバッファFIFO IPコアの検索とアプリケーション

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内部结构决定),之后开始重新写数据,开始循环。

 

 

 

 

 

 

 

 

 


 




 

 

おすすめ

転載: www.cnblogs.com/mengyi1989/p/11518290.html