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

Subversion Repositories nova

[/] [nova/] [trunk/] [src/] [bitstream_gclk_gen.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_gclk_gen.v
6
// Generated : Jan 9,2005
7
// Copyright (C) 2008 Ke Xu                
8
//-------------------------------------------------------------------------------------------------
9
// Description 
10
// Gated clock generation module for bitstream controller
11
//-------------------------------------------------------------------------------------------------
12
 
13
// synopsys translate_off
14
`include "timescale.v"
15
// synopsys translate_on
16
`include "nova_defines.v"
17
 
18
module bitstream_gclk_gen (clk,reset_n,freq_ctrl0,freq_ctrl1,parser_state,nal_unit_state,slice_layer_wo_partitioning_state,
19
        slice_header_state,slice_data_state,seq_parameter_set_state,pic_parameter_set_state,residual_state,cavlc_decoder_state,
20
        mb_num,TotalCoeff,start_code_prefix_found,pc_2to0,deblocking_filter_control_present_flag,
21
        disable_deblocking_filter_idc,end_of_one_residual_block,
22
        Intra4x4PredMode_mbAddrB_cs_n,mvx_mbAddrB_cs_n,mvy_mbAddrB_cs_n,mvx_mbAddrC_cs_n,mvy_mbAddrC_cs_n,
23
        LumaLevel_mbAddrB_cs_n,ChromaLevel_Cb_mbAddrB_cs_n,ChromaLevel_Cr_mbAddrB_cs_n,
24
        trigger_CAVLC,blk4x4_rec_counter,end_of_DCBlk_IQIT,end_of_one_blk4x4_sum,end_of_MB_DEC,disable_DF,bs_dec_counter,
25
 
26
        gclk_parser,gclk_nal,gclk_slice,gclk_sps,gclk_pps,
27
        gclk_slice_header,gclk_slice_data,gclk_residual,gclk_cavlc,
28
        gclk_Intra4x4PredMode_mbAddrB_RF,
29
        gclk_mvx_mbAddrB_RF,gclk_mvy_mbAddrB_RF,gclk_mvx_mbAddrC_RF,gclk_mvy_mbAddrC_RF,
30
        gclk_LumaLevel_mbAddrB_RF,gclk_ChromaLevel_Cb_mbAddrB_RF,gclk_ChromaLevel_Cr_mbAddrB_RF,gclk_bs_dec,
31
        end_of_one_frame);
32
        input clk;
33
        input reset_n;
34
        input freq_ctrl0;
35
        input freq_ctrl1;
36
        input [1:0] parser_state;
37
        input [2:0] nal_unit_state;
38
        input [1:0] slice_layer_wo_partitioning_state;
39
        input [3:0] slice_header_state;
40
        input [3:0] slice_data_state;
41
        input [3:0] seq_parameter_set_state;
42
        input [3:0] pic_parameter_set_state;
43
        input [3:0] residual_state;
44
        input [3:0] cavlc_decoder_state;
45
        input [6:0] mb_num;
46
        input [4:0] TotalCoeff;
47
        input start_code_prefix_found;
48
        input [2:0] pc_2to0;
49
        input deblocking_filter_control_present_flag;
50
        input [1:0] disable_deblocking_filter_idc;
51
        input end_of_one_residual_block;
52
        input Intra4x4PredMode_mbAddrB_cs_n;
53
        input mvx_mbAddrB_cs_n;
54
        input mvy_mbAddrB_cs_n;
55
        input mvx_mbAddrC_cs_n;
56
        input mvy_mbAddrC_cs_n;
57
        input LumaLevel_mbAddrB_cs_n;
58
        input ChromaLevel_Cb_mbAddrB_cs_n;
59
        input ChromaLevel_Cr_mbAddrB_cs_n;
60
        input trigger_CAVLC;
61
        input [4:0] blk4x4_rec_counter;
62
        input end_of_DCBlk_IQIT;
63
        input end_of_one_blk4x4_sum;
64
        input end_of_MB_DEC;
65
        input disable_DF;
66
        input [1:0] bs_dec_counter;
67
 
68
        output gclk_parser;
69
        output gclk_nal;
70
        output gclk_slice;
71
        output gclk_sps;
72
        output gclk_pps;
73
        output gclk_slice_header;
74
        output gclk_slice_data;
75
        output gclk_residual;
76
        output gclk_cavlc;
77
        output gclk_Intra4x4PredMode_mbAddrB_RF;
78
        output gclk_mvx_mbAddrB_RF;
79
        output gclk_mvy_mbAddrB_RF;
80
        output gclk_mvx_mbAddrC_RF;
81
        output gclk_mvy_mbAddrC_RF;
82
        output gclk_LumaLevel_mbAddrB_RF;
83
        output gclk_ChromaLevel_Cb_mbAddrB_RF;
84
        output gclk_ChromaLevel_Cr_mbAddrB_RF;
85
        output gclk_bs_dec;
86
        output end_of_one_frame;
87
 
88
  //Input pin freq_ctrl0 & freq_ctrl1 can be used to adjust frequency after the chip is fabricated
89
        reg [16:0] cycles_per_frame;
90
        always @ (freq_ctrl0 or freq_ctrl1)
91
                case ({freq_ctrl1,freq_ctrl0})
92
                        2'b00:cycles_per_frame   <= `cycles_per_frame0;
93
                        2'b01:cycles_per_frame   <= `cycles_per_frame1;
94
                        2'b11:cycles_per_frame   <= `cycles_per_frame3;
95
                        default:cycles_per_frame <= `cycles_per_frame2;
96
                endcase
97
 
98
        //---------------------------------------------------------------------------------
99
        // decoding rate control
100
        //---------------------------------------------------------------------------------
101
        reg [16:0] frame_cycle_counter;
102
        reg end_of_one_frame;
103
        always @ (posedge clk)
104
                if (reset_n == 1'b0)
105
                        begin
106
                                frame_cycle_counter <= 0;
107
                                end_of_one_frame        <= 1'b0;
108
                        end
109
                else if (parser_state == `start_code_prefix)
