1. 项目概述:SPI Flash存储芯片的Verilog驱动实现
在嵌入式系统和FPGA开发中,SPI Flash存储器因其高性价比、低功耗和易用性成为非易失性存储的首选方案。Winbond的W25Q系列(包括W25Q16/W25Q32/W25Q64/W25Q128等型号)凭借稳定的性能和丰富的容量选择,占据了相当大的市场份额。本文将基于Verilog HDL语言,详细解析SPI Flash控制器的设计要点,涵盖从基础通信协议到高级功能实现的完整开发流程。
2. 硬件基础与协议解析
2.1 W25Q系列芯片关键特性
W25Q系列采用标准的SPI总线接口,支持三种通信模式:
- Standard SPI(单线收发)
- Dual SPI(双线数据收发)
- Quad SPI(四线数据收发)
以W25Q128JV为例,其核心参数包括:
- 存储容量:16MB(128Mbit)
- 扇区结构:256个可擦除扇区(每个4KB)
- 块结构:32个可擦除块(每个64KB)
- 页编程尺寸:256字节
- 时钟频率:104MHz(Quad模式下)
注意:不同容量的芯片在指令集上完全兼容,主要差异在于地址位数。W25Q16/W25Q32使用24位地址,而W25Q64/W25Q128支持32位地址模式。
2.2 SPI协议深度解析
标准SPI总线包含四根信号线:
- CS#:片选(低电平有效)
- SCK:时钟信号(CPOL/CPHA决定采样边沿)
- MOSI:主机输出从机输入
- MISO:主机输入从机输出
SPI模式配置组合:
| 模式 | CPOL | CPHA | 时钟极性 | 采样边沿 |
|---|---|---|---|---|
| 0 | 0 | 0 | 低电平 | 上升沿 |
| 1 | 0 | 1 | 低电平 | 下降沿 |
| 2 | 1 | 0 | 高电平 | 下降沿 |
| 3 | 1 | 1 | 高电平 | 上升沿 |
W25Q系列默认支持Mode 0和Mode 3,实际开发中建议统一采用Mode 0以避免时序问题。
3. Verilog驱动设计实现
3.1 接口模块设计
基础SPI控制器模块端口定义示例:
verilog复制module spi_flash_controller (
input wire clk, // 系统时钟(建议≥50MHz)
input wire rst_n, // 低电平复位
// SPI物理接口
output reg cs_n, // 片选信号
output reg sck, // 时钟信号
output reg mosi, // 主机输出
input wire miso, // 主机输入
// 用户接口
input wire [7:0] cmd, // 操作指令
input wire [31:0] addr, // 操作地址
input wire [7:0] wr_data, // 写入数据
output reg [7:0] rd_data, // 读取数据
output reg busy // 忙信号
);
3.2 关键状态机设计
典型操作状态转移图应包括:
- IDLE:空闲状态
- CMD_SEND:指令发送阶段
- ADDR_SEND:地址发送阶段
- DATA_RW:数据读写阶段
- WAIT_READY:等待芯片就绪
状态机Verilog实现片段:
verilog复制always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state <= IDLE;
bit_cnt <= 0;
end else begin
case(state)
IDLE:
if (start_op) begin
state <= CMD_SEND;
cs_n <= 1'b0;
end
CMD_SEND:
