使用 MATLAB HDL Coder 和 FPGA 快速實(shí)現(xiàn)自動(dòng)白平衡(AWB)
在此項(xiàng)目中,我們將使用 MATLAB Simulink 和 HDL 編碼器創(chuàng)建自定義 IP -- AWB。
MATLAB 設(shè)計(jì)
自動(dòng)白平衡模塊的設(shè)計(jì)是使用 HDL Coder 在 MATLAB 和 Simulink 中創(chuàng)建的。HDL Coder能夠生成 HDL 文件,這些文件可以作為 IP 在我們的目標(biāo) FPGA 中運(yùn)行。
AWB IP 設(shè)計(jì)旨在對(duì)每個(gè)時(shí)鐘 2 個(gè)像素求和,這些像素是從 Vivado 設(shè)計(jì)中的demosaic 輸出的 RGB 像素。
該算法非常簡(jiǎn)單,對(duì)每個(gè)幀的 RGB 通道進(jìn)行求和并提供給微處理器。在微處理器中,像素的總和被劃分創(chuàng)建校正白平衡所需的校正因子。
除法是在 MicroBlaze 中完成的,雖然必須快速收集每幀的統(tǒng)計(jì)數(shù)據(jù),但除法不必那么快,因此為了節(jié)省邏輯資源,利用 Microblaze即可完成。
整體設(shè)計(jì)如下
像素求和旨在捕獲將傳入的 AXI 流像素?cái)?shù)據(jù)分割為三個(gè)元素 R、G、B,然后在求和之前對(duì)這些像素中的每一個(gè)進(jìn)行緩沖。求和塊的輸出也被記錄。
求和塊本身非常簡(jiǎn)單。獲取輸入、有效和復(fù)位信號(hào)。復(fù)位信號(hào)連接到來自 AXI Stream 接口的 SOF 信號(hào)。而 AXI Valid 信號(hào)使能寄存器和累加。
為了在每一幀結(jié)束時(shí)向微處理器生成 IRQ,我們使用了以下結(jié)構(gòu)
一旦 MicroBlaze 定義了系數(shù)數(shù)據(jù),需要將其應(yīng)用于后面幀像素。
然后將它們連接起來,為 AXI-stream提供最終的像素?cái)?shù)據(jù)。
當(dāng)然,也需要針對(duì) AWB 算法中插入延遲進(jìn)行平衡
完整的模塊設(shè)計(jì)如下:
MATLAB 測(cè)試
為了測(cè)試這個(gè)設(shè)計(jì),我們將在 MATLAB 中創(chuàng)建了一個(gè)測(cè)試平臺(tái),它提取圖像文件來提供算法
自定義 MATLAB 模塊用于輸入和接收?qǐng)D像,設(shè)置的 M 代碼如下所示:
closeall [im,im_map]=imread("awb_test_img.jpg"); im_rgb=ind2rgb(im,im_map); im_rgb=uint8(im_rgb*2^8); imshow(im_rgb); vsize=size(im_rgb,1); hsize=size(im_rgb,2); div_val=16; fori=13 means(i)=mean(mean(im_rgb(:,:,i)/div_val)); end max_mean=max(means); im_corr=im_rgb; fori=13 corr(i)=max_mean/means(i); im_corr(:,:,i)=im_rgb(:,:,i)*corr(i); end figure() imshow(im_corr)
要運(yùn)行模擬,我們首先需要做一些事情
模擬輸入
浮點(diǎn)結(jié)果
定點(diǎn)結(jié)果
為了生成定點(diǎn) HDL 解決方案,我們需要設(shè)置 HDL Coder生成器
Vivado 驗(yàn)證
導(dǎo)出IP核后,我們可以將其導(dǎo)入Vivado IP庫并將其添加到演示項(xiàng)目中。
為了簡(jiǎn)化寄存器接口,我們使用 AXI GPIO 提供所需的系數(shù)。
可以看到 AWB 提供 AXI Stream 輸入和輸出。
插入 AWB 后,接下來將在 Vitis 中的設(shè)計(jì)。
Vitis設(shè)計(jì)
算法非常簡(jiǎn)單
Status=XGpio_Initialize(&Gpio5,XPAR_AWB_AXI_GPIO_5_DEVICE_ID); Status=XGpio_Initialize(&Gpio6,XPAR_AWB_AXI_GPIO_6_DEVICE_ID); Status=XGpio_Initialize(&Gpio7,XPAR_AWB_AXI_GPIO_7_DEVICE_ID); exp_scale=0.8; while(1){ r=XGpio_DiscreteRead(&Gpio5,1); g=XGpio_DiscreteRead(&Gpio5,2); b=XGpio_DiscreteRead(&Gpio6,1); if(r>=g&&r>=b){ r_corr=1.0*32768*exp_scale; g_corr=((float)r/(float)g)*32768*exp_scale; b_corr=((float)r/(float)b)*32768*exp_scale; } elseif(g>=r&&g>=b){ r_corr=((float)g/(float)r)*32768*exp_scale; g_corr=1.0*32768*exp_scale; b_corr=((float)g/(float)b)*32768*exp_scale; } elseif(b>=r&&b>=g){ r_corr=((float)b/(float)r)*32768*exp_scale; g_corr=((float)b/(float)g)*32768*exp_scale; b_corr=1.0*32768*exp_scale; } XGpio_DiscreteWrite(&Gpio6,2,(int)r_corr); XGpio_DiscreteWrite(&Gpio7,1,(int)g_corr); XGpio_DiscreteWrite(&Gpio7,2,(int)b_corr);
總結(jié)
MATLAB HDL Coder 和 FPGA聯(lián)合開發(fā),可以快速進(jìn)行算法設(shè)計(jì)。
-
FPGA
+關(guān)注
關(guān)注
1642文章
21920瀏覽量
612004 -
matlab
+關(guān)注
關(guān)注
187文章
2990瀏覽量
232813 -
編碼器
+關(guān)注
關(guān)注
45文章
3751瀏覽量
136603 -
Simulink
+關(guān)注
關(guān)注
22文章
538瀏覽量
63440
原文標(biāo)題:使用 MATLAB HDL Coder 和 FPGA 快速實(shí)現(xiàn)自動(dòng)白平衡(AWB)
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
PYNQ設(shè)計(jì)案例:基于HDL語言+Vivado的自定義IP核創(chuàng)建

使用USRP E310和MATLAB和Simulink進(jìn)行原型設(shè)計(jì)和測(cè)試軟件定義的無線電
matlab自定義函數(shù)調(diào)用的方法
SIMULINK線的處理/SIMULINK自定義功能模塊
在NI Multisim中創(chuàng)建自定義元器件
利用SDSoC創(chuàng)建自定義硬件
自定義sobel濾波IP核,IP接口遵守AXI Stream協(xié)議
Vivado設(shè)計(jì)套件用戶指南:創(chuàng)建和打包自定義IP

Vivado Design Suite用戶指南:創(chuàng)建和打包自定義IP

如何在Matlab中自定義Message

創(chuàng)建自定義的基于閃存的引導(dǎo)加載程序(BSL)

評(píng)論