基于 FPGA 的低成本、低延時成像系統(tǒng)
掃描二維碼
隨時隨地手機看文章
基于 FPGA 的低成本、低延時成像系統(tǒng)
副標題:優(yōu)秀的IC/FPGA開源項目(三)-低成本、低延時成像系統(tǒng)
《優(yōu)秀的IC/FPGA開源項目》是新開的系列,旨在介紹單一項目,會比《優(yōu)秀的 Verilog/FPGA開源項目》內(nèi)容介紹更加詳細,包括但不限于綜合、上板測試等。兩者相輔相成,互補互充~
目前商用領(lǐng)域的成像系統(tǒng)還是以嵌入式ASIC為主(成品時間快,性價比高),對于一些軍工、醫(yī)學等特殊領(lǐng)域還是以FPGA為主,在特殊領(lǐng)域里延遲是最先考慮的問題(成本不是主要問題),所以今天介紹一下使用FPGA實現(xiàn)低延遲的成像系統(tǒng),這里說明一下,整個系統(tǒng)調(diào)試比較麻煩(和sensor有關(guān)),很大可能調(diào)試不出圖像,所以大家只需要知道有這個架構(gòu)即可,有需求可以自己調(diào)試。
低延遲架構(gòu)
我們這次使用的是AMD-Xilinx FPGA,大部分的圖像處理都有IP可以使用,在官方文檔中有相關(guān)的架構(gòu),具體如下:
上面的架構(gòu)是比較通用的架構(gòu),官方也有例程可以參考,但是上面架構(gòu)多了一個VDMA,這就導致視頻傳輸?shù)臅r候有1到幾幀的延遲,這對于低延遲、高分辨率的情形肯定是不能容忍的。所以官方對于特殊情況建議使用下面的架構(gòu):
去掉了VDMA,但是對于時鐘系統(tǒng)要去更高,對于視頻輸入輸出在不同時鐘域情況下是使用不了的,所以整體要求比較高。但是砍掉了VDMA和DDR,所以整體成本會低很多。關(guān)于沒有VDMA情況下的各個IP的設(shè)置及測試可以看下面的文章《不使用VDMA情況下使用AXI4總線實現(xiàn)視頻輸入輸出(低延遲首選)》。
FPGA系統(tǒng)架構(gòu)設(shè)計
我們還是參考上面的架構(gòu)來設(shè)計我們的系統(tǒng)。
當我們與圖像sensor對接時,我們通常會以不同的格式接收圖像,例如 MIPI 、并行接口,在我們接收視頻之前,我們需要先配置sensor按照我們的需求運行。通常,sensor需要通過 I2C 或 SPI 進行配置。
這次演示的平臺:
- 7系列FPGA
- MT9M114 sensor
sensor 的接口非常簡單,可以分為視頻接口和配置接口(IIC)。
-
視頻接口由 10 位數(shù)據(jù)(分為 8 位和 2 位)、幀和行有效、像素時鐘和參考時鐘 (24 MHz) 組成。
-
配置接口由連接到sensor的 I2C 和 復位IO組成。
該解決方案的架構(gòu)如下:軟核處理器(MicroBlaze)通過 I2C 配置sensor。雖然圖像處理路徑將在 FPGA 中實現(xiàn),但由于這是一種低成本應用,該解決方案不會使用 DDR 存儲器中實現(xiàn)外部幀緩沖區(qū),而是圖像處理流水線將完全在 FPGA 中實現(xiàn)。
Sensor中由于我們配置的是RAW數(shù)據(jù),所以還需要使用Sensor Demosaic和Gamma(基本成像IP)IP。
該設(shè)計還將使用軟核處理器來控制視頻時序和圖像處理路徑的其他相關(guān)配置任務(wù)。
Vivado 工程構(gòu)建
搭建MicroBlaze 系統(tǒng)
這一部分比較簡單,可以看看之前的文章《【Vivado那些事兒】MicroBlaze最小系統(tǒng)搭建及程序固化》
添加其他IP
整個系統(tǒng)需要的IP主要如下:
- CAM 接口 - 此接口與 sensor接口連接,簡單處理數(shù)據(jù)(選擇RAW數(shù)據(jù)的位數(shù)),此IP非必須
- Video to AXIS - 這會將并行視頻轉(zhuǎn)換為 AXI 流格式
- Sensor Demosaic - 將代表 R、G 或 B 的 RAW 像素值轉(zhuǎn)換為 24 位 RGB 格式
- Video Timing Generator - 生成輸出格式的視頻時序信號
- AXI Stream to Video Out - 將 AXI Stream 轉(zhuǎn)換為并行視頻
- AXI IIC - 連接到 MicroBlaze,用于配置sensor
- AXI UART - 連接到 MicroBlaze,用于軟件調(diào)試
添加完后就可以連線了,完整的框圖應如下所示。完整的工程在文章最后給出。
在 AXI Stream 中,使用 TUser 指示幀的開始,使用 TLast 指示行的結(jié)束。
IP的關(guān)鍵設(shè)置
Video to AXIS
Sensor Demosaic
AXI IIC 設(shè)置
其他IP可以查看文章最后的工程查看。
資源使用率
在Arty S7-50 的總利用率如下所示。
SDK 中編寫軟件
生成 Vivado 硬件后,下一步就是編寫應用軟件,用于配置sensor和視頻處理IP核。
因此,軟件中將執(zhí)行以下操作:
- 初始化 AXI IIC、VTC 和中斷控制器
- 設(shè)置AXI 相關(guān)中斷控制器 - 這包括三個中斷服務(wù)例程。IIC 發(fā)送、接收和狀態(tài)各一個。
- 在 VTC 配置輸出時序
- 通過 I2C 復位sensor并點亮 sensor板子上 LED
- 通過I2C讀取sensor-MT9M114的ID,來檢測相機是否存在(外圍設(shè)置是否正確)
- 通過 I2C 配置和初始化相機 - 這是最浪費時間的,好在有很多資料可以參考
初始化相機后,我們將能夠在 ILA 上看到視頻流。
調(diào)試過程中測量的FPGA和sensor之間的 I2C 通信信號。
使用 AXI UART 調(diào)試軟件:
一旦相機初始化,我們可以使用 ILA 采集信號:
上圖顯示了 1280 像素的線寬。
AXI Stream 是一種單向總線,用于將數(shù)據(jù)從主機傳輸?shù)綇臋C,作為數(shù)據(jù)流,它不包含地址通道。為了通過 AXI 流控制流和傳遞視頻時序信息,我們使用了以下信號:
- TReady - 當準備好接收數(shù)據(jù)時由下游外設(shè)斷言
- TValid - 當輸出數(shù)據(jù)有效時通過發(fā)送外設(shè)斷言
- TUser - 為幀的開始發(fā)出
- TLast - 為行尾標志
由于我們沒有 使用VDMA,所以 AXIS 流上的視頻輸出是一個連續(xù)塊,并且 TValid 在活動像素周期內(nèi)不會斷言和取消斷言。
我們可以通過使用圖像處理鏈的像素時鐘來確保 Tvalid 是連續(xù)的。
軟件部分還是參考最后的工程吧,除了sensor需要單獨編寫,其他都是由SDK自帶的例程修改而來。