多数控制逻辑都可以用有限状态机描述

状态机

状态机是组合逻辑和时序逻辑的特殊组合

  • 时序逻辑用于存储状态
  • 组合逻辑用于产生次态和产生输出

状态的数量是有限的,故称为有限状态机(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)相关推荐

  1. 《计算机组成与CPU设计实验》实验3:寄存器组(堆)实验

    实验目的 掌握寄存器的HDL描述方法; 掌握HDL参数化设计方法; 理解寄存器组(堆)的电路结构,并能用HDL描述; 了解逻辑电路成本的概念. 实验原理 寄存器 寄存器定义 锁存器和触发器都是寄存器, ...

  2. 《计算机组成与CPU设计实验》实验2 七段译码器实验

    实验目的 (1)掌握七段译码器的HDL描述; (2)掌握HDL模块层次化设计方法. 译码器和编码 译码器 n位输入,对应位输出,每组输入组合,仅对应一个一个输出 地址译码 计算机中译码器常用于:地址译 ...

  3. 证明与计算(7): 有限状态机(Finite State Machine)

    什么是有限状态机(Finite State Machine)? 什么是确定性有限状态机(deterministic finite automaton, DFA )? 什么是非确定性有限状态机(nond ...

  4. 杭电计算机组成原理实验九R-I,杭电计组实验9-实现R-I型指令的CPU设计实验.doc

    *** *** 实验报告 2018 年 6 月 1 日 成绩: 姓名 阳光男 学号班级专业 计算机科学与技术 课程名称 <计算机组成原理与系统结构 试验> 任课老 师 张翔老师 指导老 师 ...

  5. FSM(Finite State Machine,有限状态机)设计

    有限状态机(Finite State Machine, FSM),根据状态机的输出是否与输入有关,可分为Moore型状态机和Mealy型状态机.Moore型状态机输出仅仅与现态有关和Mealy型状态机 ...

  6. 有限状态机FSM(finite state machine) 二

    有限状态机FSM(finite state machine) 二 延续上一篇继续有限状态机 上一篇中的状态切换判断是在每一个状态类的 OnExecute 方法中各种 if else 硬编码逻辑 当状态 ...

  7. 有限状态机FSM(Finite State Machine)及实现方式介绍(转)

    原文:https://www.cnblogs.com/barrywxx/p/12860573.html 一.为什么引入有限状态机? 最近做一个项目,项目中很多实体(Entity),每个实体都有很多状态 ...

  8. 有限状态机FSM(finite state machine) 一

    有限状态机FSM(finite state machine) 一 有限状态机又称有限自动状态机,它拥有有限数量的状态,每个状态代表不同的意义,每个状态可以切换到 零-多 个状态.任意时刻状态机有且只能 ...

  9. 杭电 2016 计算机组成原理,杭电计算机组成原理寄存器堆设计实验4.doc

    杭州电子科技大学计算机学院 实验报告 课程名称:计算机组成原理 实验项目:寄存器堆设计实验 指导教师 实验位置: 姓 班 级: 学 号: 日 期:2015年5月7日 实验目的学习和使用Verlilog ...

最新文章

  1. 先随机后排序的oracle,Oracle用decode函数或CASE-WHEN实现自定义排序
  2. gradient设置上下渐变_css3渐变之线性渐变linear-gradient
  3. 如何激活React的跟踪模式和打开日志记录
  4. jQuery下实现检测指定元素加载完毕
  5. python3.5.2安装pygame_【闲来无事,py写game】Mac-Python3.5安装pygame 1.9.2 小计
  6. Java堆分配参数总结
  7. python软件下载安装百度网盘-Python自动化测试视频教程【百度云盘下载】
  8. 高数18讲_1000题错题总结_第三四讲
  9. 2021 泰迪杯 A 题
  10. linux获取脚本文件路径
  11. 轻量级私有云存储企业主要功能探析
  12. ipad+PDF Expert:买前生产力,买后生产力
  13. 数据可视化图表总结(一)
  14. 戴尔游匣5577黑苹果EFI文件
  15. python+flask+html/css+mysql+BAE 打造CSDN简历自动生成系统(附网站完全源码)
  16. tosmana使用教程_20款最流行的免费定性数据分析工具
  17. Aria2整合FileRun自建离线下载网
  18. 深信服 应用交付报表系统 download.php 任意文件读取漏洞
  19. html插入swf自动播放,[转载]网页中插入FLASH(swf文件)的html代码
  20. JVM_Parallel Scavenge 实例证明,说些你不知道的东西,大对象的规则!!策略的验证

热门文章

  1. 解析法实现多元线性回归的实例
  2. 【codeforces 794B】Cutting Carrot
  3. pandas 处理 excel 文件 之 Series DataFrame 篇
  4. 2.什么是JAVA内存模型?
  5. 视频去水印前端界面布局
  6. 爷爷八十大寿,程序员为他写了一个书本朗读App
  7. 剑网3指尖江湖快速升级攻略 悄悄抱走月儿
  8. 架构师的 36 项修炼第02讲:架构核心技术之分布式缓存(上)
  9. 使用正则表达式处理金额
  10. Cocos Creator 新手引导制作