Virtex6 PCIe 超簡版基礎概念學習(二)(轉載)

轉載自:https://blog.csdn.net/lutianfeiml/article/details/51035756


參考資料: 
Spartan 6 PCIE_V2.4 真教程(一)
Spartan 6 PCIE_V2.4 真教程(二)
菜鳥5小時速成FPGA_PCIE設計高手教程.pdf
ug671_V6_IntBlock_PCIe.pdf
PCI+EXPRESS體系結構導讀.pdf
一、PIO模式
PIO模式是一種通過CPU執行I/O端口指令來進行數據的讀寫的數據交換模式。是最早先的硬盤數據傳輸模式,數據傳輸速率低下,CPU佔有率也很高,大量傳輸數據時會因爲佔用過多的CPU資源而導致系統停頓,無法進行其它的操作。數據傳輸速率從3.3MB/s到16.6MB/s不等。傳輸速率低下和極高的CPU佔有率。

PIO模式在No_16_0328 Virtex6 PCIe2.5(一) 仿真學習.md中已經測試過,這裏不再贅述。不同的地方在於仿真使用的是v2.5版本ip核,而DMA參考xapp1052方案設計,顧改爲1.7版ip核,既不再使用AXI總線設計。

二、PCIe核接口定義
(一) 系統接口
sys_reset_n : 輸入,異步復位,時間至少大於1500ns
sys_clk:輸入,可選頻率爲100Mhz,125Mhz,250Mhz
(二) 事物接口
2.1 通用事物接口
trn_clk : 輸出, 傳輸、配置、物理層控制、狀態接口操作都與此時鐘同步。
trn_reset_n : 輸出,用戶邏輯與傳輸和配置接口交互時使用此復位恢復到初始狀態;與trn_clk同步,與sys_reset_n異步。
trn_lnk_up_n : 輸出,當核與連接對象已連接且準備好交換數據時有效。
trn_fc_* : 輸出,各種流控制信號
trn_fc_sel[2:0] : 輸入:選擇流控制信息呈現在哪個trn_fc_*上。
2.2 發送事物接口
trn_tsof_n : 輸入,發送幀開始表示,僅在trn_tsrc_rdy_n信號爲低時,有效。
trn_teof_n : 輸入,發送幀結束標誌,僅在trn_tsrc_rdy_n信號爲低時,有效。
trn_td : 輸入,發送數據接口
trn_trem_n : 輸入,發送數據餘數。僅在trn_teof_n 、trn_tsrc_rdy_n、trn_tdst_rdy_n同時爲低時有效。 
爲0表示數據在trn_td[63:0]
爲1表示數據在trn_td[63:32]
trn_tsrc_rdy_n : 輸入,發送源(用戶)準備就緒;用戶已將有效數據放入trn_td。
trn_tdst_rdy_n : 輸出,發送目的(核)準備就緒;表示核已經準備好接收在trn_td上的數據。當其與trn_tsrc_rdy_n同時有效時表示數據已成功傳至trn_td。
 


發送TLP工作流程: 
核: 
將 trn_tdst_rdy_n拉低
用戶: 
將trn_tsrc_rdy_n和trn_tsof_n拉低,並與trn_td第一個數據前沿對齊。
注trn_tsof_n在下個時鐘週期即可拉高。
傳輸結束時,將trn_tsrc_rdy_n,trn_teof_n同時拉低,且與trn_td最後一個數據前沿對齊。(trn_trem_n視情況而定)
trn_tsrc_rdy_n,trn_teof_n制信號在下個trn_clk同時拉高。


 


2.3 接收事物接口
trn_rsof_n : 輸出,接收幀開始標誌,僅在trn_rsrc_rdy_n爲低時有效。

trn_reof_n : 輸出,接收幀結束標誌,僅在trn_rsrc_rdy_n爲低時有效。

trn_rd : 輸出,接收到的數據,僅在trn_rsrc_rdy_n爲低時有效。

trn_rrem_n: 輸出,接收數據餘數。僅在trn_reof_n 、trn_rsrc_rdy_n、trn_rdst_rdy_n同時爲低時有效。

爲0表示數據在trn_rd[63:0]
爲1表示數據在trn_rd[63:32]
trn_rerrfwd_n : 輸出,表示收到錯誤數據。

