0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用MATLAB Simulink和HDL编码器创建自定义IP--AWB

OpenFPGA 来源:OpenFPGA 2023-11-13 09:27 次阅读

使用 MATLAB HDL Coder 和 FPGA 快速实现自动白平衡(AWB)

在此项目中,我们将使用 MATLAB Simulink 和 HDL 编码器创建自定义 IP -- AWB。

MATLAB 设计

自动白平衡模块的设计是使用 HDL Coder 在 MATLAB 和 Simulink 中创建的。HDL Coder能够生成 HDL 文件,这些文件可以作为 IP 在我们的目标 FPGA 中运行。

AWB IP 设计旨在对每个时钟 2 个像素求和,这些像素是从 Vivado 设计中的demosaic 输出的 RGB 像素。

算法非常简单,对每个帧的 RGB 通道进行求和并提供给微处理器。在微处理器中,像素的总和被划分创建校正白平衡所需的校正因子。

除法是在 MicroBlaze 中完成的,虽然必须快速收集每帧的统计数据,但除法不必那么快,因此为了节省逻辑资源,利用 Microblaze即可完成。

整体设计如下

db127edc-81c2-11ee-939d-92fbcf53809c.png

像素求和旨在捕获将传入的 AXI 流像素数据分割为三个元素 R、G、B,然后在求和之前对这些像素中的每一个进行缓冲。求和块的输出也被记录。

db2d799e-81c2-11ee-939d-92fbcf53809c.png

求和块本身非常简单。获取输入、有效和复位信号。复位信号连接到来自 AXI Stream 接口的 SOF 信号。而 AXI Valid 信号使能寄存器和累加。

db47e1a8-81c2-11ee-939d-92fbcf53809c.png

为了在每一帧结束时向微处理器生成 IRQ,我们使用了以下结构

db59c634-81c2-11ee-939d-92fbcf53809c.png

一旦 MicroBlaze 定义了系数数据,需要将其应用于后面帧像素。

db716aaa-81c2-11ee-939d-92fbcf53809c.png

然后将它们连接起来,为 AXI-stream提供最终的像素数据。

当然,也需要针对 AWB 算法中插入延迟进行平衡

db8eb434-81c2-11ee-939d-92fbcf53809c.png

完整的模块设计如下:

dbaa8e34-81c2-11ee-939d-92fbcf53809c.png

MATLAB 测试

为了测试这个设计,我们将在 MATLAB 中创建了一个测试平台,它提取图像文件来提供算法

dbc9e82e-81c2-11ee-939d-92fbcf53809c.png

自定义 MATLAB 模块用于输入和接收图像,设置的 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)

要运行模拟,我们首先需要做一些事情

dbe1d948-81c2-11ee-939d-92fbcf53809c.png

模拟输入

dc06baba-81c2-11ee-939d-92fbcf53809c.png

浮点结果

dc33ad22-81c2-11ee-939d-92fbcf53809c.png

定点结果

dc577fe0-81c2-11ee-939d-92fbcf53809c.png

为了生成定点 HDL 解决方案,我们需要设置 HDL Coder生成器

dc8229de-81c2-11ee-939d-92fbcf53809c.pngdca5c650-81c2-11ee-939d-92fbcf53809c.png

Vivado 验证

导出IP核后,我们可以将其导入Vivado IP库并将其添加到演示项目中。

dcd012d4-81c2-11ee-939d-92fbcf53809c.png

为了简化寄存器接口,我们使用 AXI GPIO 提供所需的系数。

dcefdef2-81c2-11ee-939d-92fbcf53809c.png

可以看到 AWB 提供 AXI Stream 输入和输出。

插入 AWB 后,接下来将在 Vitis 中的设计。

Vitis设计

算法非常简单

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);

总结

MATLAB HDL Coder 和 FPGA联合开发,可以快速进行算法设计。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1626

    文章

    21665

    浏览量

    601787
  • matlab
    +关注

    关注

    182

    文章

    2963

    浏览量

    230143
  • 编码器
    +关注

    关注

    45

    文章

    3592

    浏览量

    134140
  • Simulink
    +关注

    关注

    22

    文章

    522

    浏览量

    62305

