- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第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-1 State Machine 的建立
在这一节我们所举的例子是一个类似检查密码的设计,在一般办公室的门
口都会有门禁管制,进门前须先输入一组四个数字的密码,当密码确认无误后
门才会打开,除此之外还有更改密码的功用。我们先来看看其状态图。
在图14-2中一共有四个状态,一开始会维持在idle状态,当要更改或是
第一次输入密码时,需要按下一个特殊的“密码更改”按键,此时 InpinN信
号会变成逻辑 ’0’ 的状态,状态机即会进入LoadPin的状态,接着再输入四个数
字的密码,密码输入完毕按下“输入”按键,状态机即回到原先的idle状态。
在另一方面,当处于平时状态,有人进入门口要输入密码前,他也必需要按
下另一个特殊键“密码输入”,表示之后输入的数字是待验证的密码,此时InData
信号会变成逻辑’0’,于是状态机进入InPin的状态。在输入四个数字之后,一个
内部计数器会计数到3,这时状态机会进入CheckPin的状态。在CheckPin的状态
下会将输入值与密码做一比较,当数值相符时会在按下“输入”按键后,信号
nMatch会产生一短暂的逻辑 ’0’ ,这就能让门锁打开,若数值不符时,则信号
nMatch会一直维持在逻辑’1’的状态。
14-1-1 程序代码的撰写
接着我们来看看设计的声明,首先是使用到的 1ibrary 和 packages 的声明。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
前两行的声明我想已经不用多做解释了。第三行声明的原因是在后面我们
会使用到std_logic_arith package中的一个functionCONV_INTEGER,第四
行声明的原因是后面要做输入pin数目的计算,而这种计算只会是正值,所以要
声明使用ieee.std_logic_unsigned package。
在1ibrary的声明之后,接下来的是设计接口的声明,我们来看看这个设计
的entity声明。
entity PinCheck is
port(InD : in std_logic_vector(3 downto 0);
InPinN : in std_logic;
InData : in std_logic;
nMatch : out std_logic;
DEnter : in std_logic;
Reset : in std_logic
原创力文档


文档评论(0)