設(shè)計(jì)背景:
First Input First Output的縮寫,先入先出隊(duì)列,這是一種傳統(tǒng)的按序執(zhí)行方法,先進(jìn)入的指令先完成并引退,跟著才執(zhí)行第二條指令。FIFO是隊(duì)列機(jī)制中最簡單的,每個(gè)接口上都存在FIFO隊(duì)列,表面上看FIFO隊(duì)列并沒有提供什么QoS(Quality of Service,服務(wù)質(zhì)量)保證,甚至很多人認(rèn)為FIFO嚴(yán)格意義上不算做一種隊(duì)列技術(shù),實(shí)則不然,F(xiàn)IFO是其它隊(duì)列的基礎(chǔ),F(xiàn)IFO也會影響到衡量QoS的關(guān)鍵指標(biāo):報(bào)文的丟棄、延時(shí)、抖動(dòng)。既然只有一個(gè)隊(duì)列,自然不需要考慮如何對報(bào)文進(jìn)行復(fù)雜的流量分類,也不用考慮下一個(gè)報(bào)文怎么拿、拿多少的問題,而且因?yàn)榘错樞蛉?bào)文,F(xiàn)IFO無需對報(bào)文重新排序。簡化了這些實(shí)現(xiàn)其實(shí)也就提高了對報(bào)文時(shí)延的保證。
設(shè)計(jì)原理:
本次的設(shè)計(jì)主要通過調(diào)用FIFO的IP核來設(shè)置一個(gè)簡單的單口FIFO,也就是說讀寫時(shí)鐘為相同的時(shí)鐘。其設(shè)置流程如下所示也如rom,ram,設(shè)置一樣的打開步驟
如下如選擇FIFO,然后寫入生成的FIFO文件名,my_fifo,下一步
設(shè)置合適的數(shù)據(jù)位寬和深度,之后下一步
出現(xiàn)了空滿標(biāo)志位,full,emty,我們?nèi)サ魯?shù)據(jù)個(gè)數(shù)標(biāo)志usedw.下一步
之后不停的下一步,出現(xiàn)下面的界面選擇生成的文件,然后就完成簡單的FIFO設(shè)計(jì)
設(shè)計(jì)架構(gòu)圖:
設(shè)計(jì)代碼:
頂層模塊:
0moduletop (clk,rst_n,q);//輸入輸出端口
1 inputclk;
2 inputrst_n;
3 output[7:0]q;
4 wirewrreq; //寫使能信號
5 wirerdreq; //讀使能信號
6 wireempty; //空標(biāo)志位
7 wirefull; //滿標(biāo)志位
8 wire[7:0]data;
9
10fifo_control fifo_control (//FIFO控制器的例化
11 .clk(clk),
12 .rst_n(rst_n),
13 .full(full),
14 .empty(empty),
15 .wrreg(wrreq),
16 .rdreg(rdreq),
17 .data(data)
18 );
19my_fifo my_fifo ( //生成IP核的例化
20 .clock (clk ),
21 .data (data ),
22 .rdreq (rdreq ),
23 .wrreq (wrreq ),
24 .empty (empty ),
25 .full (full),
26 .q (q )
27 );
28
29endmodule
設(shè)計(jì)模塊
0modulefifo_control ( //端口列表
1 inputclk,
2 inputrst_n,
3 inputfull, //滿標(biāo)志
4 inputempty, //空標(biāo)志
5 outputregwrreg, //寫使能
6 outputregrdreg, //讀使能
7 outputreg[7:0]data
8 );
9 regstate;
10always@(posedgeclk ornegedgerst_n)
11 if(!rst_n)
12 begin
13 data<=0;
14 wrreg<=0; //寫使能關(guān)閉
15 rdreg<=0; //讀使能關(guān)閉
16 state <=0;
17 end
18 else
19 begin
20 case(state)
21 0:if(empty) //判斷是否為空,為空寫
22 begin
23 wrreg<=1;
24 data <=data +1;
25 end
26 elseif(full) //判斷否寫滿,為滿不寫
27 begin
28 state <=1;
29 wrreg<=0;
30 rdreg<=1;
31 data<=0;
32 end
33 else
34 begin
35 wrreg<=1;
36 data <=data +1;
37 end
38
39 1:begin
40 if(empty) //判斷是否讀空,讀空關(guān)閉讀使能
41 begin
42 rdreg<=0;
43 state <=0;
44 end
45 end
46 endcase
47 end
48
49endmodule
測試模塊
0`timescale1ns/1ps
1modulefifo_tb;
2
3 regclk;
4 regrst_n;
5 wire[7:0]q;
6initialbegin
7 clk =0;
8 rst_n =0;
9
10 #200rst_n=1;
11
12 end
13always#10clk=~clk;
14top top(
15 .clk(clk),
16 .rst_n(rst_n),
17 .q(q)
18 );
19
20endmodule
仿真圖:
從仿真空可以看到。我們寫入的數(shù)據(jù)是1--255--0,讀出的數(shù)據(jù)也是從1開始讀再到0。
這樣就完成了一個(gè)簡單的FIFO,如果要生成雙口的結(jié)局跨時(shí)鐘問題可以在設(shè)置時(shí),下面頁面選擇
來進(jìn)行設(shè)置
-
FPGA
+關(guān)注
關(guān)注
1643文章
21923瀏覽量
612399
發(fā)布評論請先 登錄
基于FPGA的異步FIFO的實(shí)現(xiàn)

xilinx7系列FPGA新設(shè)計(jì)的IO專用FIFO解析

【FPGA干貨分享三】基于FPGA的LBS控制器設(shè)計(jì)
FPGA零基礎(chǔ)學(xué)習(xí)之Vivado-FIFO使用教程
基于Altera FPGA的彩屏控制器的設(shè)計(jì)和實(shí)現(xiàn)

基于FPGA的FIFO設(shè)計(jì)和應(yīng)用
異步FIFO結(jié)構(gòu)及FPGA設(shè)計(jì)
基于XILINX的XC3系列FPGA的VGA控制器的VHDL源程
基于FPGA的LED屏控制器設(shè)計(jì)
Virtex-7 FPGA系列的內(nèi)存控制器介紹
學(xué)習(xí)SDRAM控制器設(shè)計(jì) 能讓你掌握很多FPGA知識
Verilog數(shù)字系統(tǒng)設(shè)計(jì)——復(fù)雜數(shù)字電路設(shè)計(jì)2(FIFO控制器設(shè)計(jì))

評論