一、有限状态机(Finite State Machine, FSM)基本概念

有限状态机是由寄存器组组合逻辑构成的硬件时序电路;

        其状态只能在同一时钟跳变沿从一个状态转向另一个状态;状态的选择不仅取决于各个输入值,还取决于当前状态,可用于产生在时钟跳变沿时刻开关的复杂的控制逻辑,是数字逻辑的控制核心

1.有限状态机的优势

  • 高效的顺序控制逻辑

            克服了纯硬件数字系统顺序方式控制不灵活的缺点,在其运行方式上类似于控制灵活和方便的CPU,是高速高效控制的首选
  • 容易利用现成的EDA工具进行优化设计

            状态机构建简单,设计方案相对固定,使用HDL综合其可以发挥其强大的优化功能;

            性能良好的综合器都具有许多可控或自动优化状态机的功能
  • 稳定性能

            状态机容易构成良好的同步时序逻辑模块,可用于解决大规模逻辑电路设计中的竞争和冒险现象
  • 高速性能

            在高速通信和高速控制方面,状态机更有其巨大的优势,一个状态机的功能类似于CPU的功能
  • 高可靠性能

            状态机是由纯硬件电路构成,不存在CPU运行软件过程中许多固有的缺陷;

            状态机的设计中能够使用各种容错技术;

            当状态机进入非法状态并从中跳出进入正常状态的时间短暂,对系统的危害不大。

2.有限状态机的分类

一般来说,状态机的基本操作主要有:状态机的内部状态转换产生输出信号序列

        根据电路的输出信号是否与电路的输入有关,可以将状态机划分为:Moore型状态机(输出只与当前电路状态有关,保持输出的稳定性和可预测性);Mealy型状态机(输出与当前电路状态和当前电路输入有关,来快速响应输入变化)

3.有限状态机的描述方法

  • 状态转移图:紧凑,适合描述较为简单的系统

  • 算法状态机(ASM)图

    算法状态机图更像是流程图,能较好地描述复杂系统中状态的转换和动作


        这两种表示方法包含了相同的信息,都包含了状态机的输入、输出、状态和转换。

二、有限状态机的设计

1.状态机的设计步骤

  • 依据具体的设计原则,确定采用Moore型状态机还是Mealy型状态机
  • 分析设计要求,列出状态机的所有状态,并对每一个状态进行状态编码
  • 依据状态转移关系和输出函数,画出状态图
  • 依据所画的状态图,采用硬件描述语言对状态机进行描述

2.状态图的完备性和互斥性检查

  • 完备性: 对于每一个状态,将所有脱离这一状态的条件表达式进行逻辑或运算,如果结果为1就是完备的,否则不完备,也就是说状态图进入某状态后,却不能跳出该状态;
  • 互斥性: 对于每一个状态,将所有脱离这一状态的条件表达式找出,然后任意两个表达式进行逻辑与运算,如果结果为0就是互斥的。也就是要保证在任何时候不会激活两个脱离状态的转换,即从一个状态跳到两个状态

3.安全状态机设计

  • 状态引导法:对于未使用的状态,也给予次态赋值,避免状态机处于未知状态;
  • 状态编码检测法:判断被触发的触发器的个数,当数量大于1时,说明出现问题;
  • 借助EDA工具自动生成安全状态机

三、有限状态机的Verilog HDL描述

考虑如下图所示的状态转移图

