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