Nexys Video多媒體音視頻開發板
音視頻處理, 帶你從入門到放肆
嵌入式視覺是當今科技最激動人心的領域之一。
關於使用Zynq SoC的嵌入式視覺應用, 熱心群眾們說的太多, 我就不贅述了。 今天我們換一個新的視角, 來看看如何使用純FPGA來實現嵌入式視覺方案。
這篇文章, 將帶你瞭解如何使用Digilent Nexys Video Artix-7 FPGA多媒體音視頻開發板來實現一個簡單的HDMI輸入/輸出視頻處理系統。 特別是如果你是一名新手, 通過本文, 你會對基於FPGA的視頻處理有更多基本的理解。
上篇(←點擊瞭解), 我們對如何用Nexys Video來實現一個簡單的HDMI輸入/輸出視頻處理系統做了扼要的概述。
在Nexys Video Artix-7 FPGA開髮卡上啟動並運行MicroBlaze軟核處理器系統後, 我們需要使用一些軟體來生成視頻輸出信號。 在這個示例中, 我們將使用MicroBlaze處理器生成測試模式。 為了實現這個設計, 我們將向Nexys Video板卡的DDR SDRAM中寫入資料, 然後VDMA讀出這些資料並且通過HDMI輸出。
軟體部分我們首選要做的是定義視頻幀, 它將會被存儲到記憶體並通過VDMA輸出。 我們將在記憶體中定義三個視頻幀。 每個視頻幀的定義採用二維陣列:
u8 frameBuf[DISPLAY_NUM_FRAMES][DEMO_MAX_FRAME];
將參數DISPLAY_NUM_FRAME設置為3, DEMO_MAX_FRAME設置為1920 * 1080 * 3。 這裡需要考慮到最大幀解析度, 最後乘以3適用到每個圖元(紅, 黃, 藍圖元都採用8位元來表示)。
為了能夠訪問這些幀, 我們使用陣列指標指向每個幀緩存空間。
定義好視頻幀後, 下一步就是初始化和配置這個設計的流水線。 具體如下:
VDMA – 使用DMA將資料從板上的DDR SDRAM搬運到視頻輸出鏈路中。
動態時鐘IP – 輸出圖元時鐘頻率以及這個頻率的倍數用於HDMI輸出。
視頻時序控制器0 – 根據解析度定義輸出顯示時序。
視頻時序控制器 1 – 在輸出接收端決定視頻時序。 在這個示例中, 這個控制器從一個源獲取輸入視頻幀。
為了確保VDMA功能的正常, 我們需要定義步幅, 即DDR記憶體中每行之間的間隔。 對於本項目, 步幅設置為3 * 1920, 這是每行的最大長度。
在這一項目中, 我們能設置不同的顯示解析度, 從640x480 到 1920x1080。
無論我們選擇什麼樣的解析度, 我們都能夠使用測試模式在螢幕上借助軟體功能向DDR SDRAM寫入資料。
下一步則是生成視頻輸出。 在這個示例中主應用程式有很多功能可以生成、採集和顯示視頻。 具體如下:
Bar測試模式 – 在螢幕上生成多個顏色條
混合測試模式 – 在螢幕上生成混合顏色測試條
流模式, 從HDMI輸入到HDMI輸出
抓取一個輸入幀將顏色反轉
抓取一個輸入幀並按比例擴展到當前的顯示解析度
按照下方的代碼就可以輕鬆的實現設置紅、藍、綠圖元的值。 每個圖元的顏色值都是無符號8位元整數。
frame[iPixelAddr] = wRed;
frame[iPixelAddr + 1] = wBlue;
frame[iPixelAddr + 2] = wGreen;
當運行應用時, 通過UART終端視窗我們可以看到輸出的選項功能表, 通過選擇我們可以執行不同的功能來進行測試:
設置程式輸出顏色條, 混合測試模式輸出的效果如下圖所示:
通過本文, 相信大家現在已經知道如何向DDR記憶體中寫入資訊並將它顯示到螢幕上了。 如果你喜歡此文, 記得分享給你身邊對“基於純FPGA的視頻處理”有同好的小夥伴哦~~
專案實現全過程, 可點擊「閱讀原文」收藏。