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

Subversion Repositories cavlc

[/] [cavlc/] [trunk/] [rtl/] [cavlc_read_levels.v] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 7 qiubin
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  cavlc_read_levels                                           ////
4
////                                                              ////
5
////  Description                                                 ////
6
////      decode levels for coeffs                                ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9
////      - bin qiu, qiubin@opencores.org                         ////
10
////                                                              ////
11
//////////////////////////////////////////////////////////////////////
12
////                                                              ////
13
//// Copyright (C) 2011 Authors and OPENCORES.ORG                 ////
14
////                                                              ////
15
//// This source file may be used and distributed without         ////
16
//// restriction provided that this copyright statement is not    ////
17
//// removed from the file and that any derivative work contains  ////
18
//// the original copyright notice and the associated disclaimer. ////
19
////                                                              ////
20
//// This source file is free software; you can redistribute it   ////
21
//// and/or modify it under the terms of the GNU Lesser General   ////
22
//// Public License as published by the Free Software Foundation; ////
23
//// either version 2.1 of the License, or (at your option) any   ////
24
//// later version.                                               ////
25
////                                                              ////
26
//// This source is distributed in the hope that it will be       ////
27
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
28
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
29
//// PURPOSE.  See the GNU Lesser General Public License for more ////
30
//// details.                                                     ////
31
////                                                              ////
32
//// You should have received a copy of the GNU Lesser General    ////
33
//// Public License along with this source; if not, download it   ////
34
//// from http://www.opencores.org/lgpl.shtml                     ////
35
////                                                              ////
36
//////////////////////////////////////////////////////////////////////
37 6 qiubin
 
38 7 qiubin
 
39
//2011-8-6  initiial revision
40
//2011-8-19 reverse the order of level
41
 
42 6 qiubin
//  include TrailingOnes
43
 
