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

📄 bitstream_parser_fsm_gating.v

📁 a H.264/AVC Baseline Decoder
💻 V
📖 第 1 页 / 共 2 页
字号:
				assign Is_skip_run_end = (slice_data_state == `skip_run_duration && end_of_MB_DEC && (mb_num == 98 || count_mb_skip_run == (mb_skip_run - 1)))? 1'b1:1'b0;				always @ (posedge gclk_slice_data or negedge reset_n)		if (reset_n == 0)			begin				slice_data_state 	<= `rst_slice_data;				mb_pred_state 		<= `rst_mb_pred;				sub_mb_pred_state <= `rst_sub_mb_pred;			end		else			case (slice_data_state)				`rst_slice_data   :slice_data_state <= (slice_type != 3'b111)? `mb_skip_run_s:`mb_type_s; 				`mb_skip_run_s    :slice_data_state <= (mb_skip_run == 0)? `mb_type_s:`skip_run_duration;				`skip_run_duration:slice_data_state <= (mb_num == 98)? `rst_slice_data:(count_mb_skip_run < (mb_skip_run - 1))? `skip_run_duration:`mb_type_s;				`mb_type_s        :slice_data_state <= (mb_type_general == `MB_P_8x8 || mb_type_general == `MB_P_8x8ref0)? `sub_mb_pred:`mb_pred;				`sub_mb_pred:				case (sub_mb_pred_state)					`rst_sub_mb_pred:sub_mb_pred_state <= `sub_mb_type_s;					`sub_mb_type_s	:sub_mb_pred_state <= (mbPartIdx == 2'b11)? `sub_mvd_l0_s:`sub_mb_type_s; 					`sub_mvd_l0_s:					if (mbPartIdx == 2'b11 && {1'b0,subMbPartIdx} == (NumSubMbPart - 1) && compIdx == 1'b1)						begin							sub_mb_pred_state <= `rst_sub_mb_pred;							slice_data_state  <= `coded_block_pattern_s;						end				endcase				`mb_pred:				case (mb_pred_state)					`rst_mb_pred:					if (mb_type_general[3] == 1'b1) //Intra						mb_pred_state <= (mb_type_general == `MB_Intra4x4)? `prev_intra4x4_pred_mode_flag_s:`intra_chroma_pred_mode_s;					else						mb_pred_state  <= `mvd_l0_s;					`prev_intra4x4_pred_mode_flag_s:					mb_pred_state <= (prev_intra4x4_pred_mode_flag == 1'b0)? `rem_intra4x4_pred_mode_s:									 (luma4x4BlkIdx == 4'b1111)? `intra_chroma_pred_mode_s:`prev_intra4x4_pred_mode_flag_s; 					`rem_intra4x4_pred_mode_s:					mb_pred_state <= (luma4x4BlkIdx == 4'b1111)? `intra_chroma_pred_mode_s:`prev_intra4x4_pred_mode_flag_s; 					`intra_chroma_pred_mode_s:					begin						mb_pred_state    <= `rst_mb_pred;						slice_data_state <= (mb_type_general[3:2] != 2'b10)? `coded_block_pattern_s:`mb_qp_delta_s;					end					`mvd_l0_s:					if ({1'b0,mbPartIdx} == (NumMbPart - 1) && compIdx == 1'b1)						begin							mb_pred_state    <= `rst_mb_pred;							slice_data_state <= `coded_block_pattern_s;						end				endcase				`coded_block_pattern_s:slice_data_state <= (CodedBlockPatternLuma == 0 && CodedBlockPatternChroma == 0)? `residual:`mb_qp_delta_s;				`mb_qp_delta_s:				slice_data_state <= (CodedBlockPatternLuma == 0 && CodedBlockPatternChroma == 0 && mb_type_general[3:2] != 2'b10)? `mb_num_update:`residual;				`residual:slice_data_state <= `mb_num_update;				`mb_num_update:slice_data_state <= `rst_slice_data;			endcase	//---------------	//residual_state	//---------------	always @ (posedge gclk_residual or negedge reset_n)		if (reset_n == 1'b0)			residual_state <= `rst_residual;		else			case (residual_state)				`rst_residual:				if (mb_type_general[3] == 1'b1 && mb_type_general != `MB_Intra4x4)//Intra16x16					residual_state <= `Intra16x16DCLevel_s;				else					residual_state <= (CodedBlockPatternLuma == 0)? `LumaLevel_0_s:`LumaLevel_s; 				`Intra16x16DCLevel_s:residual_state <= (CodedBlockPatternLuma == 0)? `Intra16x16ACLevel_0_s:`Intra16x16ACLevel_s;				`Intra16x16ACLevel_s,`Intra16x16ACLevel_0_s,`LumaLevel_s,`LumaLevel_0_s:				residual_state <= (CodedBlockPatternChroma == 0)? `ChromaACLevel_0_s:`ChromaDCLevel_Cb_s;				`ChromaDCLevel_Cb_s:residual_state <= `ChromaDCLevel_Cr_s;    				`ChromaDCLevel_Cr_s:residual_state <= (CodedBlockPatternChroma == 2'b01)? `ChromaACLevel_0_s:`ChromaACLevel_Cb_s;				`ChromaACLevel_Cb_s:residual_state <= `ChromaACLevel_Cr_s;					`ChromaACLevel_Cr_s:residual_state <= `rst_residual;				`ChromaACLevel_0_s :residual_state <= `rst_residual;			endcase	//--------------------	//cavlc_decoder_state	//--------------------	always @ (posedge gclk_cavlc or negedge reset_n)		if (reset_n == 1'b0)			cavlc_decoder_state <= `rst_cavlc_decoder;		else			case (cavlc_decoder_state)				`rst_cavlc_decoder	:cavlc_decoder_state <= `nAnB_decoding_s;				`nAnB_decoding_s		:cavlc_decoder_state <= `nC_decoding_s;				`nC_decoding_s		:cavlc_decoder_state <= `NumCoeffTrailingOnes_LUT;				`NumCoeffTrailingOnes_LUT://add trigger_CAVLC to trap a special case:after all-zero CrDC2x2 CAVLC decoding.										              //Without adding trigger_CAVLC here,the gclk_cavlc can not catch trigger_CAVLC										              //because it rises up too early (rise up at NumCoeffTrailingOnes_LUT instead of rst_cavlc_decoder)				cavlc_decoder_state <= (TotalCoeff == 0)? ((trigger_CAVLC)? `nAnB_decoding_s:`rst_cavlc_decoder):(TrailingOnes == 0)? `LevelPrefix:`TrailingOnesSignFlag; 				`TrailingOnesSignFlag:cavlc_decoder_state <= (TotalCoeff == {3'b0,TrailingOnes})?`total_zeros_LUT:`LevelPrefix;				`LevelPrefix         :cavlc_decoder_state <= `LevelSuffix;				`LevelSuffix         :cavlc_decoder_state <= ({1'b0,i_level} == TotalCoeff-1)? ((TotalCoeff == maxNumCoeff)?`LevelRunCombination:`total_zeros_LUT):`LevelPrefix;				`total_zeros_LUT	   :cavlc_decoder_state <= (TotalCoeff == 1)? `RunOfZeros:`run_before_LUT; 				`run_before_LUT	     :cavlc_decoder_state <= `RunOfZeros;				`RunOfZeros		       :cavlc_decoder_state <= ({1'b0,i_run} == (TotalCoeff - 1) || {1'b0,i_run} == (TotalCoeff - 2) || zerosLeft == 0)? `LevelRunCombination:`run_before_LUT;				`LevelRunCombination :cavlc_decoder_state <= (i_TotalCoeff == 0)? `rst_cavlc_decoder:`LevelRunCombination;			endcase	assign heading_one_en = (							seq_parameter_set_state == `seq_parameter_set_id_sps_s ||							seq_parameter_set_state == `log2_max_frame_num_minus4_s ||							seq_parameter_set_state == `pic_order_cnt_type_s ||							seq_parameter_set_state == `log2_max_pic_order_cnt_lsb_minus4_s ||							seq_parameter_set_state == `num_ref_frames_s ||							seq_parameter_set_state == `pic_width_in_mbs_minus1_s ||							seq_parameter_set_state == `pic_height_in_map_units_minus1_s ||							pic_parameter_set_state == `pic_parameter_set_id_pps_s ||							pic_parameter_set_state == `seq_parameter_set_id_pps_s ||							pic_parameter_set_state == `num_slice_groups_minus1_s || 							pic_parameter_set_state == `num_ref_idx_l0_active_minus1_pps_s ||							pic_parameter_set_state == `num_ref_idx_l1_active_minus1_pps_s ||							pic_parameter_set_state == `pic_init_qp_minus26_s ||							pic_parameter_set_state == `pic_init_qs_minus26_s ||							pic_parameter_set_state == `chroma_qp_index_offset_s ||							slice_header_state == `first_mb_in_slice_s || 							slice_header_state == `slice_type_s || 							slice_header_state == `pic_parameter_set_id_slice_header_s ||							slice_header_state == `idr_pic_id_s ||							slice_header_state == `num_ref_idx_l0_active_minus1_slice_header_s ||							slice_header_state == `slice_qp_delta_s || 							slice_header_state == `disable_deblocking_filter_idc_s || 							slice_header_state == `slice_alpha_c0_offset_div2_s || 							slice_header_state == `slice_beta_offset_div2_s || 							slice_data_state == `mb_skip_run_s ||							slice_data_state == `mb_type_s ||							slice_data_state == `coded_block_pattern_s || 							slice_data_state == `mb_qp_delta_s || 							mb_pred_state == `intra_chroma_pred_mode_s || 							mb_pred_state == `mvd_l0_s ||							sub_mb_pred_state == `sub_mb_type_s ||							sub_mb_pred_state == `sub_mvd_l0_s ||							cavlc_decoder_state == `NumCoeffTrailingOnes_LUT ||							cavlc_decoder_state == `LevelPrefix || 							cavlc_decoder_state == `total_zeros_LUT)? 1'b0:1'b1;		//count_mb_skip_run	always @ (posedge gclk_slice_data or negedge reset_n)		if (reset_n == 1'b0)			count_mb_skip_run <= 1'b0;		else if (slice_data_state == `skip_run_duration)			count_mb_skip_run <= (mb_num == 98)? 0:(count_mb_skip_run < (mb_skip_run - 1))? (count_mb_skip_run + 1):0;				assign NextMB_IsSkip  = (slice_data_state == `skip_run_duration && (count_mb_skip_run < (mb_skip_run - 1)))? 1'b1:1'b0; 		reg LowerMB_IsSkip;	always @ (slice_data_state or mb_skip_run or count_mb_skip_run)		if (slice_data_state == `skip_run_duration)			begin 				if (mb_skip_run < 13)					LowerMB_IsSkip <= 1'b0;				else					LowerMB_IsSkip <= (count_mb_skip_run < (mb_skip_run - 12))? 1'b1:1'b0;			end		else			LowerMB_IsSkip <= 1'b0;		//mb_num_h	always @ (posedge gclk_slice_data or negedge reset_n)		if (reset_n == 1'b0)			mb_num_h <= 0;		else if (slice_data_state == `skip_run_duration || slice_data_state == `mb_num_update)			mb_num_h <= (mb_num_h == 10) ? 0:(mb_num_h + 1);		//mb_num_v	always @ (posedge gclk_slice_data or negedge reset_n)		if (reset_n == 1'b0)			mb_num_v <= 0;		else if ((slice_data_state == `skip_run_duration || slice_data_state == `mb_num_update) && mb_num_h == 10)			mb_num_v <= (mb_num_v == 8) ? 0:(mb_num_v + 1);		//mb_num	always @ (posedge gclk_slice_data or negedge reset_n)		if (reset_n == 1'b0)			mb_num <= 0;		else if (slice_data_state == `skip_run_duration || slice_data_state == `mb_num_update)			mb_num <= (mb_num == 98)? 0:(mb_num + 1);				//pic_num	always @ (posedge gclk_slice_data or negedge reset_n)		if (reset_n == 1'b0)			pic_num <= 0;		else if ((slice_data_state == `skip_run_duration || slice_data_state == `mb_num_update) && mb_num == 98)			pic_num <= pic_num + 1;		//luma4x4BlkIdx	always @ (posedge gclk_slice_data or negedge reset_n)		if (reset_n == 1'b0)			luma4x4BlkIdx <= 0;		else			case (mb_pred_state)				`prev_intra4x4_pred_mode_flag_s:				if (prev_intra4x4_pred_mode_flag == 1'b1)					luma4x4BlkIdx <= (luma4x4BlkIdx == 4'b1111)? 0:(luma4x4BlkIdx + 1);				`rem_intra4x4_pred_mode_s:luma4x4BlkIdx <= (luma4x4BlkIdx == 4'b1111)? 0:(luma4x4BlkIdx + 1);			endcase		//mbPartIdx	always @ (posedge gclk_slice_data or negedge reset_n)		if (reset_n == 1'b0)			mbPartIdx <= 0;		else if (mb_pred_state == `mvd_l0_s && compIdx == 1'b1)			mbPartIdx <= ({1'b0,mbPartIdx} < (NumMbPart-1))? (mbPartIdx + 1):0;		else if (sub_mb_pred_state == `sub_mb_type_s)			mbPartIdx <= (mbPartIdx == 2'b11)? 0:(mbPartIdx + 1);		else if (sub_mb_pred_state == `sub_mvd_l0_s && {1'b0,subMbPartIdx} == NumSubMbPart - 1 && compIdx == 1'b1)			mbPartIdx <= (mbPartIdx == 2'b11)? 0:(mbPartIdx + 1);		//subMbPartIdx	always @ (posedge gclk_slice_data or negedge reset_n)		if (reset_n == 1'b0)			subMbPartIdx <= 0;		else if (sub_mb_pred_state == `sub_mvd_l0_s && compIdx == 1'b1)			subMbPartIdx <= ({1'b0,subMbPartIdx} < NumSubMbPart-1)? (subMbPartIdx + 1):0;		//compIdx	always @ (posedge gclk_slice_data or negedge reset_n)		if (reset_n == 1'b0)			compIdx <= 0;		else if (mb_pred_state == `mvd_l0_s || sub_mb_pred_state == `sub_mvd_l0_s)			compIdx <= ~ compIdx;		//i8x8	always @ (posedge clk)		if (reset_n == 1'b0)			i8x8 <= 0;		else if (slice_data_state == `residual && residual_state == `rst_residual && mb_type_general != `MB_Intra16x16_CBPChroma0 && mb_type_general != `MB_Intra16x16_CBPChroma1 && mb_type_general != `MB_Intra16x16_CBPChroma2)			i8x8 <= 0;		else if ((residual_state == `Intra16x16ACLevel_s || residual_state == `LumaLevel_s) && end_of_one_blk4x4_sum == 1 && i4x4 == 2'b11)			i8x8 <= (i8x8 == 2'b11)? 0:(i8x8 + 1);		//i4x4	always @ (posedge clk)		if (reset_n == 1'b0)			i4x4 <= 0;		else if ((residual_state == `Intra16x16ACLevel_s || residual_state == `LumaLevel_s) && end_of_one_blk4x4_sum == 1)			i4x4 <= (i4x4 == 2'b11)? 0:(i4x4 + 1);				//i4x4_CbCr	always @ (posedge clk)		if (reset_n == 1'b0)			i4x4_CbCr <= 0;		else if ((residual_state == `ChromaACLevel_Cb_s || residual_state == `ChromaACLevel_Cr_s) && end_of_one_blk4x4_sum == 1'b1) 			i4x4_CbCr <= (i4x4_CbCr == 2'b11)? 0:(i4x4_CbCr + 1);		//suffix_length_initialized	always @ (posedge gclk_cavlc or negedge reset_n)		if (reset_n == 1'b0)			suffix_length_initialized <= 1'b0;		else if (cavlc_decoder_state == `rst_cavlc_decoder)			suffix_length_initialized <= 1'b0;		else if (cavlc_decoder_state == `LevelPrefix)			suffix_length_initialized <= 1'b1;				//i_level	always @ (posedge gclk_cavlc or negedge reset_n)		if (reset_n == 1'b0)			i_level <= 0;		else if (cavlc_decoder_state == `NumCoeffTrailingOnes_LUT)			i_level <= 0;		else if (cavlc_decoder_state == `TrailingOnesSignFlag)			i_level <= i_level + TrailingOnes;		else if (cavlc_decoder_state == `LevelSuffix && {1'b0,i_level} != (TotalCoeff-1))			i_level <= i_level + 1;				//i_run	always @ (posedge gclk_cavlc or negedge reset_n)		if (reset_n == 1'b0)			i_run <= 0;		else if (cavlc_decoder_state == `total_zeros_LUT)			i_run <= 0;		else if (cavlc_decoder_state == `RunOfZeros && {1'b0,i_run} != (TotalCoeff - 1) && {1'b0,i_run} != (TotalCoeff - 2) && zerosLeft != 0)			i_run <= i_run + 1;				//i_TotalCoeff	always @ (posedge gclk_cavlc or negedge reset_n)		if (reset_n == 1'b0)		   i_TotalCoeff <= 0;  		//enter from LevelSuffix		else if (cavlc_decoder_state == `LevelSuffix && {1'b0,i_level} == (TotalCoeff-1) && TotalCoeff == maxNumCoeff)		   i_TotalCoeff <= TotalCoeff - 1;		//enter from RunOfZeros		else if (cavlc_decoder_state == `RunOfZeros && ({1'b0,i_run} == (TotalCoeff - 1) || {1'b0,i_run} == (TotalCoeff - 2) || zerosLeft == 0))			i_TotalCoeff <= TotalCoeff - 1;  		//Inside LevelRunCombination loop		else if (cavlc_decoder_state == `LevelRunCombination && i_TotalCoeff != 0)			i_TotalCoeff <= i_TotalCoeff-1; 		//coeffNum	always @ (cavlc_decoder_state or run or coeffNum_reg)	   if (cavlc_decoder_state == `nAnB_decoding_s)	      coeffNum <= 4'b1111;	   else if (cavlc_decoder_state == `LevelRunCombination)	      coeffNum <= coeffNum_reg + run + 1;	   else 	      coeffNum <= coeffNum_reg;	    			always @ (posedge gclk_cavlc or negedge reset_n)		if (reset_n == 1'b0)			coeffNum_reg <= 0;		else 			coeffNum_reg <= coeffNum;			//IsRunLoop	always @ (posedge gclk_cavlc or negedge reset_n)		if (reset_n == 1'b0)			IsRunLoop <= 0;		else if (cavlc_decoder_state == `RunOfZeros)			IsRunLoop <= ({1'b0,i_run} == TotalCoeff - 1 || {1'b0,i_run} == TotalCoeff - 2 || zerosLeft == 0)? 1'b0:1'b1;			endmodule																														

⌨️ 快捷键说明

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