trn_rsrc_rdy_n: 輸出,表示接收源(核)準備就緒。表示,核將數據傳至trn_rd。

trn_rdst_rdy_n : 輸入,表示接收目的(用戶)準備就緒。表示,用戶準備好接收來自trn_rd的數據。

trn_rsrc_dsc_n : 輸出,表示核將當前包丟掉。

trn_rnp_ok_n : 輸入,表示用戶準備好接收一個Non-Posted TLP包。

trn_rbar_hit_n[6:0] : 輸出,表示當前包在哪個BAR空間,在trn_rsof_n 到 trn_reof_n有效

trn_rbar_hit_n[0]: BAR0
trn_rbar_hit_n[1]: BAR1
trn_rbar_hit_n[2]: BAR2
trn_rbar_hit_n[3]: BAR3
trn_rbar_hit_n[4]: BAR4
trn_rbar_hit_n[5]: BAR5
trn_rbar_hit_n[6]: Expansion ROM Addres
 


接收TLP工作流程: 
用戶 
將trn_rdst_rdy_n拉低。
核 
將trn_rsof_n、trn_rsrc_rdy_n拉低,並與trn_rd第一個數據前沿對齊。
將trn_rsof_n拉高,並繼續輸出數據
將trn_rsrc_rdy_n與trn_reof_n拉低,並與trn_rd最後一行數據前沿對齊。(trn_rrem_n視情況而定)
在下一個時鐘,將trn_rsrc_rdy_n、trn_reof_n拉高。
 


2.4 中斷事物接口
cfg_interrupt_n : 輸入,中斷請求信號,用戶將此信號拉低,來告訴PCIe核所選擇的中斷信息。此信號必須保持到cfg_interrupt_rdy_n爲低後。

cfg_interrupt_rdy_n : 輸出,中斷確認信號,當此信號與cfg_interrupt_n信號同時爲低時表示PCIe核成功傳輸了中斷信息。

cfg_interrupt_assert_n : 輸入,傳統中斷置有效無效選擇。

爲1表示有效
爲0表示無效
cfg_interrupt_di[7:0] : 輸入,對於傳統中斷,只支持INTA,所以時鐘填00h。

板卡發送中斷過程說明: 
 


用戶

將cfg_interrupt_n、cfg_interrupt_assert_n拉低,請求中斷。cfg_interrupt_di[7:0]始終置爲00h。
核 
將cfg_interrupt_rdy_n拉低
用戶 
在下一個時鐘週期,將cfg_interrupt_n拉高置爲無效。
核:將中斷產生消息發送出去。(保證PCI Command寄存器的Interrupt Disable位置0)
用戶:中斷請求被接受時 
將cfg_interrupt_assert_n拉高置無效,同時將cfg_interrupt_n拉低。
核: 
將cfg_interrupt_rdy_n拉低置有效,表示接受中斷取消信號。
用戶: 
在下一個時鐘,將cfg_interrupt_n拉高。
核: 
發送中斷取消消息。


板卡接收中斷說明:

中斷置位TLP:0x3400_0000_0100_0020, 0x0000_0000_0000_0000

Fmt 爲 2’b01,Type 爲 5’b10100,是消息請求
Message Code:8‘b0010_0000中斷( INTx)消息
assert_inta 拉高表示收到中斷INTA#。 

中斷撤銷TLP:0x3400_0000_0100_0024, 0x0000_0000_0000_0000,

Fmt 爲 2’b01, Type 爲 5’b10100,是消息請求,
Message Code 爲 8’b0010_0100,是中斷( INTx)撤銷消息
received_deassert_inta 爲 1,收到 INTA#中斷撤銷消息 

