FPGA的FIFO實現(xiàn)過程資料_第1頁
FPGA的FIFO實現(xiàn)過程資料_第2頁
FPGA的FIFO實現(xiàn)過程資料_第3頁
FPGA的FIFO實現(xiàn)過程資料_第4頁
FPGA的FIFO實現(xiàn)過程資料_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

FPGA的FIFO實現(xiàn)過程

FIFO隊列是一種數(shù)據(jù)緩沖器,用于數(shù)據(jù)的緩存。他是一種先入先出的存儲

器,即最先寫入的數(shù)據(jù),最先讀。FIFO的參數(shù)有數(shù)據(jù)深度和數(shù)據(jù)寬度。數(shù)據(jù)寬

度是指存儲數(shù)據(jù)的寬度。深度是指存儲器可以存儲多少個數(shù)據(jù)。

FIFO隊列有兩個標(biāo)志位。一個滿和一個空標(biāo)志位。分別表示FIFO是數(shù)據(jù)寫

滿,還是數(shù)據(jù)讀空。在數(shù)據(jù)寫滿狀態(tài)下,數(shù)據(jù)寫入是不允許的,因此在這個狀

態(tài)下,寫入的數(shù)據(jù)無效。而數(shù)據(jù)讀空狀態(tài)下,數(shù)據(jù)讀取是不允許的,因此在這

個狀態(tài)下,讀取的數(shù)據(jù)無效。

FIFO隊列有兩個位置指示指針。一個是寫指針,指向隊列的第一個存儲單

元。一個讀指針,指向隊列的最后一個存儲單元。當(dāng)有寫命令的時候,數(shù)據(jù)寫

入寫指針指向的存儲單元,然后指針加一。當(dāng)有讀命令的時候,讀指針加一,

在讀出讀指針指向的存儲單元的數(shù)據(jù)。這里讀命令,指針要加一,是定義讀數(shù)

據(jù),是讀出讀指針的下一個存儲單元的數(shù)據(jù)。

肖寫指針和讀指針的指向存儲單元一樣時,這時候根據(jù)之前是讀命令還是

寫命令來判斷隊列是空,還是滿。在讀命令,兩個指針值一樣時候,則隊列

空。在寫命令,兩個指針值一樣,則隊列滿。

以后就開始寫代碼實現(xiàn)上訴FIFO隊列,并進(jìn)行仿真。

以下,是實現(xiàn)數(shù)據(jù)寬度為8.深度為2八4的深度的FIFO。。讀/寫時鐘是同

一個。

modulefifo_cus

parameterN=8,〃數(shù)據(jù)寬度

parameterM=4〃fifo的地址寬度

)

〃對隊列的參數(shù)設(shè)置。建議這樣寫,便于以后代碼的移植。

〃如果以后要實現(xiàn)數(shù)據(jù)寬度為16,深度為2〃8的FIFO。只需改N=16M=8

即可

inputelk,//輸入時鐘

inputrst_n,//輸入復(fù)位信號

inputwr,//輸入與使能

input[N-l:0]wdata,〃輸入輸入

inputrd,〃輸入讀便能

outputempty,〃輸出fifo空標(biāo)志

outputful1,〃輸出fifo滿標(biāo)志

output[N-l:0]r_data〃輸出讀取的數(shù)據(jù)

);

//寄存器組,用來充當(dāng)FIFO隊列

reg[N-l:0]array_reg[2**M-1:0];

〃定義寫指針,指示當(dāng)前寫的位置,下一個狀態(tài)寫的位置,寫位置的下一

個位置

reg[M-l:0]wptrreg,w_ptr_next,w_ptr_succ;

〃定義讀指針,指示當(dāng)前讀的位置,下一個狀態(tài)讀的位置,讀位置的下一

個位置

reg[M-l:0]r_ptr_reg,r_ptr_next,r_ptr_succ;

〃定義FIFO滿和空的信號

rogfull_rog,fulInoxt;

regempty_reg,empty_next;

wirewren;

〃數(shù)據(jù)的寫入,在數(shù)據(jù)的上升沿的時候,有寫使能信號,將數(shù)據(jù)寫入。而

always?(posedgeelk)begin

if(wr_en)

arrayreg[wptrreg]<=wdata;

else

arrayreg[wptrreg]<=array_reg[w_ptr_reg];

end

//數(shù)據(jù)的讀取。數(shù)據(jù)讀取是一宜在讀取的,不過讀取的是之前的值。

assignrdcitci=array_reg[r_ptr_reg];

assignwren=wr&^full_reg;

/*狀態(tài)跳轉(zhuǎn)

在復(fù)位信號有效,讀/寫指針都指向0地址。此時隊列狀態(tài)為空。

在復(fù)位不有效,且在時鐘的上升沿,讀/寫指針的值,隊列空,滿狀態(tài)的值

又下一狀態(tài)決定。否則保持*/

always?(posedgeelk)begin

if(!rst_n)

begin

w_ptr_reg<=0;

r_ptr_reg<=0;

full_reg<=rbO;

empty_reg<=1'bl;

end

else

begin

wptr_reg<=w_ptr_next;

r_ptr_reg<=r_ptr_next;

fullreg<=fullnext;

empty_reg<=empty_next;

end

end

