基于FPGA实现RGB888与YCbCr422算法的互转
目录一.RGB888转YCbCr444的公式算法1.RGB888转YCbCr444计算公式:2.YCbCr444转RGB888计算公式3.RGB888与YCbCR422的互转流程图二.Verilog代码1.RGB888转YCbCr4222.YCbCr422转RGB888一.RGB888转YCbCr444的公式算法我们通常认为YUV 和YCbCr是一个概念,但是两者还是有很大区别的:YUV是模拟信号,其中Y的取值范围在0-1之间,而U,V取值在-0.5至0.5之间。YCbCr是数字信号,如果再细分的话,可以分为tv range和full range两种格式。对于tv range,Y的取值在16-235之间,Cb的取值在16-240之间,Cr的取值在16-240之间;而对于full range,Y,Cb,Cr的取值都在0-255之间。我们这里以RGB888与YCbCr444(对于full range 或者pc range的YCbCr格式)转换为例,其互相转换公式如下所示:如果我们要在FPGA上实现RGB转YCbCr,可以将上述的RGB转YCbCr公式在硬件加速的理论下,转换成如下公式:1.RGB888转YCbCr444计算公式:上述硬件加速的核心思想是放大256倍,去除小数点,而后再右移8位(缩小256倍)。2.YCbCr444转RGB888计算公式上述硬件加速的核心思想是放大1024倍,去除小数点,而后再右移10位(缩小1024倍)。这里为什么不和RGB888转YCbCr一样放大256倍?这里笔者原先是放大256倍的,但是复原的数据与原先数据对比有偏差,放大1024倍的可以复原出原来的数据。3.RGB888与YCbCR422的互转流程图二.Verilog代码1.RGB888转YCbCr422`timescale 1ns/1ns module RGB888_YCbCr422 ( //global clock input wire clk, input wire rst_n, //Image data prepred to be processed input wire per_img_vsync, input wire per_img_href, input wire per_img_de, input wire per_img_enable, input wire [7:0] per_img_red, input wire [7:0] per_img_green, input wire [7:0] per_img_blue, //Image data has been processed output wire img_out_vsync, output wire img_out_href, output wire img_out_de, output wire img_out_enable, output reg [7:0] img_out_Y, output reg [7:0] img_out_CbCr ); //--------------------