文章目录

  • 前言
  • 一、控制器功能简介
  • 二、设计框图及状态转换流程图
    • 1.设计框图
    • 2.状态转换流程图
  • 3.仿真结果
  • 4.硬件验证

前言

本文主要简单介绍一个用于读写Flash存储器的控制器,针对的Flash芯片型号为W25Q128系列。其他的Flash也都类似,通过简单的修改同样可以使用。由于代码比较多,本文就不详细介绍代码,主要从控制器的功能、关键设计思路以及仿真和实验结果进行简单介绍,具体代码可以参看下方链接。


代码链接:https://download.csdn.net/download/weixin_44505013/78142995

一、控制器功能简介

控制器有两个深度为256,数据位宽为8的FIFO,一个是发送FIFO,存放待发送的数据,另一个为接收FIFO,存放接收到的数据。
(1)写操作:该控制器支持跨页(page size为256 byte)的连续写入,即写完一页中的最后一个地址后,控制器会自动拉高spi的cs信号,停止当前页的写操作,然后读取Flash中状态寄存器中的BUSY位,当读取到的BUSY位为低电平时,表示在Flash内部写指令执行完毕,此时如果发送FIFO非空,控制器会再次自动发起写操作,对下一页的第一个地址继续进行写操作,直到发送FIFO为空,控制器的整个发送数据流程才结束。

(2)读操作:通过一个寄存器的值指定需要从Flash中读取的字节个数,这个值最小为1,最大可以是整个Flash的存储大小(以byte为单位),对于W25Q128型号的Flash,该值最大可以为16M=16×1024×1024。当接收FIFO满时,会暂停当前的读操作,然后从接收FIFO中将数据读出,当接收FIFO被读空时,控制器将再次发起读操作,重复上述过程,直到读取完寄存器指定的字节个数,控制器的整个读数据流程才结束。

(3)扇区擦除:该控制器支持扇区擦除,在发送完扇区擦除指令和地址后,控制器会读取Flash状态寄存器中的BUSY位,当该位为0时,表示扇区擦除完毕,才能继续进行其它操作。

该控制器实现的指令:Write Enable(06h)、Page Program(02h)、Read Data(03h)、Read Status Register-1(05h)、Sector Erase(20h)。

二、设计框图及状态转换流程图

1.设计框图

该设计的大致结构如下所示:

图1 控制器结构图

2.状态转换流程图

图2 ctrl模块状态转换流程图 (1)发送数据流程:wr_seq有效,进入tx_wren状态,发送写使能指令(06h),然后进入decs状态,将spi的cs信号拉高一段时间;进入tx_inst状态,发送写指令(02h);发送完写指令后进入tx_addr,继续发送三个字节的地址;地址发送完成后,进入tx_data状态,从tx_fifo中读取数据给byte2spi模块通过spi总线向Flash发送写入的数据,同时判断发送的数据写入Flash中的地址,如果写入的是Page中的最后一个字节,在发送完最后一个字节后,进入decs状态,拉高cs信号,结束当前的写命令;然后进入delay状态,读取Status Register-1,判断BUSY位是否为低电平,如果为低电平,则进入idle状态,此时,如果tx_fifo非空,则继续进行上述操作,直到tx_fifo为空。

(2)接收数据流程:rd_seq有效,进入tx_inst状态,发送读指令(03h);发送完读指令后,进入tx_addr状态,发送三个字节地址;地址发送完成后,进入rx_data状态,接收regfile中寄存器指定的读取数据字节个数;如果rx_fifo变满且没有接收完指定的数据个数,则进入idle状态,当rx_fifo变为空状态时,再次发起一次读操作,直到接收完指定的数据量。

(3)擦除操作:擦除操作前面的部分与发送数据流程类似,不同的是在发送完地址后,先进入decs状态,拉高cs信号一段时间;然后发送读Status Register-1的指令(05h),当读取到的BUSY位为低电平时,擦除完成,进入idle状态。

3.仿真结果

图3 发送写使能指令的仿真波形

由于仿真波形比较长,其它功能波形不便以图片的形式展示,大家可以下载代码自行仿真查看。

4.硬件验证

SPI-Flash控制器的FPGA资源使用情况:

图4 Flash控制器的FPGA资源使用情况

由于该设计采用APB接口进行设计,因此硬件测试时,将该设计集成到SoC系统中,采用软件+硬件的方式进行调试验证,同时通过UART打印调试的结果。该SoC的结构如下:

图5 SoC硬件验证结构图

实验的C代码:

//printf("......\n");
uint32_t i;
uint32_t byte_test_num = 2000;
uint8_t tx_data[2000], rx_data[2000];
uint32_t test_addr = 0x123000;  // W25Q128地址范围0x000000~0xffffff
for (i=0; i<byte_test_num; i++) {tx_data[i] = i;
}printf("Start test!\n");printf("SPIC status before test: %x\n", SPIC_GetStatus());
SPIC_EraseSector(test_addr);
SPIC_ContinuousByteWrite(test_addr, byte_test_num, &tx_data[0]);
SPIC_ContinuousByteRead(test_addr, byte_test_num, &rx_data[0]);
printf("SPIC status after test: %x\n", SPIC_GetStatus());for (i=0; i<byte_test_num; i++) {printf("tx_data[%d] = %d ; rx_data[%d] = %d \n", i, tx_data[i], i, rx_data[i]);
}
for (i=0; i<byte_test_num; i++) {if (tx_data[i] != rx_data[i]) {printf("Test Failure!\n");break;}if (i==byte_test_num-1) {printf("Test Success!\n");}
}

