使用 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)連接到來(lái)自 AXI Stream 接口的 SOF 信號(hào)。而 AXI Valid 信號(hào)使能寄存器和累加。
為了在每一幀結(jié)束時(shí)向微處理器生成 IRQ,我們使用了以下結(jié)構(gòu)
一旦 MicroBlaze 定義了系數(shù)數(shù)據(jù),需要將其應(yīng)用于后面幀像素。
然后將它們連接起來(lái),為 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),它提取圖像文件來(lá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庫(kù)并將其添加到演示項(xiàng)目中。
為了簡(jiǎn)化寄存器接口,我們使用 AXI GPIO 提供所需的系數(shù)。
可以看到 AWB 提供 AXI Stream 輸入和輸出。
插入 AWB 后,接下來(lái)將在 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)合開(kāi)發(fā),可以快速進(jìn)行算法設(shè)計(jì)。
-
FPGA
+關(guān)注
關(guān)注
1626文章
21671瀏覽量
601889 -
matlab
+關(guān)注
關(guān)注
182文章
2963瀏覽量
230170 -
編碼器
+關(guān)注
關(guān)注
45文章
3597瀏覽量
134171 -
Simulink
+關(guān)注
關(guān)注
22文章
522瀏覽量
62307
原文標(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)推薦
評(píng)論