状态机设计
第14章 状态机设计(state machine design)

第14章 状态机设计(State Machine Design)讲到VHDL设计而不讲state machine,感觉上就是不太完整,我们先来看看什么是state machine,它应该是一种流程控制的设计,在有限的状态中,根据判别信号的逻辑值决定后面要进入哪一个状态,这样的讲法似乎有些抽象,我们先来看看下面的状态图。
图14-1所显示的是一个十字路口的红绿灯控制设计,在一开始时信号Reset 会被设为逻辑’0’,此时state machine会在Reset状态,一直等到信号Reset变成逻辑’1’时,state machine才会进入真正的控制状态。
在之后的三个状态中,我们各定义了一个counter,当进入Red或是之后的Green及Yellow状态时,相对的counter值即会开始递减。
当counter值递减到0时,state machine即会改变到下一个状态。
当然state machine的执行就是依照这种方式进行,但是其中仍有许多的细节是设计者所要注意的,在接下来的章节中,我们会依据实际的例子来介绍state machine的设计方式。
14-1State Machine的建立在这一节我们所举的例子是一个类似检查密码的设计,在一般办公室的门口都会有门禁管制,进门前须先输入一组四个数字的密码,当密码确认无误后门才会打开,除此之外还有更改密码的功用。
我们先来看看其状态图。
在图14-2中一共有四个状态,一开始会维持在idle状态,当要更改或是第一次输入密码时,需要按下一个特殊的“密码更改”按键,此时InpinN信号会变成逻辑’0’的状态,状态机即会进入LoadPin的状态,接着再输入四个数字的密码,密码输入完毕按下“输入”按键,状态机即回到原先的idle状态。
在另一方面,当处于平时状态,有人进入门口要输入密码前,他也必需要按下另一个特殊键“密码输入”,表示之后输入的数字是待验证的密码,此时InData 信号会变成逻辑’0’,于是状态机进入InPin的状态。
状态机的设计与实现

状态机的设计与实现作者:zhsj 日期:2015-7-29在数字逻辑电路中,状态机是一个非常重要的概念,也是常用的一种结构,状态机常常用于序列检测、序列信号的产生以及时序产生等方面。
利用Verilog语言也可以编写出可综合的状态机,并有多种编写格式和编写原则,本文主要整理的是状态机的一般编写方法和形式,以及可综合的状态机的一些设计原则。
一、状态机的结构1.1 状态机的组成状态机是组合逻辑和寄存器逻辑的特殊组合,一般包括两个部分:组合逻辑部分和寄存器逻辑部分。
寄存器用于存储状态,组合电路用于状态译码和产生输出信号。
状态机的下一个状态及输出不仅与输入信号有关,还与寄存器当前状态有关,其基本要素有三个,即状态、输入和输出。
状态也叫做状态变量。
在逻辑设计中,使用状态划分逻辑顺序和时序规律。
例如,要设计一个交通灯控制器可以用允许通行、慢行和禁止通行作为状态;设计一个电梯控制器,每层就是一个状态等。
输入是指状态机中进入每个状态的条件。
有的状态机没有输入条件,其中的状态转移比较简单;有的状态机有输入条件,当某个输入条件存在时,才能转移到相应的状态。
例如,交通灯控制器就没有输入条件,状态随着时间的改变而自动跳转;电梯控制器是存在输入的,每层的上下按键,以及电梯内的层数选择按键都是输入,会对电梯的下一个状态产生影响。
输出是指在某一状态时特定发生的事件。
例如,交通灯控制器在允许通行状态输出绿色,缓行状态输出黄色,禁止通行状态输出红色;电梯控制器在运行时一直会输出当前所在的层数及当前运行的方向(上升或下降)。
1.2 状态机的分类根据输出是否与输入信号有关,状态机可以划分为Mealy型状态机和Moore型状态机两种;根据输出是否与输入信号同步,状态机可以划分为异步状态机和同步状态机两种。
由于目前的电路设计中以同步设计为主,所以本文只介绍同步状态机。
1.2.1 Mealy型状态机Mealy型状态机的输出同时依赖于当前的状态和输入信号,其结构如图1.1所示。
状态机程序设计

