【FPGA】FPGA实现SPI协议读写FLASH(四)----- 汇总篇

FPGA实现Flash读写操作 本篇文章所使用的Flash型号为M25P16,是ST公司的一款(好像还有一款同名的,是别的公司的)。容量为16Mbit,SPI接口,时钟速率可达50Mhz。要想完成对Flash的读写擦除操作,只需要弄懂两点即可:SPI时序 和 Flash操作指令。其他的细节和一些概念可以学习的过程中了解补充。 阅读详情
AI摘要

该博客围绕FPGA实现SPI协议读写FLASH展开。先进行功能分析,包括按键控制请求、PC与FPGA数据交互等;接着划分模块,如按键消抖、串口收发等;然后给出部分模块代码实现;最后进行板级验证,涵盖读ID、写数据、读数据操作。


写在前面:
FPGA实现通过SPI协议读写FLASH系列相关文章:
SPI通信协议
【FPGA】FPGA实现SPI协议读写FLASH(一)----- M25P16操作概述
【FPGA】FPGA实现SPI协议读写FLASH(二)----- SPI接口驱动模块设计
【FPGA】FPGA实现SPI协议读写FLASH(三)----- SPI读写控制模块设计
上篇文章介绍了SPI读写控制模块的实现,本文将对SPI读写FLASH整体工程设计进行详细介绍;本项目中所使用的开发板型号:Cyclone IV E (EP4CE6F17C8),FLASH型号:M25P16。

一、功能分析

本工程要实现的功能如下:

  1. 通过按键控制读ID请求、读数据请求、写数据请求。
  2. PC端通过串口向FPGA发送写入FLASH的数据,FPGA从FLASH读回数据后通过串口发送给PC端进行显示,1次读写8字节数据。
  3. FPGA通过控制模块控制读写时序,实现SPI接口驱动,严格按照SPI协议与FLASH进行数据交互。
  4. 通过数码管显示读回的FLASH的ID数据以及读写模式。

二、模块划分

整体工程架构如下:
在这里插入图片描述
模块说明:
key_fliter:按键消抖模块,将输入的按键信号进行消抖处理,向控制模块输出稳定的请求信号。
uart_rx:串口接收模块,接收来自PC端的8字节数据,并发送给控制模块。
uart_tx:串口发送模块,将控制模块接收到的从FLASH读回的数据通过串口发送至PC端显示。
flash_control:FLASH读写控制模块,包含flash_write和flash_read模块。
flash_write:FLASH写控制模块,控制写操作指令发送顺序、数据发送以及延时操作等。
flash_read:FLASH读控制模块,控制读ID和读数据操作。
spi_interface:SPI接口驱动模块,实现SPI协议,将控制模块传输的数据按照SPI协议与FLASH进行数据交互。
seg_driver:数码管驱动模块,显示读回的FLASH的ID数据以及操作模式。

三、代码实现

1、工程顶层代码如下:

