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

Subversion Repositories nova

[/] [nova/] [trunk/] [src/] [BitStream_parser_FSM_gating.v] - Blame information for rev 11

Details | Compare with Previous | View Log

Line No. Rev Author Line
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
 

powered by: WebSVN 2.1.0

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