色度空间转换RGB空间到YCrCb按以下公式实现转换.docx

上传人:b****4 文档编号:12004576 上传时间:2023-04-16 格式:DOCX 页数:31 大小:76.12KB
下载 相关 举报
色度空间转换RGB空间到YCrCb按以下公式实现转换.docx_第1页
第1页 / 共31页
色度空间转换RGB空间到YCrCb按以下公式实现转换.docx_第2页
第2页 / 共31页
色度空间转换RGB空间到YCrCb按以下公式实现转换.docx_第3页
第3页 / 共31页
色度空间转换RGB空间到YCrCb按以下公式实现转换.docx_第4页
第4页 / 共31页
色度空间转换RGB空间到YCrCb按以下公式实现转换.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

色度空间转换RGB空间到YCrCb按以下公式实现转换.docx

《色度空间转换RGB空间到YCrCb按以下公式实现转换.docx》由会员分享,可在线阅读,更多相关《色度空间转换RGB空间到YCrCb按以下公式实现转换.docx(31页珍藏版)》请在冰豆网上搜索。

色度空间转换RGB空间到YCrCb按以下公式实现转换.docx

色度空间转换RGB空间到YCrCb按以下公式实现转换

色度空间转换RGB空间到YCrCb,按以下公式实现转换:

Y=(0.299R+0.587G+0.114B);

Cr=(0.511R-0.428G-0.083B)+128;

Cb=(-0.172R-0.339G+0.511B)+128;

1、定义10组RGB值作为测试向量(文件名:

rgb_in.file),编写matlab程序按以上公式转换为YCrCb值。

2、编写可综合的Verilog代码程序(文件名:

rgb_to_ycrcb.v)实现以上公式(需有时钟节拍,而非纯组合逻辑),要求添加FileHeader及Comment信息。

3、编写Testbench(文件名:

tb_rgb_to_ycrcb.v),从测试向量文件(文件名:

rgb_in.file)读取RGB测试向量值,生成的YCrCb值存入结果文件(文件名:

ycrcb_out.file),同时生成波形文件tb_rgb_to_ycrcb.vcd。

4、Verilog仿真后生成的YCrCb值同matlab程序生成的YCrCb值进行比较,看是否一致,如不一致,请分析原因。