典型状态机设计由状态信号定义、准备下一状态进程、状态切换进程、输出进程等四部分构成。 【例6-1】用FPGA/CPLD控制AD574进行12位A/D转换,并将转换结果保存在Q0~Q11中
CE
CS
RC
X12/8
A0
工作状态
0
X
X
X
X
禁止
X
1
X
X
X
禁止
1
0
0
X
0
启动12位转换
状态信号定义:采用枚举数据类型定义系统中有哪些状态,并定义当前状态信号、下一状态信号。一般放在结构体的ARCHITECTURE和BEGIN之间。
在数字系统中,每一状态对应一个二进制数,称状态编码。如AD574控制有5个状态,可用3位二进制表示:(000、001、010、011、100)。
但设计者在状态机的设计中,为了更利于阅读、编译和VHDL综合器的优化,往往将表征每一状态的二进制数组用文字符号来代表,即所谓状态符号化。如(s0,sl,s2,s3,s4,s5),或者(READY,START,WAIT_H, WAIT_L ,READ, LOCK)等更直观的符号表示。
PROCESS(c_st,STATUS) --准备下一状态 BEGIN CASE c_st IS WHEN s0=>n_st<=s1; CE<=‘0’;RC<='0‘;LOCK<='0'; WHEN S1=>n_st<=s2; CE<=‘1’;RC<=‘0’;LOCK<='0‘; WHEN s2=>IF(STATUS='1') THEN n_st<=s3; ELSE n_st<=s2; END 1F; CE<=‘0’;RC<=‘0’;LOCK<=‘0’; WHEN s3=> IF(STATUS='1') THEN n_st<=s3; ELSE n_st<=s4; END 1F; CE<=‘0’;RC<=‘0’;LOCK<=‘0’; WHEN S4=>n_st<=s5;CE<=‘1’;RC<=‘1’;LOCK<=‘0’; WHEN S5=>n_st<=s0;CE<=‘1’;RC<=‘1’;LOCK<=‘1’; WHEN OTHERS=>n_st<=s0; CE<=‘0’;RC<=‘0’;LOCK<=‘0’; END CASE; END PROCESS;
如何设计自动驾驶系统的状态机

如何设计自动驾驶系统的状态机状态机模块在(自动驾驶)系统中扮演着关键的角色,它负责管理和控制各个功能的状态转换和行为执行。
今天我们来聊聊如何设计自动驾驶系统的状态机。
0.闲谈作为自动驾驶系统(工程师),从参与项目开始,就必不可少的与状态管理模块打交道,因为状态机在系统运行的全功能周期内起管理作用。
状态机这个模块,从技术实现角度来说,并没有什么难度,在网上有很多关于FSM(Fini(te)-state machine)的介绍文章,有兴趣可以自行了解。
但如何设计得巧妙、周到、精致,却很考验设计者的底蕴与对系统的理解。
大部分的(AD)AS功能都需要状态机进行状态管理,笔者手中就有不下十几份状态机的设计文档,包括FCW/LDW/AEB/(AC)C/LKA/NOP/APA/AVP等等,设计大相径庭,但细细想来内核却大同小异。
其中NOP功能的状态跳转还是比较复杂的,涉及横向、纵向控制与功能降级等逻辑,需要长期的雕琢与迭代才能设计出符合项目要求的效果。
笔者最近也在负责APA功能的状态机设计,虽然比较简单,但还是想借此机会对状态机模块做一点总结,也是对以往工作的回顾。
1.模块概述状态机模块的主要作用是跟踪系统的当前状态,并根据特定的事件和条件进行状态转换。
它可以根据(传感器)数据、车辆状态和系统输入来判断当前功能的可用性和执行条件。
状态机模块还能够监控系统的运行情况,及时响应来自驾驶决策或用户的指令,并根据需要触发相应的功能执行。
状态机模块通过定义和维护一组状态,以及状态之间的转换条件和行为,确保系统在不同的场景和条件下正确地执行相应的功能。
例如,当(检测)到前方车辆与本车距离过近时,FCW功能会被触发,状态机模块会根据预设的逻辑条件和行为来切换到相应的预警状态,并触发声音或振动等警示措施。
状态机模块的设计需要考虑各个功能之间的优先级、依赖关系和冲突情况。
它需要具备灵活性和可扩展性,以应对不同的道路情况和交通场景。
有限状态机设计

