表 1
用5個32位寄存器buffer0..4[31:0]表示配置寄存器,由于有些字節(jié)可讀可寫,而有些字節(jié)只可讀,在設(shè)計中不同對待(AHDL代碼):
//IDSEL為片選信號,CBE為總線命令,AD[1:0]表示某類配置訪問,AD[7:6]對配置空間地址范圍進行限定。
在PCI卡設(shè)計過程中核心問題是配置空間的可靠設(shè)計,它的成功與否決定了用戶擴展卡能否被操作系統(tǒng)識別、能否"即插即用",決定著軟件驅(qū)動程序開發(fā)的方便程度。好的設(shè)計,能方便地應(yīng)用Windows標(biāo)準(zhǔn)控件來控制擴展卡的各種操作。
(2)I/O空間設(shè)計:本文中考慮到FPGA資源有限,設(shè)計了32個字節(jié)的I/O空間。地址可由系統(tǒng)開機自由分配,亦可通過改寫配置空間的基址寄存器人工分配。
在地址周期,若一設(shè)備被選為I/O空間訪問的目標(biāo),則滿足以下條件:
HitIo<=(CBE==4'b001x)&&( AD[15:6]==ioAddr)&&ioENA;
//其中ioENA== Buffer1[0]是I/O使能控制位, ioAddr=Buff4[15:6]是I/O空間的地址。
在數(shù)據(jù)周期,讀I/O時依據(jù)地址將iobuff[31:0]中數(shù)據(jù)直接讀出;寫I/O時,注意根據(jù)CBE[0]、CBE[1]、CBE[2]、CBE[3]的分別有效將AD[7:0]、AD[15:8]、AD[23:16]、AD[31:24]分別寫入iobuff[7:0],iobuff[15:8],iobuff[23:16],iobuff[31:24]。
(3)狀態(tài)機設(shè)計:協(xié)議指出,一旦FRAMEn信號有效,地址期就開始,并在第二個時鐘的上升沿處穩(wěn)定有效。地址期內(nèi)AD[31:0]上包含有效地址, CBEn[3:0]上含有有效命令;數(shù)據(jù)期從第三時鐘上升沿處開始,在此期間, AD[31:0]上傳送數(shù)據(jù),而CBEn[3:0]上是字節(jié)使能信號。從數(shù)據(jù)期開始一直到傳輸完成, CBEn的輸出緩沖器必須保持有效狀態(tài)。
所設(shè)計的狀態(tài)機結(jié)構(gòu)如圖1,圖中標(biāo)出了狀態(tài)轉(zhuǎn)變的條件,共有五個狀態(tài):
1)系統(tǒng)開機即進入復(fù)位狀態(tài),輸出引腳AD[31:0],DEVSELn,TRDYn,STOPn均為零。
2)時鐘上升沿時,進入起始狀態(tài),這時檢測FRAME信號是否有效(有效時!piFRAME && !riFRAME為高電平),若有效進入地址狀態(tài)。
3)在地址狀態(tài),計算配置空間和I/O空間的選中與否(HitConfig與HitIo),計算讀寫的選中與否(HitR <= !riCBE[0])。
4) 時鐘上升沿來時進入數(shù)據(jù)狀態(tài),將配置空間或I/O空間指定內(nèi)容寫入AD總線或總線內(nèi)容寫入指定寄存器, 并且有效DEVSELn,TRDYn,STOPn。
5)若IRDYn或HtConfig/HitIo不能持續(xù)有效((HitConfig||HitIo)&&piIRDY為高電平),則進入掛起狀態(tài),下一時鐘到來時又進入起始階段,檢測FRAMEn信號的有效與否。
本卡工作頻率為33MHz,時鐘周期為30ns ,所以對時序要求相當(dāng)嚴(yán)格,因此在設(shè)計中著重考慮了信號的匹配問題,分別設(shè)計了三到四級的信號緩沖。在狀態(tài)機設(shè)計中也充分考慮了接口芯片本身的時延,保證數(shù)據(jù)在采樣上升沿之前穩(wěn)定。
總之,PCI接口硬件設(shè)計是精細(xì)、復(fù)雜的工作,設(shè)計過程中的每一步驟都需要綜合考慮,一個細(xì)節(jié)的遺漏都將導(dǎo)致整個系統(tǒng)工作的錯誤或不穩(wěn)定。本文綜合考慮了工作速度,芯片時延問題,資源的占用情況,引腳的使用等,使用了ALTERA公司ACEX1K系列的EP1K50QC208-2芯片進行設(shè)計。在本卡上能夠穩(wěn)定工作,設(shè)計就基本成功了。將硬件程序下載入FPGA器件,即可用軟件命令進行系統(tǒng)通訊。
2.3、軟件設(shè)計及系統(tǒng)驗證
硬件電路的設(shè)計只提供了接口工作的內(nèi)核和基礎(chǔ),只有在軟件的控制下,接口才能發(fā)揮作用,硬件電路與軟件程序是緊密相關(guān)的。在了解了微機系統(tǒng)與接口電路通訊的工作原理之下,筆者分析并設(shè)計了相應(yīng)的接口控制程序。
配置機制使用兩個雙字I/O地址 , 第一個雙字是CONFIG_ADDRESS(地址為CF8H),是可讀可寫寄存器 ;第二個雙字是CONFIG_DATA(地址為CFCH)。
將要訪問寄存器的總線號、設(shè)備號、功能號和寄存器號以一個雙字的格式寫到配置地址端口 (CF8H-CFBH),并鎖存在CF8H,接著執(zhí)行配置數(shù)據(jù)端口 (CFCH)的讀和寫,向配置數(shù)據(jù)口寫數(shù)據(jù)即向配置空間寫數(shù)據(jù),從配置數(shù)據(jù)口讀數(shù)據(jù)即從配置空間讀數(shù)據(jù)。
本文編寫程序進行配置空間的讀寫,使用了微機的10號槽口,在DOS下輸入如下命令:PCICONF 10 4 FFFFFFFF(指將全1寫入10號槽口4號寄存器(即基址寄存器)),輸出顯示為:
通過寫入全1的返回值得知映射25=32位的I/O空間(讀出數(shù)據(jù)化為二進制有5個零)。本設(shè)計中系統(tǒng)復(fù)位時Buff1[0]的值為1,表示定義了I/O空間,可手動改寫進行控制。頭標(biāo)區(qū)其他可改寫參數(shù)亦可由上述命令操作。
I/O空間的讀寫:系統(tǒng)開機時,基址寄存器讀出的值為0000E401,即系統(tǒng)為I/O空間配置的地址從E400開始。當(dāng)Buff1[0]值為1時表示可使用I/O空間。此時在DOS下使用DEBUG命令對I/O空間進行讀寫:

