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

📄 syntax_decoding.v

📁 H.264标准解码器全部verilog源码
💻 V
📖 第 1 页 / 共 2 页
字号:
	reg [4:0] mb_type;	reg [3:0] mb_type_general;	reg [3:0] mb_type_general_reg;	reg [1:0] Intra16x16_predmode;			//mb_type_general	assign mb_skip_run = (slice_data_state == `mb_skip_run_s)? exp_golomb_decoding_output[6:0]:mb_skip_run_reg; 	always @ (slice_data_state or slice_type or exp_golomb_decoding_output or mb_type_general_reg)		if (slice_data_state == `skip_run_duration)			mb_type_general <= `MB_P_skip;		else if (slice_data_state == `mb_type_s)			begin				if (slice_type == 2 || slice_type == 7)	//I slice					case (exp_golomb_decoding_output)						0:                      mb_type_general <= `MB_Intra4x4;						1,2,3,4,13,14,15,16:    mb_type_general <= `MB_Intra16x16_CBPChroma0;						5,6,7,8,17,18,19,20:    mb_type_general <= `MB_Intra16x16_CBPChroma1;						9,10,11,12,21,22,23,24: mb_type_general <= `MB_Intra16x16_CBPChroma2;						default:                mb_type_general <= `MB_Inter16x16;					endcase				else                                    //P slice					case (exp_golomb_decoding_output)						0:                      mb_type_general <= `MB_Inter16x16;						1:                      mb_type_general <= `MB_Inter16x8;						2:                      mb_type_general <= `MB_Inter8x16;						3:                      mb_type_general <= `MB_P_8x8;						4:                      mb_type_general <= `MB_P_8x8ref0;						5:                      mb_type_general <= `MB_Intra4x4;						6,7,8,9,18,19,20,21:    mb_type_general <= `MB_Intra16x16_CBPChroma0;						10,11,12,13,22,23,24,25:mb_type_general <= `MB_Intra16x16_CBPChroma1;						14,15,16,17,26,27,28,29:mb_type_general <= `MB_Intra16x16_CBPChroma0;						default:                mb_type_general <= `MB_Inter16x8;					endcase			end		else			mb_type_general <= mb_type_general_reg;				//Intra16x16_predmode	always @ (posedge clk)		if (reset_n == 0)			Intra16x16_predmode <= 2'b0;		else if (slice_data_state == `mb_type_s)			begin				if (slice_type == 2 || slice_type == 7)	//I slice					begin						if (exp_golomb_decoding_output != 0)							case (exp_golomb_decoding_output[1:0])								2'b00:Intra16x16_predmode <= 2'b11;								2'b01:Intra16x16_predmode <= 2'b00;								2'b10:Intra16x16_predmode <= 2'b01;								2'b11:Intra16x16_predmode <= 2'b10;							endcase					end				else if (exp_golomb_decoding_output[4:0] > 5) //P slice					case (exp_golomb_decoding_output[1:0])						2'b00:Intra16x16_predmode <= 2'b10;						2'b01:Intra16x16_predmode <= 2'b11;						2'b10:Intra16x16_predmode <= 2'b00;						2'b11:Intra16x16_predmode <= 2'b01;					endcase			end		always @ (posedge clk)		if (reset_n == 0)			begin				mb_skip_run_reg <= 0;				mb_type <= 0;				mb_type_general_reg <= `MB_type_rst;			end		else 			case (slice_data_state)				`mb_skip_run_s:mb_skip_run_reg <= mb_skip_run;				`skip_run_duration:				begin					mb_type <= 5'd31;					mb_type_general_reg <= mb_type_general;				end				`mb_type_s:				begin					mb_type <= exp_golomb_decoding_output[4:0];					mb_type_general_reg <= mb_type_general;				end				//pcm_byte_s: --> Currently no deal with it				//coded_block_pattern_s: --> See CodedBlockPattern_decoding.v				//mb_qp_delta_s:mb_qp_delta <= exp_golomb_decoding_output;			endcase	//Update MBTypeGen information	reg [1:0] MBTypeGen_mbAddrA;	reg MBTypeGen_mbAddrD_tmp;	reg MBTypeGen_mbAddrD;	reg [21:0] MBTypeGen_mbAddrB_reg;	always @ (posedge clk)		if (reset_n == 0)			begin				MBTypeGen_mbAddrA <= 0;				MBTypeGen_mbAddrD_tmp <= 0;				MBTypeGen_mbAddrB_reg <= 0;			end		else if (slice_data_state == `skip_run_duration && end_of_MB_DEC)//for P_skip			begin				if (mb_num_h != 10)					MBTypeGen_mbAddrA <= `MB_addrA_addrB_P_skip;				if (mb_num_h == 9)					MBTypeGen_mbAddrD_tmp <= 1'b0;				if (mb_num_v != 8)					case (mb_num_h)						0:MBTypeGen_mbAddrB_reg[1:0]    <= `MB_addrA_addrB_P_skip;1:MBTypeGen_mbAddrB_reg[3:2] 	 <= `MB_addrA_addrB_P_skip;						2:MBTypeGen_mbAddrB_reg[5:4]    <= `MB_addrA_addrB_P_skip;3:MBTypeGen_mbAddrB_reg[7:6] 	 <= `MB_addrA_addrB_P_skip;						4:MBTypeGen_mbAddrB_reg[9:8]    <= `MB_addrA_addrB_P_skip;5:MBTypeGen_mbAddrB_reg[11:10] <= `MB_addrA_addrB_P_skip;						6:MBTypeGen_mbAddrB_reg[13:12] 	<= `MB_addrA_addrB_P_skip;7:MBTypeGen_mbAddrB_reg[15:14] <= `MB_addrA_addrB_P_skip;						8:MBTypeGen_mbAddrB_reg[17:16] 	<= `MB_addrA_addrB_P_skip;9:MBTypeGen_mbAddrB_reg[19:18] <= `MB_addrA_addrB_P_skip;						10:MBTypeGen_mbAddrB_reg[21:20]	<= `MB_addrA_addrB_P_skip;					endcase			end		else if (slice_data_state == `mb_num_update)			begin				if (mb_num_h != 10)					begin						if (mb_type_general[3] == 1'b0)							MBTypeGen_mbAddrA <= `MB_addrA_addrB_Inter;						else if (mb_type_general[3:2] == 2'b10)							MBTypeGen_mbAddrA <= `MB_addrA_addrB_Intra16x16;						else if (mb_type_general == `MB_Intra4x4)							MBTypeGen_mbAddrA <= `MB_addrA_addrB_Intra4x4;					end				if (mb_num_h == 9)					MBTypeGen_mbAddrD_tmp <= mb_type_general[3];				if (mb_num_v != 8)					begin						if (mb_type_general[3] == 1'b0)							case (mb_num_h)								0:MBTypeGen_mbAddrB_reg[1:0]   <= `MB_addrA_addrB_Inter; 1:MBTypeGen_mbAddrB_reg[3:2]   <= `MB_addrA_addrB_Inter;								2:MBTypeGen_mbAddrB_reg[5:4]   <= `MB_addrA_addrB_Inter; 3:MBTypeGen_mbAddrB_reg[7:6]   <= `MB_addrA_addrB_Inter;								4:MBTypeGen_mbAddrB_reg[9:8]   <= `MB_addrA_addrB_Inter; 5:MBTypeGen_mbAddrB_reg[11:10] <= `MB_addrA_addrB_Inter;								6:MBTypeGen_mbAddrB_reg[13:12] <= `MB_addrA_addrB_Inter; 7:MBTypeGen_mbAddrB_reg[15:14] <= `MB_addrA_addrB_Inter;								8:MBTypeGen_mbAddrB_reg[17:16] <= `MB_addrA_addrB_Inter; 9:MBTypeGen_mbAddrB_reg[19:18] <= `MB_addrA_addrB_Inter;								10:MBTypeGen_mbAddrB_reg[21:20]<= `MB_addrA_addrB_Inter;							endcase						else if (mb_type_general[3:2] == 2'b10)							case (mb_num_h)								0:MBTypeGen_mbAddrB_reg[1:0]   <= `MB_addrA_addrB_Intra16x16; 1:MBTypeGen_mbAddrB_reg[3:2]   <= `MB_addrA_addrB_Intra16x16;								2:MBTypeGen_mbAddrB_reg[5:4]   <= `MB_addrA_addrB_Intra16x16; 3:MBTypeGen_mbAddrB_reg[7:6]   <= `MB_addrA_addrB_Intra16x16;								4:MBTypeGen_mbAddrB_reg[9:8]   <= `MB_addrA_addrB_Intra16x16; 5:MBTypeGen_mbAddrB_reg[11:10] <= `MB_addrA_addrB_Intra16x16;								6:MBTypeGen_mbAddrB_reg[13:12] <= `MB_addrA_addrB_Intra16x16; 7:MBTypeGen_mbAddrB_reg[15:14] <= `MB_addrA_addrB_Intra16x16;								8:MBTypeGen_mbAddrB_reg[17:16] <= `MB_addrA_addrB_Intra16x16; 9:MBTypeGen_mbAddrB_reg[19:18] <= `MB_addrA_addrB_Intra16x16;								10:MBTypeGen_mbAddrB_reg[21:20]<= `MB_addrA_addrB_Intra16x16;							endcase						else if (mb_type_general == `MB_Intra4x4)							case (mb_num_h)								0:MBTypeGen_mbAddrB_reg[1:0]   <= `MB_addrA_addrB_Intra4x4;	1:MBTypeGen_mbAddrB_reg[3:2]   <= `MB_addrA_addrB_Intra4x4;								2:MBTypeGen_mbAddrB_reg[5:4]   <= `MB_addrA_addrB_Intra4x4;	3:MBTypeGen_mbAddrB_reg[7:6]   <= `MB_addrA_addrB_Intra4x4;								4:MBTypeGen_mbAddrB_reg[9:8]   <= `MB_addrA_addrB_Intra4x4;	5:MBTypeGen_mbAddrB_reg[11:10] <= `MB_addrA_addrB_Intra4x4;								6:MBTypeGen_mbAddrB_reg[13:12] <= `MB_addrA_addrB_Intra4x4; 7:MBTypeGen_mbAddrB_reg[15:14] <= `MB_addrA_addrB_Intra4x4;								8:MBTypeGen_mbAddrB_reg[17:16] <= `MB_addrA_addrB_Intra4x4; 9:MBTypeGen_mbAddrB_reg[19:18] <= `MB_addrA_addrB_Intra4x4;								10:MBTypeGen_mbAddrB_reg[21:20]<= `MB_addrA_addrB_Intra4x4;							endcase					end			end		always @ (posedge clk)		if (reset_n == 1'b0)			MBTypeGen_mbAddrD <= 0;		else if (mb_num_h == 0)			MBTypeGen_mbAddrD <= MBTypeGen_mbAddrD_tmp;		//----------------------------------------------------------------------	//mb_pred & sub_mb_pred		//	--> Also refer to Intra4x4_PredMode_decoding.v & Inter_mv_decoding.v	//----------------------------------------------------------------------	wire prev_intra4x4_pred_mode_flag;	reg prev_intra4x4_pred_mode_flag_reg;	wire [2:0] rem_intra4x4_pred_mode;	reg [2:0] rem_intra4x4_pred_mode_reg;	reg [1:0] intra_chroma_pred_mode;	wire [7:0] mvd;	reg [7:0] mvd_reg;	reg [7:0] sub_mb_type_reg;	assign prev_intra4x4_pred_mode_flag = (mb_pred_state == `prev_intra4x4_pred_mode_flag_s)? BitStream_buffer_output[15]:prev_intra4x4_pred_mode_flag_reg;	assign rem_intra4x4_pred_mode = (mb_pred_state == `rem_intra4x4_pred_mode_s)? BitStream_buffer_output[15:13]:rem_intra4x4_pred_mode_reg;		assign mvd = ((mb_pred_state == `mvd_l0_s) || (sub_mb_pred_state == `sub_mvd_l0_s))? exp_golomb_decoding_output[7:0]:mvd_reg;					always @ (posedge clk)		if (reset_n == 0)			begin				prev_intra4x4_pred_mode_flag_reg <= 0;				rem_intra4x4_pred_mode_reg       <= 0;				intra_chroma_pred_mode           <= 0;				mvd_reg                          <= 0;				sub_mb_type_reg                  <= 0;			end		else			begin				case (mb_pred_state)					`prev_intra4x4_pred_mode_flag_s:prev_intra4x4_pred_mode_flag_reg <= prev_intra4x4_pred_mode_flag;					`rem_intra4x4_pred_mode_s      :rem_intra4x4_pred_mode_reg       <= rem_intra4x4_pred_mode;					`intra_chroma_pred_mode_s      :intra_chroma_pred_mode           <= exp_golomb_decoding_output[1:0];					//ref_idx_l0_s: --> only 1 reference frame,so never jump into this state					`mvd_l0_s:	mvd_reg <= mvd;				endcase				case (sub_mb_pred_state)					`sub_mb_type_s:					case (mbPartIdx)						0:sub_mb_type_reg[1:0] <= exp_golomb_decoding_output[1:0];						1:sub_mb_type_reg[3:2] <= exp_golomb_decoding_output[1:0];						2:sub_mb_type_reg[5:4] <= exp_golomb_decoding_output[1:0];						3:sub_mb_type_reg[7:6] <= exp_golomb_decoding_output[1:0];					endcase					//sub_ref_idx_l0_s: --> only 1 reference frame,so never jump into this state					`sub_mvd_l0_s: mvd_reg <= mvd;				endcase			end	reg [2:0] NumMbPart;	reg [2:0] NumSubMbPart;	reg [1:0] sub_mb_type;	always @ (sub_mb_pred_state or sub_mb_type_reg or mbPartIdx)		if (sub_mb_pred_state == `sub_mvd_l0_s)			case (mbPartIdx)				0:sub_mb_type <= sub_mb_type_reg[1:0]; 				1:sub_mb_type <= sub_mb_type_reg[3:2];				2:sub_mb_type <= sub_mb_type_reg[5:4];				3:sub_mb_type <= sub_mb_type_reg[7:6];			endcase		else			sub_mb_type <= 0;							 	always @ (mb_pred_state or mb_type_general or sub_mb_pred_state)		if (mb_pred_state == `mvd_l0_s)			case (mb_type_general)				0:NumMbPart <= 3'd1;				default:NumMbPart <= 3'd2;			endcase		else if (sub_mb_pred_state == `sub_mvd_l0_s)			NumMbPart <= 3'd4;		else 			NumMbPart <= 3'd0;		always @ (sub_mb_pred_state or mbPartIdx or sub_mb_type_reg)		if (sub_mb_pred_state == `sub_mvd_l0_s)			case (mbPartIdx)				0:				case (sub_mb_type_reg[1:0])					2'b00      :NumSubMbPart <= 3'd1;					2'b01,2'b10:NumSubMbPart <= 3'd2;					2'b11      :NumSubMbPart <= 3'd4;				endcase				1:				case (sub_mb_type_reg[3:2])					2'b00      :NumSubMbPart <= 3'd1;					2'b01,2'b10:NumSubMbPart <= 3'd2;					2'b11      :NumSubMbPart <= 3'd4;				endcase				2:				case (sub_mb_type_reg[5:4])					2'b00      :NumSubMbPart <= 3'd1;					2'b01,2'b10:NumSubMbPart <= 3'd2;					2'b11      :NumSubMbPart <= 3'd4;				endcase				3:				case (sub_mb_type_reg[7:6])					2'b00      :NumSubMbPart <= 3'd1;					2'b01,2'b10:NumSubMbPart <= 3'd2;					2'b11      :NumSubMbPart <= 3'd4;				endcase			endcase		else			NumSubMbPart <= 0;				//mv_below8x8	reg [3:0] mv_below8x8; 	always @ (posedge clk)		if (reset_n == 1'b0)			mv_below8x8 <= 4'b0;		else if (sub_mb_pred_state == `sub_mb_type_s)			case (mbPartIdx)				0:mv_below8x8[0] <= (exp_golomb_decoding_output[1:0] == 2'b00)? 1'b0:1'b1; 				1:mv_below8x8[1] <= (exp_golomb_decoding_output[1:0] == 2'b00)? 1'b0:1'b1; 				2:mv_below8x8[2] <= (exp_golomb_decoding_output[1:0] == 2'b00)? 1'b0:1'b1; 				3:mv_below8x8[3] <= (exp_golomb_decoding_output[1:0] == 2'b00)? 1'b0:1'b1; 			endcase		else if (slice_data_state == `mb_pred || slice_data_state == `skip_run_duration)			mv_below8x8 <= 4'b0;			endmodule																																																																																														

⌨️ 快捷键说明

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