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

📄 writedata.v

📁 用Verilog语言编写的实现NAND Flash块的控制存取以及同步的FIFO的控制
💻 V
字号:
/*module writeData(
	clk16M,
	arst,
//	rb,
	enable,
	wrdfinish,
	datain,
	wr,
	cle,
//	re,
	data
//	sel
	);
	
	input
		clk16M,
		arst,
//		rb,
		enable,
		wrdfinish;
	input [7:0]
		datain;
	output
		wr,
		cle;
//		re,
//		sel;
	output [7:0]
		data;
	reg
		we,
		wetemp,
		wecmd,
		cle,
//		re,
//		sel,
		state;
	reg [2:0]
		state1;
	reg [7:0]
		data,
		dataout,
		cmdata;
	
	wire [7:0]
		temp;
		
	assign wr = wetemp & wecmd;	
	
	always @(posedge clk16M or negedge arst)
	begin
		if(arst == 0)
		begin
			dataout <= 8'd0;
			we <= 1'b1;
		end
		else if(enable == 1)
		begin
			case(state)
			1'b0:
				begin
					we <= 1'b0;
					dataout <= datain;
				end
			1'b1:
				begin
					we <= 1'b1;
				end
			endcase
		end//else if(enable == 1)
	end//always
	
	assign temp = (enable == 1'b1)? dataout : cmdata;
	
	always @(posedge clk16M or negedge arst)
	begin
		if(arst == 0)
		begin
			data <= 8'd0;
			wetemp <= 1'b1;
		end
		else
		begin
			data <= temp;
			wetemp <= we;
		end
	end
	
	always @(posedge clk16M or negedge arst)
	begin
		if(arst == 0)
		begin
			state <= 1'b0;
		end
		else if(enable == 1)
		begin
			state <= ~state;
		end
	end//always
	
	always @(posedge clk16M or negedge arst)
	begin
		if(arst == 0)
		begin
			cle <= 1'b0;
			wecmd <= 1'b1;
			//re <= 1'b1;
			//sel <= 1'b0;
		end
		else
		begin
			case(state1)
			3'd1:
				begin
					
					cle <= 1'b1;
					
				end
			3'd2:
				begin
					wecmd <= 1'b0;	//写命令10H
					cmdata <= 8'h10;
				end
			3'd3:
				begin
					wecmd <= 1'b1;
				end
			3'd4:
				cle <= 1'b0;*/
/*			4'd7:
				begin
					wecmd <= 1'b0;
				end
			4'd8:
				wecmd <= 1'b1;
			4'd9:
				begin
					cle <= 1'b0;
				end
			4'd10:
				begin
					re <= 1'b0;
				end
			4'd11:
				begin
					re <= 1'b1;
					sel <= 1'b1;
				end*/
			/*endcase
		end//else
	end//always
	
	always @(posedge clk16M or negedge arst)
	begin
		if(arst == 0)
		begin
			state1 <= 3'd0;
		end
		else// if(rb == 1)
		begin
			case(state1)
			3'd0:
				begin
					state1[0] <= wrdfinish;
				end
			3'd1:
				state1 <= 3'd2;
			3'd2:
				state1 <= 3'd3;
			3'd3:
				state1 <= 3'd4;
			3'd4:
				state1 <= 3'd0;*/
/*			4'd4:
				state1 <= 4'd5;
			4'd5:
				state1 <= 4'd6;
			4'd6:
				state1 <= 4'd7;
			4'd7:
				state1 <= 4'd8;
			4'd8:
				state1 <= 4'd9;
			4'd9:
				state1 <= 4'd10;
			4'd10:
				state1 <= 4'd11;
			4'd11:
				state1 <= 4'd0;*/
			/*endcase
		end//else
	end//always
	
endmodule*/
module writeData(
	clk24M,
	arst,
	datastart,
    fifodata,
	fiforen,
	datawe,
	datacle,
	flashdata,
    datafinish
	);
	
input
	clk24M,
	arst,
	datastart;
input [15:0]
    fifodata;
output
	fiforen,
	datawe,
	datacle,
    datafinish;
output [7:0]
	flashdata;
reg
	fiforen,
	datawe,
	//we,
	datacle,
    datafinish;
reg [7:0]
	flashdata;
reg [7:0]
	cnt;
reg
	cntfull;
reg [3:0]
	state;

always @(posedge clk24M or negedge arst)
begin
	if(arst == 0)
	begin
		//fiforen <= 1'b0;
		//datacle <= 1'b0;
		//we <= 1'b1;
		flashdata <= 8'd0;
	end
	else
	begin
		case(state)
		//4'd1:
			//fiforen <= 1'b0;
		//4'd2:
		//begin
			//fiforen <= 1'b1;
			//we <= 1'b0;
		//end
		4'd3:
		begin
			//we <= 1'b1;			
            //fiforen <= 1'b0;
			flashdata <= fifodata[7:0];
		end
		//4'd4:
			//we <= 1'b0;
		4'd5:
		begin
			//fiforen <= 1'b1;
			//we <= 1'b1;
			flashdata <= fifodata[15:8];
		end
		//4'd6:
		//begin
			//fiforen <= 1'b0;
			//we <= 1'b0;
		//end
		//4'd7:
		//begin
			//we <= 1'b1;
			//flashdata <= fifodata[7:0];
		//end
		//4'd8:
			//we <= 1'b0;//
		//4'd9:
		//begin
			//we <= 1'b1;
			//flashdata <= {4'd0,fifodata[11:8]};
            //flashdata <= fifodata[15:8];
		//end
		//4'd11:
		//begin
			//we <= 1'b0;
			//datacle <= 1'b1;
		//end
		4'd9:
		begin
			//we <= 1'b1;
			flashdata <= 8'h10;
		end
		//4'd14:
			//datacle <= 1'b0;
		endcase
	end
