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