1.算法仿真效果
vivado2019.2仿真结果如下:
其中1为直接乘法公式计算;
2为移位法计算;
3为分布式计算;
2.算法涉及理论知识概要
人类获得信息的主要方式是视觉,通常情况下颜色有2种描述方式,一种是RGB色度空间表示,一种是 YCbCr色度空间表示。然而,普通的R GB颜色空间对视频的显示存在很多问题,将其转换为YCbCr颜色空间能够很 好地适应现代社会的要求,本文正是采用一种新的方法,通过FPGA成功地将其转化,并得到正确的结果,此方法内 部变量少、算法优点突出、实时性好,十分易于在实际工程中实现。
RGB颜色空间
在RGB颜色空间中,1个带颜色的图像采样是用3个 值来表示一个像素点的相对的红、绿和蓝色比(3种光线的 主样构成颜色)。任何颜色都可以通过把红、绿和蓝通过 不同的比例相混得到。CRT和LCD通过分别对每个像素 点的红绿蓝值进行显示来得到各种颜色。从一个通常的观
察距离来看,不同的构成部分可以达到颜色上的真实感。
YCbCr颜色空间
人类视觉系统(HVS)相比亮度来说对于颜色不是那 么敏感。在RGB颜色空间中,3种颜色被平等地看待,并 用相同的分辨率存放起来。但是通过把亮度与颜色信息 分离,并对亮度值取更高的分辨率可以更有效地表示1个 颜色图像。
颜色空间转换
YCbCr颜色空间和它的变换(通常写为YUV)是1种 流行而高效的表示一个颜色图像的方法。YCrCb是国际 通用的B T.601数字电视信号中使用的彩色空间,它由 YU V彩色空间经过缩放和平移得到。YCrCb色度空间与 R GB色度空间的转换公式如下:
直接乘法公式计算
直接相乘,我们直接调用系统的IP核,如果版本不同,需要重新生成。如代码段中:
移位法计算
位移法就是用位移的方法来替换乘法器。
根据二进制乘法过程。二进制的乘法可以理解为,移位相加。
具体代码如上所示:
例如R*0010001100,那么其第三,四,八为1,所以结果为R移位7,R移位3,R移位2,最后三个相加得到。
分布式计算
分布式算法是一种快速的流水线结构的算法,根据你提供的论文的要求,这个分布式算法的具体物理结构如下所示:
将输入信号的每一位和另一个数相乘,通过10级流水线操作后,我们可以得到10个部分积,然后将10个部分积累加,得到最后的结果。
3.Verilog核心程序
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2023/03/26 18:01:20 // Design Name: // Module Name: tops // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module tops( clk, ena, r, g, b, y, cr, cb ); input clk;//输入时钟 input ena;//输入使能信号 input[7:0]r; //输入R,G,B信号 input[7:0]g; input[7:0]b; output[7:0]y;//输出Y,CR,CB信号 output[7:0]cr; output[7:0]cb; //mult your_instance_name ( // .CLK(CLK), // input wire CLK // .A(A), // input wire [9 : 0] A // .B(B), // input wire [9 : 0] B // .SCLR(SCLR), // input wire SCLR // .P(P) // output wire [19 : 0] P //); //================================================ wire[21:0]y1; wire[21:0]cr1; wire[21:0]cb1; //================================================ wire[19:0]yr; wire[19:0]yg; wire[19:0]yb; mult mult_yr( .CLK (clk), .A (10'd306), .B ({r,2'b00}), .SCLR (ena), .P (yr) ); mult mult_yg( .CLK (clk), .A (10'd601), .B ({g,2'b00}), .SCLR (ena), .P (yg) ); mult mult_yb( .CLK (clk), .A (10'd116), .B ({b,2'b00}), .SCLR (ena), .P (yb) ); assign y1 = yr + yg + yb; assign y = y1[21:14];//y计算公式 wire[19:0]crr; wire[19:0]crg; wire[19:0]crb; mult mult_crr( .CLK (clk), .A (10'd512), .B ({r,2'b00}), .SCLR (ena), .P (crr) ); mult mult_crg( .CLK (clk), .A (10'd429), .B ({g,2'b00}), .SCLR (ena), .P (crg) ); mult mult_crb( .CLK (clk), .A (10'd83), .B ({b,2'b00}), .SCLR (ena), .P (crb) ); assign cr1 = crr - crg - crb; assign cr = cr1[21:14]+128;//cr计算公式 wire[19:0]cbr; wire[19:0]cbg; wire[19:0]cbb; mult mult_cbr( .CLK (clk), .A (10'd173), .B ({r,2'b00}), .SCLR (ena), .P (cbr) ); mult mult_cbg( .CLK (clk), .A (10'd339), .B ({g,2'b00}), .SCLR (ena), .P (cbg) ); mult mult_cbb( .CLK (clk), .A (10'd512), .B ({b,2'b00}), .SCLR (ena), .P (cbb) ); assign cb1 = cbb - cbr - cbg; assign cb = cb1[21:14]+128;//cb计算公式 endmodule
标签:ycrcb,wire,FPGA,SCLR,clk,CLK,转换方法,mult,10 From: https://www.cnblogs.com/51matlab/p/17447201.html