画中画视频输出模块中的alpha混合程序解读

/*
模块封装了时序发生模块,和alpha混合模块,Ycbcr转RGB模块
完成多个视频输出的时序产生,和多个视频的alpha混合
*/
module vout_display_pro(
	input rst_n,                      /*复位 */
	input dp_clk,                     /*时钟*/
	input[11:0] h_fp,                 /*行同步前肩 */
	input[11:0] h_sync,               /*行同步 */
	input[11:0] h_bp,                 /*行同步后肩 */
	input[11:0] h_active,             /*行有效像素 */
	input[11:0] h_total,              /*行总周期(像素时钟) */
	input[11:0] v_fp,                 /*场同步前肩(行)*/
	input[11:0] v_sync,               /*场同步(行)*/
	input[11:0] v_bp,                 /*场同步后肩(行) */
	input[11:0] v_active,             /*场有效行 */
	input[11:0] v_total,              /*场总行 */
	output hs,                        /*行同步输出 */
	output vs,                        /*场同步输出 */
	output de,                        /*视频有效输出*/
	output[7:0] rgb_r,                /*视频输出R分量 */
	output[7:0] rgb_g,                /*视频输出G分量 */
	output[7:0] rgb_b,                /*视频输出B分量 */

	input[11:0] layer0_top,           /*视频0在显示器中的位置top*/
	input[11:0] layer0_left,          /*视频0在显示器中的位置left*/
	input[11:0] layer0_width,         /*视频0在显示器中显示的画面宽度*/
	input[11:0] layer0_height,        /*视频0在显示器中显示的画面高度 */
	input[7:0] layer0_alpha,          /*视频0在显示器中显示的透明度,如果是0x00完全显示《底色》,0xff则完全显示当前视频*/
	output layer0_rdreq,              /*视频0读数据请求*/
	input[23:0] layer0_ycbcr,         /*视频0的数据*/
	input[11:0] layer1_top,           /*视频1在显示器中的位置top*/
	input[11:0] layer1_left,          /*视频1在显示器中的位置left*/
	input[11:0] layer1_width,         /*视频1在显示器中显示的画面宽度*/
	input[11:0] layer1_height,        /*视频1在显示器中显示的画面高度 */
	input[7:0] layer1_alpha,          /*视频1在显示器中显示的透明度,如果是0x00完全显示《视频0》,0xff则完全显示当前视频*/
	output layer1_rdreq,              /*视频1读数据请求*/
	input[23:0] layer1_ycbcr,         /*视频1的数据*/
	input[11:0] layer2_top,           /*视频2在显示器中的位置top*/
	input[11:0] layer2_left,          /*视频2在显示器中的位置left*/
	input[11:0] layer2_width,         /*视频2在显示器中显示的画面宽度*/
	input[11:0] layer2_height,        /*视频2在显示器中显示的画面高度 */
	input[7:0] layer2_alpha,          /*视频2在显示器中显示的透明度,如果是0x00完全显示《视频1》,0xff则完全显示当前视频*/
	output layer2_rdreq,              /*视频2读数据请求*/
	input[23:0] layer2_ycbcr,         /*视频2的数据*/
	input[11:0] layer3_top,           /*视频3在显示器中的位置top*/
	input[11:0] layer3_left,          /*视频3在显示器中的位置left*/
	input[11:0] layer3_width,         /*视频3在显示器中显示的画面宽度*/
	input[11:0] layer3_height,        /*视频3在显示器中显示的画面高度 */
	input[7:0] layer3_alpha,          /*视频3在显示器中显示的透明度,如果是0x00完全显示《视频2》,0xff则完全显示当前视频*/
	output layer3_rdreq,              /*视频3读数据请求*/
	input[23:0] layer3_ycbcr          /*视频3的数据*/
);
parameter BLUE_Y = 8'h10;/*底色Y分量*/
parameter BLUE_CB = 8'h80;/*底色Cb分量*/
parameter BLUE_CR = 8'h80;/*底色Cr分量*/
wire timing_gen_hs;
wire timing_gen_vs;
wire timing_gen_de;
/*例化时序发生模块,参数行场同步,DE*/
/*vout_display_timing是用户在TOP模块中指定的时序,这里是1024X768,CH0的输入是720X576,需要
SCALER这种分辨率*/
vout_display_timing vout_display_timing_m0(
	.rst_n(rst_n),
	.dp_clk(dp_clk),
	.h_fp(h_fp),
	.h_sync(h_sync),
	.h_bp(h_bp),
	.h_active(h_active),
	.h_total(h_total),
	
	.v_fp(v_fp),
	.v_sync(v_sync),
	.v_bp(v_bp),
	.v_active(v_active),
	.v_total(v_total),
	
	.hs(timing_gen_hs),					// OUTPUT,产生的HS
	.vs(timing_gen_vs),					// OUTPUT,产生的VS
	.de(timing_gen_de)					// OUTPUT,产生的DE
);
wire xy_gen_hs;
wire xy_gen_vs;
wire xy_gen_de;
wire[11:0] xy_gen_x;
wire[11:0] xy_gen_y;
/*例化坐标生成模块,有时序发生模块的行场同步DE产生x、y坐标*/
/*由上面模块产生的三种信号作为输入,产生画面的X,Y坐标,及HS,VS,DE信号
实际上就是,根据三个信号和像素时钟,产生计数器,从而产生X,Y坐标*/
timing_gen_xy timing_gen_xy_m0(
	.rst_n(rst_n),
	.clk(dp_clk),
	.i_hs(timing_gen_hs),
	.i_vs(timing_gen_vs),
	.i_de(timing_gen_de),
	.i_data(),
	.o_hs(xy_gen_hs),
	.o_vs(xy_gen_vs),
	.o_de(xy_gen_de),
	.o_data(),
	.x(xy_gen_x),
	.y(xy_gen_y)
);
wire layer0_hs;
wire layer0_vs;
wire layer0_de;
wire[11:0] layer0_x;
wire[11:0] layer0_y;
wire[23:0] layer0_blend_ycbcr;
/*视频0的透明混合处理,在要求的区域按照视频0的alpha值和底色混合,其他区域显示底色,从而产生新的视频0*/
layer_blend layer_blend_m0(
	.rst_n(rst_n),
	.clk(dp_clk),
	.i_hs(xy_gen_hs),
	.i_vs(xy_gen_vs),
	.i_de(xy_gen_de),
	.i_ycbcr(layer0_ycbcr),
	.i_back_ycbcr({BLUE_Y,BLUE_CB,BLUE_CR}),
	.top(layer0_top),
	.left(layer0_left),
	.width(layer0_width),
	.height(layer0_height),
	.i_alpha(layer0_alpha),
	.rdreq(layer0_rdreq),
	.o_hs(layer0_hs),
	.o_vs(layer0_vs),
	.o_de(layer0_de),
	.i_x(xy_gen_x),
	.i_y(xy_gen_y),
	.o_x(layer0_x),
	.o_y(layer0_y),
	.o_ycbcr(layer0_blend_ycbcr)
);

