有限状态机课程设计报告EDASodaMachine自动售货机.docx
《有限状态机课程设计报告EDASodaMachine自动售货机.docx》由会员分享,可在线阅读,更多相关《有限状态机课程设计报告EDASodaMachine自动售货机.docx(15页珍藏版)》请在冰豆网上搜索。
有限状态机课程设计报告EDASodaMachine自动售货机
1有限状态机
有限状态机(FiniteStateMachine)是一种具有内部记忆的抽象机器模型,是时序电路的一种,通过有限状态机课实现高效率高可靠逻辑控制。
根据输出与输入关系、系统状态的关系,有限状态机又可以分为Moore型有限状态机
和Mealy型有限状态机。
Moore型状态机的输出信号只于当前的状态有关;Mealy型状态机
是输出信号不仅与当前的状态有关,还与输入信号有关。
Mealy机的示意图如图二所示:
Mealy
图二Mealy机的示意图
Moore机的示意图如图三所示:
Moore
图三Moore机的示意图
Moore型有限状态机和Mealy型有限状态机的区别:
•在Moore机中,输出的时钟活动沿到达后的几个门电路的延迟时间之后即到达,并
且在该时钟周期的剩余时间内保持不变,即使输入在该时钟周期内发生变化,输出值也保持
不变。
然而,因为输出与当前的输入无关,当前输出产生的任何效果将延迟到下一个时钟周
期。
Moore机的优点是将输出与输入分隔开。
•在Mealy机中,因为输出是输入的函数,如果输入改变,则输出可以在下一个时钟周期的中间发生改变。
这使得Mealy机比Moore机,对输入变化的响应要早一个时钟周期,一旦输入信号或状态发生变化,输出信号随着输入信号变化。
•实现同样功能,Moore机要比Mealy机需要更多的状态。
通过分析本次实验,利用Mealy机更加容易理解,并且使用Moore会使用更多的状态,所以本次实验使用Mealy型有限状态机。
2SodaMachine机的设计
2.1SodaMachine机的状态转换图
SodaMachine机的状态转换图如图四所示。
SodaMachine
图四SodaMachine机的状态转换图
图中共有10个状态,为ST0—ST9。
在状态转换图中00代表无输入,11代表输入Q(25c),
10代表输入D(10c),01代表输入N(5c)。
在输出中000代表无输出,001代表输出DN(5C),010代表输出的DD(10C),100代表输出DC(1can)。
ST0是初始态。
当没有硬币投入时,状态机始终保持STO状态不变。
当投入5分(即
01)时,状态机跳转到ST1状态,无输出(即000);当投入10分时(即10),跳转到S2
状态,无输出(即000);当投入25分时(即11)跳转到S5状态,无输出(即000)。
ST1是有投入5分后的状态。
当没有硬币投入时,状态机始终保持ST1状态不变,无输出(即000);当投入5分(即01)时,状态机跳转到ST2状态,无输出(即000);当投入10分(即10)时,跳转到ST3状态,无输出(即000);当投入25分(即11)时,跳转到ST0状态,输出一瓶饮料(即100)。
ST2是投入10分后的状态。
当没有硬币投入时,状态机始终保持ST2状态不变,无输
出(即000);当投入5分(即01)时,状态机跳转到ST3状态,无输出(即000);当投入10分(即10)时,跳转到ST4状态,无输出(即000);当投入25分(即11)时,跳转到ST6状态,输出一瓶饮料(即100),在下一个时钟到来ST6再跳转到ST0,输出5分(即001)。
这样可保证每个时钟只输出一个(饮料或10分或5分)。
ST3是投入15分后的状态。
当没有硬币投入时,状态机始终保持ST3状态不变,无输
出(即000);当投入5分(即01)时,状态机跳转到ST4状态,无输出(即000);当投入10分(即10)时,跳转到ST5状态,无输出(即000);当投入25分(即11)时,跳转到ST7状态,输出一瓶饮料(即100),在下一个时钟到来ST7再跳转到ST0,输出10分(即010)。
输出正确,同样可保证每个时钟只输出一个(饮料或10分或5分)。
ST4是投入20分后的状态。
当没有硬币投入时,状态机始终保持ST4状态不变,无输
出(即000);当投入5分(即01)时,状态机跳转到ST5状态,无输出(即000);当投入10分(即10)时,跳转到ST0状态,输出一瓶饮料(即100);当投入25分(即11)时,跳转到ST8状态,输出一瓶饮料(即100),在下一个时钟到来ST8再跳转到ST6,输出10分(即010),在下一个时钟到来ST6再跳转到ST0,输出10分(即001)。
输出正确,同样可保证每个时钟只输出一个(饮料或10分或5分)。
ST5是投入25分后的状态。
当没有硬币投入时,状态机始终保持ST3状态不变,无输
出(即000);当投入5分(即01)时,状态机跳转到ST0状态,输出一瓶饮料(即100);当投入10分(即10)时,跳转到ST6状态,输出一瓶饮料(即100),在下一个时钟到来ST6再跳转到ST0,输出5分(即001);当投入25分(即11)时,跳转到ST9状态输出一瓶饮料(即100),在下一个时钟到来ST9再跳转到ST7,输出10分(即010),在下一个时钟到来ST7再跳转到ST0,输出10分(即010)。
输出正确,同样可保证每个时钟只输出一个(饮料或10分或5分)。
2.2SodaMachine机的状态分配与编码
2.2.1状态编码方式
在状态机的设计中,对状态编码有多种,常用编码的方式有:
有限状态机中常用的编码
主要有二进制编码、格雷码和One-Hot编码。
表1二进制编码、格雷码和One-Hot编码的比较
比较
二进制编码
格雷码编码
一位热码编码
触发器数量
少
少
多
时序条件
一般
好
最好
非法状态
少
少
多
译码电路
复杂
复杂
简单
F面是对这三种编码方式的仿真。
222—位热码编码方式
由一位热码编码形成的RTL如图五所示。
图五一位热码编码形成的RTL
2.2.2二进制编码方式
二进制编码代码为:
SIGNALCURRENT_STATE,NEXT_STATE:
STD_LOGIC_VECTOR(3DOWNTO0);
CONSTANTST0:
STD_LOGIC_VECTOR(3DOWNTO0):
="0000";
CONSTANTST1:
STD_LOGIC_VECTOR(3DOWNTO0):
="0001";
CONSTANTST2:
STD_LOGIC_VECTOR(3DOWNTO0):
="0010";
CONSTANTST3:
STD_LOGIC_VECTOR(3DOWNTO0):
="0011";
CONSTANTST4:
STD_LOGIC_VECTOR(3DOWNTO0):
="0100";
CONSTANTST5:
STD_LOGIC_VECTOR(3DOWNTO0):
="0101";
CONSTANTST6:
STD_LOGIC_VECTOR(3DOWNTO0):
="0110";
CONSTANTST7:
STD_LOGIC_VECTOR(3DOWNTO0):
="0111";
CONSTANTST8:
STD_LOGIC_VECTOR(3DOWNTO0):
="1000";
CONSTANTST9:
STD_LOGIC_VECTOR(3DOWNTO0):
="1001";
由二进制码形成的RTL如图六所示。
223格雷码编码方式
格雷码编码代码为:
SIGNALCURRENT_STATE,NEXT_STATE:
STD_LOGIC_VECTOR(3DOWNTO0);
CONSTANTST0:
STD_LOGIC_VECTOR(3DOWNTO0):
="0000";
CONSTANTST1:
STD_LOGIC_VECTOR(3DOWNTO0):
="0001";
CONSTANTST2:
STD_LOGIC_VECTOR(3DOWNTO0):
="0011";
CONSTANTST3:
STD_LOGIC_VECTOR(3DOWNTO0):
="0010";
CONSTANTST4:
STD_LOGIC_VECTOR(3DOWNTO0):
="0110";
CONSTANTST5:
STD_LOGIC_VECTOR(3DOWNTO0):
="0111";
CONSTANTST6:
STD_LOGIC_VECTOR(3DOWNTO0):
="0101";
CONSTANTST7:
STD_LOGIC_VECTOR(3DOWNTO0):
="0100";
CONSTANTST8:
STD_LOGIC_VECTOR(3DOWNTO0):
="1100";
CONSTANTST9:
STD_LOGIC_VECTOR(3DOWNTO0):
="1101";
由格雷码形成的RTL如图七所示:
从以上3个图可知:
采用一位热码编码,虽然这种方法的用的的触发器不是最少,但是
可以使次态逻辑变得简单,由于一般的可编程器件,触发器的比率高于组合逻辑,所以采用一位热码编码的系统占用的资源反而少于采用最少触发器的系统。
因此采用一位热码编码的
编码方式。
224对输入信号编码
两位二进制数对输入信号进行编码的RTL如图八所示,及00代表无输入,01代表输
入为5分,10代表输入10分,11代表输入25分。
图八两位二进制数对输入信号进行编码的RTL
三位二进制数对输入信号进行编码的RTL如图所示,及000代表无输入,001代表输
入为5分,010代表输入10分,100代表输入25分。
从上面的两个RTL图中可以看出,用两位二进制数对输入信号进行编码电路简单,并且完全避免的输入的非法状态,所以使用两位二进制数对输入信号进行编码。
2.3SodaMachine机状态最少化
状态最少化采用的方法一般是手动法,只有当两个状态在相同的输入条件下,有相同的次态和输出,那么这两个状态就可以合并,状态最少化是基于观察完成的。
2.3.1SodaMachine机状态转换及输出表
根据图写出状态转换及输出表,见表2。
表2SodaMachine机的状态转换及输出表
现态
相应转移条件下的次态
输出
状态名称
25美分
10美分
5美分
0美分
饮料
10美分
5美分
ST0
ST5
ST2
ST1
ST0
0
0
0
ST1
ST0
ST3
ST2
ST1
0
0
0
ST2
ST6
ST4
ST3
ST2
0
0
0
ST3
ST7
ST5
ST4
ST3
0
0
0
ST4
ST8
ST0
ST5
ST4
0
0
0
ST5
ST11
ST10
ST0
ST5
0
0
0
ST6
没有输入,次态为ST0
0
0
1
ST7
没有输入,次态为ST0
0
1
0
ST8
没有输入,次态为ST9
0
1
0
ST9
没有输入,次态为ST0
0
1
0
ST10
没有输入,次态为ST0
0
0
1
ST11
没有输入,次态为ST12
0
1
0
ST12
没有输入,次态为ST0
0
1
0
注:
ST2跳转到ST6的过程中,输出一瓶饮料;ST3跳转到ST7的过程中,输出一瓶饮料;ST4跳转到ST8的过程中,输出一瓶饮料;ST5跳转到ST6的过程中,输出一瓶饮料;ST5跳转到ST9的过程中,输出一瓶饮料。
2.3.2SodaMachine机的状态合并
根据上面的状态转换表及输出表,基于观察,发现st6、st10的次态转移和输出完全相
同,st7、st9、st12的次态转移和输出完全相同,因此可以将这几个状态进行合并,见表3。
表3合并状态st6和st10为st6,合并状态st7,st9、st12为st7
现态
相应转移条件下的次态
输出
状态名称
25美分
10美分
5美分
0美分
饮料
10美分
5美分
ST0
ST5
ST2
ST1
ST0
0
0
0
ST1
ST0
ST3
ST2
ST1
0
0
0
ST2
ST6
ST4
ST3
ST2
0
0
0
ST3
ST7
ST5
ST4
ST3
0
0
0
ST4
ST8
ST0
ST5
ST4
0
0
0
ST5
ST9
ST6
ST0
ST5
0
0
0
ST6
没有输入,次态为ST0
0
0
1
ST7
没有输入,次态为ST0
0
1
0
2.4SodaMachine机的VHDL语言
2.4.1实体设计
ENTITYSodaIS
PORT(CLK,RESET:
INSTD_LOGIC;--时钟、复位信号
STATE_INPUTS:
INSTD_LOGIC_VECTOR(0TO1);--输入信号
COMB_OUTPUTS:
OUTSTD_LOGIC_VECTOR(0TO2));--输出信号
ENDSoda;
2.4.2结构体设计(部分代码)
TYPESTATESIS(ST0,ST1,ST2,ST3,ST4,ST5,ST6,ST7,ST8,ST9);--定义数据
类型
SIGNALCURRENT_STATE,NEXT_STATE:
STATES;--将现态和次态定义为新的数据类型
REG:
PROCESS(CLK,RESET)
BEGIN
IFRESET='1'THENCURRENT_STATE<=ST0;
ELSIFCLK'EVENTANDCLK='1'
THENCURRENT_STATE<=NEXT_STATE;
ENDIF;
ENDPROCESS;
COM:
PROCESS(CURRENT_STATE,STATE_INPUTS)
VARIABLECOMB_OUTPUTS2:
STD_LOGIC_VECTOR(0TO2);
BEGIN
CASECURRENT_STATEIS
WHENST0=>
IFSTATE_INPUTS="00"
THENNEXT_STATE<=ST0;COMB_OUTPUTS2:
="000";
ELSIFSTATE_INPUTS="01"
THENNEXT_STATE<=ST1;COMB_OUTPUTS2:
="000";
ELSIFSTATE_INPUTS="10"
THENNEXT_STATE<=ST2;COMB_OUTPUTS2:
="000";
ELSENEXT_STATE<=ST5;COMB_OUTPUTS2:
="000";
ENDIF;
2.5SodaMachine机的RTL描述
图十SodaMachine的RTL描述
2.6SodaMachine在QuartusII中形成的状态转图
SodaMachine在QuartusII中形成的状态转图如图^一所示。
2.7SodaMachine的时序仿真
SodaMachine的时序仿真图如图十二所示:
)庐EO.J酩】il0咋河0as珈』nsM〔0us100.0us5E0.0皿珈0咔?
20.Cm800.0能
n.KSr.5
图十二SodaMachine的时序仿真图
时序逻辑说明:
复位信号后,状态为ST0;连续来两个时钟,每次输入25分,第四个
时钟输出一瓶饮料,第五个时钟输出10分,第六个时钟输出10分。
符合逻辑设计要求。
SodaMachine的时序仿真图如图十三所示:
图十三SodaMachine的时序仿真图
10分,即共输入35分,第四个时钟输出一瓶饮料,第五个时钟输出5分。
每个时钟输出
个,符合逻辑设计要求。
3结束语
通过本次实验,对EDA技术和VHDL语言有了更深的了解和认识,会利用QuartusII对
设计电路进行功能仿真、时序仿真和优化,掌握了设计有限状态机的方法。