end
always @(posedge clk24M or negedge arst)
begin
    if(arst == 0)
    begin
        datawe <= 1'b1;
    end
    else
    begin
        //datawe <= (((state[3] & state[2]) | (~state[3] & state[0])) | (~state[1] & state[0])) |
               //(((state[3] & state[1]) & (state[0])) | (~(state[3] | state[2] | state[1])));
        //datawe <= ((~state[3]) & state[2] &(~state[0]))| (state[3] & state[1]) | ((~state[3])&(~state[2])&((~state[1])|(~state[0])))|
                    //(state[3]&(~state[2])&(~state[1])&(~state[0])) | (state[3]&state[2]&(~state[1])&state[0]);
        //datawe <= state[3] | ((~state[3])&((~state[1])|(~state[0])));
        datawe <= ((~state[3])&(~state[2])&((~state[1])|(~state[0])))|
                    ((~state[3])&(state[2])&(~state[1])&(~state[0]))|
                    ((~state[3])&(state[2])&(state[1]))|
                    ((state[3])&(~state[2])&(~state[1])&(~state[0]))|
                    ((state[3])&((state[2])|(state[1])));
        /*case(state)
        4'd2:
            we <= 1'b0;  1
        4'd3:
            we <= 1'b1;  0
        4'd4:
            we <= 1'b0;  1
        4'd5:
            we <= 1'b1;  0
        4'd6:
            we <= 1'b0;  1
        4'd7:
            we <= 1'b1;  1
        4'd8:
            we <= 1'b0;  1
        4'd9: 
            we <= 1'b1;  0
        4'd10:
            we <=        1
        4'd11:
            we <= 1'b0;  1
        4'd12:
            we <= 1'b1;  1
        4'd13:
            we <=        1
        endcase*/
    end
end
always @(posedge clk24M or negedge arst)
begin
    if(arst == 0)
    begin
        fiforen <= 1'b0;
    end
    else
    begin
        //fiforen <= (~(state[3] | state[1])) & state[0];
        fiforen <= ((~state[3]) & (~state[2]) & state[1] & (~state[0]));
        /*case(state)
        4'd1: //0001
            fiforen <= 1'b0;
        4'd2: //0010
            fiforen <= 1'b1;
        4'd3: //0011
            fiforen <= 1'b0;
        //4'd6: //0110
            fiforen <= 1'b0;
        endcase*/
    end
end
always @(posedge clk24M or negedge arst)
begin
    if(arst == 0)
    begin
        datacle <= 1'b0;
    end
    else
    begin
        //datacle <= (state[3] & state[1] & state[0]) | ((state[3] & state[2]) & (~state[1]));
        //datacle <= ((~state[3])&state[2]&state[1])|(state[3]&(~state[2])&(~state[1])&(~state[0]));
        datacle <= (state[3]&(~state[2])&(state[1]|state[0]));
        /*case(state)
        4'd6: //1011 1100 1101 
            datacle <= 1'b1;
        4'd9: //1110
            datacle <= 1'b0;
        endcase*/
    end
end
/*always @(posedge clk24M or negedge arst)
begin
	if(arst == 0)
	begin
		datawe <= 1'b1;
	end
	else
	begin
		datawe <= we;
	end
end*/

always @(posedge clk24M or negedge arst)
begin
	if(arst == 0)
	begin
        datafinish <= 1'b1;
		state <= 4'd0;
	end
	else
	begin
		case(state)
		4'd0:
			state[0] <= datastart;
		4'd1:
			state <= 4'd2;
		4'd2:
			state <= 4'd3;
		4'd3:
			state <= 4'd4;
		4'd4:
			state <= 4'd5;
        4'd5:
			state <= 4'd6;
		4'd6:
			state <= 4'd7;
		4'd7:
		begin
			if(cntfull)
			begin
				state <= 4'd2;
			end
			else
			begin
				state <= 4'd8;
			end
		end
		4'd8:
			state <= 4'd9;
		4'd9:
            state <= 4'd10;
        4'd10:
        begin
            datafinish <= 1'b0;
			state <= 4'd11;
        end
		4'd11:
        begin
            datafinish <= 1'b1;
			state <= 4'd0;
        end
		endcase
	end
end

always @(posedge clk24M or negedge arst)
begin
	if(arst == 0)
	begin
		cnt <= 8'd0;
	end
	else
	begin  
		if(fiforen)
		begin
			cnt <= cnt + 1'b1;
		end
	end
end
always @(posedge clk24M or negedge arst)
begin
	if(arst == 0)
	begin
		cntfull <= 1'b0;
	end
	else
	begin
		cntfull <= ((cnt[7] | cnt[6]) | (cnt[5] | cnt[4])) | ((cnt[3] | cnt[2]) | (cnt[1] | cnt[0]));
	end// 
end

endmodule

⌨️ 快捷键说明

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