打印结果如下:


从硬件验证的结果可以看出,该控制器可以实现对W25Q128器件的读写和擦除操作。

基于FPGA的SPI-Flash控制器的Verilog设计和验证相关推荐

  1. 基于FPGA的SPI FLASH控制器设计

    1.SPI FLASH的基本特征 本文实现用FPGA来设计SPI FLASH,FLASH型号为W25Q128BV.支持3种通信方式,SPI.Dual SPI和Quad SPI.FLASH的存储单元无法 ...

  2. m基于FPGA的积分梳状CIC滤波器verilog设计

    目录 1.算法描述 2.仿真效果预览 3.verilog核心程序 4.完整FPGA 1.算法描述 积分梳状滤波器,是指该滤波器的冲激响应具有如下形式: 其物理框图如图所示: 可见,CIC滤波器是由两部 ...

  3. m基于FPGA的多级抽取滤波器组verilog设计,包括CIC滤波,HB半带滤波以及DA分布式FIR滤波

    目录 1.算法描述 2.仿真效果预览 3.verilog核心程序 4.完整FPGA 1.算法描述 数字下变频中的低通滤波器是由多级抽取滤波器组实现的.信号的同相分量和正交分量再分别经由积分梳状滤波器( ...

  4. 基于FPGA的XPT2046触摸控制器设计

    基于FPGA的XPT2046触摸控制器设计 小梅哥编写,未经许可,文章内容和所涉及代码不得用于其他商业销售的板卡 本实例所涉及代码均可通过向 xiaomeige_fpga@foxmail.com  发 ...

  5. 基于FPGA实现SPI接口(配置或通信)

    基于FPGA实现SPI接口(配置或通信总线) 1)总线简介 串行外设接口(SPI)是微控制器(FPGA)和外围IC(如传感器.ADC.DAC.移位寄存器.SRAM等)之间使用最广泛的接口之一.主要用于 ...

  6. FPGA的spi flash配置-配置模式理解

    FPGA的spi flash配置-配置模式理解 起因 现在在做的FPGA工程是基于以前的工程,其中flash配置啊什么的都没有进行过修改,之前是采用的spi x1的模式,现在新的数字版改为了spi x ...

  7. 【工程源码】基于FPGA的XPT2046触摸控制器设计

    本文和设计代码由FPGA爱好者小梅哥编写,未经作者许可,本文仅允许网络论坛复制转载,且转载时请标明原作者. XPT2046是一款设计用于移动电话.个人数字助理.便携式一起.付款中断设备.触摸屏显示器等 ...

  8. 基于 FPGA 的以太网回环测试verilog实现UDP协议

    基于 FPGA 的以太网回环测试verilog实现UDP协议 verilog实现UDP协议: 该 设计使用 UDP 协议,首先通过串口助手接收 PC 发送的 UDP 数据包,然后提取其中的数据部分并使 ...

  9. 基于FPGA实现uart串口模块(Verilog)--------发送模块及整合

    基于FPGA实现uart串口模块(Verilog)--------发送模块及整合 当接收模块接收到数据后,需要重新发送形成回环验证模块正确性.思路和结束模块有一点点的小差异.接收模块最终输出的是一个并 ...

  10. 基于FPGA实现uart串口模块(Verilog)--------接收模块及思路总结

    基于FPGA实现uart串口模块(Verilog)--------接收模块及思路总结 uart通信协议简单理解为串转并和并转串的两个模块.同时必须保证数据的正确性.且输入输出端为串行. 此次实现uar ...

最新文章

  1. 《大数据系统基础》实践项目期末答辩顺利举行 校企联手打造精品实践项目见真章
  2. delphi 调用php接口_贝壳找房小程序从PHP到Golang的跃迁之路
  3. MindCon极客周 · 点亮城市接力活动正式启动!来为你的城市打Call,还有多重好礼相送!...
  4. JAVA——RSA加密与解密
  5. php可关于及||的非正常用法
  6. UOJ#196. 【ZJOI2016】线段树 概率期望,动态规划
  7. Problem E: 高于均分的学生
  8. 苏宁大数据怎么运营_18个“硬核”数据告诉你,苏宁大数据如何火力全开护航618!...
  9. mysql 封装json数据类型_mysql中的json数据类型
  10. SlickEdit完美解析Qt4
  11. 一个c++程序员对大学生的友情提醒
  12. WPF 语言格式化文本控件
  13. 只能在执行Render() 的过程中调用 RegisterForEventValidation;
  14. 95.不同的二叉搜索数II(力扣leetcode) 博主可答疑该问题
  15. 西瓜数据集的各种版本,比如说2.0,3.0,4.0都在这
  16. python开根_python如何开根号
  17. HDMI/DVI分配器芯片
  18. SQL Server—T-SQL编程
  19. A Generic Deep Architecture for Single Image Reflection Removal and Image Smoothing(CEILNet)
  20. 基于 SpringBoot + Vue 实现的物联网/智能家居系统

热门文章

  1. access和tagware_NDoc 用户指南
  2. 干货!交换机常用的光模块及光接口
  3. Linux audit详解
  4. Linux系统之audit
  5. 年薪百万不如狗?深圳的程序员才是买房界的黑天鹅!
  6. 数据结构试卷及答案(七)
  7. 调用阿里云身份证识别服务识别本地图片,很详细,附工具类
  8. ffmpeg合并mp4脚本
  9. 完美屏蔽中国移动,四川手机报发的信息。
  10. Steam平台3款2D游戏开发软件对比(转)