Verilog: 按键控制基于SPI协议M25P16读写操作系统设计(一)模块划分、原理分析及相关参数定义

目录

1. 需求分析

2. 模块划分

3. 主要原理概述

(1)SPI(见SPI前文,详情点击链接)

(2)M25P16(本系统所用知识点,详情点击链接)

a. 概述

b. SPI模式

(3)命令

a. 读ID(RDID)

b. 读数据(READ)

c. 写使能(WREN)

d. 扇区擦除(SE)

e. 读状态寄存器(RDSR)

f. 页编程(PP)

目录

1. 需求分析

2. 模块划分

3. 主要原理概述

(1)SPI(见SPI前文,详情点击链接)

(2)M25P16(本系统所用知识点,详情点击链接)

a. 概述

b. SPI模式

(3)命令

a. 读ID(RDID)

b. 读数据(READ)

c. 写使能(WREN)

d. 扇区擦除(SE)

e. 读状态寄存器(RDSR)

f. 页编程(PP)

(4)时钟

4. 相关参数定义

1. 需求分析

预实现功能:按键控制实现读芯片ID操作、读芯片存储数据操作及写入数据操作

2. 模块划分

a. 需要使用按键控制,采用按键消抖模块

b. 对于flash读写操作,为清晰逻辑,分为读操作模块、写操作模块及读写控制模块

c. 由于需要与M25P16实现通信,所以需要SPI接口模块

d. 最终需要显示读写相关数据,采用动态数码管显示模块

模块划分框图如图2.1。

图2.1  模块框图

3. 主要原理概述

(1)SPI(见SPI前文,详情点击链接)

(2)M25P16(本系统所用知识点,详情点击链接)

a. 概述

  •  可同时编程1-256 byte
  • 一共32个扇区(sector),256 page/sector,256 byte/page

图3.1  M25P16逻辑图

表3.1  信号名

Serial Data Output (Q)

      在串行时钟的下降沿,输入的数据data被串行地输出。

