xapp1052 BMD_64讀寫模塊代碼分析

目錄

1、BMD_64_RX模塊STG

2、BMD_64_TX模塊STG

2.0、RST_STATE

2.1、MWR_QW1狀態

2.2、MWR64_QW1狀態

2.3、MWR_QWN狀態


 

1、BMD_64_RX模塊STG

RX模塊功能說明:接收來自PCIE IP的TLP數據包,並進行解析。xapp1052設置的rx模塊處理的數據包類型有四種:

  • 7'b10_00000:PIO  3DW寫訪問事務;
  • 7'b00_00000:PIO 3DW讀訪問事務;
  • 7'b00_01010:不帶數據的完成包事務;
  • 7'b10_01010:DMA 3DW 帶數據的完成包事務;

狀態轉移如下圖所示:

 

 

在DMA事務狀態中,需要判斷當前TLP包是否是最後一個TLP包,若是最後一個TLP數據包,則其中是否僅含1個DW數據。詳細代碼如下圖所示。

 

2、BMD_64_TX模塊STG

TX模塊功能說明:將待發送的數據組成TLP報文發送給PCIE IP,並進行解析。xapp1052設置的tx模塊處理的數據包類型有五種:

  • 7'b10_01010:PIO ,3DW,CPLD帶數據的完成包事務。
  • 7'b10_00000:存儲器寫請求,3DW,帶數據。DMA事務類型。
  • 7'b11_00000:存儲器寫請求,4DW,帶數據。DMA事務類型。
  • 7'b00_00000:存儲器讀請求,3DW,不帶數據。DMA事務類型。
  • 7'b01_00000:存儲器讀請求,3DW,不帶數據。DMA事務類型。

2.0、RST_STATE

爲便於理解,該小節引用自博客:https://blog.csdn.net/cllovexyh/article/details/79855813

首先判斷是否啓動DMA寫操作、DMA寫操作完成等信號,其中serv_mwr 信號是用輪詢操作控制DMA寫操作的進行。接着trn_trem_n爲0表示這一幀的兩個DW都有效,cur_mwr_dw_count表示這一個TLP中數據的數量(單位DW),拼接發送第一幀數據,即2DW標頭。接着就進入輪詢操作。

輪詢操作的目的是在發送一段時間的存儲器寫TLP之後,停止一次,然後判斷此時是否有DMA讀存儲器開始信號,如果有的話就去執行DMA讀操作,否則就是停止一次傳輸,下一個週期開始又繼續DMA寫操作。其中tmwr_wrr_cnt 信號統計發送TLP的數量,而mwr_wrr_cnt_i 信號則是設定輪詢操作的TLP的量,這個值是在寄存器中配置的,當這兩個值相等時就發生一次輪詢操作。

通過mwr_64b_en_i 信號判斷髮送的存儲器寫請求的標頭是3DW還是4DW,這和完成包不一樣,因爲完成包只有3DW標頭,而存儲器寫或者讀的TLP有3DW和4DW兩種。
 

2.1、MWR_QW1狀態

在該狀態發送32bit地址和1DW數據。

爲便於理解,該小節引用自博客:https://blog.csdn.net/cllovexyh/article/details/79855813

這個狀態是發送第二幀數據,包含1DW標頭(地址)+1DW數據,同樣設置主機有效信號,然後通過cur_wr_count判斷這是不是第一個TLP,因爲第幾個TLP決定着需要存入存儲器的地址,mwr_addr是PC端申請的連續內存的首個地址,所以cur_wr_count爲0,則要存入的地址爲連續內存的首地址,之後就按照每個TLP中的數據量改變下一個TLP數據的存儲地址。

cur_mwr_dw_count信號初值是一個TLP中的數據量(DW),如果當前cur_mwr_dw_count爲1,則表示這是最後一個數據了,那麼這時通過cur_wr_count分析這是否是最後一個包,如果是最後一個包那麼說明這個TLP只有兩幀(3DW標頭+1DW數據),此次DMA傳輸完全結束,mwr_done_o置1;若不是最後一個數據,說明這個TLP不止兩幀數據,則跳轉BMD_64_TX_MWR_QWN 狀態。

2.2、MWR64_QW1狀態

在該狀態發送64bit地址

 

2.3、MWR_QWN狀態

在該狀態需要判斷是否是最後一個TLP數據包,若是最後一個,則判斷是否僅含1個DW或2個DW。

如果只有一個DW,使用trn_trem_n 信號來表明最後一個DW無效。

若有兩個DW,則trn_trem_n=0,表明2個DW都有效。

 

 

 

 

 

 

 

 

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