基于PCI接口芯片外擴(kuò)FIFO的FPGA實現(xiàn)
0. 引言
目前,計算機(jī)上的系統(tǒng)總線常見的有 ISA總線、 PCI總線以及 VXI總線等。在實際應(yīng)用中,PCI總線已經(jīng)成為主流的應(yīng)用總線,具有較高的數(shù)據(jù)傳輸效率,能滿足大多數(shù)數(shù)據(jù)采集和發(fā)送系統(tǒng)的需求。由于 PCI總線規(guī)范相當(dāng)復(fù)雜,一般實際應(yīng)用中都選擇專用的 PCI接口芯片來設(shè)計 PCI接口。本文選擇美國 PLX公司生產(chǎn)的 PCI總線通用接口芯片 PCI 9054,利用該專用芯片橋接 PCI總線與本地總線 [1-3]。在實際半實物仿真測試系統(tǒng)的應(yīng)用中,要求仿真計算機(jī)能夠快速、穩(wěn)定的連續(xù)輸出所需數(shù)據(jù),而由于 PCI 9054內(nèi)部 FIFO存儲器主要用于數(shù)據(jù)的讀寫控制,容量有限,不能滿足半實物仿真測試系統(tǒng)數(shù)據(jù)傳輸?shù)囊?。因此,本文提出利?FPGA內(nèi)部的嵌入式陣列塊( EAB)(Embedded Array Blocks)來實現(xiàn)外擴(kuò) FIFO的功能,目的是用于存儲由 PCI總線傳輸過來的仿真數(shù)據(jù),并在 D/A轉(zhuǎn)換期間起到數(shù)據(jù)緩存的作用。
1. PCI 9054特性及 FPGA內(nèi)部 EAB模塊簡介
1.1 PCI 9054接口芯片簡介及配置
PCI 9054內(nèi)部有六個可編程的 FIFO存儲器,它們可分別實現(xiàn) PCI發(fā)起讀、寫操作, PCI目標(biāo)讀、寫操作和 DMA方式讀、寫操作。這里采用 DMA方式傳輸數(shù)據(jù),可實現(xiàn)大量數(shù)據(jù)的突發(fā)傳輸而不丟失,數(shù)據(jù)通過 PCI 9054內(nèi)部的 FIFO進(jìn)行雙向傳輸。為此,核心控制芯片 FPGA內(nèi)部專門設(shè)計了與 PCI 9054進(jìn)行數(shù)據(jù)通信的邏輯控制單元,通過查詢 FIFO的當(dāng)前狀態(tài),實時地把數(shù)據(jù)傳送到相應(yīng)的存儲單元。
PCI 9054內(nèi)部提供一個串行 EEPROM配置接口,為 PCI總線和局部總線配置部分重要信息,如本地總線的基地止空間、I/O空間、中斷控制信號等信息,總?cè)萘繛?2 K字節(jié)或 4 K字節(jié),其內(nèi)容可通過 PCI總線寫入,也可通過編程器直接燒寫。EPROM一定要選擇支持串行傳輸方式的芯片,這里選用 93CS56L作為外接 EEPROM,容量為 2 K字節(jié), EEPROM的配置電路如圖 1所示。圖中 93CS56L的 1、2、3/4引腳與 PCI9054上的 EECS、EESK、EEDI/EEDO引腳相連,系統(tǒng)啟動時自動檢測 EEPROM,并將初始化配置參數(shù)裝入 PCI配置寄存器中,根據(jù)本地總線對內(nèi)存、 I/O端口和中斷等統(tǒng)一劃分空間,自動配置。EEPROM的配置至關(guān)重要,其配置不正確可導(dǎo)致整個系統(tǒng)無法運(yùn)行。
1.2嵌入式邏輯陣列塊( EAB)結(jié)構(gòu)[4]
嵌入式邏輯陣列塊( EAB)具有邏輯和存儲功能,在輸入、輸出端口上帶有寄存器的 RAM塊,利用它們可以實現(xiàn) ROM、RAM、雙端口 RAM和 FIFO等功能設(shè)計。每個 EAB模塊均含有 2 K的數(shù)據(jù)容量,每個 EAB單元中還包括數(shù)據(jù)區(qū)、總線和讀 /寫控制等。數(shù)據(jù)區(qū)是 EAB的核心部分,可根據(jù)數(shù)據(jù)/地址線的不同設(shè)置將其配置為 2048×1bit,1024×2bit, 512×4bit,256×8bit等。相應(yīng)的數(shù)據(jù)總線可以配置成 8bit、4bit、2bit或 1bit寬,地址總線可以配置成 8bit、9bit、10bit或 11bit寬。而輸入輸出總線相對應(yīng),這三條總線都可以設(shè)置為同步/異步兩種工作方式。
2. 外擴(kuò)異步 FIFO的 FPGA實現(xiàn) [5]
2.1異步 FIFO存儲器的內(nèi)部結(jié)構(gòu)及工作原理[6]
本設(shè)計選擇的 EPF10K10 FPGA內(nèi)部含有 3個嵌入式陣列塊( EAB)。為了實現(xiàn)大容量的異步 FIFO存儲器,可以通過內(nèi)部級聯(lián)的方法把多個 EAB模塊進(jìn)行連接,如本設(shè)計把 3個 EAB模塊進(jìn)行連接,每個 EAB模塊均為 512×4 Bit,連接以后可實現(xiàn) 512×12 Bit的 FIFO存儲模塊,即 FIFO存儲器的容量為 6 KB。圖 2給出了利用 EAB模塊構(gòu)成 FIFO存儲器的內(nèi)部結(jié)構(gòu)圖。
從圖 2可以看出,異步 FIFO存儲器包含一個雙端口的 RAM、寫指針(WP)、讀指針(RP)、空標(biāo)志產(chǎn)生邏輯( FULL)及滿標(biāo)志產(chǎn)生邏輯 (EMPTY)。其工作過程是把 PCI9054讀入的內(nèi)存波形數(shù)據(jù)緩存到 RAM中,然后根據(jù)仿真需要,把波形數(shù)據(jù)傳送給 D/A轉(zhuǎn)換模塊。其遵循的原則是寫入數(shù)據(jù)位數(shù)及時鐘與 PCI9054輸出數(shù)據(jù)位數(shù)及本地時鐘( LCLK)同步,而輸出數(shù)據(jù)位數(shù)及時鐘與 D/A轉(zhuǎn)換模塊的輸入數(shù)據(jù)位數(shù)及時鐘相一致,且硬件系統(tǒng)第一個讀入的數(shù)據(jù)為輸出端口讀出的第一個數(shù)據(jù),依此類推。由于時鐘頻率的不同,輸入口和輸出口的工作過程彼此是獨(dú)立的,即可以同時進(jìn)行讀寫操作。只要 FIFO存儲器的數(shù)據(jù)標(biāo)志位 FULL為非滿狀態(tài),就可以繼續(xù)向 FIFO存儲器中寫入數(shù)據(jù);只要 FIFO存儲器的數(shù)據(jù)標(biāo)志位 EMPTY為非空狀態(tài),就可以繼續(xù)從 FIFO存儲器中讀取數(shù)據(jù)。
2.2異步 FIFO存儲器的 FPGA實現(xiàn)方法
由 EAB構(gòu)成的 FIFO模塊,只需對其進(jìn)行編程實現(xiàn),而無需其它外部元件匹配。設(shè)計過程中主要考慮的一是如何實現(xiàn)數(shù)據(jù)在傳輸過程中不丟失數(shù)據(jù),即如何同步異步時鐘信號,避免亞穩(wěn)態(tài)的產(chǎn)生;二是如何正確地判斷 FIFO存儲器的空/滿狀態(tài)。
圖 1 EEPROM 配置電路
圖 2 由 EAB模塊構(gòu)成的 FIFO內(nèi)部結(jié)構(gòu)圖圖 3給出了 FIFO存儲器的四種狀態(tài),即:
1)初始狀態(tài):對于本設(shè)計而言,即為 WP=0,RP=511。此時的 FIFO處于空狀態(tài), RP=WP-1,不能對其進(jìn)行讀操作。
1RP=WP狀態(tài)。FIFO只要再進(jìn)行一次寫操作就會變成滿狀態(tài)。
2RP=WP-2狀態(tài)。FIFO只要再進(jìn)行一次讀操作就會變成空狀態(tài)。
3RP=WP-1狀態(tài),F(xiàn)IFO已經(jīng)存滿數(shù)據(jù),不能對其進(jìn)行寫操作。
圖 2 由EAB 模塊構(gòu)成的FIFO 內(nèi)部結(jié)構(gòu)圖
圖 3 FIFO 四種工作狀態(tài)
可以看出,滿狀態(tài)和空狀態(tài)的 RP和 WP的關(guān)系是一致的,均為 RP=WP-1。但在滿或空狀態(tài)出現(xiàn)之前的一個狀態(tài)是各不相同的。當(dāng) RP=WP時,由于寫入一個數(shù)據(jù)而使其進(jìn)入滿狀態(tài)( RP=WP-1),而在 RP=WP-2時,由于讀出一個數(shù)據(jù)而使其進(jìn)入空狀態(tài)( RP=WP-1)。設(shè)計中可以根據(jù)這一原則通過軟件編程來得到空 /滿狀態(tài)標(biāo)志產(chǎn)生的條件。下面給出一段描述空狀態(tài)產(chǎn)生的 VHDL語言程序。
process(wr_clk,reset)
begin
if reset=1 then
empty_in<=1;
elsif (wr_clk=1 and wr_clkevent) then
if ((rp=wp-2 or (rp=fifo_depth-1 and wp=1)
or(rp=fifo_depth-2 and wp=0)
and (rd_en=0 and wr_en=1)) then
empty_in<=1;
elsif (empty_in=1 and wr_en=0) then
empty_in<=0;
end if;
end if;
end process;
其中:
wr_clk為寫入數(shù)據(jù)時鐘信號; reset為系統(tǒng)復(fù)位信號;empty_in為空標(biāo)志信號; fifo_depth為 FIFO存儲器深度值,這里為 512;rp為讀數(shù)據(jù)指針; wp為寫數(shù)據(jù)指針; wr_en為寫入數(shù)據(jù)使能信號;rd_en為讀出數(shù)據(jù)使能信號。
對于異步 FIFO而言,設(shè)計過程中還需考慮的一點(diǎn)就是如何消除不同時鐘域的亞穩(wěn)態(tài)。這里主要是對讀 /寫地址采用雷格碼變換,即相鄰地址之間只有一個數(shù)據(jù)位不同,據(jù)此可以很好地減少亞穩(wěn)態(tài)的發(fā)生。雷格碼可以通過對 FPGA內(nèi)部編程實現(xiàn)二進(jìn)制計數(shù)器來完成,即讀地址的雷格碼計數(shù)器用讀時鐘,寫地址的雷格碼用寫時鐘,數(shù)據(jù)輸入端由兩個相鄰二進(jìn)制的數(shù)據(jù)位異或產(chǎn)生,這樣就很好地解決了當(dāng)讀/寫地址指針相同時,由于讀/寫時鐘異步而產(chǎn)生的地址錯誤。下面給出的是讀地址雷格碼程序描述。
process(rd_clk,reset,rd_en)
begin
if reset=1 then
rd_gray<="00000000";
else
rd_gray(3)<=rp(3);
rd_gray(2)<=rp(3)xor rp(2);
rd_gray(1)<=rp(2)xor rp(1);
rd_gray(0)<=rp(1)xor rp(0);
end if;
end process;
其中: reset為系統(tǒng)復(fù)位信號; rd_clk為讀出數(shù)據(jù)時鐘信號; rd_en為讀出數(shù)據(jù)使能信號; rp為讀數(shù)據(jù)指針;rd_gray為讀雷格碼地址。
3. 結(jié)束語 本文根據(jù)半實物仿真測試系統(tǒng)的要求,利用 FPGA芯片內(nèi)部 EAB模塊設(shè)計了基于 PCI總線接口的異步 FIFO緩存器。針對異步 FIFO設(shè)計中的空 /滿狀態(tài)及亞穩(wěn)態(tài)問題,給出了具體的解決方法,主要采用 VHDL語言進(jìn)行了 FIFO的電路設(shè)計,利用 ALTERA公司的 EPF10K10 FPGA芯片實現(xiàn)了該設(shè)計,并將這一設(shè)計應(yīng)用到半實物仿真測試系統(tǒng)中進(jìn)行連續(xù)波形數(shù)據(jù)的傳輸,在實際測試系統(tǒng)中取得了較好的效果。本文作者創(chuàng)新點(diǎn):在半實物仿真測試系統(tǒng)中,本著模塊化的設(shè)計思想,本文利用 FPGA芯片內(nèi)部 EAB模塊設(shè)計了異步 FIFO存儲器,提高了半實物仿真測試系統(tǒng)數(shù)據(jù)傳輸效率,解決了由于計算機(jī)中斷而引起的數(shù)據(jù)傳輸間歇性問題。
參考文獻(xiàn)
[1] Ravi Budruk,Don Anderson,Tom Shanley. PCI Express系統(tǒng)體系結(jié)構(gòu)標(biāo)準(zhǔn)教材 [M].北京:電子工業(yè)出版社,2002:5-30.
[2]尹勇, 李宇. PCI總線設(shè)備開發(fā)寶典[M].北京:北京航空航天大學(xué)出版社,2005:1-14.
[3] PLX Technology,Inc. “PCI 9054 Data Book” Version 2.0[Z].USA,1999.
[4]李琳,陳勇生 . FLEX10K系列 EAB的應(yīng)用 [J].國外電子元器件 . 2001(12):59-62
[5]張志安. 硬目標(biāo)侵徹引信半實物仿真技術(shù)研究[D].南京:南京理工大學(xué),2007.
[6]熊紅兵,陳琦 . 基于 FPGA的異步 FIFO設(shè)計與實現(xiàn)[J].微計算機(jī)信息. 2006,6-2:216-218