flash的指定扇区擦除实验。
先发写指令,再进入写锁存周期等待500ns,进入写扇区擦除指令,然后写扇区地址,页地址,字节地址。即可完成扇区擦除。
模块框图:

时序图:


代码:
module spi (
input wire sys_clk ,
input wire sys_rst_n ,
input wire key_start ,
output wire miso ,
output reg mosi ,
output reg cs_n ,
output reg sck
);
// parameter
parameter COMD_W = 8'h06 , // 写指令
COMD_B = 8'hc7 , // 全擦除指令
COMD_S = 8'hd8 ; // 扇区擦除指令
parameter ADR_SE = 8'h00 , // 扇区地址 adress secter
ADR_PA = 8'h04 , // 页地址 adress page
ADR_BY = 8'h25 ; // 字节地址 adress byte
parameter IDLE = 4'b0001 ,
WREN = 4'b0010 ,
WEL = 4'b0100 ,
SE = 4'b1000 ;
// wire signal degine
wire IDLEtoWREN;
wire WRENtoWEL ;
wire WRENtoSE ;
wire SEtoIDLE ;
// reg signal define
reg [3:0] state_c ;
reg [3:0] state_n ;
reg [3:0] cnt_20ns ;
reg [3:0] cnt_bit ;
reg [3:0] cnt_byte ;
reg flag_bit ;
reg f_b_reg ; // flag_bit_reg的缩写
/****************************************************************************/
// 三段式状态机
// 现态与次态描述
// state_c
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n)
state_c <= IDLE ;
else
state_c <= state_n ;
end
// state_n
always @(*) begin
case (state_c)
IDLE :if(IDLEtoWREN)
state_n <= WREN ;
else
state_n <= IDLE ;
WREN :if(WRENtoWEL)
state_n <= WEL ;
else
state_n <= WREN ;
WEL :if(WRENtoSE)
state_n <= SE ;
else
state_n <= WEL ;
SE :if(SEtoIDLE)
state_n <= IDLE ;
else

文章详细描述了一个SPI模块中实现的扇区擦除过程,包括状态机设计、时序控制以及关键指令的发送。内容涉及状态转移逻辑、计数器操作和信号控制,旨在确保正确擦除闪存指定扇区。
最低0.47元/天 解锁文章
5864

被折叠的 条评论
为什么被折叠?