原文标题:使用 MATLAB HDL Coder 和 FPGA 快速实现自动白平衡(AWB)

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    PYNQ设计案例:基于HDL语言+Vivado的自定义IP创建

    作者:Mculover666 1.实验目的 用HDL语言+Vivado创建一个挂载在AXI总线上的自定义IP核 2.实验步骤 2.1.创建
    的头像 发表于 12-21 16:34 3402次阅读
    PYNQ设计案例:基于<b class='flag-5'>HDL</b>语言+Vivado的<b class='flag-5'>自定义</b><b class='flag-5'>IP</b>核<b class='flag-5'>创建</b>

    讲解MATLAB/Simulink HDL使用入门

    我们将使用实例讲解MATLAB / Simulink HDL 使用入门。
    的头像 发表于 11-06 09:12 1244次阅读
    讲解<b class='flag-5'>MATLAB</b>/<b class='flag-5'>Simulink</b> <b class='flag-5'>HDL</b>使用入门

    使用USRP E310和MATLABSimulink进行原型设计和测试软件定义的无线电

    原型,验证和测试实际的无线系统。使用这种支持包用USRP®E310 SDR,您可以使用双(2×2)发送实时的RF信号的工作,并接收流。您也可以实现自定义硬件设计,使用HDL编码器™或嵌入式编码
    发表于 12-21 07:56

    matlab自定义函数调用的方法

    matlab自定义函数调用的方法 命令文件/函数文件+ 函数文件 - 多
    发表于 11-29 13:14 88次下载

    SIMULINK线的处理/SIMULINK自定义功能模块

    SIMULINK线的处理/SIMULINK自定义功能模块     SIMULINK模型的构建是通过用线将各种功能模块进行连接而构成的。用鼠标可以
    发表于 06-19 12:51 5225次阅读

    EDK中PS2自定义IP

    Xilinx FPGA工程例子源码:EDK中PS2自定义IP
    发表于 06-07 11:44 4次下载

    在NI Multisim中创建自定义元器件

    在NI Multisim中创建自定义元器件,NI Multisim虽然强大但芯片太少所以总结这方法
    发表于 07-20 17:21 0次下载

    利用SDSoC创建自定义硬件

    SDSoC是开发Zynq-7000 SoC应用程序的理想工具,当您可以在自己的定制板平台上实现设计时,SDSoC变得更加强大。 有了这个视频,看看创建自己的自定义硬件是多么容易..
    的头像 发表于 11-26 06:25 2530次阅读

    自定义sobel滤波IP核,IP接口遵守AXI Stream协议

    自定义sobel滤波IPIP接口遵守AXI Stream协议
    的头像 发表于 08-06 06:04 3880次阅读

    教程 2:添加特征-自定义配置文件创建

    教程 2:添加特征 - 自定义配置文件创建
    发表于 03-15 19:39 0次下载
    教程 2:添加特征-<b class='flag-5'>自定义</b>配置文件<b class='flag-5'>创建</b>

    教程 2:添加特征-自定义配置文件创建

    教程 2:添加特征 - 自定义配置文件创建
    发表于 07-06 18:50 0次下载
    教程 2:添加特征-<b class='flag-5'>自定义</b>配置文件<b class='flag-5'>创建</b>

    Vivado设计套件用户指南:创建和打包自定义IP

    电子发烧友网站提供《Vivado设计套件用户指南:创建和打包自定义IP.pdf》资料免费下载
    发表于 09-13 14:54 0次下载
    Vivado设计套件用户指南:<b class='flag-5'>创建</b>和打包<b class='flag-5'>自定义</b><b class='flag-5'>IP</b>

    Vivado Design Suite用户指南:创建和打包自定义IP

    电子发烧友网站提供《Vivado Design Suite用户指南:创建和打包自定义IP.pdf》资料免费下载
    发表于 09-13 11:34 0次下载
    Vivado Design Suite用户指南:<b class='flag-5'>创建</b>和打包<b class='flag-5'>自定义</b><b class='flag-5'>IP</b>

    如何在Matlab自定义Message

    自定义Message 当我们的 message 消息比较复杂时,通常要用到自定义的 message 消息,MATLAB 2020b以上的版本自带了ROS Toolbox Interface
    的头像 发表于 11-15 18:12 1215次阅读
    如何在<b class='flag-5'>Matlab</b>中<b class='flag-5'>自定义</b>Message

    创建自定义的基于闪存的引导加载程序(BSL)

    电子发烧友网站提供《创建自定义的基于闪存的引导加载程序(BSL).pdf》资料免费下载
    发表于 09-19 10:50 0次下载
    <b class='flag-5'>创建</b><b class='flag-5'>自定义</b>的基于闪存的引导加载程序(BSL)