高速串行通信經常需要用到 XILINX FPGA 內部專用的 SERDESE 模塊來實現串并轉換。LVDS 配合 SERDESE可以充分發揮 FPGA 的高速接口優勢。SERDESE 分輸入和輸出,輸入采用 ISERDESE, 輸出采用 OSERDESE,OSERDESE 的使用要比 ISERDESE 簡單。
本文涉及到一些重要原語概念,包括 idelay 延遲原語,IDELAYCTRL原語, ISERDESE 、OSERDESE。其中很關鍵一點時使用 idelay 延遲模塊以及 ISERDESE 原語中 BITSLIP 功能,實現比特流的時鐘對齊,以及數據流的位流順序對齊。XILINX FPGA 高速通信中經常會用到 idelay模塊對信號比特流做細微的時序調整。
參考文檔包括:官方手冊ug471,xapp585,第三方米聯客教程。
1、IDELAYCTRL模塊
2、IDELAY模塊
3、IDELAY模塊工作時序
4、OSERDES模塊
OSERDES模塊數據傳輸方式支持SDR,DDR兩種,數據位寬支持級聯以擴展到14比特。
由上圖可知,OSERDES串行輸出的數據流與原始并行數據比較,大小端是相反的。
5、ISERDES模塊
ISERDESE2 在 SDR 模式下數據轉換的位寬可以為 2、 3、 4、 5、 6、 7、 8bit,在 DDR 模式時,數據轉換位寬為 4、 6、 8bit, 2 個 ISERDESE2 級聯使用, DDR 模式可以支持 10、 14bit。如下圖所示通過 2 個 ISERDESE2 級聯輸出14bit 位寬數據接口。
6、Bitslip數據對齊功能
7、Serdes時鐘源設計要求
二、源碼解析
1、SDR ISERDESE 時鐘恢復
ISERDESE 的作用是和 OSERDESE 相反的過程,但是比 OSERDESE 稍微復雜一些。ISERDESE 代碼需要實現自動找到最佳的數據采樣點, 自動完成數據對其,其中的加入了 IDELAY 和 BITSLIP 功能的使用,以及一些狀態機代碼。筆者下面根據 XAPP585 中給出的 demo 源碼分析。
1.1使用IDELAY之前,需配置IDELAYCTRL。
1.2 計算比特流最大速率參數
官方源碼仿真使用的并行時鐘為80M,SDR模塊采用1_to_7串并轉換,則Serdes工作速率為560Mbps,由此可以得到Idelay調節Tap最大的步數。
設置 bit_rate_value=0560,那么代表了 serdes 的速率是 560Mbps,根據下面代碼得出 bt_val=5’h17(bt_val=5’d23)。由上文可知, idelay 的參考時鐘是 200MHZ, 那么每個延遲節拍是 78ps,則23*78ps= 1,794 ps = 557 Mb/s.最接近 560Mbps。
1.3 如何實現時鐘恢復時,差分時鐘信號正負相位對齊
查看源碼可知,SERDES工作速率為560Mbps參數,就可以選出 bit_rate_value 為 0557, 所以 bt_val 為 17h。先取出 bt_val 的中間值,即17h 的中間值是 0Bh。把差分時鐘n 的延遲時間設定為0Bh,把差分時鐘p的初始延遲設定為17h,然后保持差分時鐘n 的延遲時間不變,每次調節1個Tape,用于差分時鐘p和差分時鐘n的反向 進行相位對比,直到二者相位差為零。這個細節就是實現差分時鐘信號對齊的核心,看代碼時很容易忽略。我在第一遍時就犯了這個錯誤,導致始終不明白所以然。
1.4 Bitslip進行比特流位順序調節
這段代碼不復雜,Bitslip的調節原理見上文,也容易理解。
1.5 差分時鐘正負信號時序補償
需要把上述代碼段看明白就知道補償原理了。
通過控制每次減 1 個 tap,減少 idelay 延遲,并且通過 ISERDESE 檢測時鐘的跳變。當第一次跳變發生的時候,代表檢測到了時鐘的跳變沿,假設這個時候 bt_val=05h,05h<0Bh 所以計算出時鐘的 0BH+05H =10H。
如果恢復出的時鐘信號不是目標Pattern值 1100001 或者 1100011,就需要用到 Bslip 調整,每次設置 Bslip 調整一次。
仿真結果如上圖的箭頭所示,接收的 clk_data 是 7bit 時鐘數據,通過調整 c_delay_in 值調整 idelay每次減 1 個 tap,直到 clk_data 發生改變,可以看到這個值是 0b 整好是和中間值相等。這個時候狀態機 state2 也會進入狀態 1,這個時候計算出 c_delay_in_target=0,這個就是我們需要延遲的時間,可以看到需要延遲的時間為 0,這種情況非常理想,如果實際程序跑起來一般不會是 0,之后進入狀態 2。在狀態 2 中繼續調整 c_delay_in 直到和 c_delay_in_target 相等,如下圖,可以看到 clk_data=1100001b 是占比3:4 的時鐘就恢復出來了。
總結:
本篇文檔通過學習米聯客的教程,并結合UG471的學習,XAPP585的源碼學習,來不斷加深SERDES的工作原理及實現細節,并記錄一下自己學習過程,仿真有助于理解源碼。
審核編輯 :李倩
-
DDR
+關注
關注
11文章
712瀏覽量
65318 -
源碼
+關注
關注
8文章
639瀏覽量
29185 -
SerDes
+關注
關注
6文章
198瀏覽量
34910
原文標題:XAPP585 - Serdes 1_to_7_sdr 解讀
文章出處:【微信號:Hack電子,微信公眾號:Hack電子】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論