📄 bitstream_parser_fsm_gating.v
字号:
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 + -