当前位置: 首页 > news >正文

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

 仿真图:忘记截屏了。

需要用到仿真模型。

上版验证通过。

相关文章:

FPGA project : flash_secter_erase

flash的指定扇区擦除实验。 先发写指令&#xff0c;再进入写锁存周期等待500ns&#xff0c;进入写扇区擦除指令&#xff0c;然后写扇区地址&#xff0c;页地址&#xff0c;字节地址。即可完成扇区擦除。 模块框图&#xff1a; 时序图&#xff1a; 代码&#xff1a; module…...

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Radio

单选框&#xff0c;提供相应的用户交互选择项。该组件从API Version 8开始支持。无子组件。 一、接口 Radio(options: {value: string, group: string}) 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 参数: 二、属性 除支持通用属性外&#xff0c;还支持以…...

python opencv 深度学习 指纹识别算法实现 计算机竞赛

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python opencv 深度学习 指纹识别算法实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;4分创新点&#xff1a;4分 该项目较为新颖…...

一图看懂CodeArts Inspector 三大特性,带你玩转漏洞管理服务

华为云漏洞管理服务CodeArts Inspector是面向软件研发和服务运维提供的一站式漏洞管理能力&#xff0c;通过持续评估系统和应用等资产&#xff0c;内置风险量化管理和在线风险分析处置能力&#xff0c;帮助组织快速感应和响应漏洞&#xff0c;并及时有效地完成漏洞修复工作&…...

【Mysql】Mysql的启动选项和系统变量(二)

概述 在Mysql的设置项中一般都有各自的默认值&#xff0c;比方说mysql 5.7服务器端允许同时连入的客户端的默认数量是 151 &#xff0c;表的默认存储引擎是 InnoDB &#xff0c;我们可以在程序启动的时候去修改这些默认值&#xff0c;对于这种在程序启动时指定的设置项也称之为…...

FPGA project : flash_read

实验目标&#xff1a; flash的普通读指令&#xff0c;在指定地址开始读。可以更改地址与读的数据个数。 先发送读指令扇区地址页地址字节地址。 然后读数据。再把读到的串行数据转化为8bit的数据&#xff0c;存入fifo。 然后读出FIFO中数据&#xff0c;通过uart_tx模块发送…...

nnunetv2训练报错 ValueError: mmap length is greater than file size

目录 报错解决办法 报错 笔者在使用 nnunetv2 进行 KiTS19肾脏肿瘤分割实验的训练步骤中 使用 2d 和3d_lowres 训练都没有问题 nnUNetv2_train 40 2d 0nnUNetv2_train 40 3d_lowres 0但是使用 3d_cascade_fullres 和 3d_fullres 训练 nnUNetv2_train 40 3d_cascade_fullres …...

React知识点系列(2)-每天10个小知识

目录 1. 如何优化 React 应用的性能&#xff1f;你用过哪些性能分析工具&#xff1f;2. 在 React 中&#xff0c;什么是 Context API&#xff1f;你在什么场景下会使用它&#xff1f;3. 你能解释一下什么是 React Fiber 吗&#xff1f;4. 在项目中&#xff0c;你是否使用过 Rea…...

AutoGPT:让 AI 帮你完成任务事情 | 开源日报 No.54

Significant-Gravitas/AutoGPT Stars: 150.4k License: MIT AutoGPT 是开源 AI 代理生态系统的核心工具包。它采用模块化和可扩展的框架&#xff0c;使您能够专注于以下方面&#xff1a; 构建 - 为惊人之作打下基础。测试 - 将您的代理调整到完美状态。查看 - 观察进展成果呈…...

USB 转串口芯片 CH340

目录 1、概述 2、特点 3、封装 4、引脚 6、参数 6.1 绝对最大值&#xff08;临界或者超过绝对最大值将可能导致芯片工作不正常甚至损坏&#xff09; 6.2 电气参数&#xff08;测试条件&#xff1a;TA25℃&#xff0c;VCC5V&#xff0c;不包括连接 USB 总线的引脚&…...

Day 05 python学习笔记

循环 应用&#xff1a;循环轮播图 最基础、最核心 循环&#xff1a;周而复始&#xff0c;谓之循环 (为了代码尽量不要重复) while循环 while的格式 索引定义 while 表达式&#xff08;只要结果为布尔值即可&#xff09;&#xff1a; 循环体 通过条件的不断变化&#xff0c;从…...

Python如何17行代码画一个爱心

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...

生产环境中常用Linux命令

太简单的我就不讲解啦,浪费时间,直接将生产中常用的 文章目录 1.总纲2.整机 top3.CPU vmstat3. 内存 free4. 硬盘: df5. 磁盘IO iostat6. 网络IO ifstat7: 内存过高的情景排查 1.总纲 整机:topcpu:vmstat内存:free硬盘:df磁盘io: iostat网络io:ifstat 2.整机 top 首先们要查…...

【使用 TensorFlow 2】03/3 创建自定义损失函数

一、说明 TensorFlow 2发布已经接近5年时间&#xff0c;不仅继承了Keras快速上手和易于使用的特性&#xff0c;同时还扩展了原有Keras所不支持的分布式训练的特性。3大设计原则&#xff1a;简化概念&#xff0c;海纳百川&#xff0c;构建生态.这是本系列的第三部分&#xff0c;…...

Vue3中使用v-model高级用法参数绑定传值

Vue3中使用v-model高级用法参数绑定传值 单个输入框传值多个输入框传值,一个组件接受多个v-model值 单个输入框传值 App.vue <template><p>{{firstName}}</p><hello-world v-model"firstName"></hello-world> </template><…...

你的工作中,chatGPT可以帮你做什么?

如何在工作中使用 ChatGPT 的 10 种实用方法 现在您已经知道如何开始使用 ChatGPT 并了解其基本功能&#xff08;提示 -> 响应&#xff09;&#xff0c;让我们探讨如何使用它来大幅提高工作效率。 1. 总结报告、会议记录等 ChatGPT可以快速分析大文本并识别关键点。例如&a…...

k8s简单部署nginx

文章目录 1. 前言2. 部署nginx2.1. **创建一个nginx的Deployment**2.2. **创建一个nginx的service** 3. 总结 1. 前言 前文提要&#xff1a; kubeadm简单搭建k8s集群第三方面板部署k8s 上篇文章我们简单部署了k8s的集群环境&#xff0c;相比一定迫不及待的想部署一个实际应用了…...

小黑子—MyBatis:第四章

MyBatis入门4.0 十 小黑子进行MyBatis参数处理10.1 单个简单类型参数10.1.1 单个参数Long类型10.1.2 单个参数Date类型 10.2 Map参数10.3 实体类参数&#xff08;POJO参数&#xff09;10.4 多参数10.5 Param注解&#xff08;命名参数&#xff09;10.6 Param注解源码分析 十一 小…...

Docker快速上手:使用Docker部署Drupal并实现公网访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…...

React知识点系列(1)-每天10个小知识

目录 1.什么是 React&#xff0c;以及它在前端开发中的优势是什么&#xff1f;2.你是如何组织和管理 React 组件的&#xff1f;3.你能解释一下 React 的生命周期方法吗&#xff1f;你通常在哪个生命周期方法中发起网络请求&#xff1f;4.什么是 React Hooks&#xff1f;你常用哪…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...