Line 1... |
Line 1... |
|
//////////////////////////////////////////////////////////////////////
|
|
//// ////
|
|
//// cavlc_read_levels ////
|
|
//// ////
|
|
//// Description ////
|
|
//// decode levels for coeffs ////
|
|
//// ////
|
|
//// Author(s): ////
|
|
//// - bin qiu, qiubin@opencores.org ////
|
|
//// ////
|
|
//////////////////////////////////////////////////////////////////////
|
|
//// ////
|
|
//// Copyright (C) 2011 Authors and OPENCORES.ORG ////
|
|
//// ////
|
|
//// This source file may be used and distributed without ////
|
|
//// restriction provided that this copyright statement is not ////
|
|
//// removed from the file and that any derivative work contains ////
|
|
//// the original copyright notice and the associated disclaimer. ////
|
|
//// ////
|
|
//// This source file is free software; you can redistribute it ////
|
|
//// and/or modify it under the terms of the GNU Lesser General ////
|
|
//// Public License as published by the Free Software Foundation; ////
|
|
//// either version 2.1 of the License, or (at your option) any ////
|
|
//// later version. ////
|
|
//// ////
|
|
//// This source is distributed in the hope that it will be ////
|
|
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
|
|
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
|
|
//// PURPOSE. See the GNU Lesser General Public License for more ////
|
|
//// details. ////
|
|
//// ////
|
|
//// You should have received a copy of the GNU Lesser General ////
|
|
//// Public License along with this source; if not, download it ////
|
|
//// from http://www.opencores.org/lgpl.shtml ////
|
|
//// ////
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
//2011-8-6 initiial revision
|
//2011-8-6 initiial revision
|
//2011-8-19 reverse the order of level
|
//2011-8-19 reverse the order of level
|
|
|
// include TrailingOnes
|
// include TrailingOnes
|
|
|
Line 15... |
Line 53... |
calc_sel,
|
calc_sel,
|
TrailingOnes,
|
TrailingOnes,
|
TotalCoeff,
|
TotalCoeff,
|
rbsp,
|
rbsp,
|
i,
|
i,
|
level_0, level_1, level_2, level_3, level_4, level_5, level_6, level_7,
|
level_0,
|
level_8, level_9, level_10, level_11, level_12, level_13, level_14, level_15,
|
level_1,
|
|
level_2,
|
|
level_3,
|
|
level_4,
|
|
level_5,
|
|
level_6,
|
|
level_7,
|
|
level_8,
|
|
level_9,
|
|
level_10,
|
|
level_11,
|
|
level_12,
|
|
level_13,
|
|
level_14,
|
|
level_15,
|
len_comb
|
len_comb
|
);
|
);
|
//------------------------
|
//------------------------
|
// ports
|
// ports
|
//------------------------
|
//------------------------
|
Line 36... |
Line 88... |
input [1:0] TrailingOnes;
|
input [1:0] TrailingOnes;
|
input [4:0] TotalCoeff;
|
input [4:0] TotalCoeff;
|
input [0:15] rbsp;
|
input [0:15] rbsp;
|
input [3:0] i;
|
input [3:0] i;
|
|
|
output [8:0] level_0, level_1, level_2, level_3, level_4, level_5, level_6, level_7;
|
output [8:0] level_0;
|
output [8:0] level_8, level_9, level_10, level_11, level_12, level_13, level_14, level_15;
|
output [8:0] level_1;
|
|
output [8:0] level_2;
|
|
output [8:0] level_3;
|
|
output [8:0] level_4;
|
|
output [8:0] level_5;
|
|
output [8:0] level_6;
|
|
output [8:0] level_7;
|
|
output [8:0] level_8;
|
|
output [8:0] level_9;
|
|
output [8:0] level_10;
|
|
output [8:0] level_11;
|
|
output [8:0] level_12;
|
|
output [8:0] level_13;
|
|
output [8:0] level_14;
|
|
output [8:0] level_15;
|
|
|
output [4:0] len_comb;
|
output [4:0] len_comb;
|
|
|
//------------------------
|
//------------------------
|
// regs
|
// regs
|
//------------------------
|
//------------------------
|
reg [0:15] rbsp_prefix; //for level_prefix_comb
|
reg [0:15] rbsp_internal; // reduce toggle rate
|
reg [3:0] level_prefix_comb;
|
reg [3:0] level_prefix_comb;
|
reg [8:0] level_suffix;
|
reg [8:0] level_suffix;
|
reg [4:0] len_comb;
|
reg [4:0] len_comb;
|
|
|
//------------------------
|
//------------------------
|
Line 62... |
Line 129... |
reg [8:0] level_8, level_9, level_10, level_11, level_12, level_13, level_14, level_15;
|
reg [8:0] level_8, level_9, level_10, level_11, level_12, level_13, level_14, level_15;
|
|
|
//------------------------
|
//------------------------
|
// level_prefix_comb
|
// level_prefix_comb
|
//------------------------
|
//------------------------
|
wire level_prefix_refresh;
|
always @(*)
|
assign level_prefix_refresh = (prefix_sel && ena);
|
if ((t1s_sel || prefix_sel || suffix_sel)&& ena)
|
|
rbsp_internal <= rbsp;
|
always @(level_prefix_refresh or rbsp)
|
|
if (level_prefix_refresh)
|
|
rbsp_prefix <= rbsp;
|
|
else
|
else
|
rbsp_prefix <= 'hffff;
|
rbsp_internal <= 'hffff;
|
|
|
always @(*)
|
always @(*)
|
if (rbsp_prefix[0]) level_prefix_comb <= 0;
|
if (rbsp_internal[0]) level_prefix_comb <= 0;
|
else if (rbsp_prefix[1]) level_prefix_comb <= 1;
|
else if (rbsp_internal[1]) level_prefix_comb <= 1;
|
else if (rbsp_prefix[2]) level_prefix_comb <= 2;
|
else if (rbsp_internal[2]) level_prefix_comb <= 2;
|
else if (rbsp_prefix[3]) level_prefix_comb <= 3;
|
else if (rbsp_internal[3]) level_prefix_comb <= 3;
|
else if (rbsp_prefix[4]) level_prefix_comb <= 4;
|
else if (rbsp_internal[4]) level_prefix_comb <= 4;
|
else if (rbsp_prefix[5]) level_prefix_comb <= 5;
|
else if (rbsp_internal[5]) level_prefix_comb <= 5;
|
else if (rbsp_prefix[6]) level_prefix_comb <= 6;
|
else if (rbsp_internal[6]) level_prefix_comb <= 6;
|
else if (rbsp_prefix[7]) level_prefix_comb <= 7;
|
else if (rbsp_internal[7]) level_prefix_comb <= 7;
|
else if (rbsp_prefix[8]) level_prefix_comb <= 8;
|
else if (rbsp_internal[8]) level_prefix_comb <= 8;
|
else if (rbsp_prefix[9]) level_prefix_comb <= 9;
|
else if (rbsp_internal[9]) level_prefix_comb <= 9;
|
else if (rbsp_prefix[10]) level_prefix_comb <= 10;
|
else if (rbsp_internal[10]) level_prefix_comb <= 10;
|
else if (rbsp_prefix[11]) level_prefix_comb <= 11;
|
else if (rbsp_internal[11]) level_prefix_comb <= 11;
|
else if (rbsp_prefix[12]) level_prefix_comb <= 12;
|
else if (rbsp_internal[12]) level_prefix_comb <= 12;
|
else if (rbsp_prefix[13]) level_prefix_comb <= 13;
|
else if (rbsp_internal[13]) level_prefix_comb <= 13;
|
else if (rbsp_prefix[14]) level_prefix_comb <= 14;
|
else if (rbsp_internal[14]) level_prefix_comb <= 14;
|
else if (rbsp_prefix[15]) level_prefix_comb <= 15;
|
else if (rbsp_internal[15]) level_prefix_comb <= 15;
|
else level_prefix_comb <= 'bx;
|
else level_prefix_comb <= 'bx;
|
|
|
|
|
//------------------------
|
//------------------------
|
// level_prefix
|
// level_prefix
|
//------------------------
|
//------------------------
|
always @(posedge clk or negedge rst_n)
|
always @(posedge clk or negedge rst_n)
|
if (~rst_n)
|
if (!rst_n)
|
level_prefix <= 0;
|
level_prefix <= 0;
|
else if (level_prefix_refresh) begin
|
else if (prefix_sel && ena)
|
level_prefix <= level_prefix_comb;
|
level_prefix <= level_prefix_comb;
|
end
|
|
|
|
//------------------------
|
//------------------------
|
// suffixLength
|
// suffixLength
|
//------------------------
|
//------------------------
|
wire first_level;
|
wire first_level;
|
assign first_level = (i == TotalCoeff - TrailingOnes - 1);
|
assign first_level = (i == TotalCoeff - TrailingOnes - 1);
|
|
|
wire suffixLength_refresh;
|
|
assign suffixLength_refresh = prefix_sel && ena;
|
|
|
|
always @(posedge clk or negedge rst_n)
|
always @(posedge clk or negedge rst_n)
|
if (~rst_n) begin
|
if (!rst_n)
|
suffixLength <= 0;
|
suffixLength <= 0;
|
end
|
else if (prefix_sel && ena) begin
|
else if (suffixLength_refresh) begin
|
|
if (TotalCoeff > 10 && TrailingOnes < 3 && first_level ) //initialize suffixLength before proceeding first level_suffix
|
if (TotalCoeff > 10 && TrailingOnes < 3 && first_level ) //initialize suffixLength before proceeding first level_suffix
|
suffixLength <= 1;
|
suffixLength <= 1;
|
else if (first_level)
|
else if (first_level)
|
suffixLength <= 0;
|
suffixLength <= 0;
|
else if (suffixLength == 0 && level_abs > 2'd3)
|
else if (suffixLength == 0 && level_abs > 2'd3)
|
Line 131... |
Line 190... |
|
|
|
|
//------------------------
|
//------------------------
|
// level_suffix
|
// level_suffix
|
//------------------------
|
//------------------------
|
wire level_suffix_refresh;
|
|
assign level_suffix_refresh = suffix_sel && ena;
|
|
|
|
always @(*)
|
always @(*)
|
if (level_suffix_refresh) begin
|
if (suffixLength > 0 && level_prefix <= 14)
|
if (suffixLength > 0 && level_prefix <= 14) begin
|
level_suffix <= {3'b0, rbsp_internal[0:5] >> (3'd6 - suffixLength)};
|
level_suffix <= {3'b0, rbsp[0:5] >> (3'd6 - suffixLength)};
|
else if (level_prefix == 14) //level_prefix == 14 && suffixLength == 0
|
end
|
level_suffix <= {3'b0, rbsp_internal[0:3] };
|
else if (level_prefix == 14) begin //level_prefix == 14 && suffixLength == 0
|
else if (level_prefix == 15)
|
level_suffix <= {3'b0, rbsp[0:3] };
|
level_suffix <= rbsp_internal[3:11];
|
end
|
else
|
else if (level_prefix == 15) begin
|
|
level_suffix <= rbsp[3:11];
|
|
end
|
|
else begin
|
|
level_suffix <= 0;
|
|
end
|
|
end
|
|
else begin
|
|
level_suffix <= 0;
|
level_suffix <= 0;
|
end
|
|
|
|
//------------------------
|
//------------------------
|
// level_code_tmp
|
// level_code_tmp
|
//------------------------
|
//------------------------
|
always @(posedge clk or negedge rst_n)
|
always @(posedge clk or negedge rst_n)
|
if (~rst_n) begin
|
if (!rst_n) begin
|
level_code_tmp <= 0;
|
level_code_tmp <= 0;
|
end
|
end
|
else if (level_suffix_refresh) begin
|
else if (suffix_sel && ena) begin
|
level_code_tmp <= (level_prefix << suffixLength) + level_suffix +
|
level_code_tmp <= (level_prefix << suffixLength) + level_suffix +
|
((suffixLength == 0 && level_prefix == 15) ? 4'd15 : 0);
|
((suffixLength == 0 && level_prefix == 15) ? 4'd15 : 0);
|
end
|
end
|
|
|
|
|
Line 190... |
Line 237... |
//------------------------
|
//------------------------
|
wire level_abs_refresh;
|
wire level_abs_refresh;
|
assign level_abs_refresh = calc_sel && ena;
|
assign level_abs_refresh = calc_sel && ena;
|
|
|
always @(posedge clk or negedge rst_n)
|
always @(posedge clk or negedge rst_n)
|
if (~rst_n) begin
|
if (!rst_n) begin
|
level_abs <= 0;
|
level_abs <= 0;
|
end
|
end
|
else if (level_abs_refresh) begin
|
else if (level_abs_refresh) begin
|
level_abs <= level[8] ? -level : level;
|
level_abs <= level[8] ? -level : level;
|
end
|
end
|
Line 209... |
Line 256... |
level_8 <= 0; level_9 <= 0; level_10<= 0; level_11<= 0;
|
level_8 <= 0; level_9 <= 0; level_10<= 0; level_11<= 0;
|
level_12<= 0; level_13<= 0; level_14<= 0; level_15<= 0;
|
level_12<= 0; level_13<= 0; level_14<= 0; level_15<= 0;
|
end
|
end
|
else if (t1s_sel && ena)
|
else if (t1s_sel && ena)
|
case (i)
|
case (i)
|
0 : level_0 <= rbsp[0]? -1 : 1;
|
0 : level_0 <= rbsp_internal[0]? -1 : 1;
|
1 : begin
|
1 : begin
|
level_1 <= rbsp[0]? -1 : 1;
|
level_1 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_0 <= rbsp[1]? -1 : 1;
|
level_0 <= rbsp_internal[1]? -1 : 1;
|
end
|
end
|
2 : begin
|
2 : begin
|
level_2 <= rbsp[0]? -1 : 1;
|
level_2 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_1 <= rbsp[1]? -1 : 1;
|
level_1 <= rbsp_internal[1]? -1 : 1;
|
if (TrailingOnes == 3)
|
if (TrailingOnes == 3)
|
level_0 <= rbsp[2]? -1 : 1;
|
level_0 <= rbsp_internal[2]? -1 : 1;
|
end
|
end
|
3 : begin
|
3 : begin
|
level_3 <= rbsp[0]? -1 : 1;
|
level_3 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_2 <= rbsp[1]? -1 : 1;
|
level_2 <= rbsp_internal[1]? -1 : 1;
|
if (TrailingOnes == 3)
|
if (TrailingOnes == 3)
|
level_1 <= rbsp[2]? -1 : 1;
|
level_1 <= rbsp_internal[2]? -1 : 1;
|
end
|
end
|
4 : begin
|
4 : begin
|
level_4 <= rbsp[0]? -1 : 1;
|
level_4 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_3 <= rbsp[1]? -1 : 1;
|
level_3 <= rbsp_internal[1]? -1 : 1;
|
if (TrailingOnes == 3)
|
if (TrailingOnes == 3)
|
level_2 <= rbsp[2]? -1 : 1;
|
level_2 <= rbsp_internal[2]? -1 : 1;
|
end
|
end
|
5 : begin
|
5 : begin
|
level_5 <= rbsp[0]? -1 : 1;
|
level_5 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_4 <= rbsp[1]? -1 : 1;
|
level_4 <= rbsp_internal[1]? -1 : 1;
|
if (TrailingOnes == 3)
|
if (TrailingOnes == 3)
|
level_3 <= rbsp[2]? -1 : 1;
|
level_3 <= rbsp_internal[2]? -1 : 1;
|
end
|
end
|
6 : begin
|
6 : begin
|
level_6 <= rbsp[0]? -1 : 1;
|
level_6 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_5 <= rbsp[1]? -1 : 1;
|
level_5 <= rbsp_internal[1]? -1 : 1;
|
if (TrailingOnes == 3)
|
if (TrailingOnes == 3)
|
level_4 <= rbsp[2]? -1 : 1;
|
level_4 <= rbsp_internal[2]? -1 : 1;
|
end
|
end
|
7 : begin
|
7 : begin
|
level_7 <= rbsp[0]? -1 : 1;
|
level_7 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_6 <= rbsp[1]? -1 : 1;
|
level_6 <= rbsp_internal[1]? -1 : 1;
|
if (TrailingOnes == 3)
|
if (TrailingOnes == 3)
|
level_5 <= rbsp[2]? -1 : 1;
|
level_5 <= rbsp_internal[2]? -1 : 1;
|
end
|
end
|
8 : begin
|
8 : begin
|
level_8 <= rbsp[0]? -1 : 1;
|
level_8 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_7 <= rbsp[1]? -1 : 1;
|
level_7 <= rbsp_internal[1]? -1 : 1;
|
if (TrailingOnes == 3)
|
if (TrailingOnes == 3)
|
level_6 <= rbsp[2]? -1 : 1;
|
level_6 <= rbsp_internal[2]? -1 : 1;
|
end
|
end
|
9 : begin
|
9 : begin
|
level_9 <= rbsp[0]? -1 : 1;
|
level_9 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_8 <= rbsp[1]? -1 : 1;
|
level_8 <= rbsp_internal[1]? -1 : 1;
|
if (TrailingOnes == 3)
|
if (TrailingOnes == 3)
|
level_7 <= rbsp[2]? -1 : 1;
|
level_7 <= rbsp_internal[2]? -1 : 1;
|
end
|
end
|
10: begin
|
10: begin
|
level_10 <= rbsp[0]? -1 : 1;
|
level_10 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_9 <= rbsp[1]? -1 : 1;
|
level_9 <= rbsp_internal[1]? -1 : 1;
|
if (TrailingOnes == 3)
|
if (TrailingOnes == 3)
|
level_8 <= rbsp[2]? -1 : 1;
|
level_8 <= rbsp_internal[2]? -1 : 1;
|
end
|
end
|
11: begin
|
11: begin
|
level_11 <= rbsp[0]? -1 : 1;
|
level_11 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_10 <= rbsp[1]? -1 : 1;
|
level_10 <= rbsp_internal[1]? -1 : 1;
|
if (TrailingOnes == 3)
|
if (TrailingOnes == 3)
|
level_9 <= rbsp[2]? -1 : 1;
|
level_9 <= rbsp_internal[2]? -1 : 1;
|
end
|
end
|
12: begin
|
12: begin
|
level_12 <= rbsp[0]? -1 : 1;
|
level_12 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_11 <= rbsp[1]? -1 : 1;
|
level_11 <= rbsp_internal[1]? -1 : 1;
|
if (TrailingOnes == 3)
|
if (TrailingOnes == 3)
|
level_10 <= rbsp[2]? -1 : 1;
|
level_10 <= rbsp_internal[2]? -1 : 1;
|
end
|
end
|
13: begin
|
13: begin
|
level_13 <= rbsp[0]? -1 : 1;
|
level_13 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_12 <= rbsp[1]? -1 : 1;
|
level_12 <= rbsp_internal[1]? -1 : 1;
|
if (TrailingOnes == 3)
|
if (TrailingOnes == 3)
|
level_11 <= rbsp[2]? -1 : 1;
|
level_11 <= rbsp_internal[2]? -1 : 1;
|
end
|
end
|
14: begin
|
14: begin
|
level_14 <= rbsp[0]? -1 : 1;
|
level_14 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_13 <= rbsp[1]? -1 : 1;
|
level_13 <= rbsp_internal[1]? -1 : 1;
|
if (TrailingOnes == 3)
|
if (TrailingOnes == 3)
|
level_12 <= rbsp[2]? -1 : 1;
|
level_12 <= rbsp_internal[2]? -1 : 1;
|
end
|
end
|
15: begin
|
15: begin
|
level_15 <= rbsp[0]? -1 : 1;
|
level_15 <= rbsp_internal[0]? -1 : 1;
|
if (TrailingOnes[1])
|
if (TrailingOnes[1])
|
level_14 <= rbsp[1]? -1 : 1;
|
level_14 <= rbsp_internal[1]? -1 : 1;
|
if (TrailingOnes == 3)
|
if (TrailingOnes == 3)
|
level_13 <= rbsp[2]? -1 : 1;
|
level_13 <= rbsp_internal[2]? -1 : 1;
|
end
|
end
|
endcase
|
endcase
|
else if (calc_sel && ena)
|
else if (calc_sel && ena)
|
case (i)
|
case (i)
|
0 :level_0 <= level;
|
0 :level_0 <= level;
|