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

Subversion Repositories cavlc

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

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

//2011-8-7 18:57 	initial revision
 
`include "defines.v"
 
module cavlc_fsm
(
	clk,
	rst_n,
	ena,
	start,
	max_coeff_num,
	TotalCoeff,
	TotalCoeff_comb,
	TrailingOnes,
	TrailingOnes_comb,
	ZeroLeft,
	state,
	i,
	idle,
	valid
);
//------------------------
//ports
//------------------------
input clk;
input rst_n;
input ena;
input start;
 
input [4:0]	max_coeff_num;
input [4:0]	TotalCoeff;
input [4:0]	TotalCoeff_comb;
input [1:0]	TrailingOnes;
input [1:0]	TrailingOnes_comb;
input [3:0] ZeroLeft;
 
output [7:0] state;
output [3:0] i;
output idle;
output valid;
 
//------------------------
//FFs
//------------------------
reg [7:0] state;
reg [3:0] i;
reg	valid;
 
//------------------------
//state & i & valid
//------------------------
always @(posedge clk or negedge rst_n)
if (~rst_n) begin
	state	<= `cavlc_idle_s;
	i <= 0;
	valid <= 0;
end
else if (ena)
case(state)
	`cavlc_idle_s : begin
		if (start) begin
			state <= `cavlc_read_total_coeffs_s;
			valid <= 0;
		end
		else begin
			state <= `cavlc_idle_s;
		end		
	end
	`cavlc_read_total_coeffs_s : begin
		i <= TotalCoeff_comb -1;
		if (TrailingOnes_comb > 0 && TotalCoeff_comb > 0)
			state <= `cavlc_read_t1s_flags_s;
		else if (TotalCoeff_comb > 0)
			state <= `cavlc_read_level_prefix_s;
		else begin
			state <= `cavlc_idle_s;		
			valid <= 1;
		end
	end
	`cavlc_read_t1s_flags_s : begin
		if (TrailingOnes == TotalCoeff)		//TotalCoeff should not be larger than max_coeff_num
			state <= `cavlc_read_total_zeros_s;			
		else begin
			state <= `cavlc_read_level_prefix_s;
			i <= i - TrailingOnes;
		end
	end
	`cavlc_read_level_prefix_s : begin
		state <= `cavlc_read_level_suffix_s;		
	end
	`cavlc_read_level_suffix_s : begin
		state <= `cavlc_calc_level_s;		
	end
	`cavlc_calc_level_s : begin
		if ( i == 0  && TotalCoeff < max_coeff_num)
			state <= `cavlc_read_total_zeros_s;
		else if (i == 0) begin
			state <= `cavlc_read_run_befores_s;
			i <= TotalCoeff - 1;
		end
		else begin
			state <= `cavlc_read_level_prefix_s;
			i <= i - 1;
		end
	end	
	`cavlc_read_total_zeros_s : begin
		state <= `cavlc_read_run_befores_s;
		i <= TotalCoeff - 1;
	end
	`cavlc_read_run_befores_s : begin
		if (i == 0 || ZeroLeft == 0) begin
			state <= `cavlc_idle_s;
			valid <= 1;
		end
		else begin
			state <= `cavlc_read_run_befores_s;
			i <= i - 1;
		end
	end		
endcase
 
assign idle = state[`cavlc_idle_bit];
 
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.