兩種異步FIFO的設計及verilog源代碼_第1頁
兩種異步FIFO的設計及verilog源代碼_第2頁
兩種異步FIFO的設計及verilog源代碼_第3頁
兩種異步FIFO的設計及verilog源代碼_第4頁
兩種異步FIFO的設計及verilog源代碼_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、原碼異步異步及原碼這幾天看了的兩篇大作頗有感想,真可謂經典之作,不可錯過。1.什么是FIFO?FIFO是英文FirstInFirstOut的縮寫,是一種先進先出的數據緩存器,他與普通存儲器的區(qū)別是沒有外部讀寫地址線,這樣使用起來非常簡單,但缺點就是只能順序寫入數據,順序的讀出數據,其數據地址由內部讀寫指針自動加1完成,不能像普通存儲器那樣可以由地址線決定讀取或寫入某個指定的地址。2什么情況下用FIFO?FIFO一般用于不同時鐘域之間的數據傳輸,比如FIFO的一端是AD數據采集,另一端是計算機的PCI總線,假設其AD采集的速率為16位100KSPS,那么每秒的數據量為100Kx16bit=1.6

2、Mbps,而PCI總線的速度為33MHz,總線寬度32bit,其最大傳輸速率為1056Mbps,在兩個不同的時鐘域間就可以采用FIFO來作為數據緩沖。另外對于不同寬度的數據接口也可以用FIFO,例如單片機位8位數據輸出,而DSP可能是16位數據輸入,在單片機與DSP連接時就可以使用FIFO來達到數據匹配的目的。3.FIFO的一些重要參數FIFO的寬度:也就是英文資料里常看到的THEWIDTH,它只的是FIFO一次讀寫操作的數據位,就像MCU有8位和16位,ARM32位等等,F(xiàn)IFO的寬度在單片成品IC中是固定的,也有可選擇的,如果用FPGA自己實現(xiàn)一個FIFO,其數據位,也就是寬度是可以自己定

3、義的。FIFO的深度:THEDEEPTH,它指的是FIFO可以存儲多少個N位的數據(如果寬度為N)。如一個8位的FIFO,若深度為8,它可以存儲8個8位的數據,深度為12,就可以存儲12個8位的數據,F(xiàn)IFO的深度可大可小,個人認為FIFO深度的計算并無一個固定的公式。在FIFO實際工作中,其數據的滿/空標志可以控制數據的繼續(xù)寫入或讀出。在一個具體的應用中也不可能由一些參數算數精確的所需FIFO深度為多少,這在寫速度大于讀速度的理想狀態(tài)下是可行的,但在實際中用到的FIFO深度往往要大于計算值。一般來說根據電路的具體情況,在兼顧系統(tǒng)性能和FIFO成本的情況下估算一個大概的寬度和深度就可以了。而對

4、于寫速度慢于讀速度的應用,F(xiàn)IFO的深度要根據讀出的數據結構和讀出數據的由那些具體的要求來確定。滿標志:FIFO已滿或將要滿時由FIFO的狀態(tài)電路送出的一個信號,以阻止FIFO的寫操作繼續(xù)向FIFO中寫數據而造成溢出(overflow)??諛酥荆篎IFO已空或將要空時由FIFO的狀態(tài)電路送出的一個信號,以阻止FIFO的讀操作繼續(xù)從FIFO中讀出數據而造成無效數據的讀出(underflow)。讀時鐘:讀操作所遵循的時鐘,在每個時鐘沿來臨時讀數據。寫時鐘:寫操作所遵循的時鐘,在每個時鐘沿來臨時寫數據。讀指針:指向下一個讀出地址。讀完后自動加1。寫指針:指向下一個要寫入的地址的,寫完自動加1。讀寫指

