1-FPGA硬件加速-YUV_YCbCr

这是对《基于Matlab与FPGA的图像处理教程》的学习笔记,代码和内容摘取自书中。
心得: 使用FPGA进行硬件加速的重点是消除或者减少浮点数运算,转换为定点运算,然后通过pipeline流水设计转为并行实现加速。

原理和方法

RGB与(YUV/YCbCr444)之间的原始公式(基于生物仿真学(Biometric)实验结果的),使用摄像头或者其他传感器进行转换的时候应先了解转换公式(参数会有不同,否则会导致偏色),下面是常用的计算公式。
image.png
image.png
公式放大256倍(也就是向高位移8位)得到参数
然后忽略小数(fpga中消耗资源较大)进行运算
运算完毕后移位回来
Y = ( R76 + G150 + B*29) >>8
Cb = (-R43 - G84 + B*128 + 32768) >>8
Cr = ( R128 - G107 - B*20 + 32768) >>8

Matlab程序

clc;% -------------------------------------------------------------------------
% Read PC image to Matlab
IMG1 = imread('../../0_images/Scart.jpg');    % 读取jpg图像
h = size(IMG1,1);         % 读取图像高度
w = size(IMG1,2);         % 读取图像宽度
subplot(221);imshow(IMG1);title('RGB Image');% -------------------------------------------------------------------------
% Relized by user logic
% Y = ( R*76 + G*150 + B*29) >>8
% Cb = (-R*43 - G*84 + B*128 + 32768) >>8
% Cr = ( R*128 - G*107 - B*20  + 32768) >>8
IMG1 = double(IMG1);
IMG_YCbCr = zeros(h,w,3);
for i = 1 : hfor j = 1 : wIMG_YCbCr(i,j, 1) = bitshift(( IMG1(i,j,1)*76 + IMG1(i,j,2)*150 + IMG1(i,j,3)*29),-8);IMG_YCbCr(i,j,2) = bitshift((-IMG1(i,j,1)*43 - IMG1(i,j,2)*84 + IMG1(i,j,3)*128 + 32768),-8);IMG_YCbCr(i,j,3) = bitshift(( IMG1(i,j,1)*128 - IMG1(i,j,2)*107 - IMG1(i,j,3)*20 + 32768),-8);end
end% -------------------------------------------------------------------------
% Display Y Cb Cr Channel
IMG_YCbCr = uint8(IMG_YCbCr);
subplot(222); imshow(IMG_YCbCr(:,:,1));  title('Y Channel');
subplot(223); imshow(IMG_YCbCr(:,:,2));  title('Cb Channel');
subplot(224); imshow(IMG_YCbCr(:,:,3));  title('Cr Channel');

image.png

Verilog程序

里需要注意的是pipeline,在FPGA中把这套公式拆解成了三个step。
第一步是乘积,会延时1个clk。
第二步是累加,会延时1个clk。
第三部是移位,会延时1个clk。
综上所述,需要使用3个clk的延时来实现pipeline。

