<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 一種節(jié)能型可升級(jí)異步FIFO的FPGA實(shí)現(xiàn)

          一種節(jié)能型可升級(jí)異步FIFO的FPGA實(shí)現(xiàn)

          作者: 時(shí)間:2014-11-25 來(lái)源:網(wǎng)絡(luò) 收藏

            2.1 空/滿信號(hào)的產(chǎn)生

          本文引用地址:http://www.ex-cimer.com/article/265945.htm

            在異步的設(shè)計(jì)中,空/滿信號(hào)的產(chǎn)生是其主要的難點(diǎn)。當(dāng)寫入數(shù)據(jù)時(shí),寫信號(hào)指針追上讀信號(hào)指針的情況,意味著滿的狀態(tài)。同理在讀出數(shù)據(jù)時(shí),讀地址指針追上寫地址指針的情況,意味著FIFO為空狀態(tài)。以上的分析可以得出,不能簡(jiǎn)單通過(guò)讀地址指針等于寫地址指針來(lái)判定FIFO的空/滿狀態(tài)。有效的解決方法在文獻(xiàn)[1]、文獻(xiàn)[2]中都被采用。若FIFO的深度為N,則其讀/寫地址指針的寬度應(yīng)為log2(N)位,讀/寫地址指針都增加一位,變?yōu)閘og2(N)+1位后,測(cè)試讀地址指針與寫地址指針,當(dāng)兩者相等時(shí),F(xiàn)IFO即為空狀態(tài)。而當(dāng)FIFO讀地址指針與寫地址指針的最高有效位不同而其他有效位完全相同時(shí),即為FIFO滿狀態(tài),這種循環(huán)的地址指針即是環(huán)型FIFO的由來(lái)。在本文的設(shè)計(jì)中,空/滿信號(hào)不僅用于指示FIFO的狀態(tài),還用于讀/寫時(shí)鐘的控制,從而達(dá)到節(jié)能的目地。

            2.2 讀控制模塊

            讀數(shù)據(jù)控制模塊主要功能是:根據(jù)數(shù)據(jù)的輸出及讀請(qǐng)求信號(hào)產(chǎn)生用于讀數(shù)據(jù)的控制信號(hào)、讀地址指針、FIFO空(empty)信號(hào)以及用于控制寫時(shí)鐘Wr_full信號(hào)(其具體功用在2.3中介紹)。當(dāng)外部有數(shù)據(jù)讀出請(qǐng)求(Rd_req有效)且FIFO不為空時(shí),使能FIFO的讀有效,F(xiàn)IFO輸出數(shù)據(jù),輸出數(shù)據(jù)完成后讀地址指針加1。其中空信號(hào)的產(chǎn)生采用2.1中的方法,其內(nèi)部實(shí)現(xiàn)的具體框圖如圖4所示。

            

           

            在圖4中,讀控制邏輯單元主要用于產(chǎn)生讀使能信號(hào),依據(jù)讀請(qǐng)求信號(hào)和FIFO的空(empty)信號(hào)產(chǎn)生讀使能。當(dāng)有讀請(qǐng)求并且FIFO不為空時(shí),讀使能有效,同時(shí)使地址指針加1。讀地址計(jì)數(shù)器即是一個(gè)二進(jìn)制的計(jì)數(shù)器,產(chǎn)生輸入雙口RAM的讀地址指針。由于讀地址指針要傳輸?shù)綄懣刂颇K,而兩模塊處于不同的時(shí)鐘域,為了使數(shù)據(jù)有效傳輸?shù)綄憰r(shí)鐘域,采用先將讀地址指針表示的二進(jìn)制數(shù)轉(zhuǎn)化為格雷碼(具體實(shí)現(xiàn)參見(jiàn)文獻(xiàn)[2])后再傳輸。

            2.2.1 同步模塊的實(shí)現(xiàn)

            由于實(shí)際應(yīng)用于系統(tǒng)中時(shí)鐘頻率較高,為了達(dá)到穩(wěn)定,選擇了流水線的同步器單元。在圖2的基礎(chǔ)上增加寄存器的位寬。為了使系統(tǒng)的穩(wěn)定性增強(qiáng),采用三級(jí)流水線的結(jié)構(gòu),當(dāng)然,也可以根據(jù)自己實(shí)際的需要而增減流水線級(jí)數(shù)。

            2.2.2 格雷碼二進(jìn)制碼轉(zhuǎn)化

            為了應(yīng)用環(huán)型指針區(qū)別FIFO的空/滿信號(hào),需要將傳輸過(guò)來(lái)用格雷碼表示的寫地址指針轉(zhuǎn)化為二進(jìn)制碼,格雷碼到二進(jìn)制碼轉(zhuǎn)化的公式如式(1)。設(shè)格雷碼表示的數(shù)據(jù)與二進(jìn)制碼有n位,格雷碼表示為:gn-1gn-2…g0,相應(yīng)二進(jìn)制碼表示為:bn-1bn-2…b0。轉(zhuǎn)化公式為:

            

           

            式(1)中所示的加代表無(wú)進(jìn)位的加法,實(shí)現(xiàn)中使用“異或門”即可。但是,完全按照式(1)來(lái)實(shí)現(xiàn)存在缺點(diǎn),從式(1)中可以看出,其為一個(gè)遞推式,最先計(jì)算出最高有效位bn-1,最后計(jì)算出b0,一次轉(zhuǎn)化完成需要經(jīng)過(guò)n-1個(gè)“異或門”的延時(shí),當(dāng)位數(shù)據(jù)位增加時(shí),這將成為系統(tǒng)的運(yùn)行瓶頸。在高速系統(tǒng)中表現(xiàn)的特別突出。提出一種改進(jìn)的轉(zhuǎn)化單元。將式(1)轉(zhuǎn)化為式(2),如下所示:

            

           

            可以看出,一次轉(zhuǎn)化只需要一個(gè)“異或門”的延時(shí)即可完成,但這種結(jié)構(gòu)不適合中實(shí)現(xiàn)。在基本的門電路中,當(dāng)門電路的扇入數(shù)據(jù)達(dá)到或者超過(guò)5時(shí),延時(shí)將變得很大,而且大的扇入門電路的實(shí)現(xiàn)變得不現(xiàn)實(shí)且相當(dāng)耗資源。將“異或門”的扇入數(shù)據(jù)限制在4以內(nèi)(包括4個(gè))。從“異或門”的規(guī)律中可以得出,任何變量與邏輯“0”異或,是其本身,而與“1”異或,是其相反變量。將待轉(zhuǎn)化的數(shù)據(jù)分為四位一組,第一組為(b3…b0),較高的位(如b7…b4)依此細(xì)分下去……最高的4位采用如式(2)中進(jìn)行轉(zhuǎn)化,較低的4位如(bn-4…bn-7)采用如圖5的方式轉(zhuǎn)化……這種方式的轉(zhuǎn)化器相對(duì)于式(1)實(shí)現(xiàn)來(lái)說(shuō),在不增加門電路資源消耗的基礎(chǔ)上,能明顯提高轉(zhuǎn)化速度。|

            

           

            2.2.3 相等判決單元

            相等判決單元是一個(gè)二進(jìn)制數(shù)比較器,當(dāng)且僅當(dāng)讀/寫地址指針完全相等時(shí),給出空信號(hào)有效,否則空信號(hào)無(wú)效。

            2.2.4 Rd_full信號(hào)產(chǎn)生單元

            Rd_full信號(hào)產(chǎn)生單元的結(jié)構(gòu)與FIFO滿(full)產(chǎn)生單元的結(jié)構(gòu)相同,Rd_full信號(hào)是full信號(hào)在讀時(shí)鐘域中的一個(gè)復(fù)制信號(hào),用于寫時(shí)鐘控制。在時(shí)鐘控制單元將詳細(xì)介紹其功能。

            2.3 寫控制模塊

            寫控制模塊的實(shí)現(xiàn)與讀模塊相似,由與讀模塊相應(yīng)的單元組成。只是FIFO滿(full)時(shí)的產(chǎn)生邏輯為當(dāng)讀地址指針與寫地址指針最高有效位不同,而其他位均完全相同時(shí),滿信號(hào)有效。另一不同點(diǎn)體現(xiàn)在Wr_empty信號(hào)的產(chǎn)生上,Wr_empty只是FIFO為空(empty)信號(hào)時(shí)在寫時(shí)鐘域中的一個(gè)復(fù)制信號(hào),用于讀時(shí)鐘的控制。

            2.4 讀時(shí)鐘控制模塊

            從以上的介紹中可以看出,各個(gè)模塊的工作統(tǒng)一由時(shí)鐘來(lái)管理,在高速的數(shù)字系統(tǒng)中,高速也將帶來(lái)高的能耗。筆者從實(shí)際工作中觀察發(fā)現(xiàn),F(xiàn)IFO的工作是需要調(diào)配的,只有在DSP需要數(shù)據(jù)時(shí),才需要FIFO處于工作狀態(tài),而在DSP兩次需求之間,大量的時(shí)間中FIFO是處于空閑狀態(tài)(這樣的情形也符合大多數(shù)的實(shí)際應(yīng)用)??梢猿浞掷眠@段空閑,讓FIFO既能在正常工作時(shí)高速而穩(wěn)定地工作,同時(shí)在空閑時(shí)能盡可能降低能耗。時(shí)鐘控制模塊即能達(dá)到此目的。在空閑時(shí),將FIFO的讀/寫時(shí)鐘停止,使空閑的模塊處于“休眠”狀態(tài)。但在正常工作時(shí),時(shí)鐘能照常管理各個(gè)模塊。采用Virtex-4芯片內(nèi)部自帶的時(shí)鐘管理模塊(Digital Clock Manager-DCM)[4]來(lái)實(shí)現(xiàn)。Virtex-4芯片中的DCM提供強(qiáng)大的時(shí)鐘管理功能,包括:時(shí)鐘去抖動(dòng)、頻率合成、移相及動(dòng)態(tài)時(shí)鐘配置。

            應(yīng)用中,主要利用其時(shí)鐘去抖動(dòng)和動(dòng)態(tài)時(shí)鐘配置兩項(xiàng)功能。在讀時(shí)鐘控制模塊中,當(dāng)檢測(cè)到FIFO為空且Wr_empty同時(shí)有效時(shí)(如同時(shí)為高電平),通過(guò)DCM即可暫停讀時(shí)鐘。此時(shí)FIFO模塊中的所有讀組件將會(huì)停止運(yùn)行。此時(shí)若寫入數(shù)據(jù),由于Wr_empty處在寫時(shí)鐘域中,寫時(shí)鐘的控制下,Wr_empty將不會(huì)有效(變?yōu)榈碗娖?,此時(shí)通過(guò)DCM喚醒讀時(shí)鐘,可以正常讀出數(shù)據(jù),同理可以控制寫時(shí)鐘的暫停與恢復(fù)。按照以上的原理設(shè)計(jì),用Xilinx ISE 10.1仿真后,得到的仿真波形如圖6。clk_in為輸入時(shí)鐘,clk_out為經(jīng)過(guò)控制的時(shí)鐘,而clk0_out是不經(jīng)過(guò)控制的輸出時(shí)鐘。從圖中可以看出,當(dāng)使能信號(hào)為有效(低電平)時(shí),clk_out沒(méi)有時(shí)鐘輸出,而當(dāng)使能信號(hào)無(wú)效時(shí),clk_out時(shí)鐘正?;謴?fù)??梢酝ㄟ^(guò)將Wr_empty與empty經(jīng)過(guò)“與非”后接到讀時(shí)鐘clk_en端即可。

            

           

            2.5 寫時(shí)鐘控制模塊

            寫時(shí)鐘控制模塊與讀時(shí)鐘控制模塊原理完全相同,只是輸入控制控制信號(hào)為Rd_full與full信號(hào)。

            2.6 雙口RAM

            雙口RAM的實(shí)現(xiàn)采用Xilinx的Virtex-4系列內(nèi)部現(xiàn)有的資源,通過(guò)利用Virtex-4系列芯片中豐富的Block RAM資源,利用原語(yǔ)例化即可生成適合于實(shí)際應(yīng)用需求的雙口RAM,參見(jiàn)文獻(xiàn)[4]。

            3 整體仿真結(jié)果

            本方案的實(shí)現(xiàn)在Xilinx的ISE10.1上綜合,仿真后得到如圖7所示整體仿真波形。仿真中,為了便于查看結(jié)果,將實(shí)際受到控制的讀/寫模塊的時(shí)鐘引出,分別標(biāo)記為o_wr_clk,o_rd_clk。由于截圖的限制,只能在圖中顯示FIFO滿的情況??盏那闆r類似。

            

          fpga相關(guān)文章:fpga是什么



          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: FIFO FPGA

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();