版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生效的調(diào)解協(xié)議書
- 苗木合同協(xié)議書
- 蔬菜試驗協(xié)議書
- 褲子批發(fā)合同范本
- 認(rèn)養(yǎng)盆花協(xié)議書
- 認(rèn)購預(yù)訂協(xié)議書
- 設(shè)備協(xié)作協(xié)議書
- 設(shè)備評審協(xié)議書
- 設(shè)計決定協(xié)議書
- 試工期合同協(xié)議
- 寫作教程(第4版)(中文專業(yè)版)課件 第六章 實寫作
- 高空拋物責(zé)任民事起訴狀范文
- 新媒體環(huán)境下品牌IP形象構(gòu)建與跨文化傳播策略研究
- 關(guān)于支付生活費協(xié)議書
- 購買牛飼料合同協(xié)議
- 2025年中國兩輪電動車行業(yè)研究報告
- 椎弓根釘術(shù)后護理
- DLT 593-2016 高壓開關(guān)設(shè)備和控制設(shè)備
- 現(xiàn)代藥物制劑與新藥研發(fā)知到智慧樹章節(jié)測試課后答案2024年秋蘇州大學(xué)
- DB32T 4660-2024 政務(wù)服務(wù)差評處置工作規(guī)范
- 胸腔手術(shù)術(shù)后并發(fā)癥
評論
0/150
提交評論