`timescale 1ns/1ns
module VIP_RGB888_YCbCr444
(//global clockinput               clk,                //cmos video pixel clockinput               rst_n,              //global reset//Image data prepred to be processedinput               per_img_vsync,      //Prepared Image data vsync valid signalinput               per_img_href,       //Prepared Image data href vaild signalinput       [7:0]   per_img_red,        //Prepared Image red data to be processedinput       [7:0]   per_img_green,      //Prepared Image green data to be processedinput       [7:0]   per_img_blue,       //Prepared Image blue data to be processed//Image data has been processedoutput              post_img_vsync,     //Processed Image data vsync valid signaloutput              post_img_href,      //Processed Image data href vaild signaloutput      [7:0]   post_img_Y,         //Processed Image brightness outputoutput      [7:0]   post_img_Cb,        //Processed Image blue shading outputoutput      [7:0]   post_img_Cr         //Processed Image red shading output
);//--------------------------------------------
/*********************************************
//Refer to full/pc range YCbCr formatY   =  R*0.299 + G*0.587 + B*0.114Cb  = -R*0.169 - G*0.331 + B*0.5   + 128Cr  =  R*0.5   - G*0.419 - B*0.081 + 128
--->      Y   = (76 *R + 150*G + 29 *B)>>8Cb  = (-43*R - 84 *G + 128*B + 32768)>>8Cr  = (128*R - 107*G - 20 *B + 32768)>>8
**********************************************/
//Step 1
reg [15:0]  img_red_r0,   img_red_r1,   img_red_r2; 
reg [15:0]  img_green_r0, img_green_r1, img_green_r2; 
reg [15:0]  img_blue_r0,  img_blue_r1,  img_blue_r2; 
always@(posedge clk)
beginimg_red_r0   <= per_img_red   * 8'd76;img_red_r1   <= per_img_red   * 8'd43;  img_red_r2   <= per_img_red   * 8'd128;img_green_r0 <= per_img_green * 8'd150;img_green_r1 <= per_img_green * 8'd84;img_green_r2 <= per_img_green * 8'd107;img_blue_r0  <= per_img_blue  * 8'd29;img_blue_r1  <= per_img_blue  * 8'd128;img_blue_r2  <= per_img_blue  * 8'd20;
end//--------------------------------------------------
//Step 2
reg [15:0]  img_Y_r0;   
reg [15:0]  img_Cb_r0; 
reg [15:0]  img_Cr_r0; 
always@(posedge clk)
beginimg_Y_r0  <= img_red_r0  + img_green_r0 + img_blue_r0;img_Cb_r0 <= img_blue_r1 - img_red_r1   - img_green_r1 +  16'd32768;img_Cr_r0 <= img_red_r2  - img_green_r2 - img_blue_r2  +  16'd32768;
end//--------------------------------------------------
//Step 3
reg [7:0] img_Y_r1; 
reg [7:0] img_Cb_r1; 
reg [7:0] img_Cr_r1; 
always@(posedge clk)
beginimg_Y_r1  <= img_Y_r0[15:8];img_Cb_r1 <= img_Cb_r0[15:8];img_Cr_r1 <= img_Cr_r0[15:8]; 
end//------------------------------------------
//lag 3 clocks signal sync  
reg [2:0] per_img_vsync_r;
reg [2:0] per_img_href_r;   
always@(posedge clk or negedge rst_n)
beginif(!rst_n)beginper_img_vsync_r <= 0;per_img_href_r <= 0;endelsebeginper_img_vsync_r <=  {per_img_vsync_r[1:0],  per_img_vsync};per_img_href_r  <=  {per_img_href_r[1:0],   per_img_href};end
end
assign  post_img_vsync = per_img_vsync_r[2];
assign  post_img_href  = per_img_href_r[2];
assign  post_img_Y     = post_img_href ? img_Y_r1 : 8'd0;
assign  post_img_Cb    = post_img_href ? img_Cb_r1: 8'd0;
assign  post_img_Cr    = post_img_href ? img_Cr_r1: 8'd0;endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/112253.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ADB底层原理

介绍 adb的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用。通过adb我们可以在Eclipse/Android Studio中方便通过DDMS来调试Android程序&#xff0c;说白了就是debug工具。adb是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的and…

网络地址转换技术NAT以及路由器LAN口与WAN口的数据交换

NAT技术 网络地址转换&#xff08;NAT&#xff09;技术可以帮助局域网设备通过私有IP地址访问互联网。以下是NAT技术如何实现这一功能的基本原理&#xff1a; 私有IP地址&#xff1a;在一个局域网中&#xff0c;通常使用私有IP地址来为设备分配网络标识。私有IP地址范围包括以…

Python网络编程:构建网络应用与通信

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 Python是一门强大的编程…

S1FD40A180H-ASEMI快恢复二极管S1FD40A180H

编辑&#xff1a;ll S1FD40A180H-ASEMI快恢复二极管S1FD40A180H 型号&#xff1a;S1FD40A180H 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 特性&#xff1a;大功率、快恢复二极管 正向电流&#xff1a;40A 反向耐压&#xff1a;1800V 恢复时间&#xff1a;<300n…

kubernetes进阶 (三) 基础练习

前两天朋友给了我几道题&#xff0c;看着挺简单的&#xff0c;但实际做的时候发现坑不少&#xff0c;这里做下笔记 一、镜像构建部署lnmp 1、构建镜像 nginx、php、mysql 要求使用centos7作为基础镜像 2、使用deployment部署上面的容器,要求3个服务要放到一个pod中(虽然这样是…

大数据学习1.1-Centos8网络配置

1.查看虚拟网卡 2.配置网络信息 打勾处取消 记住箭头的数字 3.修改 网络连接 4.进入虚拟网络 5.进入属性 6.修改IPv4 5.将iIP和DNS进行修改 6.配置网络信息-进入修改网络配置文件 # 进入root用户 su root # 进入网络配置文件 cd /etc/sysconfig/network-scripts/ # 修改网络配…

淘天集团联合爱橙科技开源大模型训练框架Megatron-LLaMA

9月12日&#xff0c;淘天集团联合爱橙科技正式对外开源大模型训练框架——Megatron-LLaMA&#xff0c;旨在让技术开发者们能够更方便地提升大语言模型训练性能&#xff0c;降低训练成本&#xff0c;并保持和LLaMA社区的兼容性。测试显示&#xff0c;在32卡训练上&#xff0c;相…

使用Scrapy构建高效的网络爬虫

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 Scrapy是一个强大的Pyth…

Vue2+Vue3基础入门到实战项目全套教程的学习笔记

内容的视频链接点击此处可进入 这套笔记是按照视频和视频笔记总结的笔记&#xff0c;主要是方便vue的学习或温习&#xff0c;基本抛弃css样式的添加&#xff0c;专注于vue的使用。 第一天 Vue 快速上手 Vue的概念 Vue 是一个用于 构建用户界面 的 渐进式 框架 创建实例 …

IntelliJ IDEA使用——常用快捷键(Windows版)

文章目录 版本说明搜索操作层级关系查看光标选择代码定位代码操作Git操作编辑器操作 版本说明 当前的IntelliJ IDEA 的版本是2021.2.2&#xff08;下载IntelliJ IDEA&#xff09; ps&#xff1a;不同版本一些图标和设置位置可能会存在差异&#xff0c;但应该大部分都差不多。…

华为云ROMA Connect亮相Gartner®全球应用创新及商业解决方案峰会,助力企业应用集成和数字化转型

9月13日-9月14日 Gartner全球应用创新及商业解决方案峰会在伦敦举行 本届峰会以“重塑软件交付&#xff0c;驱动业务价值”为主题&#xff0c;全球1000多位业内专家交流最新的企业应用、软件工程、解决方案架构、集成与自动化、API等企业IT战略和新兴技术热门话题。 9月13日…

双节履带机械臂小车实现蓝牙遥控功能

1.功能描述 本文示例所实现的功能为&#xff1a;采用蓝牙远程遥控双节履带机械臂小车进行运动。 2.结构说明 双节履带机械臂小车&#xff0c;采用履带底盘&#xff0c;可适用于任何复杂地形。 前节履带抬起高度不低于10cm&#xff0c;可用于履带车进行爬楼行进。 底盘上装有一…