SOFA/BENCHMARK/cavlc_top/rtl/cavlc_read_levels.v

401 lines
13 KiB
Verilog

//////////////////////////////////////////////////////////////////////
//// ////
//// 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-19 reverse the order of level
// include TrailingOnes
`include "defines.v"
module cavlc_read_levels (
clk,
rst_n,
ena,
t1s_sel,
prefix_sel,
suffix_sel,
calc_sel,
TrailingOnes,
TotalCoeff,
rbsp,
i,
level_0,
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
);
//------------------------
// ports
//------------------------
input clk;
input rst_n;
input ena;
input t1s_sel;
input prefix_sel;
input suffix_sel;
input calc_sel;
input [1:0] TrailingOnes;
input [4:0] TotalCoeff;
input [0:15] rbsp;
input [3:0] i;
output [8:0] level_0;
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;
//------------------------
// regs
//------------------------
reg [0:15] rbsp_internal; // reduce toggle rate
reg [3:0] level_prefix_comb;
reg [8:0] level_suffix;
reg [4:0] len_comb;
//------------------------
// FFs
//------------------------
reg [3:0] level_prefix;
reg [2:0] suffixLength; // range from 0 to 6
reg [8:0] level;
reg [8:0] level_abs;
reg [8:0] level_code_tmp;
reg [8:0] level_0, level_1, level_2, level_3, level_4, level_5, level_6, level_7;
reg [8:0] level_8, level_9, level_10, level_11, level_12, level_13, level_14, level_15;
//------------------------
// level_prefix_comb
//------------------------
always @(*)
if ((t1s_sel || prefix_sel || suffix_sel)&& ena)
rbsp_internal <= rbsp;
else
rbsp_internal <= 'hffff;
always @(*)
if (rbsp_internal[0]) level_prefix_comb <= 0;
else if (rbsp_internal[1]) level_prefix_comb <= 1;
else if (rbsp_internal[2]) level_prefix_comb <= 2;
else if (rbsp_internal[3]) level_prefix_comb <= 3;
else if (rbsp_internal[4]) level_prefix_comb <= 4;
else if (rbsp_internal[5]) level_prefix_comb <= 5;
else if (rbsp_internal[6]) level_prefix_comb <= 6;
else if (rbsp_internal[7]) level_prefix_comb <= 7;
else if (rbsp_internal[8]) level_prefix_comb <= 8;
else if (rbsp_internal[9]) level_prefix_comb <= 9;
else if (rbsp_internal[10]) level_prefix_comb <= 10;
else if (rbsp_internal[11]) level_prefix_comb <= 11;
else if (rbsp_internal[12]) level_prefix_comb <= 12;
else if (rbsp_internal[13]) level_prefix_comb <= 13;
else if (rbsp_internal[14]) level_prefix_comb <= 14;
else if (rbsp_internal[15]) level_prefix_comb <= 15;
else level_prefix_comb <= 'bx;
//------------------------
// level_prefix
//------------------------
always @(posedge clk or negedge rst_n)
if (!rst_n)
level_prefix <= 0;
else if (prefix_sel && ena)
level_prefix <= level_prefix_comb;
//------------------------
// suffixLength
//------------------------
wire first_level;
assign first_level = (i == TotalCoeff - TrailingOnes - 1);
always @(posedge clk or negedge rst_n)
if (!rst_n)
suffixLength <= 0;
else if (prefix_sel && ena) begin
if (TotalCoeff > 10 && TrailingOnes < 3 && first_level ) //initialize suffixLength before proceeding first level_suffix
suffixLength <= 1;
else if (first_level)
suffixLength <= 0;
else if (suffixLength == 0 && level_abs > 2'd3)
suffixLength <= 2;
else if (suffixLength == 0)
suffixLength <= 1;
else if ( level_abs > (2'd3 << (suffixLength - 1'b1) ) && suffixLength < 6)
suffixLength <= suffixLength + 1'b1;
end
//------------------------
// level_suffix
//------------------------
always @(*)
if (suffixLength > 0 && level_prefix <= 14)
level_suffix <= {3'b0, rbsp_internal[0:5] >> (3'd6 - suffixLength)};
else if (level_prefix == 14) //level_prefix == 14 && suffixLength == 0
level_suffix <= {3'b0, rbsp_internal[0:3] };
else if (level_prefix == 15)
level_suffix <= rbsp_internal[3:11];
else
level_suffix <= 0;
//------------------------
// level_code_tmp
//------------------------
always @(posedge clk or negedge rst_n)
if (!rst_n) begin
level_code_tmp <= 0;
end
else if (suffix_sel && ena) begin
level_code_tmp <= (level_prefix << suffixLength) + level_suffix +
((suffixLength == 0 && level_prefix == 15) ? 4'd15 : 0);
end
//------------------------
// level
//------------------------
wire [2:0] tmp1;
assign tmp1 = (first_level && TrailingOnes < 3)? 2'd2 : 2'd0;
always @(*)
begin
if (level_code_tmp % 2 == 0) begin
level <= ( level_code_tmp + tmp1 + 2 ) >> 1;
end
else begin
level <= (-level_code_tmp - tmp1 - 1 ) >> 1;
end
end
//------------------------
// level_abs
//------------------------
wire level_abs_refresh;
assign level_abs_refresh = calc_sel && ena;
always @(posedge clk or negedge rst_n)
if (!rst_n) begin
level_abs <= 0;
end
else if (level_abs_refresh) begin
level_abs <= level[8] ? -level : level;
end
//------------------------
// level regfile
//------------------------
always @ (posedge clk or negedge rst_n)
if (!rst_n) begin
level_0 <= 0; level_1 <= 0; level_2 <= 0; level_3 <= 0;
level_4 <= 0; level_5 <= 0; level_6 <= 0; level_7 <= 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;
end
else if (t1s_sel && ena)
case (i)
0 : level_0 <= rbsp_internal[0]? -1 : 1;
1 : begin
level_1 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_0 <= rbsp_internal[1]? -1 : 1;
end
2 : begin
level_2 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_1 <= rbsp_internal[1]? -1 : 1;
if (TrailingOnes == 3)
level_0 <= rbsp_internal[2]? -1 : 1;
end
3 : begin
level_3 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_2 <= rbsp_internal[1]? -1 : 1;
if (TrailingOnes == 3)
level_1 <= rbsp_internal[2]? -1 : 1;
end
4 : begin
level_4 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_3 <= rbsp_internal[1]? -1 : 1;
if (TrailingOnes == 3)
level_2 <= rbsp_internal[2]? -1 : 1;
end
5 : begin
level_5 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_4 <= rbsp_internal[1]? -1 : 1;
if (TrailingOnes == 3)
level_3 <= rbsp_internal[2]? -1 : 1;
end
6 : begin
level_6 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_5 <= rbsp_internal[1]? -1 : 1;
if (TrailingOnes == 3)
level_4 <= rbsp_internal[2]? -1 : 1;
end
7 : begin
level_7 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_6 <= rbsp_internal[1]? -1 : 1;
if (TrailingOnes == 3)
level_5 <= rbsp_internal[2]? -1 : 1;
end
8 : begin
level_8 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_7 <= rbsp_internal[1]? -1 : 1;
if (TrailingOnes == 3)
level_6 <= rbsp_internal[2]? -1 : 1;
end
9 : begin
level_9 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_8 <= rbsp_internal[1]? -1 : 1;
if (TrailingOnes == 3)
level_7 <= rbsp_internal[2]? -1 : 1;
end
10: begin
level_10 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_9 <= rbsp_internal[1]? -1 : 1;
if (TrailingOnes == 3)
level_8 <= rbsp_internal[2]? -1 : 1;
end
11: begin
level_11 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_10 <= rbsp_internal[1]? -1 : 1;
if (TrailingOnes == 3)
level_9 <= rbsp_internal[2]? -1 : 1;
end
12: begin
level_12 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_11 <= rbsp_internal[1]? -1 : 1;
if (TrailingOnes == 3)
level_10 <= rbsp_internal[2]? -1 : 1;
end
13: begin
level_13 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_12 <= rbsp_internal[1]? -1 : 1;
if (TrailingOnes == 3)
level_11 <= rbsp_internal[2]? -1 : 1;
end
14: begin
level_14 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_13 <= rbsp_internal[1]? -1 : 1;
if (TrailingOnes == 3)
level_12 <= rbsp_internal[2]? -1 : 1;
end
15: begin
level_15 <= rbsp_internal[0]? -1 : 1;
if (TrailingOnes[1])
level_14 <= rbsp_internal[1]? -1 : 1;
if (TrailingOnes == 3)
level_13 <= rbsp_internal[2]? -1 : 1;
end
endcase
else if (calc_sel && ena)
case (i)
0 :level_0 <= level;
1 :level_1 <= level;
2 :level_2 <= level;
3 :level_3 <= level;
4 :level_4 <= level;
5 :level_5 <= level;
6 :level_6 <= level;
7 :level_7 <= level;
8 :level_8 <= level;
9 :level_9 <= level;
10:level_10<= level;
11:level_11<= level;
12:level_12<= level;
13:level_13<= level;
14:level_14<= level;
15:level_15<= level;
endcase
always @(*)
if(t1s_sel)
len_comb <= TrailingOnes;
else if(prefix_sel)
len_comb <= level_prefix_comb + 1;
else if(suffix_sel && suffixLength > 0 && level_prefix <= 14)
len_comb <= suffixLength;
else if(suffix_sel && level_prefix == 14)
len_comb <= 4;
else if(suffix_sel && level_prefix == 15)
len_comb <= 12;
else
len_comb <= 0;
endmodule