版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、同步緩沖器(FIFO)的設(shè)計(jì)與實(shí)現(xiàn)姓名:崔 琦 學(xué)號:100260305班級:2010級電科3班院系:電氣與信息工程學(xué)院專業(yè):電子科學(xué)與技術(shù) 同組人姓名:梁承潤 李建凱 (說明:我們?nèi)齻€(gè)人前面的報(bào)告部分是一樣的,因?yàn)檎n設(shè)基本是三個(gè)人商議完成,所以就感覺報(bào)告部分沒什么不同的就只寫了一份報(bào)告)目 錄1原理與系統(tǒng)設(shè)計(jì)32設(shè)計(jì)思想43源碼與注釋54仿真125綜合156心得體會與建議191 原理與系統(tǒng)設(shè)計(jì)FIFO(First In First Out)是一種可以實(shí)現(xiàn)數(shù)據(jù)先入先出的存儲器件。FIFO就像一個(gè)單向管道,數(shù)據(jù)只能按固定的方向從管道一頭進(jìn)來,再按相同的順序從管道另一頭出去,最先進(jìn)來的數(shù)據(jù)必定是最
2、先出去。FIFO被普遍用作數(shù)據(jù)緩沖器。FIFO的基本單元是寄存器,作為存儲器件,F(xiàn)IFO的存儲能力是由其內(nèi)部定義的存儲寄存器的數(shù)量決定的。本題中所設(shè)計(jì)的是同步FIFO(即輸出輸入端時(shí)鐘頻率一致),異步復(fù)位,其存儲能力為(16x8),輸出兩個(gè)狀態(tài)信號:full與empty,以供后繼電路使用。根據(jù)系統(tǒng)要求,畫出的系統(tǒng)框圖,如圖1所示圖1同步FIFO框圖端口說明:輸入:in_data: 輸入數(shù)據(jù)端口,位寬為8位;read_n: 讀使能端,當(dāng)read_n=0時(shí),可以讀出數(shù)據(jù);write_n: 寫使能端,當(dāng)write_n=0時(shí),可以寫入數(shù)據(jù);clock: 時(shí)鐘信號, 在時(shí)鐘的正邊沿進(jìn)行采樣;reset_
3、n: 復(fù)位信號,當(dāng)reset_n=0時(shí),計(jì)數(shù)器及讀寫都被清零(即:讀寫地址指針都指向0)輸出:out_data: 輸出數(shù)據(jù)端口,位寬為8位;;full:FIFO狀態(tài)信號,當(dāng)full=1時(shí),表明該FIFO存儲器已經(jīng)寫滿;empty:FIFO狀態(tài)信號,當(dāng)empty=1時(shí),表明該FIFO存儲器已經(jīng)讀空;FIFO滿的情況下,不能再寫,寫指針不能加1;FIFO空的情況下,不能再讀,讀指針不能加1;2 設(shè)計(jì)思想由以上的系統(tǒng)框圖和端口分析,我們將設(shè)計(jì)的重點(diǎn)定在了解決以下三個(gè)核心問題上:1. FIFO的存儲體如何表示?2. 如何實(shí)現(xiàn)“先進(jìn)先出”的邏輯功能?3. 如何知道FIFO內(nèi)部使用了多少,是滿是空?針對以
4、上三個(gè)問題,我們所采取的方法是:1. 定義一個(gè)16×8的二維數(shù)組來表示FIFO的存儲體。2. 為了實(shí)現(xiàn)“先進(jìn)先出”的邏輯功能,我們定義了“讀指針”及“寫指針”,分別用來指示讀操作與寫操作的位置。3. 為了表示FIFO是滿還是空,我們定義了一個(gè)計(jì)數(shù)器,用以標(biāo)志FIFO已使用了多少空間。在解決了以上三個(gè)重點(diǎn)問題以后,針對同步FIFO的邏輯功能,我們擬定了以下一個(gè)結(jié)構(gòu)圖,如圖2所示: 圖2 FIFO設(shè)計(jì)結(jié)構(gòu)圖3源碼與注釋3.1源代碼我們在完成了之前兩步的準(zhǔn)備工作之后,進(jìn)行了源碼的設(shè)計(jì),具體的代碼如下:define DEL 1 /為了使仿真接近真實(shí)情形,我們定義了從時(shí)鐘到輸出的延時(shí)modul
5、e sfifo(clock,reset_n,in_data,read_n,write_n,out_data,full,empty);/輸入信號input clock; /輸入時(shí)鐘input reset_n; /復(fù)位信號,低有效input7:0 in_data; /輸入的數(shù)據(jù)input read_n; /讀控制信號,低有效input write_n; /寫控制信號,低有效/輸出信號 output7:0 out_data; /FIFO的輸出數(shù)據(jù)output full; /FIFO滿標(biāo)志信號output empty; /FIFO空標(biāo)志信號/信號聲明 reg 7:0 out_data; reg 7:0
6、 fifo_mem15:0; /FIFO存儲體即8*16存儲器,用數(shù)組表示reg 4:0 counter; /計(jì)數(shù)器表示FIFO中已用了多少reg 3:0 rd_pointer; /FIFO讀指針,指向下次讀操作的地址reg 3:0 wr_pointer; /FIFO讀指針,指向下次讀操作的地址/賦值聲明,給出滿標(biāo)志與空標(biāo)志的實(shí)現(xiàn) assign #DEL full=(counter=16)?1'b1:1'b0; assign #DEL empty=(counter=0)?1'b1:1'b0;/本模塊實(shí)現(xiàn)讀指針、寫指針和計(jì)數(shù)器的功能always(posedge c
7、lock or negedge reset_n)beginif(reset_n)begin /計(jì)數(shù)器及讀、寫指針清零 rd_pointer<=#DEL 4'b0; wr_pointer<=#DEL 4'b0; counter<=#DEL 5'b0; end else beginif(read_n) begin /如果FIFO為空,不能再讀,并報(bào)錯 if(counter=0)/檢查fifo是否溢出(empty) begin $display("nERROR at time %0t:",$time); $display("FI
8、FO Underflown"); $stop; /終止系統(tǒng)任務(wù),用于調(diào)試 end /讀有效,寫無效時(shí),計(jì)數(shù)器減1 if(write_n) begin counter<=#DEL counter-1; end /如果讀指針已指到最后一個(gè)位置,則返回起始位置 if(rd_pointer = 15) rd_pointer <= #DEL 4'b0; else rd_pointer <= #DEL rd_pointer + 1; endif(write_n)/檢查fifo是否溢出(full)beginif(counter>=16)begin$display(&
9、quot;n ERROR at time %0t:", $time);$display("FIFO overflown");$stop;endif(read_n)/寫有效,讀無效時(shí),計(jì)數(shù)器加1begincounter <= #DEL counter + 1;endif(wr_pointer = 15)/如果寫指針已指到最后一位,則返回起始位置wr_pointer <= #DEL 4'b0;elsewr_pointer <= #DEL wr_pointer + 1;endendendalways(posedge clock)/本模塊實(shí)現(xiàn)數(shù)據(jù)
10、的讀寫功能beginif(write_n)beginfifo_memwr_pointer <= #DEL in_data;endif(read_n)beginout_data <= #DEL fifo_memrd_pointer;/讀取數(shù)據(jù)endendendmodule3.2測試文件本設(shè)計(jì)中為了讓輸入激勵能夠完整地測試出設(shè)計(jì)的功能,以證明FIFO確實(shí)能起到數(shù)據(jù)緩沖的作用,因而要測試當(dāng)讀寫速度不一致的情況,即要仿真寫速度大于讀速度的情形以及讀速度大于寫速度的情形。測試文件中:異步復(fù)位如下進(jìn)行:reset_n=1; #20 reset_n=0; #20 reset_n=1;時(shí)鐘信號如下
11、產(chǎn)生:always #100 clock<=clock;寫入數(shù)據(jù)遞增加1產(chǎn)生:in_data <= in_data + 1;而編寫測試文件的核心問題在于:在同一文件中如何既能仿真寫快與讀的情形又能仿真讀快于寫的情形?對此,我們的想法:先讓寫快于讀以達(dá)到滿的狀態(tài)(full=1),而后讓讀快于寫以達(dá)到排空的狀態(tài)(empty=1)由此我們定義了兩個(gè)狀態(tài)信號:fast_read: fast_read=1時(shí)以高速度進(jìn)行讀操作 fast_write:fast_write=1時(shí)以高速度進(jìn)行寫操作又為了讓讀和寫的速度產(chǎn)生差異,我們定義了一個(gè)周期計(jì)數(shù)信號cycle_count(其周期計(jì)數(shù)的值為.01
12、010101.),它用來控制生成讀寫使能信號,控制方式為:當(dāng)fast_write=1時(shí),只要FIFO 非滿就使寫入,得到寫使能信號;在非空的情況下,當(dāng)cycle_count1時(shí)才產(chǎn)生讀使能信號; 當(dāng)fast_read=1時(shí),只要FIFO非空就使讀取,得到讀使能信號;在非滿的情況下,當(dāng)cycle_count1時(shí)才產(chǎn)生寫使能信號;從而達(dá)到了讓快的一方速度是慢的一方速度2倍的效果。在解決了以上核心問題之后,具體的測試代碼如下:/DEFINESdefine DEL 1 /時(shí)鐘到輸出的延時(shí)module test_sfifo(clock,reset_n,in_data,read_n,write_n,out
13、_data,full,empty);/INPUTSinput 7:0out_data;input empty,full;/OUTPUTSoutput clock,reset_n,read_n,write_n;output 7:0in_data;/信號聲明,這些信號應(yīng)與測試模塊中的端口信號一一對應(yīng)reg clock;reg reset_n;reg7:0in_data;/輸入到端口in_data的激勵信號regread_n;regwrite_n;wire7:0out_data;/從端口out_data輸出的信號wirefull;wireempty;/定義需要的一些信號integerfifo_cou
14、nt;/記錄FIFO中的字節(jié)數(shù),定義為實(shí)型整數(shù)reg7:0 exp_data;/期望從FIFO輸出的數(shù)據(jù)reg fast_read; /標(biāo)志以高速度進(jìn)行讀操作reg fast_write; /標(biāo)志以高速度進(jìn)行寫操作reg filled_flag; /標(biāo)志FIFO已填滿regcycle_count;/周期計(jì)數(shù),用來生成讀寫控制信號/對FIFO進(jìn)行實(shí)例化sfifo Sfifo(.clock(clock),.reset_n(reset_n),.in_data(in_data),.read_n(read_n),.write_n(write_n),.out_data(out_data),.full(fu
15、ll),.empty(empty);initial begin in_data=0; exp_data=0; fifo_count=0; read_n=1; write_n=1; filled_flag=0; cycle_count=0; clock=1; /寫速度大于讀速度fast_write=1;fast_read=0;/復(fù)位reset_n=1;#20 reset_n=0;#20 reset_n=1;/初始情況下,F(xiàn)IFO應(yīng)該為空,即empty=1且full=0if(empty!=1)begin$display("nERROR at time %0t:",$time);
16、$display("After reset,empty status not assertedn");/報(bào)錯$stop;endif(full!=0)begin$display("nERROR at time %0t:",$time);$display("After reset,empty status not assertedn");$stop;endend /生成時(shí)鐘信號always #100 clock<=clock;/對FIFO中的字節(jié)數(shù)進(jìn)行計(jì)數(shù)。每次寫操作時(shí),計(jì)數(shù)加1;讀操作時(shí)計(jì)數(shù)減1always(posedge clo
17、ck)beginif(write_n&&read_n) /寫但不讀fifo_count<= fifo_count + 1;else if(read_n && write_n) /讀但不寫fifo_count<= fifo_count - 1;end/檢查輸出數(shù)據(jù)是否是期望的數(shù)據(jù)。如果不是,則報(bào)錯always(negedge clock) /讀寫控制信號和輸入信號在下降沿產(chǎn)生,而采樣在上升沿完成,如此可防止鎖錯數(shù)據(jù)beginif(read_n && (out_data != exp_data)begin$display("nE
18、RROR at time %0t:",$time); /$time為當(dāng)前仿真時(shí)間$display(" Expected data out = %h",exp_data);$display(" Actual data out = %hn",out_data);$stop; endif(fast_write | (cycle_count & 1'b1) && full)begin/只要非滿就使寫入,得到寫控制信號write_n <= 0;/生成輸入數(shù)據(jù)in_data <= in_data + 1;ende
19、lsewrite_n <= 1;/得到讀控制信號,并給出期望的數(shù)據(jù)if(fast_read | (cycle_count & 1'b1) && empty)begin/在非空的情況下,當(dāng)cycle=1時(shí)才產(chǎn)生讀控制信號read_n <= 0;exp_data <= exp_data + 1;/由于寫入數(shù)據(jù)為遞增加1的,所以exp_data同意也是遞增加1的endelseread_n <= 1;if(full)begin/如果fifo已滿,則使讀速度大于寫速度fast_read <= 1;fast_write <= 0;/設(shè)置寫
20、滿標(biāo)志filled_flag <= 1;endif(filled_flag && empty)/如果已清空fifo,則結(jié)束begin$display("nSimulation complete - no errors");$finish;/仿真結(jié)束end/對計(jì)算周期進(jìn)行計(jì)數(shù)cycle_count <= cycle_count + 1;/由于默認(rèn)cycle_count為1位變量,所以cycle的值實(shí)質(zhì)為'010101end/check all of the status signals with each change of fifo_co
21、untalways(fifo_count)begin/wait a moment to evaluate everything#DEL;#DEL;#DEL;case(fifo_count)0:beginif(empty != 1) | (full != 0)begin$display("nERROR at time %0t:",$time);$display(" fifo_count = %h",fifo_count);$display(" empty = %b",empty);$display(" full = %bn&q
22、uot;,full);/Use $stop for debugging$stop;endif(filled_flag = 1)begin/the fifo has filled and emptied$display("nSimulation complete - no errorsn");$finish;endend16:beginif(empty != 0) | (full != 1)begin$display("nERROR at time %0t:",$time);$display("fifo_count = %h",fifo
23、_count);$display("empty = %b",empty);$display("full = %bn",full);/Use $stop for debugging$stop;end/如果fifo寫滿,則給出寫滿標(biāo)志,此時(shí),讀速度大于寫速度filled_flag <= 1;fast_write <= 0;fast_read <= 1;enddefault:beginif(empty != 0) | (full != 0)begin$display("nERROR at time %0t:",$time)
24、;$display("fifo_count = %h",fifo_count);$display("empty = %b",empty);$display("full = %bn",full);/Use $stop for debugging$stop;endendendcaseendendmodule.4 仿真4.1波形仿真(仿真過程使用ModlSim SE 6.0進(jìn)行)波形圖中端口信號說明:empty:FIFO狀態(tài)信號,當(dāng)empty=1時(shí),表明該FIFO存儲器已經(jīng)讀空;full:FIFO狀態(tài)信號,當(dāng)full=1時(shí),表明該FIFO存
25、儲器已經(jīng)寫滿;clock: 時(shí)鐘信號, 在時(shí)鐘的正邊沿進(jìn)行采樣;reset_n: 復(fù)位信號,當(dāng)reset_n=0時(shí),計(jì)數(shù)器及讀寫都被清零(即:讀寫地址指針都指向0)read_n: 讀使能端,當(dāng)read_n=0時(shí),可以讀出數(shù)據(jù);write_n: 寫使能端,當(dāng)write_n=0時(shí),可以寫入數(shù)據(jù);in_data: 輸入數(shù)據(jù)端口,位寬為8位;out_data: 輸出數(shù)據(jù)端口,位寬為8位;fifo_count:記錄FIFO中的字節(jié)數(shù),定義為實(shí)型整數(shù)exp_data:期望從FIFO輸出的數(shù)據(jù)fast_read:標(biāo)志以高速度進(jìn)行讀操作fast_write:標(biāo)志以高速度進(jìn)行寫操作filled_flag:標(biāo)志F
26、IFO已填滿cycle_count:周期計(jì)數(shù),用來生成讀寫控制信號圖1 寫快于讀直至寫滿的波形圖圖2 讀快于寫由滿直至讀空的波形圖圖3 仿真全過程波形圖4.2 時(shí)序,邏輯分析圖1 寫快于讀直至寫滿的波形圖的分析:仿真開始時(shí),由于fast_write1,fast_read=0,所以:只要FIFO 非滿就使寫入,得到寫使能信號/在非空的情況下,當(dāng)cycle_count1時(shí)才產(chǎn)生讀使能信號.所以寫速度是讀速度的2倍(即寫入2個(gè)數(shù)據(jù),只讀取一個(gè)數(shù)據(jù)),當(dāng)FIFO寫滿后,這時(shí)full1,填滿信號filled_flag由0變?yōu)榱?.圖2 讀快于寫由滿直至讀空的波形圖的分析:由于FIFO在圖1中所示過程已填
27、滿,所以接著必須使讀速度大于寫速度,即fast_read=1,fast_write=0,此時(shí):只要FIFO非空就使讀取,得到讀使能信號/在非滿的情況下,當(dāng)cycle_count1時(shí)才產(chǎn)生寫使能信號.所以讀速度是寫速度的2倍(即讀取2個(gè)數(shù)據(jù),只寫入一個(gè)數(shù)據(jù)),在此過程中full0,filled_flag保持為1,最終FIFO排空時(shí),empty1.圖3 仿真全過程波形圖分析:由仿真全過程的波形圖來看:在reset_n=0后,計(jì)數(shù)器及讀寫地址指針都被清0,說明達(dá)到了異步復(fù)位的要求;由read_n及write_n值的變化與讀寫數(shù)據(jù)的波形來看,read_n及write_n起到了讀寫使能控制的作用;由波形
28、可知讀寫操作都是在時(shí)鐘clock的上升沿完成,說明FIFO是同步的;對比full與empty的值與FIFO的滿空狀況來看,full與empty能正確反映FIFO的實(shí)際狀態(tài)。由上述分析可以驗(yàn)證:本次設(shè)計(jì)的器件能滿足同步FIFO的邏輯功能。.5 綜合(綜合過程使用LeonardoSpectrum 2000.1b進(jìn)行)(考慮到使用不同的器件庫,綜合出來的電路圖不同,說明一下:以下綜合使用的器件庫為MAX3000A)5.1頂層綜合電路示意圖圖1圖2注:頂層綜合電路圖由圖1與圖2兩部分構(gòu)成,其由三個(gè)端口相連,它們依次是:Not_write_n , Not_reset_n , Not_read_n5.2門
29、級綜合電路示意圖圖1注:此為頂層圖中讀寫地址指針產(chǎn)生模塊注:此為頂層圖中的ram存儲器部分的門級圖5.3輸入輸出描述輸入:in_data: 輸入數(shù)據(jù)端口,位寬為8位;read_n: 讀使能端,當(dāng)read_n=0時(shí),可以讀出數(shù)據(jù);write_n: 寫使能端,當(dāng)write_n=0時(shí),可以寫入數(shù)據(jù);clock: 時(shí)鐘信號, 在時(shí)鐘的正邊沿進(jìn)行采樣;reset_n: 復(fù)位信號,當(dāng)reset_n=0時(shí),計(jì)數(shù)器及讀寫都被清零(即:讀寫地址指針都指向0)輸出:out_data: 輸出數(shù)據(jù)端口,位寬為8位;;full:FIFO狀態(tài)信號,當(dāng)full=1時(shí),表明該FIFO存儲器已經(jīng)寫滿;empty:FIFO狀態(tài)信
30、號,當(dāng)empty=1時(shí),表明該FIFO存儲器已經(jīng)讀空;6 心得體會與建議(小組成員:劉鑫)通過這次課程設(shè)計(jì),確實(shí)學(xué)到了不少東西!不光是知識上的長進(jìn),其他方面也得到了提高! 上完第一節(jié)介紹課,在BBS上看了學(xué)長的建議說是要選一個(gè)模擬的題就比較有挑戰(zhàn)性,可以學(xué)不少東西。就有一點(diǎn)想挑個(gè)模電的題,不過后來還是抽中了數(shù)電的題。后來跟同學(xué)們一樣都被認(rèn)為抽到數(shù)電是很幸運(yùn)的!因?yàn)榇_實(shí)不是一件簡單的事情! 我們組的課題是“FIFO同步緩沖器的設(shè)計(jì)”,過了一個(gè)暑假都不記得緩沖器是什么了,于是又拉出厚厚的數(shù)電的書開始翻,看到了寄存器,移位寄存器,計(jì)數(shù)器這些東西,覺得有點(diǎn)熟悉了,但是到具體的這個(gè)16*8的緩存器是個(gè)什
31、么概念,我們的意見還是有點(diǎn)分歧,于是去網(wǎng)上找這些概念,弄明白這意思。就看到有的說同步就是同一個(gè)時(shí)鐘脈沖,有的又說同步不是這個(gè)概念,后來我們就一起商討了一下,統(tǒng)一了題目的意思:同步FIFO(即輸出輸入端時(shí)鐘頻率一致),異步復(fù)位,其存儲能力為(16x8),輸出兩個(gè)狀態(tài)信號:full與empty,以供后繼電路使用。 弄清了題目的意思之后,就開始按照設(shè)計(jì)的程序來完成各部分的內(nèi)容。首先我們在網(wǎng)上找到了一些關(guān)于IC課程設(shè)計(jì)的流程介紹,我們也就使根據(jù)那些介紹的流程來一步步完成我們的任務(wù)。在查資料的同時(shí)才發(fā)現(xiàn),因特網(wǎng)真的可以幫我們不少的忙,其實(shí)我們平時(shí)的好多資料都可以借助網(wǎng)絡(luò)來查詢,所以這次還下載了不少這方面的知識以備后用。 我們設(shè)計(jì)的這個(gè)緩沖器是以寄存
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個(gè)人藝術(shù)品抵押擔(dān)保合同書4篇
- 二零二五版智能家居門窗安裝與維護(hù)服務(wù)合同3篇
- 2025年綠色建材水泥采購與施工總承包合同3篇
- 2025年個(gè)人股東對外股權(quán)轉(zhuǎn)讓協(xié)議范本與股權(quán)變更登記3篇
- 開發(fā)需求委托合同(2篇)
- 建筑材料采購分包合同(2篇)
- 2024年注冊消防工程師題庫參考答案
- 保險(xiǎn)產(chǎn)品創(chuàng)新路演模板
- 二零二五年度汽車租賃擔(dān)保公司合同車輛作為抵押的擔(dān)保公司服務(wù)協(xié)議4篇
- 二零二五版特色小吃店轉(zhuǎn)讓與加盟協(xié)議4篇
- 2025水利云播五大員考試題庫(含答案)
- 中藥飲片驗(yàn)收培訓(xùn)
- DB34T 1831-2013 油菜收獲與秸稈粉碎機(jī)械化聯(lián)合作業(yè)技術(shù)規(guī)范
- 殘疾軍人新退休政策
- 白酒代理合同范本
- 稅前工資反算表模板
- 2019級水電站動力設(shè)備專業(yè)三年制人才培養(yǎng)方案
- 肝素誘導(dǎo)的血小板減少癥培訓(xùn)課件
- 抖音認(rèn)證承諾函
- 高等數(shù)學(xué)(第二版)
- 四合一體系基礎(chǔ)知識培訓(xùn)課件
評論
0/150
提交評論