




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、異步FIFO的實(shí)現(xiàn)方式實(shí)驗(yàn)?zāi)康谋敬螌?shí)驗(yàn)介紹一種異步FIFO的實(shí)現(xiàn)方式。使用FIFO存儲(chǔ)器可以在兩個(gè)不同時(shí)鐘系統(tǒng)之間快速而方便的傳輸數(shù)據(jù)。另外,在網(wǎng)絡(luò)接口,圖像處理等方面異步FIFO存儲(chǔ)器也得到了廣泛的應(yīng)用。因此,異步FIFO存儲(chǔ)器具有較大的研究和應(yīng)用價(jià)值。異步FIFO的介紹和整體結(jié)構(gòu)異步FIFO(First In First Out)存儲(chǔ)器是指向FIFO緩沖器中寫(xiě)入數(shù)據(jù)的時(shí)鐘域和從FIFO緩沖器中讀取數(shù)據(jù)的時(shí)鐘域是不同的,這兩個(gè)時(shí)鐘之間沒(méi)有必然的因果關(guān)系。異步FIFO是一種先進(jìn)先出的電路,使用在異步時(shí)鐘域數(shù)據(jù)接口的部分,用來(lái)存儲(chǔ)、緩沖在兩個(gè)異步時(shí)鐘之間的數(shù)據(jù)傳輸。在異步電路中,由于時(shí)鐘之間周期
2、和相位完全獨(dú)立,所以數(shù)據(jù)的丟失概率不為零。如何設(shè)計(jì)一個(gè)高可靠性、高速的異步FIFO存儲(chǔ)器便成為一個(gè)難點(diǎn)。異步FIFO的一般結(jié)構(gòu)如圖1所示,都是由一個(gè)讀時(shí)鐘域電路、一個(gè)寫(xiě)時(shí)鐘域電路和一個(gè)雙端口的RAM來(lái)構(gòu)成的。異步FIFO與同步FIFO所做的工作是相同的,都是在寫(xiě)信號(hào)有效時(shí)寫(xiě)數(shù)據(jù)到RAM中,在讀信號(hào)有效時(shí)把數(shù)據(jù)從RAM中讀出,所以對(duì)于中間部分的RAM設(shè)計(jì)是比較簡(jiǎn)單的。另外,讀電路和寫(xiě)電路單獨(dú)實(shí)現(xiàn)起來(lái)也是比較容易的,只需要按照同步FIFO的工作情況,如果沒(méi)有寫(xiě)滿(mǎn)或讀空的狀態(tài)時(shí)每寫(xiě)一個(gè)數(shù)據(jù)就把寫(xiě)地址加1,每讀一個(gè)數(shù)據(jù)就把讀地址減1。設(shè)計(jì)難點(diǎn)在于兩個(gè)時(shí)鐘域的交疊部分:滿(mǎn)、空狀態(tài)的產(chǎn)生,這也是設(shè)計(jì)的重點(diǎn)
3、。圖1 異步FIFO結(jié)構(gòu)針對(duì)這個(gè)問(wèn)題,先從對(duì)亞穩(wěn)態(tài)的處理開(kāi)始介紹亞穩(wěn)態(tài)的處理一個(gè)觸發(fā)器進(jìn)入亞穩(wěn)態(tài)時(shí),既無(wú)法預(yù)測(cè)該單元的輸出電平,也無(wú)法預(yù)測(cè)何時(shí)輸出才能穩(wěn)定在某個(gè)正確的電平上。在這個(gè)穩(wěn)定期間,觸發(fā)器輸出一些中間級(jí)電平,或者可能處于振蕩狀態(tài)、并且這種無(wú)用的輸出電平可以沿信號(hào)通道上的各個(gè)觸發(fā)器級(jí)聯(lián)式傳播下去。亞穩(wěn)態(tài)發(fā)生的原因是由于在同步系統(tǒng)中,如果觸發(fā)器的建立時(shí)間或保持時(shí)間不滿(mǎn)足,就可能產(chǎn)生亞穩(wěn)態(tài),此時(shí)觸發(fā)器輸出端Q在亞穩(wěn)態(tài)是指觸發(fā)器無(wú)法在某個(gè)規(guī)定時(shí)間段內(nèi)達(dá)到一個(gè)可確認(rèn)的狀態(tài),邏輯誤判有可能通過(guò)電路的特殊設(shè)計(jì)減輕危害(如本設(shè)計(jì)中將使用的Gray碼計(jì)數(shù)器),而亞穩(wěn)態(tài)的傳播則擴(kuò)大了故障面,難以處理。在數(shù)
4、字集成電路中寄存器要滿(mǎn)足建立時(shí)間和保持時(shí)間。建立時(shí)間是在時(shí)鐘翻轉(zhuǎn)之前數(shù)據(jù)輸入必須有效的時(shí)間,保持時(shí)間是在時(shí)鐘沿之后數(shù)據(jù)輸出必須仍然有效的時(shí)間。當(dāng)一個(gè)信號(hào)被寄存器鎖存時(shí),如果信號(hào)和時(shí)鐘之間不滿(mǎn)足這個(gè)要求,Q的值是不確定的,并且在未知的時(shí)刻會(huì)固定到高電平或低電平。此時(shí)寄存器進(jìn)入了亞穩(wěn)態(tài)(Metastability)。解決這一問(wèn)題的最簡(jiǎn)單方法是使用同步器,使得在另一個(gè)時(shí)鐘域采樣時(shí)信號(hào)足夠穩(wěn)定。同步器的設(shè)計(jì)本身就是一個(gè)比較麻煩的問(wèn)題,本次設(shè)計(jì)中也不深入討論一些細(xì)節(jié)性的問(wèn)題,直接采用兩級(jí)采樣的同步器,避免了使用一級(jí)同步器仍可能出現(xiàn)亞穩(wěn)態(tài)的情況。每個(gè)這樣的同步器都具有一個(gè)等于時(shí)鐘周期的等待時(shí)間。這種同步器
5、可以把一些亞穩(wěn)態(tài)的值同步為確定值,但并不一定是正確值,同時(shí)有一些亞穩(wěn)態(tài)也還是無(wú)法穩(wěn)定成確切值的,這種情況稱(chēng)為同步出錯(cuò)。由于同步出錯(cuò)的隨機(jī)性,很難對(duì)它們進(jìn)行跟蹤。如果想進(jìn)一步降低亞穩(wěn)態(tài)出現(xiàn)的概率、可以再増加同步器的級(jí)數(shù),但是太多的同步器會(huì)使系統(tǒng)的性能下降,所以系統(tǒng)中不會(huì)用太多的同步器,一般使用兩個(gè)同步器已經(jīng)足夠??諠M(mǎn)狀態(tài)的判斷之所以在前面介紹了亞穩(wěn)態(tài)的問(wèn)題,是因?yàn)檫@是判斷滿(mǎn)狀態(tài)或空狀態(tài)無(wú)法回避的一個(gè)問(wèn)題。因?yàn)樽x電路在讀控制時(shí)維持一個(gè)地址指針,寫(xiě)電路在寫(xiě)控制時(shí)維持一個(gè)地址指針,簡(jiǎn)單來(lái)說(shuō),這兩個(gè)地址指針直接一比較,就能得到空滿(mǎn)的判斷結(jié)果,但是實(shí)際操作起來(lái)非常麻煩。例如對(duì)于滿(mǎn)狀態(tài)來(lái)說(shuō),這是寫(xiě)入電路所關(guān)
6、心的狀態(tài),因?yàn)闈M(mǎn)狀態(tài)下不能繼續(xù)寫(xiě)入數(shù)據(jù),但是空狀態(tài)對(duì)于寫(xiě)電路沒(méi)有影響。如果寫(xiě)入電路要判斷當(dāng)前FIFO是否為滿(mǎn),就需要把寫(xiě)電路自身維持的寫(xiě)指針和讀電路維持的讀指針做比較,這個(gè)讀指針就需要送入寫(xiě)電路中,此時(shí)就發(fā)生了穿過(guò)時(shí)鐘域的問(wèn)題,也就是說(shuō),讀指針要從讀時(shí)鐘域同步到寫(xiě)時(shí)鐘域,然后參與判斷,此時(shí)就需要前面介紹的同步器。同樣,對(duì)于空狀態(tài)來(lái)說(shuō),這是讀出電路所關(guān)心的狀態(tài),也是由讀電路來(lái)維持的,因?yàn)榭諣顟B(tài)下再讀數(shù)就會(huì)得到錯(cuò)誤的數(shù)據(jù),但是滿(mǎn)狀態(tài)下讀數(shù)是沒(méi)有影響的。如果讀電路要判斷當(dāng)前FIFO是否為空,就需要把寫(xiě)時(shí)鐘域中的寫(xiě)指針取到讀時(shí)鐘域來(lái),和讀時(shí)鐘域的讀指針進(jìn)行比較得出是否是空狀態(tài),同樣跨越了時(shí)鐘域。在跨時(shí)
7、鐘域系統(tǒng)中希望出現(xiàn)錯(cuò)誤的概率越低越好,此時(shí)格雷碼無(wú)疑是最好的一個(gè)選擇。格雷碼屬于可靠性編碼,是一種誤差最小化的編碼,它大大減少了由一個(gè)狀態(tài)到下一個(gè)狀態(tài)時(shí)電路混淆。由這種編碼相鄰的兩個(gè)碼組之間只有一位不同,和其他編碼同時(shí)改變2位和多位的情況相比更為可靠。表1所示是格雷碼與二進(jìn)制碼的對(duì)應(yīng)關(guān)系。 表1 格雷碼與二進(jìn)制碼轉(zhuǎn)換真值表由前面的介紹可知通過(guò)同步器之后信號(hào)穩(wěn)定的值可能是1也可能是0,可能與輸入的值相同也可能與輸入的值不同。如果對(duì)于二進(jìn)制碼,這顯然是災(zāi)難性的。例如從十進(jìn)制的7變到8,二進(jìn)制碼是從0111變?yōu)?000,把0111送入同步器之后,由于4位都要變化,所以4位都可能會(huì)出現(xiàn)亞穩(wěn)態(tài),從而在同
8、步器的輸出端就會(huì)出現(xiàn)各種可能性,這樣即使數(shù)據(jù)穩(wěn)定下來(lái),對(duì)整個(gè)電路的作用也很小。而如果采用格雷碼,是從0100變?yōu)?100,只是最高位發(fā)生了改變,也就只有這一位可能會(huì)出現(xiàn)亞穩(wěn)態(tài)的情況。這樣經(jīng)過(guò)同步器處理之后,輸出端可能得到的值只有兩種0100或1100,其中1100是正確的數(shù)值,如果得到這個(gè)輸出自然是最好,但即使是0100的輸出,也只是和原來(lái)的值相同,可以認(rèn)為沒(méi)有變化,這也不會(huì)對(duì)電路造成負(fù)面的影響。相比二進(jìn)制代碼那種變化后什么值都有可能的情況,格雷碼顯然是一種更易于接受的編碼方式。格雷碼雖然在跨時(shí)鐘域方面效果比較好,但在本身計(jì)數(shù)方面是不足的,也就是說(shuō)還需要把格雷碼轉(zhuǎn)換成二進(jìn)制碼來(lái)計(jì)數(shù),4位的格雷
9、碼轉(zhuǎn)二進(jìn)制碼的代碼部分如下:bin0=gray3gray2 gray1 gray0;bin1=gray3gray2 gray1;bin2=gray3gray2;bin2=gray3;也可以用for循環(huán)完成:module gray2(bin,gray);parameter size=4;output size-1:0 bin;input size-1:0 gray;reg size-1:0 bin;integer i;always (gray) for(i=0;i,size;i=i=i+1);bini=(gray>>1);endmodule計(jì)數(shù)之后還要變回格雷碼,轉(zhuǎn)換的方法與上述方式
10、類(lèi)似。這樣使用格雷碼作為指針就可以降低亞穩(wěn)態(tài)帶來(lái)的影響。接下來(lái)要解決的是空滿(mǎn)判斷的問(wèn)題,常用的判斷方法是附加位比較法。附加位比較法是給每個(gè)指針增加一個(gè)附加位,對(duì)于二進(jìn)制指針而言,將存儲(chǔ)空間的最后一個(gè)存儲(chǔ)單元寫(xiě)入數(shù)據(jù)后,地址將變?yōu)榱?,即地址指針低n-1位清零并向最高位(MSB)也就是附加位進(jìn)位。讀指針也是如此工作。如果兩個(gè)指針的最高位(MSBs)不同而其余位相同,就說(shuō)明寫(xiě)指針比讀指針多循環(huán)了一次,標(biāo)志FIFO存儲(chǔ)器處于滿(mǎn)狀態(tài)。如果包括最高位在內(nèi)的兩個(gè)指針完全相同,則說(shuō)明寫(xiě)指針和讀指針經(jīng)歷了相同次數(shù)的循環(huán),也就是說(shuō)FIFO存儲(chǔ)器處于空狀態(tài)。這樣讀指針和寫(xiě)指針就變成了一個(gè)n位指針,其中低n-1位是用
11、來(lái)存放FIFO存儲(chǔ)器的地址,可以用來(lái)對(duì)2n-1個(gè)存儲(chǔ)單元尋址,而最高位則用來(lái)辨別當(dāng)兩個(gè)指針的地址相等時(shí)是滿(mǎn)狀態(tài)還是空狀態(tài)。對(duì)二進(jìn)制指針來(lái)說(shuō),用這種方式來(lái)區(qū)分滿(mǎn)狀態(tài)與空狀態(tài)是可行的。但是,格雷碼指針卻不能直接使用這種方式,原因有兩個(gè)。舉個(gè)4位格雷碼的例子,格雷碼計(jì)數(shù)器的低3位用于存放存儲(chǔ)地址,第四位是附加位,這個(gè)FIFO存儲(chǔ)器的存儲(chǔ)容量為8。正確的操作應(yīng)當(dāng)是,當(dāng)寫(xiě)(或讀)完一個(gè)循環(huán)時(shí),地址應(yīng)該重新開(kāi)始計(jì)數(shù),附加位應(yīng)該翻轉(zhuǎn)。然而格雷碼指針卻并非如此,地址由7到8格雷碼由0-100到1-100),指針的附加位改變,但是地址位(低n-1位)卻沒(méi)有重新開(kāi)始計(jì)數(shù),這是由于格雷碼是一種鏡像碼造成的。第二個(gè)原
12、因是這種格雷碼不能直接產(chǎn)生滿(mǎn)狀態(tài)標(biāo)志。如果兩個(gè)格雷碼指針都是Gray-7,這時(shí)的FIFO存儲(chǔ)器為空狀態(tài),在進(jìn)行一次寫(xiě)操作后寫(xiě)指針將加1,格雷碼第4位將變?yōu)?而低3位不變,這時(shí)的讀指針和寫(xiě)指針的最高位將不同而低位相同。如果這樣的話,F(xiàn)IFO存儲(chǔ)器滿(mǎn)標(biāo)志將置位,這顯然是錯(cuò)誤的,因而需要對(duì)這個(gè)4位的格雷碼進(jìn)行修改。想要的結(jié)果是:一個(gè)n位的(即包括附加位)格雷碼計(jì)數(shù)器用在異步時(shí)鐘域間傳遞數(shù)據(jù),但是又希望它的低n-1位計(jì)數(shù)器也是格雷碼類(lèi)型的。這樣低n-1位就能單獨(dú)形成一個(gè)循環(huán),而不是一種反射碼。所以,此時(shí)需要的是一個(gè)既能產(chǎn)生n位的格雷碼序列又能產(chǎn)生n-1位的格雷碼序列的計(jì)數(shù)器。分別實(shí)現(xiàn)一個(gè)n位的格雷碼計(jì)
13、數(shù)器和一個(gè)n-1位的格雷碼計(jì)數(shù)器自是非常簡(jiǎn)單:用一個(gè)計(jì)數(shù)器來(lái)實(shí)現(xiàn)一個(gè)n位的格雷碼計(jì)數(shù)器,并將這個(gè)計(jì)數(shù)器的次高位進(jìn)行修改而低位保持不變以實(shí)現(xiàn)一個(gè)n-1位的格雷碼計(jì)數(shù)器,這也不是一件很難的事情。這種既能產(chǎn)生n位格雷碼又能產(chǎn)生n-1位格雷碼的計(jì)數(shù)器被稱(chēng)為"兩重格雷碼計(jì)數(shù)器。下面以3位和4位格雷碼來(lái)說(shuō)明空滿(mǎn)狀態(tài)的判斷標(biāo)準(zhǔn)。3位格雷碼表示的就是地址空間,可以有8個(gè)存儲(chǔ)空間。由于寫(xiě)入和讀出并不是按照從000開(kāi)始的,而是可以以任意一個(gè)位置開(kāi)始,比如存放數(shù)據(jù)可以按照十進(jìn)制地址5、6、7、0、1、2、3、4的地址順序來(lái)存放,讀出數(shù)據(jù)也同理,這樣為了表示循環(huán),就增加了1位變?yōu)?位格雷碼。首先說(shuō)明空狀態(tài)的
14、判斷標(biāo)準(zhǔn),空狀態(tài)表示讀指針和寫(xiě)指針重合,此時(shí)無(wú)論是看3位格雷碼還是4位格雷碼都應(yīng)該是完全相同,比如寫(xiě)指針指向1010,讀指針也必然指向1010,這樣判斷空狀態(tài)就只需要判斷兩個(gè)指針是否相同,相同時(shí)即為空,不同時(shí)即為不空。然后解釋滿(mǎn)狀態(tài)的判斷標(biāo)準(zhǔn)。滿(mǎn)狀態(tài)判斷比較復(fù)雜。假設(shè)一次寫(xiě)入數(shù)據(jù)是從十進(jìn)制地址6開(kāi)始,連續(xù)寫(xiě)入8個(gè)數(shù)據(jù)。到14,這時(shí)存滿(mǎn)8個(gè)數(shù)據(jù),應(yīng)產(chǎn)生滿(mǎn)狀態(tài)輸出,這兩個(gè)地址形式如下:十進(jìn)制地址6二進(jìn)制地址0110格雷碼地址0101十進(jìn)制地址14二進(jìn)制地址1110格雷碼地址1001如果是二進(jìn)制地址,判斷的方法已經(jīng)介紹過(guò)了。而格雷碼地址的前兩位是不同的,但后面的兩位是相同的。如果擴(kuò)展成更多位的格雷碼
15、,滿(mǎn)狀態(tài)下依然是這種情況,即前兩位不同,后面位均相同。這樣判斷滿(mǎn)狀態(tài)首先要保證除去前兩位之后的剩余部分是相同的。然后對(duì)于本例來(lái)說(shuō),需要保證前兩部分是01和10,如果地址是以01開(kāi)頭,則滿(mǎn)時(shí)一定是10;如果以10開(kāi)頭,滿(mǎn)時(shí)一定是01。判斷的方法可以有很多種,這里采用先取前兩位的異或值,保證相等,此時(shí)只可能是0,1的組合,然后再判斷首位不同,這樣就只能是01和10這兩種情況。經(jīng)過(guò)這三個(gè)條件的判斷,就能就保證此時(shí)為寫(xiě)滿(mǎn)狀態(tài)。再觀察地址以00和11開(kāi)頭的情況,給出地址如下十進(jìn)制地址2二進(jìn)制地址0010格雷碼地址0011十進(jìn)制地址10二進(jìn)制地址1010格雷碼地址1111剛才提出的的三個(gè)條件依然保證寫(xiě)滿(mǎn)狀
16、態(tài)的正常輸出,所以寫(xiě)滿(mǎn)狀態(tài)就以這三個(gè)條件作判斷標(biāo)準(zhǔn)。下面開(kāi)始具體設(shè)計(jì):頂層模塊的端口和功能針對(duì)異步FIFO的基本結(jié)構(gòu)和功能,以及保留一些必要的狀態(tài)信號(hào)和控制信號(hào),現(xiàn)確定頂層模塊的端口與功能見(jiàn)表2:端口名稱(chēng)功能說(shuō)明rclk輸入信號(hào),1位,讀時(shí)鐘wlck輸入信號(hào),1位,寫(xiě)時(shí)鐘rinc輸入信號(hào),1位,讀使能信號(hào),高電平時(shí)生效,表示寫(xiě)入數(shù)據(jù)winc輸入信號(hào),1位,寫(xiě)使能信號(hào),高電平時(shí)生效,表示讀出數(shù)據(jù)rrst_n輸入信號(hào),1位,低電平時(shí)讀指針清零wrst_n輸入信號(hào),1位,低電平時(shí)寫(xiě)指針清零Rdata輸出信號(hào),8位,從RAM中讀出數(shù)據(jù)Wdata輸入信號(hào),8位,待寫(xiě)入RAM數(shù)據(jù)Wfull輸出信號(hào),1位,
17、高電平時(shí)表示FIFO已存滿(mǎn)數(shù)據(jù),已滿(mǎn)Rempty輸出信號(hào),1位,高電平時(shí)表示FIFO中數(shù)據(jù)已全部讀出,已空表2 頂層模塊的端口與功能子模塊設(shè)計(jì)本設(shè)計(jì)的異步FIFO劃分為5個(gè)子模塊:讀指針控制模塊、寫(xiě)指針控制模塊、存儲(chǔ)RAW模塊、讀指針同步到寫(xiě)時(shí)鐘域模塊,寫(xiě)指針同步到讀時(shí)鐘域模塊。依次介紹如下:兩個(gè)同步模塊這兩個(gè)同步模塊同前文介紹的一樣,是兩個(gè)寄存器連接的一起。寫(xiě)指針同步到讀時(shí)鐘域模塊代碼如下module syne_w2r(rwptr2,wptr,rclk,rrst_n);parameter ADDRSIZE=4;output ADDRSIZE:0 rwptr2; /同步后的寫(xiě)指針input A
18、DDRSIZE:0 wptr; /同步前的寫(xiě)指針input rclk,rrst_n;reg ADDRSIZE:0 rwptr2,rwptr1; /兩個(gè)中間寄存器always (posedge rclk or negedge rrst_n)if(!rrst_n) rwptr2,rwptr1<=0; /復(fù)位else rwptr2,rwptr1<=rwptr1,wptr; /寄存器串聯(lián) Endmodule讀指針同步到寫(xiě)時(shí)鐘域模塊代碼如下:module sync_r2w(wrptr2,rptr,wclk,wrst_n);parameter ADDRSIZE=4; output ADDRSI
19、ZE:0 wrptr2;input ADDRSIZE:0 rptr;input wclk, wrst_n;reg ADDRSIZE:0 wrptr2, wrptrl;always (posedge wclk or negedge wrst_n)if (!wrst_n) wrptr2, wrptrl<=0;else wrptr2,wrptrl<= wrptrl,rptr; endmodule功能比較簡(jiǎn)單,故不做仿真驗(yàn)證存儲(chǔ)模塊module fifomem(rdata, wdata, waddr,raddr, wclken, wclk,rclken,rclk);parameter DA
20、TASIZE=8; / 數(shù)據(jù)寬度parameter ADDRSIZE=4; / 地址寬度output DATASIZE-1:0 rdata; input DATASIZE-1:0 wdata;input wclken, wclk,rclken,rclk; /讀寫(xiě)控制和時(shí)鐘input ADDRSIZE-1:0 raddr, waddr; /輸入讀寫(xiě)地址reg DATASIZE-1:0 rdata; reg DATASIZE-1:0 MEM 0:(1<<ADDRSIZE)-1; /存儲(chǔ)體always (posedge rclk) /讀時(shí)鐘讀出數(shù)據(jù)if (rclken) rdata =
21、MEMraddr; always (posedge wclk)if (wclken) MEMwaddr <= wdata; /寫(xiě)時(shí)鐘寫(xiě)入數(shù)據(jù)endmodule此模塊構(gòu)造了一個(gè)存儲(chǔ)器,按讀寫(xiě)始終安排輸入和輸出。編寫(xiě)測(cè)試模塊如下:module tbmem;parameter DATASIZE=8; parameter ADDRSIZE=4; wire DATASIZE-1:0 rdata;reg DATASIZE-1:0 wdata;reg wclken, wclk,rclken,rclk;reg ADDRSIZE-1:0 raddr, waddr;integer seed1;initial
22、begin wclk=0;rclk=0;seed1=20; /初始化 waddr=0;raddr=0;endalways #9 wclk=wclk; /生成寫(xiě)時(shí)鐘always #11 rclk=rclk; /生成讀時(shí)鐘always (posedge wclk)wdata<=$random(seed1)/256; /產(chǎn)生隨機(jī)寫(xiě)入數(shù)據(jù)initialbegin wclken=1;rclken=0; repeat (10) (posedge wclk); /寫(xiě)入10個(gè)數(shù)據(jù) wclken=0;rclken=1; repeat (6) (posedge rclk); /讀出6個(gè)數(shù)據(jù) wclken=1
23、;rclken=1; #99 $stop;end always (posedge wclk)if(wclken=1) waddr=waddr+1; /寫(xiě)地址生成always (posedge rclk)if(rclken=1) raddr=raddr+1; /讀地址生成fifomem fifomem(rdata, wdata, waddr,raddr, wclken, wclk,rclken,rclk);endmodule仿真波形如圖2所示圖2 存儲(chǔ)仿真波形第一行為讀出數(shù)據(jù),第二行為寫(xiě)入數(shù)據(jù),圖中第一行和第二行數(shù)據(jù)是完全對(duì)應(yīng)的。讀地址控制模塊FIFO存儲(chǔ)器空狀態(tài)是在讀時(shí)鐘域中生成的,這樣就可以
24、確保一旦FIFO存儲(chǔ)器達(dá)到空狀態(tài)時(shí)就能被檢測(cè)到。也就是說(shuō),在讀時(shí)鐘域里讀指針可以在讀時(shí)鐘周期內(nèi)與同步而來(lái)的寫(xiě)指針(包括附加的最高位MSB)進(jìn)行比較。當(dāng)讀指針與同步的寫(xiě)指針rwptr2相等時(shí),F(xiàn)IFO存儲(chǔ)器為空狀態(tài),此時(shí)FIFO存儲(chǔ)器停止讀取數(shù)據(jù),否則會(huì)導(dǎo)致向下溢出(underflow)。比較讀指針和同步的寫(xiě)指針以生成空標(biāo)志的比較器很容易實(shí)現(xiàn)。FIFO存儲(chǔ)器的指針總是預(yù)先指向下一個(gè)內(nèi)存位置,每進(jìn)行一次讀寫(xiě)操作,相應(yīng)的指針就增加一次。如果讀指針與同步的寫(xiě)指針rwptr2的附加位(這兩個(gè)指針的最高位MSBs)是相等的,則這兩個(gè)指針經(jīng)歷了相同的循環(huán)次數(shù),假如這時(shí)兩個(gè)指針的低位(共n-1位)也相等,F(xiàn)I
25、FO存儲(chǔ)器就為空狀態(tài)。在這個(gè)模塊中包含了除讀同步模塊之外的所有讀時(shí)鐘域的邏輯電路。讀指針是"兩重格雷碼計(jì)數(shù)器”。位指針rptr被同步到寫(xiě)時(shí)鐘域中,n-1位指針用于產(chǎn)生地址。當(dāng)讀指針rptr的下一個(gè)狀態(tài)rgnext等于同步的寫(xiě)指針rwptr2時(shí),空狀態(tài)標(biāo)志將在下一個(gè)讀時(shí)鐘的上升沿被置位。這個(gè)模塊已經(jīng)是一個(gè)讀時(shí)鐘域的同步時(shí)序電路,這有利于進(jìn)行靜態(tài)時(shí)序分析。模塊包含讀指針電路和空標(biāo)志邏輯電路,代碼如下:module rptr_empty(rempty,raddr,rptr,rwptr2,rinc,rclk,rrst_n);parameter ADDRSIZE=4;output rempty
26、;output ADDRSIZE-1:0 raddr;output ADDRSIZE:0 rptr;input ADDRSIZE:0 rwptr2;input rinc, rclk,rrst_n;reg ADDRSIZE:0 rptr,rbin,rgnext,rbnext;reg rempty,raddrmsb; always (posedge rclk or negedge rrst_n)if(!rrst_n) begin rptr <=0; raddrmsb<=0; endelse begin rptr <=rgnext; raddrmsb <=rgnextADDR
27、SIZErgnextADDRSIZE-1; endalways (rptr or rinc)begin:Gray_inc integer i; for(i=0;i<=ADDRSIZE;i=i+1) rbini=(rptr>>i); /格雷碼轉(zhuǎn)換為二進(jìn)制碼 if(!rempty) rbnext=rbin+rinc; /增加FIFO計(jì)數(shù) else rbnext=rbin; rgnext = (rbnext>>1)rbnext; /二進(jìn)制轉(zhuǎn)化為格雷碼end always (posedge rclk or negedge rrst_n)if(!rrst_n) rempty
28、<=1'b1; /復(fù)位時(shí)輸出空else rempty<=(rgnext=rwptr2); /否則判斷是否滿(mǎn)足條件 assign raddr = raddrmsb,rptrADDRSIZE-2:0; /讀地址指針endmodule讀地址控制模塊主要的部分按代碼順序有復(fù)位部分,完成復(fù)位功能計(jì)數(shù)部分,完成格雷碼轉(zhuǎn)二進(jìn)制計(jì)數(shù)再轉(zhuǎn)換成格雷碼;空狀態(tài)判斷部分,復(fù)位時(shí)輸出空,讀指針和同步后的寫(xiě)指針相同時(shí)出示空狀態(tài);最后是一個(gè)讀地址的拼接輸出。為此模塊編寫(xiě)測(cè)試模塊,代碼如下:module tbrptr;parameter ADDRSIZE=4;wire rempty;wire ADDRSI
29、ZE-1:0 raddr;wire ADDRSIZE:0 rptr;reg ADDRSIZE:0 rwptr2;reg rinc, rclk,rrst_n;initialbegin rclk=0;rrst_n=1;rinc=0; rwptr2=14; #3 rrst_n=0; #4 rrst_n=1; #6 rinc=1; endalways #11 rclk=rclk;initialbegin repeat (5) (posedge rclk); (posedge rempty); #20 $stop;end rptr_empty rptr_empty(rempty,raddr,rptr,r
30、wptr2,rinc,rclk,rrst_n);endmodule仿真波形如圖3所示圖3 讀地址控制模塊波形中第一行是空狀態(tài),一開(kāi)始復(fù)位一次,計(jì)數(shù)到0110時(shí)與預(yù)置的寫(xiě)指針相同,空狀態(tài)重新變?yōu)楦唠娖?。此模塊可正常完成地址計(jì)數(shù)和空狀態(tài)的生成,功能驗(yàn)證結(jié)果正確。寫(xiě)指針控制模塊與讀指針控制模塊代碼基本相同。此模塊僅在滿(mǎn)狀態(tài)判斷部分不相同。代碼如下:module wptr_full(wfull,waddr,wptr,wrptr2,winc,wclk,wrst_n);parameter ADDRSIZE = 4; output wfull;output ADDRSIZE-1:0 waddr;output
31、 ADDRSIZE:0 wptr;input ADDRSIZE:0 wrptr2;input winc, wclk, wrst_n;reg ADDRSIZE:0 wptr, wbin, wgnext, wbnext;reg wfull, waddrmsb;wire w_2ndmsb,wr_2ndmsb; /添加的判斷信號(hào)always (posedge wclk or negedge wrst_n)if (!wrst_n) begin wptr <= 0; waddrmsb <= 0; endelse begin wptr <=wgnext; waddrmsb <=wgn
32、extADDRSIZEwgnextADDRSIZE-1; endalways (wptr or winc) begin: Gray_inc integer i; for(i=0; i<=ADDRSIZE; i=i+1) wbini= (wptr>>i); /格雷碼轉(zhuǎn)二進(jìn)制 if (!wfull) wbnext = wbin+winc; /FIFO計(jì)數(shù) else wbnext = wbin; wgnext=(wbnext>>1) wbnext; /二進(jìn)制轉(zhuǎn)格雷碼endassign w_2ndmsb = wgnextADDRSIZE wgnextADDRSIZE-1;
33、 /寫(xiě)指針前兩位異或assign wr_2ndmsb = wrptr2ADDRSIZE wrptr2ADDRSIZE-1; /同步后的讀指針前兩位異或always (posedge wclk or negedge wrst_n)if (!wrst_n) wfull<=0;else wfull <= (wgnextADDRSIZE !=wrptr2ADDRSIZE)&&(w_2ndmsb= wr_2ndmsb) && (wgnextADDRSIZE-2:0= wrptr2ADDRSIZE-2:0); /三個(gè)判斷條件均滿(mǎn)足則滿(mǎn)assign waddr=
34、waddrmsb,wptrADDRSIZE-2:0; endmodule由于功能基本相似,此模塊不再列出仿真整體仿真結(jié)果將五個(gè)子模塊合成一個(gè)頂層模塊,代碼如下:module fifo_asyn1(rdata,wfull,rempty,wdata,winc,wclk,wrst_n,rinc,rclk,rrst_n);parameter DSIZE = 8; /數(shù)據(jù)存儲(chǔ)寬度parameter ASIZE = 4; /存儲(chǔ)地址寬度output 7:0 rdata;output wfull;output rempty;input 7:0 wdata;input winc,wclk,wrst_n;inp
35、ut rinc,rclk,rrst_n;wire 3:0 waddr,raddr;wire 4:0 wptr,rptr,wrptr2,rwptr2;sync_r2w sync_r2w(.wrptr2(wrptr2),.rptr(rptr),.wclk(wclk),.wrst_n(wrst_n);syne_w2r syne_w2r(.rwptr2(rwptr2),.wptr(wptr),.rclk(rclk),.rrst_n(rrst_n);fifomem #(DSIZE,ASIZE) fifomem(.rdata(rdata),.wdata(wdata),.waddr(waddr),.raddr(raddr), .wclken(winc),.wclk(wclk),.rclken(rinc),.rclk(rclk); rptr_empty #(ASIZE) rptr_empty(.rempty(rempty),.raddr(raddr),.rptr(rptr),.rwptr2(rwp
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄉(xiāng)鎮(zhèn)公務(wù)員面試題及答案
- 物流招商試題及答案
- 湖南省岳陽(yáng)市岳陽(yáng)縣第一中學(xué)2024-2025學(xué)年高一下學(xué)期5月期中考試數(shù)學(xué)試卷(含答案)
- 安徽省蚌埠市2025屆九年級(jí)下學(xué)期中考三模數(shù)學(xué)試卷(含詳解)
- 2025年湖北省黃石市下陸區(qū)部分學(xué)校中考第三次模擬考試生物試題 (含答案)
- 2025項(xiàng)目合作合同書(shū)范本
- 2025年處理工程合同爭(zhēng)議
- 2025微型鋼材交易合同協(xié)議書(shū)
- 2025年中國(guó)私密零售行業(yè)市場(chǎng)前景預(yù)測(cè)及投資價(jià)值評(píng)估分析報(bào)告
- 2025年中國(guó)手持式電動(dòng)攪拌器行業(yè)市場(chǎng)前景預(yù)測(cè)及投資價(jià)值評(píng)估分析報(bào)告
- 出境旅游會(huì)務(wù)合同范本
- 第二講 堅(jiān)持和發(fā)展中國(guó)特色社會(huì)主義的總?cè)蝿?wù)PPT習(xí)概論2023優(yōu)化版教學(xué)課件
- 危險(xiǎn)化學(xué)品品名及編號(hào)規(guī)則
- 子長(zhǎng)市2022年農(nóng)業(yè)面源污染治理項(xiàng)目社會(huì)穩(wěn)定風(fēng)險(xiǎn)評(píng)估報(bào)告
- 重慶.住宅物業(yè)單位服務(wù)等級(jí)標(biāo)準(zhǔn)
- 爆破工程安全前提驗(yàn)收記錄表張
- 淅川縣石槽溝-打磨溝釩礦礦產(chǎn)資源開(kāi)采與生態(tài)修復(fù)方案
- 電磁場(chǎng)與電磁波電磁波的輻射
- 四羊方尊專(zhuān)題知識(shí)
- 《神經(jīng)內(nèi)分泌腫瘤》
- 基于單片機(jī)的倒車(chē)?yán)走_(dá)設(shè)計(jì)畢業(yè)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論