寫在前面的話:
預(yù)備了前面的并行串行傳輸?shù)幕A(chǔ)知識,就是為了一個PCIe的項目,搞得頭疼,一個例子都跑了一下,看到能夠識別心里高興了一把,但是打開代碼一看 完全不懂 查找資料 很多 但是也很凌亂 比清晰,不適合小白(如我?。。。。。?下定決心 整理一下 參考兩本書籍?!禤CI_Express_Base_Specification_Revision》,《PCI Express System Architecture》。第一個文檔是將PCIe設(shè)備,通信時包的格式,以及設(shè)備中的寄存器的含義和使用方法等,一本工具書而已啦(說的很輕巧,還是很有用的,畢竟是協(xié)議Specification),開發(fā)的時侯關(guān)于接口,包格式,寄存器問題是隨時可以查閱的文檔。第二個是非常有必要去讀的一個文檔,可以幫你大致了解,很快入門。
掃盲完畢 會做個實際的例程,僅供參考。。。。。。。。。。。。
電腦中的顯卡 網(wǎng)卡 硬盤等、都是基于PCIe總線的,PCIe是一種串行通信協(xié)議, 是一種高速串行計算機擴展總線標(biāo)準,它原來的名稱為“3GIO”,是由英特爾在2001年提出的,旨在替代舊的PCI,PCI-X和AGP總線標(biāo)準。 它屬于高速串行點對點雙通道高帶寬傳輸,所連接的設(shè)備分配獨享通道帶寬,不共享總線帶寬,主要支持主動電源管理,錯誤報告,端對端的可靠性傳輸,熱插拔以及服務(wù)質(zhì)量(QOS)等功能。
PCI Express 2.0規(guī)范的主要在數(shù)據(jù)傳輸速度上做出了重大升級,即從以前的2.5GT/s總線頻率翻倍至5GT/s,這也就是說以前PCI Express 2.0 x16接口能夠翻番達到驚人的8GB/s總線帶寬(1GB/s=8Gbps)。
目前最新的版本為PCI-E 3.0,是生產(chǎn)中可用于主流個人電腦的擴展卡的最新標(biāo)準。也有還未退市的PCI-E(即1.0版)。而在2009年的第二季度發(fā)布的AMD RD890芯片組將率先支持PCI-E 3.0版本。2.0比1.0帶寬提高一倍,而3.0比2.0版帶寬又提升一倍,為5GHz x 4。
正如上節(jié)所說,在低速情況下,并行結(jié)構(gòu)的傳輸無疑是非常高效的傳輸方式,但是當(dāng)傳輸速率非常高i的時候,并行傳輸?shù)闹旅秉c暴露就很明顯了,在這種高速的情形下,每一位在傳輸線到達目的地的時間不可能一致(類比PCB Layout要求等長,就是為了比如一個字節(jié)的為一位到達接收端的時間是一樣的),那么怎么解決這種問題呢,用串行,因為串行傳輸是一位一位的進行傳輸?shù)模粫霈F(xiàn)并行傳輸所帶類的不能同時到達的問題,這就是串行的優(yōu)勢,它可以在很高的頻率下進行數(shù)據(jù)的傳輸,用高頻率掩蓋它的劣勢。
PCIe是使用一對差分信號來傳輸每一位數(shù)據(jù)的,當(dāng)D+比D-信號高,是傳輸?shù)倪壿?,否則為0,當(dāng)相同時,不工作(PCIe系統(tǒng)沒有時鐘線)
pcie設(shè)備有兩大類,一種是root port,另一種Endpoint。從字面意思可以了解這兩類的作用,root port相當(dāng)于一個根節(jié)點,將多個endpoint設(shè)備連接在一個節(jié)點,同時它完成數(shù)據(jù)的路由。上圖中的Switch就是一個root port設(shè)備。而endpoint就是最終數(shù)據(jù)的接受者,命令的執(zhí)行者。
這里我們就對pcie總線在計算機結(jié)構(gòu)中的位置有一個大致的了解,下面我們對pcie數(shù)據(jù)的傳輸方式進行一個簡單的介紹。pcie數(shù)據(jù)的傳輸方式類似于TCP/IP的方式,將數(shù)據(jù)按數(shù)據(jù)包的格式進行傳輸,同時對結(jié)構(gòu)進行分層。
數(shù)據(jù)線(TXn,TXp;RXn,RXp),控制線(Wake#),電源和復(fù)位。介紹一下控制線和電源之間的關(guān)系,電源由兩種電源都是3.3V(Vcc和Vaux),PCIe設(shè)備可以控制wake#信號可以喚醒(喚醒之前Vcc已經(jīng)斷電,Vaux仍然有點,這樣也保證了PCIe設(shè)備中必要的寄存器和特殊的寄存器可以操作的基礎(chǔ)),當(dāng)某個設(shè)備需要被喚醒時,該設(shè)備首先將wake#信號置位,然后經(jīng)過一段延時,處理器開始供電Vcc,并使用RESET#信號對設(shè)備進行復(fù)位操作。****此時wake#信號始終保持為低,當(dāng)Vcc上電完成后,RESET#信號置為無效(高)結(jié)束復(fù)位,wake#信號也隨之為無效(高),結(jié)束整個喚醒過程。****一般情況下,wake#懸空或者上拉。
PCIE的設(shè)備都具有這幾個結(jié)構(gòu),每個結(jié)構(gòu)的作用不同。我們首先說明數(shù)據(jù)傳輸時候的流程,PCIE協(xié)議傳輸數(shù)據(jù)是以數(shù)據(jù)包的形式傳輸。
首先說明在發(fā)送端,設(shè)備核或者應(yīng)用軟件產(chǎn)生數(shù)據(jù)信息,交由PCI Express Core Logic Interface將數(shù)據(jù)格式轉(zhuǎn)換TL層可以接受的格式,TL層產(chǎn)生相應(yīng)的數(shù)據(jù)包。然后數(shù)據(jù)包被存儲在緩沖buffer中,準備傳輸給下一層數(shù)據(jù)鏈層(Data Link Layer)。數(shù)據(jù)鏈層將上一層傳來的數(shù)據(jù)包添加一些額外的數(shù)據(jù)用來給接收端進行一些必要的數(shù)據(jù)正確性檢查。然后物理層將數(shù)據(jù)包編碼,通過多條鏈路使用模擬信號進行傳輸。
在接收端,接收端設(shè)備在物理層解碼傳輸?shù)臄?shù)據(jù),并將數(shù)據(jù)傳輸至上一層數(shù)據(jù)鏈層,數(shù)據(jù)鏈層將入站數(shù)據(jù)包進行正確性檢查,如果沒有錯誤就將數(shù)據(jù)傳輸至TL層,TL層將數(shù)據(jù)包緩沖buffer,之后PCI Express Core Logic Interface將數(shù)據(jù)包轉(zhuǎn)換成設(shè)備核或者軟件能夠處理的數(shù)據(jù)。
我們使用IP核進行開發(fā)時,這三個層都已經(jīng)寫好了。所以我們的主要的任務(wù),記住我們的任務(wù)是什么 記住啦記住啦 啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦就是寫出中PCI Express Core Logic Interface,從他的字面我們就可以明白他的作用,就是一個接口**,將數(shù)據(jù)從Device Core輸出的數(shù)據(jù)格式轉(zhuǎn)換IP核TL層接受的數(shù)據(jù)格式。(參見分層模型一)
PCIe總線的層次組成結(jié)構(gòu)與網(wǎng)絡(luò)中的層次結(jié)構(gòu)有類似之處,但是PCIe總線的各個層次都是使用硬件邏輯實現(xiàn)的。在PCIe體系結(jié)構(gòu)中,數(shù)據(jù)報文首先在設(shè)備的核心層(Device Core)中產(chǎn)生,然后再經(jīng)過該設(shè)備的事務(wù)層(Transaction Layer)、數(shù)據(jù)鏈路層(Data Link Layer)和物理層(Physical Layer),最終發(fā)送出去。而接收端的數(shù)據(jù)也需要通過物理層、數(shù)據(jù)鏈路和事務(wù)層,并最終到達Device Core。
1 事務(wù)層
事務(wù)層定義了PCIe總線使用總線事務(wù),其中多數(shù)總線事務(wù)與PCI總線兼容。這些總線事務(wù)可以通過Switch等設(shè)備傳送到其他PCIe設(shè)備或者RC。RC也可以使用這些總線事務(wù)訪問PCIe設(shè)備。
事務(wù)層接收來自PCIe設(shè)備核心層的數(shù)據(jù),并將其封裝為TLP(Transaction Layer Packet)后,發(fā)向數(shù)據(jù)鏈路層。此外事務(wù)層還可以從數(shù)據(jù)鏈路層中接收數(shù)據(jù)報文,然后轉(zhuǎn)發(fā)至PCIe設(shè)備的核心層。
事務(wù)層的一個重要工作是處理PCIe總線的“序”。在PCIe總線中,“序”的概念非常重要,也較難理解。在PCIe總線中,事務(wù)層傳遞報文時可以亂序,這為PCIe設(shè)備的設(shè)計制造了不小的麻煩。事務(wù)層還使用流量控制機制保證PCIe鏈路的使用效率。
2 數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層保證來自發(fā)送端事務(wù)層的報文可以可靠、完整地發(fā)送到接收端的數(shù)據(jù)鏈路層。來自事務(wù)層的報文在通過數(shù)據(jù)鏈路層時,將被添加Sequence Number前綴和CRC后綴。數(shù)據(jù)鏈路層使用ACK/NAK協(xié)議保證報文的可靠傳遞。
PCIe總線的數(shù)據(jù)鏈路層還定義了多種DLLP(Data Link Layer Packet),DLLP產(chǎn)生于數(shù)據(jù)鏈路層,終止于數(shù)據(jù)鏈路層。值得注意的是,TLP與DLLP并不相同,DLLP并不是由TLP加上Sequence Number前綴和CRC后綴組成的。
3 物理層
物理層是PCIe總線的最底層,將PCIe設(shè)備連接在一起。PCIe總線的物理電氣特性決定了PCIe鏈路只能使用端到端的連接方式。PCIe總線的物理層為PCIe設(shè)備間的數(shù)據(jù)通信提供傳送介質(zhì),為數(shù)據(jù)傳送提供可靠的物理環(huán)境。
物理層是PCIe體系結(jié)構(gòu)最重要,也是最難以實現(xiàn)的組成部分。PCIe總線的物理層定義了LTSSM(Link Training and Status State Machine)狀態(tài)機,PCIe鏈路使用該狀態(tài)機管理鏈路狀態(tài),并進行鏈路訓(xùn)練、鏈路恢復(fù)和電源管理。
PCIe總線的物理層還定義了一些專門的“序列”,有的書籍將物理層這些“序列”稱為PLP(Phsical Layer Packer),這些序列用于同步PCIe鏈路,并進行鏈路管理。值得注意的是PCIe設(shè)備發(fā)送PLP與發(fā)送TLP的過程有所不同。對于系統(tǒng)軟件而言,物理層幾乎不可見,但是系統(tǒng)程序員仍有必要較為深入地理解物理層的工作原理。
以上只是增進了解,一筆帶過 接下來來電
先貼個圖吧
在TLP包傳輸?shù)倪^程中會發(fā)生數(shù)據(jù)包的組裝和拆解。
TLP包的組裝
當(dāng)數(shù)據(jù)從軟件層或者設(shè)備核傳來之后,TL層添加ECRC,
在DLL層在前段添加序列數(shù)字,在后面添加DLL(Data Link Layer)層的CRC,
在物理層添加幀頭和幀未。
事務(wù)包TLP的拆解是個反過程
下面介紹Xilnx PCIe IP核,在介紹的同時會對本節(jié)的知識做個回顧及深入(稍微深入哈)的了解與應(yīng)用。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。待續(xù)
聯(lián)系客服