FPGA project : flash_secter_erase

flash的指定扇区擦除实验。

先发写指令,再进入写锁存周期等待500ns,进入写扇区擦除指令,然后写扇区地址,页地址,字节地址。即可完成扇区擦除。

模块框图:

时序图: 

代码: 

module spi (input       wire            sys_clk     ,input       wire            sys_rst_n   , input       wire            key_start   ,output      wire            miso        ,output      reg             mosi        ,output      reg             cs_n        ,output      reg             sck 
);// parameter parameter   COMD_W  = 8'h06   , // 写指令COMD_B  = 8'hc7   , // 全擦除指令COMD_S  = 8'hd8   ; // 扇区擦除指令parameter   ADR_SE  = 8'h00   , // 扇区地址 adress secterADR_PA  = 8'h04   , // 页地址   adress pageADR_BY  = 8'h25   ; // 字节地址 adress byteparameter   IDLE    = 4'b0001 ,WREN    = 4'b0010 ,WEL     = 4'b0100 ,SE      = 4'b1000 ;// wire signal deginewire                IDLEtoWREN; wire                WRENtoWEL ;  wire                WRENtoSE  ;   wire                SEtoIDLE  ;   // reg signal definereg     [3:0]       state_c   ;reg     [3:0]       state_n   ;reg     [3:0]       cnt_20ns  ;reg     [3:0]       cnt_bit   ;reg     [3:0]       cnt_byte  ;reg                 flag_bit  ;reg                 f_b_reg   ; // flag_bit_reg的缩写
/****************************************************************************/// 三段式状态机// 现态与次态描述// state_calways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) state_c <= IDLE ;elsestate_c <= state_n ;end// state_nalways @(*) begincase (state_c)IDLE   :if(IDLEtoWREN)state_n <= WREN ;else state_n <= IDLE ;WREN   :if(WRENtoWEL)state_n <= WEL  ;else state_n <= WREN ;WEL    :if(WRENtoSE)state_n <= SE   ;else state_n <= WEL  ;SE     :if(SEtoIDLE)state_n <= IDLE ;else state_n <= SE   ;default:    state_n <= IDLE ;endcaseend// 状态转移描述assign  IDLEtoWREN  = ( state_c == IDLE) && ( key_start     ) ;assign  WRENtoWEL   = ( state_c == WREN) && ( f_b_reg       ) ;assign  WRENtoSE    = ( state_c == WEL ) && ( cnt_20ns == 6 ) ;assign  SEtoIDLE    = ( state_c == SE  ) && ( f_b_reg       ) ;// 相关信号描述// reg     [3:0]       cnt_20ns  ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_20ns <= 4'd0 ;else case (state_c)IDLE :  cnt_20ns <= 4'd0 ;WREN :  if(cnt_20ns || f_b_reg)cnt_20ns <= 4'd0 ;else cnt_20ns <= cnt_20ns + 1'b1 ;WEL  :  if(cnt_20ns == 6) // 60x20ns==120nscnt_20ns <= 4'd0 ;elsecnt_20ns <= cnt_20ns + 1'b1 ;SE   :    if(cnt_20ns || f_b_reg)cnt_20ns <= 4'd0 ;else cnt_20ns <= cnt_20ns + 1'b1 ;default:    cnt_20ns <= 4'd0 ;endcaseend// reg     [3:0]       cnt_bit   ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)cnt_bit <= 4'd0 ;else case (state_c)IDLE :  cnt_bit <= 4'd0 ;WREN :  if(!cnt_20ns && sck && cnt_bit == 7)cnt_bit <= 4'd0 ;else if(!cnt_20ns && sck)cnt_bit <= cnt_bit + 1'b1 ;WEL  :  cnt_bit <= 4'd0 ;SE   :  if(!cnt_20ns && sck && cnt_bit == 7)cnt_bit <= 4'd0 ;else if(!cnt_20ns && sck)cnt_bit <= cnt_bit + 1'b1 ;default:    cnt_bit <= 4'd0 ;endcaseend// reg      [3:0]       cnt_bytealways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_byte <= 4'd0 ;else if(cnt_bit == 7 && !cnt_20ns && sck && cnt_byte == 4)cnt_byte <= 4'd0 ;else if(cnt_bit == 7 && !cnt_20ns && sck)cnt_byte <= cnt_byte + 1'b1 ;else cnt_byte <= cnt_byte ;end// reg                 flag_bit  ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) flag_bit <= 1'b0 ;elsecase (state_c)IDLE :  flag_bit <= 1'b0 ;WREN :  if(cnt_bit == 7 && sck && !cnt_20ns)flag_bit <= 1'b1 ;else flag_bit <= flag_bit ;WEL  :  flag_bit <= 1'b0 ;SE   :  if(cnt_bit == 7 && sck && !cnt_20ns && cnt_byte == 4)flag_bit <= 1'b1 ;else flag_bit <= flag_bit ;default: flag_bit <= 1'b0 ;endcaseend// reg                 f_b_reg   ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginf_b_reg <= 1'b0 ;end else beginf_b_reg <= flag_bit ;endend// output signal// wire            miso        ,assign miso = 1'bz ;// mosialways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)mosi <= 1'b0 ;elsecase (state_c)IDLE :  mosi <= 1'b0 ;WREN :  if(!cnt_bit) // (cnt_bit == 0)mosi <= COMD_W[7] ;else if(cnt_20ns && sck)mosi <= COMD_W[7 - cnt_bit] ;else mosi <= mosi ;WEL  :  mosi <= 1'b0 ;SE   :  case (cnt_byte)1:  beginif(!cnt_bit)mosi <= COMD_S[7] ;else if(cnt_20ns && sck)mosi <= COMD_S[7 - cnt_bit] ;else mosi <= mosi ;  end2:  beginif(!cnt_bit)mosi <= ADR_SE[7] ;else if(cnt_20ns && sck)mosi <= ADR_SE[7 - cnt_bit] ;else mosi <= mosi ;  end3:  beginif(!cnt_bit)mosi <= ADR_PA[7] ;else if(cnt_20ns && sck)mosi <= ADR_PA[7 - cnt_bit] ;else mosi <= mosi ;  end4:  beginif(!cnt_bit)mosi <= ADR_BY[7] ;else if(cnt_20ns && sck)mosi <= ADR_BY[7 - cnt_bit] ;else mosi <= mosi ;  enddefault:        mosi <= 1'b0 ;endcasedefault:    mosi <= 1'b0 ;endcaseend// reg             cs_n        ,always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) begincs_n <= 1'b1 ;end else begincase (state_c)IDLE :  if(key_start)cs_n <= 1'b0 ;else cs_n <= 1'b1 ;WREN :  if(f_b_reg)cs_n <= 1'b1 ;else cs_n <= cs_n ;WEL  :  if(cnt_20ns == 6) cs_n <= 1'b0 ;else cs_n <= cs_n ;SE   :  if(f_b_reg)cs_n <= 1'b1 ;else cs_n <= cs_n ;default:    cs_n <= 1'b1 ;endcaseendend// reg             sck always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)sck <= 1'b0 ;else case (state_c)IDLE :  sck <= 1'b0 ;WREN :  if(cnt_20ns)sck <= ~sck ;else sck <= sck  ;WEL  :  sck <= 1'b0 ;SE   :  if(cnt_20ns)sck <= ~sck ;else sck <= sck  ;default:    sck <= 1'b0 ;endcaseendendmodule
module top(input       wire            sys_clk     ,input       wire            sys_rst_n   ,input       wire            key_in      ,output      wire            cs_n        ,output      wire            sck         ,output      wire            mosi        
);// 例化间连线wire            key_flag ;key_filter key_filter_inst(.sys_clk                    ( sys_clk   ) ,.sys_rst_n                  ( sys_rst_n ) ,.key_in                     ( key_in    ) ,.key_out                    ( key_flag  )     
);spi spi_inst(.sys_clk                    ( sys_clk   ) ,.sys_rst_n                  ( sys_rst_n ) ,.key_start                  ( key_flag  ) ,.mosi                       ( mosi      ) ,.miso                       (           ) ,.cs_n                       ( cs_n      ) ,.sck                        ( sck       )
);endmodule
module key_filter
#(parameter MAX_CNT_20MS = 20'd100_0000 
)(input           wire    sys_clk     ,input           wire    sys_rst_n   ,input           wire    key_in      ,output          wire    key_out     
);reg     key_r_0 ;reg     key_r_1 ;wire    nege    ;wire    pose    ;reg     [19:00]     cnt_20ms     ;wire                add_cnt_20ms ;wire                end_cnt_20ms ;reg                 add_cnt_flag ;// key_r_0 key_r_1 always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginkey_r_0 <= 1'b1 ;end else beginkey_r_0 <= key_in ;endendalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginkey_r_1 <= 1'b1 ;end else beginkey_r_1 <= key_r_0 ;endend// nege poseassign nege = ~key_r_0 &&  key_r_1 ;assign pose =  key_r_0 && ~key_r_1 ;// add_cnt_flagalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginadd_cnt_flag <= 1'b0 ;end else beginif(nege) beginadd_cnt_flag <= 1'b1 ;end else beginif( pose || end_cnt_20ms ) beginadd_cnt_flag <= 1'b0 ;end else beginadd_cnt_flag <= add_cnt_flag ;endend endend// cnt_20ms add_cnt_20ms end_cnt_20msalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) begincnt_20ms <= 20'd0 ;end else beginif(add_cnt_20ms) beginif(end_cnt_20ms) begincnt_20ms <= 20'd0 ;end else begincnt_20ms <= cnt_20ms + 20'd1 ;endend else begincnt_20ms <= 20'd0 ;endendendassign add_cnt_20ms = add_cnt_flag ;assign end_cnt_20ms = add_cnt_20ms && cnt_20ms == ( MAX_CNT_20MS - 1'b1 ) ;// key_out// always @(posedge sys_clk or negedge sys_rst_n) begin// // always @(*) begin // 这样的话 会综合成 数据选择器//     if(~sys_rst_n) begin//         key_out <= 1'b0 ;//     end else begin//         if(end_cnt_20ms) begin//             key_out <= 1'b1 ;//         end else begin//             key_out <= 1'b0 ;//         end//     end// endassign key_out = end_cnt_20ms ;
endmodule

 仿真图:忘记截屏了。