wire layer1_hs;
wire layer1_vs;
wire layer1_de;
wire[11:0] layer1_x;
wire[11:0] layer1_y;
wire[23:0] layer1_blend_ycbcr;
/*视频1的透明混合处理,在要求的区域按照视频1的alpha值和新的视频0混合,其他区域显示新的视频0,从而产生新的视频1*/
layer_blend layer_blend_m1(
	.rst_n(rst_n),
	.clk(dp_clk),
	.i_hs(layer0_hs),
	.i_vs(layer0_vs),
	.i_de(layer0_de),
	.i_ycbcr(layer1_ycbcr),
	.i_back_ycbcr(layer0_blend_ycbcr),
	.top(layer1_top),
	.left(layer1_left),
	.width(layer1_width),
	.height(layer1_height),
	.i_alpha(layer1_alpha),
	.rdreq(layer1_rdreq),
	.o_hs(layer1_hs),
	.o_vs(layer1_vs),
	.o_de(layer1_de),
	.i_x(layer0_x),
	.i_y(layer0_y),
	.o_x(layer1_x),
	.o_y(layer1_y),
	.o_ycbcr(layer1_blend_ycbcr)
);
wire layer2_hs;
wire layer2_vs;
wire layer2_de;
wire[11:0] layer2_x;
wire[11:0] layer2_y;
wire[23:0] layer2_blend_ycbcr;
/*视频2的透明混合处理,在要求的区域按照视频2的alpha值和新的视频1混合,其他区域显示新的视频1,从而产生新的视频2*/
layer_blend layer_blend_m2(
	.rst_n(rst_n),
	.clk(dp_clk),
	.i_hs(layer1_hs),
	.i_vs(layer1_vs),
	.i_de(layer1_de),
	.i_ycbcr(layer2_ycbcr),
	.i_back_ycbcr(layer1_blend_ycbcr),
	.top(layer2_top),
	.left(layer2_left),
	.width(layer2_width),
	.height(layer2_height),
	.i_alpha(layer2_alpha),
	.rdreq(layer2_rdreq),
	.o_hs(layer2_hs),
	.o_vs(layer2_vs),
	.o_de(layer2_de),
	.i_x(layer1_x),
	.i_y(layer1_y),
	.o_x(layer2_x),
	.o_y(layer2_y),
	.o_ycbcr(layer2_blend_ycbcr)
);

