📄 configurable_yuv_to_rgb.v
字号:
// ***************************Declaration*************************************************************** //// * * //// * file name: configurable_yuv_to_rgb.v * //// * function discription: adaptive color space convertion * //// * select different convertion equations according different display's demond * //// * converter1: YUV/YCbCr-->RGB SDTV * //// * R = Y + 1.371Cr - 175; * //// * G = Y - 0.698Cr - 0.336Cb + 132; * //// * B = Y + 1.732Cb - 222; * //// * * //// * R = Y + Cr +(64+32-1)Cr/256 - 175; * //// * G = Y - (128+32+16+2+1)Cr/256 - (64+16+4+2)Cb/256 + 132; * //// * B = Y + Cb + (128+32+16+1)Cb/256 - 222; * //// * converter2: YUV/YCbCr-->RGB HDTV * //// * R = Y + 1.540(Cr-128); * //// * G = Y - 0.459(Cr-128) - 0.183(Cb-128); * //// * B = Y + 1.816(Cb-128); * //// * * //// * R = Y + Cr +(128+8+2)Cr/256 - 197; * //// * G = Y - (64+32+16+4+1)Cr/256 - (64-16-1)Cb/256 + 82; * //// * B = Y + Cb + (128+64+16+1)Cb/256 - 232; * //// * converter3: YUV/YCbCr-->RGB PC * //// * R = Y + 1.140Cr; * //// * G = Y - 0.395Cb - 0.581Cr; * //// * B = Y + 2.032Cb; * //// * * //// * R = Y + Cr +(32+4)Cr/256; * //// * G = Y - (64+32+4+1)Cb/256 - (128+16+4+1)Cb/256; * //// * B = Y + 2Cb + 8Cb/256; * //// * Author: Wang Tao * //// * Date: 2007/09/18 * //// * Version Number: 1.0 * //// * * //// ************************************end************************************************************** //`timescale 1ns/10psmodule configurable_yuv_to_rgb( dclk,//signal of output data ngreset, //global reset signal href, //valid line signal y_in, uv_in, scontrl, //signal of selecting display source rout8, gout8, bout8, y_data, u_data, v_data );input dclk;input ngreset, href;input[7:0] y_in, uv_in;input[1:0] scontrl;output[7:0] rout8,gout8,bout8;output[7:0] y_data, u_data, v_data;reg uv_sel;reg [7:0] u_data, u_data_temp, v_data, y_data, y_data_temp;always @(posedge dclk or negedge ngreset) if(~ngreset) uv_sel <= 1'b0; else if(~href) uv_sel <= 1'b0; else uv_sel <= ~uv_sel; always @(posedge dclk or negedge ngreset) if(~ngreset) begin u_data_temp <= 8'h80; v_data <= 8'h80; end else if (~uv_sel) begin u_data_temp <= uv_in; v_data <= v_data; end else begin u_data_temp <= u_data_temp; v_data <= uv_in; end always @(posedge dclk or negedge ngreset) if(~ngreset) u_data <= 8'h80; else u_data <= u_data_temp; always @(posedge dclk or negedge ngreset) if(~ngreset) begin y_data_temp <= 8'h00; y_data <= 8'h00; end else begin y_data_temp <= y_in; y_data <= y_data_temp; end/***************************************************//* converter1: for SDTV *//***************************************************/// step1:Redreg[10:0] r1_1;reg[8:0] r1_2;reg[10:0] r1_3;always @(posedge dclk or negedge ngreset) if(~ngreset) begin r1_1 <= 11'h7ff; r1_2 <= 9'h1ff; r1_3 <= 11'h7ff; end else begin r1_1 <= {1'b0,y_data,2'b00} + {1'b0,v_data,2'b00}; r1_2 <= {1'b0,v_data} + {2'b00,v_data[7:1]}; r1_3 <= {9'b000000000,v_data[7:6]} + 10'h2bc; end reg[11:0] r1_4;always @(posedge dclk or negedge ngreset) if(~ngreset) r1_4 <= 12'hfff; else r1_4 <= {1'b0,r1_1} + {3'b000,r1_2};wire[11:0] r4_wire;assign r4_wire = r1_4;reg[11:0] r1_temp;always @(posedge dclk or negedge ngreset) if(~ngreset) r1_temp <= 12'h000; else begin if(r4_wire >= r1_3) r1_temp <= r4_wire - r1_3; else r1_temp <= 12'h000; endreg[11:0] r1_temp_d1;always @(posedge dclk or negedge ngreset) if(~ngreset) r1_temp_d1 <= 12'h000; else r1_temp_d1 <= r1_temp; /*********************************************************************//*********************************************************************/// step2: Greenreg[10:0] g1_1;reg[7:0] g1_2;reg[4:0] g1_3;reg[8:0] g1_4;reg[8:0] g1_5;reg[4:0] g1_6;always @(posedge dclk or negedge ngreset) if(~ngreset) begin g1_1 <= 11'h7ff; g1_2 <= 9'h1ff; g1_3 <= 5'h1f; g1_4 <= 9'h1ff; g1_5 <= 9'h1ff; g1_6 <= 5'h1f; end else begin g1_1 <= {1'b0,y_data,2'b00} + 11'h210; g1_2 <= {1'b0,v_data[7:1]} + {2'b00,v_data[7:2]}; g1_3 <= {1'b0,v_data[7:5]} + {2'b00,v_data[7:6]}; g1_4 <= {v_data,1'b0}; g1_5 <= {1'b0,u_data} + {3'b000,u_data[7:2]}; g1_6 <= {1'b0,u_data[7:4]} + {2'b00,u_data[7:5]}; endreg[8:0] g1_23;reg[9:0] g1_56;always @(posedge dclk or negedge ngreset) if(~ngreset) begin g1_23 <= 9'h1ff; g1_56 <= 10'h3ff; end else begin g1_23 <= {1'b0,g1_2} + {5'b00000,g1_3}; g1_56 <= {1'b0,g1_5} + {5'b00000,g1_6}; end reg[10:0] g1_d1;always @(posedge dclk or negedge ngreset) if(~ngreset) g1_d1 <= 11'h7ff; else g1_d1 <= {2'b00,g1_23} + {1'b0,g1_56}; reg[11:0] g1_d2;always @(posedge dclk or negedge ngreset) if(~ngreset) g1_d2 <= 12'hfff; else g1_d2 <= {1'b0,g1_d1} + {2'b00,g1_4}; reg[12:0] g1_temp;always @(posedge dclk or negedge ngreset) if(~ngreset) g1_temp <= 13'h000; else if(g1_1>=g1_d2) g1_temp <= g1_1 - g1_d2; else g1_temp <= 13'h000;/*******************************************************************//*******************************************************************///step3:bluereg[10:0] b1_1;reg[9:0] b1_2;reg[6:0] b1_3;always @(posedge dclk or negedge ngreset) if(~ngreset) begin b1_1 <= 11'h7ff; b1_2 <= 10'h3ff; b1_3 <= 7'h7f; end else begin b1_1 <= {1'b0,y_data,2'b00} + {1'b0,u_data,2'b00}; b1_2 <= {1'b0,u_data,1'b0} + {3'b000,u_data[7:1]}; b1_3 <= {5'b00000,u_data[7:6]} + {1'b0,u_data[7:2]}; endreg[10:0] b1_d1;always @(posedge dclk or negedge ngreset) if(~ngreset) b1_d1 <= 11'h7ff; else b1_d1 <= {1'b0,b1_2} + {4'b0000,b1_3};reg[11:0] b1_d2;always @(posedge dclk or negedge ngreset) if(~ngreset) b1_d2 <= 12'hfff; else b1_d2 <= {1'b0,b1_d1} + {1'b0,b1_1};reg[11:0] b1_temp;always @(posedge dclk or negedge ngreset) if(~ngreset) b1_temp <= 12'h000; else if(b1_d2 >= 11'h378) b1_temp <= b1_d2 - 11'h378; else b1_temp <= 12'h000;reg[11:0] b1_temp_d1;always @(posedge dclk or negedge ngreset) if(~ngreset) b1_temp_d1 <= 12'h000; else b1_temp_d1 <= b1_temp;/*********************************** ********************//***************** ouput data start ************************///outputreg[9:0] rout1_10,gout1_10,bout1_10;always @(posedge dclk or negedge ngreset) if(~ngreset) begin rout1_10 <= 10'h000; gout1_10 <= 10'h000; bout1_10 <= 10'h000; end else begin if(r1_temp_d1 <=10'h3ff) rout1_10 <= r1_temp_d1[9:0]; else rout1_10 <= 10'h3ff; if(g1_temp <=10'h3ff) gout1_10 <= g1_temp[9:0]; else gout1_10 <= 10'h3ff; if(b1_temp_d1 <=10'h3ff) bout1_10 <= b1_temp_d1[9:0]; else bout1_10 <= 10'h3ff; end/***************************************************//* converter2: for HDTV *//***************************************************/// step1:Redreg[10:0] r2_1;reg[9:0] r2_2;reg[2:0] r2_3;always @(posedge dclk or negedge ngreset) if(~ngreset) begin r2_1 <= 11'h7ff; r2_2 <= 10'h3ff; r2_3 <= 3'h7; end else begin r2_1 <= {1'b0,y_data,2'b00} + {1'b0,v_data,2'b00}; r2_2 <= {1'b0,v_data,1'b0} + {5'b00000,v_data[7:3]}; r2_3 <= v_data[7:5]; endreg[10:0] r2_4;always @(posedge dclk or negedge ngreset) if(~ngreset) r2_4 <= 11'hfff; else r2_4 <= {1'b0,r2_2} + {8'b00000000,r2_3}; reg[11:0] r2_5;always @(posedge dclk or negedge ngreset) if(~ngreset) r2_5 <= 12'hfff; else r2_5 <= {1'b0,r2_4} + {1'b0,r2_1};wire[11:0] r5_wire;assign r5_wire = r2_5;reg[11:0] r2_temp;always @(posedge dclk or negedge ngreset) if(~ngreset) r2_temp <= 12'h000;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -