<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > FPGA:PCI Express接口

FPGA:PCI Express接口

作者: 時(shí)間:2024-01-10 來(lái)源:EEPW編譯 收藏

隨著(zhù) PCI Express 在高端 中變得司空見(jiàn)慣,讓我們看看 供應商如何輕松實(shí)現該技術(shù)。特別是,我們更仔細地研究了的 PCI Express 解決方案。

本文引用地址:http://dyxdggzs.com/article/202401/454643.htm

PCI Express 1 - 連接器

PCI Express 通常有兩種尺寸:1 通道和 16 通道,其中 1 通道用于普通主板,16 通道用于顯卡。

連接器

1 通道連接器有 36 個(gè)觸點(diǎn),排列成兩排,每排 18 個(gè)觸點(diǎn)。
這是俯視圖。

在 36 個(gè)觸點(diǎn)中,只有 6 個(gè)對數據傳輸有用,其余是電源引腳和其他輔助信號。 6 個(gè)功能觸點(diǎn)以 3 對使用:

  • 名為 REFCLK 的時(shí)鐘對。

  • 名為 PER 的接收對。

  • 稱(chēng)為 PET 的傳輸對。

這些信號對通常被稱(chēng)為“差分對”,因為來(lái)自一對的每個(gè)信號都攜帶相同的信號,但一個(gè)信號與另一個(gè)信號相反。 使用差分對的原因主要是傳輸的可靠性,稍后將更詳細地討論。

在 PCI Express 第 1 代(或簡(jiǎn)稱(chēng)為“Gen1”)中,PET 和 PER 對的數據傳輸速度為 2.5Gbps。 Gen2 將這一數字翻了一番。

查看 Dragon-E 板,我們可以識別出 下方的 PET 對。

為了正常工作,差分對中的線(xiàn)路需要電耦合并且沒(méi)有阻抗不連續性,這在實(shí)踐中意味著(zhù)“保持緊密”和“沒(méi)有銳角”。 這就是 Dragon-E 的 PET 對蛇形形狀的原因。 板的另一側顯示了另外兩對蛇形對 REFCLK 和 PER。

PCI Express x16 插槽

為了提高速度,可以使用多條車(chē)道。 不需要復制 REFCLK 對,例如,具有 2 個(gè)通道的 PCI Express 使用 5 個(gè)對(1 個(gè) REFCLK + 2 個(gè) PET + 2 個(gè) PER)。

圖形板通常使用 16 通道連接器,通常稱(chēng)為 PCI Express x16。

PCI Express 2 - 拓撲

點(diǎn)對點(diǎn)架構

在 2.5Gsps 時(shí),PCI Express Gen1 線(xiàn)路速度比 75MHz 傳統 PCI 速度快 33 倍。
這怎么可能?只是因為 PCI express 是點(diǎn)對點(diǎn)總線(xiàn)。

還記得PCI是共享總線(xiàn)嗎?

使用PCI時(shí),必須指定足夠的時(shí)間,讓信號在每個(gè)時(shí)鐘周期內穩定下來(lái)。 這是因為PCI總線(xiàn)的每條線(xiàn)路都在同一總線(xiàn)上的PCI連接器和板上共享。 使用PCI Express,每個(gè)信號都是點(diǎn)對點(diǎn)的,這意味著(zhù)不再有建立時(shí)間,線(xiàn)路速度可以更高。

例如,如果主板有兩個(gè) 1 通道連接器和一個(gè) 16 通道連接器,則需要橋接器上有 6+6+34=46 個(gè)引腳,僅用于 REFCLK、PER 和 PET(因為不允許共享)。

時(shí)鐘恢復

在2.5GHz開(kāi)始的速度下,點(diǎn)對點(diǎn)架構仍然是一個(gè)挑戰,因為每個(gè)位的持續時(shí)間非常短,以至于時(shí)序抖動(dòng)(圍繞每個(gè)位到達的時(shí)間不確定性)成為一個(gè)問(wèn)題。 即使每個(gè)信號對都有相關(guān)的時(shí)鐘對同時(shí)傳輸,時(shí)鐘對也會(huì )受到定時(shí)抖動(dòng)的影響。 因此,使用了一種稱(chēng)為“時(shí)鐘恢復”的新技術(shù)。

時(shí)鐘恢復很簡(jiǎn)單。 基本上,對于每個(gè)信號對,接收器對都會(huì )查看信號轉換(位 0 后跟位 1,反之亦然),從中可以推斷出周?chē)坏奈恢谩?一個(gè)問(wèn)題是,如果許多連續的位以相同的值傳輸(如許多0),則看不到信號轉換。 因此,傳輸額外的位以確保信號轉換不會(huì )相距太遠(這會(huì )“重新同步”時(shí)鐘恢復機制)。

額外的比特使用一種稱(chēng)為 8b/10b 編碼的方案發(fā)送,因此對于每 8 位有用數據,實(shí)際上有 10 位以特定方式傳輸(開(kāi)銷(xiāo)為 20%),以保證足夠的信號轉換。 但這也意味著(zhù),在2.5GHz時(shí),我們每對只能獲得250MBps的有用帶寬(而不是沒(méi)有編碼開(kāi)銷(xiāo)的312MBps)。

差分對

現在還記得信號是在差分對上發(fā)送的事實(shí)嗎? 這有很多優(yōu)點(diǎn):

  • 它更不受外部干擾。

  • 它能夠在低電壓下工作(=更低的功耗)。

  • ...最后但并非最不重要的一點(diǎn)是:這有助于時(shí)鐘恢復獲得精確的信號轉換。

差分對有一個(gè)明顯的缺點(diǎn):傳輸信號需要兩倍的導線(xiàn)。

PCI Express 3 - 數據包、堆棧和網(wǎng)絡(luò )的故事

分組事務(wù)

PCI express 是串行總線(xiàn)。 或者是嗎? 從計算機的角度來(lái)看,它是一種可以實(shí)現讀寫(xiě)事務(wù)的傳統總線(xiàn)。

訣竅是所有操作都已打包。 假設 CPU 想要將一些數據寫(xiě)入設備。 它將訂單轉發(fā)到 PCI Express 網(wǎng)橋,然后 PCI Express 網(wǎng)橋創(chuàng )建一個(gè)數據包。 數據包包含要寫(xiě)入的地址和數據,并串行轉發(fā)到目標設備,目標設備將寫(xiě)入順序解包并執行。

如果 CPU 想要讀取怎么辦? 同樣,網(wǎng)橋將數據包轉發(fā)到目標設備,目標設備現在必須執行讀取,創(chuàng )建返回數據包并將其發(fā)送到網(wǎng)橋。
所有這一切都在實(shí)踐中非常容易做到,感謝來(lái)自...

PCI Express 協(xié)議棧

讓數據包沿著(zhù)線(xiàn)路可靠地流動(dòng)需要一些魔力。 由于數據包以非常高的速度串行傳輸,因此必須對它們進(jìn)行反序列化/匯編、在目的地解碼(刪除 8b/10b 編碼)、去交錯(如果使用多個(gè)通道)并檢查線(xiàn)路損壞(CRC 檢查)。

聽(tīng)起來(lái)很復雜? 大概是這樣。 問(wèn)題是,我們并不真正關(guān)心,因為大部分復雜性都是在由三層組成的“PCI Express堆?!敝刑幚淼?。

  1. 物理層。

  2. 數據鏈路層。

  3. 事務(wù)層。

前兩層是在PCI Express FPGA內核(通常是硬核和軟核的組合)中為我們實(shí)現的,用于處理所有復雜性。 作為用戶(hù),我們只在交易層工作,那里的生活很輕松,天空很藍,女孩很漂亮。

更多細節:

  1. 物理層:這是引腳切換的地方。8b/10b 編碼/解碼和通道拆卸/重組都在那里完成。

  2. 數據鏈路層:檢查數據完整性 (CRC) 并在需要時(shí)重新傳輸數據包(希望這種情況很少發(fā)生)。

  3. 交易層:即用戶(hù)級別。一旦數據包到達這里,它就可以保證是好數據。

好數據?太好了,這就是我們想要的!

讓我們看看在事務(wù)層中工作是什么樣的。

PCI Express 4 - 事務(wù)層

在交易層,我們接收“數據包”。 有一個(gè) 32 位總線(xiàn),數據包到達總線(xiàn)(數據包長(cháng)度始終是 32 位的倍數)。 也許一個(gè)數據包會(huì )說(shuō)“在地址0xABCD寫(xiě)入數據1234x0”,另一個(gè)數據包會(huì )說(shuō)“從地址0xDCBA讀?。ú⒎祷仨憫獢祿?。