退出DEBUG命令后,修改配置空間4號寄存器的值為2400,再進入DEBUG命令,可看到原來存入E400的數(shù)據(jù)現(xiàn)在的地址是2400,表示I/O空間的地址已手工改動。
筆者設(shè)計的接口軟件主要解決了三個問題:一是主機系統(tǒng)與接口電路之間的軟件配合,二是接口電路和主機系統(tǒng)完成的配置空間的讀寫功能。三是接口系統(tǒng)總體軟件設(shè)計中的一些技術(shù)。
2.4、設(shè)計經(jīng)驗
本文選用Altera公司EP1K50QC208_2作為目標(biāo)器件,用Verilog語言描述了整個設(shè)計,并在MUX+plus II開發(fā)系統(tǒng)中完成整個設(shè)計的輸入、功能仿真、時序仿真,最后生成編程文件,并通過軟件進行了驗證,本設(shè)計中,有許多細(xì)節(jié)都需注意:
(1)當(dāng)開發(fā) PCI設(shè)備時或訪問 PCI設(shè)備時,如須訪問設(shè)備空間,一定要先置 CONFIG-ADDRESS的BIT3 1為 1。否則會被禁止訪問;
(2)PCI總線對時序要求很高,并且負(fù)載低,所以接口設(shè)計中根據(jù)情況加緩沖,以提高負(fù)載和信號的匹配;
(3)本設(shè)計中只使用了FPGA芯片中部分引腳,但是對于不使用的管腳,在top文件中仍需進行定義,統(tǒng)一定義為輸入即可;
(4)PCI系統(tǒng)的設(shè)備號實際上對應(yīng)于不同的槽口號,本設(shè)計使用了10號槽;
(5)PCI插槽有些支持33MHZ有些支持66MHZ,66MHZ的插槽僅支持3.3V電壓,不支持5V.兩種插槽的區(qū)別是在方向上不同,相差180度。本文設(shè)計的是+5v的卡,但使用+3.3V工作電壓的FPGA芯片可以適用+5V規(guī)范并能夠正常工作。原因是PCI總線的信號驅(qū)動是采用反射波方式,PCI總線驅(qū)動器僅把信號電平驅(qū)動至2.5V,依靠反射波疊加形成駐波便可達(dá)到規(guī)定的+5V信號電平[參考文獻(xiàn)5];
(6)板卡設(shè)計中由于驅(qū)動采用反射波方式,能力弱,靜態(tài)電流小,所以板卡上每條信號線只能有一個門電路負(fù)載掛接。
3、結(jié)束語
PCI總線以其優(yōu)異的特性解決了外設(shè)和主機之間的數(shù)據(jù)傳輸瓶頸問題,為許多外設(shè)的應(yīng)用提供了廣闊的應(yīng)用背景。
本文通過對PCI規(guī)范2.0和計算機接口技術(shù)的深入研究 ,對PCI接口的軟硬件進行初步的系統(tǒng)設(shè)計。它實現(xiàn)了Plug&Play,且硬件運行切實可靠。結(jié)果證明,本設(shè)計實現(xiàn)簡單,設(shè)計緊湊,升級方便,管腳占用少,資源使用率低,具有很高的實用與推廣價值。在本設(shè)計的基礎(chǔ)上,可以繼續(xù)實現(xiàn)猝發(fā)傳輸,中斷控制等其他功能,進行不斷完善,具有很大的擴展空間。