需要用到仿真模型。

上版验证通过。

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

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

相关文章

部署zabbix代理服务器、部署zabbix高可用集群

目录 部署zabbix代理服务器 1、环境设置 2、设置 zabbix 的下载源&#xff0c;安装 zabbix-proxy 3、配置Mariadb yum源&#xff0c;并下载marisdb数据库 4.、启动数据库&#xff0c;并初始化数据库 5、登录数据库&#xff0c;创建数据库并指定字符集&#xff0c;并进行…

【配置vscode编写c或c++程序,并在外部控制台输出程序和解决中文乱码问题!!!】

配置vscode编写c或c程序&#xff0c;并在外部控制台输出程序和解决中文乱码问题&#xff01;&#xff01;&#xff01; 1、点击扩展&#xff0c;添加C语言所需的插件&#xff08;点击安装&#xff0c;安装完成后点击设置标志安装另一个版本&#xff0c;注意一定要安装1.8.4版本…

计算机视觉(Computer Vision, CV)是什么?

什么是计算机视觉 近年来&#xff0c;计算机视觉 (Computer Vision&#xff0c;简称CV) 不断普及&#xff0c;已成为人工智能 (AI) 增长最快的领域之一。计算机视觉致力于使计算机能够识别和理解图像和视频中的物体和人。 计算机视觉应用程序使用来自传感设备、人工智能、机器…

hive 知识总结

​编辑 社区公告教程下载分享问答JD 登 录 注册 01 hive 介绍与安装 1 hive介绍与原理分析 Hive是一个基于Hadoop的开源数据仓库工具&#xff0c;用于存储和处理海量结构化数据。它是Facebook 2008年8月开源的一个数据仓库框架&#xff0c;提供了类似于SQL语法的HQL&#xf…

2023年中国渔业研究报告

第一章 行业概况 1.1 定义 渔业&#xff0c;作为全球经济的重要支柱之一&#xff0c;其核心活动包括捕捞、水产养殖、产品加工与销售等。其不仅是食物安全的重要保障&#xff0c;还是许多沿海和内陆地区经济发展的重要动力。 首先&#xff0c;捕捞活动是渔业的基础。通过海洋…

Web后端开发登录校验及JWT令牌,过滤器,拦截器详解

如果用户名正确则成功进入 登录功能 代码 Controller Service Mapper 结果 若登录成功结果如下: 如果登录失败,结果如下 登录校验 为什么需要登录校验 有时再未登录情况下, 我们也可以直接访问部门管理, 员工管理等功能 因此我们需要一个登录校验操作, 只有确认用户登录…

Pymol做B因子图

分子动力学模拟结束后&#xff0c;获得蛋白的平均结构&#xff0c; 比如获得的平均结构为WT-average.pdb 然后将平均结构导入到Pymol 中&#xff0c;可以得到B因子图。 gmx rmsf -f md_0_100_noPBC.xtc -s md_0_100.tpr -o rmsf-per-residue.xvg -ox average.pdb -oq bfactors…

有哪些免费的PPT模板网站,推荐这6个PPT模板免费下载网站!

混迹职场的打工人&#xff0c;或是还在校园的学生党&#xff0c;在日常的工作汇报或课程作业中&#xff0c;必然少不了PPT的影子&#xff0c;而每当提到做PPT&#xff0c;许多人首先会想到&#xff1a;有哪些免费的PPT模板下载网站&#xff1f; 本着辛苦自己&#xff0c;造福所…