數據包有很多種類(lèi)型:內存讀取、內存寫(xiě)入、I/O 讀取、I/O 寫(xiě)入、消息、完成等...... 我們在事務(wù)層的工作是接受數據包和發(fā)出數據包。 數據包以稱(chēng)為“事務(wù)層數據包”(TLP)的特定格式呈現給我們,到達總線(xiàn)的每個(gè) 32 位數據稱(chēng)為“雙字”(或簡(jiǎn)稱(chēng) DW)。

所以一個(gè)數據包(哎呀,對不起,一個(gè) TLP)是一堆 DW。

TLP 的外觀(guān)

TLP 的解釋非常簡(jiǎn)單。 以下是其結構的一般視圖。

標頭包含 3 或 4 個(gè) DW,但最重要的字段是第一個(gè) DW 的一部分。

“Fmt”字段表示標頭的長(cháng)度,以及是否存在數據有效負載。

然后與“類(lèi)型”一起描述TLP操作。 TLP 標頭內容的其余部分取決于 TLP 操作。

例如,下面是一個(gè) 32 位內存寫(xiě)入 TLP 標頭,您可以在其中看到寫(xiě)入地址位于標頭的末尾(并且要寫(xiě)入的數據位于標頭之后的有效負載中)。

“Fmt”字段為“10”,表示“3 DW,有數據”。 這是有道理的,內存寫(xiě)入需要寫(xiě)入數據,因此在標頭之后獲得數據有效負載后,我們將該數據寫(xiě)入某個(gè)內存(或以某種方式使用它),然后我們就完成了它。 字段“長(cháng)度”表示有效負載中有多少 DW(從 0 到 1023)。 通常,要寫(xiě)入的是單個(gè) DW,在這種情況下,長(cháng)度等于 1,總 TLP 長(cháng)度為 4 DW(標頭為 3,有效負載為 1)。

現在內存讀取呢?不知何故,我們必須返回數據。

用數據完成

如果 TLP 是內存讀取而不是寫(xiě)入,我們必須執行讀取,然后做出響應。 該響應有一個(gè)特殊的 TLP,它稱(chēng)為 CplD(數據完成),其有效負載包含我們要返回的數據。

讓我們仔細看看 32 位內存讀取 TLP 標頭 - 它與我們之前的 32 位內存寫(xiě)入非常相似。

一個(gè)區別是 Fmt=00,這意味著(zhù)“沒(méi)有數據”。 有道理,我們不需要數據來(lái)讀取,只需要一個(gè)地址。 但我們現在必須用數據來(lái)回應。 同樣重要的是,響應需要路由回請求讀取的人...... 你看到問(wèn)題了嗎?

好的,我們收到了一個(gè)讀取請求。 它來(lái)自CPU嗎? 還是來(lái)自中斷控制器? 還是從顯卡? 畢竟,許多設備都能夠發(fā)出這樣的請求。 答案在“請求者 ID”中給出 - 它顯示誰(shuí)請求讀取。 因此,當我們創(chuàng )建 CplD TLP 時(shí),我們必須重新復制其中的“請求者 ID”。 這樣,它將通過(guò)PCI Express網(wǎng)橋路由到它所屬的位置。 順便說(shuō)一句,我們還必須重新復制“標簽”(這在多次讀取待處理的情況下很有用)。

TLP 大小

典型的 32 位地址/數據存儲器讀取 TLP 由報頭中的 3 個(gè) DW 組成,沒(méi)有有效載荷(因此總共 96 位),而類(lèi)似的內存寫(xiě)入由 4 個(gè) DW(3 個(gè)用于報頭,1 個(gè)用于有效負載)組成。 由于 TLP 標頭開(kāi)銷(xiāo),這在帶寬方面效率不高,因此最好盡可能使用更大的 TLP 有效負載。 TLP 有效負載理論上可以達到 1023 DW,這對于突發(fā)讀取和寫(xiě)入非常方便,盡管 PC 可以將最大大小限制為較低的值(通常為 32 DW)。

有關(guān)更多信息,請通過(guò)谷歌搜索 PCI Express 規范來(lái)查看官方 PCI Express 規范,例如PCI_Express_Base_11.pdf

理論已經(jīng)夠多了,讓我們玩得開(kāi)心,玩玩 Xilinx PCI Express 向導。

PCI Express 5 - Xilinx 向導