实验七有限状态机设计一、实验目的1、掌握利用有限状态机实现一般时序逻辑分析的方法;2、掌握用VHDL或Verilog编写可综合的有限状态机的标准模板;3、掌握用VHDL或Verilog编写序列检测器以及其他复杂逻辑电路的设计;二、实验内容1、用MOORE型状态机设计一个具有双向步进电动机控制实验:该控制电路有三个输入信号:clk时钟信号,clr复位信号,dir方向控制信号。
输出信号为phase[3..0]用来控制步进电机的动作。
当dir=1时要求phase[3..0]按照“0001”,“0010”,“0100”,“1000”的顺序变化;当dir=0时要求phase[3..0]按照“0001”,“1000”,“0100”,“0010”的顺序变化。
2、设计一个简单的状态机,功能是检测一个5位的二进制序列“10010”。
3、设计一个串行数据检测器,要求是:连续4个或4个以上为1时输出为1,其他输入情况为0。
(选做)4、根据状态图,写出对应于结构图b,分别由主控组合进程和主控时序进程组成的VERILOG 有限状态机描述。
(选做)三、实验步骤实验一:1、建立工程2、创建Verilog HDL文件3、输入程序代码并保存module moore1(clk,clr,dir,phase);input clk,clr,dir;output[3:0] phase;reg[3:0] phase;reg[1:0] state;parameter s0='b00,s1='b01,s2='b10,s3='b11;always@(posedge clk)beginif(clr)beginphase<='b0000;state<=s0;endelsebegincase(state)s0:if(dir) beginphase<='b0010;state<=s1;endelsebeginphase<='b1000;state<=s3;ends1:if(dir) beginphase<='b0100;state<=s2;endelse beginphase<='b0001;state<=s0;ends2:if(dir) beginphase<='b1000;state<=s3;endelse beginphase<='b0010;state<=s1;ends3:if(dir) beginphase<='b0001;state<=s0;endelse beginphase<='b0100;state<=s2;endendcaseendendendmodule4、进行综合编译5、新建波形文件6、导入引脚,设置信号源并保存7、功能仿真,结果分析由仿真波形图可以看出当dir=1时,phase[3..0]按照0001,0010,0100,1000的顺序变化,当dir=0时phase[3..0]按照0001,1000,0100,0010的顺序变化。
状态机设计的一般步骤

状态机设计的一般步骤
设计状态机的一般步骤包括以下几个方面:
1. 确定需求,首先,需要明确状态机的设计目的和应用场景,包括需要处理的输入和产生的输出,以及系统所需的各种状态和状态转换条件。
2. 状态定义,根据需求,确定系统可能具有的各种状态,包括起始状态、中间状态和最终状态,对每个状态进行清晰准确的定义和描述。
3. 事件识别,识别触发状态转换的各种事件,包括外部输入、定时器到期、条件满足等,对每个事件进行详细的描述和分类。
4. 状态转换,确定状态之间的转换条件和转换规则,包括事件触发的条件、转换动作和目标状态,确保状态转换的合理性和完整性。
5. 状态机实现,根据上述设计,进行状态机的实现和编码,可以采用各种编程语言或专门的状态机工具,确保状态机的正确性和
可靠性。
6. 测试验证,对设计的状态机进行全面的测试和验证,包括正常输入、异常输入和边界条件的测试,确保状态机在各种情况下都能正确运行并产生预期的结果。
7. 优化改进,根据测试结果和实际应用情况,对状态机进行优化和改进,包括性能优化、功能扩展和错误修复,确保状态机能够持续稳定地运行。
总之,设计状态机的一般步骤包括需求确定、状态定义、事件识别、状态转换、状态机实现、测试验证和优化改进,通过严谨的设计和实现过程,确保状态机能够准确可靠地反映系统的运行逻辑和行为规则。
《状态机程序设计》课件

