1 |
2 |
eexuke |
//--------------------------------------------------------------------------------------------------
|
2 |
|
|
// Design : nova
|
3 |
|
|
// Author(s) : Ke Xu
|
4 |
|
|
// Email : eexuke@yahoo.com
|
5 |
|
|
// File : BitStream_parser_FSM_gating.v
|
6 |
|
|
// Generated : June 26,2005
|
7 |
|
|
// Copyright (C) 2008 Ke Xu
|
8 |
|
|
//-------------------------------------------------------------------------------------------------
|
9 |
|
|
// Description
|
10 |
|
|
// BitStream_parser_FSM,clock gating version
|
11 |
|
|
//-------------------------------------------------------------------------------------------------
|
12 |
|
|
|
13 |
|
|
// synopsys translate_off
|
14 |
|
|
`include "timescale.v"
|
15 |
|
|
// synopsys translate_on
|
16 |
|
|
`include "nova_defines.v"
|
17 |
|
|
|
18 |
|
|
module BitStream_parser_FSM (clk,reset_n,end_of_one_blk4x4_sum,end_of_MB_DEC,
|
19 |
|
|
gclk_parser,gclk_nal,gclk_slice,gclk_sps,gclk_pps,gclk_slice_header,
|
20 |
|
|
gclk_slice_data,gclk_residual,gclk_cavlc,
|
21 |
|
|
trigger_CAVLC,BitStream_buffer_valid_n,nal_unit_type,
|
22 |
|
|
slice_type,num_ref_idx_active_override_flag,
|
23 |
|
|
deblocking_filter_control_present_flag,disable_deblocking_filter_idc,
|
24 |
|
|
mb_skip_run,mb_type_general,prev_intra4x4_pred_mode_flag,CodedBlockPatternLuma,
|
25 |
|
|
CodedBlockPatternChroma,pc_2to0,NumSubMbPart,NumMbPart,
|
26 |
|
|
TotalCoeff,TrailingOnes,maxNumCoeff,zerosLeft,run,
|
27 |
|
|
|
28 |
|
|
parser_state,nal_unit_state,slice_layer_wo_partitioning_state,slice_header_state,slice_header_s6,
|
29 |
|
|
ref_pic_list_reordering_state,dec_ref_pic_marking_state,slice_data_state,sub_mb_pred_state,
|
30 |
|
|
mb_pred_state,seq_parameter_set_state,pic_parameter_set_state,residual_state,cavlc_decoder_state,
|
31 |
|
|
heading_one_en,pic_num,mb_num,mb_num_h,mb_num_v,
|
32 |
|
|
NextMB_IsSkip,LowerMB_IsSkip,Is_skip_run_entry,Is_skip_run_end,
|
33 |
|
|
luma4x4BlkIdx,mbPartIdx,subMbPartIdx,compIdx,i8x8,i4x4,i4x4_CbCr,
|
34 |
|
|
coeffNum,i_level,i_run,i_TotalCoeff,
|
35 |
|
|
suffix_length_initialized,IsRunLoop);
|
36 |
|
|
input clk;
|
37 |
|
|
input reset_n;
|
38 |
|
|
input end_of_one_blk4x4_sum;
|
39 |
|
|
input end_of_MB_DEC;
|
40 |
|
|
input gclk_parser;
|
41 |
|
|
input gclk_nal;
|
42 |
|
|
input gclk_slice;
|
43 |
|
|
input gclk_sps;
|
44 |
|
|
input gclk_pps;
|
45 |
|
|
input gclk_slice_header;
|
46 |
|
|
input gclk_slice_data;
|
47 |
|
|
input gclk_residual;
|
48 |
|
|
input gclk_cavlc;
|
49 |
|
|
input trigger_CAVLC;
|
50 |
|
|
input BitStream_buffer_valid_n;
|
51 |
|
|
input [4:0] nal_unit_type;
|
52 |
|
|
input [2:0] slice_type;
|
53 |
|
|
input num_ref_idx_active_override_flag;
|
54 |
|
|
input deblocking_filter_control_present_flag;
|
55 |
|
|
input [1:0] disable_deblocking_filter_idc;
|
56 |
|
|
input [6:0] mb_skip_run;
|
57 |
|
|
input [3:0] mb_type_general;
|
58 |
|
|
input prev_intra4x4_pred_mode_flag;
|
59 |
|
|
input [3:0] CodedBlockPatternLuma;
|
60 |
|
|
input [1:0] CodedBlockPatternChroma;
|
61 |
|
|
input [2:0] pc_2to0;
|
62 |
|
|
input [2:0] NumMbPart;
|
63 |
|
|
input [2:0] NumSubMbPart;
|
64 |
|
|
input [4:0] TotalCoeff;
|
65 |
|
|
input [1:0] TrailingOnes;
|
66 |
|
|
input [4:0] maxNumCoeff;
|
67 |
|
|
input [3:0] zerosLeft;
|
68 |
|
|
input [3:0] run;
|
69 |
|
|
|
70 |
|
|
output [1:0] parser_state;
|
71 |
|
|
output [2:0] nal_unit_state;
|
72 |
|
|
output [1:0] slice_layer_wo_partitioning_state;
|
73 |
|
|
output [3:0] slice_header_state;
|
74 |
|
|
output slice_header_s6;
|
75 |
|
|
output [2:0] ref_pic_list_reordering_state;
|
76 |
|
|
output [1:0] dec_ref_pic_marking_state;
|
77 |
|
|
output [3:0] slice_data_state;
|
78 |
|
|
output [1:0] sub_mb_pred_state;
|
79 |
|
|
output [2:0] mb_pred_state;
|
80 |
|
|
output [3:0] seq_parameter_set_state;
|
81 |
|
|
output [3:0] pic_parameter_set_state;
|
82 |
|
|
output [3:0] residual_state;
|
83 |
|
|
output [3:0] cavlc_decoder_state;
|
84 |
|
|
output heading_one_en;
|
85 |
|
|
output [5:0] pic_num;
|
86 |
|
|
output [6:0] mb_num;
|
87 |
|
|
output [3:0] mb_num_h;
|
88 |
|
|
output [3:0] mb_num_v;
|
89 |
|
|
output NextMB_IsSkip;
|
90 |
|
|
output LowerMB_IsSkip;
|
91 |
|
|
output Is_skip_run_entry;
|
92 |
|
|
output Is_skip_run_end;
|
93 |
|
|
output [3:0] luma4x4BlkIdx;
|
94 |
|
|
output [1:0] mbPartIdx;
|
95 |
|
|
output [1:0] subMbPartIdx;
|
96 |
|
|
output compIdx;
|
97 |
|
|
output [1:0] i8x8,i4x4;
|
98 |
|
|
output [1:0] i4x4_CbCr;
|
99 |
|
|
output [3:0] coeffNum;
|
100 |
|
|
output [3:0] i_level;
|
101 |
|
|
output [3:0] i_run;
|
102 |
|
|
output [3:0] i_TotalCoeff;
|
103 |
|
|
output suffix_length_initialized;
|
104 |
|
|
output IsRunLoop;
|
105 |
|
|
|
106 |
|
|
reg [1:0] parser_state;
|
107 |
|
|
reg [2:0] nal_unit_state;
|
108 |
|
|
reg [1:0] slice_layer_wo_partitioning_state;
|
109 |
|
|
reg [3:0] seq_parameter_set_state;
|
110 |
|
|
reg [3:0] pic_parameter_set_state;
|
111 |
|
|
reg [3:0] slice_header_state;
|
112 |
|
|
reg [2:0] ref_pic_list_reordering_state;
|
113 |
|
|
reg [1:0] dec_ref_pic_marking_state;
|
114 |
|
|
reg [3:0] slice_data_state;
|
115 |
|
|
reg [2:0] mb_pred_state;
|
116 |
|
|
reg [1:0] sub_mb_pred_state;
|
117 |
|
|
reg [3:0] residual_state;
|
118 |
|
|
reg [3:0] cavlc_decoder_state;
|
119 |
|
|
|
120 |
|
|
wire heading_one_en;
|
121 |
|
|
reg [6:0] mb_num;
|
122 |
|
|
reg [3:0] mb_num_h;
|
123 |
|
|
reg [3:0] mb_num_v;
|
124 |
|
|
reg [1:0] mbPartIdx;
|
125 |
|
|
reg [1:0] subMbPartIdx;
|
126 |
|
|
reg compIdx;
|
127 |
|
|
reg [1:0] i8x8,i4x4;
|
128 |
|
|
reg [1:0] i4x4_CbCr;
|
129 |
|
|
reg [3:0] coeffNum;
|
130 |
|
|
reg [3:0] coeffNum_reg;
|
131 |
|
|
reg [3:0] i_level,i_run,i_TotalCoeff;
|
132 |
|
|
reg [6:0] count_mb_skip_run;//number of MBs to be skipped
|
133 |
|
|
reg [7:0] count_pcm_byte;
|
134 |
|
|
reg [3:0] luma4x4BlkIdx;
|
135 |
|
|
reg [5:0] pic_num;
|
136 |
|
|
reg suffix_length_initialized;
|
137 |
|
|
reg IsRunLoop;
|
138 |
|
|
|
139 |
|
|
/*
|
140 |
|
|
// synopsys translate_off
|
141 |
|
|
integer tracefile;
|
142 |
|
|
initial
|
143 |
|
|
begin
|
144 |
|
|
tracefile = $fopen("trace.txt");
|
145 |
|
|
end
|
146 |
|
|
// synopsys translate_on
|
147 |
|
|
*/
|
148 |
|
|
|
149 |
|
|
//--------------
|
150 |
|
|
//parser_state
|
151 |
|
|
//--------------
|
152 |
|
|
always @ (posedge gclk_parser or negedge reset_n)
|
153 |
|
|
if (reset_n == 0)
|
154 |
|
|
parser_state <= `rst_parser;
|
155 |
|
|
else
|
156 |
|
|
case (parser_state)
|
157 |
|
|
`rst_parser :parser_state <= (BitStream_buffer_valid_n == 1'b0)? `start_code_prefix:`rst_parser;
|
158 |
|
|
`start_code_prefix:parser_state <= `nal_unit;
|
159 |
|
|
`nal_unit :parser_state <= `rst_parser;
|
160 |
|
|
endcase
|
161 |
|
|
//---------------
|
162 |
|
|
//nal_unit_state
|
163 |
|
|
//---------------
|
164 |
|
|
always @ (posedge gclk_nal or negedge reset_n)
|
165 |
|
|
if (reset_n == 0)
|
166 |
|
|
nal_unit_state <= `rst_nal_unit;
|
167 |
|
|
else
|
168 |
|
|
case (nal_unit_state)
|
169 |
|
|
`rst_nal_unit:nal_unit_state <= `forbidden_zero_bit_2_nal_unit_type;
|
170 |
|
|
`forbidden_zero_bit_2_nal_unit_type:
|
171 |
|
|
case (nal_unit_type)
|
172 |
|
|
5'b00001:nal_unit_state <= `slice_layer_non_IDR_rbsp;
|
173 |
|
|
5'b00101:nal_unit_state <= `slice_layer_IDR_rbsp;
|
174 |
|
|
5'b00111:nal_unit_state <= `seq_parameter_set_rbsp;
|
175 |
|
|
5'b01000:nal_unit_state <= `pic_parameter_set_rbsp;
|
176 |
|
|
endcase
|
177 |
|
|
`slice_layer_non_IDR_rbsp,`slice_layer_IDR_rbsp:nal_unit_state <= `rbsp_trailing_one_bit;
|
178 |
|
|
`seq_parameter_set_rbsp :nal_unit_state <= `rbsp_trailing_one_bit;
|
179 |
|
|
`pic_parameter_set_rbsp :nal_unit_state <= `rbsp_trailing_one_bit;
|
180 |
|
|
`rbsp_trailing_one_bit :nal_unit_state <= (pc_2to0 == 3'b000)? `rst_nal_unit:`rbsp_trailing_zero_bits;
|
181 |
|
|
`rbsp_trailing_zero_bits:nal_unit_state <= `rst_nal_unit;
|
182 |
|
|
endcase
|
183 |
|
|
//----------------------------------
|
184 |
|
|
//slice_layer_wo_partitioning_state
|
185 |
|
|
//----------------------------------
|
186 |
|
|
always @ (posedge gclk_slice or negedge reset_n)
|
187 |
|
|
if (reset_n == 1'b0)
|
188 |
|
|
slice_layer_wo_partitioning_state <= `rst_slice_layer_wo_partitioning;
|
189 |
|
|
else
|
190 |
|
|
case (slice_layer_wo_partitioning_state)
|
191 |
|
|
`rst_slice_layer_wo_partitioning :slice_layer_wo_partitioning_state <= `slice_header;
|
192 |
|
|
`slice_header :slice_layer_wo_partitioning_state <= `slice_data;
|
193 |
|
|
`slice_data :slice_layer_wo_partitioning_state <= `rst_slice_layer_wo_partitioning;
|
194 |
|
|
endcase
|
195 |
|
|
//------------------------
|
196 |
|
|
//seq_parameter_set_state
|
197 |
|
|
//------------------------
|
198 |
|
|
always @ (posedge gclk_sps or negedge reset_n)
|
199 |
|
|
if (reset_n == 0)
|
200 |
|
|
seq_parameter_set_state <= `rst_seq_parameter_set;
|
201 |
|
|
else
|
202 |
|
|
case (seq_parameter_set_state)
|
203 |
|
|
`rst_seq_parameter_set :seq_parameter_set_state <= `fixed_header;
|
204 |
|
|
`fixed_header :seq_parameter_set_state <= `level_idc_s;
|
205 |
|
|
`level_idc_s :seq_parameter_set_state <= `seq_parameter_set_id_sps_s;
|
206 |
|
|
`seq_parameter_set_id_sps_s :seq_parameter_set_state <= `log2_max_frame_num_minus4_s;
|
207 |
|
|
`log2_max_frame_num_minus4_s :seq_parameter_set_state <= `pic_order_cnt_type_s;
|
208 |
|
|
`pic_order_cnt_type_s :seq_parameter_set_state <= `log2_max_pic_order_cnt_lsb_minus4_s;
|
209 |
|
|
`log2_max_pic_order_cnt_lsb_minus4_s :seq_parameter_set_state <= `num_ref_frames_s;
|
210 |
|
|
`num_ref_frames_s :seq_parameter_set_state <= `gaps_in_frame_num_value_allowed_flag_s;
|
211 |
|
|
`gaps_in_frame_num_value_allowed_flag_s :seq_parameter_set_state <= `pic_width_in_mbs_minus1_s;
|
212 |
|
|
`pic_width_in_mbs_minus1_s :seq_parameter_set_state <= `pic_height_in_map_units_minus1_s;
|
213 |
|
|
`pic_height_in_map_units_minus1_s :seq_parameter_set_state <= `frame_mbs_only_flag_2_frame_cropping_flag;
|
214 |
|
|
`frame_mbs_only_flag_2_frame_cropping_flag:seq_parameter_set_state <= `vui_parameter_present_flag_s;
|
215 |
|
|
`vui_parameter_present_flag_s :seq_parameter_set_state <= `rst_seq_parameter_set;
|
216 |
|
|
endcase
|
217 |
|
|
//------------------------
|
218 |
|
|
//pic_parameter_set_state
|
219 |
|
|
//------------------------
|
220 |
|
|
always @ (posedge gclk_pps or negedge reset_n)
|
221 |
|
|
if (reset_n == 0)
|
222 |
|
|
pic_parameter_set_state <= `rst_pic_parameter_set;
|
223 |
|
|
else
|
224 |
|
|
case (pic_parameter_set_state)
|
225 |
|
|
`rst_pic_parameter_set :pic_parameter_set_state <= `pic_parameter_set_id_pps_s;
|
226 |
|
|
`pic_parameter_set_id_pps_s :pic_parameter_set_state <= `seq_parameter_set_id_pps_s;
|
227 |
|
|
`seq_parameter_set_id_pps_s :pic_parameter_set_state <= `entropy_coding_mode_flag_2_pic_order_present_flag;
|
228 |
|
|
`entropy_coding_mode_flag_2_pic_order_present_flag :pic_parameter_set_state <= `num_slice_groups_minus1_s;
|
229 |
|
|
`num_slice_groups_minus1_s :pic_parameter_set_state <= `num_ref_idx_l0_active_minus1_pps_s;
|
230 |
|
|
`num_ref_idx_l0_active_minus1_pps_s :pic_parameter_set_state <= `num_ref_idx_l1_active_minus1_pps_s;
|
231 |
|
|
`num_ref_idx_l1_active_minus1_pps_s :pic_parameter_set_state <= `weighted_pred_flag_2_weighted_bipred_idc;
|
232 |
|
|
`weighted_pred_flag_2_weighted_bipred_idc :pic_parameter_set_state <= `pic_init_qp_minus26_s;
|
233 |
|
|
`pic_init_qp_minus26_s :pic_parameter_set_state <= `pic_init_qs_minus26_s;
|
234 |
|
|
`pic_init_qs_minus26_s :pic_parameter_set_state <= `chroma_qp_index_offset_s;
|
235 |
|
|
`chroma_qp_index_offset_s :pic_parameter_set_state <= `deblocking_filter_control_2_redundant_pic_cnt_present_flag;
|
236 |
|
|
`deblocking_filter_control_2_redundant_pic_cnt_present_flag:pic_parameter_set_state <= `rst_pic_parameter_set;
|
237 |
|
|
endcase
|
238 |
|
|
//-------------------
|
239 |
|
|
//slice_header_state
|
240 |
|
|
//-------------------
|
241 |
|
|
always @ (posedge gclk_slice_header or negedge reset_n)
|
242 |
|
|
if (reset_n == 0)
|
243 |
|
|
begin
|
244 |
|
|
slice_header_state <= `rst_slice_header;
|
245 |
|
|
ref_pic_list_reordering_state <= `rst_ref_pic_list_reordering;
|
246 |
|
|
dec_ref_pic_marking_state <= `rst_dec_ref_pic_marking;
|
247 |
|
|
end
|
248 |
|
|
else
|
249 |
|
|
case (slice_header_state)
|
250 |
|
|
`rst_slice_header :slice_header_state <= `first_mb_in_slice_s;
|
251 |
|
|
`first_mb_in_slice_s :slice_header_state <= `slice_type_s;
|
252 |
|
|
`slice_type_s :slice_header_state <= `pic_parameter_set_id_slice_header_s;
|
253 |
|
|
`pic_parameter_set_id_slice_header_s:slice_header_state <= `frame_num_s;
|
254 |
|
|
`frame_num_s:
|
255 |
|
|
if (nal_unit_type == 5'b00101) slice_header_state <= `idr_pic_id_s;
|
256 |
|
|
else slice_header_state <= `pic_order_cnt_lsb_s;
|
257 |
|
|
`idr_pic_id_s :slice_header_state <= `pic_order_cnt_lsb_s;
|
258 |
|
|
`pic_order_cnt_lsb_s:
|
259 |
|
|
if (slice_type == 3'b101) slice_header_state <= `num_ref_idx_active_override_flag_s;
|
260 |
|
|
else slice_header_state <= `dec_ref_pic_marking;
|
261 |
|
|
`num_ref_idx_active_override_flag_s:
|
262 |
|
|
if (num_ref_idx_active_override_flag == 1'b1) slice_header_state <= `num_ref_idx_l0_active_minus1_slice_header_s;
|
263 |
|
|
else slice_header_state <= `ref_pic_list_reordering;
|
264 |
|
|
`num_ref_idx_l0_active_minus1_slice_header_s :slice_header_state <= `ref_pic_list_reordering;
|
265 |
|
|
`ref_pic_list_reordering:
|
266 |
|
|
case (ref_pic_list_reordering_state)
|
267 |
|
|
`rst_ref_pic_list_reordering:
|
268 |
|
|
if (slice_type == 3'b101)
|
269 |
|
|
ref_pic_list_reordering_state <= `ref_pic_list_reordering_flag_l0_s;
|
270 |
|
|
else
|
271 |
|
|
begin
|
272 |
|
|
ref_pic_list_reordering_state <= `rst_ref_pic_list_reordering;
|
273 |
|
|
slice_header_state <= `dec_ref_pic_marking;
|
274 |
|
|
end
|
275 |
|
|
`ref_pic_list_reordering_flag_l0_s:
|
276 |
|
|
begin
|
277 |
|
|
ref_pic_list_reordering_state <= `rst_ref_pic_list_reordering;
|
278 |
|
|
slice_header_state <= `dec_ref_pic_marking;
|
279 |
|
|
end
|
280 |
|
|
endcase
|
281 |
|
|
`dec_ref_pic_marking:
|
282 |
|
|
case (dec_ref_pic_marking_state)
|
283 |
|
|
`rst_dec_ref_pic_marking:
|
284 |
|
|
dec_ref_pic_marking_state <= (nal_unit_type == 3'b101)? `no_output_of_prior_pics_flag_2_long_term_reference_flag:`adaptive_ref_pic_marking_mode_flag_s;
|
285 |
|
|
`no_output_of_prior_pics_flag_2_long_term_reference_flag:
|
286 |
|
|
begin
|
287 |
|
|
dec_ref_pic_marking_state <= `rst_dec_ref_pic_marking;
|
288 |
|
|
slice_header_state <= `slice_qp_delta_s;
|
289 |
|
|
end
|
290 |
|
|
`adaptive_ref_pic_marking_mode_flag_s:
|
291 |
|
|
begin
|
292 |
|
|
dec_ref_pic_marking_state <= `rst_dec_ref_pic_marking;
|
293 |
|
|
slice_header_state <= `slice_qp_delta_s;
|
294 |
|
|
end
|
295 |
|
|
endcase
|
296 |
|
|
`slice_qp_delta_s:
|
297 |
|
|
slice_header_state <= (deblocking_filter_control_present_flag == 1'b1)? `disable_deblocking_filter_idc_s:`rst_slice_header;
|
298 |
|
|
`disable_deblocking_filter_idc_s:
|
299 |
|
|
slice_header_state <= (disable_deblocking_filter_idc != 2'b01)? `slice_alpha_c0_offset_div2_s:`rst_slice_header;
|
300 |
|
|
`slice_alpha_c0_offset_div2_s:slice_header_state <= `slice_beta_offset_div2_s;
|
301 |
|
|
`slice_beta_offset_div2_s :slice_header_state <= `rst_slice_header;
|
302 |
|
|
endcase
|
303 |
|
|
|
304 |
|
|
assign slice_header_s6 = (slice_header_state == `frame_num_s)? 1'b1:1'b0;
|
305 |
|
|
//------------------
|
306 |
|
|
//slice_data_state
|
307 |
|
|
//------------------
|
308 |
|
|
reg Is_skip_run_entry; //for trigger inter pred.Originally it's a wire type which will trigger inter_pred signal too early
|
309 |
|
|
//than expected:cause inter_pred rise up before mv_below8x8 is set to 4'b0 for P_skip.Thus the
|
310 |
|
|
//preload_counter after inter_pred will sample wrong mv_below8x8/mv_below8x8_curr.
|
311 |
|
|
//Then it is changed to reg type to appear one cycle later @ May 15,2006
|
312 |
|
|
wire Is_skip_run_end; //for stop triggering inter pred
|
313 |
|
|
|
314 |
|
|
always @ (posedge clk)
|
315 |
|
|
if (reset_n == 1'b0)
|
316 |
|
|
Is_skip_run_entry <= 1'b0;
|
317 |
|
|
else if (slice_data_state == `mb_skip_run_s && mb_skip_run != 0)
|
318 |
|
|
Is_skip_run_entry <= 1'b1;
|
319 |
|
|
else
|
320 |
|
|
Is_skip_run_entry <= 1'b0;
|
321 |
|
|
|
322 |
|
|
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;
|
323 |
|
|
|
324 |
|
|
always @ (posedge gclk_slice_data or negedge reset_n)
|
325 |
|
|
if (reset_n == 0)
|
326 |
|
|
begin
|
327 |
|
|
slice_data_state <= `rst_slice_data;
|
328 |
|
|
mb_pred_state <= `rst_mb_pred;
|
329 |
|
|
sub_mb_pred_state <= `rst_sub_mb_pred;
|
330 |
|
|
end
|
331 |
|
|
else
|
332 |
|
|
case (slice_data_state)
|
333 |
|
|
`rst_slice_data :slice_data_state <= (slice_type != 3'b111)? `mb_skip_run_s:`mb_type_s;
|
334 |
|
|
`mb_skip_run_s :slice_data_state <= (mb_skip_run == 0)? `mb_type_s:`skip_run_duration;
|
335 |
|
|
`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;
|
336 |
|
|
`mb_type_s :slice_data_state <= (mb_type_general == `MB_P_8x8 || mb_type_general == `MB_P_8x8ref0)? `sub_mb_pred:`mb_pred;
|
337 |
|
|
`sub_mb_pred:
|
338 |
|
|
case (sub_mb_pred_state)
|
339 |
|
|
`rst_sub_mb_pred:sub_mb_pred_state <= `sub_mb_type_s;
|
340 |
|
|
`sub_mb_type_s :sub_mb_pred_state <= (mbPartIdx == 2'b11)? `sub_mvd_l0_s:`sub_mb_type_s;
|
341 |
|
|
`sub_mvd_l0_s:
|
342 |
|
|
if (mbPartIdx == 2'b11 && {1'b0,subMbPartIdx} == (NumSubMbPart - 1) && compIdx == 1'b1)
|
343 |
|
|
begin
|
344 |
|
|
sub_mb_pred_state <= `rst_sub_mb_pred;
|
345 |
|
|
slice_data_state <= `coded_block_pattern_s;
|
346 |
|
|
end
|
347 |
|
|
endcase
|
348 |
|
|
`mb_pred:
|
349 |
|
|
case (mb_pred_state)
|
350 |
|
|
`rst_mb_pred:
|
351 |
|
|
if (mb_type_general[3] == 1'b1) //Intra
|
352 |
|
|
mb_pred_state <= (mb_type_general == `MB_Intra4x4)? `prev_intra4x4_pred_mode_flag_s:`intra_chroma_pred_mode_s;
|
353 |
|
|
else
|
354 |
|
|
mb_pred_state <= `mvd_l0_s;
|
355 |
|
|
`prev_intra4x4_pred_mode_flag_s:
|
356 |
|
|
mb_pred_state <= (prev_intra4x4_pred_mode_flag == 1'b0)? `rem_intra4x4_pred_mode_s:
|
357 |
|
|
(luma4x4BlkIdx == 4'b1111)? `intra_chroma_pred_mode_s:`prev_intra4x4_pred_mode_flag_s;
|
358 |
|
|
`rem_intra4x4_pred_mode_s:
|
359 |
|
|
mb_pred_state <= (luma4x4BlkIdx == 4'b1111)? `intra_chroma_pred_mode_s:`prev_intra4x4_pred_mode_flag_s;
|
360 |
|
|
`intra_chroma_pred_mode_s:
|
361 |
|
|
begin
|
362 |
|
|
mb_pred_state <= `rst_mb_pred;
|
363 |
|
|
slice_data_state <= (mb_type_general[3:2] != 2'b10)? `coded_block_pattern_s:`mb_qp_delta_s;
|
364 |
|
|
end
|
365 |
|
|
`mvd_l0_s:
|
366 |
|
|
if ({1'b0,mbPartIdx} == (NumMbPart - 1) && compIdx == 1'b1)
|
367 |
|
|
begin
|
368 |
|
|
mb_pred_state <= `rst_mb_pred;
|
369 |
|
|
slice_data_state <= `coded_block_pattern_s;
|
370 |
|
|
end
|
371 |
|
|
endcase
|
372 |
|
|
`coded_block_pattern_s:slice_data_state <= (CodedBlockPatternLuma == 0 && CodedBlockPatternChroma == 0)? `residual:`mb_qp_delta_s;
|
373 |
|
|
`mb_qp_delta_s:
|
374 |
|
|
slice_data_state <= (CodedBlockPatternLuma == 0 && CodedBlockPatternChroma == 0 && mb_type_general[3:2] != 2'b10)? `mb_num_update:`residual;
|
375 |
|
|
`residual:slice_data_state <= `mb_num_update;
|
376 |
|
|
`mb_num_update:slice_data_state <= `rst_slice_data;
|
377 |
|
|
endcase
|
378 |
|
|
//---------------
|
379 |
|
|
//residual_state
|
380 |
|
|
//---------------
|
381 |
|
|
always @ (posedge gclk_residual or negedge reset_n)
|
382 |
|
|
if (reset_n == 1'b0)
|
383 |
|
|
residual_state <= `rst_residual;
|
384 |
|
|
else
|
385 |
|
|
case (residual_state)
|
386 |
|
|
`rst_residual:
|
387 |
|
|
if (mb_type_general[3] == 1'b1 && mb_type_general != `MB_Intra4x4)//Intra16x16
|
388 |
|
|
residual_state <= `Intra16x16DCLevel_s;
|
389 |
|
|
else
|
390 |
|
|
residual_state <= (CodedBlockPatternLuma == 0)? `LumaLevel_0_s:`LumaLevel_s;
|
391 |
|
|
`Intra16x16DCLevel_s:residual_state <= (CodedBlockPatternLuma == 0)? `Intra16x16ACLevel_0_s:`Intra16x16ACLevel_s;
|
392 |
|
|
`Intra16x16ACLevel_s,`Intra16x16ACLevel_0_s,`LumaLevel_s,`LumaLevel_0_s:
|
393 |
|
|
residual_state <= (CodedBlockPatternChroma == 0)? `ChromaACLevel_0_s:`ChromaDCLevel_Cb_s;
|
394 |
|
|
`ChromaDCLevel_Cb_s:residual_state <= `ChromaDCLevel_Cr_s;
|
395 |
|
|
`ChromaDCLevel_Cr_s:residual_state <= (CodedBlockPatternChroma == 2'b01)? `ChromaACLevel_0_s:`ChromaACLevel_Cb_s;
|
396 |
|
|
`ChromaACLevel_Cb_s:residual_state <= `ChromaACLevel_Cr_s;
|
397 |
|
|
`ChromaACLevel_Cr_s:residual_state <= `rst_residual;
|
398 |
|
|
`ChromaACLevel_0_s :residual_state <= `rst_residual;
|
399 |
|
|
endcase
|
400 |
|
|
//--------------------
|
401 |
|
|
//cavlc_decoder_state
|
402 |
|
|
//--------------------
|
403 |
|
|
always @ (posedge gclk_cavlc or negedge reset_n)
|
404 |
|
|
if (reset_n == 1'b0)
|
405 |
|
|
cavlc_decoder_state <= `rst_cavlc_decoder;
|
406 |
|
|
else
|
407 |
|
|
case (cavlc_decoder_state)
|
408 |
|
|
`rst_cavlc_decoder :cavlc_decoder_state <= `nAnB_decoding_s;
|
409 |
|
|
`nAnB_decoding_s :cavlc_decoder_state <= `nC_decoding_s;
|
410 |
|
|
`nC_decoding_s :cavlc_decoder_state <= `NumCoeffTrailingOnes_LUT;
|
411 |
|
|
`NumCoeffTrailingOnes_LUT://add trigger_CAVLC to trap a special case:after all-zero CrDC2x2 CAVLC decoding.
|
412 |
|
|
//Without adding trigger_CAVLC here,the gclk_cavlc can not catch trigger_CAVLC
|
413 |
|
|
//because it rises up too early (rise up at NumCoeffTrailingOnes_LUT instead of rst_cavlc_decoder)
|
414 |
|
|
cavlc_decoder_state <= (TotalCoeff == 0)? ((trigger_CAVLC)? `nAnB_decoding_s:`rst_cavlc_decoder):(TrailingOnes == 0)? `LevelPrefix:`TrailingOnesSignFlag;
|
415 |
|
|
`TrailingOnesSignFlag:cavlc_decoder_state <= (TotalCoeff == {3'b0,TrailingOnes})?`total_zeros_LUT:`LevelPrefix;
|
416 |
|
|
`LevelPrefix :cavlc_decoder_state <= `LevelSuffix;
|
417 |
|
|
`LevelSuffix :cavlc_decoder_state <= ({1'b0,i_level} == TotalCoeff-1)? ((TotalCoeff == maxNumCoeff)?`LevelRunCombination:`total_zeros_LUT):`LevelPrefix;
|
418 |
|
|
`total_zeros_LUT :cavlc_decoder_state <= (TotalCoeff == 1)? `RunOfZeros:`run_before_LUT;
|
419 |
|
|
`run_before_LUT :cavlc_decoder_state <= `RunOfZeros;
|
420 |
|
|
`RunOfZeros :cavlc_decoder_state <= ({1'b0,i_run} == (TotalCoeff - 1) || {1'b0,i_run} == (TotalCoeff - 2) || zerosLeft == 0)? `LevelRunCombination:`run_before_LUT;
|
421 |
|
|
`LevelRunCombination :cavlc_decoder_state <= (i_TotalCoeff == 0)? `rst_cavlc_decoder:`LevelRunCombination;
|
422 |
|
|
endcase
|
423 |
|
|
assign heading_one_en = (
|
424 |
|
|
seq_parameter_set_state == `seq_parameter_set_id_sps_s ||
|
425 |
|
|
seq_parameter_set_state == `log2_max_frame_num_minus4_s ||
|
426 |
|
|
seq_parameter_set_state == `pic_order_cnt_type_s ||
|
427 |
|
|
seq_parameter_set_state == `log2_max_pic_order_cnt_lsb_minus4_s ||
|
428 |
|
|
seq_parameter_set_state == `num_ref_frames_s ||
|
429 |
|
|
seq_parameter_set_state == `pic_width_in_mbs_minus1_s ||
|
430 |
|
|
seq_parameter_set_state == `pic_height_in_map_units_minus1_s ||
|
431 |
|
|
pic_parameter_set_state == `pic_parameter_set_id_pps_s ||
|
432 |
|
|
pic_parameter_set_state == `seq_parameter_set_id_pps_s ||
|
433 |
|
|
pic_parameter_set_state == `num_slice_groups_minus1_s ||
|
434 |
|
|
pic_parameter_set_state == `num_ref_idx_l0_active_minus1_pps_s ||
|
435 |
|
|
pic_parameter_set_state == `num_ref_idx_l1_active_minus1_pps_s ||
|
436 |
|
|
pic_parameter_set_state == `pic_init_qp_minus26_s ||
|
437 |
|
|
pic_parameter_set_state == `pic_init_qs_minus26_s ||
|
438 |
|
|
pic_parameter_set_state == `chroma_qp_index_offset_s ||
|
439 |
|
|
slice_header_state == `first_mb_in_slice_s ||
|
440 |
|
|
slice_header_state == `slice_type_s ||
|
441 |
|
|
slice_header_state == `pic_parameter_set_id_slice_header_s ||
|
442 |
|
|
slice_header_state == `idr_pic_id_s ||
|
443 |
|
|
slice_header_state == `num_ref_idx_l0_active_minus1_slice_header_s ||
|
444 |
|
|
slice_header_state == `slice_qp_delta_s ||
|
445 |
|
|
slice_header_state == `disable_deblocking_filter_idc_s ||
|
446 |
|
|
slice_header_state == `slice_alpha_c0_offset_div2_s ||
|
447 |
|
|
slice_header_state == `slice_beta_offset_div2_s ||
|
448 |
|
|
slice_data_state == `mb_skip_run_s ||
|
449 |
|
|
slice_data_state == `mb_type_s ||
|
450 |
|
|
slice_data_state == `coded_block_pattern_s ||
|
451 |
|
|
slice_data_state == `mb_qp_delta_s ||
|
452 |
|
|
mb_pred_state == `intra_chroma_pred_mode_s ||
|
453 |
|
|
mb_pred_state == `mvd_l0_s ||
|
454 |
|
|
sub_mb_pred_state == `sub_mb_type_s ||
|
455 |
|
|
sub_mb_pred_state == `sub_mvd_l0_s ||
|
456 |
|
|
cavlc_decoder_state == `NumCoeffTrailingOnes_LUT ||
|
457 |
|
|
cavlc_decoder_state == `LevelPrefix ||
|
458 |
|
|
cavlc_decoder_state == `total_zeros_LUT)? 1'b0:1'b1;
|
459 |
|
|
|
460 |
|
|
//count_mb_skip_run
|
461 |
|
|
always @ (posedge gclk_slice_data or negedge reset_n)
|
462 |
|
|
if (reset_n == 1'b0)
|
463 |
|
|
count_mb_skip_run <= 1'b0;
|
464 |
|
|
else if (slice_data_state == `skip_run_duration)
|
465 |
|
|
count_mb_skip_run <= (mb_num == 98)? 0:(count_mb_skip_run < (mb_skip_run - 1))? (count_mb_skip_run + 1):0;
|
466 |
|
|
|
467 |
|
|
assign NextMB_IsSkip = (slice_data_state == `skip_run_duration && (count_mb_skip_run < (mb_skip_run - 1)))? 1'b1:1'b0;
|
468 |
|
|
|
469 |
|
|
reg LowerMB_IsSkip;
|
470 |
|
|
always @ (slice_data_state or mb_skip_run or count_mb_skip_run)
|
471 |
|
|
if (slice_data_state == `skip_run_duration)
|
472 |
|
|
begin
|
473 |
|
|
if (mb_skip_run < 13)
|
474 |
|
|
LowerMB_IsSkip <= 1'b0;
|
475 |
|
|
else
|
476 |
|
|
LowerMB_IsSkip <= (count_mb_skip_run < (mb_skip_run - 12))? 1'b1:1'b0;
|
477 |
|
|
end
|
478 |
|
|
else
|
479 |
|
|
LowerMB_IsSkip <= 1'b0;
|
480 |
|
|
|
481 |
|
|
//mb_num_h
|
482 |
|
|
always @ (posedge gclk_slice_data or negedge reset_n)
|
483 |
|
|
if (reset_n == 1'b0)
|
484 |
|
|
mb_num_h <= 0;
|
485 |
|
|
else if (slice_data_state == `skip_run_duration || slice_data_state == `mb_num_update)
|
486 |
|
|
mb_num_h <= (mb_num_h == 10) ? 0:(mb_num_h + 1);
|
487 |
|
|
|
488 |
|
|
//mb_num_v
|
489 |
|
|
always @ (posedge gclk_slice_data or negedge reset_n)
|
490 |
|
|
if (reset_n == 1'b0)
|
491 |
|
|
mb_num_v <= 0;
|
492 |
|
|
else if ((slice_data_state == `skip_run_duration || slice_data_state == `mb_num_update) && mb_num_h == 10)
|
493 |
|
|
mb_num_v <= (mb_num_v == 8) ? 0:(mb_num_v + 1);
|
494 |
|
|
|
495 |
|
|
//mb_num
|
496 |
|
|
always @ (posedge gclk_slice_data or negedge reset_n)
|
497 |
|
|
if (reset_n == 1'b0)
|
498 |
|
|
mb_num <= 0;
|
499 |
|
|
else if (slice_data_state == `skip_run_duration || slice_data_state == `mb_num_update)
|
500 |
|
|
mb_num <= (mb_num == 98)? 0:(mb_num + 1);
|
501 |
|
|
|
502 |
|
|
//pic_num
|
503 |
|
|
always @ (posedge gclk_slice_data or negedge reset_n)
|
504 |
|
|
if (reset_n == 1'b0)
|
505 |
|
|
pic_num <= 0;
|
506 |
|
|
else if ((slice_data_state == `skip_run_duration || slice_data_state == `mb_num_update) && mb_num == 98)
|
507 |
|
|
pic_num <= pic_num + 1;
|
508 |
|
|
|
509 |
|
|
//luma4x4BlkIdx
|
510 |
|
|
always @ (posedge gclk_slice_data or negedge reset_n)
|
511 |
|
|
if (reset_n == 1'b0)
|
512 |
|
|
luma4x4BlkIdx <= 0;
|
513 |
|
|
else
|
514 |
|
|
case (mb_pred_state)
|
515 |
|
|
`prev_intra4x4_pred_mode_flag_s:
|
516 |
|
|
if (prev_intra4x4_pred_mode_flag == 1'b1)
|
517 |
|
|
luma4x4BlkIdx <= (luma4x4BlkIdx == 4'b1111)? 0:(luma4x4BlkIdx + 1);
|
518 |
|
|
`rem_intra4x4_pred_mode_s:luma4x4BlkIdx <= (luma4x4BlkIdx == 4'b1111)? 0:(luma4x4BlkIdx + 1);
|
519 |
|
|
endcase
|
520 |
|
|
|
521 |
|
|
//mbPartIdx
|
522 |
|
|
always @ (posedge gclk_slice_data or negedge reset_n)
|
523 |
|
|
if (reset_n == 1'b0)
|
524 |
|
|
mbPartIdx <= 0;
|
525 |
|
|
else if (mb_pred_state == `mvd_l0_s && compIdx == 1'b1)
|
526 |
|
|
mbPartIdx <= ({1'b0,mbPartIdx} < (NumMbPart-1))? (mbPartIdx + 1):0;
|
527 |
|
|
else if (sub_mb_pred_state == `sub_mb_type_s)
|
528 |
|
|
mbPartIdx <= (mbPartIdx == 2'b11)? 0:(mbPartIdx + 1);
|
529 |
|
|
else if (sub_mb_pred_state == `sub_mvd_l0_s && {1'b0,subMbPartIdx} == NumSubMbPart - 1 && compIdx == 1'b1)
|
530 |
|
|
mbPartIdx <= (mbPartIdx == 2'b11)? 0:(mbPartIdx + 1);
|
531 |
|
|
|
532 |
|
|
//subMbPartIdx
|
533 |
|
|
always @ (posedge gclk_slice_data or negedge reset_n)
|
534 |
|
|
if (reset_n == 1'b0)
|
535 |
|
|
subMbPartIdx <= 0;
|
536 |
|
|
else if (sub_mb_pred_state == `sub_mvd_l0_s && compIdx == 1'b1)
|
537 |
|
|
subMbPartIdx <= ({1'b0,subMbPartIdx} < NumSubMbPart-1)? (subMbPartIdx + 1):0;
|
538 |
|
|
|
539 |
|
|
//compIdx
|
540 |
|
|
always @ (posedge gclk_slice_data or negedge reset_n)
|
541 |
|
|
if (reset_n == 1'b0)
|
542 |
|
|
compIdx <= 0;
|
543 |
|
|
else if (mb_pred_state == `mvd_l0_s || sub_mb_pred_state == `sub_mvd_l0_s)
|
544 |
|
|
compIdx <= ~ compIdx;
|
545 |
|
|
|
546 |
|
|
//i8x8
|
547 |
|
|
always @ (posedge clk)
|
548 |
|
|
if (reset_n == 1'b0)
|
549 |
|
|
i8x8 <= 0;
|
550 |
|
|
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)
|
551 |
|
|
i8x8 <= 0;
|
552 |
|
|
else if ((residual_state == `Intra16x16ACLevel_s || residual_state == `LumaLevel_s) && end_of_one_blk4x4_sum == 1 && i4x4 == 2'b11)
|
553 |
|
|
i8x8 <= (i8x8 == 2'b11)? 0:(i8x8 + 1);
|
554 |
|
|
|
555 |
|
|
//i4x4
|
556 |
|
|
always @ (posedge clk)
|
557 |
|
|
if (reset_n == 1'b0)
|
558 |
|
|
i4x4 <= 0;
|
559 |
|
|
else if ((residual_state == `Intra16x16ACLevel_s || residual_state == `LumaLevel_s) && end_of_one_blk4x4_sum == 1)
|
560 |
|
|
i4x4 <= (i4x4 == 2'b11)? 0:(i4x4 + 1);
|
561 |
|
|
|
562 |
|
|
//i4x4_CbCr
|
563 |
|
|
always @ (posedge clk)
|
564 |
|
|
if (reset_n == 1'b0)
|
565 |
|
|
i4x4_CbCr <= 0;
|
566 |
|
|
else if ((residual_state == `ChromaACLevel_Cb_s || residual_state == `ChromaACLevel_Cr_s) && end_of_one_blk4x4_sum == 1'b1)
|
567 |
|
|
i4x4_CbCr <= (i4x4_CbCr == 2'b11)? 0:(i4x4_CbCr + 1);
|
568 |
|
|
|
569 |
|
|
//suffix_length_initialized
|
570 |
|
|
always @ (posedge gclk_cavlc or negedge reset_n)
|
571 |
|
|
if (reset_n == 1'b0)
|
572 |
|
|
suffix_length_initialized <= 1'b0;
|
573 |
|
|
else if (cavlc_decoder_state == `rst_cavlc_decoder)
|
574 |
|
|
suffix_length_initialized <= 1'b0;
|
575 |
|
|
else if (cavlc_decoder_state == `LevelPrefix)
|
576 |
|
|
suffix_length_initialized <= 1'b1;
|
577 |
|
|
|
578 |
|
|
//i_level
|
579 |
|
|
always @ (posedge gclk_cavlc or negedge reset_n)
|
580 |
|
|
if (reset_n == 1'b0)
|
581 |
|
|
i_level <= 0;
|
582 |
|
|
else if (cavlc_decoder_state == `NumCoeffTrailingOnes_LUT)
|
583 |
|
|
i_level <= 0;
|
584 |
|
|
else if (cavlc_decoder_state == `TrailingOnesSignFlag)
|
585 |
|
|
i_level <= i_level + TrailingOnes;
|
586 |
|
|
else if (cavlc_decoder_state == `LevelSuffix && {1'b0,i_level} != (TotalCoeff-1))
|
587 |
|
|
i_level <= i_level + 1;
|
588 |
|
|
|
589 |
|
|
//i_run
|
590 |
|
|
always @ (posedge gclk_cavlc or negedge reset_n)
|
591 |
|
|
if (reset_n == 1'b0)
|
592 |
|
|
i_run <= 0;
|
593 |
|
|
else if (cavlc_decoder_state == `total_zeros_LUT)
|
594 |
|
|
i_run <= 0;
|
595 |
|
|
else if (cavlc_decoder_state == `RunOfZeros && {1'b0,i_run} != (TotalCoeff - 1) && {1'b0,i_run} != (TotalCoeff - 2) && zerosLeft != 0)
|
596 |
|
|
i_run <= i_run + 1;
|
597 |
|
|
|
598 |
|
|
//i_TotalCoeff
|
599 |
|
|
always @ (posedge gclk_cavlc or negedge reset_n)
|
600 |
|
|
if (reset_n == 1'b0)
|
601 |
|
|
i_TotalCoeff <= 0;
|
602 |
|
|
//enter from LevelSuffix
|
603 |
|
|
else if (cavlc_decoder_state == `LevelSuffix && {1'b0,i_level} == (TotalCoeff-1) && TotalCoeff == maxNumCoeff)
|
604 |
|
|
i_TotalCoeff <= TotalCoeff - 1;
|
605 |
|
|
//enter from RunOfZeros
|
606 |
|
|
else if (cavlc_decoder_state == `RunOfZeros && ({1'b0,i_run} == (TotalCoeff - 1) || {1'b0,i_run} == (TotalCoeff - 2) || zerosLeft == 0))
|
607 |
|
|
i_TotalCoeff <= TotalCoeff - 1;
|
608 |
|
|
//Inside LevelRunCombination loop
|
609 |
|
|
else if (cavlc_decoder_state == `LevelRunCombination && i_TotalCoeff != 0)
|
610 |
|
|
i_TotalCoeff <= i_TotalCoeff-1;
|
611 |
|
|
|
612 |
|
|
//coeffNum
|
613 |
|
|
always @ (cavlc_decoder_state or run or coeffNum_reg)
|
614 |
|
|
if (cavlc_decoder_state == `nAnB_decoding_s)
|
615 |
|
|
coeffNum <= 4'b1111;
|
616 |
|
|
else if (cavlc_decoder_state == `LevelRunCombination)
|
617 |
|
|
coeffNum <= coeffNum_reg + run + 1;
|
618 |
|
|
else
|
619 |
|
|
coeffNum <= coeffNum_reg;
|
620 |
|
|
|
621 |
|
|
always @ (posedge gclk_cavlc or negedge reset_n)
|
622 |
|
|
if (reset_n == 1'b0)
|
623 |
|
|
coeffNum_reg <= 0;
|
624 |
|
|
else
|
625 |
|
|
coeffNum_reg <= coeffNum;
|
626 |
|
|
|
627 |
|
|
//IsRunLoop
|
628 |
|
|
always @ (posedge gclk_cavlc or negedge reset_n)
|
629 |
|
|
if (reset_n == 1'b0)
|
630 |
|
|
IsRunLoop <= 0;
|
631 |
|
|
else if (cavlc_decoder_state == `RunOfZeros)
|
632 |
|
|
IsRunLoop <= ({1'b0,i_run} == TotalCoeff - 1 || {1'b0,i_run} == TotalCoeff - 2 || zerosLeft == 0)? 1'b0:1'b1;
|
633 |
|
|
|
634 |
|
|
endmodule
|
635 |
|
|
|
636 |
|
|
|
637 |
|
|
|
638 |
|
|
|
639 |
|
|
|