0. 引言
目前,計(jì)算機(jī)上的系統(tǒng)總線常見的有 ISA總線、 PCI總線以及 VXI總線等。在實(shí)際應(yīng)用中,PCI總線已經(jīng)成為主流的應(yīng)用總線,具有較高的數(shù)據(jù)傳輸效率,能滿足大多數(shù)數(shù)據(jù)采集和發(fā)送系統(tǒng)的需求。由于 PCI總線規(guī)范相當(dāng)復(fù)雜,一般實(shí)際應(yīng)用中都選擇專用的 PCI接口芯片來設(shè)計(jì) PCI接口。本文選擇美國 PLX公司生產(chǎn)的 PCI總線通用接口芯片 PCI 9054,利用該專用芯片橋接 PCI總線與本地總線 [1-3]。在實(shí)際半實(shí)物仿真測試系統(tǒng)的應(yīng)用中,要求仿真計(jì)算機(jī)能夠快速、穩(wěn)定的連續(xù)輸出所需數(shù)據(jù),而由于 PCI 9054內(nèi)部 FIFO存儲(chǔ)器主要用于數(shù)據(jù)的讀寫控制,容量有限,不能滿足半實(shí)物仿真測試系統(tǒng)數(shù)據(jù)傳輸?shù)囊?。因此,本文提出利?FPGA內(nèi)部的嵌入式陣列塊( EAB)(Embedded Array Blocks)來實(shí)現(xiàn)外擴(kuò) FIFO的功能,目的是用于存儲(chǔ)由 PCI總線傳輸過來的仿真數(shù)據(jù),并在 D/A轉(zhuǎn)換期間起到數(shù)據(jù)緩存的作用。
1. PCI 9054特性及 FPGA內(nèi)部 EAB模塊簡介
1.1 PCI 9054接口芯片簡介及配置
PCI 9054內(nèi)部有六個(gè)可編程的 FIFO存儲(chǔ)器,它們可分別實(shí)現(xiàn) PCI發(fā)起讀、寫操作, PCI目標(biāo)讀、寫操作和 DMA方式讀、寫操作。這里采用 DMA方式傳輸數(shù)據(jù),可實(shí)現(xiàn)大量數(shù)據(jù)的突發(fā)傳輸而不丟失,數(shù)據(jù)通過 PCI 9054內(nèi)部的 FIFO進(jìn)行雙向傳輸。為此,核心控制芯片 FPGA內(nèi)部專門設(shè)計(jì)了與 PCI 9054進(jìn)行數(shù)據(jù)通信的邏輯控制單元,通過查詢 FIFO的當(dāng)前狀態(tài),實(shí)時(shí)地把數(shù)據(jù)傳送到相應(yīng)的存儲(chǔ)單元。
PCI 9054內(nèi)部提供一個(gè)串行 EEPROM配置接口,為 PCI總線和局部總線配置部分重要信息,如本地總線的基地止空間、I/O空間、中斷控制信號(hà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)啟動(dòng)時(shí)自動(dòng)檢測 EEPROM,并將初始化配置參數(shù)裝入 PCI配置寄存器中,根據(jù)本地總線對(duì)內(nèi)存、 I/O端口和中斷等統(tǒng)一劃分空間,自動(dòng)配置。EEPROM的配置至關(guān)重要,其配置不正確可導(dǎo)致整個(gè)系統(tǒng)無法運(yùn)行。
1.2嵌入式邏輯陣列塊( EAB)結(jié)構(gòu)[4]
嵌入式邏輯陣列塊( EAB)具有邏輯和存儲(chǔ)功能,在輸入、輸出端口上帶有寄存器的 RAM塊,利用它們可以實(shí)現(xiàn) ROM、RAM、雙端口 RAM和 FIFO等功能設(shè)計(jì)。每個(gè) EAB模塊均含有 2 K的數(shù)據(jù)容量,每個(gè) 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寬。而輸入輸出總線相對(duì)應(yīng),這三條總線都可以設(shè)置為同步/異步兩種工作方式。
2. 外擴(kuò)異步 FIFO的 FPGA實(shí)現(xiàn) [5]
2.1異步 FIFO存儲(chǔ)器的內(nèi)部結(jié)構(gòu)及工作原理[6]
本設(shè)計(jì)選擇的 EPF10K10 FPGA內(nèi)部含有 3個(gè)嵌入式陣列塊( EAB)。為了實(shí)現(xiàn)大容量的異步 FIFO存儲(chǔ)器,可以通過內(nèi)部級(jí)聯(lián)的方法把多個(gè) EAB模塊進(jìn)行連接,如本設(shè)計(jì)把 3個(gè) EAB模塊進(jìn)行連接,每個(gè) EAB模塊均為 512×4 Bit,連接以后可實(shí)現(xiàn) 512×12 Bit的 FIFO存儲(chǔ)模塊,即 FIFO存儲(chǔ)器的容量為 6 KB。圖 2給出了利用 EAB模塊構(gòu)成 FIFO存儲(chǔ)器的內(nèi)部結(jié)構(gòu)圖。
從圖 2可以看出,異步 FIFO存儲(chǔ)器包含一個(gè)雙端口的 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ù)及時(shí)鐘與 PCI9054輸出數(shù)據(jù)位數(shù)及本地時(shí)鐘( LCLK)同步,而輸出數(shù)據(jù)位數(shù)及時(shí)鐘與 D/A轉(zhuǎn)換模塊的輸入數(shù)據(jù)位數(shù)及時(shí)鐘相一致,且硬件系統(tǒng)第一個(gè)讀入的數(shù)據(jù)為輸出端口讀出的第一個(gè)數(shù)據(jù),依此類推。由于時(shí)鐘頻率的不同,輸入口和輸出口的工作過程彼此是獨(dú)立的,即可以同時(shí)進(jìn)行讀寫操作。只要 FIFO存儲(chǔ)器的數(shù)據(jù)標(biāo)志位 FULL為非滿狀態(tài),就可以繼續(xù)向 FIFO存儲(chǔ)器中寫入數(shù)據(jù);只要 FIFO存儲(chǔ)器的數(shù)據(jù)標(biāo)志位 EMPTY為非空狀態(tài),就可以繼續(xù)從 FIFO存儲(chǔ)器中讀取數(shù)據(jù)。
2.2異步 FIFO存儲(chǔ)器的 FPGA實(shí)現(xiàn)方法
由 EAB構(gòu)成的 FIFO模塊,只需對(duì)其進(jìn)行編程實(shí)現(xiàn),而無需其它外部元件匹配。設(shè)計(jì)過程中主要考慮的一是如何實(shí)現(xiàn)數(shù)據(jù)在傳輸過程中不丟失數(shù)據(jù),即如何同步異步時(shí)鐘信號(hào),避免亞穩(wěn)態(tài)的產(chǎn)生;二是如何正確地判斷 FIFO存儲(chǔ)器的空/滿狀態(tài)。
圖 1 EEPROM 配置電路
圖 2 由 EAB模塊構(gòu)成的 FIFO內(nèi)部結(jié)構(gòu)圖圖 3給出了 FIFO存儲(chǔ)器的四種狀態(tài),即:
1)初始狀態(tài):對(duì)于本設(shè)計(jì)而言,即為 WP=0,RP=511。此時(shí)的 FIFO處于空狀態(tài), RP=WP-1,不能對(duì)其進(jìn)行讀操作。
1 RP=WP狀態(tài)。FIFO只要再進(jìn)行一次寫操作就會(huì)變成滿狀態(tài)。
2 RP=WP-2狀態(tài)。FIFO只要再進(jìn)行一次讀操作就會(huì)變成空狀態(tài)。
3 RP=WP-1狀態(tài),F(xiàn)IFO已經(jīng)存滿數(shù)據(jù),不能對(duì)其進(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)之前的一個(gè)狀態(tài)是各不相同的。當(dāng) RP=WP時(shí),由于寫入一個(gè)數(shù)據(jù)而使其進(jìn)入滿狀態(tài)( RP=WP-1),而在 RP=WP-2時(shí),由于讀出一個(gè)數(shù)據(jù)而使其進(jìn)入空狀態(tài)( RP=WP-1)。設(shè)計(jì)中可以根據(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ù)時(shí)鐘信號(hào); reset為系統(tǒng)復(fù)位信號(hào);empty_in為空標(biāo)志信號(hào); fifo_depth為 FIFO存儲(chǔ)器深度值,這里為 512;rp為讀數(shù)據(jù)指針; wp為寫數(shù)據(jù)指針; wr_en為寫入數(shù)據(jù)使能信號(hào);rd_en為讀出數(shù)據(jù)使能信號(hào)。
對(duì)于異步 FIFO而言,設(shè)計(jì)過程中還需考慮的一點(diǎn)就是如何消除不同時(shí)鐘域的亞穩(wěn)態(tài)。這里主要是對(duì)讀 /寫地址采用雷格碼變換,即相鄰地址之間只有一個(gè)數(shù)據(jù)位不同,據(jù)此可以很好地減少亞穩(wěn)態(tài)的發(fā)生。雷格碼可以通過對(duì) FPGA內(nèi)部編程實(shí)現(xiàn)二進(jìn)制計(jì)數(shù)器來完成,即讀地址的雷格碼計(jì)數(shù)器用讀時(shí)鐘,寫地址的雷格碼用寫時(shí)鐘,數(shù)據(jù)輸入端由兩個(gè)相鄰二進(jìn)制的數(shù)據(jù)位異或產(chǎn)生,這樣就很好地解決了當(dāng)讀/寫地址指針相同時(shí),由于讀/寫時(shí)鐘異步而產(chǎn)生的地址錯(cuò)誤。下面給出的是讀地址雷格碼程序描述。
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ù)位信號(hào); rd_clk為讀出數(shù)據(jù)時(shí)鐘信號(hào); rd_en為讀出數(shù)據(jù)使能信號(hào); rp為讀數(shù)據(jù)指針;rd_gray為讀雷格碼地址。
3. 結(jié)束語 本文根據(jù)半實(shí)物仿真測試系統(tǒng)的要求,利用 FPGA芯片內(nèi)部 EAB模塊設(shè)計(jì)了基于 PCI總線接口的異步 FIFO緩存器。針對(duì)異步 FIFO設(shè)計(jì)中的空 /滿狀態(tài)及亞穩(wěn)態(tài)問題,給出了具體的解決方法,主要采用 VHDL語言進(jìn)行了 FIFO的電路設(shè)計(jì),利用 ALTERA公司的 EPF10K10 FPGA芯片實(shí)現(xiàn)了該設(shè)計(jì),并將這一設(shè)計(jì)應(yīng)用到半實(shí)物仿真測試系統(tǒng)中進(jìn)行連續(xù)波形數(shù)據(jù)的傳輸,在實(shí)際測試系統(tǒng)中取得了較好的效果。本文作者創(chuàng)新點(diǎn):在半實(shí)物仿真測試系統(tǒng)中,本著模塊化的設(shè)計(jì)思想,本文利用 FPGA芯片內(nèi)部 EAB模塊設(shè)計(jì)了異步 FIFO存儲(chǔ)器,提高了半實(shí)物仿真測試系統(tǒng)數(shù)據(jù)傳輸效率,解決了由于計(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í)物仿真技術(shù)研究[D].南京:南京理工大學(xué),2007.
[6]熊紅兵,陳琦 . 基于 FPGA的異步 FIFO設(shè)計(jì)與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息. 2006,6-2:216-218