資源描述:
《同步fifo和異步fifo的verilog實現(xiàn)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、FIFO是英文FirstInFirstOut的縮寫,是一種先進先出的數(shù)據(jù)緩存器,他與普通存儲器的區(qū)別是沒有外部讀寫地址線,這樣使用起來非常簡單,但缺點就是只能順序?qū)懭霐?shù)據(jù),順序的讀出數(shù)據(jù),其數(shù)據(jù)地址由內(nèi)部讀寫指針自動加1完成,不能像普通存儲器那樣可以由地址線決定讀取或?qū)懭肽硞€指定的地址。?FIFO一般用于不同時鐘域之間的數(shù)據(jù)傳輸,比如FIFO的一端是AD數(shù)據(jù)采集,另一端是計算機的PCI總線,假設(shè)其AD采集的速率為16位100KSPS,那么每秒的數(shù)據(jù)量為100K×16bit=1.6Mbps,而PCI總線的速度為33MHz,總線寬度32bit,其最大傳輸速率為1056Mbps,在兩個不同的時鐘域間
2、就可以采用FIFO來作為數(shù)據(jù)緩沖。另外對于不同寬度的數(shù)據(jù)接口也可以用FIFO,例如單片機位8位數(shù)據(jù)輸出,而DSP可能是16位數(shù)據(jù)輸入,在單片機與DSP連接時就可以使用FIFO來達到數(shù)據(jù)匹配的目的。?FIFO的分類根據(jù)FIFO工作的時鐘域,可以將FIFO分為同步FIFO和異步FIFO。同步FIFO是指讀時鐘和寫時鐘為同一個時鐘。在時鐘沿來臨時同時發(fā)生讀寫操作。異步FIFO是指讀寫時鐘不一致,讀寫時鐘是互相獨立的。?FIFO設(shè)計的難點在于怎樣判斷FIFO的空/滿狀態(tài)。為了保證數(shù)據(jù)正確的寫入或讀出,而不發(fā)生益處或讀空的狀態(tài)出現(xiàn),必須保證FIFO在滿的情況下,不能進行寫操作。在空的狀態(tài)下不能進行讀操作
3、。怎樣判斷FIFO的滿/空就成了FIFO設(shè)計的核心問題。.........................................................................................................................................同步FIFO的Verilog代碼之一在modlesim中驗證過。/******************************************************Afifocontrollerverilogdescription.**************
4、****************************************/modulefifo(datain,rd,wr,rst,clk,dataout,full,empty);input[7:0]datain;inputrd,wr,rst,clk;output[7:0]dataout;outputfull,empty;wire[7:0]dataout;regfull_in,empty_in;reg[7:0]mem[15:0];reg[3:0]rp,wp;assignfull=full_in;assignempty=empty_in;//memoryreadoutassigndatao
5、ut=mem[rp];//memorywriteinalways@(posedgeclk)begin???if(wr&&~full_in)mem[wp]<=datain;end//memorywritepointerincrementalways@(posedgeclkornegedgerst)begin???if(!rst)wp<=0;???elsebegin?????if(wr&&~full_in)wp<=wp+1'b1;???endend//memoryreadpointerincrementalways@(posedgeclkornegedgerst)begin???if(!rst)r
6、p<=0;???elsebegin?????if(rd&&~empty_in)rp<=rp+1'b1;???endend//Fullsignalgeneratealways@(posedgeclkornegedgerst)begin???if(!rst)full_in<=1'b0;???elsebegin?????if((~rd&&wr)&&((wp==rp-1)
7、
8、(rp==4'h0&&wp==4'hf)))?????????full_in<=1'b1;?????elseif(full_in&&rd)full_in<=1'b0;???endend//Emptysignalgenerateal
9、ways@(posedgeclkornegedgerst)begin???if(!rst)empty_in<=1'b1;???elsebegin?????if((rd&&~wr)&&(rp==wp-1
10、
11、(rp==4'hf&&wp==4'h0)))???????empty_in<=1'b1;?????elseif(empty_in&&wr)empty_in<=1'b0;???endendendmo