OpenCores
URL https://opencores.org/ocsvn/nova/nova/trunk

Subversion Repositories nova

[/] [nova/] [tags/] [Start/] [src/] [syntax_decoding.v] - Rev 11

Compare with Previous | Blame | View Log

//--------------------------------------------------------------------------------------------------
// Design    : nova
// Author(s) : Ke Xu
// Email	   : eexuke@yahoo.com
// File      : syntax_decoding.v
// Generated : May 23, 2005
// Copyright (C) 2008 Ke Xu                
//-------------------------------------------------------------------------------------------------
// Description 
// Decoding each sytax inside the bitstream
//-------------------------------------------------------------------------------------------------
 
// synopsys translate_off
`include "timescale.v"
// synopsys translate_on
`include "nova_defines.v"
 
module syntax_decoding (clk,reset_n,mb_num_h,mb_num_v,end_of_MB_DEC,pin_disable_DF,
	parser_state,nal_unit_state,seq_parameter_set_state,pic_parameter_set_state,
	slice_header_state,slice_data_state,mb_pred_state,sub_mb_pred_state,
	exp_golomb_decoding_output,BitStream_buffer_output,dependent_variable_decoding_output,mbPartIdx,
 
	nal_unit_type,start_code_prefix_found,
	deblocking_filter_control_present_flag,disable_deblocking_filter_idc,disable_DF,
	slice_alpha_c0_offset_div2,slice_beta_offset_div2,
	mb_skip_run,NumMbPart,NumSubMbPart,
	MBTypeGen_mbAddrA,MBTypeGen_mbAddrD,MBTypeGen_mbAddrB_reg,
	log2_max_frame_num_minus4,log2_max_pic_order_cnt_lsb_minus4,constrained_intra_pred_flag,
	num_ref_idx_active_override_flag,num_ref_idx_l0_active_minus1,
	slice_type,mb_type,mb_type_general,sub_mb_type,Intra16x16_predmode,intra_chroma_pred_mode,
	pic_init_qp_minus26,chroma_qp_index_offset,
	rem_intra4x4_pred_mode,prev_intra4x4_pred_mode_flag,mvd,mv_below8x8);
	input clk,reset_n;
	input [3:0] mb_num_h,mb_num_v;
	input end_of_MB_DEC; 
	input pin_disable_DF;
	input [1:0] parser_state;
	input [2:0] nal_unit_state;
	input [3:0] seq_parameter_set_state;
	input [3:0] pic_parameter_set_state;
	input [3:0] slice_header_state;
	input [3:0] slice_data_state;
	input [2:0] mb_pred_state;
	input [1:0] sub_mb_pred_state;
	input [15:0] BitStream_buffer_output;
	input [7:0] exp_golomb_decoding_output;
	input [9:0] dependent_variable_decoding_output;
	input [1:0] mbPartIdx; 
 
	output [4:0] nal_unit_type;
	output start_code_prefix_found;
	output deblocking_filter_control_present_flag;
	output [1:0] disable_deblocking_filter_idc;
	output disable_DF; 
	output [3:0] slice_alpha_c0_offset_div2;
	output [3:0] slice_beta_offset_div2;
	output [6:0] mb_skip_run;
	output [2:0] NumMbPart;
	output [2:0] NumSubMbPart;
	output [1:0] MBTypeGen_mbAddrA;
	output MBTypeGen_mbAddrD;
	output [21:0] MBTypeGen_mbAddrB_reg;
	output [3:0] log2_max_frame_num_minus4;
	output [3:0] log2_max_pic_order_cnt_lsb_minus4;
	output constrained_intra_pred_flag;
	output num_ref_idx_active_override_flag;
	output [2:0] num_ref_idx_l0_active_minus1;
	output [2:0] slice_type;
	output [4:0] mb_type;
	output [3:0] mb_type_general;
	output [1:0] Intra16x16_predmode;
	output [1:0] intra_chroma_pred_mode;
	output [1:0] sub_mb_type;
	output [5:0] pic_init_qp_minus26;
	output [4:0] chroma_qp_index_offset;
	output [2:0] rem_intra4x4_pred_mode;
	output prev_intra4x4_pred_mode_flag;
	output [7:0] mvd;
	output [3:0] mv_below8x8;
	//--------------------------
	//start_code_prefix
	//--------------------------
	reg start_code_prefix_found;
	always @ (parser_state or BitStream_buffer_output)
		if (parser_state == `start_code_prefix)
			begin
				if (BitStream_buffer_output == 16'b0000000000000001)
					start_code_prefix_found <= 1;
				else
					start_code_prefix_found <= 0;
			end
		else
			start_code_prefix_found <= 0;
	//--------------------------
	//nal_unit
	//--------------------------
	reg forbidden_zero_bit;
	reg [1:0] nal_ref_idc;
	reg [4:0] nal_unit_type_reg;
	wire [4:0] nal_unit_type;
	assign nal_unit_type = (nal_unit_state == `forbidden_zero_bit_2_nal_unit_type)? BitStream_buffer_output[12:8]:nal_unit_type_reg; 
	always @ (posedge clk)
		if (reset_n == 0)
			begin
				forbidden_zero_bit <= 0;
				nal_ref_idc        <= 0;
				nal_unit_type_reg  <= 0;
			end
		else if (nal_unit_state == `forbidden_zero_bit_2_nal_unit_type)
			begin
				forbidden_zero_bit <= BitStream_buffer_output[15];
				nal_ref_idc        <= BitStream_buffer_output[14:13];
				nal_unit_type_reg  <= nal_unit_type;
			end
	//--------------------------
	//seq_parameter_set
	//--------------------------
	reg [7:0] profile_idc;
	reg constraint_set0_flag,constraint_set1_flag,constraint_set2_flag,constraint_set3_flag;
	reg [3:0] reserved_zero_4bits;
	reg [7:0] level_idc;
	reg [4:0] seq_parameter_set_id_sps;
	reg [3:0] log2_max_frame_num_minus4;
	reg [1:0] pic_order_cnt_type;
	reg [3:0] log2_max_pic_order_cnt_lsb_minus4;
	reg [2:0] num_ref_frames; //however,we only support 1 reference frame currently
	reg gaps_in_frame_num_value_allowed_flag;
	reg [3:0] pic_width_in_mbs_minus1; 
	reg [3:0] pic_height_in_map_units_minus1;
	reg frame_mbs_only_flag;
	reg direct_8x8_inference_flag;
	reg frame_cropping_flag;
	reg vui_parameter_present_flag;
	always @ (posedge clk)
		if (reset_n == 0)
			begin
				profile_idc                          <= 0;
				constraint_set0_flag                 <= 0;
				constraint_set1_flag                 <= 0;		
				constraint_set2_flag                 <= 0;
				constraint_set3_flag                 <= 0;
				reserved_zero_4bits	                 <= 0;
				level_idc                            <= 0;
				seq_parameter_set_id_sps             <= 0;
				log2_max_frame_num_minus4            <= 0;
				pic_order_cnt_type                   <= 0;
				log2_max_pic_order_cnt_lsb_minus4    <= 0;
				num_ref_frames                       <= 0; 
				gaps_in_frame_num_value_allowed_flag <= 0;
				pic_width_in_mbs_minus1              <= 0; 
				pic_height_in_map_units_minus1       <= 0;
				frame_mbs_only_flag                  <= 0;
				direct_8x8_inference_flag            <= 0;
				frame_cropping_flag                  <= 0;
				vui_parameter_present_flag           <= 0;
			end
		else 
			case (seq_parameter_set_state)
				`fixed_header:
				begin
					profile_idc <= BitStream_buffer_output[15:8];
					constraint_set0_flag <= BitStream_buffer_output[7];
					constraint_set1_flag <= BitStream_buffer_output[6];
					constraint_set2_flag <= BitStream_buffer_output[5];
					constraint_set3_flag <= BitStream_buffer_output[4];
					reserved_zero_4bits  <= BitStream_buffer_output[3:0];
				end
				`level_idc_s                           :level_idc                            <= BitStream_buffer_output[15:8];
				`seq_parameter_set_id_sps_s            :seq_parameter_set_id_sps             <= exp_golomb_decoding_output[4:0];
				`log2_max_frame_num_minus4_s           :log2_max_frame_num_minus4            <= exp_golomb_decoding_output[3:0];
				`pic_order_cnt_type_s                  :pic_order_cnt_type                   <= exp_golomb_decoding_output[1:0];
				`log2_max_pic_order_cnt_lsb_minus4_s   :log2_max_pic_order_cnt_lsb_minus4    <= exp_golomb_decoding_output[3:0];
				`num_ref_frames_s                      :num_ref_frames                       <= exp_golomb_decoding_output[0];
				`gaps_in_frame_num_value_allowed_flag_s:gaps_in_frame_num_value_allowed_flag <= BitStream_buffer_output[15];
				`pic_width_in_mbs_minus1_s             :pic_width_in_mbs_minus1              <= exp_golomb_decoding_output[3:0];
				`pic_height_in_map_units_minus1_s      :pic_height_in_map_units_minus1       <= exp_golomb_decoding_output[3:0];
				`frame_mbs_only_flag_2_frame_cropping_flag:
				begin
					frame_mbs_only_flag       <= BitStream_buffer_output[15];
					direct_8x8_inference_flag <= BitStream_buffer_output[14];
					frame_cropping_flag       <= BitStream_buffer_output[13];
				end
				`vui_parameter_present_flag_s:vui_parameter_present_flag <= BitStream_buffer_output[15];
			endcase
	//--------------------------
	//pic_parameter_set
	//--------------------------
	reg [7:0] pic_parameter_set_id_pps;
	reg [4:0] seq_parameter_set_id_pps;
	reg entropy_coding_mode_flag;
	reg pic_order_present_flag;
	reg [2:0] num_slice_groups_minus1;
	reg [2:0] num_ref_idx_l0_active_minus1;
	reg [2:0] num_ref_idx_l1_active_minus1;
	reg weighted_pred_flag;
	reg [1:0] weighted_bipred_idc;
	reg [5:0] pic_init_qp_minus26,pic_init_qs_minus26;
	reg [4:0] chroma_qp_index_offset;
	reg deblocking_filter_control_present_flag;
	reg constrained_intra_pred_flag;
	reg redundant_pic_cnt_present_flag;
	always @ (posedge clk)
		if (reset_n == 0)
			begin
				pic_parameter_set_id_pps               <= 0;
				seq_parameter_set_id_pps               <= 0;
				entropy_coding_mode_flag               <= 0;
				pic_order_present_flag                 <= 0;
				num_slice_groups_minus1                <= 0;
				num_ref_idx_l0_active_minus1           <= 0;
				num_ref_idx_l1_active_minus1           <= 0;
				weighted_pred_flag                     <= 0;
				weighted_bipred_idc                    <= 0;
				pic_init_qp_minus26                    <= 0;
				pic_init_qs_minus26                    <= 0;
				chroma_qp_index_offset                 <= 0;
				deblocking_filter_control_present_flag <= 0;
				constrained_intra_pred_flag            <= 0;
				redundant_pic_cnt_present_flag         <= 0;
			end
		else 
			case (pic_parameter_set_state)
				`pic_parameter_set_id_pps_s:pic_parameter_set_id_pps <= exp_golomb_decoding_output[7:0];
				`seq_parameter_set_id_pps_s:seq_parameter_set_id_pps <= exp_golomb_decoding_output[4:0];
			 	`entropy_coding_mode_flag_2_pic_order_present_flag:
				begin
					entropy_coding_mode_flag <= BitStream_buffer_output[15];
					pic_order_present_flag   <= BitStream_buffer_output[14];
				end
			 	`num_slice_groups_minus1_s         :num_slice_groups_minus1 <= exp_golomb_decoding_output[2:0];
				`num_ref_idx_l0_active_minus1_pps_s:num_ref_idx_l0_active_minus1 <= exp_golomb_decoding_output[2:0];
				`num_ref_idx_l1_active_minus1_pps_s:num_ref_idx_l1_active_minus1 <= exp_golomb_decoding_output[2:0];
				`weighted_pred_flag_2_weighted_bipred_idc:
				begin
					weighted_pred_flag  <= BitStream_buffer_output[15];
					weighted_bipred_idc <= BitStream_buffer_output[14:13];
				end
				`pic_init_qp_minus26_s   :pic_init_qp_minus26 <= exp_golomb_decoding_output[5:0];
				`pic_init_qs_minus26_s   :pic_init_qs_minus26 <= exp_golomb_decoding_output[5:0];
				`chroma_qp_index_offset_s:chroma_qp_index_offset <= exp_golomb_decoding_output[4:0];
				`deblocking_filter_control_2_redundant_pic_cnt_present_flag:
				begin
					deblocking_filter_control_present_flag <= BitStream_buffer_output[15];
					constrained_intra_pred_flag            <= BitStream_buffer_output[14];
					redundant_pic_cnt_present_flag         <= BitStream_buffer_output[13];
				end
			endcase
	//--------------------------
	//slice_header
	//--------------------------
	reg first_mb_in_slice;
	reg [2:0] slice_type;
	reg [7:0] pic_parameter_set_id_slice_header;
	reg [3:0] frame_num;
	reg idr_pic_id;
	reg [9:0] pic_order_cnt_lsb;
	reg num_ref_idx_active_override_flag;
	reg [1:0] disable_deblocking_filter_idc;
	reg [3:0] slice_alpha_c0_offset_div2_dec;
	reg [3:0] slice_beta_offset_div2_dec;
	always @ (posedge clk)
		if (reset_n == 0)
			begin
				first_mb_in_slice                 <= 0;
				slice_type                        <= 0;
				pic_parameter_set_id_slice_header <= 0;
				frame_num                         <= 0;
				idr_pic_id                        <= 0;
				pic_order_cnt_lsb                 <= 0;
				num_ref_idx_active_override_flag  <= 0;
				disable_deblocking_filter_idc     <= 0;
				slice_alpha_c0_offset_div2_dec    <= 0;
				slice_beta_offset_div2_dec        <= 0;
			end
		else
			case (slice_header_state)
				`first_mb_in_slice_s                :first_mb_in_slice                 <= exp_golomb_decoding_output[0];
				`slice_type_s                       :slice_type                        <= exp_golomb_decoding_output[2:0];
				`pic_parameter_set_id_slice_header_s:pic_parameter_set_id_slice_header <= exp_golomb_decoding_output;
				`frame_num_s                        :frame_num                         <= dependent_variable_decoding_output[3:0];
				`idr_pic_id_s                       :idr_pic_id                        <= exp_golomb_decoding_output[0];
				`pic_order_cnt_lsb_s                :pic_order_cnt_lsb                 <= dependent_variable_decoding_output[9:0];
				`num_ref_idx_active_override_flag_s :num_ref_idx_active_override_flag  <= BitStream_buffer_output[15];
				//num_ref_idx_l0_active_minus1_slice_header_s:
				//slice_qp_delta_s:slice_qp_delta <= exp_golomb_decoding_output[5:0];
				`disable_deblocking_filter_idc_s    :disable_deblocking_filter_idc     <= exp_golomb_decoding_output[1:0];
				`slice_alpha_c0_offset_div2_s       :slice_alpha_c0_offset_div2_dec    <= exp_golomb_decoding_output[3:0];
				`slice_beta_offset_div2_s           :slice_beta_offset_div2_dec 	     <= exp_golomb_decoding_output[3:0];
				//slice_group_change_cycle_s:
			endcase
 
	wire [3:0] slice_alpha_c0_offset_div2;
	wire [3:0] slice_beta_offset_div2;
	assign slice_alpha_c0_offset_div2 = {4{deblocking_filter_control_present_flag}} & slice_alpha_c0_offset_div2_dec;
	assign slice_beta_offset_div2 	  = {4{deblocking_filter_control_present_flag}} & slice_beta_offset_div2_dec;
 
	reg sw_disable_DF;
	always @ (posedge clk)
		if (reset_n == 0)
			sw_disable_DF <= 0;
		else if (slice_header_state == `disable_deblocking_filter_idc_s && disable_deblocking_filter_idc == 1)
			sw_disable_DF <= 1;
		else
			sw_disable_DF <= 0;
 
	assign disable_DF = sw_disable_DF | pin_disable_DF; 
	//--------------------------
	//slice_data
	//--------------------------
	wire [6:0] mb_skip_run;
	reg [6:0] mb_skip_run_reg;
	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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.