任勇峰, 楊圣龍, 李輝景
(中北大學(xué) 儀器與電子學(xué)院,太原 030051)
高速串行計(jì)算機(jī)擴(kuò)展總線(xiàn)標(biāo)準(zhǔn)(Peripheral Component Interconnect Express,PCIE)總線(xiàn)是第三代I/O總線(xiàn)技術(shù),采用了點(diǎn)對(duì)點(diǎn)的串行差分傳輸,每個(gè)設(shè)備都使用獨(dú)享的通道帶寬,單通道數(shù)據(jù)傳輸速率可達(dá)2.5 Gb/s[1]?;赑CIE接口設(shè)計(jì)的數(shù)據(jù)傳輸卡具有很強(qiáng)的擴(kuò)展性,本設(shè)計(jì)通過(guò)低電壓差分信號(hào)(Low-Voltage Differential Signaling,LVDS)鏈路作為外設(shè)接口,采用PEX8111橋接芯片實(shí)現(xiàn)了PCI-to-PCIE的協(xié)議轉(zhuǎn)換,以現(xiàn)場(chǎng)可編程門(mén)陣列(Field Programmable Gate Array,F(xiàn)PGA)為主控器實(shí)現(xiàn)了外設(shè)部件互連標(biāo)準(zhǔn)(Peripheral Component Interconnect,PCI)的主從模式和突發(fā)讀寫(xiě)時(shí)序,從而完成了外設(shè)接口到PCIE接口總線(xiàn)的數(shù)據(jù)傳輸。經(jīng)多次測(cè)試,該傳輸卡占用中央處理器(Central Processing Unit,CPU)資源較小,且傳輸數(shù)據(jù)穩(wěn)定可靠,可滿(mǎn)足高速數(shù)據(jù)傳輸需求。
系統(tǒng)總體框圖如圖1所示,外設(shè)接口為L(zhǎng)VDS發(fā)送和接收電路,在發(fā)送端增加了驅(qū)動(dòng)器來(lái)提高數(shù)據(jù)傳輸能力。數(shù)據(jù)接收時(shí),LVDS接收模塊將數(shù)據(jù)寫(xiě)入數(shù)據(jù)緩存隊(duì)列(First Input First Outpu,F(xiàn)IFO)中,當(dāng)PCI主模塊檢測(cè)到FIFO非空時(shí),就會(huì)通過(guò)啟動(dòng)直接內(nèi)存存取(Direct Memory Access,DMA)方式來(lái)進(jìn)行數(shù)據(jù)傳輸,然后將數(shù)據(jù)通過(guò)PCIE總線(xiàn)直接送至計(jì)算機(jī)內(nèi)存中,整個(gè)數(shù)據(jù)過(guò)程無(wú)需CPU直接參與。在啟動(dòng)DMA傳輸前,CPU把總線(xiàn)控制權(quán)交給DMA控制器,而在結(jié)束DMA傳輸后,DMA控制器立即把總線(xiàn)控制權(quán)再交還給CPU。最后上位機(jī)將數(shù)據(jù)從內(nèi)存中取出存入計(jì)算機(jī)硬盤(pán)內(nèi),整個(gè)過(guò)程大大減小了CPU資源占用率,提高了數(shù)據(jù)傳輸速率。
圖1 系統(tǒng)總體設(shè)計(jì)框圖
PCIE-x1總線(xiàn)接口如圖2所示,由發(fā)送、接收兩對(duì)差分信號(hào)和一對(duì)差分時(shí)鐘對(duì)組成,同時(shí)支持熱拔插和熱交換[2]。在PCIE協(xié)議中數(shù)據(jù)是以數(shù)據(jù)包的形式進(jìn)行傳輸,避免了丟數(shù)和誤碼的情況出現(xiàn)[3]。由于每條串行線(xiàn)路的數(shù)據(jù)傳輸率為2.5 Gb/s,在印制電路板(Printed Circuit Board,PCB)布線(xiàn)時(shí)需要對(duì)差分線(xiàn)進(jìn)行特別處理:金手指到PEX8111芯片布線(xiàn)長(zhǎng)度應(yīng)小于10.16 cm;差分信號(hào)線(xiàn)長(zhǎng)度要使用蛇形線(xiàn)進(jìn)行匹配,誤差應(yīng)小于5 mil[4]。同時(shí)需要在兩對(duì)差分信號(hào)周?chē)O(shè)計(jì)參考地平面來(lái)減小高速電路信號(hào)間的串?dāng)_。
圖2 PCIE-x1總線(xiàn)接口圖
工程應(yīng)用中實(shí)現(xiàn)PCIE接口一種方法可直接使用PCIE硬核進(jìn)行配置[5],另一種方法可采用橋接芯片來(lái)實(shí)現(xiàn)。由于使用PCIE專(zhuān)用硬核成本較高,設(shè)計(jì)采用PEX8111橋接芯片來(lái)實(shí)現(xiàn)PCIE接口設(shè)計(jì)。PEX8111是一種PCI-to-PCIE橋接芯片,具備主模式、從模式和 DMA功能,符合PCIE 1.0協(xié)議設(shè)計(jì)規(guī)范。利用其前橋模式,無(wú)需對(duì)原有PCI驅(qū)動(dòng)程序做任何改動(dòng)即可實(shí)現(xiàn)PCI到PCIE協(xié)議的過(guò)渡。芯片自身可分頻產(chǎn)生66.66 MHz時(shí)鐘,內(nèi)置DMA雙通道,突發(fā)傳輸速率最高可達(dá)266 Mb/s;擁有的PCI仲裁器最多可掛載4個(gè)PCI主控器,還支持雙向透明橋,具有8 KB的共享內(nèi)存,可供本地總線(xiàn)與PCIE接口訪(fǎng)問(wèn)[6]。圖3為PEX8111內(nèi)部邏輯示意圖。
圖3 PEX8111內(nèi)部邏輯示意圖
PCI總線(xiàn)接口組成如圖4所示,CLK為系統(tǒng)時(shí)鐘,為所有PCI總線(xiàn)數(shù)據(jù)傳輸及總線(xiàn)仲裁提供時(shí)序,除RST#外,其他信號(hào)均在CLK的上升沿采樣[7]。RST#為異步復(fù)位信號(hào);A/D信號(hào)線(xiàn)為數(shù)據(jù)及地址復(fù)用,支持64位擴(kuò)展;CBE#信號(hào)在地址周期內(nèi)傳送總線(xiàn)命令,在數(shù)據(jù)周期內(nèi)為字節(jié)使能信號(hào);PAR為A/D和CBE#信號(hào)的奇偶校驗(yàn)信號(hào)。FRAME#、IRDY#、TRDY#、DEVSEL#4個(gè)總線(xiàn)控制信號(hào)決定了數(shù)據(jù)的傳輸方式和時(shí)序[8];REQ#和GNT#為總線(xiàn)仲裁信號(hào),REQ#向仲裁器申請(qǐng)總線(xiàn)使用權(quán),GNT#為仲裁器反饋的允許占用信號(hào)。
圖4 PCI總線(xiàn)接口
PCI總線(xiàn)支持單一周期傳輸和突發(fā)周期傳輸,通過(guò)FRAME#和IRDY#信號(hào)不同時(shí)序組合可使單周期傳輸變?yōu)橥话l(fā)傳輸[9]。在地址期,單周期傳輸協(xié)議和突發(fā)傳輸協(xié)議相同;在數(shù)據(jù)期,主設(shè)備準(zhǔn)備好接收或傳送數(shù)據(jù)時(shí),將IRDY#置為有效,如果FRAME#在IRDY#有效的同時(shí)無(wú)效,說(shuō)明此操作為單一數(shù)據(jù)傳輸;如果FRAME#仍有效,則該方式為突發(fā)傳輸方式。
突發(fā)傳送包括一系列微傳送,第一個(gè)微傳送的地址稱(chēng)基地址,在地址期獲得,隨后的傳送地址將根據(jù)這一基地址做相應(yīng)增加得到[10]。與單周期傳輸相同,當(dāng)FRAME#無(wú)效而IRDY#有效時(shí),說(shuō)明突發(fā)傳輸正在進(jìn)行最后一個(gè)周期的數(shù)據(jù)傳送,當(dāng)FRAME#和IRDY#都無(wú)效時(shí)傳輸結(jié)束。圖5為PCI總線(xiàn)的突發(fā)讀寫(xiě)時(shí)序。
圖5 PCI總線(xiàn)突發(fā)讀寫(xiě)時(shí)序
傳輸卡采用FGPA作為主控器實(shí)現(xiàn)了PCI總線(xiàn)的DMA傳輸,邏輯設(shè)計(jì)主要由PCI主模式、PCI從模式和數(shù)據(jù)校驗(yàn)三個(gè)模塊組成[11]。其中PCI從模式主要負(fù)責(zé)上電時(shí)對(duì)PEX8111的進(jìn)行PCI讀寫(xiě)配置以及上位下發(fā)的指令轉(zhuǎn)發(fā);PCI主模式主要負(fù)責(zé)DMA時(shí)序的控制;數(shù)據(jù)校驗(yàn)?zāi)K將AD信號(hào)和CBE#信號(hào)數(shù)據(jù)進(jìn)行奇偶校驗(yàn)后輸出。分模塊編寫(xiě)可使PCI時(shí)序設(shè)計(jì)邏輯更加清晰,各模塊關(guān)系如圖6所示。
圖6 PCI時(shí)序頂層設(shè)計(jì)
在進(jìn)行DMA操作時(shí),PCI設(shè)備需要從上位機(jī)獲取數(shù)據(jù)傳送的目的地址和傳送大小,并在其地址空間中設(shè)置兩個(gè)寄存器,分別保存這個(gè)目標(biāo)地址和傳送大小[12]。數(shù)據(jù)下發(fā)時(shí),先選中寄存器所在地址,然后再將數(shù)值寫(xiě)入寄存器,完成DMA前期準(zhǔn)備工作。
PCI總線(xiàn)的DMA傳輸過(guò)程如下:?jiǎn)?dòng)DMA時(shí),系統(tǒng)首先通過(guò)上位機(jī)在計(jì)算機(jī)內(nèi)存中開(kāi)辟512KB的連續(xù)內(nèi)存空間,同時(shí),將中斷類(lèi)型值0x11傳入master_reg狀態(tài)寄存器中;其次,上位機(jī)通過(guò)調(diào)用底層驅(qū)動(dòng)函數(shù),判斷出中斷類(lèi)型后,將本次傳輸字節(jié)的大小0x80000下發(fā)至count_reg寄存器中,同時(shí)將內(nèi)存空間的起始地址傳送至heard_reg寄存器中。由于LVDS解串后為8位數(shù)據(jù),所以需要對(duì)數(shù)據(jù)進(jìn)行拼接后寫(xiě)入32 bit×4096的FIFO中,當(dāng)FIFO中數(shù)據(jù)量達(dá)到指定閾值時(shí),狀態(tài)指示prog_empty信號(hào)有效。系統(tǒng)在檢測(cè)到prog_empty信號(hào)和master_reg中斷狀態(tài)寄存器同時(shí)有效時(shí),F(xiàn)PGA模擬的PCI設(shè)備通過(guò)REQ#向PEX8111發(fā)出總線(xiàn)占用請(qǐng)求,PEX8111中的DMA控制器在收到請(qǐng)求后通過(guò)GNT#向FPGA發(fā)出總線(xiàn)響應(yīng),F(xiàn)PGA模擬的PCI從設(shè)備獲得本地總線(xiàn)控制權(quán),即可開(kāi)始DMA數(shù)據(jù)傳輸。
當(dāng)32位AD總線(xiàn)每傳輸一次數(shù)據(jù),count_reg寄存器值減4,heard_reg寄存器的值加4;當(dāng)count_reg寄存器中的值減為0時(shí),將master_reg狀態(tài)寄存器復(fù)位為0x00,并通過(guò)INTA#引腳發(fā)出中斷信號(hào),說(shuō)明一次DMA數(shù)據(jù)傳輸已經(jīng)完成。CPU在接收到中斷指令后,將內(nèi)存空間中的512 KB數(shù)據(jù)取走,同時(shí)準(zhǔn)備下一次的DMA傳輸,程序流程如圖7所示。
圖7 DMA流程圖
由于每次啟動(dòng)DMA時(shí)計(jì)算機(jī)系統(tǒng)需要一定的時(shí)間響應(yīng)中斷,此時(shí)FIFO中的數(shù)據(jù)量會(huì)逐漸積累,所以在每次DMA傳輸?shù)那耙徊糠謺r(shí)間為突發(fā)傳輸,當(dāng)FIFO中數(shù)據(jù)量減至1個(gè)時(shí),DMA傳輸變?yōu)閱我恢芷趥鬏?。?dāng)PEX8111在進(jìn)行DMA操作時(shí),使用的目的地址不是存儲(chǔ)器域的物理地址,而是PCI總線(xiàn)域的物理地址。因?yàn)镻EX8111使用PCI協(xié)議時(shí)僅能識(shí)別PCI總線(xiàn)域的物理地址,而不能識(shí)別存儲(chǔ)器域的物理地址[13]。
PCI總線(xiàn)時(shí)序邏輯由FRAME#、TIDY#、STOP#、IRDY#4個(gè)信號(hào)控制[14],在FPGA內(nèi)通過(guò)狀態(tài)機(jī)實(shí)現(xiàn)[15]。PCI主模塊狀態(tài)機(jī)包括空閑狀態(tài)、讀寫(xiě)地址狀態(tài)、讀寫(xiě)數(shù)據(jù)狀態(tài)1、讀寫(xiě)數(shù)據(jù)狀態(tài)2、讀寫(xiě)停止?fàn)顟B(tài)、讀寫(xiě)返回狀態(tài),它們間相互轉(zhuǎn)換關(guān)系如圖8所示。
圖8 主模式狀態(tài)機(jī)設(shè)計(jì)
空閑狀態(tài):判斷是否收到DMA讀寫(xiě)請(qǐng)求,如果有則跳到讀寫(xiě)地址狀態(tài),沒(méi)有則保持當(dāng)前狀態(tài)。
讀寫(xiě)地址狀態(tài):此狀態(tài)下主設(shè)備使FRAME#和IRDY#信號(hào)有效,CBE#總線(xiàn)下發(fā)存儲(chǔ)器讀命令,AD總線(xiàn)上送出 DMA首地址。當(dāng)目標(biāo)設(shè)備在地址期完成譯碼后,置TRDY#信號(hào)有效,啟動(dòng)第一次數(shù)據(jù)傳輸,并跳到讀寫(xiě)數(shù)據(jù)狀態(tài)1開(kāi)始連續(xù)多次傳輸;否則跳轉(zhuǎn)到讀寫(xiě)停止?fàn)顟B(tài)。
讀寫(xiě)數(shù)據(jù)狀態(tài)1:判斷此次DMA傳輸是否完成以及FIFO中的數(shù)據(jù)量。如果本次DMA傳輸至最后一個(gè)數(shù)據(jù)期,或FIFO幾乎為空,則跳到讀寫(xiě)數(shù)據(jù)狀態(tài)2。若在傳輸過(guò)程中目標(biāo)設(shè)備發(fā)出stop中止交易信號(hào),或總線(xiàn)傳輸延遲超過(guò)16個(gè)時(shí)鐘周期,則跳轉(zhuǎn)至讀寫(xiě)停止?fàn)顟B(tài)。若以上情況都未發(fā)生,則保持此狀態(tài)繼續(xù)進(jìn)行DMA突發(fā)傳輸。
讀寫(xiě)數(shù)據(jù)狀態(tài)2:判斷本次DMA傳輸是否進(jìn)入最后一個(gè)數(shù)據(jù)期或目標(biāo)設(shè)備是否要求中斷數(shù)據(jù)傳輸。若是則跳轉(zhuǎn)到讀寫(xiě)停止?fàn)顟B(tài),否則保持此狀態(tài)繼續(xù)本次DMA傳輸。
讀寫(xiě)停止?fàn)顟B(tài):判斷本次DMA傳輸是否進(jìn)入最后一個(gè)數(shù)據(jù)期或目標(biāo)設(shè)備是否要求中斷數(shù)據(jù)傳輸。若是則跳轉(zhuǎn)至讀寫(xiě)返回狀態(tài),否則仍保持此狀態(tài)繼續(xù)本次DMA傳輸。
讀寫(xiě)返回狀態(tài):返回空閑狀態(tài)。
通過(guò)SignalTapⅡ抓取的波形如圖9所示,可以看到在frame、trdy、irdy、stop信號(hào)控制下,PCI總線(xiàn)數(shù)據(jù)正在進(jìn)行單周期讀操作。此時(shí)FIFO將數(shù)據(jù)送給A/D總線(xiàn),同時(shí)FIFO中剩余的數(shù)據(jù)量始終保持在1~2個(gè),證明沒(méi)有發(fā)生數(shù)據(jù)溢出現(xiàn)象。測(cè)試采用發(fā)送00~F8的遞增數(shù),之后為4個(gè)字節(jié)的幀計(jì)數(shù),幀尾添加EB 90標(biāo)識(shí),數(shù)據(jù)截圖如圖10所示。由于數(shù)據(jù)讀取速度很快,計(jì)算機(jī)采用固態(tài)硬盤(pán)(Solid State Drives,SSD)存儲(chǔ)數(shù)據(jù),在連續(xù)讀取50GB數(shù)據(jù)后分析無(wú)丟數(shù)現(xiàn)象,同時(shí)測(cè)試DMA速率達(dá)到了1.104 Gb/s,說(shuō)明通過(guò)PCIE接口,數(shù)據(jù)可以準(zhǔn)確無(wú)誤的上傳到上位機(jī),此數(shù)據(jù)傳輸卡可滿(mǎn)足如今高速數(shù)據(jù)傳輸?shù)男枨蟆?/p>
圖9 FPGA時(shí)序圖
圖10 數(shù)據(jù)檢測(cè)報(bào)告
本設(shè)計(jì)采用了PEX8111橋接芯片,通過(guò)FPGA進(jìn)行時(shí)序邏輯控制,完成了PCIE協(xié)議與PCI協(xié)議的相互轉(zhuǎn)化,實(shí)現(xiàn)了LVDS總線(xiàn)與PCIE接口的實(shí)時(shí)通信。整個(gè)設(shè)計(jì)占用的計(jì)算機(jī)資源很小,不僅實(shí)現(xiàn)了數(shù)據(jù)的準(zhǔn)確傳輸,還可滿(mǎn)足當(dāng)今數(shù)據(jù)高速傳輸?shù)男枨蟆1井a(chǎn)品通過(guò)了相關(guān)的性能測(cè)試,已成功應(yīng)用在數(shù)據(jù)傳輸測(cè)試中。