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 |
|
|
|