




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、異步FIFO設(shè)計(jì) 摘要本文采用格雷碼設(shè)計(jì)了一個(gè)異步FIFO,經(jīng)過(guò)DC綜合的結(jié)果如下:時(shí)鐘頻率:1.1GHz面積: 10744.447um2功耗: 7.791mw目 錄1. 異步FIFO的設(shè)計(jì)21.1 異步FIFO簡(jiǎn)介21.2 FIFO的參數(shù)21.3 FIFO的設(shè)計(jì)原理21.4 FIFO的設(shè)計(jì)模塊61.5 用modelsim仿真FIFO111.6 用DC對(duì)FIFO進(jìn)行綜合132.參考文獻(xiàn)151. 異步FIFO的設(shè)計(jì)1.1 異步FIFO簡(jiǎn)介FIFO是英文First In First Out 的縮寫,是一種先進(jìn)先出的數(shù)據(jù)緩存器,它與普通存儲(chǔ)器的區(qū)別是沒(méi)有外部讀寫地址線,這樣使用起來(lái)非常簡(jiǎn)單,但缺點(diǎn)就
2、是只能順序?qū)懭霐?shù)據(jù),順序的讀出數(shù)據(jù),其數(shù)據(jù)地址由內(nèi)部讀寫指針自動(dòng)加1完成,不能像普通存儲(chǔ)器那樣可以由地址線決定讀取或?qū)懭肽硞€(gè)指定的地址。根均FIFO工作的時(shí)鐘域,可以將FIFO分為同步FIFO和異步FIFO。同步FIFO是指讀時(shí)鐘和寫時(shí)鐘為同一個(gè)時(shí)鐘。在時(shí)鐘沿來(lái)臨時(shí)同時(shí)發(fā)生讀寫操作。異步FIFO是指讀寫時(shí)鐘不一致,讀寫時(shí)鐘是互相獨(dú)立的。異步FIFO(Asynchronous FIFO),一般用于不同時(shí)鐘域之間的數(shù)據(jù)傳輸,比如FIFO的一端連接頻率較低的AD數(shù)據(jù)采樣信號(hào),另一端與計(jì)算機(jī)的頻率較高的PCI總線相連。另外,對(duì)于不同寬度的數(shù)據(jù)接口也可以用AFIFO,例如單片機(jī)為8位數(shù)據(jù)輸出,而DSP可
3、能是16位數(shù)據(jù)輸入,在單片機(jī)與DSP連接時(shí)就可以使用AFIFO來(lái)達(dá)到數(shù)據(jù)匹配的目的。由于實(shí)際中,異步FIFO比較常見(jiàn)。為了便于描述,在后面的章節(jié)中將異步FIFO簡(jiǎn)稱為FIFO.1.2 FIFO的參數(shù)FIFO的寬度: 進(jìn)行一次讀寫操作的數(shù)據(jù)的位寬。FIFO的深度: 雙口存儲(chǔ)器中能容納的數(shù)據(jù)的總數(shù)。滿標(biāo)志: FIFO已滿或?qū)⒁獫M時(shí)由FIFO的狀態(tài)電路送出的一個(gè)信號(hào),以阻止FIFO的寫操作繼續(xù)向FIFO中寫數(shù)據(jù)而造成溢出。 空標(biāo)志: FIFO已空或?qū)⒁諘r(shí)由FIFO的狀態(tài)電路送出的一個(gè)信號(hào),以阻止FIFO的讀操作繼續(xù)從FIFO中讀出數(shù)據(jù)而造成無(wú)效數(shù)據(jù)的讀出。 讀時(shí)鐘: 讀操作所遵循的時(shí)鐘,在每個(gè)時(shí)鐘
4、沿來(lái)臨時(shí)讀數(shù)據(jù)。 寫時(shí)鐘: 寫操作所遵循的時(shí)鐘,在每個(gè)時(shí)鐘沿來(lái)臨時(shí)寫數(shù)據(jù)。 讀指針: 指向下一個(gè)讀出地址。讀完后自動(dòng)加1。 寫指針: 指向下一個(gè)要寫入的地址的,寫完自動(dòng)加1。 讀寫指針其實(shí)就是讀寫memory的地址,只不過(guò)這個(gè)地址不能任意選擇,而是連續(xù)的。1.3 FIFO的設(shè)計(jì)原理整體的框圖如下:圖1.1 FIFO的整體電路圖 FIFO的讀寫指針FIFO可以看成是先進(jìn)新出的緩沖區(qū),它不像普通的存儲(chǔ)器那樣,有專門的地址信號(hào)。它只能根據(jù)地址,順序地讀寫緩沖區(qū)。所以需要有兩個(gè)讀寫指針。這里定義如下:wptr: 寫數(shù)據(jù)的指針rptr: 讀數(shù)據(jù)的指針每讀/寫完一個(gè)數(shù)據(jù),讀/寫指針就會(huì)加1,指向下一個(gè)待讀
5、/寫的位置。1.3.2 同步器的設(shè)計(jì)為了產(chǎn)生空/滿標(biāo)志,需要對(duì)2個(gè)讀/寫指針進(jìn)行比較。由于FIFO的讀/寫時(shí)鐘信號(hào),來(lái)自2個(gè)不同的時(shí)鐘域,所以先要將這2個(gè)指針同步到一個(gè)時(shí)鐘域。這里采用兩級(jí)D觸發(fā)器級(jí)聯(lián)來(lái)構(gòu)成同步器。1.3.3 格雷碼計(jì)數(shù)器 采用二進(jìn)制碼對(duì)地址指針進(jìn)行計(jì)數(shù)時(shí),從一個(gè)計(jì)數(shù)值變到下一個(gè)計(jì)數(shù)值時(shí),可能有多位發(fā)生跳變,如從7à8變化時(shí),低位由0111à1000,這樣同步器在采樣數(shù)據(jù)時(shí),可能會(huì)發(fā)生錯(cuò)誤。由于采用格雷碼計(jì)數(shù)時(shí),每次只有1位發(fā)生跳變,這樣使亞穩(wěn)態(tài)發(fā)生錯(cuò)誤的可能性大大減小了。1.3.4 空標(biāo)志的產(chǎn)生由于讀/寫指針,總是指向FIFO的memory中下一個(gè)要讀/寫
6、的位置。只有在讀/寫復(fù)位的時(shí)候,讀/寫指針才回到0位置。復(fù)位后,隨著數(shù)據(jù)的讀出/寫入,讀/寫指針指向的地址逐漸增加。如果讀的速度比較快,當(dāng)讀指針趕上寫指針,即讀指針與寫指針指向同一個(gè)位置時(shí),輸出的空標(biāo)志有效。如下圖所示:圖1.2 FIFO的空/滿標(biāo)志1.3.5 滿標(biāo)志的產(chǎn)生滿標(biāo)志的產(chǎn)生,基于這樣的原理:即“寫指針比空指針多繞了一圈”后,又指向了空指針?biāo)赶虻奈恢?。由上可知,空?biāo)志的產(chǎn)生,也是由于讀/寫指針指向了同一位置。那怎么來(lái)區(qū)分,當(dāng)讀/寫指針指向同一位置時(shí),F(xiàn)IFO是滿,還是空呢?這里,采用增加一位地址位的方法,來(lái)區(qū)分滿標(biāo)志和空標(biāo)志。假設(shè)FIFO的深度為16,那么采用5位的讀/寫地址指針。
7、地址的低4位,用來(lái)對(duì)尋址memory,讀/寫指針的最高位用來(lái)判斷FIFO為空還是為滿。當(dāng)讀/寫指針的低4位相同時(shí),如果最高位也相同,那么空標(biāo)志有效,否則滿標(biāo)志有效。 由于格雷碼具有一個(gè)特性:關(guān)于中間的計(jì)數(shù)值對(duì)稱。如果從格雷碼的中間劃開,把它分成2段。分別從上往下看,會(huì)發(fā)現(xiàn)在對(duì)應(yīng)的位置,只有最高的2位是完全相反,而其余的低位部分則是相同的。因此,當(dāng)讀/寫指針的最高2位完全相反,而其余的低位完全相同時(shí),滿標(biāo)志有效(“讀指針比寫指針多繞了一圈”)。具體如下圖所示:圖1.3 格雷碼的對(duì)稱特性1.3.6 格雷碼計(jì)數(shù)器如果讀/寫數(shù)據(jù)的使能信號(hào)(rinc/winc)有效,在下一個(gè)讀/寫時(shí)鐘的上升沿到來(lái)時(shí),會(huì)
8、從(對(duì))memory讀出/寫入一個(gè)數(shù)據(jù),并且相應(yīng)的讀/寫指針會(huì)加1。由于習(xí)慣上用二進(jìn)制碼來(lái)尋址memory,而且用二進(jìn)制碼能很方便地進(jìn)行累積操作,所以這里以二進(jìn)制碼為主,并將二進(jìn)制碼轉(zhuǎn)換為格雷碼,以比較讀/寫指針來(lái)產(chǎn)生空/滿標(biāo)志位。二進(jìn)制碼可以通過(guò)以下方式轉(zhuǎn)換成格雷碼:gray = (bin >> 1) bin其中,gray表示格雷碼,bin表示二進(jìn)制碼。如,設(shè)一個(gè)5位的二進(jìn)制碼為B4:0,它對(duì)應(yīng)的格雷碼為G4:0,則G4 = B4G3 = B3 B3G2 = B2 B2G1 = B1 B1G0 = B0 B0具體如下圖所示: 圖1.4 比較指針和尋址指針的產(chǎn)生電路1.4 FIFO
9、的設(shè)計(jì)模塊整個(gè)FIFO包括1個(gè)頂層模塊和5個(gè)子模塊。1.4.1 子模塊fifomem這個(gè)子模塊,主要實(shí)現(xiàn)對(duì)FIFO的memory進(jìn)行操作。如果寫使能信號(hào)(winc)有效,且FIFO滿標(biāo)志(wfull)無(wú)效,則在下一個(gè)寫時(shí)鐘(wclk)的上升沿到來(lái)時(shí),將數(shù)據(jù)(wdata)寫入到memory中寫地址(waddr)指針?biāo)赶虻奈恢?。同時(shí),只要給出讀地址(raddr),就可以從memory中讀出數(shù)據(jù)(rdata),與讀時(shí)鐘(rclk)無(wú)關(guān)。相應(yīng)的代碼如下所示:module fifomem #(parameter DATASIZE = 8, / Memory data word width parame
10、ter ADDRSIZE = 4) / Number of mem address bits (output DATASIZE-1:0 rdata, input DATASIZE-1:0 wdata, input ADDRSIZE-1:0 waddr, raddr, input wclken, wfull, wclk); / RTL Verilog memory model localparam DEPTH = 1<<ADDRSIZE; reg DATASIZE-1:0 mem 0:DEPTH-1; assign rdata = memraddr; always (posedge
11、wclk) if (wclken && !wfull) memwaddr <= wdata;endmodule1.4.2 子模塊sync_r2w這個(gè)子模塊,通過(guò)2個(gè)D觸發(fā)器的級(jí)聯(lián),將格雷碼表示的讀指針,同步到寫時(shí)鐘域中。相應(yīng)的代碼如下:module sync_r2w #(parameter ADDRSIZE = 4) (output reg ADDRSIZE:0 wq2_rptr, input ADDRSIZE:0 rptr, input wclk, wrst_n); reg ADDRSIZE:0 wq1_rptr; always (posedge wclk or neg
12、edge wrst_n) if (!wrst_n) wq2_rptr,wq1_rptr <= 0; else wq2_rptr,wq1_rptr <= wq1_rptr,rptr;endmodule1.4.3 子模塊sync_w2r這個(gè)子模塊,也采用2個(gè)D觸發(fā)器的級(jí)聯(lián),將格雷碼表示的讀指針,同步到寫時(shí)鐘域中。相應(yīng)的代碼如下:module sync_w2r #(parameter ADDRSIZE = 4) (output reg ADDRSIZE:0 rq2_wptr, input ADDRSIZE:0 wptr, input rclk, rrst_n); reg ADDRSIZE
13、:0 rq1_wptr; always (posedge rclk or negedge rrst_n) if (!rrst_n) rq2_wptr,rq1_wptr <= 0; else rq2_wptr,rq1_wptr <= rq1_wptr,wptr;Endmodule1.4.4 子模塊rptr_empty這個(gè)子模塊的輸入包括:讀使能信號(hào)(rinc)、讀時(shí)鐘(rclk)、讀復(fù)位信號(hào)(rrst_n,低電平有效)。輸出包括:讀尋址指針(raddr)、讀比較指針(rptr)。其中讀尋址指針為二進(jìn)制碼,讀比較指針為格雷碼,且讀尋址指針比讀比較指針少一位。可以參照?qǐng)D1.4,相關(guān)的代碼
14、如下:module rptr_empty #(parameter ADDRSIZE = 4) (output reg rempty, output ADDRSIZE-1:0 raddr, output reg ADDRSIZE :0 rptr, input ADDRSIZE :0 rq2_wptr, input rinc, rclk, rrst_n); reg ADDRSIZE:0 rbin; wire ADDRSIZE:0 rgraynext, rbinnext; always (posedge rclk or negedge rrst_n) if (!rrst_n) rbin, rptr
15、<= 0; else rbin, rptr <= rbinnext, rgraynext; / Memory read-address pointer (okay to use binary to address memory) assign raddr = rbinADDRSIZE-1:0; assign rbinnext = rbin + (rinc & rempty); assign rgraynext = (rbinnext>>1) rbinnext; /- / FIFO empty when the next rptr = synchronized w
16、ptr or on reset /- assign rempty_val = (rgraynext = rq2_wptr); always (posedge rclk or negedge rrst_n) if (!rrst_n) rempty <= 1'b1; else rempty <= rempty_val;endmodule1.4.5 子模塊rptr_empty這個(gè)子模塊的輸入包括:寫使能信號(hào)(winc)、寫時(shí)鐘(wclk)、寫復(fù)位信號(hào)(wrst_n,低電平有效)。輸出包括:寫尋址指針(waddr)、寫比較指針(wptr)。其中讀尋址指針為二進(jìn)制碼,讀比較指針為格雷
17、碼,且讀尋址指針比讀比較指針少一位??梢詤⒄?qǐng)D1.4,相關(guān)的代碼如下:module wptr_full #(parameter ADDRSIZE = 4) (output reg wfull, output ADDRSIZE-1:0 waddr, output reg ADDRSIZE :0 wptr, input ADDRSIZE :0 wq2_rptr, input winc, wclk, wrst_n); reg ADDRSIZE:0 wbin; wire ADDRSIZE:0 wgraynext, wbinnext; / GRAYSTYLE2 pointer always (posed
18、ge wclk or negedge wrst_n) if (!wrst_n) wbin, wptr <= 0; else wbin, wptr <= wbinnext, wgraynext; / Memory write-address pointer (okay to use binary to address memory) assign waddr = wbinADDRSIZE-1:0; assign wbinnext = wbin + (winc & wfull); assign wgraynext = (wbinnext>>1) wbinnext;
19、/- / Simplified version of the three necessary full-tests: / assign wfull_val=(wgnextADDRSIZE !=wq2_rptrADDRSIZE ) && / (wgnextADDRSIZE-1 !=wq2_rptrADDRSIZE-1) && / (wgnextADDRSIZE-2:0=wq2_rptrADDRSIZE-2:0); /- assign wfull_val = (wgraynext=wq2_rptrADDRSIZE:ADDRSIZE-1, wq2_rptrADDRSI
20、ZE-2:0); always (posedge wclk or negedge wrst_n) if (!wrst_n) wfull <= 1'b0; else wfull <= wfull_val;endmodule1.4.6 頂層模塊afifo這個(gè)頂層模塊,主要完成5個(gè)子模塊例化和互聯(lián)。可以參照?qǐng)D1.1,相關(guān)的代碼如下:module afifo #(parameter DSIZE = 8, parameter ASIZE = 4) (output DSIZE-1:0 rdata, output wfull, output rempty, input DSIZE-1:0
21、 wdata, input winc, wclk, wrst_n, input rinc, rclk, rrst_n); wire ASIZE-1:0 waddr, raddr; wire ASIZE :0 wptr, rptr, wq2_rptr, rq2_wptr; sync_r2w sync_r2w (.wq2_rptr(wq2_rptr), .rptr(rptr), .wclk(wclk), .wrst_n(wrst_n); sync_w2r sync_w2r (.rq2_wptr(rq2_wptr), .wptr(wptr), .rclk(rclk), .rrst_n(rrst_n)
22、; fifomem #(DSIZE, ASIZE) fifomem (.rdata(rdata), .wdata(wdata), .waddr(waddr), .raddr(raddr), .wclken(winc), .wfull(wfull), .wclk(wclk); rptr_empty #(ASIZE) rptr_empty (.rempty(rempty), .raddr(raddr), .rptr(rptr), .rq2_wptr(rq2_wptr), .rinc(rinc), .rclk(rclk), .rrst_n(rrst_n); wptr_full #(ASIZE) wp
23、tr_full (.wfull(wfull), .waddr(waddr), .wptr(wptr), .wq2_rptr(wq2_rptr), .winc(winc), .wclk(wclk), .wrst_n(wrst_n); endmodule1.5 用modelsim仿真FIFO 編寫測(cè)試代碼根據(jù)前面的頂層模塊afifo,編寫測(cè)試代碼如下:timescale 1ns/1nsmodule test; reg 7:0 wdata; reg winc; reg wclk; reg wrst_n; reg rinc; reg rclk; reg rrst_n; wire 7:0 rdata;
24、wire wfull; wire rempty; integer i; always begin #50 wclk = 1; #50 wclk = 0; end always begin #100 rclk = 1; #100 rclk = 0; end initial begin wrst_n = 0; rrst_n = 0; rinc = 0; winc = 0; wclk = 0; rclk = 0; wdata = 0; i = 0; #400; wrst_n = 1; rrst_n = 1; for (i = 0; i < 16; i = i + 1) begin repeat
25、 (1) (posedge wclk) #20 winc = 1; wdata = i; end repeat (1) (posedge wclk) #20 winc = 0; for (i = 0; i < 16; i = i + 1) begin repeat (1) (posedge rclk) #20 rinc = 1; end repeat (1) (posedge rclk) #20 rinc = 0; end afifo afifo (.rdata(rdata), .wdata(wdata), .wclk(wclk), .rclk(rclk), .wrst_n(wrst_n
26、), .rrst_n(rrst_n), .wfull(wfull), .rempty(rempty), .winc(winc), .rinc(rinc) );endmodule1.5.2仿真波形當(dāng)寫時(shí)鐘(wclk)和讀時(shí)鐘(rclk)的周期相同,且都為50ns時(shí),波形如下:圖1.5 仿真波形-讀寫時(shí)鐘的周期都為50ns當(dāng)寫時(shí)鐘(wclk)周期為100ns,讀時(shí)鐘(rclk)周期為50ns時(shí),波形如下:圖1.6 仿真波形-讀/寫時(shí)鐘的周期都為50ns/100ns當(dāng)寫時(shí)鐘(wclk)周期為50ns,讀時(shí)鐘(rclk)周期為100ns時(shí),波形如下:圖1.6 仿真波形-讀/寫時(shí)鐘的周期都為100ns/
27、50ns仿真結(jié)果根據(jù)前面的3種仿真波形,可以看出所設(shè)計(jì)的FIFO,能滿足功能要求。1.6 用DC對(duì)FIFO進(jìn)行綜合編寫DC的啟動(dòng)文件#.synopsys_dc.setup for afifo#modified by He Zhongzhu#June 22nd, 2011set search_path ". $search_path lib rtl scripts mapped unmapped"set target_library "tt_1v20_25c.db" set link_library " * $target_library dw_
28、foundation.sldb"set symbol_library " smic13g.sdb "#set synthesis_library "dw_foundation.sldb standard.sldb"set cache_write /set cache_read $cache_write# specify directory for intermediate files from analyzedefine_design_lib DEFAULT -path ./analyzed# suppress Driving cell war
29、ningsuppress_message UID-401 DDB-24set verilogout_no_tri truedefine_name_rules BORG -allowed A-Za-z0-9_ -first_restricted "_" -last_restricted "_" -max_length 30set verilogout_no_tri true# specify variblesset dw_prefer_mc_inside trueset sh_enable_line_editing true編寫DC的約束文件#top.con for afifo#created by zzhe#June 22th, 2011reset_design#create_clock -period 5 -name vclk;#virtual clockcreate_clock -period 0.9 get_ports wclkcreate_clock -period 0.9 get_ports rclk#set_uncertain_delay -setup get_clocks vclk#set_clock_latency -source -max get_clocks vclk#set_clock_transi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- JAVA內(nèi)存管理試題及答案
- 咸陽(yáng)市禮泉縣2022年八年級(jí)《語(yǔ)文》上學(xué)期期末試題與參考答案
- 地下管網(wǎng)工程規(guī)劃設(shè)計(jì)方案(范文參考)
- 2025年同等學(xué)力申碩《工商管理》模擬試卷三
- 2025年監(jiān)理工程師《建設(shè)工程目標(biāo)控制-土木建筑工程》試題(網(wǎng)友回憶版)
- 加速提升2025年VFP考試試題及答案
- 操作系統(tǒng)對(duì)C語(yǔ)言影響試題及答案
- 軟件設(shè)計(jì)師考試相應(yīng)試題及答案
- C語(yǔ)言中的并行數(shù)據(jù)處理試題及答案
- 2025年遠(yuǎn)程工作環(huán)境下的測(cè)試題及答案
- 《倉(cāng)儲(chǔ)物流管理》課件:優(yōu)化倉(cāng)儲(chǔ)與物流效率
- 商場(chǎng)超市公司章程
- 1與食品經(jīng)營(yíng)相適應(yīng)的操作流程
- 農(nóng)險(xiǎn)理賠培訓(xùn)
- 制藥車間5S標(biāo)準(zhǔn)化管理
- 寫字樓租賃技巧培訓(xùn)
- T-CEEAS 003-2024 養(yǎng)老合規(guī)師職業(yè)技能評(píng)價(jià)標(biāo)準(zhǔn)
- 鋼筋混凝土蓄水池設(shè)計(jì)方案
- 2025年保密知識(shí)試題庫(kù)帶答案(考試直接用)
- 伊斯蘭教完整版本
- 【MOOC】大學(xué)物理-力學(xué)、電磁學(xué)-重慶大學(xué) 中國(guó)大學(xué)慕課MOOC答案
評(píng)論
0/150
提交評(píng)論