基于SPI协议的SPI-FLASH(M25P16V/W25Q16JV)控制器-全擦除
本文基于【野火】FPGA开发板视频教程及资料,首先对野火公司表示衷心感谢,我认为原波形图有进一步便于理解和整齐的画法,代码也有可以精简的地方,在这里分享给大家,代码通过Modelsim行为级验证。
目录
波形图
代码
行为级仿真
波形图
代码
`timescale 1ns/1ns// Author : NSSC_小天
// Create Date : 2022/11/20
// Module Name : flash_be_ctrl
// Project Name : spi_flash_be
// Target Devices: 黑金 AX309
// Tool Versions : ISE 14.7
// Description : flash全擦除模块
// Revision : V1.0module flash_be_ctrl
(input wire sys_clk , //系统时钟,频率50MHzinput wire sys_rst_n , //复位信号,低电平有效input wire key , //按键输入信号output reg cs_n , //片选信号output reg sck , //串行时钟output reg mosi //主输出从输入数据
);//********************************************************************//
//****************** Parameter and Internal Signal *******************//
//********************************************************************////parameter define
parameter IDLE = 4'b0001 , //初始状态WR_EN = 4'b0010 , //写状态DELAY = 4'b0100 , //等待状态BE = 4'b1000 ; //全擦除状态
parameter WR_EN_INST = 8'b0000_0110, //写使能指令BE_INST = 8'b1100_0111; //全擦除指令//reg define
reg [4:0] cnt_clk ; //系统时钟计数器
reg [3:0] state ; //状态机状态
reg [2:0] cnt_byte; //字节计数器
reg [1:0] cnt_sck ; //串行时钟计数器
reg [2:0] cnt_bit ; //比特计数器//********************************************************************//
//***************************** Main Code ****************************//
//********************************************************************////cnt_clk:系统时钟计数器-640ns,即作为单个byte的发送周期,也作为t_SLCH,t_CHSH,t_SLCH的等待时间
//2的5次方=32,计数0-31,自动溢出
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_clk <= 5'd0;else if(state != IDLE)cnt_clk <= cnt_clk + 1'b1; //cnt_byte:记录输出字节个数和等待时间
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_byte <= 3'd0;else if((cnt_clk == 5'd31) && (cnt_byte == 3'd6))cnt_byte <= 3'd0;else if(cnt_clk == 31)cnt_byte <= cnt_byte + 1'b1;//cnt_sck:串行时钟计数器,用以生成串行时钟,4分频,12.5Mhz
//2的2次方=4,计数0-3,自动溢出
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_sck <= 2'd0;else if(cnt_byte == 3'b1)cnt_sck <= cnt_sck + 1'b1;else if(cnt_byte == 3'd5)cnt_sck <= cnt_sck + 1'b1; //cnt_bit:控制mosi输出指令的哪一位
//2的3次方=8,计数0-7,自动溢出
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_bit <= 3'd0;else if(cnt_sck == 2'd1)cnt_bit <= cnt_bit + 1'b1;//sck:输出串行时钟
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)sck <= 1'b0;else if(cnt_sck == 2'd3)sck <= 1'b0;else if(cnt_sck == 2'd1)sck <= 1'b1;//cs_n:片选信号
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cs_n <= 1'b1;else if(key == 1'b1)cs_n <= 1'b0;else if((cnt_byte == 3'd2) && (cnt_clk == 5'd31))cs_n <= 1'b1;else if((cnt_byte == 3'd3) && (cnt_clk == 5'd31))cs_n <= 1'b0;else if((cnt_byte == 3'd6) && (cnt_clk == 5'd31))cs_n <= 1'b1;//state:两段式状态机第一段,状态跳转
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)state <= IDLE;elsecase(state)IDLE: if(key == 1'b1)state <= WR_EN;WR_EN: if((cnt_byte == 3'd2) && (cnt_clk == 5'd31))state <= DELAY;DELAY: if((cnt_byte == 3'd3) && (cnt_clk == 5'd31))state <= BE;BE: if((cnt_byte == 3'd6) && (cnt_clk == 5'd31))state <= IDLE;default:state <= IDLE;endcase//mosi:两段式状态机第二段,逻辑输出
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)mosi <= 1'b0;else if((cnt_byte == 3'd0) && (cnt_clk == 5'd31))mosi <= WR_EN_INST[7]; //写使能指令[7]else if((cnt_byte == 3'd1) && (cnt_sck == 2'd3) && (cnt_clk != 5'd31))mosi <= WR_EN_INST[7 - cnt_bit]; //写使能指令[6-0]else if((cnt_byte == 3'd1) && (cnt_clk == 5'd31))mosi <= 1'b0;else if((cnt_byte == 3'd4) && (cnt_clk == 5'd31))mosi <= BE_INST[7]; //全擦除指令[7]else if((cnt_byte == 3'd5) && (cnt_sck == 2'd3) && (cnt_clk != 5'd31))mosi <= BE_INST[7 - cnt_bit]; //全擦除指令[6-0]else if((cnt_byte == 3'd5) && (cnt_clk == 5'd31))mosi <= 1'b0;
endmodule
行为级仿真波形
基于SPI协议的SPI-FLASH(M25P16V/W25Q16JV)控制器-全擦除相关推荐
- STM32学习之SPI协议(读写FLASH)
关于STM32学习分享 第八章 SPI协议(读写FLASH) 文章目录 关于STM32学习分享 前言 二.代码 1.spi_flash.c 2.spi_flash.h 3.main.c 总结 前言 开 ...
- STM32F429入门(二十一):SPI协议及SPI读写FLASH
IIC主要用于通讯速率一般的场合,而SPI一般用于较高速的场合. 一.SPI协议简介 SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设 ...
- 18. SPI协议,spi转can,MCP2515裸机驱动详解
更多信息请关注公众号:一口Linux 十八.SPI.MCP2515 一.SPI概述 Serial Peripheral interface 通用串行外围设备接口 是Motorola首先在其MC68HC ...
- 嵌入式硬件入门——Flash Memory(W25Q64+SPI协议)
Flash存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还可以快速读取数据(NVRAM的优势),使数据不会因为断电而丢失. 文章目录 Flash Fla ...
- 【FPGA】SPI协议详解及对flash读写操作
FPGA基于SPI实现对flash读写操作 概括 一.SPI协议.flash讲解 1.SPI协议 2.flash (1)WREN (2)RDID (3)WRSR (4)READ (5)PP (6)SE ...
- 【嵌入式基础】基于IIC和SPI协议的温湿度采集与OLED显示
本文主要介绍IIC总线通信协议和SPI协议,并使用STM32系列芯片基于IIC协议实现AHT20温湿度传感器上位机数据采集,基于SPI协议实现OLED显示. 目录 一.IIC总线通信协议 1.IIC协 ...
- 基于IIC和SPI协议的温湿度采集与OLED显示
前言 环境 KEIL:5.0 FIyMcu:V0.993 开发板:STM32F103C8T6 器件 AHT-20 温湿度传感器 0.96英寸OLED屏幕 任务1内容 学习I2C总线通信协议,使用STM ...
- SPI协议的Flash
简介 不是所有的flash都是spi协议,本节学习用SPI协议传输数据的flash SPI是摩托罗拉公司提出的通讯协议,和IIC一样,也是板级的协议,但是速度要比IIC快得多. SPI是全双工通信 S ...
- 几种常用通信协议:IIC协议、SPI协议、UART协议
通信可以形象的比喻成两个人讲话:1.你说的别人得能听懂:双方约定信号的协议.2.你的语速别人得能接受:双方满足时序要求. 一.IIC协议: 2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一 ...
最新文章
- rancher部署项目Validation failed in API: Deployment.apps“”must be no more than 63 characters问题原因及解决方法
- linux设置网络 重命名,01-Redhat/Centos7网卡命名介绍及修改方式
- Hemberg-lab单细胞转录组数据分析(八) - Scater包输入导入和存储
- shopxo二次开发:博客系统项目 (后台使用 - 教程篇)
- python反向切片_Python-关于反向切片的小问题
- 算法导论 思考题4-1
- python笔记(求100偶数的和)
- 打开相机用鼠标画框,画下一个时上一个消失
- c语言 解析通信报文,基于DL/T645—2007通信规约报文的分析
- JAVA项目开发之文档篇
- matlab画圆的命令_matlab画圆
- 微型计算机原理 考试试题,微机原理期末考试试题及答案
- 周灏:金融大数据量化信用
- PAT乙级 1072 开学寄语
- 一张图30分钟带你入门python-我,30分钟,P了100张图,秒杀全公司同事
- Unity 在2D中实现LookAt
- 对自己狠一点,离成功近一点
- 【uni-app】Hbuilder打包h5发行到web服务器
- python猜字游戏猜三次_python 猜字游戏
- 如何使用jQuery和CSS创建万花筒