Verilog笔记(四)状态机
来自正点原子的学习笔记
我在学习的过程中会尽量把它和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笔记(四)状态机相关推荐
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- MSSQL编程笔记四 解决count distinct多个字段的方法
MSSQL编程笔记四 解决count distinct多个字段的方法 参考文章: (1)MSSQL编程笔记四 解决count distinct多个字段的方法 (2)https://www.cnblog ...
- RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)
RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...
- JSP学习笔记(四十九):抛弃POI,使用iText生成Word文档
POI操作excel的确很优秀,操作word的功能却不敢令人恭维.我们可以利用iText生成rtf文档,扩展名使用doc即可. 使用iText生成rtf,除了iText的包外,还需要额外的一个支持rt ...
- Ethernet/IP 学习笔记四
Ethernet/IP 学习笔记四 EtherNet/IP Quick Start for Vendors Handbook (PUB213R0): https://www.odva.org/Port ...
- OpenCV学习笔记四-image的一些整体操作
title: OpenCV学习笔记四-image的一些整体操作 categories: 编程 date: 2019-08-08 12:50:47 tags: OpenCV image的一些操作 sP4 ...
- 吴恩达《机器学习》学习笔记四——单变量线性回归(梯度下降法)代码
吴恩达<机器学习>学习笔记四--单变量线性回归(梯度下降法)代码 一.问题介绍 二.解决过程及代码讲解 三.函数解释 1. pandas.read_csv()函数 2. DataFrame ...
- esp8266舵机驱动_arduino开发ESP8266学习笔记四—–舵机
arduino开发ESP8266学习笔记四-–舵机 使用时发现会有ESP8266掉电的情况,应该是板上的稳压芯片的限流导致的,观测波形,发现当舵机运转时,电源线3.3V不再是稳定的3.3V,大概是在3 ...
- 《关键对话——注意观察,如何判断对话氛围是否安全》读书笔记(四)
<关键对话--注意观察,如何判断对话氛围是否安全>读书笔记(四) 在对话过程中,既要关注对话内容(即讨论的主题),也要观察对话气氛(即参与者的反应).越早意识到你和对方退出了对话机制,就越 ...
最新文章
- ie浏览器修复工具_电脑故障修复不求人!50个小工具可帮你一键修复
- Linux 用户和用户组配置说明
- windbg基本简单步骤
- 【FI学习笔记】客户发票收款清账
- 为嵌入式对象(值对象)加校验
- windows 执行bat脚本
- linux系统下PHP无法调用oracle数据库的解决方法
- Redis集群部署(半自动)
- VScode配置C语言环境 亲测 可用!!!
- 在AspNetCore中json序列化日期格式自定义
- bat脚本 rar压缩屏蔽某文件夹 不压缩某文件夹
- java .entryset_Java中map的entrySet()方法返回的是什么内容啊?有点晕
- 周立功USBCAN资料分享
- 使用LODOP设计打印模板
- monthCalendar (日历)控件常用操作
- ​特拉华大学彭曦教授招收2021 Fall全奖博士生
- validateNewTexture:89: failed assertion `BytesPerRow of a buffer-backed texture with pixelFormat
- 2020大疆校招B卷第二题
- html5播放器视频倍速播放功能
- html中的ppt文字不清晰,PPT文字太少怎么办!高手必备的PPT救场技巧