02
状态机的实现方式
状态机的编程语言实现
编程语言选择
根据应用场景和需求,选择适合的编 程语言来实现状态机。常见的编程语 言如C、C、Java等都可以用来实现 状态机。
编程语言实现方法
使用条件语句(如if-else语句)或 switch语句来描述状态转移逻辑。可 以使用枚举类型或常量来定义状态, 使用变量来存储当前状态。
状态机的图形化工具实现
图形化工具介绍
使用图形化工具可以方便地设计状态 机,减少编程的工作量。常见的图形 化工具如Stateflow、Simulink等。
图形化工具实现方法
在图形化工具中,可以通过拖拽状态 和转移来构建状态机。通常图形化工 具会提供丰富的状态机元素和功能, 如状态转换、事件触发等。
状态机的硬件实现
03
状态转换明确
状态转换应具有明确的触发条件和执行动作。在状态机中,从一个状态
转换到另一个状态时,应清晰地定义转换条件、输入和输出以及相应的
处理逻辑。
状态机的设计技巧
使用子状态
当一个状态的内部行为复杂时,可以考虑将其拆分为子状态。 子状态可以进一步细化和描述该状态的内部行为和逻辑。
使用分层状态机
当一个系统具有多个层级或多个子系统时,可以考虑使用分层状 态机。上层状态机可以控制下层状态机的行为,而下层状态机负
案例三:交通信号控制系统的状态机设计
总结词
复杂、多因素控制
详细描述
交通信号控制系统涉及多个信号灯的状态转 换,如红、黄、绿等。通过状态机的设计, 可以实现对交通信号的精确控制,确保交通 流畅、安全。同时,需要考虑多种因素,如 车流量、行人流量等,以实现最优的状态转 换策略。
05
状态机设计的常见问 题与解决方案
简述状态机设计流程

