一個異步FIFO的設計示例_第1頁
一個異步FIFO的設計示例_第2頁
一個異步FIFO的設計示例_第3頁
一個異步FIFO的設計示例_第4頁
一個異步FIFO的設計示例_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、 一、異步FIFO技術(shù)規(guī)范1. 總體描述1.1. 功能定義異步FIFO ( First In First Out)指的是在兩個相互獨立的時鐘域下, 數(shù)據(jù)從一個時鐘域?qū)懭隖IFO而另一個時鐘域又從這個FIFO 中將數(shù)據(jù)讀出。本設計用8*256的RAM實現(xiàn)異步FIFO。具體功能:1 寫使能有效,且FIFO不為滿時,在寫時鐘的上升沿向FIFO中寫入數(shù)據(jù)。2 讀使能有效,且FIFO不為空時,在讀時鐘的上升沿從FIFO中讀出數(shù)據(jù)。3 當FIFO寫滿時產(chǎn)生滿信號,當FIFO讀空時產(chǎn)生空信號。1.2. 應用范圍異步FIFO 是用來作為緩沖的存儲器, 它能對數(shù)據(jù)進行快速、順序的存儲和發(fā)送, 主要用來解決不同速

2、率器件間的速率匹配問題。2. 引腳描述圖12.1. 引腳功能描述信號名輸入/輸出功能描述r_clk輸入讀數(shù)據(jù)時鐘信號w_clk輸入寫數(shù)據(jù)時鐘信號data_in7:0輸入8位的輸入數(shù)據(jù)r_en輸入讀使能,高電平有效,在FIFO非空時,clk上升沿讀入數(shù)據(jù);w_en輸入寫使能,高電平有效,在FIFO非滿時,clk上升沿寫入數(shù)據(jù);rst輸入異步清零,低電平有效,低電平時讀地址,寫地址,計數(shù)器都清零。empty輸出空信號,高電平有效,當FIFO讀空時其值為1full輸出滿信號,高電平有效,當FIFO寫滿時其值為1data_out7:0輸出8位的輸出數(shù)據(jù)2.2. 引腳時序描述當寫滿時full由低變高,當

3、讀空時empty由低變高。只要不為滿full就為低,不為空empty就為低。3. 頂層模塊劃分圖2頂層模塊說明:1 ram_fifo :存儲器模塊,用于存放及輸出數(shù)據(jù);2 w_addr_reg : 保存訪問RAM的寫地址;3 r_addr_reg : 保存訪問RAM的讀地址;4 w_addr_adder : 計算RAM下一個寫地址;5 r_addr_adder: 計算RAM下一個讀地址;6 cmp : 將讀地址和寫地址進行比較產(chǎn)生空滿標志。設計思想說明:FIFO滿空的判定:當讀地址的值加1之后等于寫地址的值時,表明FIFO寫滿,當寫地址的值加一之后等于讀地址的值時,表明FIFO讀空。在初始狀態(tài)

4、時FIFO的讀地址在RAM的中間位置,寫地址在RAM的開始位置,所以初始狀態(tài)FIFO不滿也不空??諠M信號的產(chǎn)生由組合電路產(chǎn)生。4. 功能模塊描述4.1. ram_fifo模塊ram_fifo:RAM存儲器。用8*256雙口RAM實現(xiàn)。4.2. w_addr_reg模塊 w_addr_reg模塊:寫地址寄存器。用來寄存寫地址加法器輸出的地址。4.3. r_addr_reg模塊 r_addr_reg模塊:讀地址寄存器。用來寄存讀地址加法器輸出的地址。4.4. w_addr_adder模塊 w_addr_adder模塊:寫地址加法器。把寫地址寄存器的輸出加一,即表示當前寫 地址的下一地址位。當w_e

5、n為低時停止累加。4.5. r_addr_adder模塊r_addr_adder模塊:讀地址加法器。把讀地址寄存器的輸出加一,即表示當前讀地址的下一地址位。當r_en為低時停止累加。4.6. cmp模塊 cmp模塊:讀地址和寫地址進行比較,產(chǎn)生滿空標志。二、異步FIFO總體設計方案1. 概述 異步FIFO有高速、可靠性好等特點。由于異步FIFO 在兩個不同時鐘系統(tǒng)之間能夠快速而方便地傳輸實時數(shù)據(jù), 因此在網(wǎng)絡接口、圖像處理等方面, 異步FIFO 得到了廣泛的應用。異步FIFO 指的是在兩個相互獨立的時鐘域下, 數(shù)據(jù)從一個時鐘域?qū)懭隖IFO 而另一個時鐘域又從這個FIFO 中將數(shù)據(jù)讀出。異步FI