//  **************************************************************
//  Author: Zhang JunYi
//  Create Date: 2022.11.15                        
//  Design Name: spi_flash    
//  Module Name: top         
//  Target Device: Cyclone IV E (EP4CE6F17C8), FLASH(M25P16)                
//  Tool versions: Quartus Prime 18.1             
//  Description: SPI读写FLASH顶层设计模块
//  **************************************************************
module top (
    input           clk             ,
    input           rst_n           ,
    //  key_filter
    // input           rdid_req        ,       //  读ID请求  仿真用
    // input           rdda_req        ,       //  读数据请求
    // input           wr_req          ,       //  写请求
    input   [2:0]   key_in          ,

    //  上位机
    input           uart_rxd        ,
    output          uart_txd        ,
    //  FLASH
    output            sclk          ,
    output            cs_n          ,
    output            mosi          ,
    input             miso          ,
    //  seg_driver
    output  [7:0]   seg_dig         ,
    output  [5:0]   seg_sel         
);
    //  信号定义
    wire            rw_done         ;
    wire    [7:0]   rdout           ;
    
    wire    [7:0]   dout            ;
    wire            req             ;

    wire    [23:0]  display_id      ;
    wire            display_id_vld  ;
    wire    [2:0]   modle           ;

    wire    [7:0]   rxdata          ;
    wire            rxdata_vld      ;

    wire    [7:0]   txdata          ;
    wire            txdata_vld      ;
    wire            ready           ;

    wire            rdid_req        ;       //  读ID请求
    wire            rdda_req        ;       //  读数据请求
    wire            wr_req          ;       //  写数据请求

    // 模块例化
    key_filter u_key_filter1 (
    /*input           */.clk         (clk           ),
    /*input           */.rst_n       (rst_n         ),
    /*input           */.key_in      (key_in[0]     ),
    /*output    reg   */.key_out     (rdid_req      )
    );

    key_filter u_key_filter2 (
    /*input           */.clk         (clk           ),
    /*input           */.rst_n       (rst_n         ),
    /*input           */.key_in      (key_in[1]     ),
    /*output    reg   */.key_out     (rdda_req      )
    );

    key_filter u_key_filter3 (
    /*input           */.clk         (clk           ),
    /*input           */.rst_n       (rst_n         ),
    /*input           */.key_in      (key_in[2]     ),
    /*output    reg   */.key_out     (wr_req        )
    );

    uart_rx u_uart_rx (
        /*input               */.clk             (clk       ),
        /*input               */.rst_n           (rst_n     ),
        /*input               */.uart_rx         (uart_rxd  ),       //  接收到的串口数据
    
        /*output  [7:0]       */.rx_dout         (rxdata    ),       //  串行数据转换成并行数据后输出给control模块
        /*output              */.rx_dout_vld     (rxdata_vld)
    );

    uart_tx u_uart_tx (
    /*input               */.clk             (clk       ),
    /*input               */.rst_n           (rst_n     ),
    /*//  control*/
    /*input   [7:0]       */.tx_din          (txdata    ),
    /*input               */.tx_din_vld      (txdata_vld),
    /*output              */.ready           (ready     ),       //  给control模块的握手信号,表示可以接收数据进行发送 
    /*//  上位机*/
    /*output              */.uart_tx         (uart_txd  )
    );

    flash_control u_flash_control (
    /*input           */.clk             (clk       ),
    /*input           */.rst_n           (rst_n     ),
    /*//  key_filter*/
    /*input           */.rdid_req        (rdid_req  ),       //  读ID请求
    /*input           */.rdda_req        (rdda_req  ),       //  读数据请求
    /*input           */.wr_req          (wr_req    ),       //  写数据请求
    /*//  uart_rx*/
    /*input   [7:0]   */.rx_data         (rxdata    ),       //  串口接收要写入FLASH的数据
    /*input           */.rx_data_vld     (rxdata_vld),
    /*//  uart_tx*/
    /*input           */.ready           (ready     ),       //  ready
    /*output  [7:0]   */.tx_data         (txdata    ),       //  串口发送从FLASH读取的数据
    /*output          */.tx_data_vld     (txdata_vld),

    /*//  spi_interface*/
    /*input           */.rw_done         (rw_done   ),       //  SPI接口模块读写一字节完成标志
    /*input   [7:0]   */.rdin            (rdout     ),       //  SPI接口模块读回的数据
    /*output  [7:0]   */.dout            (dout      ),       //  输出给SPI接口模块要发送的数据
    /*output          */.req             (req       ),       //  读写请求
    //  seg_driver
    /*output  [23:0]  */.display_id      (display_id),       //  数码管显示读ID
    /*output          */.display_id_vld  (display_id_vld),
    /*output  [2:0]   */.modle           (modle     )        //  读写模式 001:读ID 010:读数据  100:写数据
    );

    spi_interface u_spi_interface (
    /*input               */.clk             (clk        ),
    /*input               */.rst_n           (rst_n      ),
    /*//  flash_control*/
    /*input               */.req             (req        ),       //  读写数据请求
    /*input   [7:0]       */.din             (dout       ),       //  要传输的数据
    /*output  [7:0]       */.rdout           (rdout      ),       //  读回的数据
    /*output              */.rw_done         (rw_done    ),       //  读写一字节数据完成标志
    /*//  M25P16*/
    /*output              */.sclk            (sclk),
    /*output              */.cs_n            (cs_n),
    /*output              */.mosi            (mosi),
    /*input               */.miso            (miso)   
    );

    seg_driver u_seg_driver (
    /*input               */.clk             (clk       ),
    /*input               */.rst_n           (rst_n     ),
    /*//  flash_control*/
    /*input   [2:0]       */.rw_flag         (modle     ),       //  读写标志
    /*input   [23:0]      */.disp_data       (display_id),
    /*input               */.disp_data_vld   (display_id_vld),
    /*//  数码管*/
    /*output  [5:0]       */.seg_sel         (seg_sel   ),
    /*output  [7:0]       */.seg_dig         (seg_dig   )             
    );  