110
                        begin
111
                                frame_cycle_counter <= 0;
112
                                end_of_one_frame        <= 1'b0;
113
                        end
114
                else if (frame_cycle_counter < cycles_per_frame)
115
                        begin
116
                                frame_cycle_counter <= frame_cycle_counter + 1;
117
                                end_of_one_frame        <= 1'b0;
118
                        end
119
                else
120
                        begin
121
                                frame_cycle_counter <= 0;
122
                                end_of_one_frame        <= 1'b1;
123
                        end
124
        //PPS and SPS doesn't need rate control,so after PPS/SPS decoding,bitstream parser should continue
125
        //without waiting for "end_of_one_frame" signal when parser_state == rst_parser.
126
        //PPS_SPS_complete is used to identify whether next nal_unit to be decoded is PPS/SPS or normal frame
127
        reg PPS_SPS_complete;
128
        always @ (posedge gclk_slice or negedge reset_n)
129
                if (reset_n == 1'b0)
130
                        PPS_SPS_complete <= 1'b0;
131
                else if (slice_layer_wo_partitioning_state == `slice_header)
132
                        PPS_SPS_complete <= 1'b1;
133
 
134
        //1.gclk_parser
135
        wire parser_ena;
136
        reg l_parser_ena;
137
        wire gclk_parser;
138
        assign parser_ena = (
139
        (parser_state == `rst_parser && (!PPS_SPS_complete || (PPS_SPS_complete && end_of_one_frame))) ||
140
        (parser_state == `start_code_prefix && start_code_prefix_found == 1'b1)                                           ||
141
        (nal_unit_state == `rbsp_trailing_one_bit && pc_2to0 == 3'b000)                                                           ||
142
        nal_unit_state == `rbsp_trailing_zero_bits)? 1'b1:1'b0;
143
        always @ (clk or parser_ena)
144
                if (!clk) l_parser_ena <= parser_ena;
145
        assign gclk_parser = l_parser_ena & clk;
146
 
147
        //2.gclk_nal
148
        //including rate control for end of one frame
149
        wire nal_ena;
150
        reg l_nal_ena;
151
        wire gclk_nal;
152
        assign nal_ena = (parser_state == `nal_unit && (
153
        nal_unit_state == `rst_nal_unit                                                                                                                         ||
154
        nal_unit_state == `forbidden_zero_bit_2_nal_unit_type                                                                   ||
155
        (((slice_data_state == `skip_run_duration && end_of_MB_DEC)|| slice_data_state == `mb_num_update)
156
        && mb_num == 98)                                                                                                                                                ||
157
        seq_parameter_set_state == `vui_parameter_present_flag_s                                                                ||
158
        pic_parameter_set_state == `deblocking_filter_control_2_redundant_pic_cnt_present_flag  ||
159
        nal_unit_state == `rbsp_trailing_one_bit                                                                                                ||
160
        nal_unit_state == `rbsp_trailing_zero_bits))? 1'b1:1'b0;
161
        always @ (clk or nal_ena)
162
                if (!clk) l_nal_ena <= nal_ena;
163
        assign gclk_nal = l_nal_ena & clk;
164
 
165
        //3.gclk_slice:for slice_layer_wo_partitioning_state FSM
166
        wire slice_ena;
167
        reg l_slice_ena;
168
        wire gclk_slice;
169
        assign slice_ena = (
170
        (nal_unit_state == `slice_layer_non_IDR_rbsp || nal_unit_state == `slice_layer_IDR_rbsp) &&
171
        (slice_layer_wo_partitioning_state == `rst_slice_layer_wo_partitioning ||
172
        (slice_header_state == `slice_qp_delta_s && deblocking_filter_control_present_flag == 1'b0)                     ||
173
        (slice_header_state == `disable_deblocking_filter_idc_s && disable_deblocking_filter_idc == 2'b01)   ||
174
        slice_header_state == `slice_beta_offset_div2_s                                                                                                         ||
175
        (((slice_data_state == `skip_run_duration && end_of_MB_DEC) || slice_data_state == `mb_num_update)
176
        && mb_num == 98)))? 1'b1:1'b0;
177
        always @ (clk or slice_ena)
178
                if (!clk) l_slice_ena <= slice_ena;
179
        assign gclk_slice = l_slice_ena & clk;
180
 
181
        //4.gclk_sps
182
        wire sps_ena;
183
        reg l_sps_ena;
184
        wire gclk_sps;
185
        assign sps_ena = (nal_unit_state == `seq_parameter_set_rbsp)? 1'b1:1'b0;
186
        always @ (clk or sps_ena)
187
                if (!clk)       l_sps_ena <= sps_ena;
188
        assign gclk_sps = l_sps_ena & clk;
189
 
190
        //5.gclk_pps
191
        wire pps_ena;
192
        reg l_pps_ena;
193
        wire gclk_pps;
194
 
195
        assign pps_ena = (nal_unit_state == `pic_parameter_set_rbsp)? 1'b1:1'b0;
196
        always @ (clk or pps_ena)
197
                if (!clk)       l_pps_ena <= pps_ena;
198
        assign gclk_pps = l_pps_ena & clk;
199
 
200
        //6.gclk_slice_header
201
        wire slice_header_ena;
202
        reg l_slice_header_ena;
203
        wire gclk_slice_header;
204
        assign slice_header_ena = (slice_layer_wo_partitioning_state == `slice_header)? 1'b1:1'b0;
205
        always @ (clk or slice_header_ena)
206
                if (!clk)       l_slice_header_ena <= slice_header_ena;
207
        assign gclk_slice_header = l_slice_header_ena & clk;
208
 
209
        //7.gclk_slice_data
210
        //including rate control for skipped macroblock:skip_run_duration
211
        //including rate control for normal  macroblock:mb_num_update
212
        wire slice_data_ena;
213
        reg l_slice_data_ena;
214
        wire gclk_slice_data;
215
        assign slice_data_ena = (slice_layer_wo_partitioning_state == `slice_data &&    (
216
        (slice_data_state != `skip_run_duration && slice_data_state != `residual) ||
217
        (slice_data_state == `skip_run_duration && end_of_MB_DEC == 1'b1)               ||
218
        (slice_data_state == `residual          && end_of_MB_DEC == 1'b1)))? 1'b1:1'b0;
219
        always @ (clk or slice_data_ena)
220
                if (!clk)       l_slice_data_ena <= slice_data_ena;
221
        assign gclk_slice_data = l_slice_data_ena & clk;
222
 
223
        //8.gclk_residual
224
        wire residual_ena;
225
        reg     l_residual_ena;
226
        wire gclk_residual;
227
 
228
        assign residual_ena = (slice_data_state == `residual &&
229
        (residual_state == `rst_residual                                                                                                                                        ||
230
 
231
        ((residual_state == `Intra16x16DCLevel_s || residual_state == `ChromaDCLevel_Cb_s
232
        || residual_state == `ChromaDCLevel_Cr_s) &&
233
        ((end_of_one_residual_block == 1 && TotalCoeff == 0) || end_of_DCBlk_IQIT))                                                      ||
234
 
235
        ((residual_state == `Intra16x16ACLevel_s || residual_state == `Intra16x16ACLevel_0_s
236
        || residual_state == `LumaLevel_s || residual_state == `LumaLevel_0_s)
237
        && blk4x4_rec_counter == 15 && end_of_one_blk4x4_sum == 1)                                                                                      ||
238
        (residual_state == `ChromaACLevel_Cb_s && blk4x4_rec_counter == 19 && end_of_one_blk4x4_sum == 1)       ||
239
        (residual_state == `ChromaACLevel_Cr_s && blk4x4_rec_counter == 23 && end_of_one_blk4x4_sum == 1)       ||
240
        (residual_state == `ChromaACLevel_0_s  && blk4x4_rec_counter == 23 && end_of_one_blk4x4_sum == 1)))? 1'b1:1'b0;
241
 
242
        always @ (clk or residual_ena)
243
                if (!clk)       l_residual_ena <= residual_ena;
244
        assign gclk_residual = l_residual_ena & clk;
245
 
246
        //9.gclk_cavlc
247
        wire cavlc_ena;
248
        reg l_cavlc_ena;
249
        wire gclk_cavlc;
250
        assign cavlc_ena = (slice_data_state == `residual && (cavlc_decoder_state != `rst_cavlc_decoder ||
251
        (cavlc_decoder_state == `rst_cavlc_decoder && trigger_CAVLC)))? 1'b1:1'b0;
252
 
253
        always @ (clk or cavlc_ena)
254
                if (!clk)       l_cavlc_ena <= cavlc_ena;
255
        assign gclk_cavlc = l_cavlc_ena & clk;
256
 
257
        //----------------------------------------------------------------------
258
        //gclk for bitstream controller register file
259
        //----------------------------------------------------------------------
260
        //1.gclk_Intra4x4PredMode_mbAddrB_RF
261
        reg     l_Intra4x4PredMode_mbAddrB_RF_ena;
262
        wire gclk_Intra4x4PredMode_mbAddrB_RF;
263
        always @ (clk or Intra4x4PredMode_mbAddrB_cs_n)
264
                if (!clk) l_Intra4x4PredMode_mbAddrB_RF_ena <= ~Intra4x4PredMode_mbAddrB_cs_n;
265
        assign gclk_Intra4x4PredMode_mbAddrB_RF = clk & l_Intra4x4PredMode_mbAddrB_RF_ena;
266
 
267
        //2.gclk_mvx_mbAddrB_RF
268
        reg     l_mvx_mbAddrB_RF_ena;
269
        wire gclk_mvx_mbAddrB_RF;
270
        always @ (clk or mvx_mbAddrB_cs_n)
271
                if (!clk) l_mvx_mbAddrB_RF_ena <= ~mvx_mbAddrB_cs_n;
272
        assign gclk_mvx_mbAddrB_RF = clk & l_mvx_mbAddrB_RF_ena;
273
 
274
        //3.gclk_mvy_mbAddrB_RF
275
        reg     l_mvy_mbAddrB_RF_ena;
276
        wire gclk_mvy_mbAddrB_RF;
277
        always @ (clk or mvy_mbAddrB_cs_n)
278
                if (!clk) l_mvy_mbAddrB_RF_ena <= ~mvy_mbAddrB_cs_n;
279
        assign gclk_mvy_mbAddrB_RF = clk & l_mvy_mbAddrB_RF_ena;
280
 
281
        //4.gclk_mvx_mbAddrC_RF
282
        reg     l_mvx_mbAddrC_RF_ena;
283
        wire gclk_mvx_mbAddrC_RF;
284
        always @ (clk or mvx_mbAddrC_cs_n)
285
                if (!clk) l_mvx_mbAddrC_RF_ena <= ~mvx_mbAddrC_cs_n;
286
        assign gclk_mvx_mbAddrC_RF = clk & l_mvx_mbAddrC_RF_ena;
287
 
288
        //5.gclk_mvy_mbAddrC_RF
289
        reg     l_mvy_mbAddrC_RF_ena;
290
        wire gclk_mvy_mbAddrC_RF;
291
        always @ (clk or mvy_mbAddrC_cs_n)
292
                if (!clk) l_mvy_mbAddrC_RF_ena <= ~mvy_mbAddrC_cs_n;
293
        assign gclk_mvy_mbAddrC_RF = clk & l_mvy_mbAddrC_RF_ena;
294
        //----------------------------------------------------------------------
295
        //gclk for CAVLC_decoder related regfiles
296
        //---------------------------------------------------------------------- 
297
        //1.gclk_LumaLevel_mbAddrB_RF
298
        reg     l_LumaLevel_mbAddrB_RF_ena;
299
        wire gclk_LumaLevel_mbAddrB_RF;
300
        always @ (clk or LumaLevel_mbAddrB_cs_n)
301
                if (!clk) l_LumaLevel_mbAddrB_RF_ena <= ~LumaLevel_mbAddrB_cs_n;
302
        assign gclk_LumaLevel_mbAddrB_RF = clk & l_LumaLevel_mbAddrB_RF_ena;
303
 
304
        //2.gclk_ChromaLevel_Cb_mbAddrB_RF
305
        reg     l_ChromaLevel_Cb_mbAddrB_RF_ena;
306
        wire gclk_ChromaLevel_Cb_mbAddrB_RF;
307
        always @ (clk or ChromaLevel_Cb_mbAddrB_cs_n)
308
                if (!clk) l_ChromaLevel_Cb_mbAddrB_RF_ena <= ~ChromaLevel_Cb_mbAddrB_cs_n;
309
        assign gclk_ChromaLevel_Cb_mbAddrB_RF = clk & l_ChromaLevel_Cb_mbAddrB_RF_ena;
310
 
311
        //3.gclk_ChromaLevel_Cr_mbAddrB_RF
312
        reg     l_ChromaLevel_Cr_mbAddrB_RF_ena;
313
        wire gclk_ChromaLevel_Cr_mbAddrB_RF;
314
        always @ (clk or ChromaLevel_Cr_mbAddrB_cs_n)
315
                if (!clk) l_ChromaLevel_Cr_mbAddrB_RF_ena <= ~ChromaLevel_Cr_mbAddrB_cs_n;
316
        assign gclk_ChromaLevel_Cr_mbAddrB_RF = clk & l_ChromaLevel_Cr_mbAddrB_RF_ena;
317
 
318
        //----------------------------------------------------------------------
319
        //gclk for boundary strength decoding
320
        //----------------------------------------------------------------------
321
        wire bs_dec_ena;
322
        reg l_bs_dec_ena;
323
        wire gclk_bs_dec;
324
 
325
        assign bs_dec_ena = ((end_of_MB_DEC == 1'b1 && disable_DF == 1'b0) || bs_dec_counter != 0)? 1'b1:1'b0;
326
        always @ (clk or bs_dec_ena)
327
                if (!clk)       l_bs_dec_ena <= bs_dec_ena;
328
        assign gclk_bs_dec = l_bs_dec_ena & clk;
329
 
330
endmodule
331
 
332
 
333
 

powered by: WebSVN 2.1.0

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