flash spi w25q128 w25q64 w25q32 w25q16 verilog fpga程序代码 fpga w25q128/64/32/16 verilog代码 资料包清单: 1.w25qxx_code_uart_top:altera工程代码,可移植ise,后续会出,话提前 2.功能说明书 注1:工程均带有激励testbench,工程安装好之后,仿真路径设置之后,打开,点击RTL Simulation即可开始仿真 注2:代码均为Verilog+fifo+pll组成 注3:代码注重功能应用,不提供详细的讲解 注4:给出的工程为quartus II 13.0,给出testbench代码,并且已经在电路板中验证过
基于串口的 W25Qxx FPGA 控制器
——功能说明与开发指南
(面向 v2.02 merged 版本)
------------------------------------------------
- 产品定位
------------------------------------------------
“基于串口的 W25Qxx FPGA 代码”是一套可移植、可裁剪的 SPI-NOR Flash 控制器 IP,运行于低成本 Cyclone-IV FPGA。
顶层交付形式为w25qxxcodeuart_top,对外仅留 UART(115200-8-N-1)和 4 线 SPI 两组管脚,开发者无需了解底层 SPI 时序即可在 1 分钟内完成「擦除-写入-读出」验证。
同时,IP 内部所有子模块均提供独立端口,可无缝剥离 UART,直接嵌入用户 FPGA 工程。
------------------------------------------------
- 系统架构
------------------------------------------------
图 1 整体框图(文字描述)
HOST-PC <==UART==> w25qxxcodeuart_top <==SPI==> W25Q128/64/32/16
├─ pll & reset
├─ uartrcv / uartxfer
├─ cmd_parser(状态机)
├─ w25qxx_core(纯逻辑)
│ ├─ cmd_dispatch
│ ├─ pagebufferfifo (8 kB)
│ ├─ spi_master (12.5 MHz)
│ └─ busypoll / idread
└─ rdfifo / wrfifo (各 8 kB)
------------------------------------------------
- 功能清单
------------------------------------------------
| 功能 | 容量限制 | 耗时(典型) | 备注 |
|---|---|---|---|
| 读 ID | 2 B | 0.5 ms | 返回 0xEF17 |
| 扇区擦除 | 4 KB | 150 ms | 仅支持 4 KB Sector-Erase |
| 页写入 | 1-256 B | 0.8 ms | 自动拆分跨页 |
| 连续读出 | ≤ 4096 B | 2.6 ms@4 kB | 内部 FIFO 决定 |
| 写 FIFO 缓存 | ≤ 4096 B | 取决于 UART 速率 | 先缓存后一次性编程 |
------------------------------------------------
- 串口帧协议(主机 → FPGA)
------------------------------------------------
所有指令采用「帧头-参数字节-返回字」模型,返回字与帧头相同,可简单 ACK。
1) 擦除扇区
帧头:CA A5 CA 5A
地址:2 B(高 12 bit 有效,低 12 bit 忽略)
返回:CA
2) 写 FIFO(仅缓存)
帧头:11 A5 11 5A
长度:2 B(N≤4096)
数据:N B
返回:11
flash spi w25q128 w25q64 w25q32 w25q16 verilog fpga程序代码 fpga w25q128/64/32/16 verilog代码 资料包清单: 1.w25qxx_code_uart_top:altera工程代码,可移植ise,后续会出,话提前 2.功能说明书 注1:工程均带有激励testbench,工程安装好之后,仿真路径设置之后,打开,点击RTL Simulation即可开始仿真 注2:代码均为Verilog+fifo+pll组成 注3:代码注重功能应用,不提供详细的讲解 注4:给出的工程为quartus II 13.0,给出testbench代码,并且已经在电路板中验证过
3) 写 Flash(把 FIFO 内容固化)
帧头:12 A5 12 5A
字节数:1 B(1-256)
地址:3 B(24 bit)
返回:12
4) 读 Flash
帧头:22 A5 22 5A
地址:3 B
长度:2 B(≤4096)
返回:22 + 长度字节
------------------------------------------------
- 典型操作流程
------------------------------------------------
Step-0 上电自检
FPGA 启动后自动读取 Flash ID,并通过 UART 返回 0xEF17,表示 IP 就绪。
Step-1 擦除
PC 下发:CA A5 CA 5A + 00 10 → 擦除 64 KB 物理地址 0x00001000
等待 150 ms 后收到 ACK 0xCA。
Step-2 写入
a) 先通过「写 FIFO」指令把 256 B 数据导入 FPGA;
b) 再下发「写 Flash」指令,指定起始地址;
c) IP 内部自动完成:Write-Enable → Page-Program → 轮询 Busy → 返回 0x12。
Step-3 校验
下发「读 Flash」指令,地址与长度与写入一致;IP 按字节通过 UART 回灌,PC 端进行 CRC/比对。
------------------------------------------------
- 性能指标
------------------------------------------------
- SPI 时钟:12.5 MHz(100 MHz 主时钟 8 分频)
- 页编程效率:≈ 320 kB/s(256 B / 0.8 ms)
- 连续读效率:≈ 1.5 MB/s(受限于 UART 115200 时约 11 kB/s;若直接挂 AXI-SPI,可跑满 12.5 MHz)
- 资源占用:Cyclone-IV EP4CE10 约 900 LE + 2 kB on-chip RAM(FIFO)
------------------------------------------------
- 移植与裁剪指南
------------------------------------------------
1) 去掉 UART
- 例化
w25qxxcode层,直接操作端口:
–w25qreadiden→ 脉冲启动
–erasesectoren+erasesectoraddr[11:0]
–w25qwrdataen+w25qwraddr+w25qWRBYTENUM
– 提供fifowrnbytewren&fifowrnbytewrdata流
– 监听*_done脉冲完成
2) 提升速度
- 将
spicmd*.v中SPI_FREQ参数改为 4,即可得到 25 MHz SCK; - 确认 PCB 走线 ≤ 5 cm 并打开 Fast-IO。
3) 多片级联
- 复制
spics为spics0~n,在w25qxx_code顶层加片选译码即可; - 协议帧再增加 1 B 片选编号,命令解析器路由到不同
cs信号。
------------------------------------------------
- 故障排查 FAQ
------------------------------------------------
Q1: 读 ID 返回 0x0000
- 检查
spi_miso是否上拉; - 用示波器看 SCK 频率,>20 MHz 时 W25Q128 会无响应。
Q2: 擦除后读出全 FF,但写入失败
- 写入前必须擦除——IP 已强制检查,但用户若直接调用
w25qxx_code绕过了擦除,需自行保证。
Q3: UART 返回乱码
- 确认 115200-8-N-1;
- FPGA 侧时钟 100 MHz 误差 < ±50 ppm,否则波特率漂移。
------------------------------------------------
- 版本履历
------------------------------------------------
v1.00 2020-05 基础 SPI 读写
v1.50 2021-03 增加 UART 命令帧
v2.02 2021-12 合并 fifo,支持 4096 B 缓存;增加忙检测与自动拆页;代码综合后 fmax 120 MHz
------------------------------------------------
- 声明与授权
------------------------------------------------
本说明文档对应 merged 版本源码,仅用于技术交流。
如需商用或二次发布,请遵循原始项目许可证(MIT/BSD 风格)并保留作者信息。