張磊
(中國(guó)兵器工業(yè)二〇六研究所 陜西 西安 710100)
外部器件互聯(lián)總線即PCI總線,是Intel公司提出的將高速高帶寬的外圍功能移到靠近CPU的地方,并通過(guò)一個(gè)系統(tǒng)接口(主橋路)與處理器/存儲(chǔ)器連接的“局部總線”解決方案[1]。隨著集成技術(shù)突飛猛進(jìn)地發(fā)展,如今工業(yè)、軍事領(lǐng)域中使用的計(jì)算機(jī)正逐步向著微型化、超低功耗、超大規(guī)模集成的片上系統(tǒng)發(fā)展,越來(lái)越多的功能被集成到一個(gè)或數(shù)個(gè)芯片上,并能可靠地工作。新技術(shù)不僅使計(jì)算機(jī)的功能越發(fā)強(qiáng)大,同時(shí)功耗降低,體積縮小、在開(kāi)發(fā)和調(diào)試中令開(kāi)發(fā)者擺脫了底層繁冗的重復(fù)開(kāi)發(fā),縮短了開(kāi)發(fā)周期,降低了開(kāi)發(fā)成本。
文中在考慮到硬件產(chǎn)品的通用性,保證其功能和速度的前提下,兼顧體積、功耗、易用性,我們選用定制方式將計(jì)算機(jī)模塊和大規(guī)模可編程器件FPGA作在一塊印制板上。省去了大量的分立電路,降低了故障率,也使實(shí)控機(jī)的功能擴(kuò)充更加容易。
實(shí)控機(jī)系統(tǒng)由計(jì)算機(jī)、FPGA及接口電路組成,只作為一塊6U標(biāo)準(zhǔn)電路板。計(jì)算機(jī)模塊本身?yè)碛?個(gè)網(wǎng)口,2個(gè)USB2.0接口,8 個(gè) RS422 串口(COM1~COM8),波特率可達(dá) 921.6 kbps,因此,我們可以分別使用COM3~COM8分別和各不需要高速通信的分系統(tǒng)模塊進(jìn)行通訊。本實(shí)控機(jī)的操作系統(tǒng)使用VxWorks操作系統(tǒng),網(wǎng)口和主機(jī)連接用于調(diào)試和加載程序,板上使用2 G的電子盤(pán)作為操作系統(tǒng)及應(yīng)用軟件的存儲(chǔ)設(shè)備。
通過(guò)計(jì)算機(jī)PCI總線擴(kuò)充了一片大容量的FPGA,引到連接器的I/O線多達(dá)160根。在這片F(xiàn)PGA里,實(shí)現(xiàn)的主要功能模塊有:I/O系統(tǒng)、定時(shí)系統(tǒng)、4個(gè)高速串口以及對(duì)自制定時(shí)信號(hào)的處理,其中I/O系統(tǒng)用于輸出控制和狀態(tài)輸入,定時(shí)系統(tǒng)用于系統(tǒng)定時(shí),4個(gè)8 Mbit/s同步串口分別于其他各分系統(tǒng)進(jìn)行通訊。由于使用大容量FPGA,可完全滿足一般系統(tǒng)對(duì)實(shí)控機(jī)的功能要求以及后續(xù)的功能擴(kuò)充。
實(shí)控機(jī)板上有IDE接口用于連接外擴(kuò)硬盤(pán)和光驅(qū),PS/2接口用于連接鍵盤(pán)和鼠標(biāo),DB-15接口用于連接顯示器,兩個(gè)USB接口用于連接USB設(shè)備,一個(gè)備用的網(wǎng)口,以及復(fù)位鍵、電池等都放到面板上方便使用。系統(tǒng)原理圖如圖1所示。
圖1 實(shí)控機(jī)系統(tǒng)原理圖Fig.1 Principle scheme of RTC
目前開(kāi)發(fā)PCI接口大體有兩種方式,一是使用專用的PCI接口芯片,可以實(shí)現(xiàn)完整的PCI主控模塊和目標(biāo)模塊接口功能,將復(fù)雜的PCI總線接口轉(zhuǎn)換為相對(duì)簡(jiǎn)單的用戶接口。用戶只要設(shè)計(jì)轉(zhuǎn)換后的總線接口即可,縮短了開(kāi)發(fā)周期,缺點(diǎn)是用戶可能只用到部分PCI接口功能,這樣造成了一定的邏輯資源浪費(fèi),也缺乏靈活性,很可能增加板上的組件,導(dǎo)致產(chǎn)品成本的增加和可靠性的降低。二是使用可編程器件,采用FPGA的優(yōu)點(diǎn)在于其靈活的可編程性,首先PCI接口可以依據(jù)插卡功能進(jìn)行最優(yōu)化,而不必實(shí)現(xiàn)所有的PCI功能,這樣可以節(jié)約系統(tǒng)的邏輯資源[2]。而且,用戶可以將PCI插卡上的其他用戶邏輯與PCI接口邏輯集成在一個(gè)芯片上,實(shí)現(xiàn)緊湊的系統(tǒng)設(shè)計(jì)。當(dāng)系統(tǒng)升級(jí)時(shí),只需對(duì)可編程器件重新進(jìn)行邏輯設(shè)計(jì),而無(wú)需更新PCB版圖[3]。
文中采用FPGA進(jìn)行實(shí)控機(jī)接口模塊的開(kāi)發(fā),實(shí)控機(jī)接口控制模塊作為一個(gè)轉(zhuǎn)換接口,工作于PCI總線與目標(biāo)設(shè)備串口之間,完成兩者間的數(shù)據(jù)傳送。文中所選用的芯片是Xilinx公司的Virtex-5系列的5vlx30tff665,編寫(xiě)、仿真軟件采用的Active-HDL,編譯軟件采用的是ISE 10.1 Service Pack 3,語(yǔ)言采用混合語(yǔ)言編程。
圖2為實(shí)控機(jī)接口模塊總體框圖,分為用戶應(yīng)用模塊(USER APP),多路選擇器(MUX),串口模塊(RS),控制寄存器(CTL_REG),中斷共享(Int share)和定時(shí)器(TIMER)。 在USER APP中控制對(duì)PCI IP Core的調(diào)用,多路選擇器用于選擇讀取哪一路串口的數(shù)據(jù),控制寄存器用于控制各串口是否允許發(fā)送以及各定時(shí)器是否允許定時(shí)。文中將對(duì)PCI模塊和串口模塊的設(shè)計(jì)進(jìn)行詳細(xì)敘述。
圖2 接口模塊框圖Fig.2 Interface module
2.1.1 IP Core的調(diào)用與配置
3.1 本次試驗(yàn)顯示每隔6天輸精一次受精率最高,間隔8天輸精一次受精率最低。分析原因認(rèn)為精子在母雞體內(nèi)一般存活6~7天,因此6天輸精一次受精率較高。
Xilinx提供了大量的IP core供用戶使用[4],例如pci32_V4.8就是32位的PCI Initiator/Target接口的LogiCORE IP product,共有3個(gè)基地址寄存器。文中調(diào)用的IP Core采用的是PCI Target模式,只調(diào)用第一個(gè)基地址寄存器:BAR_0。
PCI總線定義了3種物理地址空間,分別是存儲(chǔ)地址空間,I/0地址空間和配置地址空間。配置空間是PCI所特有的一種空間,其目的在于提供一套適當(dāng)?shù)呐渲么胧?,使之滿足現(xiàn)行的和可預(yù)見(jiàn)的系統(tǒng)配置機(jī)構(gòu)。配置空間是一長(zhǎng)度為256字節(jié)并且有特定記錄結(jié)構(gòu)的地址空間,可以在系統(tǒng)自舉時(shí)訪問(wèn),也可在其他時(shí)間訪問(wèn)。通過(guò)配置寄存器,配置軟件可了解目標(biāo)設(shè)備的存在、功能及配置要求:
1)廠商ID:此16位的只讀寄存器定義了設(shè)備的生產(chǎn)廠商,文中使用Xilinx的默認(rèn)ID值10EE;
2)設(shè)備ID:該值由生產(chǎn)廠商分配以識(shí)別其產(chǎn)品,文中設(shè)置為0050;
3)命令寄存器,此寄存器控制了設(shè)備響應(yīng)PCI訪問(wèn)的能力,位0為I/O空間控制,位1為存儲(chǔ)空間控制。文中采用I/O空間訪問(wèn),因此我們?cè)谂渲妹罴拇嫫鞯臅r(shí)候需要在配置空間頭標(biāo)區(qū)04H處寫(xiě)入000 000 01,來(lái)實(shí)現(xiàn)I/O空間操作。
4)狀態(tài)寄存器。狀態(tài)寄存器用于記錄 PCI總線有關(guān)事件的狀態(tài)信息。該設(shè)備可以根據(jù)自己的功能來(lái)決定實(shí)現(xiàn)狀態(tài)寄存器的那些位,不一定要實(shí)現(xiàn)所有的位。
圖3 命令寄存器格式Fig.3 Command register state bits format
圖4 狀態(tài)寄存器格式Fig.4 Status register state bits format
5)基地址寄存器:加電軟件在引導(dǎo)操作系統(tǒng)之前,必須要建立一個(gè)統(tǒng)一的地址映射,也就是說(shuō)必須確定在系統(tǒng)中有多少存儲(chǔ)器以及系統(tǒng)中的I/O控制器要求多少地址空間。當(dāng)這些信息確定后,加電軟件便把存儲(chǔ)器和 I/O地址請(qǐng)求映射到合理的地址空間并引導(dǎo)系統(tǒng)。為了使這種映射能夠作到與相應(yīng)的設(shè)備無(wú)關(guān),從而在配置空間的頭標(biāo)區(qū)中安排了一個(gè)供映射時(shí)使用的基址寄存器?;刂芳拇嫫髦饕袃煞N作用:一個(gè)作用是存放存儲(chǔ)器空間或 I/O空間基地址;另一個(gè)作用確定I/O或者存儲(chǔ)器空間的長(zhǎng)度。基地址寄存器根據(jù)存放于其中的數(shù)據(jù)來(lái)判斷數(shù)據(jù)類型,位0為只讀位,用來(lái)決定是存儲(chǔ)器空間還是I/O空間,如果該位為0,則是映射到存儲(chǔ)器空間;否則若為1,表示映射到 I/O空間,本文設(shè)置為1。
圖5 配置訪問(wèn)Fig.5 Configuration accessing
文中利用I/O地址空間進(jìn)行數(shù)據(jù)傳輸,因此需要在命令寄存器內(nèi)寫(xiě)入01,圖6為配置寫(xiě)操作,在地址04H寫(xiě)入000 000 01,之后,讀出04H地址的數(shù)據(jù)進(jìn)行驗(yàn)證,讀出數(shù)值為?20?00 01,最低位為1,符合I/O地址空間傳輸要求。
圖6 配置命令寄存器Fig.6 Config command register state bits
2.1.2 I/O傳輸控制
調(diào)用IP Core的文件完后,需要編寫(xiě)USER APP對(duì)IP Core進(jìn)行控制。在文中將采用I/O地址空間進(jìn)行數(shù)據(jù)傳輸,因此文中首先要對(duì)I/O地址空間數(shù)據(jù)傳輸進(jìn)行譯碼操作,下列程序即是判斷所使用的基地址寄存器和對(duì)BAR_0讀寫(xiě)狀態(tài)的譯碼:
在調(diào)用IP Core的時(shí)候只選擇了BAR_0,所以BASE_HIT(0)=1;S_WRDN是IP核內(nèi)部的一個(gè)輸入信號(hào),高電平代表寫(xiě)入,低電平代表讀出;S_DATA是數(shù)據(jù)是否在傳輸?shù)臓顟B(tài)信號(hào)。
因?yàn)槲闹幸B接4個(gè)串行接口,因此需要在USERAPP中加入一個(gè)多路選擇器,對(duì)串口輸入至PCI總線的數(shù)據(jù)進(jìn)行選擇,根據(jù)PCI總線上的地址判斷與哪一個(gè)串口進(jìn)行通信,讀操作時(shí),選擇信號(hào)與PCI總線上的地址ADDR、基地址寄存器的讀狀態(tài)PCI_BAR0_RD以及數(shù)據(jù)傳輸狀態(tài)S_DATA有關(guān);寫(xiě)操作時(shí),寫(xiě)使能信號(hào)必須在一個(gè)時(shí)鐘周期內(nèi)完成,因此它與PCI總線上的地址ADDR、基地址寄存器的寫(xiě)狀態(tài)PCI_BAR0_WR以及數(shù)據(jù)傳輸狀態(tài)有效位S_DATA_VLD有關(guān)。
在圖7中,CBE為2時(shí),執(zhí)行I/O讀操作,此時(shí)PCI總線地址為4,生成串口三的片選rs3_cs信號(hào),PCI總線上輸出輸入信號(hào)PCI_DATA_IN為452 247 72;CBE為3時(shí),執(zhí)行I/O寫(xiě)操作,此時(shí)PCI總線地址為1,生成串口一的寫(xiě)使能rs1_wr_en信號(hào),PCI發(fā)送到串口一的數(shù)據(jù)PCI_DATA_OUT1為000 402 34。
圖7 I/O讀寫(xiě)操作Fig.7 I/O write and read operation
PCI數(shù)據(jù)是并行數(shù)據(jù),通過(guò)FPGA發(fā)送到串口必須要轉(zhuǎn)換成串行數(shù)據(jù),因此我們需要在FPGA內(nèi)產(chǎn)生一個(gè)移位寄存器和FIFO,實(shí)現(xiàn)串行數(shù)據(jù)同并行數(shù)據(jù)的相互轉(zhuǎn)化。FIFO仍然使用Xilinx公司ISE中所提供的IP Core—fifo generator v4.4[5]。
首先調(diào)用FIFO IP Core并對(duì)其進(jìn)行設(shè)置,文中對(duì)FIFO的讀寫(xiě)時(shí)鐘不同,因此時(shí)鐘采用獨(dú)立時(shí)鐘模式,存儲(chǔ)方式采用Block Ram模式;讀方式采用First-Word Fall-Through;讀寫(xiě)時(shí)的FIFO寬度均為32,深度1 025;不選擇Almost Full和Almost Empty標(biāo)志接口,不選擇Prog_full和Prog_empty標(biāo)志接口;不添加計(jì)數(shù)器接口;不選擇握手。
根據(jù)串口數(shù)據(jù)規(guī)范,串口在無(wú)數(shù)據(jù)時(shí)始終保持高電平,數(shù)據(jù)的開(kāi)始是以一個(gè)時(shí)鐘的低電平開(kāi)始,數(shù)據(jù)結(jié)束時(shí)至少為一個(gè)時(shí)鐘的高電平,因此在設(shè)計(jì)移位寄存器時(shí)要注意這一點(diǎn)。由于收發(fā)數(shù)據(jù)的邏輯是不同的,因此串口模塊根據(jù)數(shù)據(jù)的流向不同分為發(fā)送至串口模塊和接收串口數(shù)據(jù)模塊兩部分。
接收串口模塊是為實(shí)現(xiàn)接收串行輸入數(shù)據(jù)并發(fā)送到PCI總線的功能,因此接收模塊的移位寄存器是將串行數(shù)據(jù)轉(zhuǎn)換成并行數(shù)據(jù),在此模塊中可以通過(guò)一些參數(shù)設(shè)置數(shù)據(jù)的長(zhǎng)度和寬度,接收移位寄存器狀態(tài)機(jī)圖如圖8所示。數(shù)據(jù)首先由串口寫(xiě)入,在移位寄存器中進(jìn)行串—并轉(zhuǎn)換,在接收完符合規(guī)定長(zhǎng)度的串行信號(hào)后,移位寄存器發(fā)送一個(gè)時(shí)鐘周期的寫(xiě)使能信號(hào)給FIFO,將轉(zhuǎn)換后的數(shù)據(jù)寫(xiě)入FIFO,當(dāng)FIFO接收到PCI總線發(fā)送的讀使能信號(hào)后,由PCI總線讀走FIFO內(nèi)的數(shù)據(jù)。
圖8 接收移位寄存器Fig.8 Receive shift register
發(fā)送串口模塊是為實(shí)現(xiàn)將PCI總線輸入的并行數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù)后輸出的功能,同樣可以在此模塊上通過(guò)參數(shù)設(shè)置數(shù)據(jù)的長(zhǎng)度和寬度,發(fā)送移位寄存器狀態(tài)機(jī)圖如圖9所示。PCI總線將數(shù)據(jù)寫(xiě)入FIFO,在發(fā)送允許信號(hào)有效的情況下,移位寄存器發(fā)送一個(gè)時(shí)鐘周期的讀使能信號(hào)將FIFO中的數(shù)據(jù)讀出,進(jìn)行并—串轉(zhuǎn)換后輸出數(shù)據(jù)。
在完成這部份工作的時(shí)候,需要注意幾個(gè)問(wèn)題,首先是時(shí)鐘的問(wèn)題,PCI總線傳輸?shù)臅r(shí)鐘是33 MHz,而串口的時(shí)鐘是8 MHz。對(duì)于FIFO來(lái)說(shuō),當(dāng)信號(hào)由總線流向串口時(shí),F(xiàn)IFO以PCI總線時(shí)鐘寫(xiě)入,串口時(shí)鐘讀出;反之則是以串口時(shí)鐘寫(xiě)入,PCI總線時(shí)鐘讀出。其次是讀、寫(xiě)使能信號(hào)的問(wèn)題,對(duì)于FIFO來(lái)說(shuō),信號(hào)不同方向的傳輸造成讀、寫(xiě)使能管腳的連接正好相反。當(dāng)信號(hào)由PCI總線流向串口時(shí),F(xiàn)IFO的寫(xiě)使能由PCI總線提供,即上文所說(shuō)的rs_wr_en信號(hào),寬度為一個(gè)PCI時(shí)鐘周期,讀使能信號(hào)由發(fā)送移位寄存器產(chǎn)生;反之,F(xiàn)IFO的寫(xiě)使能由串口提供,寬度為一個(gè)串口時(shí)鐘,讀使能信號(hào)由PCI總線提供。另外,發(fā)送移位寄存器上的發(fā)送使能接口send_n,作用是將移位操作完成后的串行信號(hào)發(fā)送到串口,send_n由終端的軟件控制產(chǎn)生,通過(guò)PCI總線傳至寄存器;接收移位寄存器上會(huì)輸出一個(gè)中斷信號(hào),用于在長(zhǎng)時(shí)間沒(méi)有輸入串口信號(hào)時(shí)產(chǎn)生中斷,為了避免中斷信號(hào)丟失,文中通過(guò)一個(gè)D觸發(fā)器發(fā)出中斷信號(hào)。
圖9 發(fā)送移位寄存器Fig.9 Send shift register
在分別完成PCI部分和串口部分的設(shè)計(jì)后,我們將兩個(gè)部分合二為一。串口信號(hào)的PCI時(shí)鐘和重置信號(hào)由PCI端提供,其中重置信號(hào)需要進(jìn)行反轉(zhuǎn);讀、寫(xiě)使能信號(hào)根據(jù)PCI端的解碼后,發(fā)送給串口;發(fā)送信號(hào)Send的低4位分別連接到4個(gè)串口,用于驅(qū)動(dòng)將FIFO里的信號(hào)發(fā)送至串口,高4位保留,用于擴(kuò)展到其他需要控制的信號(hào)。綜合設(shè)計(jì)仿真時(shí)序圖如圖10所示。
圖10 綜合設(shè)計(jì)時(shí)序圖Fig.10 Sequential relationship diagram of integrative design
采用FPGA處理實(shí)時(shí)控制計(jì)算機(jī)PCI總線端口與各分系統(tǒng)的高速串口之間的通信,節(jié)約了元器件、以及電路布線,使電路更加緊湊、高效。在PCI總線接口的設(shè)計(jì)中,PCI總線接口的性能將會(huì)影響整個(gè)系統(tǒng)性能[6],本文運(yùn)用Xilinx的IP Core技術(shù),混合語(yǔ)言進(jìn)行其它功能描述,采用 FPGA實(shí)現(xiàn)PCI總線接口不但性能可靠、穩(wěn)定,而且提高了系統(tǒng)集成度。論文給出了系統(tǒng)的整體模塊設(shè)計(jì)和各個(gè)子模塊的設(shè)計(jì),對(duì)系統(tǒng)各個(gè)模塊的功能進(jìn)行了嚴(yán)格仿真。整個(gè)系統(tǒng)設(shè)計(jì)可以應(yīng)用于實(shí)際當(dāng)中。
[1]李貴山,陳金鵬.PCI局部總線及其應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2003.
[2]Brueggen C,Pottinger H J.A novel FPGA-based master/slave PCI interface core,Circuits and Systems[C]//2000 Proceedings of the 43rd IEEE Midwest Symposium America:IEEE,2000.
[3]WANG Zhong-hai,YE Yi-zheng.Designing AHB/PCI Bridge[C]//ASIC 2001 Proceedings 4th International Conference.Beijing:IEEE Press:People’s Posts&Telecommunications Pub,2001.
[4]Xilinx.LogiCORETMIP Initiator/Target v4.8 for PCITMUser Guide[EB/OL].[2008-09-19].http://ching.xilinx.com/support/documentation/ip_documentation/pci_64_ug159.pdf,2008.
[5]Xilinx.LogiCORETMIP FIFO Generator v4.4 User Guide[EB/OL].[2008-09-19].http://www.digchip.com/application-notes/36143571.php,2008.
[6]William S.Operating systems-internals and design principles[M].Beijing:IEEE Press:People’s Posts&Telecommunications Pub,2011.