Xilinx 使 PCI express 的使用變得簡(jiǎn)單 - 它們提供了一個(gè)免費的 PCI Express 內核(稱(chēng)為“Endpoint Block Plus”)和一個(gè)用于配置它的向導。 所有這些都在他們的免費版 ISE - ISE WebPack 中。

因此,讓我們啟動(dòng)X(jué)ilinx CORE生成器,選擇Endpoint Block Plus。

內核處于非活動(dòng)狀態(tài),我們需要使用 File --> New Project 創(chuàng )建一個(gè)項目并選擇一個(gè) FPGA(這里我們使用的是 Dragon-E,所以我們選擇 Virtex-5)...

...,然后選擇您喜歡的語(yǔ)言(在“生成”選項卡中)。

現在,Endpoint Block Plus內核變?yōu)榛顒?dòng)狀態(tài),您可以雙擊它以啟動(dòng)向導。
在第一頁(yè)上,為組件命名。在這里,我們選擇了“my_endpoint_blk_plus”。 剩下的對 Dragon-E 來(lái)說(shuō)沒(méi)問(wèn)題,所以點(diǎn)擊“下一步>”。

現在,您可以更改供應商/設備 ID...

...和地址空間。

接下來(lái)的頁(yè)面沒(méi)有太多興趣,所以點(diǎn)擊“生成”來(lái)生成核心及其文檔。

現在,我們已準備好創(chuàng )建第一個(gè)PCI Express FPGA位文件,在FPGA中對其進(jìn)行編程,并生成真正的PCI Express流量。

PCI Express 6 - 簡(jiǎn)單事務(wù)

讓我們嘗試從 PCI Express 總線(xiàn)控制 LED。

Xilinx 的“Endpoint Block Plus”內核允許我們在事務(wù)層級別工作,因此只需幾行代碼即可。
“Endpoint Block Plus”不是在32位總線(xiàn)上提供數據,而是使用64位總線(xiàn)(因此我們在每個(gè)時(shí)鐘周期獲得的數據量是原來(lái)的兩倍)。 這不是問(wèn)題,一個(gè)簡(jiǎn)單的狀態(tài)機將處理簡(jiǎn)單的內存讀取和寫(xiě)入。

// we use signals from Xilinx's "Endpoint Block Plus"
// first we declare that we are always ready to get data
assign trn_rdst_rdy_n = 1'b0;

// then we create a state machine that triggers when we get a PCI Express memory read or write
reg RXstate;
reg [63:0] RXrd;always @(posedge clk)case(RXstate)
   // we are going to handle simple memory reads & writes
   // we know that with the "Endpoint Block Plus" core, such simple transactions always happens
   //  using two cycles so we just need a two-states state machine
   // first, we wait for the beginning of a memory transaction with up to 32-bit data (i.e. with length=1)
   1'b0: if(~trn_rsrc_rdy_n && ~trn_rsof_n && trn_rd[61:56]==6'b0_00000 && trn_rd[41:32]==10'h001)    begin
    RXstate <= 1'b1;
    RXrd <= trn_rd;    
 end
   // then the second state waits for the end of the transaction
   1'b1: if(~trn_rsrc_rdy_n) RXstate <= 1'b0;
endcase

現在我們準備更新 LED。

wire [31:0] RXaddr = trn_rd[63:32];   
// memory address (read or write) (valid during the second state of the state machine)

wire [31:0] RXdata = trn_rd[31:0];  
// memory data (for a write) (valid during the second state of the state machine)

wire RXrdwr = RXrd[62];  
// 0 for a read, 1 for a write

wire RXRead = ~trn_rsrc_rdy_n & RXstate & ~RXrdwr;
// true when a read is happeningwire RX

write = ~trn_rsrc_rdy_n & RXstate & RXrdwr;
// true when a write is happening

// update two LEDs using the two LSBs from the data written
reg [1:0] LEDs;
always @(posedge clk) if(RXwrite) LEDs <= RXdata[1:0];

對于內存寫(xiě)入,僅此而已。 對于內存讀取,您需要使用要返回的數據創(chuàng )建響應數據包。 生成中斷也非常容易 - 只需斷言一個(gè)名為“cfg_interrupt_n”的信號即可。

想要更多?請查看 Dragon-E 的啟動(dòng)套件以獲取更完整的示例,并查看 Xilinx 的 UG341 Endpoint Block Plus 規范文檔,了解所有信號的描述。

享受PCI Express的樂(lè )趣!



關(guān)鍵詞: FPGA PCI Express接口 賽靈思

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>