三 、PCIe DMA模式
PCI設備與存儲器直接進行數據交換的過程被稱爲DMA。
(一) 數據從FPGA搬移到PC
1 . PC申請物理地址連續的一段內存空間。
2 . FPGA準備好發送數據後向PC發送中斷,通知PC讀取這些數據。
3 . PC接收並分析該中斷,向BAR0空間內寄存器,寫如下命令:物理地址的起始地址、空間大小,並且 啓動DMA。
4 . FPGA 內的 DMA 引擎接收到啓動** DMA 的命令後,主動將數據組織成**MWr包發送到 PC。DMA 引擎會自動填充 TPL 包逐一增加的地址等信息,直到達到用戶設定的長度。在此過程完成後,FPGA向主機發送一箇中斷。
5 . PC 接收到中斷後,然後讀取 BAR0 空間狀態寄存器判斷中斷類型,然後做相應的判斷。將這段物理地址的數據拷貝到用戶程序能夠訪問的空間中,然後回到步驟 2。
(二) 數據從 PC 搬移到FPGA的過程
1 . PC 申請物理地址連續的一段內存空間。
2 . FPGA 準備好接收數據後向* PC* 發送中斷,通知 PC 發送數據。
3 . PC 接收並分析該中斷,寫 BAR0 空間內寄存器,包含上述物理地址的起始地址、空間大小,然後啓動 DMA。
4 . FPGA 內的 DMA 引擎接收到啓動 DMA 的命令後,主動組織Mrd包發送到 PC。DMA 引擎會自動填充 TPL 包逐一增加的地址等信息,直到達到用戶設定的長度。PC 收到讀請求,會自動將上述物理空間的數據組織成* Completion TLPs* 回送給 FPGA,FPGA 接收分析後按順序存放在相應的緩衝內。在此過程完成後,FPGA 向主機發送一箇中斷。
5 . PC 接收到中斷後,然後讀取 BAR0 空間狀態寄存器判斷是中斷類型,然後做相應的判斷。將這段用戶程序中新的數據拷貝到物理空間中,然後回到步驟 2。
(三) DMA控制邏輯


TX_Engine 用於組織和傳輸轉發事務、非轉發事務和完成事務的數據包。在這個設計中,TX_Engine 可以產生存儲器寫轉發的請求(MWr) 、非轉發的讀請求(MRd)和帶數據的完成(CplD) 。產生的數據發送到 TRN 接口。

RX_Engine 用於從 TRN 接口中接收數據,並根據事務的種類,將對應的數據放在 Ingress FIFO 中或控制和狀態寄存器中。RX Engine 也通過 Read Request Wrapper 通知TX Engine 還未發送的請求。RX Engine 支持完成事務、存儲器讀事務和存儲器寫事務。

DMA Control and Status Wrapper 該模塊是和 CPU 通訊的主要模塊,也是 DMA 控制的主要模塊,包含內部狀態控制模塊Internal Control Block 和 DMA 控制/狀態寄存器 DMA Control/Status Register 內部狀態解析 CPU 的命令,並作出相應的執行。DMA 控制/狀態寄存器被映射到 PCI 的地址空間中,同時也和其他的用戶邏輯相連接。CPU 通過讀寫這些寄存器達到控制其他邏輯的運行。

Egress Data Presenter 此模塊提供外部不同來源不同位寬的數據到 TX Engine 的通道。

Read Request Wrapper 用於 TX Engine 和 RX Engine 的通訊。TX Engine 將尚未發送的非轉發事務信息發送給 RX Engine。這個信息存儲在 32 位位寬的雙端口 RAM 中。

Egress/Ingress FIFO 和其他數據來源連接。接口爲 Xilinx 標準 FIFO接口,可方便的集成用戶自定義的外設。

四 XAPP1052 DMA設計
(一) FPGA –> PC 數據傳輸具體實現
1、復位Initiator

PC向BARO空間 DCR1(0x0)地址,寫0x1值,表示對PCIe 初始化復位。
2、清除Initiator的復位

PC向BARO空間 DCR1(0x0)地址,寫0x0值,表示清除對PCIe 初始化復位。
3、填寫DMA寄存器相關信息,在此之前需要PC先申請一塊物理地址連續的緩衝區。

DMA目的起始地址:PC向BARO空間 WDMATLPA(0x008)地址,寫 DMA目的起始地址。
TLP包大小 : PC向BARO空間 WDMATLPS(0x00c)地址,寫 TLP包大小。
TLP包個數 : PC向BARO空間 WDMATLPC(0x010)地址,寫 TLP包個數。
4、啓動DMA

PC向BARO空間 DCR2(0x4)地址,寫0x1值,表示對開啓DMA傳輸。
5、處理DMA完成

DMA傳輸完成後FPGA會給PC發送完成中斷,PC接到FPGA發來的中斷信號後檢查自定義寄存器,判斷是否爲DMA寫完成中斷。


(二) PC –> FPGA 數據傳輸具體實現
過程與上述類似 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章