wire layer3_hs;
wire layer3_vs;
wire layer3_de;
wire[11:0] layer3_x;
wire[11:0] layer3_y;
wire[23:0] layer3_blend_ycbcr;
/*视频3的透明混合处理,在要求的区域按照视频3的alpha值和新的视频2混合,其他区域显示新的视频2,从而产生新的视频3*/
layer_blend layer_blend_m3(
	.rst_n(rst_n),
	.clk(dp_clk),
	.i_hs(layer2_hs),
	.i_vs(layer2_vs),
	.i_de(layer2_de),
	.i_ycbcr(layer3_ycbcr),
	.i_back_ycbcr(layer2_blend_ycbcr),
	.top(layer3_top),
	.left(layer3_left),
	.width(layer3_width),
	.height(layer3_height),
	.i_alpha(layer3_alpha),
	.rdreq(layer3_rdreq),
	.o_hs(layer3_hs),
	.o_vs(layer3_vs),
	.o_de(layer3_de),
	.i_x(layer2_x),
	.i_y(layer2_y),
	.o_x(layer3_x),
	.o_y(layer3_y),
	.o_ycbcr(layer3_blend_ycbcr)
);

 wire[23:0] ycbcr;
 wire ycbcr_hs;
 wire ycbcr_vs;
 wire ycbcr_de;
 assign ycbcr = layer3_blend_ycbcr;
 assign ycbcr_hs = layer3_hs;
 assign ycbcr_vs = layer3_vs;
 assign ycbcr_de = layer3_de;
/*混合后视频3已经包含了视频0,视频1,视频2,视频3的内容,转化为RGB分量后送到显示器*/
 ycbcr_to_rgb ycbcr_to_rgb_m0(
	.clk(dp_clk),
	.i_y_8b(ycbcr[23:16]),
	.i_cb_8b(ycbcr[15:8]),
	.i_cr_8b(ycbcr[7:0]),
	.i_h_sync(ycbcr_hs),
	.i_v_sync(ycbcr_vs),
	.i_data_en(ycbcr_de),
						
	.o_r_8b(rgb_r),
	.o_g_8b(rgb_g),
	.o_b_8b(rgb_b),
						
	.o_h_sync(hs),
	.o_v_sync(vs),                                                                                                    
	.o_data_en(de)                                                                                                   
 );
endmodule 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值