摘 要:在軟件無線電領域中,系統必須具有較強的動態重構能力。這里討論PCI協議特點和FPGA配置過程,給出一種通過PCI總線配置卡上FPGA的設計方法。硬件部分采用CPLD實現讀寫配置空間、PCI總線時序和FPGA配置時序,軟件部分采用WinIO作為驅動程序。設計上簡潔、靈活,不依賴專用PCI接口芯片,也不需要下載電纜。實踐證明,這種方法便捷可靠,對PCI卡的設計具有很好的參考價值。
關鍵詞:PCI總線;FPGA;軟件無線電;WinIO
中圖分類號:TP336文獻標識碼:A
文章編號:1004-373X(2010)02-090-03
Design Method of Configuring FPGA by PCI Bus
WANG Yuanqiang,ZHU Wei
(School of Electronic Science Technology,Southeast University,Nanjing,210096,China)
Abstract:In the field of software radio,systems have to be equiped with a strong ability of dynamic reconstruction.The features of PCI protocol and the operation of configuring FPGA are discussed,a design method of configuring FPGA on cards by PCI bus is presented.In hardware part,a CPLD is used to implement PCI configuration read/write operation,and in software part,WinIO is used for the driver.The design is simple and flexiable because it doesn′t depend on special PCI interface chips and download cables.Pratice has proved the method convinent and reliable.So,it is valuale for guiding other PCI cards design.
Keywords:PCI bus;FPGA;software radio;WinIO
0 引 言
近十年來,半導體工藝水平的進步和市場需求的驟增推動了FPGA向高速度、高密度和低成本方向飛速發展。由于它具有強大的處理能力和高度的靈活性,人們在PCI卡上使用FPGA進行的圖像處理、運動控制和協議轉換已經逐漸成為一種主流的設計方法。然而,在某些場合,設計者和用戶還要求以FPGA為核心的硬件系統具有動態的功能重組和邏輯重構的能力。例如,在軟件無線電中,硬件平臺的核心器件FPGA經常要根據工作頻段、業務種類、數據速率與格式、傳輸協議等被實時在線地重新配置[1]。
系統中的硬件一般都是以PCI卡的形式存在的,對于PCI卡上的FPGA器件,傳統的配置方法有外掛ROM、通過串口和通過USB接口三種方法[2]。外掛ROM的方法顯然不夠靈活,保密性低;通過串口或者通過USB接口的方法必須外接一根下載電纜,較為繁瑣。這里提出一種通過PCI總線對卡上FPGA器件進行配置的方法。采用該方法配置或重配置FPGA時,操作者只需要在PC機上運行包含加載程序的軟件,就可以在不同的任務階段自動或手動地將準備好的配置邏輯通過PCI總線加載到FPGA中,整個操作過程完全軟件化,無需拔插下載電纜;還可以通過Internet,實現遠程配置。在配置工作完成之后,配置電路還可以充當主機與卡上FPGA進行數據交換的橋梁。
1 總體方案
這里所述的設計,遵守PCI SIG于1999年發布的《PCI局部總線規范2.2版本》,信號環境為5 V,PCI時鐘頻率為33 MHz,總線寬度為32位。
首先利用EDA工具編寫RTL代碼,然后進行編譯、仿真、綜合,最后生成配置文件。加載軟件在被自動或手動觸發后,將相應的配置文件中的數據以一定的格式通過操作系統和PCI總線傳遞到PCI卡中。如何從PCI總線上獲得數據,以及把數據按照FPGA的配置時序要求加載到FPGA器件中是整個設計的關鍵。該設計采用了CPLD來解決這一關鍵問題。圖1所示為整個系統的架構和各部分之間的邏輯關系。
與采用PCI接口芯片(如PCI9054)加單片機[3](或者加CPLD [4])的設計方案相比,只采用CPLD的方案使簡化了硬件電路,降低了成本,節省了PCB面積,而且數據傳輸通道的速度不受單片機處理速度和引腳數量的限制。
圖1 系統框架示意圖
2 硬件設計
這里介紹的設計中,選用一片Xilinx的CPLD,型號為XC95144XL,封裝為TQ100。
2.1 信號連接和PCB設計考慮
基本的PCI總線操作要求下列信號必須實現:CLK,RST,FRAME,TRDY,IRDY,IDSEL,DEVSEL,AD[31:0],C/BE[3:0]。這些信號都應連接到CPLD的I/O引腳上。其中,CLK應該在CPLD的GCK引腳上實現,時鐘信號線的長度應控制在2.5 in左右;RST應該在GSR引腳上實現。PRSNT[1:2]的兩個引腳至少應有一個接地。建議使用四層PCB設計PCI卡,中間兩層應為電源和地[5]。
2.2 PCI總線時序分析和接口設計
PCI總線的功能強大,協議復雜,要在一片CPLD上實現主從設備之間數據傳輸的時序,需要有選擇地實現接口協議。該設計中采用讀寫配置寄存器的總線操作來傳輸數據。這種方式僅支持單數據周期,對CPLD的資源要求低,并且不占用計算機系統的地址空間。
在配置寫周期上,CPLD把總線上的數據鎖存到內部寄存器中;在配置讀周期上,CPLD把內部寄存器中的數據放置到總線上[5]。圖2和圖3分別為PCI總線上配置寫操作和配置讀操作的時序[6]。
圖2 PCI總線配置寫操作時序
在CPLD內要實現兩個時序,PCI總線操作時序和FPGA配置時序。為此,在CPLD內部設計了兩個狀態機,分別命名為busstate和cfgstate。前者對應于PCI總線操作,它可以在IDLE,ADDRESS,DECODE,PREPARE和LATCH五個狀態之間順序切換。在PCI總線空閑時,狀態機處于IDLE狀態。當狀態機在ADDRESS狀態時,CPLD從地址/數據總線上獲得目標寄存器的地址,從C/BE[3:0]上獲得操作類型編碼;當狀態機在LATCH狀態時,CPLD將地址/數據總線上的數據鎖存到內部寄存器中,或者是將內部數據放置到地址/數據總線上。在每一次總線操作中,狀態機根據握手信號的組合變化情況按順序切換。
圖3 PCI總線配置讀操作時序
根據PCI規范,一個合法的PCI目標設備至少應該實現以下幾個配置寄存器:供應商識別碼寄存器(Vendor ID)、設備識別碼寄存器(Device ID)、版本號寄存器(Reversion ID)、分類識別碼寄存器(Class Code)。除此之外,該設計還實現了一個用于存放命令字、狀態字和數據的32位內部寄存器如下:
State_regRdata_regCmd_regWdata_reg
24~311680
內部寄存器是CPLD數據中轉的核心。PCI總線上的配置數據將先被存入Wdata_reg中,然后再寫入FPGA中;從FPGA中讀出的數據將先被寫入Rdata_reg中,然后再被投放到PCI總線上。軟件程序通過寫入命令字到Cmd_reg中,使CPLD執行相應的操作;通過查詢State_reg的內容來獲知工作狀態。Cmd_reg和State_reg是軟件程序和CPLD相互配合的樞紐。
2.3 CPLD配置FPGA的時序分析和邏輯設計
FPGA器件的配置原理和基本方式都大同小異。這里以Xilinx的Spartan_IIE系列器件為例,有五種配置模式:從串(Slave Serial)、主串(Master Serial)、從并(Slave Parallel)、主并(Master Parallel)和JTAG模式[7]。其中,從并模式的數據寬度為8位,配置速度最快,數據格式簡單,適用于CPLD或者MCU配置FPGA的場合,故采用這種方式。配置文件采用由Xilinx的綜合開發工具ISE自動生成BIN格式文件,它全部由二進制格式的配置數據構成,易于軟件程序的處理和加載。
Spartan_IIE系列FPGA器件的正常配置過程包括四個步驟:啟動配置、清除內存、加載數據和器件啟動。對FPGA的配置從Cmd_reg收到啟動配置命令開始,CPLD立即給FPGA的PROGRAM引腳送去低脈沖,FPGA隨即會置低INIT信號,表明它已經響應了配置操作,并開始清除內部SRAM[8]。FPGA完成清除配置內存的工作后,將拉高INIT信號,此時CPLD會把這一狀態寫入State_reg中,供軟件程序查詢。接下來,軟件程序會把配置數據依次寫入Write_reg中,CPLD再把這些數據轉寫到FPGA中。在送完所有的配置數據后,還應該給FPGA器件提供8個周期的時鐘信號,用于讓器件進入執行設計邏輯的用戶操作狀態。配置操作成功之后,FPGA會把DONE信號抬起,CPLD在檢測到DONE變高之后將會在State_reg中寫入表示配置成功的狀態字,供用戶程序查詢。否則,表明配置失敗。在成功配置FPGA后,原先用于配置操作的某些引腳(如WR,CS)隨即轉化為普通的I/O口,可用于傳輸用戶數據。
狀態機cfgstate用于協調CPLD對FPGA的配置操作和數據傳輸。該狀態機在以下七個狀態之間切換:空閑狀態(IDLE)、啟動配置(INITIATE)、加載配置數據(LOADING)、啟動FPGA器件(STARTUP)、向FPGA寫入類別碼和地址碼(OUTCTRL)、向FPGA寫入數據(OUTDATA)、從FPGA讀出數據(GETDATA)。兩個狀態機busstate和cfgstate聯系的橋梁是State_reg,Rdata_reg,Cmd_reg和Wdata_reg這4個寄存器。
3 軟件設計
3.1 底層驅動
軟件程序的最基本操作是讀/寫PCI配置寄存器。在PC_AT架構的系統中,這一操作轉化為對讀/寫兩個地址分別為0CF8h和0CFCh的I/O單元的操作。在Windows NT/2000/XP中,操作系統不允許用戶程序直接訪問I/O單元,因此借助于能夠打開操作系統I/O特權操作的庫WinIO。在它的支持下,用戶可以直接讀寫I/O端口[9]。在軟件程序中,WinIO充當底層驅動程序。讀寫地址為0CF8H的CONFIG_ADDRESS方式如下:
ENRSVBUSDEVFUNREG00
3124~3016~2311~158~102~710
其中,EN(位31)是使能位,它用于確定何時把對CONFIG_DATA的訪問轉換為PCI總線上的配置訪問;RSV(位24~位30)是保留位;BUS(位16~位23)用于選擇系統中特定的PCI局部總線;DEV(位11~位15)用于選擇總線上的特定設備;FUN(位8~位10)在設備支持多功能的情況下,用于選擇設備的特定功能;REG(位2~位7)用于選擇設備配置空間的雙字;位1和位0是只讀位,且返回值必須為0[4]。
在設置好CONFIG_ADDRESS后,如果是讀PCI配置寄存器,用戶程序則調用WinIO的讀I/O函數,從CONGIF_DATA(地址為0CFCH)讀出數據,即為目標寄存器的內容;如果是寫PCI配置寄存器,用戶程序則調用WinIO的寫I/O函數,將要寫入的用戶數據寫到CONFIG_DATA中即可。
為了便于編寫軟件程序,作者封裝了兩個函數用于讀寫PCI配置寄存器:
UINT ReadRegister(int BusNo,int DevNo,UINT RegAddr);
void WriteRegister(int BusNo,int DevNo,UINT RegAddr,UINT dwData)
其中,BusNo表示PCI卡所在的PCI總線序號;DevNo表示PCI卡所安裝的PCI插槽序號;RegAddr是目標寄存器的地址;dwData是要寫入寄存器的數據。
3.2 應用軟件的設計
由于PCI卡是即插即用(PnP)設備,因此PCI卡的地址空間是不固定的。為了訪問目標配置空間,用戶程序首先應該探測PCI卡所在總線序號(BusNo)和插槽的序號(DevNo)。探測的方法是:讓總線號在0~4之間變化,讓設備號在0~31之間變化,逐一讀取Vendor ID寄存器和Device ID寄存器,并與預先設定值相比較。當發現到二者都吻合時,記下此時的BusNo和DevNo,并保存在全局變量中,供ReadRegister()和WriteRegister()使用。探測的PCI卡的C語言程序代碼如下:
int bus,device;
UINT ioAddr,ioData;
int Scan() {
bus=0; device=0;
for(int i=0;i<5;i++) {
for(int j=0;j<32;j++) {
bus=i; device=j;
ioAddr=0x80000000+bus*0x10000+(device*8)*0x100;
_outpd(0xcf8,ioAddr);
ioData=_inpd(0xcfc);
if (ioData==0x55AA1022) return 0;
}
}
return -1;
}
為了評估和測試PCI卡的性能,使用VC++ 6.0設計一個軟件程序,包含如下六項功能:讀配置寄存器;寫配置寄存器;配置FPGA;從FPGA中讀數據;向FPGA中寫數據;退出程序。經過調試,該軟件程序可以準確無誤地讀/寫PCI卡上的配置寄存器,配置FPGA,傳輸用戶數據。設計者可以根據具體的應用場合開發界面更美觀、功能更完善的軟件,但都應包含以上六項功能。
4 結 語
采用CPLD通過PCI總線配置FPGA的設計方法已經在筆者研制的帶有FPGA芯片的PCI卡上得以實現和應用。實踐證明,這種設計能夠準確、可靠、便捷地將配置數據加載到FPGA中,配置過程徹底軟件化。配置完成后,FPGA完全按照設計邏輯工作,結果與其他配置方式無異。在FPGA啟動后,CPLD還可以擔負起主機和FPGA之間數據傳輸的任務[10],數據寬度為8 b時,傳輸速度可達2.5 Mb/s。
參考文獻
[1]劉偉,孟憲元.FPGA在軟件無線電中的應用[J].有線電視與網絡,2001(1):69-71.
[2]喬建良,田思.基于MCU的CPLD/FPGA配置[J].現代電子技術,2004,27(19):70-72.
[3]梅安華,田建生,劉歡.基于PCI總線FPGA配置系統的設計[J].計算機測量與控制,2005,13(4):375-377.
[4]梅安華,田建生,劉歡.基于總線靈活配置FPGA設計[J].電子技術,2004(9):18-21.
[5]李貴山,陳金鵬.PCI局部總線及其應用[M].西安:西安電子科技大學出版社,2003
[6]Tom Shanley,Don Anderson.PCI System Architecture[M].4th Edition.Addison Wesley Longman Inc.,2000.
[7]Xilinx Inc.Spartan_IIE FPGA 數據手冊[Z].2004.
[8]李鵬,蘭巨龍.用CPLD和FLASH實現FPGA配置[J].電子技術應用,2006(6):101-103.
[9]于朋飛,張元濤,張有志.一種實現對PCI配置空間訪問的方法[J].山東大學學報,2003,8(4):421-424.
[10]曾哲昱,葉衛東.用CPLD實現PCI總線目標接口[J].測控技術,2002,21(1):45-47.
作者簡介
王元強 男,1980年出生,碩士研究生。研究方向為嵌入式系統。
朱 為 男,碩士生導師,副教授。研究方向為嵌入式系統、圖像處理與傳輸。