RDID

rdid即读电子签名,下图为rdid的时序图,代码通过线性序列机的方式实现。

因为m25p16手册中要求上升沿采样,可以采用spi的00和11模式,本文采用00模式,scl初始值为0。

(spi的四种模式可见https://blog.csdn.net/weixin_42263208/article/details/108803254),

RDID时序代码

module flash_rdid (input     wire        clk,input       wire        rst_n,output   reg      flash_scl,output    reg     flash_d,output  reg     flash_cs_n,input    wire     flash_q,output   reg      q);localparam    RDID        =  8'h9f;localparam   T_half  =  5;always @ (posedge clk) q <= flash_q;reg  [8:0]       cnt;always @ (posedge clk) beginif (rst_n == 0)cnt <= 0;else if(cnt == 321)cnt <= cnt;elsecnt <= cnt + 1'b1;end always @ (*) beginif (rst_n == 0) begin flash_scl = 0; flash_d = 0;flash_cs_n = 1;endelsecase (cnt)0                           :       begin flash_cs_n = 1;flash_scl = 0;flash_d = 0;end1                          :       begin flash_cs_n = 0;flash_d = RDID[7];end1 + T_half * 1         :       begin flash_scl = 1;end1 + T_half * 2         :       begin flash_scl = 0;flash_d = RDID[6];end 1 + T_half * 3         :       begin flash_scl = 1;end1 + T_half * 4         :       begin flash_scl = 0;flash_d = RDID[5];end 1 + T_half * 5         :       begin flash_scl = 1;end1 + T_half * 6         :       begin flash_scl = 0;flash_d = RDID[4];end 1 + T_half * 7         :       begin flash_scl = 1;end1 + T_half * 8         :       begin flash_scl = 0;flash_d = RDID[3];end 1 + T_half * 9         :       begin flash_scl = 1;end1 + T_half * 10        :       begin flash_scl = 0;flash_d = RDID[2];end 1 + T_half * 11        :       begin flash_scl = 1;end1 + T_half * 12        :       begin flash_scl = 0;flash_d = RDID[1];end 1 + T_half * 13        :       begin flash_scl = 1;end1 + T_half * 14        :       begin flash_scl = 0;flash_d = RDID[0];end 1 + T_half * 15        :       begin flash_scl = 1;end1 + T_half * 16        :       begin flash_scl = 0;flash_d = 0;end 1 + T_half * 17      :       begin flash_scl = 1;end1 + T_half * 18        :       begin flash_scl = 0;end1 + T_half * 19        :       begin flash_scl = 1;end1 + T_half * 20        :       begin flash_scl = 0;end1 + T_half * 21        :       begin flash_scl = 1;end1 + T_half * 22        :       begin flash_scl = 0;end1 + T_half * 23        :       begin flash_scl = 1;end1 + T_half * 24        :       begin flash_scl = 0;end1 + T_half * 25        :       begin flash_scl = 1;end1 + T_half * 26        :       begin flash_scl = 0;end1 + T_half * 27        :       begin flash_scl = 1;end1 + T_half * 28        :       begin flash_scl = 0;end1 + T_half * 29        :       begin flash_scl = 1;end1 + T_half * 30        :       begin flash_scl = 0;end1 + T_half * 31        :       begin flash_scl = 1;end1 + T_half * 32        :       begin flash_scl = 0;end1 + T_half * 33        :       begin flash_scl = 1;end1 + T_half * 34        :       begin flash_scl = 0;end1 + T_half * 35        :       begin flash_scl = 1;end1 + T_half * 36        :       begin flash_scl = 0;end1 + T_half * 37        :       begin flash_scl = 1;end1 + T_half * 38        :       begin flash_scl = 0;end1 + T_half * 39        :       begin flash_scl = 1;end1 + T_half * 40        :       begin flash_scl = 0;end1 + T_half * 41        :       begin flash_scl = 1;end1 + T_half * 42        :       begin flash_scl = 0;end1 + T_half * 43        :       begin flash_scl = 1;end1 + T_half * 44        :       begin flash_scl = 0;end1 + T_half * 45        :       begin flash_scl = 1;end1 + T_half * 46        :       begin flash_scl = 0;end1 + T_half * 47        :       begin flash_scl = 1;end1 + T_half * 48        :       begin flash_scl = 0;end1 + T_half * 49        :       begin flash_scl = 1;end1 + T_half * 50        :       begin flash_scl = 0;end1 + T_half * 51        :       begin flash_scl = 1;end1 + T_half * 52        :       begin flash_scl = 0;end1 + T_half * 53        :       begin flash_scl = 1;end1 + T_half * 54        :       begin flash_scl = 0;end1 + T_half * 55        :       begin flash_scl = 1;end1 + T_half * 56        :       begin flash_scl = 0;end1 + T_half * 57        :       begin flash_scl = 1;end1 + T_half * 58        :       begin flash_scl = 0;end1 + T_half * 59        :       begin flash_scl = 1;end1 + T_half * 60        :       begin flash_scl = 0;end1 + T_half * 61        :       begin flash_scl = 1;end1 + T_half * 62        :       begin flash_scl = 0;end1 + T_half * 63        :       begin flash_scl = 1;end1 + T_half * 64        :       begin flash_scl = 0;flash_cs_n = 1;enddefault                 :       ;endcaseend
endmodule 

仿真代码

`timescale 1ns/1ps
module flash_rdid_tb;reg        clk;reg     rst_n;wire      flash_cs_n;wire     flash_d;wire        flash_scl;wire      flash_q;wire        q;flash_rdid flash_rdid_inst(.clk               (clk),.rst_n            (rst_n),.flash_scl      (flash_scl),.flash_d            (flash_d),.flash_cs_n   (flash_cs_n),.flash_q           (flash_q),.q                    (q));m25p16 m25p16_inst(.c                  (flash_scl),.data_in            (flash_d),.s                    (flash_cs_n),.w                 (1'b1),.hold               (1'b1),.data_out       (flash_q)
);initial clk = 1;
always #10 clk = ~clk;initial beginrst_n = 0;#201rst_n = 1;repeat (500)@ (posedge clk);#200$stop;
end
endmodule 

仿真图

完整工程:https://download.csdn.net/download/weixin_42263208/12890066

M25P16仿真模型文件:https://download.csdn.net/download/weixin_42263208/12889963

FLASH(M25P16)-RDID时序代码及仿真波形(内含M25P16仿真模型文件)相关推荐

  1. FLASH(M25P16)-页编程(PP)指令时序代码及仿真波形(内含M25P16仿真模型文件)

    PP指令 pp是页编程指令:需要先打开写使能(0000_0110),发送PP指令号(0000_0010),后面给24位地址,然后接数据,时序图发送如下图所示. PP指令时序代码 //页编程(PP)指令 ...

  2. modelsim中仿真波形设置的保存

    为了方便以后察看仿真结果,可以将仿真波形保存在.Wlf文件中: 一.保存过程: 1.完成仿真波形 2.切换到sim视窗 3.点击保存图标,可以直接保存为.wlf文件 二.打开过程 1.打开models ...

  3. HDLBits 系列(42)根据仿真波形来设计电路之时序逻辑

    文章目录 前言 电路设计1 原题复现 题目解析 我的设计 电路设计2 原题复现 题目解析 我的设计 电路设计3 原题复现 题目解析 我的设计 电路设计4 原题复现 题目解析 我的设计 前言 上篇博文讨 ...

  4. 四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)

    移位寄存器总结 一.前言 二.简单循环左移/右移/双向移位寄存器 2.1 简单循环左移/右移/双向移位寄存器 2.2 verilog代码 2.3 Testbench 2.4 仿真结果 三.逻辑移位与算 ...

  5. 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)

    数字分频器设计 一.前言 二.偶数分频 2.1 触发器级联法 2.2 计数器法 2.3 verilog代码 2.4 Testbench 2.5 仿真结果 三.奇数分频 3.1 占空比非50%奇数分频 ...

  6. 序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)

    序列检测器 一.前言 二.状态机法和寄存器法 2.1状态机法 2.11 使用状态机检测"1001" 2.12 verilog代码 2.13 testbench 2.14仿真结果 2 ...

  7. 线性反馈移位寄存器LFSR(斐波那契LFSR(多到一型)和伽罗瓦LFSR(一到多型)|verilog代码|Testbench|仿真结果)

    线性反馈移位寄存器LFSR 一.前言 二.LFSR简介 三.斐波那契LFSR和伽罗瓦LFSR 3.1 斐波那契LFSR 3.1.1 斐波那契LFSR 3.1.2 verilog代码 3.1.3 Tes ...

  8. 七种计数器总结(格雷码计数器、环形计数器、约翰逊计数器、FLSR、简易时分秒数字秒表|verilog代码|Testbench|仿真结果)

    七种计数器总结 一.可复位/置数计数器 1.1 可复位/置数计数器 1.2 Verilog代码 1.3 Testbench 1.4 仿真结果 二.双向(可加可减)计数器 2.1 双向(可加可减)计数器 ...

  9. 怎样使用Debussy+ModelSim快速查看前仿真波形

    引子:ModelSim是HDL仿真软件,Debussy是波形查看软件:搭配使用,相当爽.此处所谓快速查看前仿真波形仅为抛砖引玉,大家不要拘泥于此.两款软件的功能都很强大,请自行研究. 注:本篇博文的软 ...

  10. 分享一个gui或app designer实时显示simulink仿真波形和实时进度的方法

    首先在simulink中尝试了to workspace 模块,发现只有在仿真结束之后gui才能够调用数据绘图绘图,不能实现实时显示仿真波形的效果. 所以采用了to file 模块,生成.mat文件,格 ...

最新文章

  1. phpstorm遍历PHP数组,使用PHPStorm对齐数组的键值对
  2. python3下使用requests实现模拟用户登录 —— 基础篇(马蜂窝)
  3. 【AI视野·今日NLP 自然语言处理论文速览 第十六期】Tue, 29 Jun 2021
  4. php rsa aes混合加密,手动演示RSA和AES混合加密过程
  5. 如何在几天时间内快速理解一个陌生行业?
  6. 机器学习基础(十二)—— 数学基本理论拾遗
  7. 仿陶小铺S2B2C商城源码产品分析
  8. 某知名网络安全公司的渗透测试工程师面试题实战汇总
  9. JavaScript 之自定义播放器
  10. go浏览器java_GO浏览器JAVAWP版下载_GO浏览器JAVA2016最新版_GO浏览器JAVA1.2.2-华军软件园...
  11. Grub Rescue恢复
  12. 自制java虚拟机_《深入理解Android:Java虚拟机ART》 —1.2.3 准备模拟器和自制系统镜像...
  13. Eslint代码规范
  14. 免费http代理能用吗?
  15. 快手抖音视频号涨粉方法技巧
  16. 九月开始复习计算机考研,2019计算机考研复习不要盲目开始
  17. PHP定时执行计划任务
  18. 车载网络技术详解 —— 车载网络系统基础(✨您绝不可错过的呕心力作✨)
  19. Google I/O 见闻
  20. 初学Python:encode、decode和Unicode等

热门文章

  1. 2018第九届蓝桥杯国赛C组_java
  2. [数据库系统]关系代数表达式的优化算法
  3. python矩阵计算器心得_矩阵类计算器Python
  4. Android开发:apk反编译及后续打包教程2022win11(亲测)
  5. css vue 内联_Vue绑定内联样式问题
  6. arcgis字段求和_arcgis计算命令
  7. Maven镜像地址大全,Maven镜像地址配置示例
  8. FCM算法研究(一)
  9. 5G新型调制技术FBMC【5G】
  10. 基于springboot的网上零食购物系统