Mealy电路实现十字路口交通灯
源代码链接:http://download.csdn.net/detail/august717/8747577
使用Verilog语言完成十字路口交通灯的设计与实现。用2个手拨开关表示南北向和东西向通道的状态,6个led灯从左到右依次显示A路口红灯,A路口黄灯,A路口绿灯,B路口红灯,B路口黄灯,B路口绿灯,再用一个手拨开关实现复位(高电平有效)。
其中时钟分频为5秒,即每5秒检测一次路口状态,确定灯亮的下一状态。
原理
Mealy Machine:
说明: led[5:0] : A’red A’yellow A’green ; B’red, B’yellow, B’ green
t[1:0]: TA, TB
状态节点
状态 | 状态编码 | 状态输出 : |
INI (启动状态) | 0000 | 000_000 |
S1 | 0001 | 001_100 |
S2 | 0010 | 010_100 |
S3 | 0100 | 100_001 |
S4 | 1000 | 100_010 |
状态转化
TA TB
当前状态 | 下一状态 / 灯的输出
| |||
| 00 | 01 | 10 | 11 |
S1 | S2/010_100 | S2/010_100 | S1/001_100 | S1/001_100 |
S2 | S3/100_001 | S3/100_001 | S3/100_001 | S3/100_001 |
S3 | S4/100_010 | S3/100_001 | S4/100_010 | S3/100_001 |
S4 | S1/001_100 | S1/001_100 | S1/001_100 | S1/001_100 |
INI | S1/001_100 | S1/001_100 | S1/001_100 | S1/001_100 |
状态转化图
总结Moore电路和Mealy电路
Moore电路的状态结点就表示了输出。而Mealy电路的状态结点仅表示状态,输出在有向边上,和输入用斜杠区分,表示当前输出依赖于有向边的起点和并列的输入值。
一般来说根据实际问题可以灵活选择Moore或者Mealy状态机,看哪一种更接近实际问题的描述。
Mealy状态机在一些情况下会比等价的Moore状态机节点数少一些,但是本次实验交通灯并没有少。针对其他一些问题:
1、画出Moore状态机后可以直接列出表格,也可以进一步转化为Mealy状态机,只要把Moore机中下一状态的输出改变成Mealy机中当前状态的输出,然后再进一步列表格简化Mealy状态机。
2、画出Mealy状态机后可以直接列出表格,进行化简。也可以进一步转化为Moore状态机,只要把现时输出改变为下一时刻输出。当一个状态有多(n)个输出时,需要将该状态拆分为多(n)个状态。
e.g
Mealy型机转换为Moore型机
如上图所示,把Mealy型机转换为Moore型机,只要把现时输出改变为下一时刻输出。对于状态A,有4个箭头指向它,表示在当前状态下有4个状态可以转换为下一状态的A;同时当前输出均为0,可以把0移入状态A内部,表示在Moore机中状态A的输出为0。同理,可以把0分别移位B/C状态。但对于状态D,有两个箭头指向且具有不同的输出值,需要把状态D分解成两个状态D1和D2(每个状态对应一个输出,当输出不同需要利用不同的状态表示,这即是Moore机具有更多状态的原因),得到完整的Moore机状态模型。
同理,若把上图的Moore机转换为Mealy机,只要把Moore机中下一状态的输出改变成Mealy机中当前状态的输出,由于D1/D2两状态处于A/C两状态之间,且相当于A/C节点之间的一个等效节点,可以把D1/D2两状态合并为一个状态。
参考资料:
http://blog.sina.com.cn/s/blog_78699cbf01016mvt.html
http://www.eefocus.com/alvin1130/blog/12-01/236722_9a984.html