任勇峰, 楊圣龍, 李輝景
(中北大學 儀器與電子學院,太原 030051)
高速串行計算機擴展總線標準(Peripheral Component Interconnect Express,PCIE)總線是第三代I/O總線技術,采用了點對點的串行差分傳輸,每個設備都使用獨享的通道帶寬,單通道數據傳輸速率可達2.5 Gb/s[1]。基于PCIE接口設計的數據傳輸卡具有很強的擴展性,本設計通過低電壓差分信號(Low-Voltage Differential Signaling,LVDS)鏈路作為外設接口,采用PEX8111橋接芯片實現了PCI-to-PCIE的協議轉換,以現場可編程門陣列(Field Programmable Gate Array,FPGA)為主控器實現了外設部件互連標準(Peripheral Component Interconnect,PCI)的主從模式和突發讀寫時序,從而完成了外設接口到PCIE接口總線的數據傳輸。經多次測試,該傳輸卡占用中央處理器(Central Processing Unit,CPU)資源較小,且傳輸數據穩定可靠,可滿足高速數據傳輸需求。
系統總體框圖如圖1所示,外設接口為LVDS發送和接收電路,在發送端增加了驅動器來提高數據傳輸能力。數據接收時,LVDS接收模塊將數據寫入數據緩存隊列(First Input First Outpu,FIFO)中,當PCI主模塊檢測到FIFO非空時,就會通過啟動直接內存存取(Direct Memory Access,DMA)方式來進行數據傳輸,然后將數據通過PCIE總線直接送至計算機內存中,整個數據過程無需CPU直接參與。在啟動DMA傳輸前,CPU把總線控制權交給DMA控制器,而在結束DMA傳輸后,DMA控制器立即把總線控制權再交還給CPU。最后上位機將數據從內存中取出存入計算機硬盤內,整個過程大大減小了CPU資源占用率,提高了數據傳輸速率。

圖1 系統總體設計框圖
PCIE-x1總線接口如圖2所示,由發送、接收兩對差分信號和一對差分時鐘對組成,同時支持熱拔插和熱交換[2]。在PCIE協議中數據是以數據包的形式進行傳輸,避免了丟數和誤碼的情況出現[3]。由于每條串行線路的數據傳輸率為2.5 Gb/s,在印制電路板(Printed Circuit Board,PCB)布線時需要對差分線進行特別處理:金手指到PEX8111芯片布線長度應小于10.16 cm;差分信號線長度要使用蛇形線進行匹配,誤差應小于5 mil[4]。同時需要在兩對差分信號周圍設計參考地平面來減小高速電路信號間的串擾。

圖2 PCIE-x1總線接口圖
工程應用中實現PCIE接口一種方法可直接使用PCIE硬核進行配置[5],另一種方法可采用橋接芯片來實現。由于使用PCIE專用硬核成本較高,設計采用PEX8111橋接芯片來實現PCIE接口設計。PEX8111是一種PCI-to-PCIE橋接芯片,具備主模式、從模式和 DMA功能,符合PCIE 1.0協議設計規范。利用其前橋模式,無需對原有PCI驅動程序做任何改動即可實現PCI到PCIE協議的過渡。芯片自身可分頻產生66.66 MHz時鐘,內置DMA雙通道,突發傳輸速率最高可達266 Mb/s;擁有的PCI仲裁器最多可掛載4個PCI主控器,還支持雙向透明橋,具有8 KB的共享內存,可供本地總線與PCIE接口訪問[6]。圖3為PEX8111內部邏輯示意圖。

圖3 PEX8111內部邏輯示意圖
PCI總線接口組成如圖4所示,CLK為系統時鐘,為所有PCI總線數據傳輸及總線仲裁提供時序,除RST#外,其他信號均在CLK的上升沿采樣[7]。RST#為異步復位信號;A/D信號線為數據及地址復用,支持64位擴展;CBE#信號在地址周期內傳送總線命令,在數據周期內為字節使能信號;PAR為A/D和CBE#信號的奇偶校驗信號。FRAME#、IRDY#、TRDY#、DEVSEL#4個總線控制信號決定了數據的傳輸方式和時序[8];REQ#和GNT#為總線仲裁信號,REQ#向仲裁器申請總線使用權,GNT#為仲裁器反饋的允許占用信號。

圖4 PCI總線接口
PCI總線支持單一周期傳輸和突發周期傳輸,通過FRAME#和IRDY#信號不同時序組合可使單周期傳輸變為突發傳輸[9]。在地址期,單周期傳輸協議和突發傳輸協議相同;在數據期,主設備準備好接收或傳送數據時,將IRDY#置為有效,如果FRAME#在IRDY#有效的同時無效,說明此操作為單一數據傳輸;如果FRAME#仍有效,則該方式為突發傳輸方式。
突發傳送包括一系列微傳送,第一個微傳送的地址稱基地址,在地址期獲得,隨后的傳送地址將根據這一基地址做相應增加得到[10]。與單周期傳輸相同,當FRAME#無效而IRDY#有效時,說明突發傳輸正在進行最后一個周期的數據傳送,當FRAME#和IRDY#都無效時傳輸結束。圖5為PCI總線的突發讀寫時序。

圖5 PCI總線突發讀寫時序
傳輸卡采用FGPA作為主控器實現了PCI總線的DMA傳輸,邏輯設計主要由PCI主模式、PCI從模式和數據校驗三個模塊組成[11]。其中PCI從模式主要負責上電時對PEX8111的進行PCI讀寫配置以及上位下發的指令轉發;PCI主模式主要負責DMA時序的控制;數據校驗模塊將AD信號和CBE#信號數據進行奇偶校驗后輸出。分模塊編寫可使PCI時序設計邏輯更加清晰,各模塊關系如圖6所示。

