基于 FPGA 的 SPI Flash 读写控制设计
一、SPI 协议基础
SPI(Serial Peripheral Interface)是 Motorola 推出的一种全双工同步串行总线,仅需四根信号线即可实现主从设备间的高效数据传输,广泛应用于 Flash、EEPROM、ADC/DAC 等外设。
SPI 通信依赖四根关键信号线:
- SCLK:串行时钟,由主机控制数据交换速率与时机。
- MOSI:主机输出/从机输入,用于发送指令或数据。
- MISO:主机输入/从机输出,用于接收数据。
- CS_N:片选信号,低电平有效,选中特定从机。
常见连接模式包括一主机一从机及一主机多从机(常规多片选或菊花链)。传输时需注意单主机原则,且数据通常以 MSB(最高位优先)方式传输,支持 8 位或 16 位帧长。
SPI 支持四种工作模式,由 CPOL(时钟极性)和 CPHA(时钟相位)决定:
| CPOL\CPHA | 0 | 1 |
|---|---|---|
| 0 | 模式 0 | 模式 1 |
| 1 | 模式 2 | 模式 3 |
本设计采用模式 0(CPOL=0, CPHA=0),即空闲时钟为低电平,上升沿采样数据,下降沿输出数据。
二、M25P16 Flash 特性
M25P16 是一款 16Mb(2M×8bit)串行闪存,支持高速 SPI 兼容总线。其存储结构分为 32 个扇区,每扇区 256 页,每页 256 字节,总计约 2MB 容量。支持页编程、扇区擦除及批量擦除操作。
引脚功能简述:
- Q:串行数据输出,下降沿移出。
- D:串行数据输入,上升沿锁存。
- C:串行时钟,提供时序控制。
- S:芯片选择,低电平激活设备。
- HOLD:保持信号,暂停通信但不取消选中。
- W:写保护,配合状态寄存器控制区域保护。
核心指令集包括写使能(WREN)、读 ID(RDID)、读状态(RDSR)、字节读(READ)、快速读(FAST_READ)、页编程(PP)、扇区擦除(SE)及批量擦除(BE)。所有指令均以最高有效位为先进行传输。
关键时序要求:
| 操作 | 最小时间 | 最大时间 | 单位 |
|---|---|---|---|
| 命令间隔 | 100 | - | ns |
| 页写 | 1.4 | 5 | ms |
| 扇区擦除 | 1 | 3 | s |
| 全擦除 | 17 | 40 | s |
三、系统设计思路
硬件架构主要包含 SPI 控制器、状态机逻辑及外设接口。
框图设计 系统通过按键触发不同操作,并通过数码管与串口反馈结果:
- 读 ID:按键触发后读取 Flash 制造商及设备 ID,显示于数码管并上传串口。
- 读数据:读取指定地址数据,实时显示。
- 擦除:执行扇区擦除操作。
- 写数据:PC 端通过串口下发数据,FPGA 按页写入 Flash。
状态机设计 由于 SPI 操作涉及复杂的指令序列与等待周期,采用有限状态机(FSM)管理流程。
- 扇出状态机:协调多个子模块的数据传输。
- 写数据状态机:处理 WREN、地址发送、数据写入及忙标志检查(WIP)。
四、上板验证
测试环境使用 FPGA 开发板,配合数码管显示与串口调试助手。
-
读 ID 测试 按下对应按键,数码管显示
BA_60_15,分别对应 JEDEC 厂商码、器件类型及容量标识。串口同步输出设备 ID 信息。 -
读数据测试 预设写入数据
12_34_56,读取操作成功回显。连续读取可验证地址自动递增及循环读取功能。若未写入区域,默认返回FF。 -
擦除与写入测试 先执行扇区擦除,读取确认全为
FF。随后通过串口发送A1 B2 C3 D4 E5 F6 99,系统按每 3 字节一组进行页编程。验证结果显示数据正确写入,剩余 FIFO 缓存数据待后续处理。
五、总结
本项目实现了基于 FPGA 的 SPI Flash 读写控制。相比 IIC 和 UART,SPI 协议层约束较少,时序控制更直接,适合高速大容量数据存储场景。通过状态机管理指令序列,确保了操作的原子性与可靠性。
六、代码说明
核心逻辑包含 SPI 时序生成、状态机跳转及数据缓冲管理。具体 Verilog 代码请参考项目仓库。

