⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inter_mv_decoding.v

📁 a H.264/AVC Baseline Decoder
💻 V
📖 第 1 页 / 共 5 页
字号:
//--------------------------------------------------------------------------------------------------// Design    : nova// Author(s) : Ke Xu// Email	   : eexuke@yahoo.com// File      : Inter_mv_decoding.v// Generated : May 25, 2005// Copyright (C) 2008 Ke Xu                //-------------------------------------------------------------------------------------------------// Description // Decoding the motion vector x and motion vector y for Inter prediction and P_skip// SearchRange = 16pix -> 64 -> -64 ~ + 64 -> mvd[7:0], mv[7:0], mvp[7:0]//-------------------------------------------------------------------------------------------------// synopsys translate_off`include "timescale.v"// synopsys translate_on`include "nova_defines.v"module Inter_mv_decoding (clk,reset_n,Is_skip_run_entry,Is_skip_run_end,	slice_data_state,mb_pred_state,sub_mb_pred_state,mvd,	mb_num,mb_num_h,mb_num_v,mb_type_general,sub_mb_type,end_of_MB_DEC,mbPartIdx,subMbPartIdx,compIdx,	MBTypeGen_mbAddrA,MBTypeGen_mbAddrB_reg,MBTypeGen_mbAddrD,	mvx_mbAddrB_dout,mvy_mbAddrB_dout,mvx_mbAddrC_dout,mvy_mbAddrC_dout,mv_mbAddrB_rd_for_DF,		skip_mv_calc,Is_skipMB_mv_calc,mvx_mbAddrA,mvy_mbAddrA,	mvx_mbAddrB_cs_n,mvx_mbAddrB_wr_n,mvx_mbAddrB_rd_addr,mvx_mbAddrB_wr_addr,mvx_mbAddrB_din,	mvy_mbAddrB_cs_n,mvy_mbAddrB_wr_n,mvy_mbAddrB_rd_addr,mvy_mbAddrB_wr_addr,mvy_mbAddrB_din,	mvx_mbAddrC_cs_n,mvx_mbAddrC_wr_n,mvx_mbAddrC_rd_addr,mvx_mbAddrC_wr_addr,mvx_mbAddrC_din,	mvy_mbAddrC_cs_n,mvy_mbAddrC_wr_n,mvy_mbAddrC_rd_addr,mvy_mbAddrC_wr_addr,mvy_mbAddrC_din,	mv_is16x16,	mvx_CurrMb0,mvx_CurrMb1,mvx_CurrMb2,mvx_CurrMb3,	mvy_CurrMb0,mvy_CurrMb1,mvy_CurrMb2,mvy_CurrMb3);	input clk,reset_n;	input Is_skip_run_entry;	input Is_skip_run_end;	input [3:0] slice_data_state;	input [2:0] mb_pred_state;	input [1:0] sub_mb_pred_state; 	input [7:0] mvd;	input [6:0] mb_num;	input [3:0] mb_num_h;	input [3:0] mb_num_v;	input [3:0] mb_type_general;	input [1:0] sub_mb_type;	input end_of_MB_DEC;	input [1:0] mbPartIdx,subMbPartIdx;	input compIdx;	input [1:0] MBTypeGen_mbAddrA;	input MBTypeGen_mbAddrD;	input [21:0] MBTypeGen_mbAddrB_reg;	input [31:0] mvx_mbAddrB_dout,mvy_mbAddrB_dout;	input [7:0]  mvx_mbAddrC_dout,mvy_mbAddrC_dout;	input mv_mbAddrB_rd_for_DF;		output skip_mv_calc;	output Is_skipMB_mv_calc;	output [31:0] mvx_mbAddrA,mvy_mbAddrA;	output mvx_mbAddrB_cs_n,mvy_mbAddrB_cs_n,mvx_mbAddrC_cs_n,mvy_mbAddrC_cs_n;	output mvx_mbAddrB_wr_n,mvy_mbAddrB_wr_n,mvx_mbAddrC_wr_n,mvy_mbAddrC_wr_n;	output [3:0] mvx_mbAddrB_rd_addr,mvy_mbAddrB_rd_addr,mvx_mbAddrC_rd_addr,mvy_mbAddrC_rd_addr;	output [3:0] mvx_mbAddrB_wr_addr,mvy_mbAddrB_wr_addr,mvx_mbAddrC_wr_addr,mvy_mbAddrC_wr_addr;	output [31:0] mvx_mbAddrB_din,mvy_mbAddrB_din;	output [7:0] mvx_mbAddrC_din,mvy_mbAddrC_din;	output mv_is16x16;	output [31:0] mvx_CurrMb0,mvx_CurrMb1,mvx_CurrMb2,mvx_CurrMb3;	output [31:0] mvy_CurrMb0,mvy_CurrMb1,mvy_CurrMb2,mvy_CurrMb3;	reg mvx_mbAddrB_cs_n,mvy_mbAddrB_cs_n,mvx_mbAddrC_cs_n,mvy_mbAddrC_cs_n;	reg mvx_mbAddrB_wr_n,mvy_mbAddrB_wr_n,mvx_mbAddrC_wr_n,mvy_mbAddrC_wr_n;	reg [3:0] mvx_mbAddrB_rd_addr,mvy_mbAddrB_rd_addr,mvx_mbAddrC_rd_addr,mvy_mbAddrC_rd_addr;	reg [3:0] mvx_mbAddrB_wr_addr,mvy_mbAddrB_wr_addr,mvx_mbAddrC_wr_addr,mvy_mbAddrC_wr_addr;	reg [31:0] mvx_mbAddrB_din,mvy_mbAddrB_din;	reg [7:0] mvx_mbAddrC_din,mvy_mbAddrC_din;	reg mv_is16x16;	reg [31:0] mvx_CurrMb0,mvx_CurrMb1,mvx_CurrMb2,mvx_CurrMb3;	reg [31:0] mvy_CurrMb0,mvy_CurrMb1,mvy_CurrMb2,mvy_CurrMb3;			reg [7:0] mvpAx,mvpAy,mvpBx,mvpBy,mvpCx,mvpCy;	reg [31:0] mvx_mbAddrA,mvy_mbAddrA;	wire [7:0] mvx_mbAddrD,mvy_mbAddrD;	reg [7:0] mvpx,mvpy,mvx,mvy;		reg skip_mv_calc; //This signal is of reg type and is active for one cycle after end_of_MB_DEC and before 					  //trigger_blk4x4_inter_pred.It is used to direct motion vector prediction for skipped MB	always @ (posedge clk)		if (reset_n == 1'b0)			skip_mv_calc <= 1'b0;		else if (slice_data_state == `skip_run_duration && end_of_MB_DEC && !Is_skip_run_end)			skip_mv_calc <= 1'b1;		else			skip_mv_calc <= 1'b0; 		wire Is_skipMB_mv_calc;	assign Is_skipMB_mv_calc = Is_skip_run_entry | skip_mv_calc;		reg [1:0] MBTypeGen_mbAddrB;	reg [1:0] MBTypeGen_mbAddrC;	always @ (mb_num_h or MBTypeGen_mbAddrB_reg)		case (mb_num_h)			0 :MBTypeGen_mbAddrB <= MBTypeGen_mbAddrB_reg[1:0];			1 :MBTypeGen_mbAddrB <= MBTypeGen_mbAddrB_reg[3:2];			2 :MBTypeGen_mbAddrB <= MBTypeGen_mbAddrB_reg[5:4];			3 :MBTypeGen_mbAddrB <= MBTypeGen_mbAddrB_reg[7:6];			4 :MBTypeGen_mbAddrB <= MBTypeGen_mbAddrB_reg[9:8];			5 :MBTypeGen_mbAddrB <= MBTypeGen_mbAddrB_reg[11:10];			6 :MBTypeGen_mbAddrB <= MBTypeGen_mbAddrB_reg[13:12];			7 :MBTypeGen_mbAddrB <= MBTypeGen_mbAddrB_reg[15:14];			8 :MBTypeGen_mbAddrB <= MBTypeGen_mbAddrB_reg[17:16];			9 :MBTypeGen_mbAddrB <= MBTypeGen_mbAddrB_reg[19:18];			10:MBTypeGen_mbAddrB <= MBTypeGen_mbAddrB_reg[21:20];			default:MBTypeGen_mbAddrB <= 0;		endcase	always @ (mb_num_h or MBTypeGen_mbAddrB_reg)		case (mb_num_h)			0:MBTypeGen_mbAddrC <= MBTypeGen_mbAddrB_reg[3:2];			1:MBTypeGen_mbAddrC <= MBTypeGen_mbAddrB_reg[5:4];			2:MBTypeGen_mbAddrC <= MBTypeGen_mbAddrB_reg[7:6];			3:MBTypeGen_mbAddrC <= MBTypeGen_mbAddrB_reg[9:8];			4:MBTypeGen_mbAddrC <= MBTypeGen_mbAddrB_reg[11:10];			5:MBTypeGen_mbAddrC <= MBTypeGen_mbAddrB_reg[13:12];			6:MBTypeGen_mbAddrC <= MBTypeGen_mbAddrB_reg[15:14];			7:MBTypeGen_mbAddrC <= MBTypeGen_mbAddrB_reg[17:16];			8:MBTypeGen_mbAddrC <= MBTypeGen_mbAddrB_reg[19:18];			9:MBTypeGen_mbAddrC <= MBTypeGen_mbAddrB_reg[21:20];			default:MBTypeGen_mbAddrC <= 0;		endcase	  		wire refIdxL0_A; //Here refIdxL0_A == 1'b1 is equal to refIdxL0_A == -1 in Page122 of H.264 2003.5 standard	wire refIdxL0_B; //Here refIdxL0_B == 1'b1 is equal to refIdxL0_B == -1 in Page122 of H.264 2003.5 standard	reg  refIdxL0_C; //Here refIdxL0_C == 1'b1 is equal to refIdxL0_C == -1 in Page122 of H.264 2003.5 standard		assign refIdxL0_A = (	//P_skip	(Is_skipMB_mv_calc ||	//Inter16x16,Inter16x8,Inter8x16 left blk	(mb_pred_state == `mvd_l0_s && (mb_type_general == `MB_Inter16x16 || mb_type_general == `MB_Inter16x8 || (mb_type_general == `MB_Inter8x16 && mbPartIdx == 0))) ||	//Inter8x8,left most blk	(sub_mb_pred_state == `sub_mvd_l0_s && (mbPartIdx == 0 || mbPartIdx == 2) && (				sub_mb_type == 0 || 				sub_mb_type == 1 || 				(sub_mb_type == 2 && subMbPartIdx == 0) || 				(sub_mb_type == 3 && (subMbPartIdx == 0 || subMbPartIdx == 2))))) &&	(mb_num_h == 0 || MBTypeGen_mbAddrA[1] == 1))? 1'b1:1'b0; 		assign refIdxL0_B = (	//P_skip	(Is_skipMB_mv_calc ||	//Inter16x16,Inter16x8 upper blk,Inter8x16	(mb_pred_state == `mvd_l0_s && (mb_type_general == `MB_Inter16x16 || (mb_type_general == `MB_Inter16x8 && mbPartIdx == 0) || mb_type_general == `MB_Inter8x16)) ||	//Inter8x8,left most blk	(sub_mb_pred_state == `sub_mvd_l0_s && (mbPartIdx == 0 || mbPartIdx == 1) && (				sub_mb_type == 0 || 				sub_mb_type == 2 || 				(sub_mb_type == 1 && subMbPartIdx == 0) || 				(sub_mb_type == 3 && (subMbPartIdx == 0 || subMbPartIdx == 1))))) &&	(mb_num_v == 0 || MBTypeGen_mbAddrB[1] == 1))? 1'b1:1'b0; 		always @ (Is_skipMB_mv_calc or mb_pred_state or sub_mb_pred_state or mb_type_general or mb_num_v or mb_num_h		or sub_mb_type or mbPartIdx or subMbPartIdx or MBTypeGen_mbAddrC[1] or MBTypeGen_mbAddrD		or refIdxL0_A or refIdxL0_B)		//P_skip,Inter16x16		if (Is_skipMB_mv_calc || (mb_pred_state == `mvd_l0_s && mb_type_general == `MB_Inter16x16))			begin				if 		(mb_num_v == 0)		refIdxL0_C <= 1'b1;				else if (mb_num_h == 10)	refIdxL0_C <= (MBTypeGen_mbAddrD    == `MB_addrD_Intra)? 1'b1:1'b0;				else						refIdxL0_C <= (MBTypeGen_mbAddrC[1] == 1'b1)? 1'b1:1'b0;			end		//Inter16x8		else if (mb_pred_state == `mvd_l0_s && mb_type_general == `MB_Inter16x8)			begin 				if (mbPartIdx == 0)	//upper blk					begin						if 		(mb_num_v == 0)		refIdxL0_C <= 1'b1;						else if (mb_num_h == 10)	refIdxL0_C <= (MBTypeGen_mbAddrD    == `MB_addrD_Intra)? 1'b1:1'b0;						else						refIdxL0_C <= (MBTypeGen_mbAddrC[1] == 1'b1)? 1'b1:1'b0;					end				else 				//bottom blk					refIdxL0_C <= refIdxL0_A;			end		//Inter8x16		else if (mb_pred_state == `mvd_l0_s && mb_type_general == `MB_Inter8x16)			begin				if (mbPartIdx == 0)	//left blk					refIdxL0_C <= refIdxL0_B;				else				//right blk					begin						if (mb_num_v == 0 || mb_num_h == 10)	refIdxL0_C <= refIdxL0_B;						else									refIdxL0_C <= (MBTypeGen_mbAddrC[1] == 1'b1)? 1'b1:1'b0;					end			end		//Inter8x8 and below		else if (sub_mb_pred_state == `sub_mvd_l0_s)			case (mbPartIdx)				2'b00:	//left-top 8x8 blk				case (sub_mb_type)					0:refIdxL0_C <= refIdxL0_B;					1:refIdxL0_C <= (subMbPartIdx == 0)? refIdxL0_B:refIdxL0_A;						2:refIdxL0_C <= refIdxL0_B;					3:					case (subMbPartIdx)						0,1:refIdxL0_C <= refIdxL0_B;						2,3:refIdxL0_C <= 1'b0;					endcase				endcase				2'b01:	//right-top 8x8 blk				case (sub_mb_type)					0:	//8x8					if 		(mb_num_v == 0)	 refIdxL0_C <= 1'b1;					else if (mb_num_h == 10) refIdxL0_C <= refIdxL0_B;					else					 refIdxL0_C <= (MBTypeGen_mbAddrC[1] == 1'b1)? 1'b1:1'b0;					1:	//8x4					if (subMbPartIdx == 0)						begin							if 		(mb_num_v == 0)	 refIdxL0_C <= 1'b1;							else if (mb_num_h == 10) refIdxL0_C <= refIdxL0_B;							else					 refIdxL0_C <= (MBTypeGen_mbAddrC[1] == 1'b1)? 1'b1:1'b0;						end					else						refIdxL0_C <= 1'b0;					2:	//4x8					if (subMbPartIdx == 0)	refIdxL0_C <= refIdxL0_B;					else						begin							if 		(mb_num_v == 0)	 refIdxL0_C <= 1'b1;							else if (mb_num_h == 10) refIdxL0_C <= refIdxL0_B;							else					 refIdxL0_C <= (MBTypeGen_mbAddrC[1] == 1'b1)? 1'b1:1'b0;						end					3:	//4x4					case (subMbPartIdx)						0:refIdxL0_C <= refIdxL0_B;						1:						begin							if 		(mb_num_v == 0)	 refIdxL0_C <= 1'b1;							else if (mb_num_h == 10) refIdxL0_C <= refIdxL0_B;							else					 refIdxL0_C <= (MBTypeGen_mbAddrC[1] == 1'b1)? 1'b1:1'b0;						end						2,3:refIdxL0_C <= 1'b0;					endcase				endcase				2'b10:	//left-bottom 8x8 blk				case (sub_mb_type)					0:refIdxL0_C <= 1'b0;					1:refIdxL0_C <= (subMbPartIdx == 0)? 1'b0:refIdxL0_A;						2:refIdxL0_C <= 1'b0;					3:refIdxL0_C <= 1'b0;				endcase				2'b11:	//right-bottom 8x8 blk				refIdxL0_C <= 1'b0;			endcase		else			refIdxL0_C <= 1'b0;		//-------------	//mvpAx	//-------------	always @ (Is_skipMB_mv_calc or mb_pred_state or sub_mb_pred_state 		or mb_type_general or sub_mb_type or mbPartIdx or subMbPartIdx or compIdx 		or mvx_mbAddrA or mvx_CurrMb0 or mvx_CurrMb1 or mvx_CurrMb2 or mvx_CurrMb3		or refIdxL0_A or refIdxL0_B or refIdxL0_C)			//P_skip or Inter16x16		if (Is_skipMB_mv_calc || (mb_pred_state == `mvd_l0_s && mb_type_general == `MB_Inter16x16 && compIdx == 0))			mvpAx <= {8{~refIdxL0_A}} & mvx_mbAddrA[7:0];		//Inter16x8		else if (mb_pred_state == `mvd_l0_s && mb_type_general == `MB_Inter16x8 && compIdx == 0) 			begin				if (mbPartIdx == 0)					mvpAx <= {8{refIdxL0_B}} & mvx_mbAddrA[7:0];				else					mvpAx <= {8{~refIdxL0_A}} & mvx_mbAddrA[23:16]; 			end		//Inter8x16		else if (mb_pred_state == `mvd_l0_s && mb_type_general == `MB_Inter8x16 && compIdx == 0)			begin				if (mbPartIdx == 0)					mvpAx <= {8{~refIdxL0_A}}  & mvx_mbAddrA[7:0];				else					mvpAx <= {8{refIdxL0_C}} & mvx_CurrMb0[15:8];			end		//Inter8x8		else if (sub_mb_pred_state == `sub_mvd_l0_s && compIdx == 0)	//sub_mb_pred			case (mbPartIdx)				0:				case (sub_mb_type)					0:mvpAx <= {8{~refIdxL0_A}} & mvx_mbAddrA[7:0];					1:	//8x4					case (subMbPartIdx)						0:mvpAx <= {8{~refIdxL0_A}} & mvx_mbAddrA[7:0];						1:mvpAx <= {8{~refIdxL0_A}} & mvx_mbAddrA[15:8];						default:mvpAx <= 0;					endcase					2:	//4x8					case (subMbPartIdx)						0:mvpAx <= {8{~refIdxL0_A}} & mvx_mbAddrA[7:0]; 						1:mvpAx <= mvx_CurrMb0[7:0];						default:mvpAx <= 0;					endcase					3:	//4x4					case (subMbPartIdx)						0:mvpAx <= {8{~refIdxL0_A}} & mvx_mbAddrA[7:0];						1:mvpAx <= mvx_CurrMb0[7:0];						2:mvpAx <= {8{~refIdxL0_A}} & mvx_mbAddrA[15:8];						3:mvpAx <= mvx_CurrMb0[23:16]; 					endcase				endcase				1:				case (sub_mb_type)					0:mvpAx <= mvx_CurrMb0[15:8];					1:	//8x4					case (subMbPartIdx)						0:mvpAx <= mvx_CurrMb0[15:8];	1:mvpAx <= mvx_CurrMb0[31:24];						default:mvpAx <= 0;					endcase					2:	//4x8					case (subMbPartIdx)						0:mvpAx <= mvx_CurrMb0[15:8];	1:mvpAx <= mvx_CurrMb1[7:0];						default:mvpAx <= 0;					endcase					3:	//4x4					case (subMbPartIdx)						0:mvpAx <= mvx_CurrMb0[15:8] ;	1:mvpAx <= mvx_CurrMb1[7:0];						2:mvpAx <= mvx_CurrMb0[31:24];	3:mvpAx <= mvx_CurrMb1[23:16];						endcase				endcase				2:				case (sub_mb_type)					0:mvpAx <= {8{~refIdxL0_A}} & mvx_mbAddrA[23:16];					1:	//8x4					case (subMbPartIdx)						0:mvpAx <= {8{~refIdxL0_A}} & mvx_mbAddrA[23:16];						1:mvpAx <= {8{~refIdxL0_A}} & mvx_mbAddrA[31:24];						default:mvpAx <= 0;					endcase					2:	//4x8					case (subMbPartIdx)						0:mvpAx <= {8{~refIdxL0_A}} & mvx_mbAddrA[23:16];						1:mvpAx <= mvx_CurrMb2[7:0];						default:mvpAx <= 0;					endcase					3:	//4x4					case (subMbPartIdx)						0:mvpAx <= {8{~refIdxL0_A}} & mvx_mbAddrA[23:16];						1:mvpAx <= mvx_CurrMb2[7:0];						2:mvpAx <= {8{~refIdxL0_A}} & mvx_mbAddrA[31:24];						3:mvpAx <= mvx_CurrMb2[23:16]; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -