使用 MATLAB HDL Coder 和 FPGA 快速實(shí)現(xiàn)自動白平衡(AWB)
在此項(xiàng)目中,我們將使用 MATLAB Simulink 和 HDL 編碼器創(chuàng)建自定義 IP -- AWB。
MATLAB 設(shè)計(jì)
自動白平衡模塊的設(shè)計(jì)是使用 HDL Coder 在 MATLAB 和 Simulink 中創(chuàng)建的。HDL Coder能夠生成 HDL 文件,這些文件可以作為 IP 在我們的目標(biāo) FPGA 中運(yùn)行。
AWB IP 設(shè)計(jì)旨在對每個時鐘 2 個像素求和,這些像素是從 Vivado 設(shè)計(jì)中的demosaic 輸出的 RGB 像素。
該算法非常簡單,對每個幀的 RGB 通道進(jìn)行求和并提供給微處理器。在微處理器中,像素的總和被劃分創(chuàng)建校正白平衡所需的校正因子。
除法是在 MicroBlaze 中完成的,雖然必須快速收集每幀的統(tǒng)計(jì)數(shù)據(jù),但除法不必那么快,因此為了節(jié)省邏輯資源,利用 Microblaze即可完成。
整體設(shè)計(jì)如下
像素求和旨在捕獲將傳入的 AXI 流像素?cái)?shù)據(jù)分割為三個元素 R、G、B,然后在求和之前對這些像素中的每一個進(jìn)行緩沖。求和塊的輸出也被記錄。
求和塊本身非常簡單。獲取輸入、有效和復(fù)位信號。復(fù)位信號連接到來自 AXI Stream 接口的 SOF 信號。而 AXI Valid 信號使能寄存器和累加。
為了在每一幀結(jié)束時向微處理器生成 IRQ,我們使用了以下結(jié)構(gòu)
一旦 MicroBlaze 定義了系數(shù)數(shù)據(jù),需要將其應(yīng)用于后面幀像素。
然后將它們連接起來,為 AXI-stream提供最終的像素?cái)?shù)據(jù)。
當(dāng)然,也需要針對 AWB 算法中插入延遲進(jìn)行平衡
完整的模塊設(shè)計(jì)如下:
MATLAB 測試
為了測試這個設(shè)計(jì),我們將在 MATLAB 中創(chuàng)建了一個測試平臺,它提取圖像文件來提供算法
自定義 MATLAB 模塊用于輸入和接收圖像,設(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)目中。
為了簡化寄存器接口,我們使用 AXI GPIO 提供所需的系數(shù)。
可以看到 AWB 提供 AXI Stream 輸入和輸出。
插入 AWB 后,接下來將在 Vitis 中的設(shè)計(jì)。
Vitis設(shè)計(jì)
算法非常簡單
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)注
1630文章
21796瀏覽量
605257 -
matlab
+關(guān)注
關(guān)注
185文章
2980瀏覽量
230826 -
編碼器
+關(guān)注
關(guān)注
45文章
3664瀏覽量
135077 -
Simulink
+關(guān)注
關(guān)注
22文章
536瀏覽量
62564
原文標(biāo)題:使用 MATLAB HDL Coder 和 FPGA 快速實(shí)現(xiàn)自動白平衡(AWB)
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論