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