FPGA纯verilog代码读写N25Q128A QSPI Flash 提供工程源码和技术支持

news2024/11/27 22:43:19

目录

  • 1、N25Q128A芯片解读
  • 2、N25Q128A读写时序
  • 3、整体设计思路架构
  • 4、verilog读写Flash驱动设计
  • 5、verilog读写Flash控制器设计
  • 6、FIFO缓存设计
  • 7、串口输出Flash读取数据
  • 8、vivado工程介绍
  • 9、上板调试验证并演示
  • 10、福利:工程源码获取

1、N25Q128A芯片解读

N25Q128A的参数有很多,作为FPGA开发者,需要关注如下参数:

1、4KBytes为1个Sector(扇区);
2、16个Sector(扇区)是1个Block(块)64KBytes;
3、容量为16M=128Mbite字节,共有256个Block,4096个Sector;

这三个参数直接决定了你怎么组织数据的读写操作,比如你的数据量很小,则考虑写入1个Sector(扇区),如果你的数据量很大,则考虑写多个Sector(扇区);
N25Q128A按照读写速度分为标准、Quad/Dual三种,这里只介绍标准版,学fpga就是这样,先把最基础的搞懂再去研究高级的,一步步扎实点兄弟。。。

标准模式下只需用到4个引脚:
时钟QSPI_CLK:25M即可,对于Flash来说,上升沿采集数据,下降沿输出数据;对于FPGA来说,则是下降沿输出数据,上升沿采集数据。。。我看到csdn上有人给出的代码居然直接有always @( negedge QSPI_CLK) 这样的写法,真是为这样的大佬感到震惊,感觉在校本科生也知道这样写不好吧。。。
片选信号QSPI_CS:低电平有效;
数据输出信号:QSPI_DQ1;
数据输入信号:QSPI_DQ0;
硬件原理图部分如下:
在这里插入图片描述
N25Q128A在本设计中需要用到的指令如下:

parameter CMD_NULL               =   8'h00  ;	//空操作
parameter CMD_RD_DEVICE_ID       =   8'h9F  ;	//读ID
parameter CMD_WR_DISABLE         =   8'h04  ;	//写禁止
parameter CMD_WR_ENABLE          =   8'h06  ;	//写使能
parameter CMD_PAGE_PROGRAM       =   8'h02  ;	//页编程
parameter CMD_RD_DATA            =   8'h03  ;	//读数据
parameter CMD_SECTOR_ERASE       =   8'h20  ;	//扇区擦除
parameter CMD_RD_STATUS_REGISTER =   8'h05  ;	//读状态寄存器

状态寄存器描述如下:
在这里插入图片描述
在写入指令或地址之前,需要读bit0为,确保其值为0才可操作;
其他的去看数据手册吧,太多了也写不完;

2、N25Q128A读写时序

N25Q128A读写本质上都一样,发送指令或发送指令加地址,则完成了读写操作;具体的对应关系如下,仅限本设计用到的:

/*                name                      instruction  cmd  addr  rd  wr  
读芯片信息        CMD_RD_DEVICE_ID           9F          √          √   
写禁止/写使能     CMD_WR_DISABLE/WR_ENABLE   04/06       √              
页编程(写数据)  CMD_PAGE_PROGRAM           02          √     √        √
读数据            CMD_RD_DATA                03          √     √    √   
扇区擦除          CMD_SECTOR_ERASE           20          √     √        
读状态寄存器      CMD_RD_STATUS_REGISTER     05          √          √            
空指令            CMD_NULL                   00          
*/

3、整体设计思路架构

整体设计思路架构如下:
在这里插入图片描述
1、VIO模拟按键:
启动一次QSPI读写操作,高电平有效;
2、QSPI读写驱动:
verilog代码实现,根据输入的指令和地址输出/输入QSPI数据;
3、QSPI读写操作:
读ID–>块擦除–>写入256个字节数据到Sector0–>读出256个字节数据–>缓存FIFO;
4、缓存FIFO:
缓存读出的256个字节数据,等待串口读取;
5、串口发送:
读取缓存FIFO数据,发送上位机显示;

4、verilog读写Flash驱动设计

使用三段式状态机实现;根据输入的指令或地址完成对应读写操作;
代码比较长,这里就不粘贴了,需要源码的兄弟可联系我;
顶层接口部分如下:

