来自正点原子的学习笔记
我在学习的过程中会尽量把它和C语言进行比较,毕竟有较大的相似之处

RTL设计主要有组合电路时序电路两个部分,还有一个非常重要的部分就是状态机,都应该熟练的掌握(刷题网站里都有对应的题目哦!~)

状态机Verilog里非常常用的语法结构

状态机

  • 1 状态机概念
    • 1.1 引子
    • 1.2 概念
  • 2 状态机模型
  • 3 状态机设计
    • 3.1 状态空间定义
    • 3.2 状态跳转(时序逻辑)
    • 3.3 下个状态判断(组合逻辑)
    • 3.4 各个状态下的动作
    • 3.5 例子

1 状态机概念

1.1 引子

状态机非常适合在Verilog里实现一些顺序的逻辑(例子里的8023四个数字的输入和检测就是顺序逻辑)
而Verilog语言是并行的,不能像C语言一样顺序执行,因此采用状态机

从这个例子里我们能总结出状态机的概念

1.2 概念

状态机(State Machine):
有限状态机(Finite State Machine,简称FSM
有限状态之间按一定规律转换时序电路

2 状态机模型

下面介绍状态机的两个模型

状态寄存器由一组触发器组成,用来记忆状态机当前所处的状态,状态的改变发生在时钟的跳变沿

组合逻辑F 不仅与 输入 有关,还与 当前状态 有关(F是当前状态和输入信号的函数)。

状态机的输出是由 输出组合逻辑G 提供的,G也是当前状态和输入信号的函数。(“解锁”就是状态机的输出结果)
更准确的说,刚才的“电子门锁”的G输出不直接(不)受输入的影响(当然,都与当前状态直接相关)
应该是Moore状态机

3 状态机设计

设计状态机的方法:四段论(八股文啊哈哈,严格的写法)
1 状态空间定义
2 状态跳转
3 下个状态判断
4 各个状态下的动作

3.1 状态空间定义

(偏抽象)
编码方式一:

//define  state space                               //定义了一天的四种状态,这个集合统称为“状态空间”
parameter  SLEEP   = 2'b00;                         //对四个状态进行编码,因为Verilog只能处理二进制数
parameter  STUDY    = 2'b01;                        //用parameter来定义参数类型的数据
parameter  EAT          = 2'b10;                  //具体编码的值其实是无所谓的,顺序也是。
parameter  AMUSE    = 2'b11;                        //但是还是尽量按照状态跳转的顺序来编码// internal variable                                //定义储存状态的两个变量
reg     [1:0]   current_state;
reg     [1:0]   next_state;

编码方式二:独热码
:每个状态只有一个寄存器置位,译码逻辑简单

//define  state space
parameter  SLEEP   = 4'b1000;
parameter  STUDY    = 4'b0100;
parameter  EAT          = 4'b0010;
parameter  AMUSE    = 4'b0001;   ;                     // internal variable
reg     [3:0]   current_state;                       //状态位宽保持一致
reg     [3:0]   next_state;

3.2 状态跳转(时序逻辑)

// transition
always @(posedge  clk or negedge rst_n)beginif ( ! rst_n)current_state  <=  SLEEP;else current_state  <= next _state;            //时序逻辑里用非阻塞赋值,组合逻辑里用阻塞赋值
end

3.3 下个状态判断(组合逻辑)

F是当前状态和输入信号的函数” 体现在 敏感列表上:

always @(current_state  or input_signals)begin
//此处也可以用*,将块语句的中的所有变量添加到敏感列表中去


latch是电平触发的一个锁存器,会影响整个电路的时序分析,应避免
产生情况:
1.有if没else
2.case表达式没完全(比如default)

3.4 各个状态下的动作

组合逻辑有两种表达方式
方式一:assign的赋值语句

// action
wire read_book;
assign read_book = (current_state ==STUDY)   ?   1'b1  : 1'b0          //条件运算符
//适用于输出信号不复杂

方式二:always 的组合语句

always @(current_stat)beginif (current_state == STUDY)read_book  =  1;else read_book  =  0;
end
//适用于输出信号复杂

3.5 例子

除去状态空间定义,剩下 状态跳转下个状态判断各个状态下的动作,三个部分
因此也叫三段式状态机

模块的端口声明
独热码来编码状态
s0没有位置置1,标明是初始状态

此处,状态空间定义完毕
///
下面开始三段式状态机

第一段:状态跳转(时序逻辑)

第二段:下个状态判断(组合逻辑)
至于当前状态有关,与输入无关

第三段:各个状态下的动作(时序逻辑)
虽然上文讲解的时候是组合逻辑但是在此处使用时序逻辑,还是有好处的
此处多了一个输出寄存器,多运用了一次时序逻辑,用于输出。

因此,三段式可以在组合逻辑后再增加一级寄存器来实现时序逻辑输出:
1.可以有效滤去组合逻辑输出的毛刺;
2.可以有效地进行时序计算与约束;
3.另外,对于总线形式的输出信号来说,容易使总线数据对齐,从而减小总线数据间的偏移(到达时间不同),减小接收端数据采样出错的频率。

Verilog笔记(四)状态机相关推荐

  1. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  2. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  3. MSSQL编程笔记四 解决count distinct多个字段的方法

    MSSQL编程笔记四 解决count distinct多个字段的方法 参考文章: (1)MSSQL编程笔记四 解决count distinct多个字段的方法 (2)https://www.cnblog ...

  4. RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)

    RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...

  5. JSP学习笔记(四十九):抛弃POI,使用iText生成Word文档

    POI操作excel的确很优秀,操作word的功能却不敢令人恭维.我们可以利用iText生成rtf文档,扩展名使用doc即可. 使用iText生成rtf,除了iText的包外,还需要额外的一个支持rt ...

  6. Ethernet/IP 学习笔记四

    Ethernet/IP 学习笔记四 EtherNet/IP Quick Start for Vendors Handbook (PUB213R0): https://www.odva.org/Port ...

  7. OpenCV学习笔记四-image的一些整体操作

    title: OpenCV学习笔记四-image的一些整体操作 categories: 编程 date: 2019-08-08 12:50:47 tags: OpenCV image的一些操作 sP4 ...

  8. 吴恩达《机器学习》学习笔记四——单变量线性回归(梯度下降法)代码

    吴恩达<机器学习>学习笔记四--单变量线性回归(梯度下降法)代码 一.问题介绍 二.解决过程及代码讲解 三.函数解释 1. pandas.read_csv()函数 2. DataFrame ...

  9. esp8266舵机驱动_arduino开发ESP8266学习笔记四—–舵机

    arduino开发ESP8266学习笔记四-–舵机 使用时发现会有ESP8266掉电的情况,应该是板上的稳压芯片的限流导致的,观测波形,发现当舵机运转时,电源线3.3V不再是稳定的3.3V,大概是在3 ...

  10. 《关键对话——注意观察,如何判断对话氛围是否安全》读书笔记(四)

    <关键对话--注意观察,如何判断对话氛围是否安全>读书笔记(四) 在对话过程中,既要关注对话内容(即讨论的主题),也要观察对话气氛(即参与者的反应).越早意识到你和对方退出了对话机制,就越 ...

