程采集實(shí)戰(zhàn):Crosslink-NX與GMSL2架構(gòu)詳解)
1. 為什么多攝像頭遠(yuǎn)程采集場(chǎng)景會(huì)用到Crosslink-NX和GMSL2做過(guò)多路視覺(jué)采集的朋友應(yīng)該都有體會(huì)攝像頭一多問(wèn)題就不是擰螺絲那么簡(jiǎn)單了。PCB走線長(zhǎng)度、EMI輻射、接口帶寬、幀同步、線束成本、連接器可靠性每一項(xiàng)都能把項(xiàng)目拖進(jìn)泥潭。尤其是在車載環(huán)視、自動(dòng)駕駛域控、工業(yè)檢測(cè)設(shè)備這類需要把多個(gè)攝像頭信號(hào)匯聚到一顆主處理SoC的場(chǎng)景里方案選型往往直接決定整個(gè)項(xiàng)目的成敗。我第一次接觸Crosslink-NX是被它的MIPI D-PHY通道數(shù)量吸引的。Lattice這顆芯片最多支持多少路MIPI RX/TX熟悉FPGA的人應(yīng)該心里有數(shù)——在同類低功耗FPGA里它的MIPI接口資源算是相當(dāng)能打的一檔。單顆Crosslink-NX可以同時(shí)接收多路MIPI CSI-2攝像頭信號(hào)然后做數(shù)據(jù)聚合再通過(guò)MIPI TX口輸出給主SoC。這樣主處理器只需要用一個(gè)CSI口就能拿到多路攝像頭數(shù)據(jù)省掉的不只是接口資源還有主芯片側(cè)的軟件復(fù)雜度。但這里有個(gè)工程上的現(xiàn)實(shí)問(wèn)題攝像頭模組和主處理器之間往往不是近在咫尺。典型場(chǎng)景比如卡車牽引掛車、工程機(jī)械臂末端視覺(jué)、智能座艙的駕駛員監(jiān)控?cái)z像頭傳感器常常要放在好幾米甚至十幾米外。MIPI CSI-2的傳輸距離大家都懂PCB上走個(gè)十幾厘米都費(fèi)勁線纜一長(zhǎng)就是一場(chǎng)噩夢(mèng)。這時(shí)候就必須引入串行傳輸方案。GMSL2就是目前業(yè)界用得最多的高速串行鏈路標(biāo)準(zhǔn)之一單條同軸電纜或者屏蔽雙絞線就能把MIPI信號(hào)、I2C控制信號(hào)、GPIO甚至供電全部打在一起傳輸距離做到10米以上非常輕松。這個(gè)連載第15篇我想專門把多攝像頭采集、聚合和GMSL2遠(yuǎn)程傳輸這條鏈路完整拆一遍。前半部分講清楚Crosslink-NX在系統(tǒng)里到底負(fù)責(zé)哪幾件事后半部分給出一個(gè)可參考的架構(gòu)設(shè)計(jì)思路和幾個(gè)容易被忽略的工程細(xì)節(jié)。這篇的內(nèi)容適合正在選型或者已經(jīng)在做多路視覺(jué)采集方案的硬件工程師、FPGA邏輯工程師以及被攝像頭信號(hào)傳不遠(yuǎn)折磨過(guò)的系統(tǒng)集成人員。2. GMSL2鏈路的底層機(jī)制與選型邏輯2.1 GMSL2到底是什么它解決的核心痛點(diǎn)GMSL2全稱是Gigabit Multimedia Serial Link第二代版本由Maxim現(xiàn)在并入ADI主推。它本質(zhì)上是一條高速串行鏈路專門為車規(guī)級(jí)視頻傳輸設(shè)計(jì)。第一代GMSL跑的是并行LVDS或者M(jìn)IPI信號(hào)轉(zhuǎn)換第二代GMSL2直接把MIPI CSI-2協(xié)議封裝進(jìn)高速串行數(shù)據(jù)流里同時(shí)還能在反向通道上傳I2C控制信號(hào)。如果對(duì)GMSL2沒(méi)什么概念可以把它想象成一條視頻控制供電的三合一高速公路。正向通道承載視頻數(shù)據(jù)反向通道是低速控制通道跑I2C用來(lái)配置攝像頭寄存器或者讀取傳感器狀態(tài)PoC供電則直接在線上疊加直流電源給遠(yuǎn)端攝像頭模組供電。這樣遠(yuǎn)端節(jié)點(diǎn)只需要一根同軸電纜接到中心節(jié)點(diǎn)不需要單獨(dú)拉電源線、控制線和數(shù)據(jù)線線束成本和連接器數(shù)量直線下降。在GMSL2的方案里遠(yuǎn)端攝像頭模組一般會(huì)配一顆串行器Serializer中心節(jié)點(diǎn)配一顆解串器Deserializer。串行器把MIPI CSI-2的差分?jǐn)?shù)據(jù)線轉(zhuǎn)換成一個(gè)高速串行流通過(guò)同軸線傳給解串器解串器再把串行流還原成MIPI CSI-2送給后端的采集芯片也就是Crosslink-NX這類FPGA。鏈路是雙向的但工作模式非對(duì)稱視頻走正向控制走反向帶寬分配非常合理。2.2 3Gbps鏈路帶寬和UBW字對(duì)齊機(jī)制GMSL2單條鏈路的有效帶寬是3Gbps這個(gè)帶寬到底能裝下多少路視頻是必須細(xì)算的問(wèn)題。以一顆800萬(wàn)像素的傳感器跑30fps為例RAW10格式的裸數(shù)據(jù)量大約是 800萬(wàn)10bit30 2.4Gbps再算上MIPI協(xié)議的包頭包尾開(kāi)銷實(shí)際上已經(jīng)把3Gbps鏈路頂?shù)浇咏鼧O限了。所以GMSL2典型用法是每路攝像頭占用一條獨(dú)立鏈路每條鏈路只承載一路視頻流。但如果攝像頭分辨率低一些比如200萬(wàn)像素的RAW8格式跑30fps裸數(shù)據(jù)量大約為 200萬(wàn)830 480Mbps這時(shí)候一條3Gbps的鏈路上其實(shí)是可以塞下多路視頻流的。具體能不能塞取決于配套解串器是否支持視頻流聚合以及前端FPGA如何做多路流的時(shí)分復(fù)用。這個(gè)點(diǎn)后面會(huì)展開(kāi)說(shuō)。GMSL2還有一個(gè)值得注意的底層機(jī)制叫UBW即Universal Background Word。簡(jiǎn)單理解它是一種特殊的鏈路控制字用來(lái)對(duì)齊和標(biāo)記數(shù)據(jù)流。串行器在空閑的時(shí)候持續(xù)發(fā)送UBW解串器靠識(shí)別UBW來(lái)建立幀同步。調(diào)試GMSL2鏈路的時(shí)候如果發(fā)現(xiàn)視頻流時(shí)斷時(shí)續(xù)多半就是UBW檢測(cè)出了問(wèn)題比如線纜屏蔽層接地不好、連接器松動(dòng)、PoC供電紋波過(guò)大。這幾個(gè)方向優(yōu)先排查比盲目改寄存器高效得多。2.3 為什么選GMSL2而不是MIPI直接延長(zhǎng)或A-PHY剛接觸遠(yuǎn)程攝像頭方案的人常會(huì)問(wèn)一個(gè)問(wèn)題既然Crosslink-NX能采集MIPI信號(hào)為什么不直接用MIPI線把攝像頭拉遠(yuǎn)一點(diǎn)非要多花兩顆芯片做串行和解串這個(gè)問(wèn)題的答案在現(xiàn)場(chǎng)工程里非常明確。MIPI CSI-2是源同步差分接口信號(hào)質(zhì)量嚴(yán)重依賴線纜阻抗和PCB走線長(zhǎng)度一般超過(guò)30厘米就開(kāi)始出現(xiàn)眼圖閉合的風(fēng)險(xiǎn)。就算用很好的屏蔽線硬拉到1米EMI表現(xiàn)也會(huì)很差更過(guò)不了車規(guī)級(jí)的輻射發(fā)射測(cè)試。GMSL2把高速信號(hào)轉(zhuǎn)成單端同軸傳輸線纜本身的寄生參數(shù)影響小得多傳輸距離和抗干擾能力完全是另一個(gè)量級(jí)。GMSL2的競(jìng)爭(zhēng)替代方案主要是A-PHY和FPD-Link。FPD-Link是TI自家的串行鏈路體系在車載領(lǐng)域也有大量裝機(jī)。A-PHY則是標(biāo)準(zhǔn)組織推動(dòng)的物理層規(guī)范口號(hào)是更開(kāi)放的生態(tài)。三者在功能上高度相似選了哪家基本就等于定了對(duì)應(yīng)廠商的串行器/解串器芯片生態(tài)。對(duì)很多團(tuán)隊(duì)來(lái)說(shuō)選擇GMSL2的理由并不復(fù)雜ADI的解串器能和Crosslink-NX直接對(duì)接的參考設(shè)計(jì)最多資料齊全MIPI輸出側(cè)的兼容性問(wèn)題少。做產(chǎn)品選型不要太迷信參數(shù)表周圍能抄的作業(yè)多不多才是真正的隱性成本。3. 硬件系統(tǒng)框架攝像頭端到主處理器的完整數(shù)據(jù)路徑3.1 Crosslink-NX在系統(tǒng)中的三個(gè)角色把一套GMSL2多攝像頭采集系統(tǒng)拆開(kāi)看Crosslink-NX不是一個(gè)被動(dòng)的中轉(zhuǎn)站而是承擔(dān)了三個(gè)關(guān)鍵角色MIPI接收、數(shù)據(jù)聚合、以及GMSL2解串器側(cè)的協(xié)議適配。最典型的架構(gòu)是這樣的多路攝像頭模組各自帶一顆GMSL2串行器通過(guò)同軸電纜連到中心板。中心板上有對(duì)應(yīng)數(shù)量的GMSL2解串器把遠(yuǎn)端傳來(lái)的串行信號(hào)還原成MIPI CSI-2每個(gè)解串器的MIPI輸出接到Crosslink-NX的MIPI RX lane上。Crosslink-NX在內(nèi)部完成多路視頻流的接收、對(duì)齊、交織或者拼接最后從MIPI TX口輸出一路聚合后的CSI-2流給主SoC。這個(gè)過(guò)程里有幾個(gè)容易踩坑的點(diǎn)。第一是MIPI lane的分配每個(gè)解串器的MIPI輸出是4 lane還是2 lane取決于攝像頭分辨率和帶寬需求而Crosslink-NX的MIPI RX端口的lane數(shù)量是固定的分配不好就會(huì)導(dǎo)致某些端口帶寬不夠。第二是時(shí)鐘域每個(gè)解串器的輸出像素時(shí)鐘來(lái)自各自的遠(yuǎn)端傳感器即使兩個(gè)攝像頭型號(hào)一樣像素時(shí)鐘也不可能完全同頻必須靠FPGA內(nèi)部做跨時(shí)鐘域處理。第三是數(shù)據(jù)交織格式聚合輸出可以做成virtual channel方式在一條CSI-2流里用VC區(qū)分不同攝像頭也可以做成視頻拼接方式把多路圖拼成一整幅大圖。這兩種方式對(duì)應(yīng)的FPGA內(nèi)部邏輯完全不同。3.2 攝像頭模組端設(shè)計(jì)串行器和PoC供電攝像頭端的硬件設(shè)計(jì)相對(duì)簡(jiǎn)單但簡(jiǎn)簡(jiǎn)單單三顆芯片Sensor、串行器、電源里也藏著不少講究。以ADI的MAX96717為例常見(jiàn)搭配是一顆MIPI CSI-2接口的傳感器傳感器輸出4 lane MIPI接到MAX96717的輸入側(cè)MAX96717把信號(hào)轉(zhuǎn)成GMSL2單線串行輸出。MAX96717還能通過(guò)I2C給傳感器供控制通道鏈路由中心側(cè)的MAX96712或者M(jìn)AX96714統(tǒng)一管理。PoC供電的電路設(shè)計(jì)是很多團(tuán)隊(duì)第一次做GMSL2板卡時(shí)最容易踩坑的地方。PoC的意思是Power over Coax視頻信號(hào)和直流電源共用一根同軸線。接收端往同軸線注入直流電壓發(fā)送端從同軸線提取直流電壓給自己和傳感器供電。問(wèn)題在于同軸線上既要走幾V的直流電源又要走最高3Gbps的高速信號(hào)電源和信號(hào)之間的隔離就全靠PoC電感和電容網(wǎng)絡(luò)。這個(gè)網(wǎng)絡(luò)的截止頻率、諧振點(diǎn)、寄生參數(shù)都會(huì)影響最終的眼圖質(zhì)量。電感選得太大電源紋波抑制好但高速信號(hào)被衰減選得太小信號(hào)是好走了但電源噪聲直接串進(jìn)鏈路。這塊電路設(shè)計(jì)建議直接參考ADI的評(píng)估板原理圖不要自己憑空發(fā)揮。3.3 中心板端設(shè)計(jì)解串器和Crosslink-NX的連接中心端的硬件設(shè)計(jì)思路是把多路GMSL2鏈路先解串成MIPI再匯入Crosslink-NX。以4路攝像頭為例可以使用兩顆MAX96712每顆支持4路GMSL2輸入或者2路輸入加2路輸出。MAX96712的輸出側(cè)可以通過(guò)配置把多路輸入流復(fù)用成一路MIPI輸出也可以讓每路輸入獨(dú)立對(duì)應(yīng)一路MIPI輸出。采用哪種方式要看Crosslink-NX的資源占用和系統(tǒng)復(fù)雜度。從我的實(shí)際經(jīng)驗(yàn)來(lái)看推薦的方式是讓每路解串器輸出獨(dú)立的MIPI接口接到Crosslink-NX的不同RX端口上。這樣做的好處是每個(gè)RX端口的MIPI lane可以獨(dú)立配置時(shí)序約束也簡(jiǎn)單清晰邏輯設(shè)計(jì)上不用去解析解串器內(nèi)部的復(fù)用格式。因?yàn)椴煌瑐鞲衅鞯臅r(shí)序參數(shù)不可能完全一樣在Crosslink-NX內(nèi)部做對(duì)齊遠(yuǎn)比依賴解串器的復(fù)用機(jī)制更可控。Crosslink-NX和主SoC之間的連接常見(jiàn)方案是MIPI CSI-2輸出。如果主SoC支持CSI-2接收直接接4 lane就能得到聚合后的視頻流。部分場(chǎng)景下也會(huì)用到并行接口或者PCIe但MIPI輸出是絕大多數(shù)情況下的最優(yōu)解因?yàn)椴挥妙~外加橋接芯片軟件側(cè)只需要按標(biāo)準(zhǔn)的CSI-2設(shè)備驅(qū)動(dòng)來(lái)枚舉攝像頭個(gè)數(shù)。4. FPGA內(nèi)部邏輯設(shè)計(jì)從MIPI接收對(duì)齊到數(shù)據(jù)聚合4.1 多路MIPI RX通道的獨(dú)立初始化和Lane映射Crosslink-NX內(nèi)部對(duì)MIPI接口的支持依賴的是它的硬核MIPI D-PHY IP和可編程的Byte-to-Pixel邏輯。每一個(gè)RX端口可以獨(dú)立配置為1/2/4 lane模式lane的極性也可以交換這樣PCB布線的時(shí)候可以靈活調(diào)整走線方向不用強(qiáng)制差分對(duì)一一對(duì)應(yīng)。邏輯設(shè)計(jì)的第一步是初始化每一路MIPI RX。MIPI協(xié)議規(guī)定接收端要先檢測(cè)LP狀態(tài)接收端的初始化時(shí)序是等待LP-00狀態(tài)進(jìn)入HS模式接收端通過(guò)解析SoT開(kāi)始接收數(shù)據(jù)包。這些過(guò)程在Lattice的MIPI RX IP中已經(jīng)封裝好了但使用的時(shí)候必須仔細(xì)確認(rèn)每一路MIPI RX的時(shí)鐘使能時(shí)序。多路視頻流接入后每一路的HS時(shí)鐘完全獨(dú)立FPGA需要為每個(gè)RX端口分配獨(dú)立的時(shí)鐘域。Lane映射是另一個(gè)坑。部分解串器輸出的MIPI lane順序可能是固定的而Crosslink-NX的RX端口如果做了lane交換配置雙方必須有明確的映射約定。最好的做法是在設(shè)計(jì)文檔里畫(huà)一張表格把每顆解串器輸出、FPGA引腳、RX通道lane順序全部列出來(lái)避免layout階段一改再改導(dǎo)致邏輯映射對(duì)不上。4.2 行緩沖與數(shù)據(jù)交織策略多路視頻流進(jìn)入FPGA后第一步是轉(zhuǎn)換成16bit或者24bit的像素?cái)?shù)據(jù)。對(duì)于常見(jiàn)的RAW8傳感器8bit像素就夠了。RAW10或者RAW12就需要把像素拼成16bit的word這會(huì)帶來(lái)一個(gè)對(duì)齊問(wèn)題RAW10的一行像素個(gè)數(shù)乘以10bit不一定能整除16所以每一行的行尾會(huì)有空bit填充。Crosslink-NX的MIPI RX IP提供了一組sideband信號(hào)用來(lái)標(biāo)記行有效和數(shù)據(jù)有效邏輯層要基于這些信號(hào)做數(shù)據(jù)切割。聚合的方式我有兩個(gè)推薦。第一種是VC整合把每一路視頻流當(dāng)作一個(gè)獨(dú)立的Virtual Channel在輸出MIPI流的時(shí)候給每個(gè)通道配置不同的VC號(hào)。這種方式實(shí)現(xiàn)簡(jiǎn)單主SoC可以直接通過(guò)CSI-2的VC號(hào)區(qū)分?jǐn)z像頭非常適合cameralink類的采集卡或者部分ISP。第二種是行交織把多路視頻流的同一行數(shù)據(jù)拼接到同一個(gè)輸出行里。這種方式適合需要做雙目立體視覺(jué)的場(chǎng)景左右目圖像可以做到逐行對(duì)齊減少后續(xù)畸變校正和立體匹配的計(jì)算壓力。兩種方式各有適用場(chǎng)景我自己做過(guò)的方案里VC整合為主因?yàn)樗倪壿嬮_(kāi)銷最小主控軟件也最容易適配。行交織方式的帶寬利用率更高但邏輯復(fù)雜度明顯上升一句話總結(jié)除非你的算法明確要求逐行對(duì)齊否則優(yōu)先選VC方式。4.3 速率計(jì)算與FIFO深度規(guī)劃FPGA邏輯設(shè)計(jì)里最容易被低估的是FIFO深度規(guī)劃。多路攝像頭數(shù)據(jù)匯聚到一路MIPI輸出輸出帶寬必須大于所有輸入帶寬之和這個(gè)道理大家都懂但實(shí)際做起來(lái)還是有細(xì)節(jié)。因?yàn)檩敵鯩IPI接口的lane數(shù)和工作頻率是固定的而各路輸入的數(shù)據(jù)到達(dá)時(shí)間是隨機(jī)的突然有多路數(shù)據(jù)同時(shí)到達(dá)輸出端口瞬時(shí)帶寬需求可能超過(guò)輸出端口能力這時(shí)候就需要FIFO來(lái)吸收突發(fā)流量。FIFO深度的計(jì)算思路是這樣的以單路1080p30 RAW10為例像素時(shí)鐘大約為74.25MHz有效數(shù)據(jù)帶寬為 1920108030*10bit ≈ 622Mbps。4路加起來(lái)約2.5Gbps如果輸出MIPI采用4 lane每lane 1.5Gbps總帶寬為6Gbps看起來(lái)冗余很大。但實(shí)際上MIPI輸出的數(shù)據(jù)是突發(fā)的一行數(shù)據(jù)到達(dá)后必須在特定時(shí)間內(nèi)送完邏輯里還會(huì)插入消隱期所以FIFO深度不能只看平均帶寬。常用做法是把輸入數(shù)據(jù)的行時(shí)間作為基準(zhǔn)計(jì)算最壞情況下多路行數(shù)據(jù)重疊時(shí)的數(shù)據(jù)量然后乘以一個(gè)1.5到2的裕量系數(shù)。以我的經(jīng)驗(yàn)每路FIFO深度至少要做到1.5個(gè)標(biāo)準(zhǔn)行數(shù)據(jù)量即 192010bit1.5 ≈ 28.8Kbit選個(gè)32Kbit的FIFO就夠了。不要在這個(gè)地方省資源FIFO溢出導(dǎo)致的行丟失比任何算法問(wèn)題都難排查。5. 多攝像頭同步為什么必須做以及GMSL2鏈路上的實(shí)現(xiàn)路徑5.1 幀同步和曝光同步的區(qū)別多攝像頭同步這個(gè)說(shuō)法太籠統(tǒng)工程上必須拆成兩個(gè)問(wèn)題來(lái)看幀同步和曝光同步。幀同步的意思是所有攝像頭在同一個(gè)時(shí)刻開(kāi)始傳輸一幀畫(huà)面。如果幀不同步不同的攝像頭圖像會(huì)存在時(shí)間偏移在拼接、融合或者測(cè)距算法里會(huì)產(chǎn)生嚴(yán)重的偽影。比如車上的環(huán)視系統(tǒng)如果四個(gè)攝像頭采集時(shí)間不一致車身周圍的物體在移動(dòng)時(shí)拼接出來(lái)的全景圖就會(huì)有撕裂感。曝光同步則更進(jìn)一步要求所有攝像頭不僅同時(shí)開(kāi)始讀幀還要求同時(shí)開(kāi)始曝光。因?yàn)槠毓獍l(fā)生在傳感器內(nèi)部即使幀同步命令發(fā)得再準(zhǔn)如果曝光時(shí)序不同實(shí)際采到的畫(huà)面仍然有時(shí)間差。對(duì)于高速運(yùn)動(dòng)場(chǎng)景比如車輛在高速上行駛時(shí)拍攝路面標(biāo)線曝光時(shí)間差幾毫秒就會(huì)造成數(shù)厘米的定位誤差。GMSL2方案對(duì)同步的支持相對(duì)友好原因在于GMSL2的反向控制通道是共享的可以通過(guò)解串器向所有遠(yuǎn)程串行器廣播同步信號(hào)。硬件上需要做的是在Crosslink-NX里生成一個(gè)同步脈沖通過(guò)I2C或者GPIO的方式輸出到每一路解串器的同步接口然后解串器把同步信號(hào)通過(guò)GMSL2鏈路的專用通道送給遠(yuǎn)端傳感器。5.2 基于GPIO的硬件觸發(fā)方案我自己在項(xiàng)目里用得最多的方案是FPGA輸出多路同步GPIO分別接到每顆解串器的同步輸入引腳解串器通過(guò)GMSL2反向通道把對(duì)應(yīng)的觸發(fā)命令發(fā)給串行器。部分傳感器也支持直接用PWM或者外部觸發(fā)引腳這時(shí)候可以把FPGA的同步脈沖直接接到傳感器側(cè)的觸發(fā)腳。同步精度的關(guān)鍵是脈沖寬度和傳播延遲的一致性。不同鏈路的長(zhǎng)短、解串器配置差異會(huì)導(dǎo)致同步脈沖到達(dá)傳感器的時(shí)刻不完全一致好在GMSL2方案的這個(gè)偏差通常在微秒量級(jí)遠(yuǎn)小于絕大多數(shù)視覺(jué)算法的需求。如果對(duì)同步要求極高可以在Crosslink-NX內(nèi)部做一個(gè)延遲校準(zhǔn)邏輯通過(guò)細(xì)粒度延時(shí)單元把每路的觸發(fā)時(shí)刻對(duì)齊到納秒級(jí)。這個(gè)邏輯其實(shí)不難難的是同步信號(hào)的回讀確認(rèn)。建議在FPGA里設(shè)計(jì)一個(gè)簡(jiǎn)單的計(jì)數(shù)器記錄每路攝像頭幀起始信號(hào)和同步脈沖的間隔用來(lái)驗(yàn)證同步是否真正生效。很多攝像頭輸出幀信號(hào)時(shí)會(huì)有不確定性只有實(shí)測(cè)間隔基本恒定才能放心把同步方案交付。5.3 主SoC側(cè)的軟件配合硬件同步只完成了一半主SoC側(cè)的軟件也必須配合。聚合后的MIPI流通過(guò)VC區(qū)分?jǐn)z像頭但VC本身不攜帶時(shí)間戳信息。如果主控平臺(tái)支持CSI-2的frame start/end事件響應(yīng)軟件可以通過(guò)中斷來(lái)記錄每一幀到達(dá)的時(shí)間然后做后處理對(duì)齊。如果主控的ISP不支持多通道時(shí)間戳那軟件層就很難保證多路圖像的同步了。這時(shí)候可以在Crosslink-NX里插入幀ID信息比如在每幀的有效數(shù)據(jù)里嵌入一個(gè)遞增計(jì)數(shù)器軟件在接收端解析幀ID丟棄ID不連續(xù)的幀。這個(gè)方法雖然增加了一點(diǎn)帶寬開(kāi)銷但能讓同步問(wèn)題變成可檢測(cè)、可恢復(fù)的比盲目相信硬件同步可靠得多。6. 實(shí)測(cè)調(diào)試經(jīng)驗(yàn)鏈路建立、圖像質(zhì)量與故障排查6.1 從寄存器初始化到跑通視頻流的調(diào)試順序我調(diào)試GMSL2加Crosslink-NX這套系統(tǒng)的時(shí)候習(xí)慣按照固定的順序走這個(gè)順序幫我省掉了大量無(wú)效排查時(shí)間。第一步是確認(rèn)GMSL2鏈路物理層已經(jīng)建立。上電后先讀解串器的lock狀態(tài)寄存器如果link沒(méi)有l(wèi)ock后面的MIPI信號(hào)根本無(wú)從談起。常見(jiàn)的lock失敗原因包括線纜接觸不良、PoC供電異常、遠(yuǎn)端串行器沒(méi)有正常上電。先排除物理層不要急著調(diào)寄存器。第二步是讓解串器的MIPI輸出恢復(fù)。lock之后解串器會(huì)根據(jù)輸入視頻流的時(shí)序在輸出端恢復(fù)MIPI信號(hào)。這時(shí)候可以用示波器探一下MIPI的時(shí)鐘通道看有沒(méi)有周期性的HS時(shí)鐘。如果時(shí)鐘出來(lái)了但數(shù)據(jù)口沒(méi)有信號(hào)多半是解串器的lane映射配置和Crosslink-NX的RX端口不匹配。第三步是配置Crosslink-NX的MIPI RX IP。跑通的第一步不是直接做聚合而是把每一路RX先單獨(dú)接出來(lái)用最原始的frame counter邏輯驗(yàn)證每一路都能正確收到行場(chǎng)信號(hào)。每路單獨(dú)驗(yàn)證通過(guò)后再打開(kāi)聚合邏輯。一次只增加一個(gè)變量出了問(wèn)題就能立刻定位。6.2 常見(jiàn)圖像異常與根因分析結(jié)合自己做過(guò)的幾個(gè)項(xiàng)目我把最常見(jiàn)的圖像異常整理成一張表調(diào)試的時(shí)候可以直接對(duì)照現(xiàn)象可能原因排查方向圖像全是噪點(diǎn)/雪花GMSL2鏈路誤碼率高眼圖質(zhì)量差PoC電源紋波、線纜屏蔽、連接器位置畫(huà)面有橫向條紋MIPI lane數(shù)據(jù)錯(cuò)位檢查lane映射、極性是否配置正確圖像花屏但幀率正常Raw data格式解析錯(cuò)誤檢查MIPI RX像素格式和解串器輸出格式是否一致圖像偶發(fā)丟行/黑線FIFO溢出或跨時(shí)鐘域亞穩(wěn)態(tài)增大FIFO深度檢查行消隱處理邏輯幀率只有標(biāo)稱值一半MIPI lane數(shù)量配置不足確認(rèn)輸入輸出lane數(shù)、工作時(shí)鐘頻率多個(gè)攝像頭畫(huà)面相互串?dāng)_VC配置沖突或聚合邏輯混亂檢查VC號(hào)分配、sideband信號(hào)處理表格里的每一條我都實(shí)際遇到過(guò)。特別是串?dāng)_這一條看上去像是硬件問(wèn)題其實(shí)常常是FPGA內(nèi)部對(duì)不同通道的sideband信號(hào)處理不一致導(dǎo)致的。MIPI RX IP輸出的行有效信號(hào)是脈沖式的如果邏輯里用了同一個(gè)行計(jì)數(shù)器去控制多路數(shù)據(jù)寫(xiě)入只要有一路的行時(shí)序提前一點(diǎn)后續(xù)數(shù)據(jù)就會(huì)錯(cuò)位表現(xiàn)為某個(gè)通道的圖像里混入了另一個(gè)通道的內(nèi)容。6.3 眼圖測(cè)試和信號(hào)完整性驗(yàn)證GMSL2鏈路不像并行總線可以逐根信號(hào)線去量。調(diào)試高速串行鏈路最有效的驗(yàn)證手段是同軸傳輸線上的眼圖測(cè)試。用眼圖可以直接看到信號(hào)余量是否足夠判斷鏈路上的噪聲、反射和PoC網(wǎng)絡(luò)的影響。眼圖測(cè)試的步驟不復(fù)雜在解串器輸入端預(yù)留一個(gè)測(cè)試點(diǎn)用有足夠帶寬的示波器接上探頭設(shè)置在交流耦合模式觸發(fā)方式選為恢復(fù)時(shí)鐘就能看到眼圖。最理想的情況是眼圖睜得越開(kāi)越好裕量至少要有20%以上否則溫度和老化變化后很容易出現(xiàn)誤碼。還要關(guān)注PoC網(wǎng)絡(luò)的諧振影響。同軸線上的電源注入點(diǎn)如果不匹配會(huì)導(dǎo)致在特定頻點(diǎn)上反射加劇眼圖上會(huì)看到一個(gè)明顯的閉合痕跡。處理辦法是調(diào)整PoC電感的感值或者增加阻尼電阻抑制諧振峰。這部分調(diào)試沒(méi)有捷徑只能靠掃頻的方式找到問(wèn)題頻點(diǎn)再針對(duì)性地調(diào)整器件參數(shù)。7. 帶寬評(píng)估和幀率規(guī)劃一套可以照著算的公式做多攝像頭方案前期評(píng)估階段最常被問(wèn)的問(wèn)題就是這個(gè)方案能跑多少路攝像頭、多少分辨率、多少幀率。這個(gè)問(wèn)題不能憑感覺(jué)回答我習(xí)慣用一套固定公式來(lái)算。第一步估算每路攝像頭的數(shù)據(jù)率像素總數(shù) × 位深 × 幀率。比如400萬(wàn)像素的RAW10傳感器跑30fps數(shù)據(jù)率為 400萬(wàn) × 10bit × 30 1.2Gbps。第二步加MIPI開(kāi)銷MIPI CSI-2協(xié)議每4KB數(shù)據(jù)大約有13%的包頭包尾開(kāi)銷實(shí)際每路數(shù)據(jù)率乘以1.15。第三步看GMSL2鏈路帶寬上限3Gbps可以判斷這個(gè)傳感器能輕松跑滿幀率甚至可以跑60fps。第四步看Crosslink-NX的輸出帶寬以4 lane、每lane 1.5Gbps計(jì)算總輸出帶寬是6Gbps。還是以4路400萬(wàn)像素RAW10為例4路總數(shù)據(jù)率為4.8Gbps含開(kāi)銷6Gbps的輸出帶寬是夠用的。但如果換成800萬(wàn)像素傳感器單路裸數(shù)據(jù)率就到了2.4Gbps加開(kāi)銷后約2.76GbpsGMSL2鏈路已經(jīng)接近極限4路總和約為11Gbps遠(yuǎn)超Crosslink-NX的MIPI輸出帶寬。這種情況下就不能做單純聚合了要塞進(jìn)6Gbps帶寬只能降低傳感器幀率、裁剪ROI、或者改用RAW8輸入讓數(shù)據(jù)率減半。還有一個(gè)常見(jiàn)誤區(qū)只看總帶寬夠不夠沒(méi)有計(jì)算MIPI輸出接口的瞬時(shí)帶寬。MIPI輸出是高速差分信號(hào)即使在消隱期間也會(huì)發(fā)送LP狀態(tài)實(shí)際有效數(shù)據(jù)率比額定值要低。如果你的設(shè)計(jì)是讓4路1080p60的數(shù)據(jù)全部經(jīng)過(guò)一個(gè)4 lane MIPI輸出瞬時(shí)帶寬在每行起始時(shí)會(huì)有明顯的尖峰FIFO深度稍有不足就會(huì)丟數(shù)據(jù)。所以帶寬規(guī)劃的時(shí)候除了算平均速率一定要考慮突發(fā)特性把FIFO資源和輸出時(shí)序安排好。8. Crosslink-NX的資源利用與低功耗特性選Crosslink-NX的原因除了MIPI接口資源豐富還在于它的功耗控制。做過(guò)多路視覺(jué)的人都清楚一顆功耗動(dòng)輒幾瓦的FPGA放在車載系統(tǒng)里散熱和電源設(shè)計(jì)都會(huì)非常痛苦。Crosslink-NX的標(biāo)稱功耗在低功耗FPGA里是比較出色的我實(shí)測(cè)下來(lái)做4路1080p RAW10的采集聚合整顆FPGA的功耗在毫瓦到瓦級(jí)別的區(qū)間里具體數(shù)值取決于邏輯利用率和翻轉(zhuǎn)率。Crosslink-NX的架構(gòu)里有一個(gè)特點(diǎn)值得關(guān)注它自帶片上閃存配置上電啟動(dòng)不需要外掛SPI Flash對(duì)系統(tǒng)BOM成本和啟動(dòng)可靠性都有好處。它支持多引導(dǎo)鏡像可以在運(yùn)行中切換配置對(duì)于需要在線升級(jí)固件的設(shè)備來(lái)說(shuō)非常方便。資源利用方面MIPI D-PHY的硬核IP不消耗可編程邏輯資源這是Crosslink-NX的優(yōu)勢(shì)。真正消耗邏輯的是數(shù)據(jù)通路處理包括行緩沖、格式轉(zhuǎn)換、跨時(shí)鐘域邏輯和聚合狀態(tài)機(jī)。一個(gè)4路1080p的方案大約會(huì)用到幾萬(wàn)個(gè)查找表和寄存器具體數(shù)量取決于你做的處理復(fù)雜度。如果只是單純做數(shù)據(jù)聚合和VC轉(zhuǎn)發(fā)資源冗余還很大可以留一部分給后續(xù)的圖像預(yù)處理功能比如壞點(diǎn)校正、黑電平校準(zhǔn)或者簡(jiǎn)單的色彩空間轉(zhuǎn)換。我自己習(xí)慣把Crosslink-NX定位為圖像鏈路管家而不是圖像處理引擎。它擅長(zhǎng)的是把所有攝像頭數(shù)據(jù)有效地接入、整理、轉(zhuǎn)發(fā)把后端主SoC從繁重的接口適配里解放出來(lái)。如果想在FPGA里做復(fù)雜的ISP算法Crosslink-NX的資源規(guī)模不一定夠那不如選更大型的FPGA。選型的時(shí)候先想清楚分工再挑芯片這個(gè)順序不能反。9. 部署中的環(huán)境適應(yīng)性與可靠性設(shè)計(jì)車載和工業(yè)環(huán)境里GMSL2方案的可靠性往往比功能更重要。高溫、振動(dòng)、電磁干擾、線纜彎折任何一個(gè)因素都可能讓原本跑得好好的鏈路突然掉鏈子。硬件設(shè)計(jì)上要特別關(guān)注解串器和Crosslink-NX的供電質(zhì)量。GMSL2解串器對(duì)電源紋波比較敏感建議電源走單獨(dú)的LDO避免和其他數(shù)字器件共用一個(gè)開(kāi)關(guān)電源尤其是PoC饋電那一路輸出紋波盡量壓在20mV以內(nèi)。連接器和座子的選型同樣重要GMSL2的實(shí)際載流量和機(jī)械可靠性完全取決于選擇什么樣的FAKRA或者HSD連接器。車規(guī)級(jí)的FAKRA連接器價(jià)格不便宜但和現(xiàn)場(chǎng)掉線帶來(lái)的返工成本比這點(diǎn)錢花得值。線纜方面優(yōu)先選用屏蔽層覆蓋率高的同軸線別為了省成本用普通的視頻線高速信號(hào)的衰減特性差異非常大。軟件層面除了默認(rèn)的鏈路檢測(cè)機(jī)制建議在系統(tǒng)里加一個(gè)鏈路巡檢任務(wù)定時(shí)讀取解串器的lock狀態(tài)和誤碼計(jì)數(shù)。GMSL2的誤碼計(jì)數(shù)器是一個(gè)非常有價(jià)值的診斷信息正常情況下長(zhǎng)期運(yùn)行誤碼率應(yīng)該為0如果誤碼率緩慢增長(zhǎng)說(shuō)明鏈路余量正在下降大概率是連接器氧化或者線纜疲勞提早預(yù)警比故障發(fā)生后再排查省心得多。這里還有一點(diǎn)要特別提醒GMSL2鏈路在某些車規(guī)平臺(tái)的EMI測(cè)試中容易暴露問(wèn)題尤其是線纜長(zhǎng)度較長(zhǎng)的時(shí)候。常見(jiàn)對(duì)策包括在同軸線靠近連接器的地方加磁環(huán)、優(yōu)化PoC電源網(wǎng)絡(luò)的環(huán)路面積、以及調(diào)整FPGA輸出端的壓擺率控制寄存器。這些方案都不復(fù)雜但在設(shè)計(jì)階段留好位置比測(cè)試階段再改結(jié)構(gòu)舒服太多。