module helai_flash_driver #(
	parameter SYS_CLK_M = 200,	//系统时钟
	parameter SPI_CLK_M = 25	//QSPI时钟
)(
	input             clk            ,
	input             rst_n          ,
	input             i_flash_start  ,	//启动驱动,高电平有效
	input      [ 7:0] i_flash_cmd    ,	//输入指令
	input      [23:0] i_flash_addr   ,	//输入地址
	input             i_flash_dqout  ,	//N25Q128A输出
	output reg        o_flash_dqin   ,	//N25Q128A输入
	output            o_flash_csn    ,	//N25Q128A片选
	output reg        o_flash_cmd_ok ,	//单次读写操作完成
	output reg [ 7:0] o_flash_rx_data,	//输出数据
	output reg        o_flash_rx_de   	//输出数据有效,高有效        
);

5、verilog读写Flash控制器设计

使用三段式状态机实现;状态机步骤如下:

//第一步:读ID,发送CMD_RD_DEVICE_ID指令
//第二步:读ID完成,进入写禁止,发送CMD_WR_DISABLE指令
//第三步:进入写使能,发送CMD_WR_ENABLE指令
//第四步:进入页擦除,发送CMD_SECTOR_ERASE指令
//第五步:进入读状态寄存器,发送CMD_RD_STATUS_REGISTER指令
//第六步:进入写使能,发送CMD_WR_ENABLE指令
//第七步:进入页写,发送CMD_PAGE_PROGRAM指令
//第八步:进入读状态寄存器,发送CMD_RD_STATUS_REGISTER指令
//第九步:进入读状数据,发送CMD_RD_DATA指令

代码比较长,这里就不粘贴了,需要源码的兄弟可联系我;

6、FIFO缓存设计

fifo缓存读出的256字节数据,等待串口读取,很简单,不多说;

7、串口输出Flash读取数据

波特率自由配置,很简单,不多说;给出顶层接口如下:

module uart_transfer #(
	parameter SYS_CLK_M = 200,
	parameter UART_CLK  = 115200
)(
	input         clk         ,
	input         rst_n       ,
	input  [ 7:0] txd_data    ,
	input         txd_data_vld,
	output        txd_data_rdy, 
	output reg    txd_uart   
);

8、vivado工程介绍

开发板:Xilinx Artix7开发板;
开发环境:vivado2019.1;
输入:VIO;
输出:串口;

9、上板调试验证并演示

视频演示:

FPGA纯verilog代码读写N25Q128A QSPI

10、福利:工程源码获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料如下:获取方式:私,或者看下面的名片。
网盘资料如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/331671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一篇文章学懂C++和指针与链表

指针 目录 指针 C的指针学习 指针的基本概念 指针变量的定义和使用 指针的所占的内存空间 空指针和野指针 const修饰指针 指针和数组 指针和函数 指针、数组、函数 接下来让我们开始进入学习吧! C的指针学习 指针的基本概念 指针的作用:可…

K8S集群管理平台Rancher(2):安装与使用

Rancher 是一个容器管理平台。Rancher 简化了使用 Kubernetes 的流程。 下面记录一下手动安装Rancher的步骤 一、docker安装rancher 拉取rancher镜像 docker pull rancher/rancher运行rancher容器 sudo docker run -d --restartalways \ -v /mydata/docker/rancher_data…

基于Apache Maven构建多模块项目

title: 基于Apache Maven构建多模块项目 date: 2022-04-10 00:00:00 tags: Apache Maven多模块 categories:Maven 介绍 多模块项目由管理一组子模块的聚合器 POM 来构建。在大多数情况下聚合器位于项目的根目录中,并且必须是 pom 类型的项目。子模块是常规的 Mave…

excel数据整理:合并计算快速查看人员变动

相信大家平时在整理数据时,都会对比数据是否有重复的地方,或者该数据与源数据相比是否有增加或者减少。数据量不大还好,数据量大的话,对比就比较费劲了。接下来我们将进入数据对比系列课程的学习。该系列一共有两篇教程&#xff0…

ESP8266 + STC15+ I2C OLED带网络校时功能的定时器时钟

ESP8266 + STC15+ I2C OLED带网络校时功能的定时器时钟 📍相关篇《ESP8266 + STC15基于AT指令通过TCP通讯协议获取时间》 📌ESP8266 AT固件基于安信可AT固件,相关刷AT固件可以参考《NodeMCU-刷写AT固件》 🔖STC15 单片机采用的是:STC15F2K60S2 晶振频率采用内部:22.11…

Java面试——多线程并发篇

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

滑动窗口算法

滑动窗口 滑动窗口有俩种:定窗口和不定窗口。滑动窗口说白了就是双指针的运用。 定窗口说明是一个特定窗口大小,通常用来解决相邻的元素,最大值,最小值。 不定窗口说的是,先由右指针去找到第一个能够符合题意的位置…