6、FO 通常被用來將數(shù)據(jù)從一個時鐘域安全地傳送到另外一時鐘域。2. 功能模塊設計2.1. ram_fifo模塊2.1.1. ram_fifo模塊描述ram_fifo:RAM存儲器。用8*256雙口RAM實現(xiàn)。2.1.2. 管腳描述信號名稱輸入 / 輸出源功能描述w_clk輸入PIN寫時鐘信號w_en輸入PIN寫使能信號w_addr7:0輸入w_addr_reg寫地址信號r_clk輸入PIN讀時鐘信號r_en輸入PIN讀使能信號r_addr7:0輸入w_addr_reg讀地址信號data_in7:0輸入PIN輸入數(shù)據(jù)data_out7:0輸出輸出數(shù)據(jù)表22.1.3. 實現(xiàn)說明應使用雙口RAM,雙地

7、址輸入,并且?guī)в凶x寫使能,異步的讀寫時鐘。RAM寬度為8bit,深度為256個存儲單元。2.2. w_addr_reg模塊2.2.1. w_addr_reg模塊描述 w_addr_reg模塊:寫地址寄存器。用來寄存寫地址加法器輸出的地址。2.2.2. 管腳描述信號名稱輸入 / 輸出源目標功能描述W_clk 輸入PIN寫時鐘信號Rst輸入PIN復位信號,低電平有效W_addr_nt 7:0輸入W_addr_addr輸入數(shù)據(jù)W_addr7:0 輸出RAMW_addr輸出數(shù)據(jù)表32.2.3. 實現(xiàn)說明在時鐘的上升沿將8位的輸入數(shù)據(jù)鎖存輸出。2.3. r_addr_reg模塊2.3.1. r_addr

8、_reg模塊描述 r_addr_reg模塊:讀地址寄存器。用來寄存讀地址加法器輸出的地址。2.3.2. 管腳描述信號名稱輸入 / 輸出源目標功能描述R_clk 輸入PIN讀時鐘信號Rst輸入PIN復位信號,低電平有效R_addr _nt7:0輸入R_addr_adder輸入數(shù)據(jù)R_addr7:0 輸出RAMR_addr輸出數(shù)據(jù)表42.3.3. 實現(xiàn)說明在時鐘的上升沿將8位的輸入數(shù)據(jù)所存輸出。2.4. w_addr_adder模塊2.4.1. w_addr_adder模塊描述 w_addr_adder模塊:寫地址加法器。把寫地址寄存器的輸出加一,即表示當前寫地址的下一地址位。當w_en為低時停止

9、累加。2.4.2. 管腳描述信號名稱輸入 / 輸出源目標功能描述w_en 輸入PIN1-允許地址加1;0-禁止地址加1;w_addr7:0輸入W_addr_reg輸入數(shù)據(jù)W_addr_nt7:0 輸出W_addr_reg加一后輸出數(shù)據(jù)表52.4.3. 實現(xiàn)說明以w_addr為輸入,輸出為 w_addr+1。2.5. r_addr_adder模塊2.5.1. r_addr_adder模塊描述r_addr_adder模塊:讀地址加法器。把讀地址寄存器的輸出加一,即表示當前讀地址的下一地址位。當r_en為低時停止累加。2.5.2. 管腳描述信號名稱輸入 / 輸出源目標功能描述r_en 輸入PIN1-

10、允許地址加1;0-禁止地址加1;r_addr7:0輸入r_addr_reg輸入數(shù)據(jù)r_addr_nt7:0 輸出r_addr_reg加一后輸出數(shù)據(jù)表62.5.3. 實現(xiàn)說明以r_addr為輸入,輸出為 r_addr+1。2.6. cmp模塊2.6.1. cmp模塊描述cmp模塊:讀地址和寫地址進行比較,產(chǎn)生滿空標志。2.6.2. 管腳描述信號名稱輸入 / 輸出源目標功能描述W_addr7:0輸入W_addr_regFIFO當前的寫地址R_addr7:0輸入R_addr_reFIFO當前的讀地址empty輸出PIN0-FIFO未空1-FIFO讀空full輸出PIN0-FIFO未滿1-FIFO寫滿

