flash spi w25q128 w25q64 w25q32 w25q16 verilog fpga程序代码 fpga w25q128/64/32/16 verilog代码 资料包清单 1.w25qxx_code_uart_topaltera工程代码可移植ise后续会出话提前 2.功能说明书 注1工程均带有激励testbench工程安装好之后仿真路径设置之后打开点击RTL Simulation即可开始仿真 注2代码均为Verilogfifopll组成 注3代码注重功能应用不提供详细的讲解 注4给出的工程为quartus II 13.0给出testbench代码并且已经在电路板中验证过一、系统概述本套代码基于Verilog HDL开发专为FPGA平台设计实现对W25Q128、W25Q64、W25Q32、W25Q16等系列SPI Flash芯片的全功能控制。系统通过UART接口与上位机如PC进行指令交互与数据传输集成了时钟管理、SPI协议解析、Flash操作控制、数据缓存等核心模块支持Flash芯片的ID读取、扇区擦除、数据写入、数据读取等完整操作流程可广泛应用于数据存储、配置存储等嵌入式场景。二、硬件适配与时钟系统2.1 硬件适配范围目标芯片W25Q128128Mb、W25Q6464Mb、W25Q3232Mb、W25Q1616Mb系列SPI FlashFPGA平台Cyclone IV E系列通过PLL配置与引脚定义适配可扩展至其他Altera FPGAUART接口支持115200bps波特率无校验位1位停止位可通过参数配置调整SPI接口标准4线SPISPISCK、SPIMOSI、SPIMISO、SPICS支持最高12.5MHz SPI时钟由系统时钟分频得到2.2 时钟管理模块时钟系统是整个设计的基础通过PLL锁相环与时钟分频电路为不同模块提供稳定、精准的时钟信号核心模块为systemctrlpll与pllctrlaltpll具体功能如下外部时钟输入接收24MHz外部时钟可通过PLL参数配置调整输入频率PLL时钟生成- 生成100MHz主时钟供SPI协议解析、Flash操作控制、数据缓存等核心模块使用- 生成16MHz辅助时钟预留用于扩展外设如其他通信接口时钟稳定性保障- 集成时钟锁定检测locked信号确保PLL输出时钟稳定后才释放系统复位信号- 上电延时初始化通过systeminitdelay模块实现1ms上电延时避免时钟未稳定时的误操作复位同步将外部异步复位信号rstn同步到100MHz主时钟域生成系统全局同步复位sysrst_n避免跨时钟域复位 metastability 问题三、核心功能模块解析3.1 UART通信模块UART模块实现上位机与FPGA之间的指令与数据传输分为uarttransfer发送与uartreceiver接收两个子模块功能如下3.1.1 UART接收模块uart_receiver数据接收流程1. idle状态检测持续监测RxD引脚当检测到低电平时UART起始位进入起始位验证阶段2. 起始位验证在起始位中间采样确认低电平有效后进入数据采样阶段3. 数据采样按照115200bps波特率对应的采样时钟依次采样8位数据位支持奇校验、偶校验或无校验通过ODDEVENCHECK参数配置4. 停止位检测采样停止位高电平确认数据接收完整性5. 数据输出将接收完成的8位数据通过rxddata输出并产生rxdflag接收完成标志错误检测支持帧错误检测起始位/停止位异常与校验错误检测rxdcheckerror输出错误状态3.1.2 UART发送模块uart_transfer数据发送流程1. 发送使能当txden有效时锁存txddata待发送8位数据进入发送状态2. 起始位发送拉低TxD引脚发送1位起始位3. 数据位发送按照低位在前顺序依次发送8位数据位自动生成校验位如需校验4. 停止位发送拉高TxD引脚发送1位/1.5位/2位停止位通过STOPBIT参数配置5. 发送完成产生txdflag发送完成标志准备下一次发送发送缓冲支持连续数据发送通过txd_en信号的脉冲触发实现多字节数据连续传输3.2 SPI协议解析模块SPI模块是与Flash芯片通信的核心根据不同操作需求提供6种SPI指令处理子模块覆盖“写-读”“写-写”“读-读”等多种交互场景所有子模块均基于有限状态机FSM实现确保SPI时序严格符合W25Qxx芯片规范模块名称功能描述数据宽度典型应用场景spicmdrd_nbyte写4字节指令读N字节数据写32位读N×8位Flash数据块读取spicmdwr_1byte写1字节指令写8位Flash写使能、状态寄存器配置spicmdwr1byterd_1byte写1字节指令读1字节数据写8位读8位读取Flash状态寄存器spicmdwr_4byte写4字节指令写32位Flash扇区擦除、页写入指令spicmdwr4byterd_2byte写4字节指令读2字节数据写32位读16位读取Flash IDspicmdwr_nbyte写4字节指令写N字节数据写32位写N×8位Flash数据块写入3.2.1 共性设计SPI时序控制所有SPI子模块共享相同的时序控制逻辑确保SPI通信稳定性SPI时钟生成基于100MHz主时钟通过clkcnt分频生成SPISCK默认分频系数为8SPISCK频率12.5MHz可通过SPIFREQ参数调整数据同步机制spitransferen数据发送使能确保SPIMOSI数据在SPISCK有效前稳定spicaptureen数据采样使能在SPISCK中间采样SPIMISO数据避免亚稳态片选控制SPI_CS仅在SPI传输期间拉低传输完成后拉高避免多设备干扰3.3 Flash操作控制模块w25qxx_code该模块是系统的“大脑”整合所有SPI子模块实现Flash的完整操作流程对外提供标准化的操作接口隐藏底层SPI协议细节核心功能包括3.3.1 Flash ID读取功能读取Flash的制造商ID与设备ID共16位用于确认Flash芯片型号操作流程1. 触发w25qreadiden输入高脉冲触发ID读取2. SPI指令发送通过spicmdwr4byterd2byte模块发送“读取ID”指令90h 地址00h3. 数据接收接收2字节ID数据w25qreadiddata4. 完成产生w25qreadiddone高脉冲标志读取完成3.3.2 扇区擦除功能对Flash指定扇区进行擦除W25Qxx扇区大小通常为4KB擦除后扇区数据全为0xFF操作流程1. 写使能发送“写使能”指令06h确保Flash允许擦除操作2. 忙等待读取Flash状态寄存器通过spicmdwr1byterd1byte等待忙标志BUSY清零3. 擦除指令发送通过spicmdwr4byte模块发送“扇区擦除”指令20h 扇区地址erasesectoraddr4. 擦除等待再次读取状态寄存器等待擦除完成5. 完成产生erasesectordone高脉冲标志擦除完成地址映射erasesectoraddr为12位地址对应4KB×4096扇区覆盖16MB地址空间3.3.3 数据写入功能向Flash指定地址写入1~256字节数据单次写入不超过Flash一页大小通常为256字节操作流程1. 写使能发送“写使能”指令06h2. 数据缓冲通过FIFOwrfifo缓存待写入数据fifowrnbytewrdata避免数据丢失3. 写入指令发送通过spicmdwrnbyte模块发送“页写入”指令02h 目标地址w25qwraddr 缓存数据4. 写入等待读取状态寄存器等待写入完成5. 完成产生w25qwrdatadone高脉冲标志写入完成参数配置w25qWRBYTENUM指定写入字节数1~256w25qwr_addr指定24位目标地址3.3.4 数据读取功能从Flash指定地址读取1~65535字节数据支持连续多字节读取操作流程1. 读取指令发送通过spicmdrdnbyte模块发送“读取数据”指令03h 目标地址w25qrdaddr2. 数据接收接收的数据存入FIFOrdfifo避免数据溢出3. 数据输出上位机通过fifordnbyterden读取FIFO中的数据fifordnbyterddata4. 完成当读取字节数达到w25qRDBYTENUM时产生w25qrddatadone高脉冲参数配置w25qRDBYTENUM指定读取字节数1~65535w25qrd_addr指定24位目标地址3.4 数据缓存模块FIFO为解决UART与SPI传输速率不匹配问题系统集成两个同步FIFOwrfifo与rdfifo均为8位数据宽度、8192深度功能如下写FIFOwr_fifo缓存上位机通过UART发送的待写入Flash数据避免UART数据因SPI写入慢而丢失读FIFOrd_fifo缓存从Flash读取的数据确保UART可稳定接收即使SPI读取速率高于UART发送速率FIFO控制集成空empty、满full状态检测避免数据溢出或空读四、系统顶层模块w25qxx_code_uart_top顶层模块将所有核心模块整合对外提供极简的硬件接口同时实现UART指令解析与系统初始化逻辑是FPGA与外部交互的“门户”。4.1 硬件接口信号名称方向功能描述clk输入24MHz外部时钟rst_n输入外部异步复位低有效spi_sck输出SPI时钟spi_mosi输出SPI主设备输出Flash输入spi_miso输入SPI主设备输入Flash输出spi_cs输出Flash片选低有效txd_usb232输出UART发送端连接上位机Rxrxd_usb232输入UART接收端连接上位机Tx4.2 系统初始化上电后顶层模块自动执行初始化流程时钟稳定等待等待PLL锁定与1ms上电延时完成Flash ID读取自动读取Flash ID并通过UART发送给上位机确认Flash正常连接待机进入指令等待状态准备接收上位机的操作指令4.3 UART指令解析上位机通过发送特定指令帧控制FPGA执行Flash操作指令帧格式采用“帧头指令参数帧尾”结构确保指令可靠性支持的核心指令如下指令类型指令码帧结构功能描述扇区擦除0xCA0xCA 0xA5 0xCA 0x5A 地址擦除指定扇区数据写入0x120x12 0xA5 0x12 0x5A 参数向指定地址写入N字节数据数据读取0x220x22 0xA5 0x22 0x5A 参数从指定地址读取N字节数据数据缓冲写入0x110x11 0xA5 0x11 0x5A 数据向写FIFO写入待写入数据五、典型应用流程以“上位机读取Flash指定地址数据”为例完整流程如下系统初始化FPGA上电自动读取Flash ID并通过UART发送给上位机上位机确认Flash型号正常发送读取指令上位机发送“数据读取”指令帧包含目标地址如0x000000与读取字节数如0x0010即16字节指令解析FPGA的w25qxxcodeuarttop模块解析指令触发w25qrddataenFlash读取w25qxxcode模块执行读取流程通过SPI从Flash读取16字节数据存入rdfifo数据回传FPGA从rdfifo中读取数据通过uarttransfer模块逐字节发送给上位机操作完成上位机接收完16字节数据整个读取流程结束六、关键参数配置系统支持通过参数配置适配不同场景核心可配置参数如下模块参数名称功能描述默认值uart_transferODDEVENCHECKUART校验模式0无校验1奇校验2偶校验0uart_transferSTOP_BITUART停止位01位11.5位22位0uart_receiverBRDUART波特率如115200bps115200SPI子模块SPI_FREQSPI时钟分频系数决定SPI_SCK频率812.5MHzsysteminitdelaySYSDELAYTOP上电延时单位50MHz时钟周期240001ms七、总结与扩展建议本套代码实现了W25Qxx系列Flash的全功能控制具有以下特点模块化设计各模块功能独立便于维护与扩展稳定性高集成时钟同步、忙等待、FIFO缓存等机制避免数据丢失与时序错误易用性强上位机通过简单UART指令即可控制Flash无需了解SPI协议细节扩展建议多设备支持增加SPI片选扩展支持多片Flash并联速率优化调整SPI分频系数SPI_FREQ在Flash支持范围内提高SPI速率错误处理增加Flash操作错误重试机制提高系统鲁棒性功能扩展支持Flash的块擦除64KB/32KB、页擦除等更多操作模式flash spi w25q128 w25q64 w25q32 w25q16 verilog fpga程序代码 fpga w25q128/64/32/16 verilog代码 资料包清单 1.w25qxx_code_uart_topaltera工程代码可移植ise后续会出话提前 2.功能说明书 注1工程均带有激励testbench工程安装好之后仿真路径设置之后打开点击RTL Simulation即可开始仿真 注2代码均为Verilogfifopll组成 注3代码注重功能应用不提供详细的讲解 注4给出的工程为quartus II 13.0给出testbench代码并且已经在电路板中验证过