FPGA project : flash_write

本实验重点学习了:

flash的页编程指令pp。

在写之前要先进行擦除(全擦除和页擦除);

本实验:先传写指令,然后进入写锁存周期,然后传页编程指令,+3个地址;

然后传数据,奇数传55,偶数传aa。

在之前扇区擦除的代码上改改就行了。加一个功能就是传入数据大于256个时候,mosi一直拉高。

模块框图:

状态机:

代码:

只放spi模块的。因为其他代码和扇区擦除指令是一样的。

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_P    = 8'h02    , // 页写指令MAX_NUM   = 32'd270  ; // 要发送指令+地址+数据的字节数。 2 + 3 + 100parameter   ADR_SE    = 8'h00    , // 扇区地址 adress secterADR_PA    = 8'h04    , // 页地址   adress pageADR_BY    = 8'h00    ; // 字节地址 adress byteparameter   DATA_ODD  = 8'h55    , // odd  奇数DATA_EVE  = 8'haa    ; // even 偶数parameter   IDLE      = 5'b00001 ,WREN      = 5'b00010 ,WEL       = 5'b00100 ,INST      = 5'b01000 , // instruct 传送pp指令和addrDATA      = 5'b10000 ; // instruct 传送要写入的数据。// wire signal deginewire                IDLEtoWREN; wire                WRENtoWEL ;  wire                WRENtoINST;   wire                INSTtoDATA;   wire                DATAtoIDLE;   // reg signal definereg     [19:0]      data_num  ; // 记录传递的数据,如果超过256个,那么mosi将会一直拉高(传1).reg     [4:0]       state_c   ;reg     [4:0]       state_n   ;reg     [3:0]       cnt_20ns  ;reg     [3:0]       cnt_bit   ;reg     [31: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(WRENtoINST)state_n <= INST ;else state_n <= WEL  ;INST   :if(INSTtoDATA)state_n <= DATA ;else state_n <= INST ;DATA   :if(DATAtoIDLE)state_n <= IDLE ;else state_n <= DATA ;default:    state_n <= IDLE ;endcaseend// 状态转移描述assign  IDLEtoWREN  = ( state_c == IDLE) && ( key_start     ) ;assign  WRENtoWEL   = ( state_c == WREN) && ( f_b_reg       ) ;assign  WRENtoINST  = ( state_c == WEL ) && ( cnt_20ns == 6 ) ;assign  INSTtoDATA  = ( state_c == INST) && ( f_b_reg       ) ;assign  DATAtoIDLE  = ( state_c == DATA) && ( f_b_reg && cnt_byte != 5) ; // 至少传递一个数据。否则会卡死在这个状态。// 相关信号描述// 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 ;INST :  if(cnt_20ns) // 由于下一个状态是发送数据,sck和cnt_20_ns的变换规律与INST相同。所以不需要f_b_reg。cnt_20ns <= 4'd0 ;else cnt_20ns <= cnt_20ns + 1'b1 ;DATA :  if(cnt_20ns || (f_b_reg && cnt_byte != 5))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 ;INST :  if(!cnt_20ns && sck && cnt_bit == 7)cnt_bit <= 4'd0 ;else if(!cnt_20ns && sck)cnt_bit <= cnt_bit + 1'b1 ;DATA :  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      [31:0]       cnt_bytealways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_byte <= 32'd0 ;else if(cnt_bit == 7 && !cnt_20ns && sck && cnt_byte == MAX_NUM - 1) // 计数到传送字节的最大值。cnt_byte <= 32'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 ;INST :  if(cnt_bit == 7 && sck && !cnt_20ns && cnt_byte == 4)flag_bit <= 1'b1 ;else flag_bit <= flag_bit ;DATA :  if(cnt_bit == 0 && cnt_byte == 5)flag_bit <= 1'b0 ;else if(cnt_bit == 7 && sck && !cnt_20ns && cnt_byte == MAX_NUM - 1)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// reg  [19:0]   data_numalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)data_num <= 20'd0 ;else if(state_c == DATA && cnt_bit == 7 && !cnt_20ns && sck)data_num <= data_num + 1'b1 ;else if(state_c != DATA)data_num <= 20'd0 ;else data_num <= data_num ;end// 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 ;INST :  case (cnt_byte)1:  beginif(!cnt_bit)mosi <= COMD_P[7] ;else if(cnt_20ns && sck)mosi <= COMD_P[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 ;  end5:  beginif(!cnt_bit) // 由于当cnt_byte == 5 时,有一段state_c没有立即跳转到data状态。mosi <= DATA_ODD[7] ;else if(cnt_20ns && sck)mosi <= DATA_ODD[7 - cnt_bit] ;else mosi <= mosi ;  enddefault:        mosi <= 1'b0 ;endcaseDATA :  if(data_num <= 255) beginif(cnt_byte[0]) begin // 二进制最低为奇偶标志位,1表示奇位,发送数据5。if(!cnt_bit)mosi <= DATA_ODD[7] ;else if(cnt_20ns && sck)mosi <= DATA_ODD[7 - cnt_bit] ;else mosi <= mosi ;  end else begin // cnt_byte[0] == 0 偶数。发送数据aif(!cnt_bit)mosi <= DATA_EVE[7] ;else if(cnt_20ns && sck)mosi <= DATA_EVE[7 - cnt_bit] ;else mosi <= mosi ;  endend else beginmosi <= 1'b1 ; // 大于256个数据之后,mosi就一直传递1.enddefault:    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 ;INST :  cs_n <= 1'b0 ;DATA :  if(f_b_reg && cnt_byte != 5 )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 ;INST :  if(cnt_20ns)sck <= ~sck ;else sck <= sck  ;DATA :  if(cnt_20ns)sck <= ~sck ;else sck <= sck  ;default:    sck <= 1'b0 ;endcaseendendmodule

