摘 要:在軟件無線電領(lǐng)域中,系統(tǒng)必須具有較強(qiáng)的動(dòng)態(tài)重構(gòu)能力。這里討論P(yáng)CI協(xié)議特點(diǎn)和FPGA配置過程,給出一種通過PCI總線配置卡上FPGA的設(shè)計(jì)方法。硬件部分采用CPLD實(shí)現(xiàn)讀寫配置空間、PCI總線時(shí)序和FPGA配置時(shí)序,軟件部分采用WinIO作為驅(qū)動(dòng)程序。設(shè)計(jì)上簡潔、靈活,不依賴專用PCI接口芯片,也不需要下載電纜。實(shí)踐證明,這種方法便捷可靠,對PCI卡的設(shè)計(jì)具有很好的參考價(jià)值。
關(guān)鍵詞:PCI總線;FPGA;軟件無線電;WinIO
中圖分類號:TP336文獻(xiàn)標(biāo)識碼: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 引 言
近十年來,半導(dǎo)體工藝水平的進(jìn)步和市場需求的驟增推動(dòng)了FPGA向高速度、高密度和低成本方向飛速發(fā)展。由于它具有強(qiáng)大的處理能力和高度的靈活性,人們在PCI卡上使用FPGA進(jìn)行的圖像處理、運(yùn)動(dòng)控制和協(xié)議轉(zhuǎn)換已經(jīng)逐漸成為一種主流的設(shè)計(jì)方法。然而,在某些場合,設(shè)計(jì)者和用戶還要求以FPGA為核心的硬件系統(tǒng)具有動(dòng)態(tài)的功能重組和邏輯重構(gòu)的能力。例如,在軟件無線電中,硬件平臺的核心器件FPGA經(jīng)常要根據(jù)工作頻段、業(yè)務(wù)種類、數(shù)據(jù)速率與格式、傳輸協(xié)議等被實(shí)時(shí)在線地重新配置[1]。
系統(tǒng)中的硬件一般都是以PCI卡的形式存在的,對于PCI卡上的FPGA器件,傳統(tǒng)的配置方法有外掛ROM、通過串口和通過USB接口三種方法[2]。外掛ROM的方法顯然不夠靈活,保密性低;通過串口或者通過USB接口的方法必須外接一根下載電纜,較為繁瑣。這里提出一種通過PCI總線對卡上FPGA器件進(jìn)行配置的方法。采用該方法配置或重配置FPGA時(shí),操作者只需要在PC機(jī)上運(yùn)行包含加載程序的軟件,就可以在不同的任務(wù)階段自動(dòng)或手動(dòng)地將準(zhǔn)備好的配置邏輯通過PCI總線加載到FPGA中,整個(gè)操作過程完全軟件化,無需拔插下載電纜;還可以通過Internet,實(shí)現(xiàn)遠(yuǎn)程配置。在配置工作完成之后,配置電路還可以充當(dāng)主機(jī)與卡上FPGA進(jìn)行數(shù)據(jù)交換的橋梁。
1 總體方案
這里所述的設(shè)計(jì),遵守PCI SIG于1999年發(fā)布的《PCI局部總線規(guī)范2.2版本》,信號環(huán)境為5 V,PCI時(shí)鐘頻率為33 MHz,總線寬度為32位。
首先利用EDA工具編寫RTL代碼,然后進(jìn)行編譯、仿真、綜合,最后生成配置文件。加載軟件在被自動(dòng)或手動(dòng)觸發(fā)后,將相應(yīng)的配置文件中的數(shù)據(jù)以一定的格式通過操作系統(tǒng)和PCI總線傳遞到PCI卡中。如何從PCI總線上獲得數(shù)據(jù),以及把數(shù)據(jù)按照FPGA的配置時(shí)序要求加載到FPGA器件中是整個(gè)設(shè)計(jì)的關(guān)鍵。該設(shè)計(jì)采用了CPLD來解決這一關(guān)鍵問題。圖1所示為整個(gè)系統(tǒng)的架構(gòu)和各部分之間的邏輯關(guān)系。
與采用PCI接口芯片(如PCI9054)加單片機(jī)[3](或者加CPLD [4])的設(shè)計(jì)方案相比,只采用CPLD的方案使簡化了硬件電路,降低了成本,節(jié)省了PCB面積,而且數(shù)據(jù)傳輸通道的速度不受單片機(jī)處理速度和引腳數(shù)量的限制。
圖1 系統(tǒng)框架示意圖
2 硬件設(shè)計(jì)
這里介紹的設(shè)計(jì)中,選用一片Xilinx的CPLD,型號為XC95144XL,封裝為TQ100。
2.1 信號連接和PCB設(shè)計(jì)考慮
基本的PCI總線操作要求下列信號必須實(shí)現(xiàn):CLK,RST,F(xiàn)RAME,TRDY,IRDY,IDSEL,DEVSEL,AD[31:0],C/BE[3:0]。這些信號都應(yīng)連接到CPLD的I/O引腳上。其中,CLK應(yīng)該在CPLD的GCK引腳上實(shí)現(xiàn),時(shí)鐘信號線的長度應(yīng)控制在2.5 in左右;RST應(yīng)該在GSR引腳上實(shí)現(xiàn)。PRSNT[1:2]的兩個(gè)引腳至少應(yīng)有一個(gè)接地。建議使用四層PCB設(shè)計(jì)PCI卡,中間兩層應(yīng)為電源和地[5]。
2.2 PCI總線時(shí)序分析和接口設(shè)計(jì)
PCI總線的功能強(qiáng)大,協(xié)議復(fù)雜,要在一片CPLD上實(shí)現(xiàn)主從設(shè)備之間數(shù)據(jù)傳輸?shù)臅r(shí)序,需要有選擇地實(shí)現(xiàn)接口協(xié)議。該設(shè)計(jì)中采用讀寫配置寄存器的總線操作來傳輸數(shù)據(jù)。這種方式僅支持單數(shù)據(jù)周期,對CPLD的資源要求低,并且不占用計(jì)算機(jī)系統(tǒng)的地址空間。
在配置寫周期上,CPLD把總線上的數(shù)據(jù)鎖存到內(nèi)部寄存器中;在配置讀周期上,CPLD把內(nèi)部寄存器中的數(shù)據(jù)放置到總線上[5]。圖2和圖3分別為PCI總線上配置寫操作和配置讀操作的時(shí)序[6]。
圖2 PCI總線配置寫操作時(shí)序
在CPLD內(nèi)要實(shí)現(xiàn)兩個(gè)時(shí)序,PCI總線操作時(shí)序和FPGA配置時(shí)序。為此,在CPLD內(nèi)部設(shè)計(jì)了兩個(gè)狀態(tài)機(jī),分別命名為busstate和cfgstate。前者對應(yīng)于PCI總線操作,它可以在IDLE,ADDRESS,DECODE,PREPARE和LATCH五個(gè)狀態(tài)之間順序切換。在PCI總線空閑時(shí),狀態(tài)機(jī)處于IDLE狀態(tài)。當(dāng)狀態(tài)機(jī)在ADDRESS狀態(tài)時(shí),CPLD從地址/數(shù)據(jù)總線上獲得目標(biāo)寄存器的地址,從C/BE[3:0]上獲得操作類型編碼;當(dāng)狀態(tài)機(jī)在LATCH狀態(tài)時(shí),CPLD將地址/數(shù)據(jù)總線上的數(shù)據(jù)鎖存到內(nèi)部寄存器中,或者是將內(nèi)部數(shù)據(jù)放置到地址/數(shù)據(jù)總線上。在每一次總線操作中,狀態(tài)機(jī)根據(jù)握手信號的組合變化情況按順序切換。
圖3 PCI總線配置讀操作時(shí)序
根據(jù)PCI規(guī)范,一個(gè)合法的PCI目標(biāo)設(shè)備至少應(yīng)該實(shí)現(xiàn)以下幾個(gè)配置寄存器:供應(yīng)商識別碼寄存器(Vendor ID)、設(shè)備識別碼寄存器(Device ID)、版本號寄存器(Reversion ID)、分類識別碼寄存器(Class Code)。除此之外,該設(shè)計(jì)還實(shí)現(xiàn)了一個(gè)用于存放命令字、狀態(tài)字和數(shù)據(jù)的32位內(nèi)部寄存器如下:
State_regRdata_regCmd_regWdata_reg
24~311680
內(nèi)部寄存器是CPLD數(shù)據(jù)中轉(zhuǎn)的核心。PCI總線上的配置數(shù)據(jù)將先被存入Wdata_reg中,然后再寫入FPGA中;從FPGA中讀出的數(shù)據(jù)將先被寫入Rdata_reg中,然后再被投放到PCI總線上。軟件程序通過寫入命令字到Cmd_reg中,使CPLD執(zhí)行相應(yīng)的操作;通過查詢State_reg的內(nèi)容來獲知工作狀態(tài)。Cmd_reg和State_reg是軟件程序和CPLD相互配合的樞紐。
2.3 CPLD配置FPGA的時(shí)序分析和邏輯設(shè)計(jì)
FPGA器件的配置原理和基本方式都大同小異。這里以Xilinx的Spartan_IIE系列器件為例,有五種配置模式:從串(Slave Serial)、主串(Master Serial)、從并(Slave Parallel)、主并(Master Parallel)和JTAG模式[7]。其中,從并模式的數(shù)據(jù)寬度為8位,配置速度最快,數(shù)據(jù)格式簡單,適用于CPLD或者M(jìn)CU配置FPGA的場合,故采用這種方式。配置文件采用由Xilinx的綜合開發(fā)工具ISE自動(dòng)生成BIN格式文件,它全部由二進(jìn)制格式的配置數(shù)據(jù)構(gòu)成,易于軟件程序的處理和加載。
Spartan_IIE系列FPGA器件的正常配置過程包括四個(gè)步驟:啟動(dòng)配置、清除內(nèi)存、加載數(shù)據(jù)和器件啟動(dòng)。對FPGA的配置從Cmd_reg收到啟動(dòng)配置命令開始,CPLD立即給FPGA的PROGRAM引腳送去低脈沖,F(xiàn)PGA隨即會置低INIT信號,表明它已經(jīng)響應(yīng)了配置操作,并開始清除內(nèi)部SRAM[8]。FPGA完成清除配置內(nèi)存的工作后,將拉高INIT信號,此時(shí)CPLD會把這一狀態(tài)寫入State_reg中,供軟件程序查詢。接下來,軟件程序會把配置數(shù)據(jù)依次寫入Write_reg中,CPLD再把這些數(shù)據(jù)轉(zhuǎn)寫到FPGA中。在送完所有的配置數(shù)據(jù)后,還應(yīng)該給FPGA器件提供8個(gè)周期的時(shí)鐘信號,用于讓器件進(jìn)入執(zhí)行設(shè)計(jì)邏輯的用戶操作狀態(tài)。配置操作成功之后,F(xiàn)PGA會把DONE信號抬起,CPLD在檢測到DONE變高之后將會在State_reg中寫入表示配置成功的狀態(tài)字,供用戶程序查詢。否則,表明配置失敗。在成功配置FPGA后,原先用于配置操作的某些引腳(如WR,CS)隨即轉(zhuǎn)化為普通的I/O口,可用于傳輸用戶數(shù)據(jù)。
狀態(tài)機(jī)cfgstate用于協(xié)調(diào)CPLD對FPGA的配置操作和數(shù)據(jù)傳輸。該狀態(tài)機(jī)在以下七個(gè)狀態(tài)之間切換:空閑狀態(tài)(IDLE)、啟動(dòng)配置(INITIATE)、加載配置數(shù)據(jù)(LOADING)、啟動(dòng)FPGA器件(STARTUP)、向FPGA寫入類別碼和地址碼(OUTCTRL)、向FPGA寫入數(shù)據(jù)(OUTDATA)、從FPGA讀出數(shù)據(jù)(GETDATA)。兩個(gè)狀態(tài)機(jī)busstate和cfgstate聯(lián)系的橋梁是State_reg,Rdata_reg,Cmd_reg和Wdata_reg這4個(gè)寄存器。
3 軟件設(shè)計(jì)
3.1 底層驅(qū)動(dòng)
軟件程序的最基本操作是讀/寫PCI配置寄存器。在PC_AT架構(gòu)的系統(tǒng)中,這一操作轉(zhuǎn)化為對讀/寫兩個(gè)地址分別為0CF8h和0CFCh的I/O單元的操作。在Windows NT/2000/XP中,操作系統(tǒng)不允許用戶程序直接訪問I/O單元,因此借助于能夠打開操作系統(tǒng)I/O特權(quán)操作的庫WinIO。在它的支持下,用戶可以直接讀寫I/O端口[9]。在軟件程序中,WinIO充當(dāng)?shù)讓域?qū)動(dòng)程序。讀寫地址為0CF8H的CONFIG_ADDRESS方式如下:
ENRSVBUSDEVFUNREG00
3124~3016~2311~158~102~710
其中,EN(位31)是使能位,它用于確定何時(shí)把對CONFIG_DATA的訪問轉(zhuǎn)換為PCI總線上的配置訪問;RSV(位24~位30)是保留位;BUS(位16~位23)用于選擇系統(tǒng)中特定的PCI局部總線;DEV(位11~位15)用于選擇總線上的特定設(shè)備;FUN(位8~位10)在設(shè)備支持多功能的情況下,用于選擇設(shè)備的特定功能;REG(位2~位7)用于選擇設(shè)備配置空間的雙字;位1和位0是只讀位,且返回值必須為0[4]。
在設(shè)置好CONFIG_ADDRESS后,如果是讀PCI配置寄存器,用戶程序則調(diào)用WinIO的讀I/O函數(shù),從CONGIF_DATA(地址為0CFCH)讀出數(shù)據(jù),即為目標(biāo)寄存器的內(nèi)容;如果是寫PCI配置寄存器,用戶程序則調(diào)用WinIO的寫I/O函數(shù),將要寫入的用戶數(shù)據(jù)寫到CONFIG_DATA中即可。
為了便于編寫軟件程序,作者封裝了兩個(gè)函數(shù)用于讀寫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是目標(biāo)寄存器的地址;dwData是要寫入寄存器的數(shù)據(jù)。
3.2 應(yīng)用軟件的設(shè)計(jì)
由于PCI卡是即插即用(PnP)設(shè)備,因此PCI卡的地址空間是不固定的。為了訪問目標(biāo)配置空間,用戶程序首先應(yīng)該探測PCI卡所在總線序號(BusNo)和插槽的序號(DevNo)。探測的方法是:讓總線號在0~4之間變化,讓設(shè)備號在0~31之間變化,逐一讀取Vendor ID寄存器和Device ID寄存器,并與預(yù)先設(shè)定值相比較。當(dāng)發(fā)現(xiàn)到二者都吻合時(shí),記下此時(shí)的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設(shè)計(jì)一個(gè)軟件程序,包含如下六項(xiàng)功能:讀配置寄存器;寫配置寄存器;配置FPGA;從FPGA中讀數(shù)據(jù);向FPGA中寫數(shù)據(jù);退出程序。經(jīng)過調(diào)試,該軟件程序可以準(zhǔn)確無誤地讀/寫PCI卡上的配置寄存器,配置FPGA,傳輸用戶數(shù)據(jù)。設(shè)計(jì)者可以根據(jù)具體的應(yīng)用場合開發(fā)界面更美觀、功能更完善的軟件,但都應(yīng)包含以上六項(xiàng)功能。
4 結(jié) 語
采用CPLD通過PCI總線配置FPGA的設(shè)計(jì)方法已經(jīng)在筆者研制的帶有FPGA芯片的PCI卡上得以實(shí)現(xiàn)和應(yīng)用。實(shí)踐證明,這種設(shè)計(jì)能夠準(zhǔn)確、可靠、便捷地將配置數(shù)據(jù)加載到FPGA中,配置過程徹底軟件化。配置完成后,F(xiàn)PGA完全按照設(shè)計(jì)邏輯工作,結(jié)果與其他配置方式無異。在FPGA啟動(dòng)后,CPLD還可以擔(dān)負(fù)起主機(jī)和FPGA之間數(shù)據(jù)傳輸?shù)娜蝿?wù)[10],數(shù)據(jù)寬度為8 b時(shí),傳輸速度可達(dá)2.5 Mb/s。
參考文獻(xiàn)
[1]劉偉,孟憲元.FPGA在軟件無線電中的應(yīng)用[J].有線電視與網(wǎng)絡(luò),2001(1):69-71.
[2]喬建良,田思.基于MCU的CPLD/FPGA配置[J].現(xiàn)代電子技術(shù),2004,27(19):70-72.
[3]梅安華,田建生,劉歡.基于PCI總線FPGA配置系統(tǒng)的設(shè)計(jì)[J].計(jì)算機(jī)測量與控制,2005,13(4):375-377.
[4]梅安華,田建生,劉歡.基于總線靈活配置FPGA設(shè)計(jì)[J].電子技術(shù),2004(9):18-21.
[5]李貴山,陳金鵬.PCI局部總線及其應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2003
[6]Tom Shanley,Don Anderson.PCI System Architecture[M].4th Edition.Addison Wesley Longman Inc.,2000.
[7]Xilinx Inc.Spartan_IIE FPGA 數(shù)據(jù)手冊[Z].2004.
[8]李鵬,蘭巨龍.用CPLD和FLASH實(shí)現(xiàn)FPGA配置[J].電子技術(shù)應(yīng)用,2006(6):101-103.
[9]于朋飛,張?jiān)獫瑥堄兄?一種實(shí)現(xiàn)對PCI配置空間訪問的方法[J].山東大學(xué)學(xué)報(bào),2003,8(4):421-424.
[10]曾哲昱,葉衛(wèi)東.用CPLD實(shí)現(xiàn)PCI總線目標(biāo)接口[J].測控技術(shù),2002,21(1):45-47.
作者簡介
王元強(qiáng) 男,1980年出生,碩士研究生。研究方向?yàn)榍度胧较到y(tǒng)。
朱 為 男,碩士生導(dǎo)師,副教授。研究方向?yàn)榍度胧较到y(tǒng)、圖像處理與傳輸。