最新文章

  1. ie浏览器修复工具_电脑故障修复不求人!50个小工具可帮你一键修复
  2. Linux 用户和用户组配置说明
  3. windbg基本简单步骤
  4. 【FI学习笔记】客户发票收款清账
  5. 为嵌入式对象(值对象)加校验
  6. windows 执行bat脚本
  7. linux系统下PHP无法调用oracle数据库的解决方法
  8. Redis集群部署(半自动)
  9. VScode配置C语言环境 亲测 可用!!!
  10. 在AspNetCore中json序列化日期格式自定义
  11. bat脚本 rar压缩屏蔽某文件夹 不压缩某文件夹
  12. java .entryset_Java中map的entrySet()方法返回的是什么内容啊?有点晕
  13. 周立功USBCAN资料分享
  14. 使用LODOP设计打印模板
  15. monthCalendar (日历)控件常用操作
  16. ​特拉华大学彭曦教授招收2021 Fall全奖博士生
  17. validateNewTexture:89: failed assertion `BytesPerRow of a buffer-backed texture with pixelFormat
  18. 2020大疆校招B卷第二题
  19. html5播放器视频倍速播放功能
  20. html中的ppt文字不清晰,PPT文字太少怎么办!高手必备的PPT救场技巧

热门文章

  1. Load Switch负载开关详解
  2. UNI-APP_uni-app中设置radio和switch的大小
  3. Windows10无法启动windows安全中心服务怎么办?
  4. 《缠中说禅108课》37:背驰的再分辨
  5. 杂志特稿:元宇宙将重塑我们的生活,我们要确保它变得更好
  6. et al和etc区别
  7. C语言学习有感day01
  8. 服务器下安装windows操作系统---宝德服务器
  9. postgresql 9.5 now()函数少8小时
  10. 2017网易校招:数字游戏