排錯)
XAPP585 這份文檔我翻來覆去看了不下五遍每次在項目里被 LVDS 源同步接口折磨到懷疑人生的時候回頭重新讀一遍總能有新的收獲。如果你最近正在做 FPGA 之間的高速互聯(lián)、接高速 ADC/DAC、或者調試 Camera Link 這類視頻接口大概率會碰到這個經典話題用 LVDS 差分對實現(xiàn) 7:1 串行傳輸同時配合時鐘倍頻完成源同步采樣。今天我不打算復述應用筆記全文而是把里面最核心的設計思路、容易踩的坑、以及我實際調試中總結的經驗一次性梳理清楚方便你在做方案選型和寫 RTL 的時候少走彎路。很多新手一看到 “SerDes” 就覺得是 GT 高速收發(fā)器、是萬兆網絡那種東西其實 LVDS 源同步 7:1 SerDes 完全是另外一條技術路線。它不依賴 FPGA 內部專用高速收發(fā)器而是利用普通 IO 資源和 PLL/MMCM 實現(xiàn)幾十 Mbps 到幾百 Mbps 級別的串行傳輸。這個速率區(qū)間正好卡在并行總線的上限和 GT 收發(fā)器的下限之間很多項目中你不得不用它。XAPP585 的核心價值就在于它把發(fā)送端并行轉串行、接收端時鐘倍頻采樣、位對齊、訓練序列這幾件關鍵事兒完整地梳理清楚了可以算是一份標桿性質的設計模板。1. 為什么 7:1 LVDS SerDes 值得單獨研究1.1 從實際項目痛點說起假設你有一塊高速 ADC輸出 8 位并行數(shù)據(jù)帶一個隨路時鐘數(shù)據(jù)速率做到 50MHz 甚至更高。直接用并行總線連接到 FPGA單端信號在 PCB 上要占用 8 根走線每根走線都要小心處理串擾和等長約束到了 100MHz 以上這條并行總線基本就是災難。如果你有 16 位、32 位數(shù)據(jù)PCB 布線和信號完整性根本頂不住。這時候 LVDS SerDes 的優(yōu)勢就出來了。把 8 位并行數(shù)據(jù)在發(fā)送端串行化變成 1 對差分線再加 1 對隨路時鐘線總共兩對線就把問題解決了。BOM 面積縮小PCB 走線空間釋放電磁干擾特性也比單端并行總線好太多。代價是邏輯設計復雜度上來了你需要處理串并轉換、位對齊、時鐘域切換這些問題。XAPP585 說的 7:1 SerDes 之所以是 7 而不是 8是因為早期的視頻傳輸標準里經常采用 7 位數(shù)據(jù)加 1 位控制/同步信號的組合。在 Camera Link 這類接口中數(shù)據(jù)位寬和通道數(shù)的組合往往形成 7:1 的固定比例一個像素時鐘周期內發(fā)送 7 個串行 bit。如果你做的是 8 位 ADC 采集也可以根據(jù)自己的需要改成 8:1核心方法完全一樣只要把串并轉換的位寬從 7 改成 8 就行。1.2 XAPP585 在技術譜系中的位置很多人第一次看到 XAPP585 這個編號會以為它是某個冷門的老古董。實際上它在 Xilinx 官方應用筆記里有著特殊地位它展示的方案不依賴具體某種專用硬核只用了通用的 LVDS IO、IO 延遲鏈和時鐘管理單元。這意味著不管是 Spartan-6、Virtex-5 那個年代的老器件還是 Artix-7、Kintex-7 這些后起之秀原則上都能參考這套邏輯實現(xiàn)。理解 XAPP585 的設計方法更大的價值在于建立“源同步接口”的整體思維框架。源同步接口在高速設計里無處不在DDR 存儲器接口、LVDS 視頻接口、ADC/DAC 的隨路時鐘數(shù)據(jù)接口本質上都是源同步。只要你掌握了時鐘倍頻采樣和位對齊這套方法論再遇到任何新的源同步協(xié)議你都能更快地找到解題方向。2. 源同步、SerDes 與時鐘倍頻三件套拆解2.1 源同步數(shù)據(jù)和時鐘一個都不能少源同步Source Synchronous這個概念看起來簡單意思是發(fā)送端把數(shù)據(jù)和時鐘一起發(fā)給接收端接收端用隨路時鐘去采樣數(shù)據(jù)。但這里有個容易被忽略的關鍵點隨路時鐘和數(shù)據(jù)之間的相位關系是經過發(fā)送端精心設計的。在 XAPP585 的場景里隨路時鐘通常是串行數(shù)據(jù)速率對應的比特時鐘的某個分頻版本頻率等于并行數(shù)據(jù)速率而數(shù)據(jù)線上每個時鐘周期會傳輸 7 個 bit。我見過很多剛接觸 LVDS 接口的工程師拿到這種信號之后第一反應是直接把隨路時鐘接 PLL 倍頻然后拿倍頻后的時鐘去采數(shù)據(jù)。這種做法的隱患在于你可能并不知道數(shù)據(jù)和時鐘之間的真實相位關系是什么貿然倍頻可能導致采樣點落在數(shù)據(jù)翻轉沿附近誤碼率直接飆升。XAPP585 的推薦做法是通過 FPGA 內部的時鐘管理單元DCM/PLL/MMCM對隨路時鐘做精確的相位調整同時利用 IO 延遲鏈對數(shù)據(jù)信號做精細的延遲控制讓采樣窗口穩(wěn)定地落在數(shù)據(jù)位的中心位置。這個過程本質上是“盲采樣”的優(yōu)化版本先根據(jù)靜態(tài)時序分析的估計設置初始相位再通過動態(tài)訓練機制持續(xù)校準。2.2 7:1 SerDes把并行位流裝進一根線上SerDes 是 Serializer/Deserializer 的縮寫核心任務就是發(fā)送端把 N 位并行數(shù)據(jù)轉成 1 位串行數(shù)據(jù)接收端再把串行數(shù)據(jù)還原成并行數(shù)據(jù)。在 7:1 SerDes 場景里N 等于 7。這樣你只需要 1 對 LVDS 差分線就能傳 7 個并行信號通道數(shù)量削減到原來的七分之一PCB 布線的壓力驟降。并行轉串行聽起來簡單但真正做的時候要考慮一個關鍵問題串行速率的計算。假設原始并行數(shù)據(jù)時鐘頻率是 50MHz7:1 串行化之后串行比特速率就是 350MHz也就是一個數(shù)據(jù) bit 的寬度只有大約 2.86ns。在 FPGA 里350MHz 這個速率通常不用 GT 高速收發(fā)器而是直接用普通 IO 的 DDR 寄存器配合邏輯資源就能實現(xiàn)但前提是你必須把時序約束做對不能想當然地以為普通邏輯也能跑 350MHz。接收端的解串過程比發(fā)送端復雜得多。你不可能用一個 350MHz 時鐘直接把串行數(shù)據(jù)全部采下來然后拼起來因為 FPGA 內部邏輯跑 350MHz 通常問題不大但你要把 7 個連續(xù) bit 精確地采集并拼接成一個 7 位并行數(shù)據(jù)這里面對時鐘相位和采樣窗口的要求就非常嚴格。XAPP585 給出的思路是利用 FPGA 內部時鐘倍頻產生一個 7 倍頻或更高倍率的時鐘用這個時鐘作為采樣時鐘然后在邏輯里完成串并轉換。2.3 時鐘倍頻PLL/MMCM 的典型應用姿勢時鐘倍頻在 XAPP585 方案里承擔著承上啟下的作用。發(fā)送端通常只給一個隨路參考時鐘你需要通過 PLL/MMCM 倍頻產生串行比特時鐘同時利用多個相位輸出產生能夠覆蓋全部 7 個 bit 采樣窗口的時鐘。接收端則需要對隨路時鐘進行倍頻和相位調整以便在正確的時刻對串行數(shù)據(jù)進行采樣。具體到 Xilinx FPGA 實現(xiàn)上我建議優(yōu)先使用 MMCMMixed-Mode Clock Manager而不是直接裸用 PLL因為 MMCM 自帶相位動態(tài)調整能力可以很方便地在運行過程中微調輸出時鐘相位。這在接收端做位對齊訓練時特別有用。在 Artix-7 這類器件上MMCM 的輸出時鐘頻率范圍完全可以覆蓋 7:1 LVDS SerDes 所需的幾百 MHz 級別。時鐘倍頻還有個容易忽略的問題占空比失真。普通時鐘倍頻出來的時鐘在低頻時占空比可能還好到了 350MHz 以上占空比稍微偏一點采樣窗口就大幅度縮小。所以你在做時序約束的時候不能只看頻率還得把時鐘的不確定度clock uncertainty算進去否則靜態(tài)時序分析報告會告訴你 timing met實際上板卻瘋狂誤碼。3. XAPP585 設計方法逐層拆解3.1 發(fā)送端并行轉串行是怎么搭出來的發(fā)送端的核心邏輯就是把并行的 7 位數(shù)據(jù)通過某種機制變成一位一位串行發(fā)送出去。XAPP585 的做法不是簡單地用一個 7 位計數(shù)器去控制數(shù)據(jù)選擇器這在 350MHz 下很容易吃不消因為組合邏輯延遲會成為瓶頸。更靠譜的做法是利用位寬更寬的內部總線先用較低頻率的并行時鐘把數(shù)據(jù)鎖存到寄存器組再用高速串行時鐘把寄存器組中的數(shù)據(jù)通過多路選擇器依次送出。在 FPGA 實現(xiàn)時通常會用 FPGA 提供的 OSERDES 原語一個 OSERDES2/OSERDESE2 可以直接支持 7:1 或 8:1 模式內部已經幫你把并串轉換和 DDR 輸出做好了你只需要正確配置數(shù)據(jù)位寬、時序模式和數(shù)據(jù)順序即可。如果不想依賴原語自己寫一個 7 位移位寄存器來模擬也可以但我不建議你這么干。因為你最終還是要調用 IO 輸出寄存器繞不開底層原語。直接用原語是最穩(wěn)妥、時序最可控的方案。發(fā)送端還需要注意的一個細節(jié)是你發(fā)送的并行數(shù)據(jù)和隨路時鐘之間的相位關系到底是中心對齊還是邊沿對齊。XAPP585 中發(fā)送出去的隨路時鐘通常是串行比特時鐘的分頻版本數(shù)據(jù)在并行時鐘上升沿附近發(fā)生變化接收端拿到的隨路時鐘邊沿與數(shù)據(jù)有效窗口之間的相位差是固定的。你需要把這個相位約定寫進設計文檔方便接收端做對齊訓練時有一個初始參考。3.2 接收端如何把一根線還原成 7 位總線接收端的核心任務剛好是發(fā)送端的逆過程把串行數(shù)據(jù)流一位一位收下來拼成 7 位并行數(shù)據(jù)。但這里有個隱藏難題你怎么知道哪一位是 7 位數(shù)據(jù)組的起點如果起始位選錯了后面拼出來的所有數(shù)據(jù)都是錯位的。這就是位對齊bit alignment問題。XAPP585 的思路是在通信開始階段發(fā)送一個專門的訓練序列例如連續(xù)發(fā)送若干個固定的 7 位碼型接收端通過檢測這個碼型來確定數(shù)據(jù)的位邊界。一旦確定邊界后續(xù)數(shù)據(jù)都按這個邊界解串。這個過程有點類似通信里的幀同步不過這里只要找到 bit 邊界就夠了不需要做幀同步7 位數(shù)據(jù)的劃分是固定的。接收端的硬件結構可以用 ISERDES 原語實現(xiàn)。ISERDESE2 在 Xilinx 7 系列里提供了完善的串并轉換能力你可以配置成 7:1 模式配合內部的 bitslip 功能實現(xiàn)位對齊。bitslip 的本質是讓并行輸出數(shù)據(jù)整體左移或右移一位通過不斷執(zhí)行 bitslip 并檢查是否匹配訓練序列最終鎖定正確的起始位。3.3 位對齊訓練整個設計最燒腦的部分位對齊訓練流程值得展開說。簡單來說接收端初始化之后先持續(xù)接收串行數(shù)據(jù)同時把解串后的并行結果與預設的訓練碼型做比對。不一致就觸發(fā)一次 bitslip讓并行邊界移動一位再繼續(xù)比對。這個過程反復循環(huán)直到連續(xù)多個周期比對完全一致就認為已經鎖定。這里有幾個細節(jié)非常容易出問題。第一個是訓練序列的選擇。訓練碼型必須有足夠明顯的特征最好在循環(huán)移位后不會出現(xiàn)歧義。比如 7 位訓練碼型 1101001循環(huán)移位后不等于原來的碼型這樣才能準確找到邊界。如果你選的碼型循環(huán)移位后和原始碼型相同位對齊就不可能成功。第二個是訓練期間數(shù)據(jù)源頭的控制。接收端做位對齊訓練的時候發(fā)送端必須持續(xù)、穩(wěn)定地發(fā)送訓練碼型不能一會兒發(fā)訓練碼型一會兒發(fā)有效數(shù)據(jù)。工程上一般會定義一個訓練階段發(fā)送端在這個階段發(fā)送固定數(shù)量的訓練碼型接收端在這個階段完成位對齊然后雙方再進入數(shù)據(jù)傳輸階段。第三個是鎖定判決的機制。不能只比對到一個正確周期就認為鎖定因為在噪聲環(huán)境下可能偶發(fā)正確匹配。工程上建議連續(xù)匹配 4 次以上才宣告鎖定并且鎖定之后還不放心的話可以在數(shù)據(jù)傳輸階段用 CRC 或幀計數(shù)來做持續(xù)校驗一旦發(fā)現(xiàn)數(shù)據(jù)異常就重新進入訓練狀態(tài)。3.4 時鐘域與跨時鐘域處理完成位對齊之后你其實已經在高速時鐘域拿到了 7 位并行數(shù)據(jù)但這個數(shù)據(jù)的時鐘和你的內部邏輯時鐘往往不是同一個時鐘。你最終需要把數(shù)據(jù)從接收時鐘域搬到系統(tǒng)邏輯時鐘域。這個跨時鐘域處理如果做不好前面的努力全部白費。最常見的做法是把接收到的并行數(shù)據(jù)寫入一個異步 FIFO用接收側恢復出來的并行時鐘作為寫時鐘用系統(tǒng)邏輯時鐘作為讀時鐘。這里要注意接收側的并行時鐘頻率必須和系統(tǒng)邏輯時鐘頻率保持一致或成簡單比例關系否則 FIFO 要么溢出要么讀空。XAPP585 中因為發(fā)送端和接收端共用同一個參考頻率體系所以這個約束通常能滿足但你要在代碼里加好 FIFO 水位監(jiān)測一旦出現(xiàn)異常要及時報錯。如果兩端確實存在微小頻差比如兩個板卡各自用獨立的晶振除了用異步 FIFO更可靠的做法是加一個彈性緩沖機制在發(fā)送端定期插入填充數(shù)據(jù)skip symbol接收端在檢測到填充數(shù)據(jù)后丟棄從而吸收頻差。不過這會增加協(xié)議復雜度個人建議除非必要盡量在系統(tǒng)層面保證兩端時鐘同源。4. 電平標準、阻抗匹配與自動電平調整4.1 LVDS、HSCL、LVCMOS電平標準別選錯標題下面那串熱詞里有 HSCL 轉 LVDS、LVDS 自動電平調整電路這其實反映了一個很現(xiàn)實的工程問題并不是你遇到的所有信號都是標準 LVDS。你經常需要處理 FPGA、ADC、相機模組、連接器之間電平標準不一致的情況。LVDS 是低壓差分信號擺幅大約 350mV共模電壓 1.2V 左右信號速率高、功耗低。HSCL 是另一種高速電流驅動邏輯常見于某些時鐘緩沖芯片和數(shù)據(jù)轉換器它的擺幅比 LVDS 更小共模電壓也不同如果不做電平轉換直接互聯(lián)很容易導致接收端采樣不穩(wěn)定。市面上有專門的 LVDS 轉 HSCL 或 HSCL 轉 LVDS 的轉換芯片設計者在選型時一定要查清楚兩端器件的電平標準和共模范圍不要想當然。LVCMOS 則是單端信號標準在一些低速控制總線和配置接口中大量存在。如果你想把 LVCMOS 信號和 LVDS 接收端對接通常需要用帶 LVCMOS 輸入兼容的 LVDS 接收器或者加一個轉換芯片。XAPP585 的核心數(shù)據(jù)通道是純 LVDS但你在實際項目中遇到的輔助信號可能是 LVCMOS不要混淆。4.2 終端電阻與 PCB 走線LVDS 信號要求接收端有正確的終端匹配。標準做法是在接收端差分對之間并接一個 100 歐姆電阻。這個電阻不一定需要你外接因為很多 FPGA 的 LVDS IO 內部已經集成了可選終端電阻你用原語配置或者約束文件里打開即可。但如果你的板卡走線比較長或者速率特別高我建議還是用外部終端電阻更穩(wěn)因為內部電阻的精度和位置上可能不夠理想。PCB 走線方面差分對的等長要求很關鍵。對于 7:1 SerDes 場景下的幾百 MHz 信號差分對內等長控制在 5mm 以內通常就夠但是差分對之間的等長也要注意尤其是數(shù)據(jù)線和隨路時鐘線之間。如果數(shù)據(jù)和時鐘的走線長度差太多接收端采樣窗口會被嚴重壓縮甚至直接采錯。關于參考平面LVDS 差分走線下方最好有完整的地平面不要跨越分割區(qū)域。如果不可避免要打過孔換層記得在過孔附近加回流地孔否則信號返回路徑被破壞眼圖會變差。4.3 自動電平調整電路到底解決什么問題LVDS 自動電平調整電路這個詞猛一聽感覺像什么黑科技其實重點落在“自動調整閾值”上。標準 LVDS 接收器內部有一個固定共模電平的比較閾值但在一些特殊應用中發(fā)送端的共模電壓漂移范圍很大或者傳輸鏈路上存在直流偏置漂移固定閾值的接收器就會出現(xiàn)采樣錯誤。自動電平調整的思路是先測量接收端信號的長期平均電平把這個作為自適應閾值參考或者用帶反饋的環(huán)路調整輸入偏置讓信號始終落在接收器的有效輸入范圍內。這種電路在鏈路中有交流耦合電容導致直流電平需要恢復的場景下特別有用。你在做 XAPP585 類型設計時如果發(fā)送端和接收端不在同一塊板上而且通過線纜連接建議仔細看看數(shù)據(jù)手冊里的共模輸入范圍必要時選用支持自動電平調整的 LVDS 接收器芯片。如果你只用 FPGA 內部 LVDS 接收器通常沒有自動電平調整功能這時你必須保證發(fā)送端和接收端的共模電平匹配。通常在兩個板卡之間使用交流耦合電容可以隔離直流偏置差異但是電容會帶來低頻截止效應需要保證信號的基頻遠高于高通濾波器截止頻率否則低頻分量會被衰減。5. FPGA 內部硬核與外部解串器芯片方案對比5.1 外部 8 位 LVDS 解串器芯片方案熱詞里提到“8位總線LVDS解串器芯片”這也是很多工程師會考慮的備選方案。外部解串器芯片的核心思路是把 LVDS 串行信號轉換為并行數(shù)據(jù)總線直接輸出 8 位或更高的并行數(shù)據(jù)同時輸出并行恢復時鐘給 FPGA。FPGA 只需要接收并行數(shù)據(jù)和時鐘不需要自己在內部做位對齊和 SerDes 解串。這種方案的最大優(yōu)勢是邏輯設計簡單開發(fā)周期短時序更容易收斂。芯片廠商會把位對齊、時鐘數(shù)據(jù)恢復這些都做在芯片內部FPGA 端只需要處理并行域的數(shù)據(jù)即可。對于不熟悉 FPGA SerDes 原語、希望快速出板的團隊這是非常務實的選擇。缺點也很明顯。首先是成本增加一顆像樣的 LVDS 解串器芯片價格不便宜其次是靈活性差如果鏈路速率或者數(shù)據(jù)格式有變化可能需要重新?lián)Q芯片第三是 PCB 面積可能并沒有節(jié)省太多因為外部芯片自己可能也需要配置接口、電源去耦和終端電阻。還有一個容易忽視的問題是解串器芯片輸出的并行數(shù)據(jù)時序參數(shù)可能比較苛刻FPGA 側的輸入延遲約束和時鐘約束必須仔細設置否則并行接收也可能出錯。5.2 FPGA 內部資源實現(xiàn)方案的優(yōu)劣XAPP585 代表的是純 FPGA 內部實現(xiàn)方案用 FPGA 的 ISERDES/OSERDES、MMCM/PLL、IO 延遲鏈來完成全部 7:1 串行化與解串工作。這種方案省掉外部芯片BOM 成本更低數(shù)據(jù)格式可以通過配置靈活調整非常適合對成本敏感、需要快速迭代或者通道數(shù)量較多的設計。代價是開發(fā)難度高時序收斂需要功力特別是接收端的位對齊訓練邏輯需要你對 FPGA 底層原語的行為非常熟悉。同時這種方案會占用較多的 FPGA 普通 IO 資源和鎖相環(huán)資源如果你的設計里已經有很多 LVDS 通道需要仔細評估資源占用情況避免關鍵 LVDS 通道數(shù)量太多把 MMCM 和高速 IO 全占滿導致其他功能沒有資源可用。我個人的建議是如果項目量級不大、時間緊、鏈路速率也不是特別高直接用外部解串器芯片更省心。如果項目量大、成本壓力大、需要精細控制傳輸協(xié)議或者你對 FPGA 時序控制已經很有經驗那就毫不猶豫用 FPGA 內部方案XAPP585 的參考設計能幫你少走很多彎路。6. 常見問題與排查技巧實錄6.1 數(shù)據(jù)總是錯位或丟數(shù)最典型的排查場景上板之后接收端輸出的并行數(shù)據(jù)完全錯位或者偶爾出現(xiàn)丟數(shù)。第一步先確認發(fā)送端和接收端是否約定好了位對齊訓練協(xié)議。很多人忽視訓練階段的設計直接在數(shù)據(jù)通信階段不停地做 bitslip結果數(shù)據(jù)在錯位和正確之間反復橫跳越調越亂。正確做法是在鏈路初始化階段集中完成位對齊對齊成功后就把 bitslip 信號拉低保持邊界鎖定除非發(fā)生嚴重錯誤否則不再做滑動。如果你發(fā)現(xiàn)接收數(shù)據(jù)偶爾錯位大概率是訓練階段沒有鎖定成功或者鎖定成功之后數(shù)據(jù)傳輸過程中出現(xiàn)了單bit錯誤被誤當成邊界變化。排查手段推薦用 ILA集成邏輯分析儀抓取訓練前后的并行數(shù)據(jù)觀察數(shù)據(jù)碼型。如果你在訓練階段發(fā)送的是 0b1101001抓到的數(shù)據(jù)如果始終是它的循環(huán)移位說明位邊界沒對準繼續(xù)執(zhí)行 bitslip如果抓到的數(shù)據(jù)偶爾對偶爾不對說明訓練碼型設計可能不好或者時序裕量不夠需要回去調整時鐘相位。6.2 時鐘抖動導致誤碼LVDS 源同步接口的誤碼很大一部分來源于時鐘抖動。隨路時鐘經過線纜、連接器、PCB 走線到達接收端時鐘邊沿的抖動會直接轉化為采樣窗口的縮小。尤其是數(shù)據(jù)速率做到 350MHz 以上時哪怕幾十皮秒的抖動都可能讓采樣點偏離數(shù)據(jù)中心。解決思路有幾個層面。第一PCB 設計上保證時鐘走線盡量短、參考面完整、遠離開關電源等噪聲源。第二接收端時鐘輸入引腳配置合適的外部終端電阻減少反射。第三在 FPGA 內部使用全局時鐘緩沖器把隨路時鐘分配到專用的時鐘網絡上避免普通布線帶來的額外抖動。第四如果抖動實在壓不下來可以在做相位動態(tài)調整時不要追求把采樣點正對數(shù)據(jù)中心而是選取一個左右裕量相對平衡的位置這樣即便時鐘有一點抖動也不會立刻誤碼。6.3 傳輸線阻抗連續(xù)性與 EMI 問題LVDS 雖然抗共模干擾能力強但前提是傳輸線的差分阻抗穩(wěn)定在 100 歐姆附近。如果走線穿過連接器、過孔或者線纜阻抗不連續(xù)會導致反射反射會疊加到信號上引起過沖下沖進一步壓縮接收端眼圖。應對方法是在連接器和 PCB 走線交界處仔細設計焊盤和過孔尺寸盡量減小阻抗突變。如果信號質量還是不好可以在接收端加一個 RC 端接或者再次確認終端電阻是否在正確位置而不是焊在發(fā)送端。EMI 的問題更多源于共模電流源同步接口中數(shù)據(jù)和時鐘同時翻轉共模噪聲可能耦合到線纜上進而影響系統(tǒng)認證。如果條件允許可以在數(shù)據(jù)線對和時鐘線對上分別加共模扼流圈能有效抑制共模輻射。對于這些硬件層面的問題光靠邏輯調試解決不了。我的習慣是每次上板前先做靜態(tài)時序分析和信號完整性檢查確認 PCB 布局布線滿足規(guī)格書要求再寫 FPGA 邏輯調試。很多問題在原理圖評審階段就可以提前規(guī)避千萬別指望邏輯代碼里用狀態(tài)機硬扛。6.4 實戰(zhàn)中的小技巧與經驗總結最后分享幾個我實際調試中積累的小技巧。第一個是熱詞里提到的 LVDS 自動電平調整如果鏈路兩側電位差較大可以考慮在接收端加交流耦合電容之后再接 LVDS 接收器但是要注意選擇足夠大的電容值否則低頻分量丟失會讓數(shù)據(jù)出現(xiàn)長串的連續(xù) 0 或 1 時產生問題。電容容值建議根據(jù)最低信號頻率計算低頻截止頻率至少是信號基頻的十分之一以下。第二個技巧是接收端初始采樣時鐘相位的粗調。你可以用固定相位加掃相位的辦法上板后通過軟件寄存器遍歷 MMCM 輸出時鐘的相位延遲值在每一個相位下統(tǒng)計誤碼率或者比對訓練碼型的匹配次數(shù)最終選擇最優(yōu)相位寫入默認配置。這個方法雖然土但特別直觀有效尤其是在你知道自己的 PCB 走線長度跟估算有偏差的時候。第三個技巧是發(fā)送端數(shù)據(jù)順序的處理。在配置 OSERDES 時數(shù)據(jù)位序到底是先發(fā)低位還是先發(fā)高位文檔里寫得很清楚但實際應用中經常因為總線定義不同導致數(shù)據(jù)整體反序。解法是先在測試階段發(fā)送一個單 bit 翻轉的碼型也就是并行數(shù)據(jù)只有一位為 1接收端抓到之后能很清楚地看出位序正反和位偏移量。第四個技巧是復位順序。SerDes 收發(fā)鏈路對復位時序非常敏感發(fā)送端的 PLL 鎖定后才能釋放串行器的復位接收端必須等待接收側時鐘穩(wěn)定后才能開始解串和位對齊訓練。如果復位時序混亂可能導致部分 MMCM 輸出相位不對邏輯跑飛。建議做成一個專門的復位狀態(tài)機通過時鐘鎖定信號串聯(lián)觸發(fā)。結語與個人體會XAPP585 這套設計方法我從最初覺得晦澀難懂到后來項目里反復使用最大的體會就是“位對齊”和“時鐘可靠”這兩個關鍵詞。源同步接口的成敗很大程度上取決于你是否愿意在基礎設施上花時間時鐘約束是否嚴謹、訓練狀態(tài)機是否可靠、復位時序是否規(guī)范。只要這三樣做扎實了剩下的無非是在原語配置和數(shù)據(jù)通路里按部就班地填參數(shù)。如果你現(xiàn)在正準備用 LVDS 7:1 SerDes 做自己的項目我建議先把 XAPP585 的參考設計源碼完整讀一遍弄清楚發(fā)送端和接收端的原語配置然后畫一張時序圖把隨路時鐘、串行數(shù)據(jù)、并行恢復時鐘之間的相位關系自己推導一遍。等你真正吃透了這套流程后面再遇到 PCIe、JESD204B 這類更復雜的 SerDes 接口也會有非常扎實的信心基礎。動手調試的時候不要慌LVDS 源同步接口出現(xiàn)誤碼、錯位都是正常的排查過程。按照“先時鐘后數(shù)據(jù)、先訓練后傳輸、先對齊后穩(wěn)定”的順序一步步驗證最終一定能看到穩(wěn)定的并行數(shù)據(jù)正確地從接收端輸出。希望這篇文章能幫你節(jié)省一些翻文檔和踩坑的時間。