Verilog5_有限状态机
一、有限状态机(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_有限状态机的更多相关文章
- AKKA 笔记 - 有限状态机 -2
AKKA 笔记 - 有限状态机 -2 原文地址: http://rerun.me/2016/05/22/akka-notes-finite-state-machines-2/ 在上一节的Akka FS ...
- [翻译]AKKA笔记 - 有限状态机 -1
原文地址:http://rerun.me/2016/05/21/akka-notes-finite-state-machines-1/ 我最近有个机会在工作上使用了Akka FSM,是个非常有趣的例子 ...
- 基于Unity有限状态机框架
这个框架是Unity wiki上的框架.网址:http://wiki.unity3d.com/index.php/Finite_State_Machine 这就相当于是“模板”吧,自己写的代码,写啥都 ...
- 有限状态机(FSM)
在游戏开发中,AI是个永恒不变的话题,如果你要的AI只是很简单的一个逻辑 那么有限状态机是一个很好的解决方案,尽管在实际开发中,AI的设计并不是一个简单的逻辑, 如果用有限状态机,维护起来会非常麻烦, ...
- JavaScript与有限状态机
有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物. 简单说,它有三个特征: * 状态总数(state)是有限的. * 任一时刻,只处在一种状态之中. ...
- 试试用有限状态机的思路来定义javascript组件
本文是一篇学习性的文章,学习利用有限状态机的思想来定义javascript组件的方法,欢迎阅读,后续计划会写几篇专门介绍自己利用有限状态机帮助自己编写组件的博客,证明这种思路对于编程实现的价值,目前正 ...
- 实现简易而强大的游戏AI——FSM,有限状态机
http://blog.friskit.me/2012/05/introduction-of-fsm/ 在很久很久以前,受限于计算机性能和图形效果,游戏往往是以玩家为唯一主动对象的,玩家发出动作,游戏 ...
- python——有限状态机
前言 使用Python,大部分时间花在了处理文本上.在处理文本的时候,如果对有限状态机有所了解的话,处理起来会更加得心应手.可以把文本看成一个流,然后有一个机器对这个流进行操作.这个机器有状态,不同的 ...
- 有限状态机(Python)
有限状态机(Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.FSM是一种算法思想,简单而言,有限状 ...
- Verilog学习笔记简单功能实现(三)...............同步有限状态机
在Verilog中可以采用多种方法来描述有限状态机最常见的方法就是用always和case语句.如下图所示的状态转移图就表示了一个简单的有限状态机: 图中:图表示了一个四状态的状态机,输入为A和Res ...
随机推荐
- redis配置文件剖析
解析配置文件 #是否在后台运行:no:不是后台运行 daemonize yes #是否开启保护模式,默认开启.要是配置里没有指定bind和密码.开启该参数后,redis只会本地进行访问,拒绝外部访问. ...
- Go语言基础07 _interface _1
Go语言基础07 _interface _1 与其他主要编程语⾔的差异 接⼝为⾮⼊侵性,实现不依赖于借⼝定义 所以接⼝的定义可以包含在接⼝使⽤者包内 package interface_test im ...
- Linux 基础-查看进程命令 ps 和 top
目录 1,使用 ps 命令找出 CPU 占用高的进程 2,通过 top 命令定位占用 cpu 高的进程 3,htop 系统监控与进程管理软件 4,参考资料 1,使用 ps 命令找出 CPU 占用高的进 ...
- 轻量级网络-CSPNet 论文解读
摘要 1,介绍 2,相关工作 3,改进方法 3.1,Cross Stage Partial Network 3.2,Exact Fusion Model 4,实验 4.1,实验细节 4.2,消融实验 ...
- 国内SRC信息收集
SRC之信息收集 前言: 关于SRC信息收集不在于工具是否全面,工具固然重要,它们能帮我们节省大量的时间收集资产,但不是说我们一定要用到所有工具,收集到某个SRC的所有资产才罢休.资产总会有遗漏, ...
- 一款绘制3D架构图的在线神器:iCraft Editor
在软件开发的世界里,架构图是系统设计的蓝图,它们不仅帮助团队理解系统的整体结构,还能提升沟通效率,确保项目的顺利推进.然而,绘制一张清晰.直观的架构图,往往需要大量时间和专业工具.面对繁琐的操作和复杂 ...
- 方法的虚分派(virtual dispatch)和方法表(method table)
Java方法调用的虚分派 JUN 2ND, 2013 | COMMENTS 本文通过介绍 Java 方法调用的虚分派,来加深对 Java 多态实现的理解.需要预先理解 Java 字节码和 JVM 的基 ...
- 3D饼图
1.实现思路 Echarts本身没有这类图形,可以使用其扩展echarts-gl进行绘制,echarts-gl曲面图可以完成这类需求 <script src="https://cdn. ...
- Skyvern – AI浏览器自动化测试工具
Skyvern – AI浏览器自动化测试工具 Skyvern是什么 Skyvern是开源的浏览器自动化工具,结合大型语言模型(LLMs)和计算机视觉技术实现复杂的网页交互和数据提取.与传统的 ...
- 获取Map中选择的要素
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