44
`include "defines.v"
45
 
46
module cavlc_read_levels (
47 7 qiubin
    clk,
48
    rst_n,
49
    ena,
50
    t1s_sel,
51
    prefix_sel,
52
    suffix_sel,
53
    calc_sel,
54
    TrailingOnes,
55
    TotalCoeff,
56
    rbsp,
57
    i,
58
    level_0,
59
    level_1,
60
    level_2,
61
    level_3,
62
    level_4,
63
    level_5,
64
    level_6,
65
    level_7,
66
    level_8,
67
    level_9,
68
    level_10,
69
    level_11,
70
    level_12,
71
    level_13,
72
    level_14,
73
    level_15,
74
    len_comb
75 6 qiubin
);
76
//------------------------
77
// ports
78
//------------------------
79 7 qiubin
input   clk;
80
input   rst_n;
81 6 qiubin
 
82 7 qiubin
input   ena;
83
input   t1s_sel;
84
input   prefix_sel;
85
input   suffix_sel;
86
input   calc_sel;
87 6 qiubin
 
88 7 qiubin
input   [1:0]   TrailingOnes;
89
input   [4:0]   TotalCoeff;
90
input   [0:15]  rbsp;
91
input   [3:0]   i;
92 6 qiubin
 
93 7 qiubin
output  [8:0]   level_0;
94
output  [8:0]   level_1;
95
output  [8:0]   level_2;
96
output  [8:0]   level_3;
97
output  [8:0]   level_4;
98
output  [8:0]   level_5;
99
output  [8:0]   level_6;
100
output  [8:0]   level_7;
101
output  [8:0]   level_8;
102
output  [8:0]   level_9;
103
output  [8:0]   level_10;
104
output  [8:0]   level_11;
105
output  [8:0]   level_12;
106
output  [8:0]   level_13;
107
output  [8:0]   level_14;
108
output  [8:0]   level_15;
109 6 qiubin
 
110 7 qiubin
output  [4:0]   len_comb;
111
 
112 6 qiubin
//------------------------
113
//  regs
114
//------------------------
115 7 qiubin
reg     [0:15]  rbsp_internal;        // reduce toggle rate
116
reg     [3:0]   level_prefix_comb;
117
reg     [8:0]   level_suffix;
118
reg     [4:0]   len_comb;
119 6 qiubin
 
120
//------------------------
121
// FFs
122
//------------------------
123 7 qiubin
reg     [3:0]   level_prefix;
124
reg     [2:0]   suffixLength;   // range from 0 to 6
125
reg     [8:0]   level;
126
reg     [8:0]   level_abs;
127
reg     [8:0]   level_code_tmp;
128
reg     [8:0]   level_0, level_1, level_2, level_3, level_4, level_5, level_6, level_7;
129
reg     [8:0]   level_8, level_9, level_10, level_11, level_12, level_13, level_14, level_15;
130 6 qiubin
 
131
//------------------------
132
// level_prefix_comb
133
//------------------------
134 7 qiubin
always @(*)
135
if ((t1s_sel || prefix_sel || suffix_sel)&& ena)
136
    rbsp_internal <= rbsp;
137
else
138
    rbsp_internal <= 'hffff;
139 6 qiubin
 
140
always @(*)
141 7 qiubin
if (rbsp_internal[0])         level_prefix_comb <= 0;
142
else if (rbsp_internal[1])    level_prefix_comb <= 1;
143
else if (rbsp_internal[2])    level_prefix_comb <= 2;
144
else if (rbsp_internal[3])    level_prefix_comb <= 3;
145
else if (rbsp_internal[4])    level_prefix_comb <= 4;
146
else if (rbsp_internal[5])    level_prefix_comb <= 5;
147
else if (rbsp_internal[6])    level_prefix_comb <= 6;
148
else if (rbsp_internal[7])    level_prefix_comb <= 7;
149
else if (rbsp_internal[8])    level_prefix_comb <= 8;
150
else if (rbsp_internal[9])    level_prefix_comb <= 9;
151
else if (rbsp_internal[10])   level_prefix_comb <= 10;
152
else if (rbsp_internal[11])   level_prefix_comb <= 11;
153
else if (rbsp_internal[12])   level_prefix_comb <= 12;
154
else if (rbsp_internal[13])   level_prefix_comb <= 13;
155
else if (rbsp_internal[14])   level_prefix_comb <= 14;
156
else if (rbsp_internal[15])   level_prefix_comb <= 15;
157
else                          level_prefix_comb <= 'bx;
158
 
159 6 qiubin
 
160
//------------------------
161
// level_prefix
162
//------------------------
163
always @(posedge clk or negedge rst_n)
164 7 qiubin
if (!rst_n)
165
    level_prefix <= 0;
166
else if (prefix_sel && ena)
167
    level_prefix <= level_prefix_comb;
168 6 qiubin
 
169
//------------------------
170
// suffixLength
171
//------------------------
172
wire first_level;
173
assign first_level = (i == TotalCoeff - TrailingOnes - 1);
174
 
175
always @(posedge clk or negedge rst_n)
176 7 qiubin
if (!rst_n)
177
    suffixLength <= 0;
178
else if (prefix_sel && ena) begin
179
    if (TotalCoeff > 10 && TrailingOnes < 3 && first_level )  //initialize suffixLength before proceeding first level_suffix
180
        suffixLength <= 1;
181
    else if (first_level)
182
        suffixLength <= 0;
183
    else if (suffixLength == 0 && level_abs > 2'd3)
184
        suffixLength <= 2;
185
    else if (suffixLength == 0)
186
        suffixLength <= 1;
187
    else if (  level_abs > (2'd3 << (suffixLength - 1'b1) ) && suffixLength < 6)
188
        suffixLength <= suffixLength + 1'b1;
189 6 qiubin
end
190
 
191
 
192
//------------------------
193
// level_suffix
194
//------------------------
195
always @(*)
196 7 qiubin
if (suffixLength > 0 && level_prefix <= 14)
197
    level_suffix <= {3'b0, rbsp_internal[0:5] >> (3'd6 - suffixLength)};
198
else if (level_prefix == 14)   //level_prefix == 14 && suffixLength == 0
199
    level_suffix <= {3'b0, rbsp_internal[0:3] };
200
else if (level_prefix == 15)
201
    level_suffix <= rbsp_internal[3:11];
202
else
203
    level_suffix <= 0;
204 6 qiubin
 
205
//------------------------
206
// level_code_tmp
207
//------------------------
208
always @(posedge clk or negedge rst_n)
209 7 qiubin
if (!rst_n) begin
210
    level_code_tmp <=  0;
211 6 qiubin
end
212 7 qiubin
else if (suffix_sel && ena) begin
213
    level_code_tmp <= (level_prefix << suffixLength) + level_suffix +
214
    ((suffixLength == 0 && level_prefix == 15) ? 4'd15 : 0);
215 6 qiubin
end
216
 
217
 
218
//------------------------
219
// level
220
//------------------------
221 7 qiubin
wire    [2:0]   tmp1;
222 6 qiubin
 
223
assign tmp1 = (first_level && TrailingOnes < 3)? 2'd2 : 2'd0;
224
 
225
always @(*)
226
begin
227 7 qiubin
    if (level_code_tmp % 2 == 0) begin
228
        level <= ( level_code_tmp + tmp1 + 2 ) >> 1;
229
    end
230
    else begin
231
        level <= (-level_code_tmp - tmp1 - 1 ) >> 1;
232
    end
233 6 qiubin
end
234
 
235
//------------------------
236
// level_abs
237
//------------------------
238
wire level_abs_refresh;
239
assign level_abs_refresh = calc_sel && ena;
240
 
241
always @(posedge clk or negedge rst_n)
242 7 qiubin
if (!rst_n) begin
243
    level_abs <= 0;
244 6 qiubin
end
245
else if (level_abs_refresh) begin
246 7 qiubin
    level_abs <= level[8] ? -level : level;
247 6 qiubin
end
248
 
249
//------------------------
250
// level regfile
251
//------------------------
252
always @ (posedge clk or negedge rst_n)
253
if (!rst_n) begin
254 7 qiubin
    level_0 <= 0;   level_1 <= 0;   level_2 <= 0;   level_3 <= 0;
255
    level_4 <= 0;   level_5 <= 0;   level_6 <= 0;   level_7 <= 0;
256
    level_8 <= 0;   level_9 <= 0;   level_10<= 0;   level_11<= 0;
257
    level_12<= 0;   level_13<= 0;   level_14<= 0;   level_15<= 0;
258 6 qiubin
end
259
else if (t1s_sel && ena)
260 7 qiubin
    case (i)
261
 
262
    1 : begin
263
            level_1 <= rbsp_internal[0]? -1 : 1;
264
            if (TrailingOnes[1])
265
                level_0 <= rbsp_internal[1]? -1 : 1;
266
        end
267
    2 : begin
268
            level_2 <= rbsp_internal[0]? -1 : 1;
269
            if (TrailingOnes[1])
270
                level_1 <= rbsp_internal[1]? -1 : 1;
271
            if (TrailingOnes == 3)
272
                level_0 <= rbsp_internal[2]? -1 : 1;
273
        end
274
    3 : begin
275
            level_3 <= rbsp_internal[0]? -1 : 1;
276
            if (TrailingOnes[1])
277
                level_2 <= rbsp_internal[1]? -1 : 1;
278
            if (TrailingOnes == 3)
279
                level_1 <= rbsp_internal[2]? -1 : 1;
280
        end
281
    4 : begin
282
            level_4 <= rbsp_internal[0]? -1 : 1;
283
            if (TrailingOnes[1])
284
                level_3 <= rbsp_internal[1]? -1 : 1;
285
            if (TrailingOnes == 3)
286
                level_2 <= rbsp_internal[2]? -1 : 1;
287
        end
288
    5 : begin
289
            level_5 <= rbsp_internal[0]? -1 : 1;
290
            if (TrailingOnes[1])
291
                level_4 <= rbsp_internal[1]? -1 : 1;
292
            if (TrailingOnes == 3)
293
                level_3 <= rbsp_internal[2]? -1 : 1;
294
        end
295
    6 : begin
296
            level_6 <= rbsp_internal[0]? -1 : 1;
297
            if (TrailingOnes[1])
298
                level_5 <= rbsp_internal[1]? -1 : 1;
299
            if (TrailingOnes == 3)
300
                level_4 <= rbsp_internal[2]? -1 : 1;
301
        end
302
    7 : begin
303
            level_7 <= rbsp_internal[0]? -1 : 1;
304
            if (TrailingOnes[1])
305
                level_6 <= rbsp_internal[1]? -1 : 1;
306
            if (TrailingOnes == 3)
307
                level_5 <= rbsp_internal[2]? -1 : 1;
308
        end
309
    8 : begin
310
            level_8 <= rbsp_internal[0]? -1 : 1;
311
            if (TrailingOnes[1])
312
                level_7 <= rbsp_internal[1]? -1 : 1;
313
            if (TrailingOnes == 3)
314
                level_6 <= rbsp_internal[2]? -1 : 1;
315
        end
316
    9 : begin
317
            level_9 <= rbsp_internal[0]? -1 : 1;
318
            if (TrailingOnes[1])
319
                level_8 <= rbsp_internal[1]? -1 : 1;
320
            if (TrailingOnes == 3)
321
                level_7 <= rbsp_internal[2]? -1 : 1;
322
        end
323
    10: begin
324
            level_10 <= rbsp_internal[0]? -1 : 1;
325
            if (TrailingOnes[1])
326
                level_9 <= rbsp_internal[1]? -1 : 1;
327
            if (TrailingOnes == 3)
328
                level_8 <= rbsp_internal[2]? -1 : 1;
329
        end
330
    11: begin
331
            level_11 <= rbsp_internal[0]? -1 : 1;
332
            if (TrailingOnes[1])
333
                level_10 <= rbsp_internal[1]? -1 : 1;
334
            if (TrailingOnes == 3)
335
                level_9 <= rbsp_internal[2]? -1 : 1;
336
        end
337
    12: begin
338
            level_12 <= rbsp_internal[0]? -1 : 1;
339
            if (TrailingOnes[1])
340
                level_11 <= rbsp_internal[1]? -1 : 1;
341
            if (TrailingOnes == 3)
342
                level_10 <= rbsp_internal[2]? -1 : 1;
343
        end
344
    13: begin
345
            level_13 <= rbsp_internal[0]? -1 : 1;
346
            if (TrailingOnes[1])
347
                level_12 <= rbsp_internal[1]? -1 : 1;
348
            if (TrailingOnes == 3)
349
                level_11 <= rbsp_internal[2]? -1 : 1;
350
        end
351
    14: begin
352
            level_14 <= rbsp_internal[0]? -1 : 1;
353
            if (TrailingOnes[1])
354
                level_13 <= rbsp_internal[1]? -1 : 1;
355
            if (TrailingOnes == 3)
356
                level_12 <= rbsp_internal[2]? -1 : 1;
357
        end
358
    15: begin
359
            level_15 <= rbsp_internal[0]? -1 : 1;
360
            if (TrailingOnes[1])
361
                level_14 <= rbsp_internal[1]? -1 : 1;
362
            if (TrailingOnes == 3)
363
                level_13 <= rbsp_internal[2]? -1 : 1;
364
        end
365 6 qiubin
endcase
366
else if (calc_sel && ena)
367
case (i)
368 7 qiubin
 
369
    1 :level_1 <= level;
370
    2 :level_2 <= level;
371
    3 :level_3 <= level;
372
    4 :level_4 <= level;
373
    5 :level_5 <= level;
374
    6 :level_6 <= level;
375
    7 :level_7 <= level;
376
    8 :level_8 <= level;
377
    9 :level_9 <= level;
378
    10:level_10<= level;
379
    11:level_11<= level;
380
    12:level_12<= level;
381
    13:level_13<= level;
382
    14:level_14<= level;
383
    15:level_15<= level;
384 6 qiubin
endcase
385
 
386
always @(*)
387
if(t1s_sel)
388 7 qiubin
    len_comb <= TrailingOnes;
389 6 qiubin
else if(prefix_sel)
390 7 qiubin
    len_comb <= level_prefix_comb + 1;
391 6 qiubin
else if(suffix_sel && suffixLength > 0 && level_prefix <= 14)
392 7 qiubin
    len_comb <= suffixLength;
393 6 qiubin
else if(suffix_sel && level_prefix == 14)
394 7 qiubin
    len_comb <= 4;
395 6 qiubin
else if(suffix_sel && level_prefix == 15)
396 7 qiubin
    len_comb <= 12;
397 6 qiubin
else
398 7 qiubin
    len_comb <= 0;
399 6 qiubin
 
400
endmodule

powered by: WebSVN 2.1.0

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