RGB转YUV
根据前面YCbCr转RGB章节,可以知道YUV与RGB互转的公式。这里不再赘述,直接上RGB转YUV的代码。
RGB2YUV.v
1 //************************************************************************** 2 // *** file name : RGB2YUV.v 3 // *** version : 1.0 4 // *** Description : RGB2YUV 5 // *** Blogs : https://www.cnblogs.com/WenGalois123/ 6 // *** Author : Galois_V 7 // *** Date : 2022.08.16 8 // *** Changes : Initial 9 //************************************************************************** 10 `timescale 1ns/1ps 11 module RGB2YUV 12 ( 13 input i_sys_clk , 14 input i_sys_rstn , 15 16 input i_turn_en , 17 input [7:0] i_r_data , 18 input [7:0] i_g_data , 19 input [7:0] i_b_data , 20 output reg [7:0] o_y_data , 21 output reg [7:0] o_u_data , 22 output reg [7:0] o_v_data 23 ); 24 reg [7:0] r_r_data ; 25 reg [7:0] r_g_data ; 26 reg [7:0] r_b_data ; 27 reg [17:0] r_y_rpart; 28 reg [17:0] r_y_gpart; 29 reg [17:0] r_y_bpart; 30 reg [17:0] r_u_rpart; 31 reg [17:0] r_u_gpart; 32 reg [17:0] r_u_bpart; 33 reg [17:0] r_v_rpart; 34 reg [17:0] r_v_gpart; 35 reg [17:0] r_v_bpart; 36 reg [20:0] r_y_sum ; 37 reg [20:0] r_u_sum ; 38 reg [20:0] r_v_sum ; 39 40 always@(posedge i_sys_clk) 41 begin 42 if(~i_sys_rstn) 43 begin 44 r_r_data <= 'd0; 45 r_g_data <= 'd0; 46 r_b_data <= 'd0; 47 end 48 else if(i_turn_en) 49 begin 50 r_r_data <= i_r_data; 51 r_g_data <= i_g_data; 52 r_b_data <= i_b_data; 53 end 54 end 55 /******************************************************************************\ 56 calculate Y = 0.299*R + 0.587*G + 0.114*B 57 \******************************************************************************/ 58 always@(posedge i_sys_clk) 59 begin 60 if(~i_sys_rstn) 61 begin 62 r_y_rpart <= 'd0; 63 r_y_gpart <= 'd0; 64 r_y_bpart <= 'd0; 65 r_y_sum <= 'd0; 66 end 67 else if(i_turn_en) 68 begin 69 r_y_rpart <= r_r_data * 306; 70 r_y_gpart <= r_g_data * 601; 71 r_y_bpart <= r_b_data * 117; 72 r_y_sum <= r_y_rpart + r_y_gpart + r_y_bpart; 73 end 74 end 75 /******************************************************************************\ 76 calculate U = -0.147*R - 0.289*G + 0.436*B 77 \******************************************************************************/ 78 always@(posedge i_sys_clk) 79 begin 80 if(~i_sys_rstn) 81 begin 82 r_u_rpart <= 'd0; 83 r_u_gpart <= 'd0; 84 r_u_bpart <= 'd0; 85 r_u_sum <= 'd0; 86 end 87 else if(i_turn_en) 88 begin 89 r_u_rpart <= r_r_data * 150; 90 r_u_gpart <= r_g_data * 296; 91 r_u_bpart <= r_b_data * 446; 92 r_u_sum <= r_u_bpart - r_u_gpart - r_u_rpart; 93 end 94 end 95 /******************************************************************************\ 96 calculate V = 0.615*R - 0.515*G - 0.100*B 97 \******************************************************************************/ 98 always@(posedge i_sys_clk) 99 begin 100 if(~i_sys_rstn) 101 begin 102 r_v_rpart <= 'd0; 103 r_v_gpart <= 'd0; 104 r_v_bpart <= 'd0; 105 r_v_sum <= 'd0; 106 end 107 else if(i_turn_en) 108 begin 109 r_v_rpart <= r_r_data * 630; 110 r_v_gpart <= r_g_data * 527; 111 r_v_bpart <= r_b_data * 102; 112 r_v_sum <= r_v_rpart- r_v_gpart - r_v_bpart; 113 end 114 end 115 /******************************************************************************\ 116 output Y 117 \******************************************************************************/ 118 always@(posedge i_sys_clk) 119 begin 120 if(~i_sys_rstn) 121 begin 122 o_y_data <= 'd0; 123 end 124 else if(i_turn_en) 125 begin 126 if(r_y_sum[20]) 127 begin 128 o_y_data <= 'd0; 129 end 130 else if(r_y_sum[19:10]>255) 131 begin 132 o_y_data <= 8'hff; 133 end 134 else 135 begin 136 o_y_data <= r_y_sum[17:10]; 137 end 138 end 139 end 140 /******************************************************************************\ 141 output U 142 \******************************************************************************/ 143 always@(posedge i_sys_clk) 144 begin 145 if(~i_sys_rstn) 146 begin 147 o_u_data <= 'd0; 148 end 149 else if(i_turn_en) 150 begin 151 if(r_u_sum[20]) 152 begin 153 o_u_data <= 'd0; 154 end 155 else if(r_u_sum[19:10]>255) 156 begin 157 o_u_data <= 8'hff; 158 end 159 else 160 begin 161 o_u_data <= r_u_sum[17:10]; 162 end 163 end 164 end 165 /******************************************************************************\ 166 output v 167 \******************************************************************************/ 168 always@(posedge i_sys_clk) 169 begin 170 if(~i_sys_rstn) 171 begin 172 o_v_data <= 'd0; 173 end 174 else if(i_turn_en) 175 begin 176 if(r_v_sum[20]) 177 begin 178 o_v_data <= 'd0; 179 end 180 else if(r_v_sum[19:10]>255) 181 begin 182 o_v_data <= 8'hff; 183 end 184 else 185 begin 186 o_v_data <= r_v_sum[17:10]; 187 end 188 end 189 end 190 endmodule
笔者用OV5640摄像头模组做了下转换实验,分别是RGB显示及YUV中的Y通道显示: