本文基于【野火】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)控制器-全擦除相关推荐

  1. STM32学习之SPI协议(读写FLASH)

    关于STM32学习分享 第八章 SPI协议(读写FLASH) 文章目录 关于STM32学习分享 前言 二.代码 1.spi_flash.c 2.spi_flash.h 3.main.c 总结 前言 开 ...

  2. STM32F429入门(二十一):SPI协议及SPI读写FLASH

    IIC主要用于通讯速率一般的场合,而SPI一般用于较高速的场合. 一.SPI协议简介 SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设 ...

  3. 18. SPI协议,spi转can,MCP2515裸机驱动详解

    更多信息请关注公众号:一口Linux 十八.SPI.MCP2515 一.SPI概述 Serial Peripheral interface 通用串行外围设备接口 是Motorola首先在其MC68HC ...

  4. 嵌入式硬件入门——Flash Memory(W25Q64+SPI协议)

    Flash存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还可以快速读取数据(NVRAM的优势),使数据不会因为断电而丢失. 文章目录 Flash Fla ...

  5. 【FPGA】SPI协议详解及对flash读写操作

    FPGA基于SPI实现对flash读写操作 概括 一.SPI协议.flash讲解 1.SPI协议 2.flash (1)WREN (2)RDID (3)WRSR (4)READ (5)PP (6)SE ...

  6. 【嵌入式基础】基于IIC和SPI协议的温湿度采集与OLED显示

    本文主要介绍IIC总线通信协议和SPI协议,并使用STM32系列芯片基于IIC协议实现AHT20温湿度传感器上位机数据采集,基于SPI协议实现OLED显示. 目录 一.IIC总线通信协议 1.IIC协 ...

  7. 基于IIC和SPI协议的温湿度采集与OLED显示

    前言 环境 KEIL:5.0 FIyMcu:V0.993 开发板:STM32F103C8T6 器件 AHT-20 温湿度传感器 0.96英寸OLED屏幕 任务1内容 学习I2C总线通信协议,使用STM ...

  8. SPI协议的Flash

    简介 不是所有的flash都是spi协议,本节学习用SPI协议传输数据的flash SPI是摩托罗拉公司提出的通讯协议,和IIC一样,也是板级的协议,但是速度要比IIC快得多. SPI是全双工通信 S ...

  9. 几种常用通信协议:IIC协议、SPI协议、UART协议

    通信可以形象的比喻成两个人讲话:1.你说的别人得能听懂:双方约定信号的协议.2.你的语速别人得能接受:双方满足时序要求. 一.IIC协议: 2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一 ...

最新文章

  1. rancher部署项目Validation failed in API: Deployment.apps“”must be no more than 63 characters问题原因及解决方法
  2. linux设置网络 重命名,01-Redhat/Centos7网卡命名介绍及修改方式
  3. Hemberg-lab单细胞转录组数据分析(八) - Scater包输入导入和存储
  4. shopxo二次开发:博客系统项目 (后台使用 - 教程篇)
  5. python反向切片_Python-关于反向切片的小问题
  6. 算法导论 思考题4-1
  7. python笔记(求100偶数的和)
  8. 打开相机用鼠标画框,画下一个时上一个消失
  9. c语言 解析通信报文,基于DL/T645—2007通信规约报文的分析
  10. JAVA项目开发之文档篇
  11. matlab画圆的命令_matlab画圆
  12. 微型计算机原理 考试试题,微机原理期末考试试题及答案
  13. 周灏:金融大数据量化信用
  14. PAT乙级 1072 开学寄语
  15. 一张图30分钟带你入门python-我,30分钟,P了100张图,秒杀全公司同事
  16. Unity 在2D中实现LookAt
  17. 对自己狠一点,离成功近一点
  18. 【uni-app】Hbuilder打包h5发行到web服务器
  19. python猜字游戏猜三次_python 猜字游戏
  20. 如何使用jQuery和CSS创建万花筒

热门文章

  1. oracle位图索引和普通索引区别,Oracle学习之位图索引
  2. lucene 4.3 ansj分词演示
  3. fastjson的基本使用方法
  4. 学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
  5. n皇后问题(回溯法)(超易理解)(详细注释)
  6. 陈越《数据结构》第六讲 图(上)
  7. Python 基础学习 locals()用法
  8. CreateThread与_beginthreadex
  9. 第26章、OnKeyListener键盘事件(从零开始学Android)
  10. 电压跟随器的概念及使用总结