0 引言
與傳統(tǒng)的 PCI、PCI-X 并行總線(xiàn)相比[1],PCIe總線(xiàn)采用高速差分串行的方式進(jìn)行數(shù)據(jù)傳輸,這種端到端的數(shù)據(jù)傳送方式使得信號(hào)線(xiàn)減少、系統(tǒng)功耗降低,同時(shí)還具有非常明顯的帶寬優(yōu)勢(shì)。
目前通過(guò) FPGA 實(shí)現(xiàn) PCIe 接口是一種比較常用的方式,具有硬件成本低、可靠性高、靈活性大、易于升級(jí)等優(yōu)勢(shì)。兩大 FPGA 廠商 Xilinx 和 Altera均具有完善的接口 IP 和測(cè)試方法。基于此,筆者主要介紹了基于 Xilinx Virtex5 系列 FPGA 的 PCIe 接口的設(shè)計(jì)和 DMA 功能的實(shí)現(xiàn)方法,并在 x4 模式下進(jìn)行帶寬測(cè)試。
1 PCIe 總線(xiàn)簡(jiǎn)介
PCIe 系統(tǒng)中使用鏈路(Lane)進(jìn)行 2 個(gè) PCIe 設(shè)備間的物理連接,1 條鏈路相當(dāng)于 1 條只掛連 1 個(gè)設(shè)備的總線(xiàn),每條鏈路都分配有鏈路號(hào)。
PCIe 體系結(jié)構(gòu)采用分層設(shè)計(jì),分別是:物理層(Physical layer)、數(shù)據(jù)鏈路層(Data link layer)和事務(wù)層(Transaction layer)。物理層是總線(xiàn)的最底層,負(fù)責(zé)物理接口連接,為數(shù)據(jù)傳輸提供可靠的物理環(huán)境;數(shù)據(jù)鏈路層保證來(lái)自發(fā)送端事務(wù)層的報(bào)文可以可靠、完整地發(fā)送到接 收端的數(shù)據(jù)鏈路層;事務(wù)層定義了 PCIe 總線(xiàn)使用的總線(xiàn)事務(wù),這些事務(wù)可用于PCIe 系統(tǒng)內(nèi)各設(shè)備間的通信[2]。
目前最新的 PCIe 規(guī)范是 V3.0,在這之前有V1.0、V1.1、V2.0、V2.1 等多個(gè)版本,不同的規(guī)范規(guī)定了不同的總線(xiàn)頻率和編碼方式,如表 1。筆者的設(shè)計(jì)符合 V1.1 規(guī)范。
2 IP 核介紹及參數(shù)設(shè)置
2.1 IP 核簡(jiǎn)介
Xilinx PCIe 的 IP 具有高性能、高靈活性、高可靠性等特點(diǎn),支持 x1、x2、x4、x8 鏈路寬度。支持鏈路和極性的錯(cuò)序連接,完全符合 PCIe 的層級(jí)模型,包含事務(wù)層、數(shù)據(jù)鏈路層和物理層。圖 1 是 IP核的功能框圖及各個(gè)接口[3]。
圖 1 IP 核功能框圖及接口
用戶(hù)邏輯接口(User logic):用戶(hù)需要根據(jù)該接口編寫(xiě)本地總線(xiàn)邏輯,進(jìn)而與 IP 核進(jìn)行通信;
配置接口(Host interface):主機(jī)通過(guò)該接口對(duì)IP 核進(jìn)行配置或讀取狀態(tài);
物理層接口(PCI express fabric):通過(guò)高速差分信號(hào)與橋或根復(fù)合體直接進(jìn)行連接;
系統(tǒng)接口(System):包括時(shí)鐘和復(fù)位信號(hào)。
2.2 參數(shù)設(shè)置
需要設(shè)置的參數(shù)主要包括:參考時(shí)鐘、鏈路寬度、設(shè)備 ID、基址寄存器、TLP 大小等。參考時(shí)鐘一般選擇 100 MHz,TLP 大小建議選擇最大值
512Byte,鏈路寬度、設(shè)備 ID 可根據(jù)實(shí)際需求情況進(jìn)行設(shè)置?;芳拇嫫鳎˙AR)包含設(shè)備在總線(xiàn)域使用的地址范圍,通常情況下使用 2 到 3 個(gè) BAR 就足夠了。其余設(shè)置可采用默認(rèn)設(shè)置。圖 2、圖 3、圖4 是部分參數(shù)的設(shè)置情況。
圖 2 設(shè)置鏈路帶寬和參考時(shí)鐘
3 設(shè)置基址寄存器(BAR)設(shè)置情況
圖4 設(shè)置最大載荷
3 DMA 功能設(shè)計(jì)
PCIe 總線(xiàn)的高帶寬特性需要通過(guò) DMA 功能來(lái)實(shí)現(xiàn),有效且穩(wěn)定的 DMA 功能是實(shí)現(xiàn) PCIe 總線(xiàn)的關(guān)鍵。
針對(duì) PCIe 接口 Xilinx 提供了多個(gè)參考設(shè)計(jì)。
表 2 PCIe 各參考設(shè)計(jì)比較情況
筆者介紹的 DMA 功能主要以 XAPP1052 為基礎(chǔ)進(jìn)行設(shè)計(jì)。圖 5 是該參考設(shè)計(jì)的架構(gòu)框圖。
圖 5 XAPP1052 設(shè)計(jì)架構(gòu)
主要功能模塊說(shuō)明如下:
目標(biāo)邏輯(Target logic),用于捕獲上位機(jī)發(fā)出的單次存儲(chǔ)器讀寫(xiě) TLP;如果是寫(xiě) TLP 則根據(jù)地址和數(shù)據(jù)更新控制寄存器中的內(nèi)容,如果是讀 TLP 則根據(jù)地址返回控制和狀態(tài)寄存器中的數(shù)據(jù);
控制和狀態(tài)寄存器(Control/Status register):主要是與 DMA 控制器相關(guān)的如 DMA 傳輸長(zhǎng)度、啟動(dòng) DMA 等寄存器;
初始化邏輯(Initiator logic):與 PCIe 硬核交互,產(chǎn)生存儲(chǔ)器讀寫(xiě) TLP。
參考設(shè)計(jì) XAPP1052 主要以測(cè)試性能為主,設(shè)計(jì)中并沒(méi)有目標(biāo)存儲(chǔ)器,無(wú)法存儲(chǔ) DMA 測(cè)試數(shù)據(jù),筆者在 XAPP1052 的基礎(chǔ)上增加雙口 RAM 存儲(chǔ)器,并完成接口邏輯的設(shè)計(jì),最后通過(guò)測(cè)試程序完成上位機(jī)與雙口 RAM 間的 DMA 讀寫(xiě)操作,形成一個(gè)完整的 DMA 功能驗(yàn)證模塊。
圖 6 是 ISE 工程界面的截圖,其中雙口 RAM的寫(xiě)邏輯在模塊 BMD_RX_ENGINE 中產(chǎn)生,讀邏輯在模塊 BMD_TX_ENGINE 中產(chǎn)生。在 PCIe 總線(xiàn)中,由于 EP 發(fā)出的存儲(chǔ)器讀請(qǐng)求可以超越之前的存儲(chǔ)器讀請(qǐng)求,而且當(dāng)存儲(chǔ)器完成報(bào)文使用的Transaction ID 不同時(shí),存儲(chǔ)器讀完成 TLP 也可能超越之前的存儲(chǔ)器讀完成 TLP,這將造成存儲(chǔ)器讀完成 TLP 的亂序到達(dá) EP[6]。因此在處理 DMA 讀時(shí),要針對(duì)這種亂序情況做適當(dāng)處理,需要檢查存儲(chǔ)器讀完成 TLP 的 Requester ID、Status、Tag、Attr 等字段,最后將數(shù)據(jù)按正確的順序?qū)懭腚p口 RAM 中,在筆者的設(shè)計(jì)中,模塊 dma_read_reorder 完成的就是這一功能,有效解決了亂序到達(dá)的問(wèn)題。
圖 6 ISE 工程界面截圖
DMA 讀寫(xiě)的操作流程大致分以下幾個(gè)步驟:
1) 對(duì) DMA 控制器復(fù)位,進(jìn)行初始化操作;
2) 填寫(xiě) DMA 讀(寫(xiě))的目的地址寄存器;
3) 填寫(xiě) TLP 大小及數(shù)量寄存器,確定傳輸數(shù)據(jù)量的大??;
4) 啟動(dòng) DMA 讀(寫(xiě));
5) 等待并處理 DMA 讀(寫(xiě))完成中斷;
6) 回到 1)。
圖 7、圖 8 分別是 DMA 讀和 DMA 寫(xiě)測(cè)試情況。
圖 7 DMA 讀測(cè)試情況
8 DMA 寫(xiě)測(cè)試情況
由圖 7 和圖 8 可知,在 X4 模式下 DMA 讀和DMA 寫(xiě)的帶寬[7]分別達(dá)到 554 MB/S 和 881 MB/S。
4 結(jié)束語(yǔ)
筆者基于 XAPP1052 參考設(shè)計(jì),并增加了用于測(cè)試 DMA 數(shù)據(jù)的存儲(chǔ)器控制接口及存儲(chǔ)器讀完成TLP 檢查模塊,形成了完整的 DMA 測(cè)試功能模塊,解決了 DMA 讀時(shí)數(shù)據(jù)亂序到達(dá)等關(guān)鍵問(wèn)題,在 X4模式下,DMA 讀和 DMA 寫(xiě)的帶寬分別達(dá)到了 554MB/S 和 881 MB/S,可滿(mǎn)足大多數(shù)情況的帶寬要求。
評(píng)論
查看更多