《计算机组成与CPU设计实验》5有限状态机的Verilog HDL描述(Finite State Machine,FSM)
多数控制逻辑都可以用有限状态机描述
状态机
状态机是组合逻辑和时序逻辑的特殊组合
- 时序逻辑用于存储状态
- 组合逻辑用于产生次态和产生输出
状态的数量是有限的,故称为有限状态机(Finite State Machine,简称为FSM)
状态机分类
摩尔Moore型状态机结构
输出仅取决于当前状态。
在整个状态周期内输出保持不变,即使输入信号有变化。
米利Mealy型状态机结构
除当前状态外,输出还直接受输入影响,变化可能出现在任何时刻。
例子:玩具小车的速度档位
玩具小车汽车的速度有四个状态:停止、低速、中速、高速。
速度由刹车brake和加速器accelerator绝决定
状态图
- stop
- stop->low speed 刹车没有启动, 启动加速器brake=0 accelerator=1
- low speed->medium speed 刹车没有启动, 启动加速器brake=0 accelerator=1
- medium speed->high speed 刹车没有启动, 启动加速器brake=0 accelerator=1
- high speed->medium speed 刹车启动 brake=1
- medium speed->low speed 刹车启动 brake=1
- low speed->stop 刹车启动 brake=1
Verilog描述( Moore型状态机)
输出仅取决于当前状态。
module FSM(input Clk,Reset,input brake,//刹车input acc,//加速output [1:0] speed
);reg [1:0]state; //现态
reg [1:0 ]next_state;//次态localparam STOP = 2'b00;
localparam LOW = 2'b01;
localparam MEDI = 2'b10;
localparam HIGH = 2'b11;
//状态转换 时序逻辑
always@(posedge Clk or Reset)if(Reset)state <= stop;elsestate <= next_state; //次态计算 组合逻辑
always@(*)case(state)STOP:if(acc & !brake) next_state = LOW;else next_state = STOP;LOW:if(brake) next_state = STOP;else if(acc) next_state = MEDI;else next_state = LOW ;MEDI:if(brake) next_state = LOW;else if(acc) next_state = HIGH;else next_state = MEDI ;HIGH:if(brake) next_state = MEDI;else next_state = HIGH ;endcase//输出逻辑 组合逻辑assign speed = state;endmodule
Mealy型状态机的描述
假设按下easy这个按钮,玩具小车以一档(低速)行驶。 和当前是什么状态没有关系。
module FSM(input Clk,Reset, brake, acc,input easy,//输入信号output [1:0] speed
);reg [1:0]state; //现态
reg [1:0 ]next_state;//次态localparam STOP = 2'b00;
localparam LOW = 2'b01;
localparam MEDI = 2'b10;
localparam HIGH = 2'b11;
//状态转换
always@(posedge Clk or Reset)if(Reset)state <= stop;elsestate <= next_state; //次态计算
always@(*)case(state)STOP:if(acc & !brake) next_state = LOW;else next_state = STOP;LOW:if(brake) next_state = STOP;else if(acc) next_state = MEDI;else next_state = LOW ;MEDI:if(brake) next_state = LOW;else if(acc) next_state = HIGH;else next_state = MEDI ;HIGH:if(brake) next_state = MEDI;else next_state = HIGH ;endcase//输出逻辑assign speed =easy? 2'b01:state;//输出speed除了和当前状态有关,也直接受easy输入影响。endmodule
状态编码
前面使用的是二进制数编码,除此之外,格雷码、约翰逊码等都可以用来状态机编码。
1、Sequential和Gray码使用的触发器最少
2、Johnson和Gray码的相邻编码只有一位不同,有利于减少电路噪声(依赖于转移状态)
3、One-hot编码
- 所有位中只有一个1
- 使用的触发器较多,但计算次态的组合电路较小
- 适合于FPGA采用
One-hot状态编码
例子:玩具小车的速度档位(使用one hot编码)
module onehot_FSM(input Clk,Reset,input brake,//刹车input acc,//加速output [1:0] speed
);reg [1:0]state; //现态
reg [1:0 ]next_state;//次态localparam STOP = 4'b0001;
localparam LOW = 4'b0010;
localparam MEDI = 4'b0100;
localparam HIGH = 4'b1000;
//状态转换 时序逻辑
always@(posedge Clk or Reset)if(Reset)state <= stop;elsestate <= next_state; //次态计算 组合逻辑
always@(*)case(state)STOP:if(acc & !brake) next_state = LOW;else next_state = STOP;LOW:if(brake) next_state = STOP;else if(acc) next_state = MEDI;else next_state = LOW ;MEDI:if(brake) next_state = LOW;else if(acc) next_state = HIGH;else next_state = MEDI ;HIGH:if(brake) next_state = MEDI;else next_state = HIGH ;endcase//输出逻辑 组合逻辑
always@(state)case(state)STOP: speed = 2'b00;LOW: speed = 2'b01;MEDI: speed = 2'b10;HIGH: speed = 2'b11;endcase
endmodule
状态编码的定义方法
1、用parameter或localparam语句
localparam STOP = 4'b0001;
localparam LOW = 4'b0010;
localparam MEDI = 4'b0100;
localparam HIGH = 4'b1000;
2、用`define语句(不推荐)
3、用枚举类型(SystemVerilog)
(1)默认情况下,枚举类型里元素的类型为int型,第一个元素的值为0,第二个为1,...
enum {STOP, LOW, MEDIUM, HIGH } state;
(2)显式定义枚举元素的类型和值
enum bit[3:0]{STATE0 = 4'b0001,STATE1= 4'b0010,STATE2 = 4'b0100,STATE3 = 4'b1000,
} state,next_state;
用枚举类型定义状态编码
例子:玩具小车的速度档位(使用枚举定义编码)
module FSM(input Clk,Reset,input brake,//刹车input acc,//加速output [1:0] speed
);//默认情况下,枚举类型里元素的类型为int型,第一个元素的值为0,第二个为1,...
enum { STOP ,//0LOW ,//1MEDI ,//2HIGH //3
} state,next_state;//现态、次态//状态转换 时序逻辑
always@(posedge Clk or Reset)if(Reset)state <= stop;elsestate <= next_state; //次态计算 组合逻辑
always@(*)case(state)STOP:if(acc & !brake) next_state = LOW;else next_state = STOP;LOW:if(brake) next_state = STOP;else if(acc) next_state = MEDI;else next_state = LOW ;MEDI:if(brake) next_state = LOW;else if(acc) next_state = HIGH;else next_state = MEDI ;HIGH:if(brake) next_state = MEDI;else next_state = HIGH ;endcase//输出逻辑 组合逻辑assign speed = state;endmodule
用枚举类型定义One-hot编码
例子:玩具小车的速度档位(使用枚举定义one hot编码)
module onehot_FSM(input Clk,Reset,input brake,//刹车input acc,//加速output [1:0] speed
);enum bit[3:0]{STOP = 4'b0001,LOW = 4'b0010,MEDI = 4'b0100,HIGH = 4'b1000,
} state,next_state;//状态转换 时序逻辑
always@(posedge Clk or Reset)if(Reset)state <= stop;elsestate <= next_state; //次态计算 组合逻辑
always@(*)case(state)STOP:if(acc & !brake) next_state = LOW;else next_state = STOP;LOW:if(brake) next_state = STOP;else if(acc) next_state = MEDI;else next_state = LOW ;MEDI:if(brake) next_state = LOW;else if(acc) next_state = HIGH;else next_state = MEDI ;HIGH:if(brake) next_state = MEDI;else next_state = HIGH ;endcase//输出逻辑 组合逻辑
always@(state)case(state)STOP: speed = 2'b00;LOW: speed = 2'b01;MEDI: speed = 2'b10;HIGH: speed = 2'b11;endcase
endmodule
状态机的描述风格
状态机描述的3段式结构
- 状态转换
- 次态计算
- 输出逻辑
//FSM分为4块:状态定义,状态转换,次态计算,输出计算。//状态变量声明
reg [N-1:]state, next_state;
//状态定义
localparam S0=... , S1=... , S2=..., S3=......;//状态转换
always@(posedge clk or posedge reset)if(reset) state <= ...;else state <= next_state;//次态计算
always @(*)begincase (state)... next_stat = ...end//输出逻辑
always @(...).....
状态机描述的2段式结构
合并两个组合逻辑部分
注意:合并后的框图不能分辨摩尔型和米利型。
状态机描述的 2段式结构
合并了两个组合逻辑部分,与3段式仅仅是形式不同,不易分辨摩尔型和米利型。
例子:玩具小车的速度档位(使用状态机描述的2段式结构)
本例输出speed只受状态影响。
module onehot_FSM(input Clk,Reset,input brake,//刹车input acc,//加速output [1:0] speed
);enum bit[3:0]{STOP = 4'b0001,LOW = 4'b0010,MEDI = 4'b0100,HIGH = 4'b1000,
} state,next_state;//状态转换 时序逻辑
always@(posedge Clk or Reset)if(Reset)state <= stop;elsestate <= next_state; //次态计算 + 输出逻辑
always@(*)case(state)STOP:speed = 2'b00;if(acc & !brake) next_state = LOW;else next_state = STOP;LOW:speed = 2'b01;if(brake) next_state = STOP;else if(acc) next_state = MEDI;else next_state = LOW ;MEDI:speed = 2'b10;if(brake) next_state = LOW;else if(acc) next_state = HIGH;else next_state = MEDI ;HIGH:speed = 2'b11;if(brake) next_state = MEDI;else next_state = HIGH ;endcaseendmodule
状态机Verilog在线编程
练习网站:
牛客网-状态机练习
《计算机组成与CPU设计实验》5有限状态机的Verilog HDL描述(Finite State Machine,FSM)相关推荐
- 《计算机组成与CPU设计实验》实验3:寄存器组(堆)实验
实验目的 掌握寄存器的HDL描述方法; 掌握HDL参数化设计方法; 理解寄存器组(堆)的电路结构,并能用HDL描述; 了解逻辑电路成本的概念. 实验原理 寄存器 寄存器定义 锁存器和触发器都是寄存器, ...
- 《计算机组成与CPU设计实验》实验2 七段译码器实验
实验目的 (1)掌握七段译码器的HDL描述; (2)掌握HDL模块层次化设计方法. 译码器和编码 译码器 n位输入,对应位输出,每组输入组合,仅对应一个一个输出 地址译码 计算机中译码器常用于:地址译 ...
- 证明与计算(7): 有限状态机(Finite State Machine)
什么是有限状态机(Finite State Machine)? 什么是确定性有限状态机(deterministic finite automaton, DFA )? 什么是非确定性有限状态机(nond ...
- 杭电计算机组成原理实验九R-I,杭电计组实验9-实现R-I型指令的CPU设计实验.doc
*** *** 实验报告 2018 年 6 月 1 日 成绩: 姓名 阳光男 学号班级专业 计算机科学与技术 课程名称 <计算机组成原理与系统结构 试验> 任课老 师 张翔老师 指导老 师 ...
- FSM(Finite State Machine,有限状态机)设计
有限状态机(Finite State Machine, FSM),根据状态机的输出是否与输入有关,可分为Moore型状态机和Mealy型状态机.Moore型状态机输出仅仅与现态有关和Mealy型状态机 ...
- 有限状态机FSM(finite state machine) 二
有限状态机FSM(finite state machine) 二 延续上一篇继续有限状态机 上一篇中的状态切换判断是在每一个状态类的 OnExecute 方法中各种 if else 硬编码逻辑 当状态 ...
- 有限状态机FSM(Finite State Machine)及实现方式介绍(转)
原文:https://www.cnblogs.com/barrywxx/p/12860573.html 一.为什么引入有限状态机? 最近做一个项目,项目中很多实体(Entity),每个实体都有很多状态 ...
- 有限状态机FSM(finite state machine) 一
有限状态机FSM(finite state machine) 一 有限状态机又称有限自动状态机,它拥有有限数量的状态,每个状态代表不同的意义,每个状态可以切换到 零-多 个状态.任意时刻状态机有且只能 ...
- 杭电 2016 计算机组成原理,杭电计算机组成原理寄存器堆设计实验4.doc
杭州电子科技大学计算机学院 实验报告 课程名称:计算机组成原理 实验项目:寄存器堆设计实验 指导教师 实验位置: 姓 班 级: 学 号: 日 期:2015年5月7日 实验目的学习和使用Verlilog ...
最新文章
- 先随机后排序的oracle,Oracle用decode函数或CASE-WHEN实现自定义排序
- gradient设置上下渐变_css3渐变之线性渐变linear-gradient
- 如何激活React的跟踪模式和打开日志记录
- jQuery下实现检测指定元素加载完毕
- python3.5.2安装pygame_【闲来无事,py写game】Mac-Python3.5安装pygame 1.9.2 小计
- Java堆分配参数总结
- python软件下载安装百度网盘-Python自动化测试视频教程【百度云盘下载】
- 高数18讲_1000题错题总结_第三四讲
- 2021 泰迪杯 A 题
- linux获取脚本文件路径
- 轻量级私有云存储企业主要功能探析
- ipad+PDF Expert:买前生产力,买后生产力
- 数据可视化图表总结(一)
- 戴尔游匣5577黑苹果EFI文件
- python+flask+html/css+mysql+BAE 打造CSDN简历自动生成系统(附网站完全源码)
- tosmana使用教程_20款最流行的免费定性数据分析工具
- Aria2整合FileRun自建离线下载网
- 深信服 应用交付报表系统 download.php 任意文件读取漏洞
- html插入swf自动播放,[转载]网页中插入FLASH(swf文件)的html代码
- JVM_Parallel Scavenge 实例证明,说些你不知道的东西,大对象的规则!!策略的验证