XILINX GTX學習筆記

原文鏈接:https://blog.csdn.net/Real003/article/details/96010745

關於GTX接口網上理論的介紹有很多,以及IP核的配置介紹也有,但是沒有人介紹說怎麼封裝用戶的接口,我這裏簡單的說一種方法:
下面是網上搜集的一些GTX的相關資料鏈接:

  1. https://blog.csdn.net/weixin_42229533/article/details/86541557 ([ZYNQ入門寶典]GTX高速口怎麼玩(一))
  2. https://blog.csdn.net/weixin_42229533/article/details/86541970 ([ZYNQ入門寶典]GTX高速口帶着IBERT一起玩(二))
  3. https://blog.csdn.net/u010161493/article/details/77658599 (xilinx IP核配置,一步一步驗證Xilinx Serdes GTX最高8.0Gbps)

一、GTX作爲只傳輸數據,我們一般不走協議,爲了採用更高的傳輸效率,採用64b/66b編碼直接傳輸,每個通道傳輸的最大速率受參考時鐘的影響,我的板子上的GTX參考時鐘爲100Mhz,每個通道的最大傳輸速率爲2.5Gbps,VIVADO的IP核配置如下:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
二、IP核生成後打開example工程,可以看到代碼結構如下:
在這裏插入圖片描述
在這裏插入圖片描述
gtwizard_0_GT_FRAME_GEN模塊產生要發送的測試幀數據;
gtwizard_0_GT_FRAME_CHECK模塊檢查迴環後收到的數據是否正確;
gtwizard_0_BLOCK_SYNC_SM模塊通過GTX收到的幀頭,給出gt0_rxgearboxslip_i信號來讓IP核接收部分進行bit位移動,實現接收端 的數據對其;
gtwizard_0_SCRAMBLER模塊將要發送的測試幀數據進行64b/66b編碼,然後送給IP核進行發送;
gtwizard_0_DESCRAMBLER模塊將GTX收到的數據進行64b/66b解碼,然後送給gtwizard_0_GT_FRAME_CHECK模塊檢測收到的數據

三、接下來是重點,生成的example模塊接口如下:
在這裏插入圖片描述
我們要做的就是如何把接口變成用戶可以使用的接口,只需要在該example修改少量代碼即可:
刪除下面第472行到483行代碼,將差分輸入的時鐘替換成鎖相環分頻出來的50Mhz或者PS送給PL的50Mhz。
在這裏插入圖片描述
修改後的代碼如下,用tx_data替換掉gtwizard_0_GT_FRAME_GEN模塊輸出的gt0_txdata_i數據。我們用戶層即可以使用下面的接口進行發送和接收數據
在這裏插入圖片描述
需要注意的是如下圖:gt0_data_valid_in信號要拉高,目的是告訴gtwizard用戶端已經收到正確的數據,否則gtwizard的ip內部狀態機的定時器會不斷的復位。
在這裏插入圖片描述
gt0_data_valid_in沒有修改的時序圖如下:可以看到gt0_rxresetdone_r受內部狀態機的影響復位了多次。
在這裏插入圖片描述
gt0_data_valid_in修改後,賦值爲1的時序圖如下:可以看到gt0_rxresetdone_r只有上電的時候進行了復位。
在這裏插入圖片描述

通過上板測試,A板子發送數據,B板子收到數據後過異步FIFO迴環,採用X2的模式,在100Mhz的參考時鐘下,最大傳輸速率爲4.848Gps,與理論值(64/66)*5Gbps一致。發送遞增數據經過一個小時的測試,沒有出現錯數和丟數。

注意:以前做圖像的時候,通過gtwizard收發器接收SDI接口的視頻數據,直接回環的時候發現gt0_txusrclk2_i和gt0_rxusrclk2_i這兩個發送和接收時鐘頻率存在頻率偏差,導致用異步fifo迴環的時候有出現空滿現象,而且每次上電兩個時鐘頻率差別還不固定,最後是通過DDR才解決了這個問題。

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e9f16cbbc2.css" rel="stylesheet">
                </div>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章