上一节的第一个小问题的答案:Q = CLK*D+~CLK*Qprev (根据D Latch的定义)可以很直观的看出这是一个D Latch的实现 真值表: 时序图:
问题2的答案 就是熟悉一下定义 是时序同步回路的是d e g 注意c那个CLK输入的地方缺了一个三角号,所以只能是一种Latch而不是寄存器。而h由于反向器延迟导致两个寄存器时钟不一致。
下面正式进入FSM。这里为了使大家能够深入的理解FSM,先从例子讲起,最后在说一说定义神马的。
好了,我们用最土的例子(最土就是最经典,虽然实际上没有用!!但是所有的理论都在其中)--交通指挥灯的设计需求为例子。
就是国内某城市的一个交叉路口。图中黑圈内的是路灯感应器也就是感应是否有车通过,T代表Traffic,例如当人民大街有车通过时标记为Tb没有车的时候标记为~Tb,输出为True或者 false。而路灯(其实应该是交通灯)La,Lb,Lc,Ld均可以显示黄,红,绿(yellow red green)三种颜色,并且黄到红之间转变要等待5秒钟黄灯等待5秒必须转变到红灯,也就可以说上一个状态有黄灯下一个状态就必须有红灯。然后路灯们接受每5s感应器扫描一次传过来的信号来决定自己应该显示的颜色。(当然一定要有一个Reset,这样会让所有的灯进入就绪状态)
。。。出学者们看了这个需求有些慌张,这么多参数,怎么设计?!别慌,问题是要解决,难度还在那里。我们把需求整理一下,--画图!就如同之前一直在画的真值表一样。我们是菜鸟,所以用笨招,列举所有可能!
我来带大家走一遍:
首先为了打字方便 用 S+数字 表示State(例如 S0表示处于状态0),Reset=初始化。其次,我们来计算有几种状态。灯一共有3种颜色,什么都不考虑当然有9种状态。但是很明显两条路不能同时绿灯,红灯,黄灯(注意这里不是现实里的设计,现实是可以的),并且黄灯不能和绿灯同时出现!(想一想黄灯是慢行。。。)总状态就有 9 - 3 - 2 = 4.下面进行具体分析:
1.初始状态: 就假设大镜路可以通车吧。 即 La:绿灯(Green),~Lb:红灯(Red),处于 Reset 状态
S0 : La:绿灯(Green),~Lb:红灯(Red)
S1 : La:黄灯(Green),~Lb:红灯(Red)
S2 : La:红灯(Green),~Lb:绿灯(Red)
S3 : La:红灯(Green),~Lb:黄灯(Red)
2.上面1的5种状态就是我们需求分析的总状态咯。现在我们来看状态之间转移需要什么条件。比如我们现在处于S1,那么应该无条件的进入S2状态。而如果处于S2状态时,当Tb为真时仍然应该处于S2状态,反之应该进入S3状态。。。。好多转移。。。
感觉有些晕菜?画图列表!把所有的转移条件和状态标出来。
。不懂得童鞋们认真仔细看。箭头自然就是表示状态之间的自然转移。话说这就是所谓的 状态转移图 估计在UML图里经常用到吧。
3.有了这个图,就不用废话了。进行之前讲的一些列机械操作,列真值表!把图翻译成二进制码。这里鉴于是初学者,分几步进行制表。第一,先考虑我们需要什么表。当然了,肯定要有一张状态转移的表,表明态和态之间的关系。第二,我们当然需要一个输出表,表明状态机运行的结果
先看第一张表:
Current State 就是当前状态,Next State 就是下一个状态,Inputs就是根据Sensor的输入作为State转移的依据。X的定义和以前一样,代表什么都行。下面当然要对S0之类的字母进行编码咯(人为地赋予二进制的意义)。为了方便直接采用2进制编码:S0状态 00, S1状态 01, S2状态10, S3状态11.(自己列表!)然后上面的表就可以变成:
。下一步,制作输出表L就代表路灯。也就是相当于把路灯的State翻译成了二进制数!
有了这些,还等神马~~两张表两张图,画起!这里先留给大家想一想怎么用FF实现这两张表。锻炼脑力~~
用户403664 2013-11-22 11:47