endmodule

2、flash_control模块代码实现
FPGA实现SPI协议读写FLASH(三)----- SPI读写控制模块设计
3、spi_interface模块代码实现
【FPGA】FPGA实现SPI协议读写FLASH(二)----- SPI接口驱动模块设计
4、其他模块
其他的按键消抖模块、串口收发模块、数码管驱动模块比较简单,这里不过多赘述。

四、板级验证

1、读ID操作
在这里插入图片描述
2、写数据操作
在这里插入图片描述
3、读数据操作
在这里插入图片描述

【FPGA】FPGA基于spi的flash读写 文章目录一、SPI二、看spi--flash手册找关键1.描述2.flash接口信号3.SPI模式选择4.高字节MSB5.指令6. 写使能时序7.读ID时序8.读寄存器时序(我没用到)9.读数据时序10.页编程11.扇区擦除12.重要的时间三、状态机设计1.i2c接口状态机2.flash读状态机3.flash写状态机四、代码部分1.==spi_interface.v==2.==spi_read_ctrl.v==3.==spi_write_ctrl.v==4.==spi_control.v==5.==top. 阅读详情

相关推荐

FPGA实现基于SPI协议的Flash驱动控制(全擦除、页擦除、读数据、页写、连续写—地址写)

(图1-2-1-1:一主一从SPI通讯设备连接图)(图1-2-1:一主多从SPI通讯设备连接图)SPI通信协议采用的是主从通信模式,通信双方有主从之分,根据从机的设备个数,SPI通信设备之间的连接方式可以分为一主一从和一主多从。SPI通信协议包含1条时钟信号线、2条数据总线和1条片选信号线,时钟信号线为SCK、2条数据总线为MOSI和MISO,片选信号线为CS。它们的作用介绍如下:1.SCK(Serial Clock) : 时钟信号线,用于同步通信数据。

ADICDFHL的博客 2855

FPGA使用SPI控制FLASH

通过控制FLASH芯片进一步熟悉SPI协议。

m0_56222647的博客 4703

fpga使用spi协议擦除读写flash芯片

一.需求说明 fpga首先全擦除flash芯片,然后往flash芯片中写入一页数据,再接着读取这一页数据。 二.硬件介绍 1.flash资源介绍 M25P16芯片是flash芯片,容量是16Mbit。 16Mbit=16×1024×1024bit=2×1024×1024byte=2,097,152 bytes 。 总共有32个扇区,每个扇区有512×1024bit=65536byte。 每个扇区有256页,每页有256个字节。 每个地址占三个字节,第一个字节表示扇区,第二个字节表示页数,第三个字节表示页内

chenjieaaa的博客 4657

FPGA 读写访问 Flash

目录 前言 1、AT25DF641A flash芯片简介 2、AT25DF641A flash读访问时序 3、AT25DF641A flash写访问时序 (1)关于Protect Sector (2)关于Write Enable (3)关于Erase (4)关于状态寄存器 (5)写访问时序 前言 工作中,用到过两种flash:M25P32、AT25DF641A。 下面...