编程助手成为编程高手,帮您正则调试

官方下载地址&#xff1a;安果移动 视频演示地址&#xff1a;编程助手-正则调试与面试题&#xff0c;升职加薪不是梦_哔哩哔哩_bilibili 编程助手成为编程高手&#xff0c;帮您正则调试 软件介绍版本号 1.0.2更新日期 2023-10-11 找工作不敢谈薪资&#xff1f;总觉得公司欠我…

线性回归模型进行特征重要性分析

目的 线性回归是很常用的模型&#xff1b;在局部可解释性上也经常用到。 数据归一化 归一化通常是为了确保不同特征之间的数值范围差异不会对线性模型的训练产生过大的影响。在某些情况下&#xff0c;特征归一化可以提高模型的性能&#xff0c;但并不是所有情况下都需要进行归一…

Magica Cloth 使用方法笔记

Magica Cloth 使用方法笔记 效果展示&#xff1a; 参考资料&#xff1a; 1、官方使用文档链接&#xff1a; インストールガイド – Magica Soft 2、鱼儿效果案例&#xff1a; https://www.patreon.com/posts/69459293 3、插件工具链接&#xff1a;版本() 目录&#xff1a…

理解线程池源码 【C++】面试高频考点

理解线程池 C 文章目录 理解线程池 C程序源码知识点emplace_back 和 push_back有什么区别&#xff1f;互斥锁 mutexcondition_variablestd::move()函数bind()函数join 函数 线程池的原理就是管理一个任务队列和一个工作线程队列。 工作线程不断的从任务队列取任务&#xff0c;然…

区块链在游戏行业的应用

区块链技术在游戏行业有许多潜在的应用&#xff0c;它可以改变游戏开发、发行和玩家交互的方式。以下是区块链技术在游戏行业的一些主要应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.游戏资产…

云梦富盈:智慧投资引领未来市场

随着2023年的到来&#xff0c;全球股市呈现出令人关注的趋势和挑战。投资者纷纷寻求智慧投资&#xff0c;以更好地把握市场动向。云梦富盈&#xff0c;作为一支备受瞩目的投资团队&#xff0c;正在洞悉并解析2023年全球股市的趋势&#xff0c;为投资者提供智慧投资的护航。 20…

[Error]在Swift项目Build Settings的Preprocessor Macros中定义的宏无效的问题

问题 如图&#xff0c;在Build Settings -> Preprocessor Macros中添加了ISADEMO1。但在代码中判断无效&#xff0c;还是会输出“isn’t ADemo” #if ISADEMOprint("is ADemo") #elseprint("isnt ADemo") #endif解决 如图&#xff0c;要让Preproces…

学习编程-先改变心态

编程失败的天才 林一和我很久以前就认识了——我从五年级就认识他了。他是班上最聪明的孩子。如果每个人在家庭作业或考试准备方面需要帮助&#xff0c;他们都会去那里。 有趣的是&#xff0c;林一不是那种连续学习几个小时的孩子。 他的聪明才智似乎与生俱来&#xff0c;几乎毫…

机器学习(21)---召回率(recall)、精度(precision)和准确率(accuracy)

文章目录 1. 分布不平衡的数据集2. TP、TN 、FP 、FN3. 混淆矩阵4. 各自的计算公式5. 例题应用 1. 分布不平衡的数据集 1. 精度&#xff08;precision&#xff09;和召回率&#xff08;recall&#xff09;是衡量机器学习模型性能的重要指标&#xff0c;特别是数据集分布不平衡的…

Maven系列第3篇:详解maven解决依赖问题

maven系列目标&#xff1a;从入门开始开始掌握一个高级开发所需要的maven技能。 这是maven系列第3篇。 我们先来回顾一下什么是maven&#xff1f; maven是apache软件基金会组织维护的一款自动化构件工具&#xff0c;专注服务于java平台的项目构件和依赖管理。 本文主要内容…

使用任务定时执行软件的定时关机功能,控制电脑可用时间段

目录 定时关机功能可以设置有效的时间段 控制电脑可用时间段的意义 定时执行软件介绍 - 定时执行专家 定时关机设置方法 不可用时间段设置方法 注意事项 总结 在现代社会&#xff0c;电脑已经成为人们生活和工作中不可或缺的一部分。但是&#xff0c;长时间使用电脑也会对…

Torch生成类激活图CAM

import torch from torch.nn import functional as F from torchvision import models, transforms from PIL import Image import os os.environ[KMP_DUPLICATE_LIB_OK]TRUE# 加载经过训练的 ResNet 模型 model models.resnet50(pretrainedTrue) model.eval()# 载入图像并进行…