题目要求:
用 M e a l y \rm Mealy Mealy型状态机验证 1101 1101 1101序列
题目描述:
使用状态机验证 1101 1101 1101序列,注意:允许重复子序列。
方法一: 去掉 M o o r e \rm Moore Moore的 s 4 s_4 s4,然后将最后一个always的条件改成*。
module mealy_1101(input clk,input clr,input din,output reg dout);reg [2 : 0] curr, next;//状态保存parameter temp = 3'd0, s1 = 3'd1, s2 = 3'd2, s3 = 3'd3;always @ (posedge clk) beginif (clr) curr = temp;else curr = next;endalways @ (*) begincase(curr)temp: next <= din ? s1 : temp;//闲置状态s1: next <= din ? s2 : temp;//已有一个1的状态,再得到一个1进s2,得到0则进闲置s2: next <= din ? s2 : s3;//已有11的状态,再得到1进s2,得到0进s3s3: next <= din ? s1 : temp;//已有110的状态,再得到一个1进s4,得到0进闲置endcaseend//状态转移always @ (*) beginif (clr) dout <= 0;else dout <= ((curr == s3) ? 1 : 0);endendmodule
方法二:
上文已经说过,使用 n n n个触发器为能解决所有问题的通用解法,那么对于具体问题,我们能否使用更少的触发器实现呢?
答案是可以的
以 1101 1101 1101序列为例
使用 3 3 3个 D D D触发器,则在现态为 110 110 110,输入为 1 1 1时输出 1 1 1
输出方程改为 c o u t = \rm cout = cout= q 2 q_2 q2 & q 1 q_1 q1 & ~ q 0 q_0 q0 & x x x;
删除 q 3 q_3 q3,此即为 M e a l y \rm Mealy Mealy型电路
module mealy_1101(input clk,input clr,input din,output dout);reg q2 = 0, q1 = 0, q0 = 0; always @ (posedge clk or posedge clr) beginif (!clr) beginq0 <= din;q1 <= q0;q2 <= q1;endelse beginq0 <= 0;q1 <= 0;q2 <= 0;endendassign dout = (({q2, q1, q0, din} == 4'b1101) ? 1 : 0);
endmodule
方法三:
总结:
M o o r e \rm Moore Moore型电路的特点是现态即输出,意思是只有现态影响输出,输入只影响状态转移。
而 M e a l y \rm Mealy Mealy型电路的输出不仅与现态有关,还与输入有关。