張銳+曹彥榮
摘 要 PCI Express總線是一種點(diǎn)對(duì)點(diǎn)串行連接的設(shè)備連接,每個(gè)設(shè)備都擁有自己獨(dú)立的數(shù)據(jù)連接,各個(gè)設(shè)備之間并發(fā)的數(shù)據(jù)傳輸互不影響,因此具有很高的傳輸速率。本設(shè)計(jì)使用Xilinx公司FPGA提供的PCIe IP硬核實(shí)現(xiàn)PCIe接口,并針對(duì)其高帶寬的優(yōu)勢(shì),實(shí)現(xiàn)了PCIe總線的Brust數(shù)據(jù)傳輸方案,并經(jīng)過實(shí)際傳輸驗(yàn)證,表明該設(shè)計(jì)方案可以滿足傳輸帶寬的要求。
關(guān)鍵詞 PCIE;FPGA;Burst讀寫
中圖分類號(hào):TP274 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1671-7597(2014)07-0029-03
PCI Express總線是一種完全不同于過去PCI總線的一種全新總線規(guī)范,與PCI總線共享并行架構(gòu)相比,PCI Express總線是一種點(diǎn)對(duì)點(diǎn)串行連接的設(shè)備連接方式,點(diǎn)對(duì)點(diǎn)意味著每一個(gè)PCI Express設(shè)備都擁有自己獨(dú)立的數(shù)據(jù)連接,各個(gè)設(shè)備之間并發(fā)的數(shù)據(jù)傳輸互不影響,而對(duì)于過去PCI那種共享總線方式,PCI總線上只能有一個(gè)設(shè)備進(jìn)行通信,一旦PCI總線上掛接的設(shè)備增多,每個(gè)設(shè)備的實(shí)際傳輸速率就會(huì)下降,性能得不到保證。PCI Express總線利用串行連接特點(diǎn),能輕松的將數(shù)據(jù)傳輸速度提到一個(gè)很高的頻率,遠(yuǎn)遠(yuǎn)超出PCI總線的傳輸速率。
PCI Express是一種復(fù)雜的協(xié)議,它的實(shí)現(xiàn)可以采用專用的協(xié)議芯片,但是缺乏靈活性和可配置性,限制了系統(tǒng)整體性能。另一種方式是采用FPGA邏輯來實(shí)現(xiàn),PCIE IP硬核一般只實(shí)現(xiàn)PCIE的物理層和數(shù)據(jù)鏈路層的協(xié)議,設(shè)計(jì)者可以在IP硬核基礎(chǔ)上完成PCIE的TLP(數(shù)據(jù)傳輸層)和應(yīng)用層協(xié)議,雖然開發(fā)過程較復(fù)雜,但可根據(jù)應(yīng)用需要進(jìn)行靈活的配置,具有良好的可移植性,能更好的發(fā)揮PCIE高帶寬的優(yōu)勢(shì)。
Xilinx公司的Virtex 5系列FPGA芯片內(nèi)嵌PCI Express Endpoint Block硬核,為實(shí)現(xiàn)單片可配置PCI Expres總線解決方案提供了可能。本文在研究PCI Express 接口協(xié)議和PCI Express Endpoint Block硬核的基礎(chǔ)上,使用Virtex5 LX330T FPGA芯片設(shè)計(jì)PCI Express接口硬件電路,實(shí)現(xiàn)PCI Express數(shù)據(jù)傳輸。
1 PCIE接口Burst讀寫設(shè)計(jì)
1)FPGA內(nèi)置PCIe硬核特點(diǎn)。在接口電路中,PCI Express物理層和數(shù)據(jù)鏈路層的電路采用Xilinx公司的PCI Express Endpoint Block plus v1.9硬核端點(diǎn)模塊實(shí)現(xiàn),能夠有效完成接口物理層和數(shù)據(jù)鏈路層的數(shù)據(jù)處理功能,提供給上層一個(gè)事務(wù)層數(shù)據(jù)接口。
圖1 設(shè)計(jì)流程圖
上層電路主要由4部分電路構(gòu)成,分別是核配置與輔助控制模塊、數(shù)據(jù)發(fā)送控制器、數(shù)據(jù)接收控制器、BAR地址空間管理,如圖1所示,最終通過BAR地址空間與用戶邏輯進(jìn)行交互。
各個(gè)部分的作用如下。
①Endpoint for PCIe:FPGA內(nèi)的硬核,對(duì)外負(fù)責(zé)與其他PCIe設(shè)備協(xié)議通信對(duì)內(nèi)與TX、RX模塊進(jìn)行64bit并行與高速串行的轉(zhuǎn)換。
②PIO_TO_CTRL:PCIe核配置與輔助控制。
③EP_RX:負(fù)責(zé)主機(jī)單字讀寫FPGA的狀態(tài)機(jī)實(shí)現(xiàn)和Burst模式下寫操作的數(shù)據(jù)接收。
④EP_TX:負(fù)責(zé)主機(jī)單字讀FPGA的狀態(tài)機(jī)實(shí)現(xiàn)和Burst模式下讀操作的數(shù)據(jù)發(fā)送。
⑤EP_MEM:映射為PCIe空間的幾個(gè)BAR地址空間,將電子盤控制寄存器映射到閃存陣列主控,將數(shù)據(jù)區(qū)映射到雙口數(shù)據(jù)緩沖區(qū)控制器。
由于PCIe核只支持單字訪問的模式,所以需要修改數(shù)據(jù)接收控制器EP_RX、數(shù)據(jù)發(fā)送控制器EP_TX、BAR地址空間管理模塊EP_MEM,實(shí)現(xiàn)對(duì)Burst訪問模式的支持。
2)TLP數(shù)據(jù)包結(jié)構(gòu)。當(dāng)處理器或者其他PCIe設(shè)備訪問PCIe設(shè)備時(shí),所傳送的數(shù)據(jù)報(bào)文首先通過事務(wù)層被封裝為一個(gè)或者多個(gè)TLP數(shù)據(jù)包,之后才能通過PCIe總線的各個(gè)層次發(fā)送出去。TLP的基本格式如圖2所示。
圖2 TLP的基本格式
一個(gè)完整的TLP由1個(gè)或者多個(gè)TLP前綴、TLP頭、數(shù)據(jù)有效負(fù)載和摘要組成。在整個(gè)數(shù)據(jù)報(bào)文中,只有TLP頭和數(shù)據(jù)有效負(fù)載需要由用戶邏輯代碼來完成,其他部分都是PCIe核自動(dòng)生成的。
TLP頭是TLP最重要的標(biāo)志,包含了當(dāng)前TLP的總線事物類型、路由信息等一系列信息。本文主要涉及到存儲(chǔ)器寫和存儲(chǔ)器讀事務(wù)。對(duì)于32bit地址空間的存儲(chǔ)器讀寫請(qǐng)求,其TLP頭格式如圖3所示,硬核同時(shí)也支持64bit地址空間的操作。請(qǐng)求者通過填寫TLP頭內(nèi)的正確信息以及地址并且將數(shù)據(jù)放在TLP頭的后面發(fā)送給接收者,接收者便會(huì)解析包內(nèi)的信息將正
圖3 存儲(chǔ)器讀寫請(qǐng)求報(bào)文頭格式
確的數(shù)據(jù)放到自己的地址空間中。
對(duì)于存儲(chǔ)器寫請(qǐng)求,EP_RX控制器接收到TLP頭和數(shù)據(jù)之后,只需要通過EP_MEM模塊將數(shù)據(jù)存入寄存器或者雙口緩沖區(qū)中
即可。
對(duì)于存儲(chǔ)器讀請(qǐng)求,EP_RX控制器接收讀請(qǐng)求之后,需要啟動(dòng)EP_TX控制器將應(yīng)答數(shù)據(jù)組織在TLP完成報(bào)文中,完成讀操作。完成報(bào)文的頭格式如圖4所示。
圖4 完成報(bào)文頭格式
3)Burst寫操作的設(shè)計(jì)與實(shí)現(xiàn)。PCIe硬核的PIO模塊本身已經(jīng)支持32bit地址空間的單字存儲(chǔ)器讀寫請(qǐng)求、64bit地址空間的單字存儲(chǔ)器讀寫請(qǐng)求和IO讀寫請(qǐng)求。本設(shè)計(jì)主要完成對(duì)32bit地址空間Burst方式的存儲(chǔ)器讀寫請(qǐng)求的支持。同時(shí),考慮到實(shí)際應(yīng)用中DMA控制器一般只支持?jǐn)?shù)據(jù)8字節(jié)對(duì)齊的情況,所以本設(shè)計(jì)也只支持?jǐn)?shù)據(jù)8字節(jié)對(duì)齊的Burst讀寫訪問。
對(duì)于存儲(chǔ)器寫請(qǐng)求,實(shí)現(xiàn)的主要方法是EP_RX將接收的TLP頭中各個(gè)字段正確解析,并區(qū)分是單字寫和Burst寫,確定寫操作的數(shù)據(jù)長(zhǎng)度,如果是單字寫,就將接下來的64位數(shù)據(jù)存入寄存器或者雙口緩沖區(qū)中;如果是Burst寫,就將數(shù)據(jù)按照64位寫入雙口緩沖區(qū)中,每個(gè)時(shí)鐘周期,地址自動(dòng)增加,直到數(shù)據(jù)全部寫入雙口緩沖區(qū)中。EP_RX控制器的狀態(tài)機(jī)如圖5所示。endprint
圖5 EP_RX控制器狀態(tài)機(jī)
圖6 EP_TX控制器狀態(tài)機(jī)
4)Burst讀操作的設(shè)計(jì)與實(shí)現(xiàn)。對(duì)于存儲(chǔ)器讀請(qǐng)求,EP_RX控制器對(duì)接收到的TLP進(jìn)行解析,將請(qǐng)求數(shù)據(jù)的起始地址和長(zhǎng)度發(fā)送給EP_TX控制器,然后啟動(dòng)EP_TX完成數(shù)據(jù)傳遞。EP_RX控制器的狀態(tài)機(jī)如圖6所示。
在PCIe總線中,一個(gè)存儲(chǔ)器讀請(qǐng)求TLP可能收到目標(biāo)設(shè)備發(fā)出的多個(gè)完成報(bào)文后,才能完成一次存儲(chǔ)器讀操作。因?yàn)樵赑CIe總線中,一個(gè)存儲(chǔ)器讀請(qǐng)求最多可以請(qǐng)求4KB大小的數(shù)據(jù)報(bào)文,而目標(biāo)設(shè)備可能會(huì)使用多個(gè)存儲(chǔ)器讀完成TLP才能將數(shù)據(jù)傳遞完畢。
在PCIe設(shè)備的配置空間中,Link Control寄存器的RCB(Read Completion Boundary)位決定了讀完成報(bào)文的邊界,本文設(shè)計(jì)為64B。當(dāng)讀請(qǐng)求跨越了RCB邊界時(shí),需要分多個(gè)完成報(bào)文才能將數(shù)據(jù)傳遞完畢。
EP_TX收到完全請(qǐng)求,判斷是不帶有效載荷的完成報(bào)文,還是帶有效載荷的完成報(bào)文。如果是需要帶有效載荷,并且長(zhǎng)度大于4個(gè)字節(jié)的情況就啟動(dòng)Burst讀周期。
Burst讀周期先進(jìn)行合法性檢查,對(duì)于起始地址或者請(qǐng)求長(zhǎng)度不是8字節(jié)對(duì)齊的請(qǐng)求視為無效請(qǐng)求,不予響應(yīng)。
對(duì)于合法讀請(qǐng)求,EP_TX控制器按RCB邊界進(jìn)行完成周期拆分,具體的算法流程如圖7所示。
①對(duì)于數(shù)據(jù)同一個(gè)RCB邊界之內(nèi)的讀請(qǐng)求,第一個(gè)周期完成所有數(shù)據(jù)傳遞。
②對(duì)于數(shù)據(jù)跨RCB邊界的讀請(qǐng)求,按RCB區(qū)段劃分讀寫周期,先完成第一個(gè)周期,使得剩余數(shù)據(jù)的起始地址按64字節(jié)對(duì)齊;接下來每個(gè)周期傳遞64字節(jié),直到數(shù)據(jù)傳遞結(jié)束;最后一個(gè)周期可能不滿64字節(jié)。
圖7 讀完成的拆分算法
2 結(jié)果與驗(yàn)證
在完成FPGA的程序編寫后,用Modlesim仿真環(huán)境對(duì)程序進(jìn)行仿真。用VHDL實(shí)現(xiàn)TestBench作為激勵(lì)加載單元對(duì)EP_RX和EP_TX控制器進(jìn)行功能仿真驗(yàn)證。在實(shí)踐中進(jìn)一步使用ChipScrop抓圖,主要分析由通過EP_RX和EP_TX控制器產(chǎn)生的PCIe總線傳輸信號(hào)時(shí)序是否滿足要求。
圖8捕獲了Burst的寫過程,由波形可以看出,EP_RX控制器正確解析Burst寫數(shù)據(jù)報(bào)文,并成功寫入雙口緩沖區(qū)中。
圖8 Burst寫時(shí)序
讀操作的過程相對(duì)復(fù)雜,圖9捕獲了Burst讀過程,EP_RX控制器接收到讀請(qǐng)求后啟動(dòng)EP_TX控制器,EP_TX控制器將主機(jī)端發(fā)起的一個(gè)存儲(chǔ)器讀請(qǐng)求分成多個(gè)存儲(chǔ)器讀完成報(bào)文進(jìn)行數(shù)據(jù)傳輸。
圖9 Burst讀時(shí)序
經(jīng)實(shí)驗(yàn)測(cè)試,如表1所示,采用Burst方式的數(shù)據(jù)傳輸,速度明顯提高,有效提高了大容量存儲(chǔ)系統(tǒng)的傳輸帶寬。
參考文獻(xiàn)
[1]PCI Express Base Spec ification, 1. 0a ed[S].PC I SIG,2003.
[2]Xilinx.LogiCORE? Endpoint v3.6 for PCI Express User Guide[M].October 10,2007.
[3]馬鳴錦,朱劍冰.PCI、PCI-X和PCI Express的原理及體系結(jié)構(gòu)[M].北京:清華大學(xué)出版社,2007.
[4]李木國(guó),黃影,劉于之.基于FPGA的PCIe總線接口的DMA傳輸設(shè)計(jì)[J].計(jì)算機(jī)測(cè)量與控制,2013(01).
[5]沈輝,張萍.FPGA在PCI Express總線接口中的應(yīng)用[J].現(xiàn)代電子技術(shù),2010(14).
[6]汪精華,胡善清.基于FPGA實(shí)現(xiàn)的PCIE協(xié)議的DMA讀寫模塊[J].微計(jì)算信息,2010,26(10).
作者簡(jiǎn)介
張銳(1982-),女,陜西西安人,工程師,研究生,研究方向:計(jì)算機(jī)硬件設(shè)計(jì)。endprint