仿真波形: 

 

 

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

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

相关文章

攻防千层饼

近年来&#xff0c;网络安全领域正在经历一场不断升级的攻防对抗&#xff0c;这场攻防已经不再局限于传统的攻击与防御模式&#xff0c;攻击者和防守者都已经越发熟练&#xff0c;对于传统攻防手法了如指掌。 在这个背景下&#xff0c;攻击者必须不断寻求创新的途径&#xff0…

Hadoop问题:start-all.sh显示未找到命令

在sbin文件夹下是start-all.sh可以运行的&#xff0c;但是到了别的文件夹下就不行了&#xff0c;于是想到了是文件路径问题&#xff0c;因为hadoop环境是和java环境一起配置的导致sbin写成了bin 解决办法&#xff1a; 打开.bashrc配置hadoop的环境变量 sudo vim ~/.bashrc …

Photoshop Lightroom 2024 (Lr2024)最新安装特别版

Adobe Photoshop Lightroom 2024是一款由Adobe Systems公司发布的软件&#xff0c;其英文直译为“明室”&#xff0c;也常被称为数码暗房。它主要用于图片管理和后期润色&#xff0c;包括图片导入、整理、编辑、导出等全过程&#xff0c;不仅可以对图片进行编辑&#xff0c;还可…

Qt不能安装自己想要的版本,如Qt 5.15.2

使用在线安装工具安装Qt5.15.2时&#xff0c;发现没有Qt 5的相关版本&#xff0c;只有Qt 6的版本&#xff0c;这时选择右边的Archive&#xff0c;再点击筛选&#xff0c;这时就会出现之前的Qt版本。

web 性能优化详解(Lighthouse工具、优化方式、强缓存和协商缓存、代码优化、算法优化)

1.性能优化包含的方面 优化性能概念宽泛&#xff0c;可以从信号、系统、计算机原理、操作系统、网络通信、DNS解析、负载均衡、页面渲染。只要结合一个实际例子讲述清楚即可。 2.什么是性能&#xff1f; Web 性能是客观的衡量标准&#xff0c;是用户对加载时间和运行时的直观…

创建React Native的第一个hello world工程

创建React Native的第一个hello world工程 需要安装好node、npm环境 如果之前没有安装过react-native-cli脚手架的&#xff0c;可以按照下述步骤直接安装。如果已经安装过的&#xff0c;但是在使用这个脚手架初始化工程的时候遇到下述报错的话 cli.init(root, projectname);…

机器学习 Q-Learning

对马尔可夫奖励的理解 看的这个教程 公式&#xff1a;V(s) R(s) γ * V(s’) V(s) 代表当前状态 s 的价值。 R(s) 代表从状态 s 到下一个状态 s’ 执行某个动作后所获得的即时奖励。 γ 是折扣因子&#xff0c;它表示未来奖励的重要性&#xff0c;通常取值在 0 到 1 之间。…