5、要求分别采用ModelSim和NCVerilog工具进行仿真,打印提交源代码及波形图,波形图中生成YCrCb值应对齐(即对应同一组RGB值转换而来,应在同一时钟Clock生成;如未对齐,则采用数据延迟。

rgb_to_ycbcr.v[csharp]viewplaincopyprint?

//************************************************************************//

//Y=(0.299R+0.587G+0.114B);//

//Cr=(0.511R-0.428G-0.083B)+128;//

//Cb=(-0.172R-0.339G+0.511B)+128;//

//*************************************************************************//

`timescale1ns/10ps

modulergb_to_ycbcr(clk,ngreset,R,G,B,Y,Cb,Cr);

inputclk,ngreset;

input[7:

0]R,G,B;

output[7:

0]Y,Cb,Cr;

wire[7:

0]Y,Cb,Cr;

/************Y=(1_0011_0010R+10_0101_1001G+111_0101B)/1024*************/

reg[16:

0]r_256_32;

reg[12:

0]r_16_2;

reg[17:

0]g_512_64;

reg[12:

0]g_16_8;

reg[7:

0]g_1;

reg[14:

0]b_64_32;

reg[12:

0]b_16_4;

reg[7:

0]b_1;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

begin

r_256_32<=17'h1ffff;

r_16_2<=13'h1fff;

g_512_64<=18'h3ffff;

g_16_8<=13'h1fff;

g_1<=8'hff;

b_64_32<=15'h7fff;

b_16_4<=13'h1fff;

b_1<=8'hff;

end

else

begin

r_256_32<={R,8'd0}+{R,5'd0};

r_16_2<={R,4'd0}+{R,1'd0};

g_512_64<={G,9'd0}+{G,6'd0};

g_16_8<={G,4'd0}+{G,3'd0};

g_1<=G;

b_64_32<={B,6'd0}+{B,5'd0};

b_16_4<={B,4'd0}+{B,2'd0};

b_1<=B;

end

reg[17:

0]r_256_32_16_2;

reg[17:

0]g_512_64_16_8;

reg[7:

0]g_1_d1;

reg[17:

0]b_64_32_16_4;

reg[7:

0]b_1_d1;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

begin

r_256_32_16_2<=18'h3ffff;

g_512_64_16_8<=18'h3ffff;

g_1_d1<=8'hff;

b_64_32_16_4<=18'h3ffff;

b_1_d1<=8'hff;

end

else

begin

r_256_32_16_2<=r_256_32+r_16_2;

g_512_64_16_8<=g_512_64+g_16_8;

g_1_d1<=g_1;

b_64_32_16_4<=b_64_32+b_16_4;

b_1_d1<=b_1;

end

reg[17:

0]y_r;

reg[17:

0]y_g;

reg[17:

0]y_b;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

begin

y_r<=18'h3ffff;

y_g<=18'h3ffff;

y_b<=18'h3ffff;

end

else

begin

y_r<=r_256_32_16_2;

y_g<=g_512_64_16_8+g_1_d1;

y_b<=b_64_32_16_4+b_1_d1;

end

reg[17:

0]y_rg;

reg[17:

0]y_b_d1;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

begin

y_rg<=18'h0;

y_b<=18'h0;

end

else

begin

y_rg<=y_r+y_g;

y_b_d1<=y_b;

end

reg[17:

0]y_rgb;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

y_rgb<=18'h0;

else

y_rgb<=y_rg+y_b_d1;

wire[7:

0]y_tmp;

assigny_tmp=y_rgb[17:

10];

/***************Cr=(10_0000_1011R-1_1011_0110G-101_0101B)/1024+128**************/

reg[17:

0]r_512_8;

reg[9:

0]r_2_1;

reg[16:

0]g_256_128;

reg[13:

0]g_32_16;

reg[10:

0]g_4_2;

reg[14:

0]b_64_16;

reg[10:

0]b_4_1;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

begin

r_512_8<=18'h1ffff;

r_2_1<=10'h3ff;

g_256_128<=17'h1ffff;

g_32_16<=14'h3fff;

g_4_2<=11'h7ff;

b_64_16<=15'h7fff;

b_4_1<=11'h7ff;

end

else

begin

r_512_8<={R,9'd0}+{R,3'd0};

r_2_1<={R,1'd0}+R;

g_256_128<={G,8'd0}+{G,7'd0};

g_32_16<={G,5'd0}+{G,4'd0};

g_4_2<={G,2'd0}+{G,1'd0};

b_64_16<={B,6'd0}+{B,4'd0};

b_4_1<={B,2'd0}+B;

end

reg[17:

0]r_512_8_2_1;

reg[17:

0]g_256_128_32_16;

reg[10:

0]g_4_2_d1;

reg[17:

0]b_64_16_4_1;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

begin

r_512_8_2_1<=18'h3ffff;

g_256_128_32_16<=18'h3ffff;

g_4_2_d1<=11'hff;

b_64_16_4_1<=18'h3ffff;

end

else

begin

r_512_8_2_1<=r_512_8+r_2_1;

g_256_128_32_16<=g_256_128+g_32_16;

g_4_2_d1<=g_4_2;

b_64_16_4_1<=b_64_16+b_4_1;

end

reg[17:

0]r_512_8_2_1_d1;

reg[17:

0]g_256_128_32_16_4_2;

reg[17:

0]b_64_16_4_1_d1;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

begin

r_512_8_2_1_d1<=18'h3ffff;

g_256_128_32_16_4_2<=18'h3ffff;

b_64_16_4_1_d1<=18'h3ffff;

end

else

begin

r_512_8_2_1_d1<=r_512_8_2_1;

g_256_128_32_16_4_2<=g_256_128_32_16+g_4_2_d1;

b_64_16_4_1_d1<=b_64_16_4_1;

end

reg[17:

0]cr_r;

reg[17:

0]cr_gb;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

begin

cr_r<=18'd0;

cr_gb<=18'd0;

end

else

begin

cr_r<=r_512_8_2_1_d1;

cr_gb<=g_256_128_32_16_4_2+b_64_16_4_1_d1;

end

reg[17:

0]cr_rgb;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

cr_rgb<=18'h0;

elseif(cr_r>cr_gb)

cr_rgb<=cr_r-cr_gb;

else

cr_rgb<=cr_gb-cr_r;

wire[7:

0]cr_rgb_d;

assigncr_rgb_d=cr_rgb[17:

10];

reg[17:

0]cr_r_d1;

reg[17:

0]cr_gb_d1;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

{cr_r_d1,cr_gb_d1}<=36'h0;

else

{cr_r_d1,cr_gb_d1}<={cr_r,cr_gb};

reg[7:

0]cr_tmp;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

cr_tmp<=8'd0;

elseif(cr_r_d1>cr_gb_d1)

cr_tmp<=8'd128+cr_rgb_d;

else

cr_tmp<=8'd128-cr_rgb_d;

/***********Cb=(-1011_0000R-1_0101_1011G+10_0000_1011B)/1024+128********/

reg[15:

0]r_128_32;

reg[12:

0]r_16;

reg[16:

0]g_256_64;

reg[9:

0]g_2_1;

reg[17:

0]b_512_8;

reg[9:

0]b_2_1;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

begin

r_128_32<=16'hffff;

r_16<=13'h1fff;

g_256_64<=17'h1ffff;

g_2_1<=10'h3ff;

b_512_8<=18'h3ffff;

b_2_1<=10'h3ff;

end

else

begin

r_128_32<={R,7'd0}+{R,5'd0};

r_16<={R,4'd0};

g_256_64<={G,8'd0}+{G,6'd0};

g_2_1<={G,1'd0}+G;

b_512_8<={B,9'd0}+{B,3'd0};

b_2_1<={B,1'd0}+B;

end

reg[17:

0]r_128_32_16;

reg[17:

0]g_256_64_16_8;

reg[9:

0]g_2_1_d1;

reg[17:

0]b_512_8_2_1;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

begin

r_128_32_16<=18'h3ffff;

g_256_64_16_8<=18'h3ffff;

g_2_1_d1<=10'h3ff;

b_512_8_2_1<=18'h3ffff;

end

else

begin

r_128_32_16<=r_128_32+r_16;

g_256_64_16_8<=g_256_64+g_16_8;

g_2_1_d1<=g_2_1;

b_512_8_2_1<=b_512_8+b_2_1;

end

reg[17:

0]cb_r;

reg[17:

0]cb_g;

reg[17:

0]cb_b;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

begin

cb_r<=18'h3ffff;

cb_g<=18'h3ffff;

cb_b<=18'h3ffff;

end

else

begin

cb_r<=r_128_32_16;

cb_g<=g_256_64_16_8+g_2_1_d1;

cb_b<=b_512_8_2_1;

end

reg[17:

0]cb_rg;

reg[17:

0]cb_b_d1;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

begin

cb_rg<=18'h3ffff;

cb_b_d1<=18'h3ffff;

end

else

begin

cb_rg<=cb_r+cb_g;

cb_b_d1<=cb_b;

end

reg[17:

0]cb_rgb;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

cb_rgb<=18'h3ffff;

elseif(cb_rg>cb_b_d1)

cb_rgb<=cb_rg-cb_b_d1;

else

cb_rgb<=cb_b_d1-cb_rg;

wire[7:

0]cb_rgb_d1;

assigncb_rgb_d1=cb_rgb[17:

10];

reg[7:

0]cb_tmp;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

cb_tmp<=8'h0;

elseif(cb_rg>cb_b_d1)

cb_tmp<=8'd128-cb_rgb_d1;

else

cb_tmp<=8'd128+cb_rgb_d1;

reg[7:

0]y_tmp_d1;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

y_tmp_d1<=8'd0;

else

y_tmp_d1<=y_tmp;

assignY=y_tmp_d1;

assignCb=cb_tmp;

assignCr=cr_tmp;

endmodule

///////////////////////////////////////////////////////

tb_rgb_to_ycbcr.v[csharp]viewplaincopyprint?

`timescale1ns/1ps

moduletb_rgb_to_ycbcr();

regclk,ngreset;

wire[7:

0]R,G,B;

wire[7:

0]Y,Cb,Cr;

initial

begin

clk=0;

ngreset=1;

#50ngreset=0;

#100ngreset=1;

end

always#5clk=~clk;

reg[23:

0]rgb_in[0:

15];

initialbegin

$readmemb("rgb_in.txt",rgb_in);

end

integeri;

always@(posedgeclkornegedgengreset)

if(!

ngreset)

i<=0;

elseif(i==15)

i<=0;

else

i<=i+1;

wire[23:

0]data;

assigndata=rgb_in[i];

assignR=data[23:

16];

assignG=data[15:

8];

assignB=data[7:

0];

rgb_to_ycbcrrgb_to_ycbcr_tmpt(.R(R),

.G(G),

.B(B),

.clk(clk),

.ngreset(ngreset),

.Y(Y),

.Cb(Cb),

.Cr(Cr));

initial

begin

$fsdbDumpfile("csc.fsdb");

$fsdbDumpvars(0,tb_rgb_to_ycbcr);

#100000$finish;

end

//initialbegin

//$dumpfile("ycbcr_out.dump");

//$dumplimit(409600);

//$dumpvars(0,rgb_to_ycbcr_tmpt);

//$dumpvars(0,rgb_to_ycbcr_tmpt.Y,rgb_to_ycbcr_tmpt.Cb,rgb_to_ycbcr_tmpt.Cr);

//end

endmodule

 

总结

1.由于本代码采用可综合的代码方式编写,因此代码的长度较长,例如加法时候只相加两个数,用移位的方式实现乘法,以后可以采用乘法器加以改进。

2.本代码完整实现了色度空间转换的任务,并且是可综合的代码,最后输出的YCBCR信号比输入的RGB信号延迟了6个时钟,三个输出信号实现对齐。

3.通过本代码的编写熟

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1