⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iezw_512.v

📁 EZW Embedded Zero-tree Wavelets Encoding,video codecs from the EZW family which use a 3D version of
💻 V
📖 第 1 页 / 共 2 页
字号:
`timescale 1ns/10ps
module	IEZW_TOP(clk,reset,Pass,IEZW_in,In_IEZW,threshold,In_flag,Out_flag,Out_Data,wire_wren,wire_wraddress,wire_MemoryInData);
input		clk,reset;
input	[2:0]	Pass;
input	[7:0]	threshold;
input	[8:0]	IEZW_in;
input	[1:0]	In_IEZW;

output		In_flag,Out_flag;
output	[8:0]	Out_Data;
output		wire_wren;
output	[18:0]	wire_wraddress;
output	[8:0]	wire_MemoryInData;

wire		In_flag,Out_flag,wire_datapath_flag;
wire	[2:0]	wire_Pass;
wire	[2:0]	wire_Done;
wire	[7:0]	wire_threshold;
wire	[4:0]	wire_DataPath;
wire		wire_wren,wire_wren_ll3,wire_wren_datapath,wire_wren_out;
wire	[8:0]	wire_IEZW_out,wire_WrDat_datapath;
wire	[8:0]	Out_Data,wire_MemoryInData,wire_MemoryOutData;
wire	[18:0]	wire_ll3_wraddress,wire_datapath_wraddress,wire_out_rdaddress,wire_datapath_rdaddress;
wire	[18:0]	wire_rdaddress,wire_wraddress;


IEZW_Control		control(.clk(clk),.reset(reset),.Pass(wire_Pass),.Done(wire_Done),.Out_EZW_DataPath(wire_DataPath));


threshold_reg		reg_0(.clk(clk),.reset(reset),.division(wire_DataPath[1]),.read(wire_DataPath[4]),.In_threshold(threshold),.Out_threshold(wire_threshold));
Pass_reg		pass_0(.clk(clk),.reset(reset),.read(wire_DataPath[4]),.In_Pass(Pass),.Out_Pass(wire_Pass));

most_low_freq		mlf(.clk(clk),.reset(reset),.ready(wire_DataPath[3]),.IEZW_in(IEZW_in),.write_en(wire_wren_ll3),.IEZW_out(wire_IEZW_out),.address_W(wire_ll3_wraddress),.Done(wire_Done[1]));

IEZW_DataPath		DataPath(.clk(clk),.reset(reset),.ready(wire_DataPath[2]),.In_IEZW(In_IEZW),.threshold(wire_threshold),
		.Read_Data(wire_MemoryOutData),.In_flag(wire_datapath_flag),.Write_en(wire_wren_datapath),.Write_Data(wire_WrDat_datapath),.Read_address(wire_datapath_rdaddress),.Write_address(wire_datapath_wraddress),.Done(wire_Done[0]));

RAM256 		RAM(.clock(clk),.wren(wire_wren),.data(wire_MemoryInData),.wraddress(wire_wraddress),.rdaddress(wire_rdaddress),.q(wire_MemoryOutData));

IEZW_output		out_0(.clk(clk),.reset(reset),.ready(wire_DataPath[0]),.In_Data(wire_MemoryOutData),.write_en(wire_wren_out),.flag(Out_flag),.Out_Data(Out_Data),.address_R(wire_out_rdaddress),.Done(wire_Done[2]));

assign	wire_wren=(wire_DataPath[0])?wire_wren_out:((wire_DataPath[3])?wire_wren_ll3:wire_wren_datapath);
assign	wire_MemoryInData=(wire_DataPath[3])?wire_IEZW_out:wire_WrDat_datapath;
assign	wire_wraddress=(wire_DataPath[3])?wire_ll3_wraddress:wire_datapath_wraddress;
assign	In_flag=(wire_DataPath[3])?wire_wren_ll3:wire_datapath_flag;
assign	wire_rdaddress=(wire_DataPath[0])?wire_out_rdaddress:wire_datapath_rdaddress;

endmodule


module Pass_reg(clk,reset,read,In_Pass,Out_Pass);
input		clk,reset,read;
input	[2:0]	In_Pass;

output	[2:0]	Out_Pass;

reg	[2:0]	Out_Pass;

always @(posedge clk) begin
	if(!reset)
		Out_Pass=0;
	else
		if(read)
			Out_Pass=In_Pass;
		else
			Out_Pass=Out_Pass;
end
endmodule


module threshold_reg(clk,reset,division,read,In_threshold,Out_threshold);
input		clk,reset,division,read;
input	[7:0]	In_threshold;

output	[7:0]	Out_threshold;

reg	[7:0]	Out_threshold;

always @(posedge clk) begin
	if(!reset)
		Out_threshold=0;
	else
		if(read)
			Out_threshold=In_threshold;
		else
			if(division)
				Out_threshold=Out_threshold >> 1;
			else
				Out_threshold=Out_threshold;
end
endmodule


module IEZW_Control(clk,reset,Pass,Done,Out_EZW_DataPath);
input		clk,reset;
input	[2:0]	Pass;
input	[2:0]	Done;

output	[4:0]	Out_EZW_DataPath;

parameter	S0=0;
parameter	S1=1;
parameter	S2=2;
parameter	S3=3;
parameter	S4=4;
parameter S5=5;
parameter S6=6;


reg	[2:0]	NextState,CurrentState;
reg	[2:0]	Pass_counter;
reg	[4:0]	Out_EZW_DataPath;

always@(posedge clk or negedge reset)
begin
	if(!reset)
		CurrentState = S0;
	else
		CurrentState = NextState;
end

always@(CurrentState or reset or Pass or Pass_counter or Done)
begin
	case(CurrentState)
		S0:begin
			if(!reset)
				NextState = S0;
			else
				NextState = S1;
		end
		
		S1:begin
		//	if(read_threshold)
				NextState = S2;//S2
		//	else
		//		NextState = S1;
		end

		S2:begin
			if(Done[1])
				NextState = S3;
			else
				NextState = S2;
		end 

		S3:begin
			if(Done[0])
				NextState = S4;
			else
				NextState = S3;
		end
		
		S4:begin
			if(Pass_counter==Pass)
				NextState = S5;
			else
				NextState = S3;
		end
				
		S5:begin
			if(Done[2])
				NextState = S6;
			else
				NextState = S5;
		end
		
		S6:	NextState = S6;
			
			
		default:NextState = S0;
	endcase
end

always@(CurrentState)
begin
	case(CurrentState)
		S0:	Out_EZW_DataPath=5'b0_0_0_0_0;//reset system
		S1:	Out_EZW_DataPath=5'b1_0_0_0_0;//read threshold
		S2:	Out_EZW_DataPath=5'b0_1_0_0_0;//read LL3 subband
		S3:	Out_EZW_DataPath=5'b0_0_1_0_0;//start IEZW
		S4:	Out_EZW_DataPath=5'b0_0_0_1_0;//shift threshold
		S5:	Out_EZW_DataPath=5'b0_0_0_0_1;//output Data
		S5:	Out_EZW_DataPath=5'b0_0_0_0_0;//output Data
		default:Out_EZW_DataPath=5'b0_0_0_0_0;
	endcase
end

always@(posedge clk)
begin
	if(!reset)
		Pass_counter=0;
	else
		if(Done[0])
			Pass_counter=Pass_counter+1'b1;
		else
			Pass_counter=Pass_counter;
end

endmodule



module most_low_freq(clk,reset,ready,IEZW_in,write_en,IEZW_out,address_W,Done);

parameter size=512;

input		clk,reset,ready;
input	[8:0]	IEZW_in;
output		write_en;
output	[8:0]	IEZW_out;
output	[18:0]	address_W;
output		Done;

reg		Done,write_en;
reg	[18:0]	address_W;

reg	[8:0]	IEZW_out;

always @(negedge clk)
begin
	if(!reset || !ready) begin
		address_W=(size/8*size/8);
	end
	else
		if(address_W==(size/8*size/8))
			address_W=19'h00000;
		else
			address_W=address_W+1'b1;
end

always@(negedge clk)
begin
	if(!reset || !ready)
		Done=1'b0;
	else
		if(address_W==(size/8*size/8))
			Done=1'b1;
		else
			Done=1'b0;
end

always@(negedge clk)
begin
	if(!reset || !ready) begin
		write_en=1'b0;
	end
	else begin
		if(address_W==19'h00000)
			write_en=1'b1;
		else if(address_W==(size/8*size/8))
			write_en=1'b0;
		else
			write_en=write_en;
	end
end

always@(negedge clk)
begin
	if(!reset || !ready) begin
		IEZW_out=9'h000;
	end
	else begin
		IEZW_out=IEZW_in;
	end
end
endmodule


module IEZW_output(clk,reset,ready,In_Data,write_en,flag,Out_Data,address_R,Done);

parameter size=512;

input		clk,reset,ready;
input	[8:0]	In_Data;
output		write_en;
output		flag;
output	[8:0]	Out_Data;
output	[18:0]	address_R;
output		Done;

reg		Done,write_en,flag;
reg	[18:0]	address_R;

reg	[8:0]	Out_Data;

always @(negedge clk)
begin
	if(!reset || !ready) begin
		address_R=(size*size);
	end
	else
		if(address_R==(size*size))
			address_R=19'h0000;
		else
			address_R=address_R+1'b1;
end

always@(negedge clk)
begin
	if(!reset || !ready) begin
		flag=1'b0;
		write_en=1'b0;
	end
	else begin
		if(address_R==19'h00000)begin
			flag=write_en;
			write_en=1'b1;
		end
		else if(address_R==(size*size))begin
			flag=write_en;
			write_en=1'b0;
		end
		else begin
			flag=write_en;
			write_en=write_en;
		end
	end
end



always@(flag or In_Data)
begin
	if(!reset || !ready)
		Out_Data=9'h000;
	else
		Out_Data=In_Data;
end

always@(negedge clk)
begin
	if(!reset || !ready)
		Done=1'b0;
	else
		if(address_R==(size*size))
			Done=1'b1;
		else
			Done=1'b0;
end

endmodule


module IEZW_DataPath(clk,reset,ready,In_IEZW,threshold,Read_Data,In_flag,Write_en,Write_Data,Read_address,Write_address,Done);
input		clk,reset,ready;
input	[1:0]	In_IEZW;
input	[7:0]	threshold;
input	[8:0]	Read_Data;

output		In_flag;
output		Write_en;
output	[8:0]	Write_Data;
output	[18:0]	Read_address,Write_address;
output		Done;

wire		wire_flag_21,wire_counter_two,wire_flag;
wire	[4:0]	wire_counter,wire_counter_stack,wire_counter_21;
wire	[18:0]	wire_address_counter;

wire		Write_en,wire_en_smap,wire_en_saq;
wire	[8:0]	Write_Data,wire_smap_data,wire_saq_data;
wire	[18:0]	Read_address,Write_address,smap_address,saq_address;
wire		Done;

IEZW_counter			counter(.clk(clk),.reset(reset),.ready(ready),.In_IEZW(In_IEZW),.wire_en_smap(wire_en_smap),.flag_21(wire_flag_21),.counter_two(wire_counter_two),.flag(wire_flag),.counter(wire_counter),.counter_stack(wire_counter_stack),.counter_21(wire_counter_21),.address_counter(wire_address_counter),.Done(Done));
IEZW_SMAP_process			SMAP(.clk(clk),.reset(reset),.ready(ready),.flag(wire_flag),.In_IEZW(In_IEZW),.threshold(threshold),.counter(wire_counter),.counter_stack(wire_counter_stack),.address_counter(wire_address_counter),.Write_en(wire_en_smap),.Write_Data(wire_smap_data),.Write_address(smap_address));
IEZW_SAQ_process			SAQ(.clk(clk),.reset(reset),.ready(ready),.flag(wire_flag),.counter_two(wire_counter_two),.threshold(threshold),.In_IEZW(In_IEZW),.Read_Data(Read_Data),.counter_21(wire_counter_21),.address_counter(wire_address_counter),.flag_21(wire_flag_21),.Write_en(wire_en_saq),.Write_Data(wire_saq_data),.address(saq_address));

assign	Write_en=wire_en_saq | wire_en_smap;
assign	Write_Data=(~wire_flag | wire_en_smap)?wire_smap_data:wire_saq_data;
assign	Write_address=(~wire_flag | wire_en_smap)?smap_address:saq_address;
assign	Read_address=(wire_counter_two)?saq_address:19'h00000;
assign	In_flag=wire_en_saq | !wire_flag;
endmodule



module IEZW_counter(clk,reset,ready,In_IEZW,wire_en_smap,flag_21,counter_two,flag,counter,counter_stack,counter_21,address_counter,Done);

parameter	size=512;

input		clk,reset,ready;
input		wire_en_smap;
input	[1:0]	In_IEZW;
input		flag_21;

output		counter_two,flag;
output	[4:0]	counter,counter_stack,counter_21;
output	[18:0]	address_counter;
output		Done;	

reg		counter_two,flag,frey_reg;
reg	[4:0]	counter,counter_stack,counter_21;
reg	[18:0]	address_counter;
reg		Done_reg,Done;
reg		stack_reset,stack_flag,SMAP_flag,SAQ_flag;

always@(negedge clk)
begin
	if(!reset || !ready) begin
		counter=0;
		counter_two=1'b0;
	end
	else
		if(flag==1'b0) begin
			if(counter>=counter_stack) begin
				counter=0;
			end
			else begin
				counter=counter+1'b1;
			end
			counter_two=1'b1;
		end
		else begin
			if(counter_two)
				if(wire_en_smap)
					counter_two=1'b1;
				else
					counter_two=1'b0;
			else
				if(flag_21==1'b1)
					counter_two=counter_two;
				else
					counter_two=1'b1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -