【FPGA】基于FPGA的PCIE設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
PCIE簡(jiǎn)介
PCI Express 是用來(lái)互聯(lián)計(jì)算機(jī)和外圍設(shè)備的高速接口總線,是一種能夠應(yīng)用于移動(dòng)設(shè)備,臺(tái)式電腦,工作站,服務(wù)器,嵌入式計(jì)算機(jī)和通信平臺(tái)等。
PCIe的兩個(gè)設(shè)備之間可以實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)的通信串行通信,如果是多臺(tái)設(shè)備需要通過(guò)交換器(Switch)進(jìn)行互聯(lián),這樣一個(gè)系統(tǒng)可以連接多個(gè)設(shè)備。
PCIe總線作為處理器系統(tǒng)的局部總線,其作用與PCI總線類(lèi)似,主要目的是為了連接處理器系統(tǒng)中的外部設(shè)備,當(dāng)然PCIe總線也可以連接其他處理器系統(tǒng)。在不同的處理器系統(tǒng)中, PCIe體系結(jié)構(gòu)的實(shí)現(xiàn)方法略有不同。但是在大多數(shù)處理器系統(tǒng)中,都使用了RC、 Switch和PCIe-to-PCI橋這些基本模塊連接PCIe和PCI設(shè)備。在PCIe總線中,基于PCIe總線的設(shè)備,也被稱(chēng)為EP(Endpoint)。
計(jì)算機(jī)通信平臺(tái)中 , PCI Express體系結(jié)構(gòu)代表作高性能的外圍組件互聯(lián)方法
1、 由PCI 和PCI-X 體系結(jié)構(gòu)演變而來(lái)architectures
2、 PCI Express 以一種串行的點(diǎn)對(duì)點(diǎn)的方式互聯(lián)兩個(gè)設(shè)備
3、 信息傳輸基于數(shù)據(jù)包協(xié)議實(shí)現(xiàn)
4、 PCI Express 互聯(lián)中可實(shí)現(xiàn)單通道或多通道的數(shù)據(jù)傳輸
5、 PCI Express 協(xié)議目前已經(jīng)發(fā)布4個(gè)版本
PCIE的特性如下:
1、點(diǎn)對(duì)點(diǎn)傳輸
2、 串行總線意味著使用更少的引腳
3、 通道數(shù)可選擇: x1, x2, x4, x8, x12, x16, x32
4、 全雙工通信
5、 2.5Gbps / 5.0Gbps
6、 基于數(shù)據(jù)包的傳輸協(xié)議
計(jì)算機(jī)體系結(jié)構(gòu)中PCIe的應(yīng)用架構(gòu)如下:
從上面我們可以看出PCIE應(yīng)用架構(gòu)主要包括四部分:
1、FSB總線CPU交互總線:FSB總線(Front Side Bus)是CPU和DDR內(nèi)存交互的總線
2、Root Complex:RC (Root complex)是PCIe結(jié)構(gòu)體系中的一個(gè)重要的結(jié)構(gòu)部件, RC的提出跟X86系統(tǒng)架構(gòu)密切相關(guān),實(shí)際上只有在x86架構(gòu)中才有標(biāo)準(zhǔn)的RC規(guī)范定義,而在其他系統(tǒng)中并不存在標(biāo)準(zhǔn)定義的RC的全部功能。例如X86的架構(gòu)中包含DDR控制器和FSB to PCIe的橋, 而ZynqSoc芯片架構(gòu)中包含AXI to PCIe的橋和DDR控制器,PowerPc只包含一個(gè)PCIe總線控制器。這里需要注意Root complex包括root port。
3、PCIe Switch:Switch PCIe鏈路通過(guò)Switch進(jìn)行鏈路擴(kuò)展
4、PCIe End point:即常見(jiàn)的PCIE終端設(shè)備,F(xiàn)PGA最常用的也是End point。
FPGA在PCIE中可以成為Root Complex、Switch和 End point:
PCIe總線層次結(jié)構(gòu)主要包括三層主要是事務(wù)層、數(shù)據(jù)鏈路層、物理層。
1、事務(wù)層:PCIe總線層次結(jié)構(gòu)的最高層,該層次將接收PCIe設(shè)備核心層的數(shù)據(jù)請(qǐng)求,并將其轉(zhuǎn)換為PCIe總線事務(wù), PCIe總線使用的這些總線事務(wù)在TLP頭中定義。PCIe總線使用的數(shù)據(jù)報(bào)文首先在事務(wù)層中形成, 這個(gè)數(shù)據(jù)報(bào)文也被稱(chēng)之為事務(wù)層數(shù)據(jù)報(bào)
文,即TLP。(解釋?zhuān)褐饕馑家簿褪鞘聞?wù)層將數(shù)據(jù)封裝成TLP包發(fā)給下層使用)
2、數(shù)據(jù)連路層:TLP在經(jīng)過(guò)數(shù)據(jù)鏈路層時(shí)被加上Sequence Number前綴和CRC后綴,然后發(fā)向物理層。
3、物理層:PCIe的電氣特性、電路等。在PCIe鏈路可以正常工作之前,需要對(duì)PCIe鏈路進(jìn)行鏈路訓(xùn)練,在這個(gè)過(guò)程中,就會(huì)用。
LTSSM狀態(tài)機(jī)。LTSSM全稱(chēng)是Link Training and Status State Machine。這個(gè)狀態(tài)機(jī)在PCIe總線的物理層之中。狀態(tài)轉(zhuǎn)移圖如下:
Detect狀態(tài)是PCIe鏈路訓(xùn)練的開(kāi)端。此外, Detect,顧名思義,需要實(shí)現(xiàn)檢測(cè)工作。因?yàn)樵谶@個(gè)狀態(tài)時(shí),發(fā)送端TX需要檢測(cè)接收端RX是否存在且可以正常工作,如果檢測(cè)正常,才能進(jìn)入其他狀態(tài)。判斷RX是否存在的邏輯比較簡(jiǎn)單,就是通過(guò)一個(gè)“Detect logic”電路比較RC時(shí)間常數(shù)的大小。
從上圖可以發(fā)現(xiàn)PCIe終端連接上,時(shí)間常數(shù)會(huì)變大。多以也就以此決定Detect狀態(tài)是否進(jìn)入下一個(gè)狀態(tài)。
Polling 狀態(tài)的目的是"對(duì)暗號(hào)",實(shí)現(xiàn)無(wú)障礙溝通。進(jìn)入這個(gè)狀態(tài)后, TX和RX之間通過(guò)發(fā)送TS1、 TS2 OS序列來(lái)確定Bit Lock, Symbol Lock以及解決Lane極性反轉(zhuǎn)的問(wèn)題。
Bit Lock: 在Bit傳輸過(guò)程中, RX PLL鎖定TX Clock頻率,這個(gè)過(guò)程稱(chēng)為RX實(shí)現(xiàn)"Bit Lock。(解釋?zhuān)阂簿褪俏煌剑?/span>
Symbol Lock: RX端串并轉(zhuǎn)化器知道如何區(qū)別一個(gè)有效的10-bit Symbol,這個(gè)過(guò)程稱(chēng)為“Symbol Lock”. 這里用到的是COM控制符。(解釋?zhuān)阂簿褪菐剑?/span>
常見(jiàn)的視頻方案如下:
FPGA中PCIE的實(shí)現(xiàn):
1、7系列FPGA支持實(shí)現(xiàn)Gen1與Gen2的PCIE協(xié)議
2、Virtex-7 FPGA支持實(shí)現(xiàn)Gen3的PCIE協(xié)議
3、UltraScale與UltraScale+支持Gen3的PCIE協(xié)議
4、支持x1,x2,x4,x8,x16lanes的通路
5、PCIE的硬核使用了GTP接口用來(lái)串行傳輸數(shù)據(jù)
PCIE的速度傳輸速度如下:
FPGA中PCIE硬核的介紹,整體框圖如下:
1、該硬核PCIE支持Endpoint和Root Port
2、支持AXI4-Stream用戶(hù)接口:
x1, x2, x4, 和x8 lanes; 64-bit 和128-bit位寬
Root Port簡(jiǎn)要介紹
Xilinx FPGAs支持硬核root port,但是沒(méi)有硬核root complex。root complex包括一個(gè)或多個(gè)root port、內(nèi)存,IO子系統(tǒng)等等。root port只是提供給switch或者endpoint連接的端口。二者之間的關(guān)系如下:
root port經(jīng)常使用在簡(jiǎn)單的設(shè)計(jì)中,比如與單個(gè)的endpoint相連。root complex則有配套的軟件環(huán)境與復(fù)雜的設(shè)計(jì)。
FPGA構(gòu)建root port的常見(jiàn)案例如下:
FPGA構(gòu)建root complex的常見(jiàn)案例如下:
root port與endpoint也有許多不同點(diǎn)。root port使用Type 1配置頭空間。endpoint使用Type 0配置頭空間。兩者主要的區(qū)別如下:
PCIE協(xié)議簡(jiǎn)述
PCIE的地址空間
PCI Express實(shí)現(xiàn)了四種地址空間:
1、 PCIe配置空間(多達(dá)4KB)
– 必須有,每個(gè)PCI設(shè)備都有其映射到內(nèi)存上的配置空間
– 前256字節(jié)與PCI兼容
2、 PCIe內(nèi)存映射空間
– 可選的,根據(jù)設(shè)備功能選擇是否需要映射內(nèi)存空間
3、 PCIe IO映射空間
– 可選的
4、PCIe消息空間
其中PCIe消息空間主要用于中斷的使用,內(nèi)存映射空間用于大量數(shù)據(jù)的傳輸,IO映射空間用于少量數(shù)據(jù)的傳輸。
Type0型:
– 用于配置端點(diǎn)設(shè)備
– 由根復(fù)合體發(fā)起,配置預(yù)定義的PCI系統(tǒng)端點(diǎn)設(shè)備頭部區(qū)域
– 設(shè)備號(hào)/ID號(hào)
– BAR
Type1型:
– 用于配置Switches/Bridges/end point
PCIE TLP包的數(shù)據(jù)類(lèi)型
上面已經(jīng)講解PCIE分別包括事務(wù)層、數(shù)據(jù)鏈路層、物理層,每一層對(duì)TLP包的作用如下:
這里的3DW與4DW其實(shí)是與地址是32位還是64位掛鉤。
具體TLP包在每層協(xié)議的情況如下:
PCIE中TLP包的類(lèi)型如下:
PCIE的路由類(lèi)型
PCIE每一種請(qǐng)求或者完成報(bào)文頭都會(huì)有類(lèi)型標(biāo)注,每個(gè)數(shù)據(jù)包的路由都基于以下三種方式:
1、 地址路由
2、 ID 路由
3、 隱含式路由
端點(diǎn)的地址路由
端點(diǎn)設(shè)備檢查T(mén)LP包中的地址與BAR中所有地址進(jìn)行比較,如果不屬于本端點(diǎn)范圍,則拒絕。
端點(diǎn)的ID路由
端點(diǎn)設(shè)備檢查T(mén)LP包里的 總線 ID 和 設(shè)備 ID 功能ID是否與本端點(diǎn)一致,這些信息在Type0的配置信息里可以捕獲。
不同類(lèi)型的TLP包與路由類(lèi)型的對(duì)應(yīng)關(guān)系如下:
PCIE點(diǎn)對(duì)點(diǎn)的傳輸框圖
1、配置IO傳輸
2、DMA傳輸
3、end point與end piont之間的傳輸
PCIE的中斷類(lèi)型
PCIE的中斷類(lèi)型主要有兩種:
1、MSI:消息中斷
2、INTx:引腳中斷
真正的PCIe設(shè)備:必須使用MSI發(fā)送中斷,可選擇性地支持INTx消息。
PCI設(shè)備:必須支持INTx消息
PCIE的理論帶寬
Gen2單向鏈路速率5Gbps
1、 使用8B/10B編碼,產(chǎn)生20%的數(shù)據(jù)開(kāi)銷(xiāo)
2、 理論帶寬=鏈路速率 80% 通道數(shù)
3、 對(duì)于單通道:
– Gen1: 2.5Gbps0.8=250MBps
– Gen2: 5Gbps0.8=500MBps
– Gen3: 8Gbps*1=1GBps
4、 更多的開(kāi)銷(xiāo)是由協(xié)議導(dǎo)致
– 數(shù)據(jù)頭
– 校驗(yàn)位
– 鏈路訓(xùn)練
– 錯(cuò)誤通信
TLP包格式簡(jiǎn)述
上面我們已經(jīng)講解了TLP包常見(jiàn)的類(lèi)型,那么這部分內(nèi)容講解每種TLP包的具體格式。
一個(gè)TLP包的格式如下:
每位的詳細(xì)信息如下:
接下來(lái)對(duì)上面的每一位進(jìn)行粗略的介紹。
1、Fmt :用來(lái)指明TLP包是3DW還是4DW
2、Type :用來(lái)確定TLP包的類(lèi)型,
Memory read or write
Completion packet
Configuration packet
Message
3、Traffic Class:除了MemoryRead/Write TLPs必須是零,一般情況是默認(rèn)為0
4、Attr :包含有關(guān)處理事務(wù)時(shí)核心行為的特定信息
5、TD :當(dāng)該位位1是,TLP包中包括CRC檢驗(yàn),為零時(shí)不包括CRC校驗(yàn)
6、EP :指示此TLP包含錯(cuò)誤且應(yīng)忽略
7、AT :地址類(lèi)型,一般默認(rèn)為零即可。
Default/Untranslated (00)
Translation Request (10)
Translated (11)
8、Length Field :描述TLP包種有效數(shù)據(jù)的長(zhǎng)度,注意單位時(shí)DW,最大長(zhǎng)度時(shí)1024個(gè)DW長(zhǎng)度
9、First/Last Byte Enables:四位中的每一位分別對(duì)應(yīng)TLP包中的第一個(gè)DW和最后一個(gè)DW中的每個(gè)字節(jié)是否有效。一個(gè)DW正好也是4個(gè)字節(jié)。
Memory Write TLP Header格式
Memory Write TLP Header格式如下:
3DW的TLP包頭:
4DW的TLP包頭:
1、Requester ID:包括bus, device, and function numbers這些在ID路由的時(shí)候時(shí)必備信息
2、Tag :由用戶(hù)定義,具體的內(nèi)容與作用,用戶(hù)進(jìn)行商議。
3、Address:byte address,最低的兩位總是零對(duì)齊到DWord尋址。
Memory Read TLP Header格式
Memory Read TLP Header格式如下:
3DW的TLP包頭:
4DW的TLP包頭:
1、Tag – 這里得Tag主要用于返回得CplDs包得重組,因?yàn)轱埢貋?lái)得完成包不一定是按照順序返回的。
這里沒(méi)有什么新的位介紹,在前面我們已經(jīng)介紹完畢。
Memory Read 是 Non‐Posted:
Non‐Posted的請(qǐng)求總是生成一個(gè)完成包來(lái)回應(yīng)。除非出現(xiàn)錯(cuò)誤,否則Posted的請(qǐng)求永遠(yuǎn)不會(huì)生成完成包。一般的MRd會(huì)產(chǎn)生一個(gè)帶有數(shù)據(jù)包的完成。一個(gè)讀請(qǐng)求可以生成一個(gè)或多個(gè)完成包。
Completions TLPs格式
1、Tag :這里需要注意Tag標(biāo)志主要是為了接收端按照發(fā)送的順序組包
2、Lower Address :指示第一個(gè)啟用的數(shù)據(jù)字節(jié)的字節(jié)地址的低位,較低的地址和長(zhǎng)度不能跨越一個(gè)RCB
RCB: Read Completion Boundary
3、Byte count :表示在滿足請(qǐng)求之前剩余的字節(jié)數(shù)
4、Completion status :只是完成包的狀態(tài):
Successful completion (“000”)
Unsupported request (“001”)
Configuration request retry status (“010”)
Completer abort (“100”)
5、Requester ID :請(qǐng)求CplD的設(shè)備的ID(bus, device, function)
6、Completer ID :正在構(gòu)建CplD的設(shè)備的ID(bus, device, function)
返回的時(shí)候必須是RCB的整數(shù)倍。而且第一個(gè)要與RCB對(duì)齊,且不能超過(guò)MPS,這里給出一個(gè)官方的示例:
示例1:
示例2:
題目:
解答:
Message/Message with Data TLP格式
因?yàn)橐话阌貌坏轿覀冞M(jìn)行手動(dòng)組信息包,所以這里我們也就不詳細(xì)介紹。
PCIE IP核配置需要的注意點(diǎn)
這里簡(jiǎn)單介紹一下PCIE核配置過(guò)程中的注意點(diǎn),這次我們先不使用XDMA IP,使用下面的PCIE IP:
為了盡可能多的了解PCIE IP中的細(xì)節(jié),我們選擇高級(jí)IP定制:
1、選擇高級(jí)IP定制,供用戶(hù)選擇的功能增多
2、這里可以選擇這個(gè)PCIE IP核是當(dāng)作endpoint還是root port來(lái)使用
3、這是指明這個(gè)PCIE IP再硬件中的位置編號(hào)
4、指明PCIE的lanes數(shù)目
5、指明一條lanes的最大通信速度
6、將PCIE轉(zhuǎn)換成AXI4協(xié)議的時(shí)鐘
7、將PCIE轉(zhuǎn)換成AXI4協(xié)議的數(shù)據(jù)位寬
8、PCIE IP的參考頻率
1、廠商ID,專(zhuān)屬于Xilinx的PCIE的ID,是固定的。
2、設(shè)備ID,與廠商ID一起指明數(shù)據(jù)的類(lèi)型,被使用選擇PCIE上位機(jī)的軟件驅(qū)動(dòng)。
3、版本ID,指明使用該P(yáng)CIE IP進(jìn)行設(shè)置的版本
4、子廠商ID,用來(lái)更近一步的區(qū)分Xilinx旗下的廠商
5、子系統(tǒng)ID,用來(lái)識(shí)別板卡的的ID
上面的值一般默認(rèn)即可,不需要做太多的處理
1、選擇使能Bar空間。這里需要注意的是,root port對(duì)于endpoint的訪問(wèn)只能訪問(wèn)bar空間,而endpoint對(duì)root port的讀寫(xiě)操作可以訪問(wèn)整個(gè)內(nèi)存。
2、選擇Bar的地址是32位還是64位,空間大小一般選擇1K即可,只是用來(lái)傳輸一些命令。其值的大小與空間大小有關(guān),具體的關(guān)系這里不清楚。
上面整個(gè)設(shè)置,再PCIE的頭配置空間中均有體現(xiàn):
1、這里可以加上buffer進(jìn)行優(yōu)化,其余的默認(rèn)即可。
1、這里我們一般不選擇共享邏輯
1、引腳中斷,傳統(tǒng)意義下的中斷,在PCIE中基本上不再使用
2、消息中斷,在PCIE中較為常用