11、表72.6.3. 實現(xiàn)說明將w_addr加一與r_addr對比,相等則full為1否則為0;將r_addr加一與w_addr對比,相等則empty為1否則為0;三、異步FIFO驗證方案總體驗證方案1.1. 測試FIFO在正常狀態(tài)下,是否能寫入和讀出;full和empty的標志位均為0;1.2. 測試FIFO在寫滿時,full是否能變?yōu)楦?;當滿時讀出一個數(shù),full能否由高變低。1.3. 測試FIFO在讀空時,empty是否能變?yōu)楦撸划斂諘r寫入一個數(shù),empty能否由高變低。1.4. 異步復位后,F(xiàn)IFO是否可以正常工作。另外,在編寫激勵時,F(xiàn)IFO讀空后,則將讀使能禁止,F(xiàn)IFO寫滿后,則將寫

12、使能禁止,以保證讀出和寫入數(shù)據(jù)的正確性。四、電路設計源代碼及仿真激勵(1)異步FIFO源代碼:module fifo( data_in, data_out, r_en, w_en, r_clk, w_clk, full, empty, rst ); input 7:0data_in;input r_en;input w_en;input r_clk;input w_clk;input rst;output 7:0data_out;output empty;output full;wire 7:0w_addr;wire 7:0r_addr;wire 7:0w_addr_nt;wire 7:0r_

13、addr_nt;ram u1( .data_out(data_out), .data_in(data_in), .w_clk(w_clk), .r_clk(r_clk), .w_en(w_en), .r_en(r_en), .w_addr(w_addr), .r_addr(r_addr) );w_addr_reg u2( .w_addr(w_addr), .w_addr_nt(w_addr_nt), .w_clk(w_clk), .rst(rst) );r_addr_reg u3( .r_addr(r_addr), .r_addr_nt(r_addr_nt), .r_clk(r_clk), .

14、rst(rst) );w_addr_adder u4( .w_en(w_en), .w_addr(w_addr), .w_addr_nt(w_addr_nt) );r_addr_adder u5( .r_en(r_en), .r_addr(r_addr), .r_addr_nt(r_addr_nt) );cmp u6( .w_addr(w_addr), .r_addr(r_addr), .full(full), .empty(empty) ); endmodulemodule ram( data_out, data_in, w_clk, r_clk, w_en, r_en, w_addr, r

15、_addr );input 7:0data_in;input w_clk;input r_clk;input w_en;input r_en;input 7:0w_addr;input 7:0r_addr;output 7:0data_out;reg 7:0ram_f255:0;reg 7:0data_out;always(posedge r_clk) begin if(!r_en) data_out <= 8'hzz; else begin data_out <= ram_fr_addr; end endalways(posedge w_clk) begin if(!r_

16、en) ram_fw_addr <= ram_fw_addr; else begin ram_fw_addr <= data_in; end endendmodule/w_addr_regmodule w_addr_reg( w_addr, w_addr_nt, w_clk, rst );input 7:0w_addr_nt;input w_clk;input rst;output 7:0w_addr;reg 7:0w_addr;always(posedge w_clk or negedge rst) begin if(!rst) w_addr <= 8'h1f; e

17、lse w_addr <= w_addr_nt; endendmodule/r_addr_regmodule r_addr_reg( r_addr, r_addr_nt, r_clk, rst );input 7:0r_addr_nt;input r_clk;input rst;output 7:0r_addr;reg 7:0r_addr;always(posedge r_clk or negedge rst) begin if(!rst) r_addr <= 8'h00; else r_addr <= r_addr_nt; endendmodule/w_addr_a

18、ddermodule w_addr_adder( w_en, w_addr, w_addr_nt );input w_en;input 7:0w_addr;output 7:0w_addr_nt;assign w_addr_nt = w_en ? (w_addr + 8'h01) : w_addr;endmodule/r_addr_addermodule r_addr_adder( r_en, r_addr, r_addr_nt );input r_en;input 7:0r_addr;output 7:0r_addr_nt;assign r_addr_nt = r_en ? (r_a

19、ddr + 8'h01) : r_addr;endmodule/cmpmodule cmp ( w_addr, r_addr, empty, full );input 7:0w_addr;input 7:0r_addr;output empty;output full;assign empty = r_addr + 1 = w_addr;assign full = w_addr + 1 = r_addr;endmodule見fifo_tb.vtimescale 1ns/100psmodule fifo_tb;reg 7:0data_in;reg r_en;reg w_en;reg r_clk;reg w_clk;reg rst;wire 7:0data_out;wire full;wire empty;reg 7:0count;fifo u( .data_in(data_in), .data_out(data_out), .r_en(r_en), .r_clk(r_clk), .w_en(w_en), .w_clk(w_clk), .rst(rst), .full(full), .empty(empty

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論