1.描述状态机中各个状态的名称,并指定状态编码

  • 状态定义/声明与编码

    • 状态必须是常量parameter或者 `define
    IDLE=2'b00;
START=2'b01;
STOP=2'b10;
CLEAR=2'B11;
  • 状态寄存器(位宽必须与parameter变量一致)

    • cur_state:存储现态
    • next_state:存储次态
    • reg [1:0] state:定义状态寄存器
  • 状态编码

module fsm
#(parameter IDLE=2'b00,
parameter START=2'b01,
parameter STOP=2'b10,
parameter CLEAR=2'b11)
( input clk, rstn, a,
output reg k1, k2); reg [1:0] cur_state, next_state;//定义状态寄存器

2.状态机设计

2.1 设计步骤
  • 用时序的always块描述状态触发器实现的状态存储;
  • 使用敏感表和case语句(或if-else等价语句)描述的状态转换逻辑
  • 描述状态机的输出逻辑
2.2 状态机的三种RTL描述方法
  • 一段式:现态、次态与输出逻辑在同一个always块中
  • 两段式:现态在一个always块中,次态与输出逻辑在一个always块中
  • 三段式:现态、次态与输出逻辑分别在一个always块中

//一段式
always @(posedge clk) begin
if(!rstn) begin
cur_state<=IDLE;
k2<=1'b0;
k1<=1'b0;
end
else
case(cur_state)
IDLE:
if(a) begin
cur_state<=START;
k1<=1'b0;
end
else
cur_state<=IDLE;
START:
if(!a)
cur_state <= STOP;
else
cur_state <=START;
STOP:
if(a) begin
cur_state <= CLEAR;
k2<=1'b1;
end
else
cur_state <= STOP;
CLEAR:
if(!a) begin
cur_state <= IDLE;
k2<=1'b0;
k1<=1'b1;
end
else
cur_state <= CLEAR;
endcase
end
//两段式
always @(posedge clk) begin
if(!rstn)
cur_state <= IDLE;
else
cur_state <= next_state;
end always @(cur_state, a) begin
case(cur_state)
IDLE:
if(a) begin
next_state=START;
k1=1'b0;
end
else
next_state=IDLE;
START:
if(!a)
next_state = STOP;
else
next_state =START;
STOP:
if(a) begin
next_state = CLEAR;
k2=1'b1;
end
else
next_state = STOP;
CLEAR:
if(!a) begin
next_state = IDLE;
k2=1'b0;
k1=1'b1;
end
else
next_state = CLEAR;
endcase
end
//三段式
always@(posedge clk) begin
if(!rstn)
cur_state <= IDLE;
else
cur_state <= next_state;
end always@(cur_state, a) begin
case(cur_state)
IDLE:
if(a) next_state = START;
else next_state = IDLE;
START:
if(!a) next_state = STOP;
else next_state = START;
STOP:
if(a) next_state = CLEAR;
else next_state = STOP;
CLEAR:
if(!a) next_state = IDLE;
else next_state = CLEAR;
endcase
end always@(cur_state, a) begin
k2=1'b0;
k1=1'b0;
if(!rstn) begin
k2=1'b0;
k1=1'b0;
end
else begin
if(cur_state == CLEAR && !a)
k1=1'b1;
else
k1=1'b0;
if(cur_state == STOP && a)
k2=1'b1;
else
k2=1'b0;
end
end

四、有限状态机设计实例

实例1:Moore型序列检测器:

要求描述:

        序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0

        设计一个“1101”的序列检测器,设din为数字码流输入,sout为检出标记输出,高电平表示发现指定序列,低电平表示没有发现指令序列。

Step1.状态定义
  • s0:未检测到“1”
  • s1:检测到输入序列“1”
  • s2:检测到输入序列“11”
  • s3:检测到输入序列“110”
  • s4:检测到输入序列“1101”

            共五个状态,需要声明位宽为3的状态寄存器reg [2:0] cur_state, next_state;
Step2.状态转移表和状态转移图


        无可简化状态,对应的Moore型状态转移图如下:

Step3.HDL语言描述状态转换
//实现代码
module seqdet#(
parameter s0=3'b000,
parameter s1=3'b001,
parameter s2=3'b010,
parameter s3=3'b011,
parameter s4=3'b100)(
input clk, rstn, din,
output reg sout); reg [2:0] cur_state, next_state; always @(posedge clk) begin
if(!rstn) cur_state <= s0;
else cur_state <= next_state;
end always @(cur_state, din) begin
sout=0;
case(cur_state)
s0: begin
if(din == 1) next_state=s1;
else next_state=s0;
end
s1: begin
if(din == 1) next_state=s2;
else next_state=s0;
end
s2: begin
if(din == 0) next_state=s3;
else next_state=s2;
end
s3: begin
if(din == 1) next_state=s4;
else next_state=s0;
end
s4: begin
if(din == 0) begin next_state=s0; sout=1; end
else begin next_state=s1; sout=1; end
end
default next_state=s0;
endcase
end
endmodule //仿真代码
module seqdet_tb();
reg clk, rstn, din;
wire sout; seqdet U1(clk, rstn, din, sout);
always #1 clk=~clk; initial begin
clk=0; rstn=0; din=0;
#5 rstn=1;
#2 din=1;
#2 din=1;
#2 din=0;
#2 din=1;
#2 din=1;
#2 din=0;
#2 din=0;
#3 rstn=0;
#5 $finish;
end
endmodule

仿真得到的波形图如下:


        综合出的电路结构图如下:

        电路状态转移图如下:

实例2:Mealy型序列检测器:

Step2.状态转移表和状态转换图

状态定义与实例1相同,可以得到状态转移表如下:


        对应的Mealy型状态转换图如下:

//实现代码
module seqdet_mealy#(
parameter s0=3'b000,
parameter s1=3'b001,
parameter s2=3'b010,
parameter s3=3'b011,
parameter s4=3'b100)(
input clk, rstn, din,
output reg sout); reg [2:0] cur_state, next_state; always @(posedge clk) begin
if(!rstn) cur_state <= s0;
else cur_state <= next_state;
end always @(cur_state, din) begin
sout = 1'b0;
case(cur_state)
s0: if(din==1) next_state=s1;
else next_state=s0;
s1: if(din==1) next_state=s2;
else next_state=s0;
s2: if(din==0) next_state=s3;
else next_state=s2;
s3: if(din==1) begin next_state=s4; sout=1; end
else next_state=s0;
s4: if(din==1) next_state=s2;
else next_state=s0;
default: next_state=s0;
endcase
end
endmodule //仿真代码
module seqdet_mealy_tb();
reg clk, rstn, din;
wire sout; seqdet_mealy U1(clk, rstn, din, sout);
always #1 clk=~clk; initial begin
clk=0; rstn=0; din=0;
#5 rstn=1;
#2 din=1;
#2 din=1;
#2 din=0;
#2 din=1;
#2 din=1;
#2 din=0;
#2 din=0;
#3 rstn=0;
#5 $finish;
end
endmodule

仿真得到的波形图如下:


        综合出的电路结构图如下:


        电路状态转移图如下:

Verilog5_有限状态机的更多相关文章

  1. AKKA 笔记 - 有限状态机 -2

    AKKA 笔记 - 有限状态机 -2 原文地址: http://rerun.me/2016/05/22/akka-notes-finite-state-machines-2/ 在上一节的Akka FS ...

  2. [翻译]AKKA笔记 - 有限状态机 -1

    原文地址:http://rerun.me/2016/05/21/akka-notes-finite-state-machines-1/ 我最近有个机会在工作上使用了Akka FSM,是个非常有趣的例子 ...

  3. 基于Unity有限状态机框架

    这个框架是Unity wiki上的框架.网址:http://wiki.unity3d.com/index.php/Finite_State_Machine 这就相当于是“模板”吧,自己写的代码,写啥都 ...

  4. 有限状态机(FSM)

    在游戏开发中,AI是个永恒不变的话题,如果你要的AI只是很简单的一个逻辑 那么有限状态机是一个很好的解决方案,尽管在实际开发中,AI的设计并不是一个简单的逻辑, 如果用有限状态机,维护起来会非常麻烦, ...

  5. JavaScript与有限状态机

    有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物. 简单说,它有三个特征: * 状态总数(state)是有限的. * 任一时刻,只处在一种状态之中. ...

  6. 试试用有限状态机的思路来定义javascript组件

    本文是一篇学习性的文章,学习利用有限状态机的思想来定义javascript组件的方法,欢迎阅读,后续计划会写几篇专门介绍自己利用有限状态机帮助自己编写组件的博客,证明这种思路对于编程实现的价值,目前正 ...

  7. 实现简易而强大的游戏AI——FSM,有限状态机

    http://blog.friskit.me/2012/05/introduction-of-fsm/ 在很久很久以前,受限于计算机性能和图形效果,游戏往往是以玩家为唯一主动对象的,玩家发出动作,游戏 ...

  8. python——有限状态机

    前言 使用Python,大部分时间花在了处理文本上.在处理文本的时候,如果对有限状态机有所了解的话,处理起来会更加得心应手.可以把文本看成一个流,然后有一个机器对这个流进行操作.这个机器有状态,不同的 ...

  9. 有限状态机(Python)

    有限状态机(Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.FSM是一种算法思想,简单而言,有限状 ...

  10. Verilog学习笔记简单功能实现(三)...............同步有限状态机

    在Verilog中可以采用多种方法来描述有限状态机最常见的方法就是用always和case语句.如下图所示的状态转移图就表示了一个简单的有限状态机: 图中:图表示了一个四状态的状态机,输入为A和Res ...

随机推荐

  1. vue项目整合echarts

    准备工作: 首先我们初始化一个vue项目,执行vue init webpack echart,接着我们进入初始化的项目下.安装echarts, npm install echarts -S //或   ...

  2. OpenCV3 图像处理笔记

    此笔记针对 Python 版本的 opencv3,c++ 版本的函数和 python 版本的函数参数几乎一样,只是矩阵格式从 ndarray 类型变成适合 c++ 的 mat 模板类型.注意,因为 p ...

  3. 蚂蚁KAG框架核心功能研读

    作者介绍: 薛明:拥有近10年在医疗和零售领域应用机器学习和人工智能的经验.曾就职于通用电气.复星医药等企业.长期专注于医学图像.自然语言处理以及数据科学的研发工作,如训练/推理框架.数据挖掘与分析等 ...

  4. DearPyGui学习

    1.所有DPG应用程序必须做3件事: 创建和销毁上下文 (create_context) 创建和显示视区 (create_viewport.show_viewport) 设置和启动DearPyGui ...

  5. 0.3 preface

    Preface 此书的目的是双重的: 1. 介绍多个领域的背景材料,让学生更好地理解和学习: 2. 详细讲解量子计算和量子信息领域的重要结论,既可以作为学生通识教育的一部分,又可以作为独立研究的前奏. ...

  6. games101_Homework1

    本次作业的任务是填写一个旋转矩阵和一个透视投影矩阵.给定三维下三个 点 v0(2.0, 0.0, −2.0), v1(0.0, 2.0, −2.0), v2(−2.0, 0.0, −2.0), 你需要 ...

  7. Redis示例配置文件

    # 注意单位问题:当需要设置内存大小的时候,可以使用类似1k.5GB.4M这样的常见格式: # # 1k => 1000 bytes # 1m => # 1kb => 1024 by ...

  8. PostgreSQL中将对象oid和对象名相互转换

    PostgreSQL中将对象oid转为对象名 使用pg的内部数据类型将对象oid转为对象名,可以简化一些系统视图的关联查询. 数据库类型转换对应类型的oid 可以用以下数据库类型转换对应类型的oid( ...

  9. Docker for the Virtualization Admin

    Docker is one of the most successful open source projects in recent history, and organizations of al ...

  10. 人工智能模型训练技术:随机失活,丢弃法,Dropout

    前一篇:<探索训练人工智能模型的词汇大小与模型的维度> 序言:Dropout 是神经网络设计领域的一种技术,通常我们把它翻译成 随机失活 或者 丢弃法.如果训练神经网络的时候不用 Drop ...