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

Subversion Repositories nova

[/] [nova/] [tags/] [Start/] [src/] [level_decoding.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      : level_decoding.v
6
// Generated : June 9, 2005
7
// Copyright (C) 2008 Ke Xu                
8
//-------------------------------------------------------------------------------------------------
9
// Description 
10
// Devive the level_prefix,level_suffix,suffixLength,levelSuffixSize,levelCode
11
// In systemC,levelSuffixSize is decoded @LevelPrefix,in RTL,now changed to @LevelSuffix
12
// level_suffix[7:0],levelCode[7:0],level[8:0]
13
// 1. level_abs_tmp[8:0]:|levelCode+2| or |-levelCode-1|                                   | reg
14
// 2. level_abs    [7:0]:level_abs_tmp >> 1 and latched, used for suffixLength calculation | wire
15
// 3. level_tmp    [8:0]:2's complement, equals (levelCode+2)>>1 or (-levelCode-1)>>1      | wire
16
// 4. level_0 ~ level_15:According to i_level,level_tmp is assigned to level_[i_level]     | reg
17
//    level_0 ~ level_15 are 2's complement
18
//-------------------------------------------------------------------------------------------------
19
 
20
// synopsys translate_off
21
`include "timescale.v"
22
// synopsys translate_on
23
`include "nova_defines.v"
24
 
25
module level_decoding (clk,reset_n,cavlc_decoder_state,heading_one_pos,suffix_length_initialized,i_level,
26
        TotalCoeff,TrailingOnes,BitStream_buffer_output,
27
        levelSuffixSize,
28
        level_0,level_1,level_2, level_3, level_4, level_5, level_6, level_7,
29
        level_8,level_9,level_10,level_11,level_12,level_13,level_14,level_15);
30
        input clk,reset_n;
31
        input [3:0] cavlc_decoder_state;
32
        input [3:0] heading_one_pos;
33
        input suffix_length_initialized;
34
        input [3:0] i_level;
35
        input [4:0] TotalCoeff;
36
        input [1:0] TrailingOnes;
37
        input [15:0] BitStream_buffer_output;
38
        output [3:0] levelSuffixSize;
39
        output [8:0] level_0,level_1,level_2,level_3,level_4,level_5,level_6,level_7;
40
        output [8:0] level_8,level_9,level_10,level_11,level_12,level_13,level_14,level_15;
41
 
42
        reg [3:0] levelSuffixSize;
43
        reg [8:0] level_0,level_1,level_2,level_3,level_4,level_5,level_6,level_7;
44
        reg [8:0] level_8,level_9,level_10,level_11,level_12,level_13,level_14,level_15;
45
 
46
        reg [3:0] level_prefix;
47
        reg [3:0] suffixLength;
48
        reg [11:0] level_suffix;
49
        reg [8:0] levelCode;
50
        reg [8:0] level_tmp;
51
        reg [7:0] level_abs;
52
 
53
        wire [8:0] levelCode_tmp;
54
 
55
        //@LevelPrefix,latch the result
56
        always @ (posedge clk)
57
                if (reset_n == 0)
58
                        level_prefix <= 0;
59
                else if (cavlc_decoder_state == `LevelPrefix)
60
                        level_prefix <= heading_one_pos;
61
        //@LevelPrefix,latch the result         
62
        always @ (posedge clk)
63
                if (reset_n == 0)
64
                        suffixLength <= 0;
65
                else if (cavlc_decoder_state == `LevelPrefix)
66
                        begin
67
                                if (suffix_length_initialized == 1'b0)
68
                                        suffixLength <= (TotalCoeff > 10 && TrailingOnes < 3)? 4'd1:4'd0;
69
                                //Revise log:March 26,2006
70
                                //else if (suffixLength == 0 && ((level_abs > (8'd3 << (suffixLength - 1))) && suffixLength < 6))
71
                                else if (suffixLength == 0 && level_abs > 8'd3)
72
                                        suffixLength <= 4'd2;
73
                                else if (suffixLength == 0)
74
                                        suffixLength <= 4'd1;
75
                                else if ((level_abs > (8'd3 << (suffixLength - 1))) && suffixLength < 6)
76
                                        suffixLength <= suffixLength + 1;
77
                        end
78
        //@LevelSuffix,temporary result
79
        always @ (cavlc_decoder_state or level_prefix or suffixLength)
80
                if (cavlc_decoder_state == `LevelSuffix)
81
                        begin
82
                                if (level_prefix == 14 && suffixLength == 0)
83
                                        levelSuffixSize <= 4;
84
                                else if (level_prefix == 4'd15)
85
                                        levelSuffixSize <= 4'd12;
86
                                else
87
                                        levelSuffixSize <= suffixLength;
88
                        end
89
                else
90
                        levelSuffixSize <= 0;
91
        //@LevelSuffix,temporay result
92
        always  @ (cavlc_decoder_state or levelSuffixSize or BitStream_buffer_output)
93
                if (cavlc_decoder_state == `LevelSuffix)
94
                        begin
95
                                if (levelSuffixSize == 0)
96
                                        level_suffix <= 0;
97
                                else
98
                                        case (levelSuffixSize)
99
                                                1 :level_suffix <= {11'b0,BitStream_buffer_output[15]};
100
                                                2 :level_suffix <= {10'b0,BitStream_buffer_output[15:14]};
101
                                                3 :level_suffix <= {9'b0,BitStream_buffer_output[15:13]};
102
                                                4 :level_suffix <= {8'b0,BitStream_buffer_output[15:12]};
103
                                                5 :level_suffix <= {7'b0,BitStream_buffer_output[15:11]};
104
                                                6 :level_suffix <= {6'b0,BitStream_buffer_output[15:10]};
105
                                                7 :level_suffix <= {5'b0,BitStream_buffer_output[15:9]};
106
                                                8 :level_suffix <= {4'b0,BitStream_buffer_output[15:8]};
107
                                                9 :level_suffix <= {3'b0,BitStream_buffer_output[15:7]};
108
                                                10:level_suffix <= {2'b0,BitStream_buffer_output[15:6]};
109
                                                11:level_suffix <= {1'b0,BitStream_buffer_output[15:5]};
110
                                                12:level_suffix <= BitStream_buffer_output[15:4];
111
                                                default:level_suffix <= 0;
112
                                        endcase
113
                        end
114
                else
115
                        level_suffix <= 0;
116
 
117
        assign levelCode_tmp = (cavlc_decoder_state == `LevelSuffix)? ((level_prefix << suffixLength) + level_suffix):0;
118
 
119
        always @ (cavlc_decoder_state or level_prefix or suffixLength or i_level or TrailingOnes or levelCode_tmp)
120
                if (cavlc_decoder_state == `LevelSuffix)
121
                        begin
122
                                if (level_prefix == 15 && suffixLength == 0 && i_level == {2'b0,TrailingOnes} && TrailingOnes < 3)
123
                                        levelCode <= levelCode_tmp + 17;
124
                                else if (level_prefix == 15 && suffixLength == 0)
125
                                        levelCode <= levelCode_tmp + 15;
126
                                else if (i_level == {2'b0,TrailingOnes} && TrailingOnes < 3)
127
                                        levelCode <= levelCode_tmp + 2;
128
                                else
129
                                        levelCode <= levelCode_tmp;
130
                        end
131
                else
132
                        levelCode <= 0;
133
        //We need an additional "level_abs" signal here in order to upgrade suffixLength for next codeword,but for 
134
        //trailingones,no need to do so since abs(+1/-1) will never greater than (3<<(suffixLength-1)).
135
 
136
        //level_abs_tmp:absolute value of level
137
        reg [8:0] level_abs_tmp;
138
        always @ (cavlc_decoder_state or levelCode)
139
           if (cavlc_decoder_state == `LevelSuffix)
140
                        begin
141
                                if (levelCode[0] == 1'b0) //even
142
                                        level_abs_tmp <= levelCode + 2;
143
                                else
144
                                        level_abs_tmp <= levelCode + 1;
145
                        end
146
                else
147
                        level_abs_tmp <= 0;
148
 
149
        //level_abs:latched absolute value of level,for upgrading of suffixLength
150
        always @ (posedge clk)
151
                if (reset_n == 0)
152
                        level_abs <= 0;
153
                else if (cavlc_decoder_state == `LevelSuffix)
154
                        level_abs <= level_abs_tmp[8:1];
155
 
156
        always @ (cavlc_decoder_state or levelCode or level_abs_tmp)
157
                if (cavlc_decoder_state == `LevelSuffix)
158
                        begin
159
                                if (levelCode[0] == 1'b0) //even
160
                                        level_tmp <= {1'b0,level_abs_tmp[8:1]};
161
                                else
162
                                        level_tmp <= {1'b1,~levelCode[8:1]};
163
                        end
164
                else
165
                        level_tmp <= 0;
166
 
167
        always @ (posedge clk)
168
                if (reset_n == 0)
169
                        begin
170
                                level_0 <= 0;    level_1 <= 0;    level_2 <= 0;    level_3 <= 0;
171
                                level_4 <= 0;    level_5 <= 0;    level_6 <= 0;    level_7 <= 0;
172
                                level_8 <= 0;    level_9 <= 0;    level_10<= 0;    level_11<= 0;
173
                                level_12<= 0;    level_13<= 0;    level_14<= 0;    level_15<= 0;
174
                        end
175
                else if (cavlc_decoder_state == `TrailingOnesSignFlag)
176
                        begin
177
                                level_0 <= (BitStream_buffer_output[15] == 0)? 9'b000000001:9'b111111111;
178
                                if (TrailingOnes > 1)
179
                                        level_1 <= (BitStream_buffer_output[14] == 0)? 9'b000000001:9'b111111111;
180
                                if (TrailingOnes == 3)
181
                                        level_2 <= (BitStream_buffer_output[13] == 0)? 9'b000000001:9'b111111111;
182
                        end
183
                else if (cavlc_decoder_state == `LevelSuffix)
184
                        case (i_level)
185
 
186
                                1 :level_1 <= level_tmp;
187
                                2 :level_2 <= level_tmp;
188
                                3 :level_3 <= level_tmp;
189
                                4 :level_4 <= level_tmp;
190
                                5 :level_5 <= level_tmp;
191
                                6 :level_6 <= level_tmp;
192
                                7 :level_7 <= level_tmp;
193
                                8 :level_8 <= level_tmp;
194
                                9 :level_9 <= level_tmp;
195
                                10:level_10<= level_tmp;
196
                                11:level_11<= level_tmp;
197
                                12:level_12<= level_tmp;
198
                                13:level_13<= level_tmp;
199
                                14:level_14<= level_tmp;
200
                                15:level_15<= level_tmp;
201
                        endcase
202
endmodule
203
 
204
 
205
 
206
 

powered by: WebSVN 2.1.0

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