首页 > 编程语言 >m基于FPGA的RGB转ycrcb颜色空间转换算法实现,包含testbench,对比三种转换方法

m基于FPGA的RGB转ycrcb颜色空间转换算法实现,包含testbench,对比三种转换方法

时间:2023-05-31 20:12:17浏览次数:43  
标签:ycrcb wire FPGA SCLR clk CLK 转换方法 mult 10

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

相关文章

  • 基于FPGA的LFSR16位伪随机数产生算法实现,可以配置不同的随机数种子和改生成多项式,包
    1.算法仿真效果vivado2019.2仿真结果如下:2.算法涉及理论知识概要LFSR(线性反馈移位寄存器)提供了一种在微控制器上快速生成非序列数字列表的简单方法。生成伪随机数只需要右移操作和XOR操作。LFSR完全由其多项式指定。例如,6千-次多项式与每个项存在用方程x表示6+x5+x4+x3......
  • 3模型机指令系统设计-2【FPGA模型机课程设计】
    3模型机指令系统设计-2【FPGA模型机课程设计】前言推荐3模型机指令系统设计-2安排MIPS12条整数指令测试与结果乘除法指令实现和功能仿真要点1乘法除法指令格式2通路增加部件3对整体通路的影响4功能验证代码设计defineIDEXEX1HiLo高位低位寄存器MIPSInstMem附录0框架1defin......
  • m基于FPGA的PID控制器实现,包含testbench测试程序,PID整定通过matlab使用RBF网络计算
    1.算法仿真效果vivado2019.2、matlab2022a仿真结果如下:    2.算法涉及理论知识概要        PID控制器产生于1915年,PID控制律的概念最早是由LYAPIMOV提出的,到目前为止,PID控制器以及改进的PID控制器在工业控制领域里最为常见。PID控制器(比例-积分-微分控制器......
  • m基于FPGA的LDPC最小和译码算法verilog实现,包括testbench和matlab辅助验证程序
    1.算法仿真效果matlab2022a/vivado2019.2仿真结果如下:matlab仿真:0.5码率,H是4608×9216的矩阵。FPGA仿真:对比如下:2.算法涉及理论知识概要LDPC译码分为硬判决译码和软判决译码。硬判决译码又称代数译码,主要代表是比特翻转(BF)译码算法,它的实现比较简单,但是译码性能很差......
  • m基于FPGA的LDPC最小和译码算法verilog实现,包括testbench和matlab辅助验证程序
    1.算法仿真效果matlab2022a/vivado2019.2仿真结果如下: matlab仿真: 0.5码率,H是4608×9216的矩阵。   FPGA仿真:    对比如下:   2.算法涉及理论知识概要         LDPC译码分为硬判决译码和软判决译码。         硬判决译码又称......
  • 基于FPGA的医学图像中值滤波verilog实现,包括testbench和MATLAB验证程序
    1.算法仿真效果matlab2022a/Vivado2019.2仿真结果如下:通过matlab产生带噪声医学图片:FPGA仿真:通过MATLAB读取FPGA的仿真数据,并显示滤波后图像:2.算法涉及理论知识概要中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声。这个设计思想就是检查输入信......
  • 基于FPGA的医学图像中值滤波verilog实现,包括testbench和MATLAB验证程序
    1.算法仿真效果matlab2022a/Vivado2019.2仿真结果如下: 通过matlab产生带噪声医学图片:   FPGA仿真:   通过MATLAB读取FPGA的仿真数据,并显示滤波后图像:   2.算法涉及理论知识概要       中值滤波是一种非线性数字滤波器技术,经常用于去除图像或......
  • fpga 一月学习记录
    fpga一月学习记录4月初,导师突然接了一个fpga开发的项目,把我和另一个同学叫过来,让我们速成,学习了2个星期Verilog语法,了解了一下vivado的使用,虽然最终项目因故中止,但是一个月的fpga学习也值得记录一下。我的主要工作内容是实现一个数据接口转换,具体因为没有下板成功就不说了,主要是......
  • 基于状态机方法的按键消抖模块FPGA实现,包括testbench
    1.算法仿真效果vivado2019.2仿真结果如下:   系统RTL图:   2.算法涉及理论知识概要        状态机,FSM(FiniteStateMachine),也称为同步有限状态机从。指的是在同步电路系统中使用的,跟随同步时钟变化的,状态数量有限的状态机,简称状态机。 状态机分类 ......
  • 基于FPGA的HDB3编译码verilog实现,包括testbench
    1.算法仿真效果vivado2019.2仿真结果如下:  2.算法涉及理论知识概要       数字基带信号的传输是数字通信系统的重要组成部分。在数字通信中,有些场合可不经过载波调制和解调过程,而对基带信号进行直接传输。采用AMI码的信号交替反转,有可能出现四连零现象,这不利于接......