简述状态机设计流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 确定状态机的功能和需求:明确状态机需要实现的任务和行为。
考虑输入、输出以及状态之间的转换条件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
集成电路实验
状态机设计实验报告
专业:电子信息工程
姓名:江燕婷
学号:2011301200025
状态机设计(实验五)实验报告
一.实验目的
1. 掌握状态机设计的基本方法
2.学习利用状态机的方法实现控制电路
二.实验原理
有限状态机(Finite State Machine FSM)是时序电路设计中经常采用的一种方式,尤其适合设计数字系统的控制模块,在一些需要控制高速器件的场合,用状态机进行设计是一种很好的解决问题的方案,具有速度快、结构简单、可靠性高等优点。
有限状态机非常适合用FPGA器件实现,用Verilog HDL的case
语句能很好地描述基于状态机的设计,再通过EDA工具软件的综合,一般可以生成性能极优的状态机电路,从而使其在执行时间、运行速度和占用资源等方面优于用CPU实现的方案。
有限状态机一般包括组合逻辑和寄存器逻辑两部分,寄存器逻辑用于存储状态,组合逻辑用于状态译码和产生输出信号。
根据输出信号产生方法的不同,状态机可分为两类:米里型(Mealy)和摩尔型(Moore)。
摩尔型状态机的输出只是当前状态的函数,如图1-1所示;米里型状态机的输出则是当前状态和当前输入的函数,如图1-2所示。
米里型状态机的输出是在输入变化后立即变化的,不依赖时钟信号的同步,摩尔型状态机的输入发生变化时还需要等待时钟的到来,必须在状态发生变化时才会导致输出的变化,因此比米里型状态机要多等待一个时钟周期。
图1-1 摩尔型状态机图1-2 米里型状态机
状态机在硬件描述语言实现上,可使用单过程、双过程或三过程等不同的结构实现。
状态机的状态实现上,可采用符号编码或显式数字编码。
编码方式有顺序编码(自然二进制编码),一位热码(one-hot encoding),格雷(gray code)码等。
顺序编码,简单状态寄存器占用少;一位热码输出译码电路简单;在状态顺序变化时,格雷码每次只有一位变化,避免产生输出信号毛刺。
三. 实验设备与软件平台
微型计算机,GW48-CK,QuartusII v5.0。
四.实验内容
(一)练习一
采用状态机moore机,110 检测状态图如下:设s0 为初始状态,s1 为检测到一个‘1’的状态,s2 为检测到连续两个‘1’的状态,s3 为检测到连续的‘110’状态。
图1-3 110序列检测器的状态转换图
假设监测器的输入、输出信号规定如下:
输入信号:复位reset,时钟clk,被测序列in;
输出信号:指示信号flag,‘1’表示测到110 序列,‘0’表示测到非110 序列。
当前状态state,‘00’、‘01’、‘10’、‘11’分别表示三种状态s0、s1、s2、s3。
用Verilog HDL实现的代码如图1-4所示。
图1-4 110序列检测器代码实现
该程序用两个always过程描述,一个过程用来描述现态和次态时序逻辑,另一个过程描述输出逻辑。
将程序用综合器生成,可以直观地观察到生成的状态图和状态表。
图1-5 110序列检测器状态机视图
图1-6 110序列检测器状态表
下面设计测试模块。
为了方便观察仿真结果,将当前状态satate设为输出信号,编写testbench代码如下,
图1-7 110序列检测器testbench代码
使用ModelSim软件得到仿真结果如图1-8所示,
图1-8 110序列仿真效果图
可以发现,ModelSim仿真结果与实验要求的状态转换情况相符,也与用Quartus II生成的State Machine Viewer状态相同。
在每次时钟上升沿到来时连续输入110,将输出一个高电平。
(二)练习二
设计一台饮料自动售卖机,要求如下:
图1-9
所有饮料价格均为30美分,投币值大于30美分时可以找零,有5美分和10美分找零币值。
设定售卖机的输入、输出信号规定如下:
输入信号:Q(投入25美分硬币)、D(投入10美分硬币)、N(投入5美分硬币);
输出信号:DC(分配一瓶饮料)、DD(找零10美分)、DN(找零5美分)。
GOT_5c、GOT_10c、GOT_15c、GOT_20c、GOT_25c、GOT_30c、GOT_35c、GOT_40c、GOT_45c、RETURN_50c表示投入的各种可能币值,RETURN_20c、RETURN_15c、RETURN_10c、RETURN_5c表示可能需要找零的币值。
因此该售卖机共有14个状态。
用Verilog HDL实现的代码如下。
图1-10-1
图1-10-2 图1-10-3
在Quartus II生成的状态机视图和状态表分别如下图所示。
图1-11 售货机状态机视图
图1-12 售货机状态表
设计测试模块,为方便观察结果,将state改为输出信号,编写testbench 代码如下。
图1-13 售卖机testbench代码
使用ModelSim软件得到仿真结果如图1-14所示,与实验要求的状态转换次序一致。
图1-14 售卖机仿真效果图
五.实验结果
实验验证结果与预期设想一致,具体如以上实验内容所示。
六.实验的收获与问题分析
1.在集成电路实验课中学会了使用Quartus II软件,学会了Verilog HDL 硬件语言的基本知识,了解了更多的关于EDA技术、FPGA器件和Verilog HDL 硬件描述语言的知识。
2.由于实验课每周只有一次,每次仅下午3个小时,在实验课上不能完成所有验证与设计实验,因此自己下载安装了Quartus II和ModelSim软件,借来了芯片型号为EP4CE6F17C8的FPGA板子,完成了剩余的硬件电路测试实验。
3.实验中还发现并解决了一些问题。
七.实验的问题分析
在验证110序列检测器时,一开始发现无法生成状态机视图,而程序的硬件实现与ModelSim仿真结果是正确的。
通过查询资料了解到,Quartus II中对状态机的设计有一些特别的规定,
如果不了解这些规定在设计的时候常常使人产生困惑。
编译器识别状态机的条件:
1.表现状态机的信号或变量必须为枚举类型;
2.状态转移必须由clk触发,并且是用if语句检测的上升沿进行转移;
3.状态转移到下一个状态由case语句判断;
4.所有信号,变量赋值都要放在状态机进程里进行。
5.状态机的状态必须多于两个状态。
为此,将原来结构为现态、次态+输出逻辑的程序改为现态+次态时序逻辑、输出逻辑结构的程序,从而满足状态转移都在一个由clk上升沿触发的always
块语句里,并且都用case语句判断状态转移。
同时要注意此时状态变量state
不能作输出端口。
修改后的程序最终可以在Quartus II上生成状态机视图与状态表。
令人奇怪的是,在售卖机的实验中仍为现态、次态+输出逻辑结构的程序却可以在Quartus II上生成状态机视图与状态表。
因此我到最后也没有完全明白问题的真正所在,不过可以确定的是,在需要生成状态图时,状态变量state 是不能用作输出端口的,若设定为output,则不能在在Quartus II上生成状态图,当需要在ModelSim上观察仿真结果时,再将state作为输出端口可以清楚地观察到实验现象。