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

Subversion Repositories nova

[/] [nova/] [tags/] [Start/] [src/] [hybrid_pipeline_ctrl.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      : hybrid_pipeline_ctrl.v
6
// Generated : Sept 5, 2005
7
// Copyright (C) 2008 Ke Xu                
8
//-------------------------------------------------------------------------------------------------
9
// Description 
10
// Control 4x4 block level pipeline for reconstruction
11
// Receive the 1cycle end_of_xxx signal(combinational)
12
// Generated the 1cycle trigger_xxx signal
13
//-------------------------------------------------------------------------------------------------
14
// Revise log 
15
// 1.April 11,2006
16
// Modify the 1cycle trigger_xxx signal from registers to combinational logic to save decoding clock cycles
17
//-------------------------------------------------------------------------------------------------
18
 
19
// synopsys translate_off
20
`include "timescale.v"
21
// synopsys translate_on
22
`include "nova_defines.v"
23
 
24
module hybrid_pipeline_ctrl (clk,reset_n,mb_num_h,mb_num_v,blk4x4_rec_counter,CodedBlockPatternLuma,CodedBlockPatternChroma,
25
        mb_type_general,slice_data_state,residual_state,TotalCoeff,Is_skip_run_entry,skip_mv_calc,
26
        end_of_one_residual_block,end_of_DCBlk_IQIT,end_of_ACBlk4x4_IQIT,end_of_one_blk4x4_intra,end_of_one_blk4x4_inter,
27
        end_of_one_blk4x4_sum,end_of_MB_DF,disable_DF,
28
 
29
        curr_CBPLuma_IsZero,end_of_MB_DEC,trigger_CAVLC,trigger_blk4x4_intra_pred,
30
        trigger_blk4x4_inter_pred,trigger_blk4x4_rec_sum);
31
        input clk,reset_n;
32
        input [3:0] mb_num_h;
33
        input [3:0] mb_num_v;
34
        input [4:0] blk4x4_rec_counter;
35
        input [3:0] CodedBlockPatternLuma;
36
        input [1:0] CodedBlockPatternChroma;
37
        input [3:0] mb_type_general;
38
        input [3:0] slice_data_state;
39
        input [3:0] residual_state;
40
        input [4:0] TotalCoeff;
41
        input Is_skip_run_entry;
42
        input skip_mv_calc;
43
        input end_of_one_residual_block;
44
        input end_of_DCBlk_IQIT;
45
        input end_of_ACBlk4x4_IQIT;
46
        input end_of_one_blk4x4_intra,end_of_one_blk4x4_inter,end_of_one_blk4x4_sum;
47
        input end_of_MB_DF;
48
        input disable_DF;
49
 
50
        output curr_CBPLuma_IsZero;
51
        output end_of_MB_DEC;
52
        output trigger_CAVLC;
53
        output trigger_blk4x4_intra_pred,trigger_blk4x4_inter_pred;
54
        output trigger_blk4x4_rec_sum;
55
 
56
        //change trigger_blk4x4_intra_pred from combination to reg
57
        reg trigger_CAVLC;             //combination
58
        reg trigger_blk4x4_intra_pred; //reg
59
        reg trigger_blk4x4_inter_pred; //reg
60
        reg trigger_blk4x4_rec_sum;    //combination
61
 
62
        //CBPLuma only make sense for residual_state == LumaLevel_s
63
        //CBPLuma is derived to help judge whether res_blk4x4_IsAllZero caused by CodedBlockPattern != 4'b1111
64
        reg curr_CBPLuma_IsZero;
65
        always @ (blk4x4_rec_counter or CodedBlockPatternLuma)
66
                if (blk4x4_rec_counter < 16)
67
                        case (blk4x4_rec_counter[3:2])
68
                                2'b00:curr_CBPLuma_IsZero <= !CodedBlockPatternLuma[0];
69
                                2'b01:curr_CBPLuma_IsZero <= !CodedBlockPatternLuma[1];
70
                                2'b10:curr_CBPLuma_IsZero <= !CodedBlockPatternLuma[2];
71
                                2'b11:curr_CBPLuma_IsZero <= !CodedBlockPatternLuma[3];
72
                        endcase
73
                else
74
                        curr_CBPLuma_IsZero <= 0;
75
        //---------------------------------------------------------------------------------
76
        //signals to trigger:
77
        //      1.4x4 blk CAVLC
78
        //      2.4x4 Intra Prediction
79
        //      3.4x4 Inter Prediction 
80
        //      4.4x4 reconstruction sum
81
        //      5.16x16 deblocking filter
82
        //      All the trigger_xxx signals are generated by sequential logic
83
        //---------------------------------------------------------------------------------     
84
 
85
        //1. trigger_CAVLC: when reconstruction is dealing with skip_run or zero residual (construction 
86
        //   only from inter/intra prediction) blocks,CAVLC decoder,as well as whole bitstream parsing FSM,
87
        //   needs to be stalled and wait until the reconstruction process of previous 
88
 
89
        always @ (slice_data_state or residual_state or mb_type_general[3:2] or CodedBlockPatternLuma
90
                or CodedBlockPatternChroma or end_of_one_residual_block or end_of_DCBlk_IQIT or end_of_one_blk4x4_sum
91
                or blk4x4_rec_counter or TotalCoeff or curr_CBPLuma_IsZero)
92
                //      Entry
93
                if (slice_data_state == `residual && residual_state == `rst_residual)
94
                        begin
95
                                if (mb_type_general[3:2] == 2'b10)                      //Intra16x16:first block must be DC
96
                                        trigger_CAVLC <= 1'b1;
97
                                else if (CodedBlockPatternLuma[0] == 1'b0)       //First 8x8 block has no residuals
98
                                        trigger_CAVLC <= 1'b0;
99
                                else                                                                            //normal case
100
                                        trigger_CAVLC <= 1'b1;
101
                        end
102
                //      End of one DC
103
                else if ((residual_state == `Intra16x16DCLevel_s || residual_state == `ChromaDCLevel_Cb_s ||
104
                residual_state == `ChromaDCLevel_Cr_s) && ((end_of_one_residual_block && TotalCoeff == 0)|| end_of_DCBlk_IQIT))
105
                        case (residual_state)
106
                                `Intra16x16DCLevel_s:   //end of luma DC
107
                                trigger_CAVLC <= (CodedBlockPatternLuma[0] == 1'b0)? 1'b0:1'b1;
108
                                `ChromaDCLevel_Cb_s:            //end of chroma DC Cb,trigger chroma DC Cr now!
109
                                trigger_CAVLC <= 1'b1;
110
                                `ChromaDCLevel_Cr_s:            //end of chroma DC Cr
111
                                trigger_CAVLC <= (CodedBlockPatternChroma == 2'b01)? 1'b0:1'b1;
112
                                default:trigger_CAVLC <= 1'b0;
113
                        endcase
114
                //      End of skip or normal
115
                else if (end_of_one_blk4x4_sum)
116
                        begin
117
                                if (slice_data_state == `skip_run_duration)
118
                                        trigger_CAVLC <= 1'b0;
119
                                else
120
                                        case (blk4x4_rec_counter)
121
                                                0,1,2,4,5,6,8,9,10,12,13,14:trigger_CAVLC <= (curr_CBPLuma_IsZero)? 1'b0:1'b1;
122
                                                3 :trigger_CAVLC <= (CodedBlockPatternLuma[1])? 1'b1:1'b0;
123
                                                7 :trigger_CAVLC <= (CodedBlockPatternLuma[2])? 1'b1:1'b0;
124
                                                11:trigger_CAVLC <= (CodedBlockPatternLuma[3])? 1'b1:1'b0;
125
                                                15:trigger_CAVLC <= (CodedBlockPatternChroma == 0)? 1'b0:1'b1;
126
                                                23:trigger_CAVLC <= 1'b0;
127
                                                default:trigger_CAVLC <= (CodedBlockPatternChroma == 2)? 1'b1:1'b0;
128
                                        endcase
129
                        end
130
                else
131
                        trigger_CAVLC <= 1'b0;
132
 
133
        //end_of_MB_rec:end of one MB reconstruction 
134
        wire end_of_MB_rec;
135
        assign end_of_MB_rec = (blk4x4_rec_counter == 5'd23 && end_of_one_blk4x4_sum == 1'b1)? 1'b1:1'b0;
136
 
137
        //MB_needs_DF: identify whether this MB needs to be deblocking filtered
138
        reg MB_needs_DF;
139
        always @ (posedge clk)
140
                if (reset_n == 1'b0)
141
                        MB_needs_DF <= 1'b0;
142
                else if (end_of_MB_DEC == 1'b1 && !disable_DF)
143
                        MB_needs_DF <= 1'b1;
144
                else if (end_of_MB_DEC == 1'b1 && disable_DF)
145
                        MB_needs_DF <= 1'b0;
146
        //MB_rec_DF_align:latch the first arrival of end_of_MB_rec and end_of_MB_DF
147
        reg MB_rec_DF_align;
148
        always @ (posedge clk)
149
                if (reset_n == 1'b0)
150
                        MB_rec_DF_align <= 1'b0;
151
                else if (end_of_MB_DEC)
152
                        MB_rec_DF_align <= 1'b0;
153
                else if (MB_needs_DF && (end_of_MB_rec || end_of_MB_DF == 1'b1))
154
                        MB_rec_DF_align <= 1'b1;
155
 
156
 
157
        //end_of_MB_DEC:end of one macroblock decoding (end of both reconstruction and previous MB's deblocking
158
        // (if previous MB needs deblocking)),generated by combinational logic
159
        reg end_of_MB_DEC;
160
        always @ (MB_needs_DF or end_of_MB_rec or end_of_MB_DF or MB_rec_DF_align or mb_num_h or mb_num_v)
161
                if (MB_needs_DF == 1'b1)
162
                        begin
163
                                if (end_of_MB_rec && end_of_MB_DF)      //arrive simultaneously
164
                                        end_of_MB_DEC <= 1'b1;
165
                                else if (MB_rec_DF_align == 1'b1 && (end_of_MB_rec || end_of_MB_DF))
166
                                        end_of_MB_DEC <= 1'b1;
167
                                else if (mb_num_h == 0 && mb_num_v == 0 && end_of_MB_rec)//first MB has no correspinding DF process
168
                                        end_of_MB_DEC <= 1'b1;
169
                                else
170
                                        end_of_MB_DEC <= 1'b0;
171
                        end
172
                else
173
                        end_of_MB_DEC <= (end_of_MB_rec)? 1'b1:1'b0;
174
 
175
        //2. trigger_blk4x4_intra_pred
176
        wire trigger_blk4x4_intra_pred_tmp;
177
        assign trigger_blk4x4_intra_pred_tmp = (mb_type_general[3] && ((slice_data_state == `residual &&
178
        residual_state == `rst_residual) || (end_of_one_blk4x4_sum && blk4x4_rec_counter != 23)))? 1'b1:1'b0;
179
 
180
        always @ (posedge clk)
181
                if (reset_n == 1'b0)
182
                        trigger_blk4x4_intra_pred <= 1'b0;
183
                else
184
                        trigger_blk4x4_intra_pred <= trigger_blk4x4_intra_pred_tmp;
185
 
186
        //3. trigger_blk4x4_inter_pred
187
        always @ (posedge clk)
188
                if (reset_n == 1'b0)
189
                        trigger_blk4x4_inter_pred <= 1'b0;
190
                //For skip_run_duration
191
                // 1.trigger inter pred when entering skip_run_duration after mb_skip_run_s state
192
                else if (Is_skip_run_entry)
193
                        trigger_blk4x4_inter_pred <= 1'b1;
194
                // 2.trigger inter pred during skip_run_duration
195
                else if (slice_data_state == `skip_run_duration)
196
                        begin
197
                                if (skip_mv_calc)
198
                                        trigger_blk4x4_inter_pred <= 1'b1;
199
                                else
200
                                        trigger_blk4x4_inter_pred <= (end_of_one_blk4x4_sum && blk4x4_rec_counter != 23)? 1'b1:1'b0;
201
                        end
202
                //For normal case:inside residual_state 
203
                // 1.entry
204
                else if (slice_data_state == `residual && residual_state == `rst_residual && !mb_type_general[3])
205
                        trigger_blk4x4_inter_pred <= 1'b1;
206
                // 2.end of normal
207
                else if (end_of_one_blk4x4_sum && blk4x4_rec_counter != 23 && !mb_type_general[3])
208
                        trigger_blk4x4_inter_pred <= 1'b1;
209
                else
210
                        trigger_blk4x4_inter_pred <= 1'b0;
211
 
212
        //4. trigger reconstruction sum
213
        //   Need to align the output of residual(IQIT) and predition(inter/intra)
214
        wire end_of_one_blk4x4_pred;
215
        wire end_of_one_blk4x4_res;  //end of one zero or non-zero AC blk4x4 IQIT (NOT DC!)
216
        reg  blk4x4_res_pred_align;
217
 
218
        assign end_of_one_blk4x4_pred = (end_of_one_blk4x4_inter || end_of_one_blk4x4_intra);
219
        assign end_of_one_blk4x4_res  = (((residual_state == `Intra16x16ACLevel_s || residual_state == `LumaLevel_s ||
220
                                                                residual_state == `ChromaACLevel_Cb_s || residual_state == `ChromaACLevel_Cr_s) &&
221
                                                                (end_of_one_residual_block && TotalCoeff == 0)) || end_of_ACBlk4x4_IQIT)? 1'b1:1'b0;
222
 
223
        //align the completion of prediction and residual decoding
224
        always @ (posedge clk)
225
                if (reset_n == 1'b0)
226
                        blk4x4_res_pred_align <= 0;
227
                else if (trigger_blk4x4_rec_sum == 1'b1)
228
                        blk4x4_res_pred_align <= 1'b0;
229
                else if (end_of_one_blk4x4_res && end_of_one_blk4x4_pred) //arrive simultaneously,no align
230
                        blk4x4_res_pred_align <= 1'b0;
231
                else if (end_of_one_blk4x4_res || end_of_one_blk4x4_pred)
232
                        blk4x4_res_pred_align <= 1'b1;
233
 
234
 
235
        always @ (slice_data_state or residual_state or curr_CBPLuma_IsZero or blk4x4_res_pred_align or
236
                end_of_one_blk4x4_pred or end_of_one_blk4x4_res)
237
                if (slice_data_state == `skip_run_duration)
238
                        trigger_blk4x4_rec_sum <= (end_of_one_blk4x4_pred)? 1'b1:1'b0;
239
                // Normal
240
                else if (residual_state == `Intra16x16ACLevel_s || residual_state == `LumaLevel_s ||
241
                                 residual_state == `ChromaACLevel_Cb_s  || residual_state == `ChromaACLevel_Cr_s)
242
                        begin
243
                                if (curr_CBPLuma_IsZero)
244
                                        trigger_blk4x4_rec_sum <= (blk4x4_res_pred_align)? 1'b1:end_of_one_blk4x4_pred;
245
                                else if (end_of_one_blk4x4_res && end_of_one_blk4x4_pred) //arrive simultaneously
246
                                        trigger_blk4x4_rec_sum <= 1'b1;
247
                                else if ((end_of_one_blk4x4_res || end_of_one_blk4x4_pred) && blk4x4_res_pred_align)
248
                                        trigger_blk4x4_rec_sum <= 1'b1;
249
                                else
250
                                        trigger_blk4x4_rec_sum <= 1'b0;
251
                        end
252
                // zero blocks
253
                else if (residual_state == `Intra16x16ACLevel_0_s || residual_state == `LumaLevel_0_s
254
                        || residual_state == `ChromaACLevel_0_s)
255
                        trigger_blk4x4_rec_sum <= (end_of_one_blk4x4_pred || blk4x4_res_pred_align)? 1'b1:1'b0;
256
                else
257
                        trigger_blk4x4_rec_sum <= 1'b0;
258
 
259
        //5.trigger Deblocking Filter
260
        //assign trigger_MB_DF = (end_of_MB_DEC == 1'b1 && !disable_DF)? 1'b1:1'b0;
261
 
262
endmodule
263
 
264
 
265
 

powered by: WebSVN 2.1.0

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