基于IP核的PCI Express接口設計
現(xiàn)代測控系統(tǒng)和通信領域?qū)?shù)據(jù)傳輸速率的要求越來越高。相比PC 中其他技術(shù)的發(fā)展,總線技術(shù)的發(fā)展顯得相對緩慢,總線性能已經(jīng)成為制約系統(tǒng)性能發(fā)揮的瓶頸。傳統(tǒng)的ISA, EISA 總線等已無法適應高速數(shù)據(jù)傳輸?shù)囊?,PCI 總線技術(shù)雖然經(jīng)過了不斷的修正和發(fā)展,但是由于它固有的缺陷,使其應用領域受到限制。PCI Express 總線以其優(yōu)異的性能和低廉的造價引起了業(yè)界的廣泛關注,具有廣闊的應用前景。本文介紹PCI Express 總線接口的設計方法,,并實現(xiàn)一個基于IP核的PCI Express 總線接口。
1 PCI Express 總線簡介
PCI Express 總線是Intel 公司于1997 年提出的第3 代I/O 技術(shù),是種全新的串行總線技術(shù)。與PCI 總線相比,PCI Express 總線具有以下特點:
(1)在數(shù)據(jù)傳輸模式上,PCI Express 總線采用雙工串行傳輸模式,一條PCI Express 通道由2 對LVDS 差分線對組成:
一對負責發(fā)送,另一對負責接收,單向數(shù)據(jù)傳輸速率為2.5 Gb/s。
(2)具有很好的靈活性,一個PCI Express 物理連接可以根據(jù)實際需要配置成×1,×2,×4,×8,×16,×32 個并行的數(shù)據(jù)通
道,滿足不同設備之間通信帶寬的要求。
(3)在軟件層與PCI 總線完全兼容,原有PCI 總線的驅(qū)動程序可以完全移植到PCI Express 總線架構(gòu)的系統(tǒng)中。
(4)串行連接采用自同步時鐘技術(shù),時鐘內(nèi)嵌于串行數(shù)據(jù)的8 bit/10 bit 編碼中,可實現(xiàn)數(shù)據(jù)傳輸率的自適應調(diào)整。
PCI Express 協(xié)議定義了3 層結(jié)構(gòu):物理層,數(shù)據(jù)鏈路層和事務層。每個層次按照協(xié)議中規(guī)定的內(nèi)容,完成相應的數(shù)據(jù)處理功能。
2 PCI Express 接口設計方法
PCI Express 總線的接口的設計方法大體有2 種:使用專用接口芯片或者使用可以實現(xiàn)PCI Express 物理接口的可編程器件。
專用接口芯片實現(xiàn)了 PCI Express 總線的物理層、數(shù)據(jù)鏈路層和事務層的控制邏輯。例如,PEX 8311 是PLX 公司推出的第1 款本地總線到PCI Express×1 的橋接芯片,符合PCI Express 1.0 規(guī)范,支持自動極性反轉(zhuǎn)、CRC 校驗、鏈路設備電源管理,具有直接主模式、直接從模式、DMA 和數(shù)據(jù)預取等功能。
使用 PEX 8311 實現(xiàn)PCI Express 接口,用戶僅需實現(xiàn)相對簡單的本地總線接口即可,降低了開發(fā)難度。但是這種方法受限于專用接口芯片的性能,用戶無法根據(jù)自身的需求提升接口的性能。
可編程器件設計方案的基本思想是由 FPGA 實現(xiàn)PCI Express 的上層電路,利用Philip 公司或TI 公司提供的PHY(物理層)器件實現(xiàn)物理層接口,通常需要購買Xilinx 公司或Altera 公司提供的IP 核與PHY 器件配合使用。在有些FPGA 產(chǎn)品中,集成有PCI Express 接口的硬核模塊,可以采用相應的產(chǎn)品實現(xiàn)PCI Express 接口的功能。例如,Xilinx 公司Virtex-5 LXT/SXT/FXT/TXT 系列FPGA 器件中,集成有PCI Express 硬核端點模塊,能夠自動完成數(shù)據(jù)鏈路層和物理層的數(shù)據(jù)處理功能。采用這種方法,用戶只需要設計處理事務層數(shù)據(jù)包的邏輯電路即可。還可以根據(jù)自己的需求,設計具有特殊功能的電路結(jié)構(gòu),發(fā)揮接口的性能,但是這種方法的開發(fā)難度較大,開發(fā)周期相對較長。
3 PCI Express 接口實現(xiàn)
本設計采用 Xilinx 公司Virtex-5 系列xc5vlx30t 芯片,使用該芯片內(nèi)部的PCI Express Endpoint 硬核端點模塊,設計了處理事務層數(shù)據(jù)的邏輯電路,實現(xiàn)了計算機內(nèi)存與用戶邏輯之間數(shù)據(jù)的正確傳輸。其中,控制狀態(tài)機的設計和DMA 控制器的設計是重點、難點,下面詳細介紹具體的實現(xiàn)過程。
3.1 接口電路的設計
在接口電路中,PCI Express 物理層和數(shù)據(jù)鏈路層的電路采用Xilinx 公司的PCI Express Endpoint Block plus v1.5 硬核端點模塊實現(xiàn),能夠有效完成接口物理層和數(shù)據(jù)鏈路層的數(shù)據(jù)處理功能,提供給上層一個事務層數(shù)據(jù)接口。
上層電路主要由 5 部分電路構(gòu)成,分別是核配置與輔助控制模塊、數(shù)據(jù)發(fā)送控制器、數(shù)據(jù)接收控制器、數(shù)據(jù)輸入FIFO和數(shù)據(jù)輸出FIFO,如圖1 所示,最終提供給用戶FIFO 類型的用戶邏輯接口。
圖 1 PCI Express 接口電路結(jié)構(gòu)
核配置與輔助控制模塊與硬核端點模塊緊密聯(lián)系,完成硬核端點模塊中通道寬度、時鐘頻率、設備號、版本號、存儲空間類型與大小等一系列可控制參數(shù)的配置與一些基本功能的控制。
硬核端點模塊提供的事務層數(shù)據(jù)接口為 64 bit 的數(shù)據(jù)發(fā)送接口和64 bit 的數(shù)據(jù)接收接口以及控制數(shù)據(jù)發(fā)送和接收的一系列控制信號接口。數(shù)據(jù)接收控制器將收到的事務層包進行解析,根據(jù)數(shù)據(jù)包的類型進行相應的處理。數(shù)據(jù)發(fā)送控制器用于將所要發(fā)送的數(shù)據(jù)按照事務層包的格式進行封裝后,發(fā)送到硬核端點模塊。
數(shù)據(jù)輸入 FIFO 和數(shù)據(jù)輸出FIFO 共同構(gòu)成了數(shù)據(jù)通道,均為雙端口FIFO,用于連接PCI Express 接口和用戶邏輯。數(shù)據(jù)輸入FIFO 用于保存從接口收到的數(shù)據(jù);用戶邏輯電路輸出的數(shù)據(jù)保存到數(shù)據(jù)輸出FIFO 中后發(fā)送到接口電路。
3.2 控制狀態(tài)機的設計
數(shù)據(jù)發(fā)送控制器和數(shù)據(jù)接收控制器負責事務層數(shù)據(jù)的封裝和解析工作,是本設計中的關鍵電路模塊。這兩個模塊均采用有限狀態(tài)機方式進行設計,下面詳細介紹這2 個模塊狀態(tài)機的設計。
接收控制器從硬核端點模塊中收到事務層包(TLP),根據(jù)TLP 的格式,第56 bit~第62 bit 為表示數(shù)據(jù)包類型的標志位。按照標志位中的信息,對TLP 的內(nèi)容進行解析,進行相應的數(shù)據(jù)操作。所設計的狀態(tài)機的狀態(tài)轉(zhuǎn)換圖如圖2 所示,各個狀態(tài)的說明如表1 所示。
圖2 接收控制器狀態(tài)機
系統(tǒng)復位后,接收控制器狀態(tài)機處于空閑狀態(tài),等待接收數(shù)據(jù)包,收到TLP 后跳轉(zhuǎn)到相應的狀態(tài)進行存儲器或者I/O的讀寫操作。在操作過程中,對存儲器或者I/O 的狀態(tài)進行監(jiān)控,如果目標設備沒有準備好,則進入等待狀態(tài)直到目標設備就緒。在存儲器或者I/O 的讀寫操作完成后,狀態(tài)機又返回空閑狀態(tài)。在各個狀態(tài)中接收控制器產(chǎn)生相應的控制信號完成數(shù)據(jù)的寫入以及對發(fā)送控制器的操作。
與接收控制器狀態(tài)機相比,發(fā)送控制器狀態(tài)機相對簡單,只有3 個狀態(tài),狀態(tài)轉(zhuǎn)換圖見圖3,各個狀態(tài)的說明見表2。
系統(tǒng)復位后,發(fā)送控制器狀態(tài)機處于復位狀態(tài)。當從接收控制器收到發(fā)送數(shù)據(jù)的命令后,如果需要發(fā)送的是一個載荷數(shù)據(jù),則將從存儲器或者I/O 中取出的載荷數(shù)據(jù)填充到TLP中的相應位置后發(fā)送到端點模塊;如果需要發(fā)送的只是一個響應或者標志信息,則直接封裝成一個TLP 發(fā)送到端點模塊。
3.3 DMA 控制器的設計
由于串行總線結(jié)構(gòu)與傳統(tǒng)的并行總線結(jié)構(gòu)不同,因此存儲器的讀寫操作都是以數(shù)據(jù)包的形式傳輸。普通的讀寫操作一次最多只能進行64 bit 數(shù)據(jù)的讀寫,使得總線多數(shù)時間處于等待狀態(tài),嚴重影響了PCI Express 總線的數(shù)據(jù)傳輸速率。本文設計出相應的DMA 控制器,實現(xiàn)了DMA 方式的數(shù)據(jù)傳輸。
DMA 控制器的主要電路結(jié)構(gòu)為14 個與DMA 操作相關的寄存器,通過對這些控制寄存器的讀寫,設定DMA 方式數(shù)據(jù)讀寫操作的地址范圍和數(shù)據(jù)大小,完成DMA 數(shù)據(jù)讀寫操作。這些寄存器的定義和功能描述如表3 所示。
在設計了上述14 個DMA 控制寄存器后,接收控制器和發(fā)送控制器的狀態(tài)機也要進行相應的調(diào)整,以適應DMA 操作的需要。在接收控制器狀態(tài)機中加入了2 個狀態(tài),分別用于接收數(shù)據(jù)傳輸過程中的第1 個DMA 數(shù)據(jù)包和剩余的DMA數(shù)據(jù)包。在發(fā)送控制器狀態(tài)機中也加入了2 個狀態(tài),分別用于發(fā)送數(shù)據(jù)傳輸過程中的第1 個DMA 數(shù)據(jù)包和剩余的DMA數(shù)據(jù)包。為了達到盡可能高的數(shù)據(jù)傳輸速率,在接收和發(fā)送過程中都使用了64 bit 數(shù)據(jù)傳輸模式。
在設計了如上所述的 DMA 控制器后,PCI Express 總線接口就可以用DMA 方式進行數(shù)據(jù)的讀寫操作。進行DMA 讀/寫操作的具體過程如下:(1)寫中斷控制寄存器,打開中斷;(2)寫讀/寫地址寄存器,設置讀/寫數(shù)據(jù)的起始地址;(3)寫讀/寫包長度寄存器,設置讀/寫數(shù)據(jù)包的大小;(4)寫讀/寫包數(shù)量寄存器,設置讀/寫數(shù)據(jù)包的數(shù)量;(5)寫控制寄存器,啟動DMA 讀/寫操作;(6)等待中斷服務寄存器發(fā)出中斷;(7)收到中斷,讀中斷服務寄存器;(8)寫中斷控制寄存器,關閉中斷。
4 仿真與性能測試
使用 Verilog 語言編寫代碼實現(xiàn)本設計,使用Modelsim SE 6.2g 對該設計進行功能仿真。從數(shù)據(jù)寫入FIFO 的仿真波形圖中可以看到,未采用DMA 方式時,每次只能夠?qū)⒁粋€數(shù)據(jù)寫入到FIFO 中,在2 次寫操作之間存在較長的等待時
間;采用DMA 方式時,可以根據(jù)用戶的設置連續(xù)寫入多個數(shù)據(jù),消除了2 次操作之間的等待時間,大大提高了數(shù)據(jù)傳輸速率。
自行設計了采用Xilinx 公司xc5vlx30t 芯片的PCI Express×4 接口數(shù)據(jù)傳輸卡;使用Xilinx 公司的ISE 9.2 對設計代碼進行綜合和布局布線, 生成配置文件, 下載到xc5vlx30t 芯片中;使用DELL Precision 690 工作站,在Windows 環(huán)境下編寫測試程序?qū)?shù)據(jù)傳輸卡PCI Express 接口數(shù)據(jù)傳輸?shù)乃俾蔬M行測試。
采用多種數(shù)據(jù)量對 PCI Express 接口進行DMA 方式讀數(shù)據(jù)測試,得到的結(jié)果如圖4 所示,硬件層數(shù)據(jù)傳輸速率穩(wěn)定在840 Mb/s。
圖4 實際測試讀數(shù)據(jù)速率
采用多種數(shù)據(jù)量對 PCI Express 接口進行DMA 方式寫數(shù)據(jù)測試,得到的結(jié)果如圖5 所示,硬件層數(shù)據(jù)傳輸速率穩(wěn)定在720 Mb/s。
圖5 實際測試寫數(shù)據(jù)速率
從圖 4、圖5 可以看出,DMA 控制器有效減少了數(shù)據(jù)傳輸過程中的等待時間,大幅度地提高了數(shù)據(jù)傳輸速率,發(fā)揮了PCI Express 總線的優(yōu)越性能。
5 結(jié)束語
本文采用基于 Xilinx 公司硬IP 核的方法設計實現(xiàn)了PCI Express 總線接口及數(shù)據(jù)的傳輸。對于DMA 控制器的設計,能提高數(shù)據(jù)傳輸?shù)乃俾?,使PCI Express 總線的性能得到充分發(fā)揮。