mengjinzhe的个人空间 https://blog.eetop.cn/1793905 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

SPI_FLASH(​W25Q128)全擦除(Xlinx Spartan 6 XC6LXS16)

已有 704 次阅读| 2022-7-19 22:30 |系统分类:芯片设计

W25Q128全擦除实验,

TRIG我映射到了开发板的按键,只打了拍子,没有进行消抖。

module SPI_FLASH
(
	SCK,
	CSB,
	MOSI,
	
	CLK,
	RSTB,
	
	TRIG
);

output 	reg	SCK;
output 	reg     CSB;
output 	reg	MOSI;
	
input	wire	CLK;
input	wire	RSTB;
	
input	wire	TRIG;

parameter	IDLE = 3'b000;
parameter	WREN = 3'b001;
parameter	WAIT = 3'b010;
parameter  	BE   = 3'b011;
parameter	DONE = 3'b100;

reg     [7:0]   DATA; 
reg     [2:0]	DIV_CNT;
reg     [2:0]	CNT_100NS;
reg	[3:0]	CNT_BIT;
reg	[1:0]	CNT_BYTE;
reg	[2:0]	NST,PST;
reg 		START;

reg  TRIG_1P,TRIG_2P,TRIG_3P;
always@(posedge CLK or negedge RSTB)begin
	if(!RSTB)begin
		{TRIG_1P,TRIG_2P,TRIG_3P} <= 3'b0;
	end else begin
		{TRIG_1P,TRIG_2P,TRIG_3P} <= {TRIG,TRIG_1P,TRIG_2P};
	end
end

wire TRIG_RISE  =  TRIG_2P & !TRIG_3P;

always@(posedge CLK or negedge RSTB)begin
	if(!RSTB)begin
		START <= 1'b0;
	end else if(NST == DONE) begin
		START <= 1'b0;
	end else if(TRIG_RISE) begin
		START <= 1'b1;
	end
end

wire DIV_CNT_FULL = (DIV_CNT >= 3'h3);
wire DIV_CNT_HALF = (DIV_CNT == 3'h1);
always@(posedge CLK or negedge RSTB)begin
	if(!RSTB)
		DIV_CNT <= 3'b0;
	else if(NST == WAIT)
		DIV_CNT <= 3'h0;
	else if(DIV_CNT_FULL)
		DIV_CNT <= 3'h0;
	else if(NST == WREN || NST == BE)
		DIV_CNT <= DIV_CNT + 1'b1;
end


wire CNT_BIT_FULL = (CNT_BIT >= 4'h7);
always@(posedge CLK or negedge RSTB)begin
	if(!RSTB)
		CNT_BIT <= 4'h0;
	else if(DIV_CNT_FULL&&CNT_BIT_FULL)
		CNT_BIT <= 4'h0;
	else if((NST == WREN || NST == BE ) && DIV_CNT_FULL)
		CNT_BIT <= CNT_BIT + 1'b1;
end

wire CNT_BYTE_FULL = (CNT_BYTE >= 2'h1);
always@(posedge CLK or negedge RSTB)begin
	if(!RSTB)
		CNT_BYTE <= 4'h0;
	else if(DIV_CNT_FULL&&CNT_BIT_FULL&&CNT_BYTE_FULL)
		CNT_BYTE <= 4'h0;
	else if((NST == WREN || NST == BE ) && CNT_BIT_FULL)
		CNT_BYTE <= CNT_BYTE + 1'b1;
end

wire CNT_100NS_FULL = (CNT_100NS > 3'h5);
always@(posedge CLK or negedge RSTB)begin
	if(!RSTB)
		CNT_100NS <= 4'h0;
	else if(CNT_100NS_FULL)
		CNT_100NS <= 4'h0;
	else if(PST == WAIT)
		CNT_100NS <= CNT_100NS + 1'b1;
end

always@(posedge CLK or negedge RSTB)begin
	if(!RSTB)
		DATA <= 8'h00;
	else if(NST == WREN)
		DATA <= 8'b0000_0110;
	else if(NST == BE )
		DATA <= 8'b1100_0111;
end

always@(posedge CLK or negedge RSTB)begin
	if(!RSTB)
		SCK <= 1'b0;
	else if(DIV_CNT_HALF)
		SCK <= 1'b1;
	else if(DIV_CNT_FULL)
		SCK <= 1'b0;
	else if (NST == DONE)
		SCK <= 1'b0;
end

always@(posedge CLK or negedge RSTB)begin
	if(!RSTB)
		CSB <= 1'b1;
	else if((NST == WREN)||((NST == BE)&&CNT_100NS_FULL))
		CSB <= 1'b0;
	else if(PST == WAIT | PST == DONE)
		CSB <= 1'b1;
end

always@(posedge CLK or negedge RSTB)begin
	if(!RSTB)
		PST <= 3'b000;
	else
		PST <= NST;
end

always@(posedge CLK or negedge RSTB)begin
	if(!RSTB)
		MOSI <= 1'b0;
	else if(DIV_CNT == 3'h1)
		MOSI <= DATA[7-CNT_BIT];
	else if(NST == IDLE)
		MOSI <= 1'b0;
end

always@(*)begin
	NST = PST;
	case(PST)
		IDLE : begin
			if(START)
				NST = WREN;
			else 
				NST = IDLE;
		end
		WREN : begin
			if(DIV_CNT_FULL&&CNT_BIT_FULL&&CNT_BYTE_FULL)
				NST = WAIT;
			else 
				NST = WREN;
		end
		WAIT : begin
			if(CNT_100NS_FULL)
				NST = BE;
			else 
				NST = WAIT;
		end
		BE : begin
			if(DIV_CNT_FULL&&CNT_BIT_FULL&&CNT_BYTE_FULL)
				NST = DONE;
			else
				NST = BE;
		end
		DONE:begin
			NST = IDLE;
		end
		default : NST = IDLE;
	
	endcase

end
endmodule



点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 0

    粉丝
  • 0

    好友
  • 0

    获赞
  • 0

    评论
  • 10

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-18 00:35 , Processed in 0.026676 second(s), 15 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部