Serial Data Input (D

      输入数据可以是命令、地址或数据,在串行时钟的上升沿被锁存。

Serial Clock (C)

      串行时钟为接口提供时序,命令、地址或数据在时钟上升沿被锁存,在时钟下降沿之后,输出数据Q改变。

Chip Select (S)

      片选信号S为高时,flash未被选中,数据输出端Q为高阻态,除非内部编程擦除或写状态寄存器时,其处于待机模式,片选信号S为低时,flash处于激活状态。

Hold (HOLD)

      保持信号用于在片选信号S为低时,取消flash与其他任何设备之间的通信。

Write Protect (W)

      写保护信号的主要目的是冻结受编程或删除命令保护的内存区域。

b. SPI模式

      支持SPI两种通信模式:

模式0:CPOL = 0,CPHA = 0;

模式3:CPOL = 1,CPHA = 1;

图3.2 SPI模式0、模式3时序

即M25P16:上升沿接收数据,下降沿数据改变

注意:Mode0模式的前8个Sclk周期之内,从机只能接收主机发送的数据,不能向主机发送数据,之后的时钟周期之内,从机和主机之间可以进行全双工通信,可以用于主机先向从机发命令,然后从机接收到命令后再向主机返回数据。

(3)命令

a. 读ID(RDID)

作用 :读取芯片ID;

Code:8’h9f

时序:

使用方法:1字节命令+3字节芯片ID

b. 读数据(READ)

作用 :读取芯片对应地址数据;

Code:8’h03

时序 :

使用方法:1字节命令+3字节地址+1字节以上数据

c. 写使能(WREN)

作用 :写操作之前发送写使能命令,进行写使能锁存,执行写使能被锁存才能进行相关写操作(SE/PP等);

Code:8’h06

时序:

使用方法:1字节命令+延时至少100ns

d. 扇区擦除(SE)

作用 : 擦除对应扇区数据全为1(FF),PP之前必须先擦除;

Code:8’hd8

时序:

使用方法:1字节命令+3字节地址+延时至少3s

e. 读状态寄存器(RDSR)

作用 :读取状态寄存器;

Code:8’h05

时序:

使用方法:1字节命令+至少1字节状态寄存器状态数据+延时至少100ns

  状态寄存器格式

WIP bit :“正在写入”(WIP)位指示内存是忙于写入状态寄存器、编程或擦除周期。当设置为1时,这样的循环正在进行,当重置为0时,没有这样的循环正在进行。

WEL bit 写入使能锁存器(WEL)位表示内部写入使能锁存器的状态。当设置为1时,内部写使能锁存设置,当设置为0时,内部写使能锁存重置,不接受写状态寄存器、编程或擦除命令。

BP2, BP1, BP0 bits 块保护(BP2、BP1、BP0)位是非易失性的。它们定义了要被软件保护的区域的大小,以防止编程和擦除命令的使用。这些位是用写状态寄存器(WRSR)命令写入的。当块保护(BP2、BP1、BP0)位设置为1时,相关内存区域。不受页面编程(PP)和扇区擦除(SE)命令的保护。在没有设置硬件保护模式的情况下,可以写入块保护(BP2、BP1、BP0)位。当且仅当两个块保护(BP2、BP1、BP0)位均为0时,才执行批量擦除(BE)命令。

SRWD bit 状态寄存器写入禁用(SRWD)位与写入保护(W)信号一起操作。状态寄存器写禁用(SRWD)位和写保护(W)信号允许设备处于硬件保护模式(当状态寄存器写禁用(SRWD)位设置为1,并且写保护(W)被驱动为低)。在此模式下,状态寄存器(SRWD、BP2、BP1、BP0)的非易失性位变成只读位,而写状态寄存器(WRSR)命令不再被接受执行。

f. 页编程(PP)

作用:通过将擦除位全1状态的对应地址中的1翻转位0来写入响应的数据;

Code:8’h02

时序:

使用方法:1字节命令+3字节地址+至少1字节写入数据+延时至少5ms

(4)时钟

 写时钟最大支持50MHz,读时钟最大支持20MHz,本设计基于FPGA芯片EP4CE6F17C8,时钟频率50MHz,为便于实现功能及提升满足读写时钟要求,本设计采用芯片时钟的16分频(4、8等皆可)。

4. 相关参数定义

//******************flash m25p16 命令参数***************************
`define    WREN           8'h06           //写使能
`define    WRDI           8'h04           //写设备ID
`define    RDID           8'h9f           //读设备ID
`define    RDSR           8'h05           //读状态寄存器
`define    WRSR           8'h01           //写状态寄存器
`define    READ           8'h03           //读数据
`define    FAST_READ      8'h0b           //高速读数据
`define    PP             8'h02           //页编程
`define    SE             8'hd8           //扇区擦除
`define    BE             8'hc7           //块擦除
`define    DP             8'hb9           //深度断电
`define    RES            8'hab           //释放(from 深度断电 和 阅读电子签名)
            
//地址参数             
`define    INIT_ADDR      24'h01          //读写操作首地址

//************************字节参数定义*******************************
//max: 1字节命令 + 3字节地址或ID + 256字节数据(256 bytes/page)

//spi_interface
`define    MUX_BIT        4'd7            //spi接口模块每次传输一个字节(8bit)数据 8-1

//flash_read
`define    RDID_BYTES     9'd3            //命令字节 + 3字节ID 4-1
`define    RDDATA_BYTES   9'd6            //命令字节 + 3字节地址 + 至少1字节数据(>=5)  7-1 

//flash_write         
`define    WREN_BYTES     9'd0            //命令字节 1-1  
`define    SE_BYTES       9'd3            //命令字节 + 3字节地址 4-1
`define    RDSR_BYTES     9'd1            //命令字节 + 3字节数据(状态寄存器)2-1
`define    PP_BYTES       9'd6            //命令字节 + 3字节地址 + 至少1字节数据(>=5)  7-1

//**************************时间参数********************************
//flash_write
`define    TIME_CMD       27'd9           //片选信号拉高后至少持续100ns才能执行下一个命令 200/20 - 1
//`define    TIME_PP        27'd249_999     //页编程周期时间   5ms
 `define    TIME_PP        27'd249     //仿真专用
//`define    TIME_SE        27'd149_999_99  //扇区擦除周期时间 3s
 `define    TIME_SE        27'd149 //仿真专用

//spi_interface
//分频时钟参数  由于读操作最大只支持20MHz,所以需要对50MHz进行分频  读写操作统一使用该时钟
`define    FREQUENCY      5'd15           //16分频 16-1
`define    SCLK_FALL      5'd3            //下降沿 16/4 - 1
`define    SCLK_RISE      5'd11           //上升沿 16/4*3 - 1

ps:按键控制模块及数码管显示模块非本设计主部分暂不赘述。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值