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

Subversion Repositories cavlc

[/] [cavlc/] [trunk/] [rtl/] [cavlc_read_levels.v] - Rev 6

Go to most recent revision | Compare with Previous | Blame | View Log

//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, level_1, level_2, level_3, level_4, level_5, level_6, level_7;
output	[8:0]	level_8, level_9, level_10, level_11, level_12, level_13, level_14, level_15;
output	[4:0]	len_comb;
 
//------------------------
//  regs
//------------------------
reg		[0:15]	rbsp_prefix;		//for level_prefix_comb
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
//------------------------
wire	level_prefix_refresh;
assign level_prefix_refresh = (prefix_sel && ena);
 
always @(level_prefix_refresh or rbsp)
if (level_prefix_refresh)
	rbsp_prefix <= rbsp;
else
	rbsp_prefix <= 'hffff;
 
always @(*)
if (rbsp_prefix[0]) 		level_prefix_comb <= 0;
else if (rbsp_prefix[1]) 	level_prefix_comb <= 1;
else if (rbsp_prefix[2]) 	level_prefix_comb <= 2;
else if (rbsp_prefix[3])	level_prefix_comb <= 3;
else if (rbsp_prefix[4]) 	level_prefix_comb <= 4;
else if (rbsp_prefix[5]) 	level_prefix_comb <= 5;
else if (rbsp_prefix[6]) 	level_prefix_comb <= 6;
else if (rbsp_prefix[7]) 	level_prefix_comb <= 7;
else if (rbsp_prefix[8]) 	level_prefix_comb <= 8;
else if (rbsp_prefix[9]) 	level_prefix_comb <= 9;
else if (rbsp_prefix[10]) 	level_prefix_comb <= 10;
else if (rbsp_prefix[11])	level_prefix_comb <= 11;
else if (rbsp_prefix[12])	level_prefix_comb <= 12; 
else if (rbsp_prefix[13]) 	level_prefix_comb <= 13; 
else if (rbsp_prefix[14]) 	level_prefix_comb <= 14;
else if (rbsp_prefix[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 (level_prefix_refresh) begin
	level_prefix <= level_prefix_comb;
end
 
//------------------------
// suffixLength
//------------------------
wire first_level;
assign first_level = (i == TotalCoeff - TrailingOnes - 1);
 
wire suffixLength_refresh;
assign suffixLength_refresh = prefix_sel && ena;
 
always @(posedge clk or negedge rst_n)
if (~rst_n) begin
	suffixLength <= 0;
end
else if (suffixLength_refresh) 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
//------------------------
wire level_suffix_refresh;
assign level_suffix_refresh = suffix_sel && ena;
 
always @(*)
if (level_suffix_refresh) begin
	if (suffixLength > 0 && level_prefix <= 14) begin
		level_suffix <= {3'b0, rbsp[0:5] >> (3'd6 - suffixLength)};
	end
	else if (level_prefix == 14) begin	//level_prefix == 14 && suffixLength == 0
		level_suffix <= {3'b0, rbsp[0:3] };
	end
	else if (level_prefix == 15) begin
		level_suffix <= rbsp[3:11];	    
	end
	else begin
		level_suffix <= 0;	    
	end		
end
else begin
	level_suffix <= 0;	    
end
 
//------------------------
// level_code_tmp
//------------------------
always @(posedge clk or negedge rst_n)
if (~rst_n) begin
	level_code_tmp <=  0;
end
else if (level_suffix_refresh) 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[0]? -1 : 1;
	1 : begin
			level_1 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_0 <= rbsp[1]? -1 : 1;
		end
	2 : begin
			level_2 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_1 <= rbsp[1]? -1 : 1;
			if (TrailingOnes == 3)
				level_0 <= rbsp[2]? -1 : 1;
		end			
	3 : begin
			level_3 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_2 <= rbsp[1]? -1 : 1;
			if (TrailingOnes == 3)
				level_1 <= rbsp[2]? -1 : 1;
		end	
	4 : begin
			level_4 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_3 <= rbsp[1]? -1 : 1;
			if (TrailingOnes == 3)
				level_2 <= rbsp[2]? -1 : 1;
		end	
	5 : begin
			level_5 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_4 <= rbsp[1]? -1 : 1;
			if (TrailingOnes == 3)
				level_3 <= rbsp[2]? -1 : 1;
		end	
	6 : begin
			level_6 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_5 <= rbsp[1]? -1 : 1;
			if (TrailingOnes == 3)
				level_4 <= rbsp[2]? -1 : 1;
		end	
	7 : begin
			level_7 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_6 <= rbsp[1]? -1 : 1;
			if (TrailingOnes == 3)
				level_5 <= rbsp[2]? -1 : 1;
		end	
	8 : begin
			level_8 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_7 <= rbsp[1]? -1 : 1;
			if (TrailingOnes == 3)
				level_6 <= rbsp[2]? -1 : 1;
		end	
	9 : begin
			level_9 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_8 <= rbsp[1]? -1 : 1;
			if (TrailingOnes == 3)
				level_7 <= rbsp[2]? -1 : 1;
		end	
	10: begin
			level_10 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_9 <= rbsp[1]? -1 : 1;
			if (TrailingOnes == 3)
				level_8 <= rbsp[2]? -1 : 1;
		end	
	11: begin
			level_11 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_10 <= rbsp[1]? -1 : 1;
			if (TrailingOnes == 3)
				level_9 <= rbsp[2]? -1 : 1;
		end	
	12: begin
			level_12 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_11 <= rbsp[1]? -1 : 1;
			if (TrailingOnes == 3)
				level_10 <= rbsp[2]? -1 : 1;
		end	
	13: begin
			level_13 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_12 <= rbsp[1]? -1 : 1;
			if (TrailingOnes == 3)
				level_11 <= rbsp[2]? -1 : 1;
		end	
	14: begin
			level_14 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_13 <= rbsp[1]? -1 : 1;
			if (TrailingOnes == 3)
				level_12 <= rbsp[2]? -1 : 1;
		end	
	15: begin
			level_15 <= rbsp[0]? -1 : 1;
			if (TrailingOnes[1])
				level_14 <= rbsp[1]? -1 : 1;
			if (TrailingOnes == 3)
				level_13 <= rbsp[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
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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