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通道显示:

 

 

posted on 2022-08-17 10:20  Galois_V  阅读(170)  评论(0编辑  收藏  举报