【微信小程序】在WXML文件中显示JS文件中全局变量的方法

前言我们知道在wxml中可以通过数据绑定的方法来获取到js文件中data里面的数据,并且显示到wxml界面,那么我们该如何在wxml中显示js文件里面的全局变量呢?显示data里面数据的方法在wxml种我们可以显示js代码中data代码段中的变量。具体的操作是…

《跃迁:从技术到管理的硅谷路径》读后感

一、技术管理 1.技术管理包含两层含义: 一层是管理自己和团队的技术,进行技术选型,在正确的场景使用最适合的技术,保证程序简捷、强壮、可维护,最终完成产品的上线另一层是管理技术团队,帮助团队成员成长…

【面试题】2023 vue高频面试知识点汇总

一、MVVM原理在Vue2官方文档中没有找到Vue是MVVM的直接证据,但文档有提到:虽然没有完全遵循MVVM模型,但是 Vue 的设计也受到了它的启发,因此在文档中经常会使用vm(ViewModel 的缩写) 这个变量名表示 Vue 实例。为了感受MVVM模型的…

十二款硬盘数据恢复软件!恢复数据,最适合你的是这一款

硬盘数据发生丢失,通过快捷键、回收站、备份都无法恢复回来。对于电脑小白来说,最好的方法就是通过专业软件恢复数据。市面上很多硬盘数据恢复软件,我们大多不清楚它们有哪些功能,好不好用。 为此,我尝试了十二款数据…

雪花算法snowflake

snowflake中文的意思是 雪花,雪片,所以翻译成雪花算法。它最早是twitter内部使用的分布式环境下的唯一ID生成算法。在2014年开源。雪花算法产生的背景当然是twitter高并发环境下对唯一ID生成的需求,得益于twitter内部高超的技术,雪…

【从头开始】Java基础Day05

面向对象、三大特性、异常处理Day05面向对象构造器创建对象内存分析封装继承Super关键字重写多态instanceofStatic详解抽象类接口异常ErrorExceptionError和Exception的区别异常处理机制自定义异常类实际应用中关于异常的总结Day05 面向对象 面向对象编程的本质就是&#xff1…

在这些工厂、农田、服务区,看到智能中国的草蛇灰线

今天,应该很少人会怀疑,以AI、5G、云计算等新一代技术为核心的第四次工业革命,将发生在中国。正如保尔芒图在《十八世纪产业革命》中写道的那样:大工业的特殊性,并不是一下子就显露出来的。一开始,只是城市…

如何将VirtualBox虚拟机转换到VMware中

转换前的准备 首先需要你找到你的virtualbox以及VM安装到哪个文件夹里了,需要将这两个文件夹添加进环境变量Path中。 如果你记不清了,可以用everything全局搜索一下“VBoxManage.exe’以及“vmware-vdiskmanager.exe”,看一眼这个程序放到哪…

推荐几个好用的在线代码编译器

程序员最喜欢用的在线IDE代码编译器,功能很强大,类别很全! 1.网址https://tech.io/snippet 支持 20 种编程语言,页面上没有杂七杂八的东西,非常简约,非常干净,另外,它上面的代码段…

UE4:使用样条生成随机路径,并使物体沿着路径行走

一、关于样条的相关知识 参考自:样条函数 - 馒头and花卷 - 博客园 三次样条(cubic spline)插值 - 知乎 B-Spline(三)样条曲线的性质 - Fun With GeometryFun With Geometry 个人理解的也不是非常深,但是大概要知道的就是样条具…

【C++实现红黑树】

文章目录一、红黑树的概念及性质二、红黑树节点的定义三、红黑树的插入四、红黑树的验证五、完整代码六、总结一、红黑树的概念及性质 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一…

时间短/背景弱/获两国邀请函如期赴日本工程院士麾下访学

K老师因省公派要求,年底必须出国,除了申请还要办理各种派出手续,时间很紧张。本人为讲师,硕士学位,且没有论文及课题项目作为依托,学术背景较弱。通过努力,我们分别获得了美国夏威夷大学马诺阿分…

花了5年时间,用过市面上95%的工具,终于找到这款万能报表工具

经常有粉丝问我有“哪个报表工具好用易上手?”或者是“有哪些适合绝大多数普通职场人的万能报表工具?” 从这里我大概总结出了大家选择报表工具最期望满足的3点: (1)简单易上手:也就是所谓的学习门槛要低…