/*與命令:在與命令卜,如果隊列小為滿,將當(dāng)前與指針的下一個指針賦

值給讀指針的下一個狀態(tài),同時將隊列的空標(biāo)志置0。

然后判斷寫指針的下一個指針是否和讀指針的值一樣。一樣的話,說明,

隊列為滿。否則不為滿。

*/

2'biO:

begin

if(^fullreg)

begin

w_ptr_next=w_ptr_succ;

empty_next=0;

if(w_pli_succ—i_pli_reg)

full_next=rb1;

else

full_next=rbO;

end

end

/*讀寫命令:在讀寫命令下,直接改變時應(yīng)指針的下一個狀態(tài)值。

*/

21611:

begin

w_ptr_next=w_ptr_succ:

r_ptr_next=r.ptrsucc;

endeelse

end

//滿/空輸出信號的賦值。

assignfull=full_reg;

assignempty=emptyreg;

endmodule

好了,終于搞定FIFO的代碼了。下面來仿真看看結(jié)果。

以下分析仿真的結(jié)果:

寫數(shù)據(jù):

從下圖仿真,可看出。在最開始的時候,隊列是空的狀態(tài)。讀指針和寫指

針都是0。在寫使能情況下,在每個時鐘的上升沿(藍(lán)色線),數(shù)據(jù)寫入隊列

array_reg中。同時,寫指針加一。而讀指針是不變的。

|2(X4[2151

l—1

3?180ns,190ns200ns210ns

11?11RIlliiiii■■illiii

................

1吆empty0

Qfull0

...........

.elk1________r________1

1

Qs11

A■w-ata[7:0]/2d

130/<1

.......--------

S0j?__i

?Mr_ptr_r*e[3:0]0-------------1

▼■?r?*y_??r(150,70)(X,X,X,X.X,X.X,XzX,I,X,X,工Xx.x,x,x,x,x,x][X,X,X,3J,X,…[x,x,

>,[15,7:0】X

A、[1<70]X

A~[13,7:0]X

>,[12,7:0]X

A,[11,7:0]X

>~[10,7:?!縓

li■]

>■07:0】X

>~[?,70]X

A,[LTO]X

>y[6,7:0]X

A~[5":0]XI

>,[4,7:0]13X

?、[3,TO]Z43X

〉,[2,7:0]249-IT

>■[1,70]

Z41X-

>,[0,1:0]4"HFL

二二二二-i'll「二!三“丫一L

1

XI;245240ns

從卜圖發(fā)現(xiàn),在隊列滿狀態(tài)下,即使與使能,F(xiàn)IFO也小接受與數(shù)據(jù)。依IH

保持原來的值。

340ns360M370ns380

1....

0

&full1

二____1—1

遙cik0________111____■____1

e“51

1

242:9)1也1:245):250)

>Zw_p*r_r?K(3:0)0

—]11

>0]0

一一i?

11...

▼,??r?y_r?t[150,70]【246,9,12,13,12,1-[X.9,12,13U3-1

>,[15,T:0]246*X

>,[14,7:0]9X<_

>,[13,7:0]12

1

AW[12,7:0]13

>,[!L7:0]13

A,[10,7:0]6

>.[9,70]13

>.[8,70]

1____

>,[7,7:0】Z42

>,[6,70]245

>,(5,70]13

>巾[4,7:0]13

?Rf[3,70]243

>,[2.70]249

>2【L70]241

—■

>,[0,70]4

4HHHHHHHHHM1A

XI:4013452

讀數(shù)據(jù)

從下圖中看出,最開始,數(shù)據(jù)讀出是有值的。為初始化的讀指針指向的存

儲單元的值。這里為4。

當(dāng)有讀命令時候,在時鐘的上升沿(藍(lán)色線),讀指針加一。讀取的數(shù)據(jù)

隨之改變。

在數(shù)據(jù)讀完后,即隊列為空狀態(tài)下。此時對數(shù)據(jù)的讀取是無效的。從圖中

可看出,讀完后,讀指針為0.回到存儲器的第一個地址。而此時讀出的值是無

效的。

Ax_d*U[70]

>■r.ptr.r?t(3:0)

▼,?rtfcy-r?K(15:0,7:0]

>.[】,ru]

),[14,7:0]

?f[13,70]

??[12,70]

A.[IL7:0]

>I[10,70]

?,[9,7:0】

>Rf[8,7:0]

>,[7,7:0]

>Rf[6,7:0】

>f[5,7:0】

>,[4,70]

A?E7:0]

>.[2,TO]

?■[1,7:0】

>M07:0)

>,w_P??_r?t[30]

4swi、?Ao??r,?ci

XI634.457ns

讀寫命令:

在同時讀同時寫的時候。從下圖,可看出,結(jié)果有問題了。在隊列為空的

狀態(tài)下,此時讀取的值,應(yīng)為此時寫的數(shù)據(jù)才對了。但是從圖中,可看出,讀

取的值不是當(dāng)前寫的數(shù)據(jù)的值。而是之前存儲在FIFO中的值。這樣的話,讀取

的值就不是正確的值了。

1EZL'E'

1?BeValue半91,,,J720ns1730ns740ns....I7:

____.111111111—■

1I

Qfun0

■1

Qcik1——11__1

11--------------------------

H1近|1

1—

.rd1__1

?蟹0]1312*2d¥

、1

r

溫馨提示

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

評論

0/150

提交評論