5、針其實就是讀寫的地址,只不過這個地址不能任意選擇,而是連續(xù)的4FIFO的分類根均FIFO工作的時鐘域,可以將FIFO分為同步FIFO和異步FIFO。同步FIFO是指讀時鐘和寫時鐘為同一個時鐘。在時鐘沿來臨時同時發(fā)生讀寫操作。異步FIFO是指讀寫時鐘不一致,讀寫時鐘是互相獨立的。5FIFO設計的難點FIFO設計的難點在于怎樣判斷FIFO的空/滿狀態(tài)。|為了保證數據正確的寫入或讀出,而不發(fā)生益處或讀空的狀態(tài)出現(xiàn),必須保證FIFO在滿的情況下,不能進行寫操作。在空的狀態(tài)下不能進行讀操作。怎樣判斷FIFO的滿/空就成了FIFO設計的核心問題。由于同步FIFO幾乎很少用到,這里只描述異步FIFO的空/滿

6、標志產生問題。在用到觸發(fā)器的設計中,不可避免的會遇到亞穩(wěn)態(tài)的問題(關于亞穩(wěn)態(tài)這里不作介紹,可查看相關資料)。在涉及到觸發(fā)器的電路中,亞穩(wěn)態(tài)無法徹底消除,只能想辦法將其發(fā)生的概率將到最低。其中的一個方法就是使用格雷碼。格雷碼在相鄰的兩個碼元之間只由一位變換(二進制碼在很多情況下是很多碼元在同時變化)。這就會避免計數器與時鐘同步的時候發(fā)生亞穩(wěn)態(tài)現(xiàn)象。但是格雷碼有個缺點就是只能定義2M的深度,而不能像二進制碼那樣隨意的定義FIFO的深度,因為格雷碼必須循環(huán)一個2M,否則就不能保證兩個相鄰碼元之間相差一位的條件,因此也就不是真正的各雷碼了。第二就是使用冗余的觸發(fā)器,假設一個觸發(fā)器發(fā)生亞穩(wěn)態(tài)的概率為P,

7、那么兩個及聯(lián)的觸發(fā)器發(fā)生亞穩(wěn)態(tài)的概率就為P的平方。但這回導致延時的增加。亞穩(wěn)態(tài)的發(fā)生會使得FIFO出現(xiàn)錯誤,讀/寫時鐘采樣的地址指針會與真實的值之間不同,這就導致寫入或讀出的地址錯誤。由于考慮延時的作用,空/滿標志的產生并不一定出現(xiàn)在FIFO真的空/滿時才出現(xiàn)??赡蹻IFO還未空/滿時就出現(xiàn)了空/滿標志。這并沒有什么不好,只要保證FIFO不出現(xiàn)overfloworunderflow就OK了。很多關于FIFO的文章其實討論的都是空/滿標志的不同算法問題。第一個算法:CliffordE.Cummings的文章中提到的STYLE#1,構造一個指針寬度為N+1,深度為2AN字節(jié)的FIFO(為便方比較將

8、格雷碼指針轉換為二進制指針)。當指針的二進制碼中最高位不一致而其它N位都相等時,F(xiàn)IFO為滿(在CliffordE.Cummings的文章中以格雷碼表示是前兩位均不相同,而后兩位LSB相同為滿,這與換成二進制表示的MSB不同其他相同為滿是一樣的)。當指針完全相等時,F(xiàn)IFO為空。這種方法思路非常明了,為了比較不同時鐘產生的指針,需要把不同時鐘域的信號同步到本時鐘域中來,而使用Gray碼的目的就是使這個異步同步化的過程發(fā)生亞穩(wěn)態(tài)的機率最小,而為什么要構造一個N+1的指針,CliffordE.Cummings也闡述的很明白,有興趣的讀者可以看下作者原文是怎么論述的,CliffordE.Cummin

9、gs的這篇文章有Revl.1Rev1.2兩個版本,兩者在比較Gray碼指針時的方法略有不同,個Rev1.2版更為精簡。第二種算法:CliffordE.Cummings的文章中提到的STYLE#2。它將FIFO地址分成了4部分,每部分分別用高兩位的MSB00、1、11、10決定FIFO是否為goingfull或goingempty(即將滿或空)。如果寫指針的高兩位MSB小于讀指針的高兩位MSB則FIFO為“幾乎滿”,若寫指針的高兩位MSB大于讀指針的高兩位MSB則FIFO為“幾乎空”。它是利用將地址空間分成4個象限(也就是四個等大小的區(qū)域),然后觀察兩個指針的相對位置,如果寫指針落后讀指針一個象

10、限(25的%距離,呵呵),則證明很可能要寫滿,反之則很可能要讀空,這個時候分別設置兩個標志位和,然后在地址完全相等的情況下,如果有效就是寫滿,如果,有然效后就是讀空。這種方法對深度為2AN字節(jié)的FIFO只需N位的指針即可,處理的速度也較第一種方法快。異步FIFO及verilog原碼_續(xù)兩篇文章的原碼modulefifo1(rdata,wfull,rempty,wdata,winc,wclk,wrst_n,rinc,rclk,rrst_n);parameterDSIZE=8;parameterASIZE=4;outputDSIZE-1:0rdata;outputwfull;outputrempt

11、y;inputDSIZE-1:0wdata;inputwinc,wclk,wrst_n;inputrinc,rclk,rrst_n;regwfull,rempty;regASIZE:0wptr,rptr,wq2_rptr,rq2_wptr,wq1_rptr,rq1_wptr;regASIZE:0rbin,wbin;regDSIZE-1:0mem0:(1ASIZE)-1;wireASIZE-1:0waddr,raddr;wireASIZE:0rgraynext,rbinnext,wgraynext,wbnnext;wirerempty_val,wfull_val;/雙口RAM存儲器assignr

12、data=memraddr;always(posedgewclk)if(winc&!wfull)memwaddr=wdata;/同步rptr指針always(posedgewclkornegedgewrst_n)if(!wrst_n)wq2_rptr,wq1_rptr=0;elsewq2_rptr,wq1_rptr=wq1_rptr,rptr;/同步wptr指針always(posedgerclkornegedgerrst_n)if(!rrst_n)rq2_wptr,rq1_wptr=0;elserq2_wptr,rq1_wptr=rq1_wptr,wptr;/rempty產生與raddr產生

13、/GRAYSTYLE2pointer/always(posedgerclkornegedgerrst_n)beginif(!rrst_n)rbin,rptr=0;elserbin,rptrl)人rbinnext;二進制碼轉換成為格雷碼,經典/FIFOemptywhenthenextrptr=synchronizedwptroronreset/assignrempty_val=(rgraynext=rq2_wptr);always(posedgerclkornegedgerrst_n)beginif(!rrst_n)rempty=lbl;elserempty=rempty_val;end/wfu

14、ll產生與waddr產生/GRAYSTYLE2pointeralways(posedgewclkornegedgewrst_n)if(!wrst_n)wbin,wptr=0;elsewbin,wptrl)人wbinnext;/Simplifiedversionofthethreenecessaryfull-tests:/assignwfull_val=(wgnextADDRSIZE!=wq2_rptrADDRSIZE)&/(wgnextADDRSIZE-l!=wq2_rptrADDRSIZE-l)&/(wgnextADDRSIZE-2:0=wq2_rptrADDRSIZE-2:0);/assi

15、gnwfull_val=(wgraynext=wq2_rptrASIZE:ASIZE-l,wq2_rptrASIZE-2:0);always(posedgewclkornegedgewrst_n)if(!wrst_n)wfull=lb0;elsewfull=wfull_val;endmoduleSTYLE#2modulefifo2(rdata,wfull,rempty,wdata,winc,wclk,wrst_n,rinc,rclk,rrst_n);parameterDSIZE=8;parameterASIZE=4;outputDSIZE-l:0rdata;outputwfull;output

16、rempty;inputDSIZE-1:0wdata;inputwinc,wclk,wrst_n;inputrinc,rclk,rrst_n;wireASIZE-1:0wptr,rptr;wireASIZE-1:0waddr,raddr;async_cmp#(ASIZE)async_cmp(.aempty_n(aempty_n),.afull_n(afull_n),.wptr(wptr),.rptr(rptr),.wrst_n(wrst_n);fifomem2#(DSIZE,ASIZE)fifomem2(.rdata(rdata),.wdata(wdata),.waddr(wptr),.rad

17、dr(rptr),.wclken(winc),.wclk(wclk);rptr_empty2#(ASIZE)rptr_empty2(.rempty(rempty),.rptr(rptr),.aempty_n(aempty_n),.rinc(rinc),.rclk(rclk),.rrst_n(rrst_n);wptr_full2#(ASIZE)wptr_full2(.wfull(wfull),.wptr(wptr),.afull_n(afull_n),.winc(winc),.wclk(wclk),.wrst_n(wrst_n);endmodulemodulefifomem2(rdata,wda

18、ta,waddr,raddr,wclken,wclk);parameterDATASIZE=8;/MemorydatawordwidthparameterADDRSIZE=4;/NumberofmemoryaddressbitsparameterDEPTH=1ADDRSIZE;/DEPTH=2*ADDRSIZEoutputDATASIZE-1:0rdata;inputDATASIZE-1:0wdata;inputADDRSIZE-1:0waddr,raddr;inputwclken,wclk;ifdefVENDORRAM/instantiationofavendorsdual-portRAMV

19、ENDOR_RAMMEM(.dout(rdata),.din(wdata),.waddr(waddr),.raddr(raddr),.wclken(wclken),.clk(wclk);elseregDATASIZE-1:0MEM0:DEPTH-1;assignrdata=MEMraddr;always(posedgewclk)if(wclken)MEMwaddr=wdata;endifendmodulemoduleasync_cmp(aempty_n,afull_n,wptr,rptr,wrst_n);parameterADDRSIZE=4;parameterN=ADDRSIZE-1;out

20、putaempty_n,afull_n;inputN:0wptr,rptr;inputwrst_n;regdirection;wirehigh=1b1;wiredirset_n=(wptrNWptrN-l)&(wptrN-lFrptrN);wiredirclr_n=(wptrNArptrN-1)&(wptrN-1ArptrN)Iwrst_n);always(posedgehighornegedgedirset_nornegedgedirclr_n)if(!dirclr_n)direction=1b0;elseif(!dirset_n)direction=1b1;elsedirection=hi

21、gh;/always(negedgedirset_nornegedgedirclr_n)/if(!dirclr_n)direction=1b0;/elsedirection=1b1;assignaempty_n=(wptr=rptr)&!direction);assignafull_n=(wptr=rptr)&direction);endmodulemodulerptr_empty2(rempty,rptr,aempty_n,rinc,rclk,rrst_n);parameterADDRSIZE=4;outputrempty;outputADDRSIZE-1:0rptr;inputaempty

22、_n;inputrinc,rclk,rrst_n;regADDRSIZE-1:0rptr,rbin;regrempty,rempty2;wireADDRSIZE-1:0rgnext,rbnext;/GRAYSTYLE2pointer/always(posedgerclkornegedgerrst_n)if(!rrst_n)beginrbin=0;rptr=0;endelsebeginrbin=rbnext;rptrl)人rbnext;/binary-to-grayconversionalways(posedgerclkornegedgeaempty_n)if(!aempty_n)rempty,rempty2=2bll;elserempty,rempty2=rempty2,aempty_n;endmodulemodulewptr_full2(wfull,wptr,afull_n,winc,wclk,wrst_n);parameterADDRSIZE=4;outputwfull;outputADDRSIZE-l:0wptr;inputafull_n;inputwinc,wclk,wrst_n;regADDRSIZE-l:0wptr,wbin

溫馨提示

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

評論

0/150

提交評論