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

          新聞中心

          EEPW首頁 > EDA/PCB > 設(shè)計應(yīng)用 > FPGA中軟FIFO設(shè)計和實現(xiàn)

          FPGA中軟FIFO設(shè)計和實現(xiàn)

          作者: 時間:2008-04-28 來源:網(wǎng)絡(luò) 收藏
          摘要:在現(xiàn)代電路設(shè)計中,一個系統(tǒng)往往包含了多個時鐘,如何在異步時鐘間傳遞數(shù)據(jù)成為一個很重要的問題,而使用異步可以有效地解決這個問題。異步是一種在電子系統(tǒng)中得到廣泛應(yīng)用的器件,文中介紹了一種基于的異步設(shè)計方法。使用這種方法可以設(shè)計出高速、高可靠的異步FIFO。
          關(guān)鍵詞:FIFO;

          0引言

          在現(xiàn)場可編程邏輯芯片的設(shè)計過程中不同模塊之間的數(shù)據(jù)接口尤其是不同時鐘系統(tǒng)的各個模塊之間的數(shù)據(jù)接口是系統(tǒng)設(shè)計的一個關(guān)鍵用異步FIFO模塊來實現(xiàn)接口,接口雙方都在自己時鐘的同步下進行工作它們之間不需要互相握手只需要跟接口FIFO模塊進行交互即可即向接口FIFO模塊中寫入數(shù)據(jù)或從FIFO模塊中讀出數(shù)據(jù)。用這樣一個緩沖FIFO模塊實現(xiàn)內(nèi)部不同時鐘系統(tǒng)之間的數(shù)據(jù)接口使設(shè)計變得非常簡單和容易所用的FIFO接口是XILINX公司提供的IP核。經(jīng)過充分測試和優(yōu)化,系統(tǒng)運行穩(wěn)定占用的FPGA內(nèi)部資源也非常少。

          1 FIFO 類型

          FIFO先進先出隊列是一種在電子系統(tǒng)得到廣泛應(yīng)用的器件通常用于數(shù)據(jù)的緩存和用于容納異步信號的頻率或相位的差異FIFO的實現(xiàn)通常是利用雙口RAM 和讀寫地址產(chǎn)生模塊來實現(xiàn)的圖1顯示出了FIFO 的內(nèi)部結(jié)構(gòu)。

          圖1 FIFO內(nèi)部結(jié)構(gòu)圖

          FIFO的功能框圖如圖2 所示

          圖2 FIFO功能框圖

          根據(jù)讀寫操作的同步/異步標(biāo)志方案的同步/異步第一個寫操作以及復(fù)位功能的不同F(xiàn)IFO 存儲器可分為4 大類:

          (1)異步FIFO。 通常只有兩個控制信號讀使能( RE )與寫使能( WE)信號標(biāo)志信號有全空標(biāo)志(EF)全滿標(biāo)志(FF) 可選半滿標(biāo)志(HF)幾乎全滿標(biāo)志(AF) 幾乎全空標(biāo)志(AE)這些標(biāo)志并不與任何時鐘或事件同步但是反映讀寫指針的即時對照。

          (2)選通式FIFO。與異步FIFO存儲器相似選通FIFO通常使用讀寫選通UNCK和LDCK信號以及輸出使能OE信號這類FIFO 通常提供半滿標(biāo)志(HF)可選幾乎滿標(biāo)志(AF)幾乎空標(biāo)志(AE)全空標(biāo)志(EF)和全滿標(biāo)志(FF)這些標(biāo)志雖然反映讀寫指針但不與任何時鐘或事件同步。

          (3)標(biāo)準(zhǔn)同步FIFO。同步FIFO需要自由運行的讀和寫時鐘RCLK 和WCLK 讀寫操作是與這些時鐘同步的控制信號包括讀使能信號FEN 寫使能信號WEN和輸出使能信號OE 標(biāo)志方案使用全空標(biāo)志全滿標(biāo)志和半滿標(biāo)志時序上不是FWFT 的因此寫入FIFO 的第一個字先停留在一個在存儲單元中。

          (4)FWFT 同步FIFO。FWFT First Word Fall Through FIFO與標(biāo)準(zhǔn)FIFO相似它需要自由運行的讀時鐘和寫時鐘RCLK和WCLK讀寫操作與這些時鐘同步控制信號包括讀使能REN寫使能WEN以及輸出使能信號OE內(nèi)部結(jié)構(gòu)是首字直接通過First Word Fall Through 的即是寫入FIFO 的第一個數(shù)據(jù)單元直接進入輸出緩沖區(qū)而不是停在存儲器單元其標(biāo)志方案是FWFT結(jié)構(gòu)的直接結(jié)果也與標(biāo)準(zhǔn)同步FIFO不同。FWFT FIFO 存儲器使用輸出預(yù)備OR和輸入預(yù)備IR標(biāo)志而不使用全空標(biāo)志和全滿標(biāo)志。FWFT FIFO 也使用半空標(biāo)志,也可選幾乎全空標(biāo)志和全滿標(biāo)志。

          2 FPGA內(nèi)部FIFO的設(shè)計

          FPGA中有幾個大容量的RAM,本文以XILINX公司Spartan-ⅡE系列芯片為設(shè)計芯片。在Spartan-ⅡE系列芯片中包含兩列Block RAM,并且沿垂直邊擺放。如圖3所示

          圖3 雙口 RAM

          不同的Spartan-ⅡE系列芯片的所包含的Block RAM個數(shù)和位數(shù)如表1所示:

          表1. Spartan-ⅡE BRAM

          Spartan-ⅡE系列

          個數(shù)

          位數(shù)

          XC2S50E

          8

          32/K位

          XC2S100E

          10

          40/K位

          XC2S150E

          12

          48/K位

          XC2S200E

          14

          56/K位

          XC2S300E

          16

          64/K位

          XC2S400E

          40

          160/K位

          XC2S600E

          72

          288/K位

          FPGA 中的FIFO由三部分構(gòu)成:寫地址產(chǎn)生模塊、雙口RAM和讀地址產(chǎn)生模塊。如圖4所示

          圖4.FIFO結(jié)構(gòu)圖

          由圖4可以看出,寫地址產(chǎn)生模塊根據(jù)寫時鐘和寫有效信號產(chǎn)生遞增的寫地址,讀地址產(chǎn)生模塊根據(jù)讀時鐘和讀有效信號產(chǎn)生遞增的讀地址。FIFO的操作如下:在寫時鐘wr_clk的升沿,當(dāng)wren有效時,將wr_data寫入雙口RAM中寫地址對應(yīng)的位置中;始終將讀地址對應(yīng)的雙口RAM中的數(shù)據(jù)輸出到讀數(shù)據(jù)總線上。這樣就實現(xiàn)了先進先出的功能。寫地址產(chǎn)生模塊還根據(jù)讀地址和寫地址關(guān)系產(chǎn)生FIFO的滿標(biāo)志。當(dāng)wren有效時,若寫地址+2=讀地址時,full為1;當(dāng)wren無效時,若寫地址+ 1=讀地址時,full為1。讀地址產(chǎn)生模塊還根據(jù)讀地址和寫地址的差產(chǎn)生FIFO的空標(biāo)志。當(dāng)rden有效時,若寫地址-1=讀地址時,empty為 1;當(dāng)rden無效時,若寫地址=讀地址時,empty為1。按照以上方式產(chǎn)生標(biāo)志信號是為了提前一個時鐘周期產(chǎn)生對應(yīng)的標(biāo)志信號。

          3 FPGA內(nèi)部軟FIFO的仿真

          現(xiàn)場可編程門陣列FPGA是在專用ASIC 的基礎(chǔ)上發(fā)展出來的,它克服了專用ASIC不夠靈活的缺點。與其它中小規(guī)模集成電路相比,它有很強的靈活性,即其內(nèi)部的具體邏輯功能可以根據(jù)需要配置,對電路的修改和維護很方便目前FPGA的容量已經(jīng)跨過了百萬門級使得FPGA 成為解決系統(tǒng)級設(shè)計的重要選擇方案之一?,F(xiàn)在FPGA 已經(jīng)成為多種數(shù)據(jù)采集系統(tǒng)應(yīng)用的強有力的解決方案。由于可編程方案的靈活性,數(shù)據(jù)采集系統(tǒng)設(shè)計可以適應(yīng)日益變化的標(biāo)準(zhǔn)協(xié)議和性能需求,F(xiàn)PGA具有集成優(yōu)勢和更低的系統(tǒng)成本。

          甚高速集成電路硬件描述語言VHDL 廣泛用于描述數(shù)字系統(tǒng)的結(jié)構(gòu)、行為、功能和接口。它的語言形式和描述風(fēng)格與句法是十分類似于一般的計算機高級語言。

          本文利用XILINX 公司Spartan-ⅡE 系列的FPGA器件現(xiàn)場用VHDL編程實現(xiàn)了軟FIFO設(shè)計。在Quartus II 4.0 環(huán)境中仿真,得到了很不錯的效果。部分程序和仿真結(jié)果分別如以下程序和圖5所示。

          部分VHDL 程序

          FIFO1TO2:FIFO32TO32 PORT MAP

          ( wrclk=>FIFO1TO2WE,

          rdreq=>FIFO1TO2RREQ,

          rdclk=>FIFO1TO2RE,

          wrreq=>FIFO1TO2WREQ,

          data=>FIFO1TO2DATAIN,

          rdempty=>FIFO1TO2EMPTY,

          wrfull=>FIFO1TO2FULL,

          q=>FIFO1TO2DATAOUT);

          ------------------------------PROCESS_FIFO_DSP1_TO_DSP2FIFO1TO2WRITE:PROCESS(FIFO1TO2WE)

          BEGIN

          IF (FIFO1TO2WREQ='1' AND FIFO1TO3FULL='0')

          THEN

          FIFO1TO2DATAIN=DSP1DATA;

          END IF;

          END PROCESS FIFO1TO2WRITE;

          FIFO1TO2READ:PROCESS(FIFO1TO2RE)

          BEGIN

          IF (FIFO1TO2RREQ='1' AND FIFO1TO2EMPTY='0')

          THEN

          DSP2DATA=FIFO1TO2DATAOUT;

          ELSE

          DSP2DATA="ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";

          END IF;

          END PROCESS FIFO1TO2READ;

          圖5 部分防真結(jié)果

          4 結(jié)論

          文中針對異步FIFO設(shè)計中的難點和要點,提出了具體的解決方案,并用VHDL語言給出了電路的設(shè)計,利用XILINX的Spartan-ⅡE 系列FPGA實現(xiàn),并被應(yīng)用于多種電路中,在實際應(yīng)用中取得了較好的效果。

          參考文獻:

          [1]徐慶元,張?zhí)煨颍妱? 基于USB總線的高速視頻采集系統(tǒng)設(shè)計[J]. 微計算機信息.2006,10-1:247-249.

          [2]余松煌,周源華數(shù)字圖像處理[M]北京:電子工業(yè)出版社,1987

          [3] Martti Juhola.Comparison of Algorithms for Standand Median Filtering IEEE-TRANS ASSP-39 1991

          [4] 林敏,方穎立 VHDL數(shù)字系統(tǒng)設(shè)計與高層次綜合「M」.北京:電子工業(yè)出版社,2002



          關(guān)鍵詞: FPGA FIFO

          評論


          相關(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); })();