青春易逝,愿不负昭华,期待梦与远方 9919

fpga控制spi flash,fpga控制spiflashm25p64,Verilog

FPGA中的视频图像资源,以及想要永久存储的程序都是要存储在flash中,flash是FPGA一个不可缺少的部分,flash的种类有很多,因此设计了相应的flash控制器。

cesium自定义指南针

项目需要一个指南针,用鼠标按住旋转指针,会让3d地图旋转,点击中心点重置方位。当然可以使用插件cesium-navigation-es6,但是样式不好修改,所以我自定义了一个指南针。

weixin_47017648的博客 750

基于FPGA实现SD NAND FLASH的SPI协议读写

Flash是近些年应用最广、速度最快的只读存储器,原理是从 EEPROM 基础上改进发展来的,特点是擦除和编程速度快,因此得名为闪速(或闪烁)存储器,简称闪存。 NOR Flash 和 NAND Flash 是现在市场上两种主要的闪存技术。Intel于1988年首先开发出 NOR Flash 技术,彻底改变了原先由 EPROM 和 EEPROM 一统天下的局面。紧接着,1989年,东芝公司发表了 NAND Flash 结构,后者的单元电路尺寸几乎只是 NOR 器件的一半。

忆~遂愿的博客 3323

如何使用Ray和PyTorch训练模型

用户编写训练函数 → 定义单机训练逻辑。通过扩缩容配置 → 指定需要多少资源(Worker 数量、CPU/GPU)。训练器整合训练函数和配置 → 自动将训练函数分发到多个 Worker 上并行执行。Worker 运行训练函数 → 在分布式环境中完成模型训练。通过这种模式,Ray Train 实现了对分布式训练的抽象,用户只需关注单机训练逻辑,无需手动管理分布式通信和资源分配。

m0_62464865的博客 1922

基于FPGA的SPI协议及设计实现

基于FPGA的SPI协议及设计实现 博主微信:flm13724054952,不懂的有疑惑的也可以加微信咨询,欢迎大家前来投稿,谢谢! 引言介绍 在电子通信领域里采用的通信协议有IIC,SPI,UART,FSMC等协议。本文将基于FPGA来介绍并设计标准的SPI总线协议,实现FPGA与MCU的数据通信。SPI是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备...

weixin_39015789的博客 9101

海康SDK实战:如何从PS流中提取H264裸流并实现前端播放(附完整代码)

本文详细介绍了如何利用海康SDK从PS流中提取H264裸流,并构建无插件前端播放的完整链路。通过解析PS流结构、提取H264 ES流,结合WebSocket实时传输与WFS.js前端播放器,实现了低延迟、高可控性的视频流处理方案,为开发者提供了从数据源到前端渲染的实战代码与清晰指南。

weixin_29051811的博客 474

Anaconda下安装LabelImg

Anaconda下安装LabelImg

LYH8543的博客 756

Verilog:基于FPGA实现SD NAND FLASH的SPI协议读写

简介Flash是近些年应用最广、速度最快的只读存储器,原理是从 EEPROM 基础上改进发展来的,特点是擦除和编程速度快,因此得名为闪速(或闪烁)存储器,简称闪存。NOR Flash 和 NAND Flash 是现在市场上两种主要的闪存技术。Intel于1988年首先开发出 NOR Flash 技术,彻底改变了原先由 EPROM 和 EEPROM 一统天下的局面。

m0_73879806的博客 1998

【人工智能】AI驱动值班巡检Agent(Hermes)

传统运维值班巡检场景中,存在四大核心痛点:本项目基于 Agent+Skills+浏览器自动化 架构,构建了具备自我进化能力的AI值班员,核心逻辑流如下:

奶爸的编程之路,也就一周冷个三天 177

FPGA模块——SPI协议(读写FLASH)

有个输入时序的要求 开始时CS拉低等待(tSLCH要求最小5ns)再开始, 结束时CS拉高等待(tSHSL用100ns )再进行下一次操作。写使能:开始时CS拉低等待(tSLCH要求最小5ns)再开始,结束时CS拉高等待(tSHSL取100ns )再进行下一次操作。方便进行读取和局部操作。100m时钟和clk_cnt配合进行数据的读取和输出(clk_cnt有等于1和0的时候)主机和从机在时钟上升沿放入要输出的数据,在时钟下降沿读取要输入的数据。数据写多了会把之前的数据覆盖掉,要判断操作是否完成。

Treasureljc的博客 5884

uniapp(安卓 | 苹果) - 最新详细实现App打包发布教程,uni-app苹果IOS软件应用上架App Store软件商店,uni-app打包发布安卓Android软件到各大应用商店(详细教程

uni-app,安卓android,苹果ios,uniapp App软件,Uniapp上架发布应用,打包构建,apk、app软件,应用商店,应用市场,app store,uni-app安卓苹果app上架应用商店,app应用从创建到上架_uniapp打包app的流程和上架,uniapp打包上架ios Appstore 最全流程,苹果应用商店上架教程,uniapp生成的app怎么上架到iphone的app store,uni-app打包到上架Android , ios完整详细流程,审核一直不通过,软件商店审核失

✅ 精选推荐文章 1万+

DO-297标准详解:IMA系统开发与认证指南

DO-297的前言部分为读者提供了本指南的概述,说明了该标准的编写背景、主要目标、目标受众以及该文件在开发和认证集成模块化航空电子(IMA,Integrated Modular Avionics)系统中的作用。作为现代航空电子架构的重要组成部分,IMA系统大幅度简化了航空电子系统的硬件配置,增加了灵活性并降低了成本。因此,DO-297成为确保IMA系统开发、集成和认证符合适航标准的核心文件。在现代航空领域,系统复杂性逐渐增加,传统上各子系统独立运行的方式已经不适应多任务、多功能的需求。

qq_41854911的博客 1583

基于FPGA的SPI读写flash

①CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。②CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。④CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。

weilit_的博客 3305

社区版 ABAP MCP 能不能读取 SAP S/4HANA 公有云开发对象,我的判断是能试,但不能当成已被 SAP 背书的标准通道

文章摘要:当前存在多个社区项目(如mcp-abap-adt、mcp-abap-abap-adt-api等)通过包装ABAP ADT能力为MCP Server,使AI开发工具能读取ABAP对象。这些项目技术上依赖ADT HTTP API或SAP官方ADT language server,但针对SAP S/4HANA Cloud Public Edition的完整适配仍存在挑战。SAP官方已通过VS Code扩展提供ADT MCP能力,而社区方案在云环境下需遵循ABAP Cloud的严格限制,仅能访问已授权的开

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 86

【FPGA】FPGA实现SPI协议读写FLASH(三)----- SPI读写控制模块设计

SPI读写控制模块设计及仿真分析

白码王子小张的博客 4742

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SPI协议读取FLASH【FPGA】

spi_flash

xyf_fate的博客 5924

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【FPGA】FPGA实现SPI协议读写FLASH(二)----- SPI接口驱动模块设计

SPI通信协议接口驱动实现

白码王子小张的博客 5379

基于FPGA的SPI控制FLASH读写

SPI是Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是由Motorola(摩托罗拉)公司推出的一种全双工、同步串行总线接口,只需要四根信号线即可实现多个芯片之间的主从连接结构,节约引脚,同时有利于PCB的布局。它主要应用在如:Flash存储器、EEPROM存储器、ADC、DAC、RTC等,实现主控器与芯片之间的串行数据传输。SPI通信需要四根信号线,分别为sck、mosi、miso和cs n。

Turing_kun的博客 3546

【FPGA】FPGA实现SPI协议读写FLASH(一)----- M25P16操作概述

FLASH(M25P16)概述及操作介绍

白码王子小张的博客 6688
上一篇: 【FPGA】FPGA实现SPI协议读写FLASH(三)----- SPI读写控制模块设计
下一篇: 【C语言】预处理指令
白码王子小张
博客等级 码龄7年 6665粉丝 121原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值