圖6 PCI時序頂層設計
在進行DMA操作時,PCI設備需要從上位機獲取數據傳送的目的地址和傳送大小,并在其地址空間中設置兩個寄存器,分別保存這個目標地址和傳送大小[12]。數據下發時,先選中寄存器所在地址,然后再將數值寫入寄存器,完成DMA前期準備工作。
PCI總線的DMA傳輸過程如下:啟動DMA時,系統首先通過上位機在計算機內存中開辟512KB的連續內存空間,同時,將中斷類型值0x11傳入master_reg狀態寄存器中;其次,上位機通過調用底層驅動函數,判斷出中斷類型后,將本次傳輸字節的大小0x80000下發至count_reg寄存器中,同時將內存空間的起始地址傳送至heard_reg寄存器中。由于LVDS解串后為8位數據,所以需要對數據進行拼接后寫入32 bit×4096的FIFO中,當FIFO中數據量達到指定閾值時,狀態指示prog_empty信號有效。系統在檢測到prog_empty信號和master_reg中斷狀態寄存器同時有效時,FPGA模擬的PCI設備通過REQ#向PEX8111發出總線占用請求,PEX8111中的DMA控制器在收到請求后通過GNT#向FPGA發出總線響應,FPGA模擬的PCI從設備獲得本地總線控制權,即可開始DMA數據傳輸。
當32位AD總線每傳輸一次數據,count_reg寄存器值減4,heard_reg寄存器的值加4;當count_reg寄存器中的值減為0時,將master_reg狀態寄存器復位為0x00,并通過INTA#引腳發出中斷信號,說明一次DMA數據傳輸已經完成。CPU在接收到中斷指令后,將內存空間中的512 KB數據取走,同時準備下一次的DMA傳輸,程序流程如圖7所示。

圖7 DMA流程圖
由于每次啟動DMA時計算機系統需要一定的時間響應中斷,此時FIFO中的數據量會逐漸積累,所以在每次DMA傳輸的前一部分時間為突發傳輸,當FIFO中數據量減至1個時,DMA傳輸變為單一周期傳輸。當PEX8111在進行DMA操作時,使用的目的地址不是存儲器域的物理地址,而是PCI總線域的物理地址。因為PEX8111使用PCI協議時僅能識別PCI總線域的物理地址,而不能識別存儲器域的物理地址[13]。
PCI總線時序邏輯由FRAME#、TIDY#、STOP#、IRDY#4個信號控制[14],在FPGA內通過狀態機實現[15]。PCI主模塊狀態機包括空閑狀態、讀寫地址狀態、讀寫數據狀態1、讀寫數據狀態2、讀寫停止狀態、讀寫返回狀態,它們間相互轉換關系如圖8所示。

圖8 主模式狀態機設計
空閑狀態:判斷是否收到DMA讀寫請求,如果有則跳到讀寫地址狀態,沒有則保持當前狀態。
讀寫地址狀態:此狀態下主設備使FRAME#和IRDY#信號有效,CBE#總線下發存儲器讀命令,AD總線上送出 DMA首地址。當目標設備在地址期完成譯碼后,置TRDY#信號有效,啟動第一次數據傳輸,并跳到讀寫數據狀態1開始連續多次傳輸;否則跳轉到讀寫停止狀態。
讀寫數據狀態1:判斷此次DMA傳輸是否完成以及FIFO中的數據量。如果本次DMA傳輸至最后一個數據期,或FIFO幾乎為空,則跳到讀寫數據狀態2。若在傳輸過程中目標設備發出stop中止交易信號,或總線傳輸延遲超過16個時鐘周期,則跳轉至讀寫停止狀態。若以上情況都未發生,則保持此狀態繼續進行DMA突發傳輸。
讀寫數據狀態2:判斷本次DMA傳輸是否進入最后一個數據期或目標設備是否要求中斷數據傳輸。若是則跳轉到讀寫停止狀態,否則保持此狀態繼續本次DMA傳輸。
讀寫停止狀態:判斷本次DMA傳輸是否進入最后一個數據期或目標設備是否要求中斷數據傳輸。若是則跳轉至讀寫返回狀態,否則仍保持此狀態繼續本次DMA傳輸。
讀寫返回狀態:返回空閑狀態。
通過SignalTapⅡ抓取的波形如圖9所示,可以看到在frame、trdy、irdy、stop信號控制下,PCI總線數據正在進行單周期讀操作。此時FIFO將數據送給A/D總線,同時FIFO中剩余的數據量始終保持在1~2個,證明沒有發生數據溢出現象。測試采用發送00~F8的遞增數,之后為4個字節的幀計數,幀尾添加EB 90標識,數據截圖如圖10所示。由于數據讀取速度很快,計算機采用固態硬盤(Solid State Drives,SSD)存儲數據,在連續讀取50GB數據后分析無丟數現象,同時測試DMA速率達到了1.104 Gb/s,說明通過PCIE接口,數據可以準確無誤的上傳到上位機,此數據傳輸卡可滿足如今高速數據傳輸的需求。

圖9 FPGA時序圖

圖10 數據檢測報告
本設計采用了PEX8111橋接芯片,通過FPGA進行時序邏輯控制,完成了PCIE協議與PCI協議的相互轉化,實現了LVDS總線與PCIE接口的實時通信。整個設計占用的計算機資源很小,不僅實現了數據的準確傳輸,還可滿足當今數據高速傳輸的需求。本產品通過了相關的性能測試,已成功應用在數據傳輸測試中。