摘 要: 介紹了一種基于PCI總線的測控板卡的設(shè)計,使用PCI9054實(shí)現(xiàn)總線控制,利用FPGA實(shí)現(xiàn)測控板卡的發(fā)送邏輯、接收邏輯和數(shù)據(jù)緩沖功能,并采用了乒乓FIFO;最后給出了用WinDriver編寫設(shè)備驅(qū)動程序的方法。
關(guān)鍵詞: PCI9054 FPGA 狀態(tài)機(jī) 乒乓FIFO WinDriver
PCI總線是一種高性能的局部總線,它具有32/64位總線寬度,且總線地址和數(shù)據(jù)復(fù)用,支持猝發(fā)傳輸,傳輸速率高達(dá)132MB/s;同時可支持多組外圍設(shè)備。另外,PCI總線不依賴于熱和CPU,具有較好的兼容性。
近幾年來,現(xiàn)場可編程門陣列(FPGA)在現(xiàn)代電子設(shè)計中的成功應(yīng)用,使充分利用FPGA的本身資源設(shè)計專用電路,完成系統(tǒng)功能成為可能,從而簡化了電路、縮小了體積、提高了穩(wěn)定性、具有更大的靈活性。
基于這種設(shè)計思想,筆者利用FPGA和PCI總線接口芯片設(shè)計了一種測控電路板卡,經(jīng)實(shí)際運(yùn)行,效果很好。
1 系統(tǒng)結(jié)構(gòu)與功能
本板卡為基于PCI總線,采用RS485電平傳輸?shù)漠惒酱型ㄐ艤y控卡。它與PCI總線的協(xié)議部分采用PCI9054專用接口芯片來完成。PCI9054是由美國PLX公司生產(chǎn)的一款高性能PCI I/O加速器,它采用了先進(jìn)的32位數(shù)據(jù)管道結(jié)構(gòu)技術(shù),支持復(fù)用/非復(fù)用的32位數(shù)據(jù)/地址總線,本地總線有三種模式可選:M、C、J模式,被廣泛應(yīng)用于PCI總線板卡的開發(fā)中。在本設(shè)計中,PCI9054工作在C模式下,采用中斷方式,總線周期為 “PCI目標(biāo)讀單周期" title="單周期">單周期”和“PCI目標(biāo)寫單周期”,數(shù)據(jù)總線為8位。
異步串行通信電路部分完全用FPGA來實(shí)現(xiàn)。在設(shè)計上,筆者選用了Xilinx公司的SpartanⅡ系列的XC2S200來實(shí)現(xiàn)異步串行通信的接收、發(fā)送和接口控制功能,F(xiàn)PGA具有在線可編程能力,設(shè)計者可根據(jù)實(shí)際需求分配資源。
測控卡的通信協(xié)議為起止式協(xié)議,采用固定的幀格式:1位開始位、8位數(shù)據(jù)位、1位停止位,無奇偶校驗位,在軟件中采用統(tǒng)一的CRC校驗,傳輸波特率為19.2kbps。為保證接收數(shù)據(jù)" title="接收數(shù)據(jù)">接收數(shù)據(jù)的正確性,設(shè)計中采用16倍頻波特率作為接收采樣時鐘,并把第八個采樣值作為接收數(shù)據(jù)。
測控卡主要完成以下工作:采用RS485差分電平傳輸?shù)倪b測數(shù)據(jù)經(jīng)過電平轉(zhuǎn)換后,由接收模塊" title="接收模塊">接收模塊接收后乒乓緩存到FIFO中,并通過PCI總線接口芯片PCI9054以單周期方式送到計算機(jī)內(nèi)存中以便進(jìn)行下一步處理。發(fā)送模塊" title="發(fā)送模塊">發(fā)送模塊接收到PCI總線傳輸過來的遙控命令后,按照通信協(xié)議格式組幀,在通過電平轉(zhuǎn)換芯片轉(zhuǎn)換成RS485電平后,以19.2kHz的頻率發(fā)送給目標(biāo)設(shè)備,實(shí)現(xiàn)對目標(biāo)設(shè)備的各種控制。
根據(jù)以上分析,筆者設(shè)計的測控卡的具體功能結(jié)構(gòu)如圖1所示。下面詳細(xì)闡述各部分的功能。
·MAX3490E:完成RS485差分電平到TTL電平的轉(zhuǎn)換;
·接收模塊:完成遙測數(shù)據(jù)的接收和緩沖;
·發(fā)送模塊:完成遙控數(shù)據(jù)的緩沖和發(fā)送;
·接口模塊:實(shí)現(xiàn)與PCI9054的接口功能,完成讀寫和傳輸控制操作;
·PCI9054:完成和PCI 總線的接口協(xié)議。
1.1 發(fā)送模塊設(shè)計
發(fā)送模塊主要實(shí)現(xiàn)對遙控數(shù)據(jù)的緩存和并/串轉(zhuǎn)換,同時按照設(shè)計的異步串行通信數(shù)據(jù)幀格式進(jìn)行相應(yīng)的處理,最后將數(shù)據(jù)串行發(fā)送。處理器讀取線路狀態(tài)寄存器信息,檢查發(fā)送FIFO(TxFifo)是否為空,如為空且有遙控數(shù)據(jù)待發(fā),則將遙控數(shù)據(jù)通過PCI9054發(fā)送并存儲到發(fā)送FIFO中。發(fā)送狀態(tài)機(jī)讀取TxFifo中數(shù)據(jù),通過并/串移位后用19.2kbps的波特率串行輸出。發(fā)送狀態(tài)機(jī)實(shí)現(xiàn)起止位“0”、并/串移位信號、停止位“1”的發(fā)送,具體如圖2 所示。
開始:當(dāng)移位寄存器" title="移位寄存器">移位寄存器空,發(fā)送模塊處于等待開始狀態(tài),一旦檢測到非空,發(fā)送起始位“0”,狀態(tài)機(jī)進(jìn)入移位狀態(tài);
移位:通過并/串移位寄存器串行發(fā)出,當(dāng)完成8bit 移位后,狀態(tài)機(jī)轉(zhuǎn)入停止?fàn)顟B(tài);
停止:在這個狀態(tài),為發(fā)送的數(shù)據(jù)加上一位停止位,然后轉(zhuǎn)入開始狀態(tài),等待下一個數(shù)據(jù)。
發(fā)送模塊包含8位并/串移位寄存器TSR、51×8 bits發(fā)送FIFO(TxFifo)、用于實(shí)現(xiàn)發(fā)送遙控數(shù)據(jù)計數(shù)的52計數(shù)器等。發(fā)送模塊內(nèi)部電路結(jié)構(gòu)如圖3所示。
1.2 接收模塊設(shè)計
接收模塊實(shí)現(xiàn)遙測數(shù)據(jù)的串/并轉(zhuǎn)換,同時完成起始位、停止位的識別捕獲及遙測數(shù)據(jù)的緩存。由于本設(shè)計中由設(shè)備每100ms定時發(fā)送一幀(181字節(jié))接收數(shù)據(jù),當(dāng)FIFO產(chǎn)生滿標(biāo)志時,將耗時(181×(8+2)/19200)ms,即約95ms,僅剩5ms左右的時間讓PC機(jī)響應(yīng),由于操作系統(tǒng)的特點(diǎn),不能充分滿足PC機(jī)的響應(yīng)時間,這會造成接收數(shù)據(jù)混亂。為保證PC機(jī)所需的響應(yīng)時間和數(shù)據(jù)的正確性和實(shí)時性,筆者使用了兩個滿標(biāo)志為181的接收FIFO進(jìn)行乒乓切換,收到良好的效果。
接收模塊包含8位串/并移位寄存器、兩個滿標(biāo)志為181的接收FIFO(RxFifo、RxFifo_Cache)、采樣電路、捕獲電路、讀寫通道選擇電路和移位計數(shù)器電路。其中,采樣比較電路采樣起始信號、數(shù)據(jù)信號和結(jié)束標(biāo)志,通道選擇電路用來對FIFO乒乓切換讀寫通道進(jìn)行選擇。接收模塊內(nèi)部結(jié)構(gòu)如圖4所示。采樣電路、捕獲電路在采樣捕獲到起始信號“0”后根據(jù)通信協(xié)議接收串行數(shù)據(jù),經(jīng)過串/并移位后乒乓存儲到FIFO中,由PCI9054根據(jù)滿、空信號乒乓讀取。
1.3 接口模塊設(shè)計
接口模塊主要實(shí)現(xiàn)PCI9054和接收、發(fā)送模塊的通信,包括傳輸控制邏輯、時鐘分頻控制,筆者根據(jù)PCI9054的單周期讀寫時序給出了各類寄存器的讀寫信號、總線響應(yīng)信號、控制信號等。該模塊含有五個寄存器:接收FIFO寄存器(RFR)、發(fā)送FIFO寄存器(TFR)、線路控制狀態(tài)寄存器(LCSR)、中斷標(biāo)識寄存器(IIR)和中斷使能寄存器(IER)。具體說明如下: ·LCSR:通過讀該寄存器獲取各個FIFO的狀態(tài)信號(置1有效,0無效)。LCSR格式如下:
TxFifocompleted:數(shù)據(jù)傳輸完成(1完成,0未完成);
TxFifoEmpty:發(fā)送FIFO寄存器空(1空,0非空);
TxFifoFull:發(fā)送FIFO寄存器滿(1滿,0未滿);
RxFifoEmpty:接收FIFO寄存器空(1空,0非空);
RxFifoFull:接收FIFO寄存器滿(1滿,0未滿)。
·IIR:通過讀取該寄存器獲得中斷類型。IIR格式如下:
0100(int0):接收FIFO(RxFIFO)滿中斷;
0010(int1):發(fā)送FIFO(TxFIFO)空中斷;
0001(idle):無中斷。
·IER:可以通過寫該寄存器相應(yīng)位使能或取消中斷。IER格式如下:
TxFifoI:發(fā)送FIFO空中斷使能 (1允許,0禁止);
RxFifoI:接收FIFO滿中斷使能(1允許,0禁止)。
中斷產(chǎn)生由接口中斷狀態(tài)機(jī)實(shí)現(xiàn),具體如圖5所示。
空閑:空閑狀態(tài),沒有中斷產(chǎn)生;
中斷int0:接收FIFO(RFR)滿,產(chǎn)生中斷,要求PCI9054響應(yīng);
中斷int1:發(fā)送FIFO(TFR)空,產(chǎn)生中斷,要求PCI9054寫入數(shù)據(jù)或讀取中斷標(biāo)識寄存器IIR。
2 驅(qū)動程序的開發(fā)
驅(qū)動程序主要是完成對硬件板卡的內(nèi)存映像地址、I/O地址的存取,并正確處理來自板卡的硬件中斷。與傳統(tǒng)開發(fā)設(shè)備驅(qū)動程序的方法不同,WinDriver不要求開發(fā)者非常熟悉操作系統(tǒng)平臺,掌握核心開發(fā)/調(diào)試知識等;并且WinDriver設(shè)備驅(qū)動程序工具包將驅(qū)動程序的開發(fā)作了最大的簡化,它為開發(fā)人員提供了功能全面的API函數(shù)。開發(fā)人員只要根據(jù)硬件板卡功能的需要調(diào)用所需的函數(shù)即可。本測控卡驅(qū)動程序需要完成設(shè)備的初始化、FIFO的讀寫等,筆者選擇相應(yīng)的函數(shù)將其封裝成一個測控卡驅(qū)動類,并加以例化,供應(yīng)用程序調(diào)用,即很好地實(shí)現(xiàn)了硬件功能。
利用專用PCI總線接口芯片可以實(shí)現(xiàn)完整的PCI主控模塊和目標(biāo)模塊接口功能,將復(fù)雜的PCI總線接口轉(zhuǎn)換為相對簡單的用戶接口,避免了用戶直接面對復(fù)雜的PCI總線協(xié)議,降低了設(shè)計難度。利用FPGA設(shè)計自己需要的專用電路,具有極大的靈活性,設(shè)計者可以根據(jù)實(shí)際的需要,在FPGA資源允許的條件下對設(shè)計進(jìn)行優(yōu)化擴(kuò)展。譬如筆者在設(shè)計過程當(dāng)中,利用FIFO實(shí)現(xiàn)了數(shù)據(jù)緩存,并根據(jù)數(shù)據(jù)的實(shí)際長度加大了FIFO的深度,有效地降低了中斷次數(shù)或查詢次數(shù);同時,F(xiàn)IFO的乒乓切換很好地滿足了PC機(jī)所需的響應(yīng)時間,保證了接收數(shù)據(jù)的正確性,對整個系統(tǒng)起到優(yōu)化作用。利用WinDriver 開發(fā)驅(qū)動程序,簡單實(shí)用,縮短了開發(fā)周期。
參考文獻(xiàn)
1 李圣怡,戴一帆,王憲平.Windows環(huán)境下軟硬件接口技術(shù)[M].長沙:國防科技大學(xué)出版社,2001
2 李貴山,陳金鵬.PCI 局部總線及其應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2003
3 葉玉明,姚伯威,彭 衛(wèi).基于PCI總線數(shù)據(jù)采集系統(tǒng)研究[J].中國測試技術(shù),2003(1):47~48
4 PCI9054 Datasheet [M]. USA:PLX Corp,2001