目錄
- 1、前言
- 工程概述
- 免責聲明
- 2、CameraLink協議理論學習
- 3、相關方案推薦
- 我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目
- FPGA實現CameraLink視頻編解碼方案
- 本博已有的 SDI 編解碼方案
- 4、工程詳細設計方案
- 工程設計原理框圖
- 輸入CameraLink相機
- LVDS視頻解碼模塊
- LVDS視頻對齊
- Video In To AXI4-Stream
- VDMA視頻緩存
- RGB轉BT1120
- SMPTE SD/HD/3G SDI IP核
- GTX 串化
- LMH1218RTWR 驅動器
- SDI轉HDMI盒子
- 工程源碼架構
- 5、Vivado工程詳解1詳解:Kintex7-325T版本
- 6、Vivado工程詳解2詳解:Zynq7045版本
- 7、工程移植說明
- vivado版本不一致處理
- FPGA型號不一致處理
- 其他注意事項
- 8、上板調試驗證
- 準備工作
- FPGA解碼CameraLink視頻轉SDI輸出效果演示
- 9、工程代碼獲取
FPGA實現CameraLink視頻解碼轉SDI輸出,基于LVDS+GTX架構,提供2套工程源碼和技術支持
1、前言
FPGA實現CameraLink視頻解碼現狀:
FPGA實現CameraLink視頻解碼目前有兩種方案:
一是使用專用編芯片解碼,比如典型的DS90CR287,優點是簡單快捷,缺點是需要額外的芯片,導致PCB布線難度加大,系統成本上升;另一種方案是使用FPGA邏輯資源實現編解碼,其中7系列FPGA使用ISERDES2原語實現解串,UltraScale系列FPGA使用ISERDES3原語實現解串,優點是充分利用了FPGA資源,系統設計簡單,成本更低,缺點是實現難度大,對FPGA工程師水平要求較高;本設計使用7系列FPGA的ISERDES2原語實現CameraLink視頻解碼;
FPGA實現SDI視頻解碼現狀:
目前FPGA實現SDI視頻編解碼有兩種方案:一是使用專用編解碼芯片,比如典型的接收器GS2971,發送器GS2972,優點是簡單,比如GS2971接收器直接將SDI解碼為并行的YCrCb422,GS2972發送器直接將并行的YCrCb422編碼為SDI視頻,缺點是成本較高,可以百度一下GS2971和GS2972的價格;另一種方案是使用FPGA邏輯資源部實現SDI編解碼,利用Xilinx系列FPGA的GTP/GTX/GTH/GTY等資源實現解串,利用Xilinx系列FPGA的SMPTE UHD-SDI資源實現SDI編解碼,優點是合理利用了FPGA資源,GT高速接口資源不用白不用,缺點是操作難度大一些,對FPGA開發者的技術水平要求較高。有意思的是,這兩種方案在本博這里都有對應的解決方案,包括硬件的FPGA開發板、工程源碼等等。本設計使用Xilinx GTX高速接口資源;
工程概述
本文詳細描述了FPGA實現CameraLink視頻解碼的設計方案;輸入視頻為CameraLink相機,相機為Base模式;CameraLink相機LVDS視頻對首先送入純verilog代碼實現的LVDS接收解碼模塊實現LVDS視頻解碼,輸出并行視頻數據,LVDS接收解碼模塊需要用到Xilinx ISERDES2原語;然后解碼視頻送入純verilog代碼實現的LVDS視頻對齊模塊實現視頻時序恢復,根據CameraLink協議和相機數據手冊將并行視頻數據恢復為Native視頻時序,提取出行同步信號、長同步信號、數據有效信號和視頻像素數據;然后調用Xilinx官方的Video In To AXI4-Stream IP核將Native視頻流轉換為AXI4-Stream視頻流;然后調用Xilinx官方的VDMA IP核視頻圖像緩存,緩存方案為3幀緩存,緩存介質為DDR3顆粒;然后緩存視頻從DDR3中讀出,調用Xilinx官方的AXI4-Stream To Video Out IP核將AXI4-Stream視頻流轉換為Native視頻流;然后Native視頻流送入入純verilog代碼實現的RGB轉BT1120模塊實現視頻格式轉換;然后BT1120視頻進入Xilinx官方的SMPTE SD/HD/3G SDI IP核,進行SDI視頻編碼操作并輸出SDI視頻;然后并行的SDI視頻經過Xilinx官方的GTX高速資源,實現并行數據到高速串行的轉換,本博稱之為串化;然后差分高速信號再進入板載的LMH1218RTWR芯片實現差分轉單端和驅動增強的功能;最后SDI視頻通過FPGA開發板的BNC座子輸出,通過同軸線連接到SDI轉HDMI盒子連接到HDMI顯示器;整個工程需要用到MicroBlaze或Zynq軟核做相關IP配置和相關IC配置;針對市場主流需求,本博客提供2套工程源碼,具體如下:
現對上述2套工程源碼做如下解釋,方便讀者理解:
工程源碼1
開發板FPGA型號為Xilinx–>Kintex7–325T–xc7k325tffg676-2;輸入視頻為CameraLink工業相機,相機為Base模式,輸出分辨率為2448x2050@15Hz,輸出灰度圖,輸出為1-Tap模式,即一個像素時鐘輸出1個像素,像素時鐘頻率80M Hz;CameraLink相機LVDS視頻對首先送入純verilog代碼實現的LVDS接收解碼模塊實現LVDS視頻解碼,輸出并行視頻數據,LVDS接收解碼模塊需要用到Xilinx ISERDES2原語;然后解碼視頻送入純verilog代碼實現的LVDS視頻對齊模塊實現視頻時序恢復,根據CameraLink協議和相機數據手冊將并行視頻數據恢復為Native視頻時序,提取出行同步信號、長同步信號、數據有效信號和視頻像素數據;然后調用Xilinx官方的Video In To AXI4-Stream IP核將Native視頻流轉換為AXI4-Stream視頻流;然后調用Xilinx官方的VDMA IP核視頻圖像緩存,緩存方案為3幀緩存,緩存介質為DDR3顆粒;然后緩存視頻從DDR3中讀出,調用Xilinx官方的AXI4-Stream To Video Out IP核將AXI4-Stream視頻流轉換為Native視頻流;然后Native視頻流送入入純verilog代碼實現的RGB轉BT1120模塊實現視頻格式轉換;然后BT1120視頻進入Xilinx官方的SMPTE SD/HD/3G SDI IP核,進行SDI視頻編碼操作并輸出3G-SDI視頻,分辨率為1920x1080@60Hz;然后并行的SDI視頻經過Xilinx官方的GTX高速資源,實現并行數據到高速串行的轉換,本博稱之為串化;然后差分高速信號再進入板載的LMH1218RTWR芯片實現差分轉單端和驅動增強的功能;最后SDI視頻通過FPGA開發板的BNC座子輸出,通過同軸線連接到SDI轉HDMI盒子連接到HDMI顯示器;整個工程需要用到MicroBlaze軟核做相關IP配置和相關IC配置;由此形成FPGA+CameraLink+SDI的高端架構;該工程適用于CameraLink視頻轉換卡應用;
工程源碼2
開發板FPGA型號為Xilinx–>Zynq7045–xc7z045ffg900-2;輸入視頻為CameraLink工業相機,相機為Base模式,輸出分辨率為2448x2050@15Hz,輸出灰度圖,輸出為1-Tap模式,即一個像素時鐘輸出1個像素,像素時鐘頻率80M Hz;CameraLink相機LVDS視頻對首先送入純verilog代碼實現的LVDS接收解碼模塊實現LVDS視頻解碼,輸出并行視頻數據,LVDS接收解碼模塊需要用到Xilinx ISERDES2原語;然后解碼視頻送入純verilog代碼實現的LVDS視頻對齊模塊實現視頻時序恢復,根據CameraLink協議和相機數據手冊將并行視頻數據恢復為Native視頻時序,提取出行同步信號、長同步信號、數據有效信號和視頻像素數據;然后調用Xilinx官方的Video In To AXI4-Stream IP核將Native視頻流轉換為AXI4-Stream視頻流;然后調用Xilinx官方的VDMA IP核視頻圖像緩存,緩存方案為3幀緩存,緩存介質為DDR3顆粒;然后緩存視頻從DDR3中讀出,調用Xilinx官方的AXI4-Stream To Video Out IP核將AXI4-Stream視頻流轉換為Native視頻流;然后Native視頻流送入入純verilog代碼實現的RGB轉BT1120模塊實現視頻格式轉換;然后BT1120視頻進入Xilinx官方的SMPTE SD/HD/3G SDI IP核,進行SDI視頻編碼操作并輸出3G-SDI視頻,分辨率為1920x1080@60Hz;然后并行的SDI視頻經過Xilinx官方的GTX高速資源,實現并行數據到高速串行的轉換,本博稱之為串化;然后差分高速信號再進入板載的LMH1218RTWR芯片實現差分轉單端和驅動增強的功能;最后SDI視頻通過FPGA開發板的BNC座子輸出,通過同軸線連接到SDI轉HDMI盒子連接到HDMI顯示器;整個工程需要用到Zynq軟核做相關IP配置和相關IC配置;由此形成FPGA+CameraLink+SDI的高端架構;該工程適用于CameraLink視頻轉換卡應用;
本文詳細描述了FPGA解碼CameraLink視頻轉SDI輸出的設計方案,工程代碼可綜合編譯上板調試,可直接項目移植,適用于在校學生、研究生項目開發,也適用于在職工程師做項目開發,可應用于醫療、軍工等行業的高速接口領域;
提供完整的、跑通的工程源碼和技術支持;
工程源碼和技術支持的獲取方式放在了文章末尾,請耐心看到最后;
免責聲明
本工程及其源碼即有自己寫的一部分,也有網絡公開渠道獲取的一部分(包括CSDN、Xilinx官網、Altera官網等等),若大佬們覺得有所冒犯,請私信批評教育;基于此,本工程及其源碼僅限于讀者或粉絲個人學習和研究,禁止用于商業用途,若由于讀者或粉絲自身原因用于商業用途所導致的法律問題,與本博客及博主無關,請謹慎使用。。。
2、CameraLink協議理論學習
關于這部分,網上有很多博主解釋過,我找了幾篇推薦學習理論知識:
博客鏈接如下:
點擊直接前往
你也可以去網上通過其他途徑免費學習CameraLink協議,在學了CameraLink協議基礎上看本工程源碼能更快理解吸收;
3、相關方案推薦
我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目
其實一直有朋友反饋,說我的博客文章太多了,亂花漸欲迷人,自己看得一頭霧水,不方便快速定位找到自己想要的項目,所以本博文置頂,列出我目前已有的所有項目,并給出總目錄,每個項目的文章鏈接,當然,本博文實時更新。。。以下是博客地址:
點擊直接前往
FPGA實現CameraLink視頻編解碼方案
我的CameraLink視頻專欄有很多FPGA的CaeraLink視頻編解碼方案,既有CaeraLink接收,也有CaeraLink發送,既有CaeraLink普通輸出顯示,也有CaeraLink視頻拼接輸出等等,專欄鏈接如下:歡迎前往查看:
點擊直接前往
本博已有的 SDI 編解碼方案
我的博客主頁開設有SDI視頻專欄,里面全是FPGA編解碼SDI的工程源碼及博客介紹;既有基于GS2971/GS2972的SDI編解碼,也有基于GTP/GTX資源的SDI編解碼;既有HD-SDI、3G-SDI,也有6G-SDI、12G-SDI等;專欄地址鏈接如下:
點擊直接前往
4、工程詳細設計方案
工程設計原理框圖
工程設計原理框圖如下:
輸入CameraLink相機
輸入視頻為CameraLink工業相機,相機為Base模式,輸出分辨率為2448x2050@15Hz,輸出灰度圖,輸出為1-Tap模式,即一個像素時鐘輸出1個像素,像素時鐘頻率80M Hz;CameraLink相機如下:
LVDS視頻解碼模塊
本設計參考了Xilinx官方設計,基于ISERDES2原語實現的LVDS解碼模塊對輸入的CameraLink視頻進行解碼;LVDS視頻解碼模塊設計框圖如下:
LVDS視頻解碼模塊輸入為隨路差分時鐘對和LVDS差分數據對;利用Xilinx官方IDELAY和ISERDES原語實現串并轉換;模塊總體代碼架構如下:
IDELAY原語用于接收延時,保證接收端視頻的穩定性;ISERDES2原語用于串并轉換,將輸入串行差分數據轉換為并行數據;此外,LVDS解串視頻還需要做對齊處理,隨路時鐘也需要通過MMCM輸出同步處理;整個LVDS視頻解碼模塊嚴格按照設計框圖實現,解碼模塊頂層接口如下:
Block Design設計中,直接將LVDS視頻解碼模塊頂層拖入Block Design中形成自定義IP,方便調用和使用,如下:
雙擊LVDS視頻解碼模塊的自定義IP,可以看到配置參數如下:
這兩個參數可自由配置,以適應CameraLink相機的不同模式;具體配置如下:
LVDS視頻對齊
調用LVDS視頻對齊模塊,根據CameraLink視頻協議提取出行同步信號、場同步信號、數據有效信號和像素數據;模塊總體代碼架構如下:
模塊頂層接口如下:
Block Design設計中,直接將CameraLink視頻恢復模塊頂層拖入Block Design中形成自定義IP,方便調用和使用,如下:
Video In To AXI4-Stream
調用Xilinx官方的Video In To AXI4-Stream IP核將Bayer視頻轉換為 AXI4-Stream視頻流;Block Design中如下:
需要注意的是,Base模式下,相機1個像素時鐘輸出2個像素;
需要注意的是,Full模式下,相機1個像素時鐘輸出8個像素;
在IP配置時需要針對性配置,具體請參考工程;
VDMA視頻緩存
LVDS解碼后的視頻轉為Xilinx的AXI4-Sream的視頻流,經VDMA送入DDR3做4幀緩存,VDMA在Block Design中如下:
需要注意的是,輸入VDMA的視頻數據位寬只有8位,是Bayer格式圖像,在IP配置時需要針對性配置,具體請參考工程;此外,VDMA需要調用MicroBlaze或Zynq軟核運行SDK來配置;
RGB轉BT1120
在SDI輸出方式下需要使用該模塊;RGB轉BT1200模塊的作用是將用戶側的RGB視頻轉換為BT1200視頻輸出給SMPTE SD/HD/3G SDI IP核;RGB轉BT1120模塊由RGB888轉YUV444模塊、YUV444轉YUV422模塊、SDI視頻編碼模塊、數據嵌入模塊組成,該方案參考了Xilinx官方的設計;BT1120轉RGB模塊代碼架構如下:
RGB轉BT1120在Block Design中如下:
SMPTE SD/HD/3G SDI IP核
SMPTE SD/HD/3G SDI IP核是Xilinx系列FPGA特有的用于SDI視頻編解碼的IP,該IP配置使用非常簡單,vivado的UI界面如下:
SMPTE SD/HD/3G SDI IP核必須與GTX配合才能使用,對于SDI視頻接收而言,該IP接收來自于GTX的數據,然后將SDI視頻解碼為BT1120視頻輸出,對于SDI視頻發送而言,該IP接收來自于用戶側的的BT1120視頻數據,然后將BT1120視頻編碼為SDI視頻輸出;該方案參考了Xilinx官方的設計;SMPTE SD/HD/3G SDI IP核代碼架構如下:
GTX 串化
本設計使用Xilinx特有的GTX高速信號處理資源實現SDI差分視頻信號的解串與串化,對于SDI視頻接收而言,GTX起到解串的作用,即將輸入的高速串行的差分信號解為并行的數字信號;對于SDI視頻發送而言,GTX起到串化的作用,即將輸入的并行的數字信號串化為高速串行的差分信號;GTX的使用一般需要例化GTX IP核,通過vivado的UI界面進行配置,但本設計需要對SD-SDI、HD-SDI、3G-SDI視頻進行自動識別和自適應處理,所以需要使得GTX具有動態改變線速率的功能,該功能可通過DRP接口配置,也可通過GTX的rate接口配置,所以不能使用vivado的UI界面進行配置,而是直接例化GTX的GTXE2_CHANNEL和GTXE2_COMMON源語直接使用GTX資源;此外,為了動態配置GTX線速率,還需要GTX控制模塊,該模塊參考了Xilinx的官方設計方案,具有動態監測SDI模式,動態配置DRP等功能;該方案參考了Xilinx官方的設計;GTX 解串與串化模塊代碼架構如下:
LMH1218RTWR 驅動器
LMH1218RTWR芯片實現差分轉單端和增強驅動的功能,這里選用LMH1218RTWR是因為借鑒了了Xilinx官方的方案,當然也可以用其他型號器件。LMH1218RTWR驅動器原理圖如下:
SDI轉HDMI盒子
在SDI輸出方式下需要使用到SDI轉HDMI盒子,因為我手里的顯示器沒有SDI接口,只有HDMI接口,為了顯示SDI視頻,只能這么做,當然,如果你的顯示器有SDI接口,則可直接連接顯示,我的SDI轉HDMI盒子在某寶購買,不到100塊;
工程源碼架構
提供2套工程源碼,以工程源碼1為例,工程Block Design設計如下:
提供2套工程源碼,以工程源碼1為例,綜合后的工程源碼架構如下:
提供2套工程源碼,以工程源碼1為例,工程源碼需要運行MicroBlaze軟核,用于相關IP配置和相關IC配置;SDK工程架構如下:
需要注意的是,在SDK工程中,我們將所有子函數都放在了主函數里,并提供了詳細的中文注釋和使用方法注釋,用戶可根據注釋快速理解和使用;不懂的可以問我;如果你打開后注釋顯示亂碼,請將SDK字符設置為國標;
本博主發布的工程均已編譯完成,且時序收斂,無時序違約,如下:
5、Vivado工程詳解1詳解:Kintex7-325T版本
開發板FPGA型號:Xilinx–>Kintex7–325T–xc7k325tffg676-2;
FPGA開發環境:Vivado2019.1;
輸入:CameraLink相機,Base模式,分辨率2448x2050@15Hz,輸出灰度圖;
輸出:3G-SDI,RTL邏輯編碼,分辨率為1920x1080@60Hz;
CameraLink視頻解碼方案:Xilinx官方ISERDES2原語LVDS解碼方案;
LVDS差分對:4對差分數據+1對隨路差分時鐘;
圖像緩存方案:Xilinx官方VDMA+DDR3顆粒,3幀緩存;
SDI視頻解串方案:Xilinx–GTX高速接口解串;
SDI視頻解碼方案:Xilinx–SMPTE SD/HD/3G-SDI 解碼;
實現功能:FPGA解碼CameraLink視頻轉SDI輸出;
工程作用:此工程目的是讓讀者掌握FPGA解碼CameraLink視頻轉SDI輸出的設計能力,以便能夠移植和設計自己的項目;
工程Block Design和工程代碼架構請參考第4章節的《工程源碼架構》小節內容;
工程的資源消耗和功耗如下:
6、Vivado工程詳解2詳解:Zynq7045版本
開發板FPGA型號:Xilinx–>Zynq7045–xc7z045ffg900-2;
FPGA開發環境:Vivado2019.1;
輸入:CameraLink相機,Base模式,分辨率2448x2050@15Hz,輸出灰度圖;
輸出:3G-SDI,RTL邏輯編碼,分辨率為1920x1080@60Hz;
CameraLink視頻解碼方案:Xilinx官方ISERDES2原語LVDS解碼方案;
LVDS差分對:4對差分數據+1對隨路差分時鐘;
圖像緩存方案:Xilinx官方VDMA+DDR3顆粒,3幀緩存;
SDI視頻解串方案:Xilinx–GTX高速接口解串;
SDI視頻解碼方案:Xilinx–SMPTE SD/HD/3G-SDI 解碼;
實現功能:FPGA解碼CameraLink視頻轉SDI輸出;
工程作用:此工程目的是讓讀者掌握FPGA解碼CameraLink視頻轉SDI輸出的設計能力,以便能夠移植和設計自己的項目;
工程Block Design和工程代碼架構請參考第4章節的《工程源碼架構》小節內容;
工程的資源消耗和功耗如下:
7、工程移植說明
vivado版本不一致處理
1:如果你的vivado版本與本工程vivado版本一致,則直接打開工程;
2:如果你的vivado版本低于本工程vivado版本,則需要打開工程后,點擊文件–>另存為;但此方法并不保險,最保險的方法是將你的vivado版本升級到本工程vivado的版本或者更高版本;
3:如果你的vivado版本高于本工程vivado版本,解決如下:
打開工程后會發現IP都被鎖住了,如下:
此時需要升級IP,操作如下:
FPGA型號不一致處理
如果你的FPGA型號與我的不一致,則需要更改FPGA型號,操作如下:
更改FPGA型號后還需要升級IP,升級IP的方法前面已經講述了;
其他注意事項
1:由于每個板子的DDR不一定完全一樣,所以MIG IP需要根據你自己的原理圖進行配置,甚至可以直接刪掉我這里原工程的MIG并重新添加IP,重新配置;
2:根據你自己的原理圖修改引腳約束,在xdc文件中修改即可;
3:純FPGA移植到Zynq需要在工程中添加zynq軟核;
8、上板調試驗證
準備工作
需要準備的器材如下:
CameraLink相機,可以找本博主提供;
CameraLink轉接板,可以找本博主提供;
SDI轉接板,可以找本博主提供;
FPGA開發板,沒有開發板可以找本博主提供;
SDI轉HDMI盒子;
HDMI顯示器和HDMI線纜,這個很常見,自備即可;
FPGA解碼CameraLink視頻轉SDI輸出效果演示
FPGA解碼CameraLink視頻轉SDI輸出效果演示如下:
FPGA實現CameraLink轉SDI,工程源碼分享
9、工程代碼獲取
工程代碼如下: