数字逻辑电路——时钟状态机 (verilog)

设计一个具有一个输入X、一个复位输入信号RET和一个输出Z的时钟同步状态机(时钟输入clk),Z=1的条件:连续4个时钟脉冲触发沿X的值为1010。否则Z输出为0。
(1)画出状态图、列出状态表。(2)确定最少使用几个D触发器(3)写出状态分配表(4)写出状态方程、激励法方程和输出方程(5)画出电路图(6)用verilog代码实现并写出测试模块

(1) 状态图和状态表如下:

状态图

状态表如下:

状态XRET下一状态Z
S0S00
S10S20
S21S30
S30S40
S41S50
S50S60
S61S70
S70S81
S80S20

其中,S0为初始状态,RET为复位输入信号,Z为输出信号,'next state'表示下一状态。

(2) 最少需要3个D触发器来实现。

(3) 状态分配表如下:

当前状态/ZD2D1D0
S0/0000
S1/0001
S2/0010
S3/0011
S4/0100
S5/0101
S6/0110
S7/1111
S8/0001

(4) 状态方程、激励函数、输出方程如下:

状态方程:D2=RET&Z&(D1)&(D2)|(RET&(~Z)&D1&D2);

激励函数:D1=X;

输出方程:Z=(D2&(D1)&D0&(RET));

(5) 电路图如下:

电路图

(6) Verilog代码如下:

module state_machine(input clk, input X, input RET, output reg Z);
    reg [2:0] D;
    always @(posedge clk) begin
        if (RET) begin
             D <= #1 3'b0;
             Z <= #1 0;
        end else begin
            D[2] <= #1 RET&Z&(~D[1])&(~D[2]) | (RET&(~Z)&D[1]&D[2]);
            D[1] <= #1 X;
            Z <= #1 D[2]&(~D[1])&D[0]&(~RET);
            D[0] <= #1 D[1];
        end
    end
endmodule

测试模块:

module testbench;
    reg clk, X, RET;
    wire Z;

    state_machine uut(clk, X, RET, Z);

    initial begin
        clk = 0;
        X = 0;
        RET = 1;
        #1 RET = 0;
        #1 RET = 1;
        #1 RET = 0;
        #1 RET = 1;
        #1 RET = 0;
        #1 RET = 1;
        #1 RET = 0;
        #1 RET = 1;
        #1 RET = 0;
        #1 RET = 1;
        #1 RET = 0;
        #1 RET = 1;
        #1 RET = 0;
        #1 RET = 1;
        #1 RET = 0;
        #1 RET = 1;
        #1 RET = 0;
        #1 RET = 1;
        #1 RET = 0;
        #1 RET = 1;
        #1 RET = 0;
        #1 $finish;
    end

    always #10 clk = ~clk;

endmodule