【音视频|ALSA】SS528开发板编译Linux内核ALSA驱动、移植alsa-lib、采集与播放usb耳机声音

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

SVN报错fail to run the WC Db work queue associated with,清理失败,乱码的解决方式

替换掉 wc.db 文件即可 SVN报错fail to run the WC Db work queue associated with&#xff0c;清理失败&#xff0c;乱码的解决方式_svn failed to run the wc db-CSDN博客

华为云云耀云服务器L实例评测|企业项目最佳实践之评测用例(五)

华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践系列&#xff1a; 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之云服务器介绍(一) 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之华为云介绍(二) 华为云云耀云服务器L实例评测&#xff5…

数据在内存中的存储(2)

文章目录 3. 浮点型在内存中的存储3.1 一个例子3.2 浮点数存储规则 3. 浮点型在内存中的存储 常见的浮点数&#xff1a; 3.14159 1E10 ------ 1.0 * 10^10 浮点数家族包括&#xff1a; float、double、long double 类型 浮点数表示的范围&#xff1a;float.h中定义 3.1 一个例…

基于yolov2深度学习网络的猫脸检测识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 load yolov2.mat% 加载训练好的目标检测器 img_size [224,224]; imgPath test/; % 图…

【Rust基础①】基本类型、所有权与借用、复合类型

文章目录 1 基本类型1.1 数值类型1.1.1 Rust 中的内置的整数类型&#xff1a;1.1.2 浮点类型1.1.3 数学运算1.1.4 位运算1.1.5 序列(Range) 1.2 字符、布尔、单元类型1.3 语句和表达式1.4 函数 2 所有权与借用2.1 栈(Stack)与堆(Heap)2.2 所有权原则2.2.1 转移所有权2.2.2 克隆…

UI自动化的适用场景,怎么做?

经常有人会问&#xff0c;什么样的项目才适合进行UI自动化测试呢&#xff1f;UI自动化测试相当于模拟手工测试&#xff0c;通过程序去操作页面上的控件。而在实际测试过程中&#xff0c;经常会遇到无法找到控件&#xff0c;或者因控件定义变更而带来的维护成本等问题。 哪些场…

Java武侠文字游戏

import java.util.Random;public class Role {//姓名private String name;//血量private int blood;//性别private char gender;//长相(随机)private String face;String[] boyfaces {"风流俊雅", "气宇轩昂", "相貌英俊", "五官端正"…

巴以冲突中暴露的摄像头正对安全构成威胁

巴以冲突爆发后&#xff0c;许多配置不当的安全摄像头正暴露给黑客活动分子&#xff0c;使其周遭人员面临巨大安全风险。 Cyber​​news 研究人员发现&#xff0c;在以色列至少有165 个暴露的联网 RTSP 摄像头&#xff0c;在巴勒斯坦有 29 个暴露的 RTSP 摄像头。在巴勒斯坦&am…

华为eNSP配置专题-VLAN和DHCP的配置

文章目录 华为eNSP配置专题-VLAN和DHCP的配置1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、基本终端构成和连接 3、VLAN的配置3.1、两台PC先配置静态IP3.2、交换机上配置VLAN 4、接口方式的DHCP的配置4.1、在交换机上开启DHCP4.2、在PC上开启DHCP 5、全局方式的…

【MySQL】深入了解索引的底层逻辑结构

文章目录 主键排序一. InnoDB的索引结构1. 单个page2. 多个page 二. 为什么选择B树三. 聚簇索引和非聚簇索引结束语 主键排序 我们创建一个user表&#xff0c;并乱序插入数据 mysql> create table if not exists user(-> id int primary key,-> age int not null,-&…

嵌入式SoC降低能够有效降低电力线表应用的成本

用于基于FSK的电力线通信&#xff08;PLC&#xff09;。MB87S2090和MB87S2090-F与ADD Semiconductor&#xff0c;电力线通信嵌入式SoC的开发商以及用于自动仪表管理的解决方案联合开发。两种器件都与ADD Semiconductor的设计引脚兼容。 MB87S2090是一种电力线通信嵌入式SoC&am…

centos7部署Nginx和RabbitMQ

文章目录 Nginx安装部署【简单】简介安装 RabbitMQ安装部署【简单】简介安装 Nginx安装部署【简单】 简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx可以托管用户编写的WEB应用程序成为可访问的网页服务&am…