考虑一个用于控制某种电机的有限状态机。 FSM 有输入 和 来自电机,并产生输出 和 来控制电机。 还有一个称为 clk 的复位输入 resetn 

FSM 必须按如下方式工作。 只要复位输入被置位,FSM 就停留在 开始状态,称为状态 。 当复位信号被置低时,则在下一个时钟之后 边沿 FSM 必须将输出 为 1 持续一个时钟周期。 然后 ,FSM 必须监控 输入。 当 在三个连续的时钟周期中产生值 1、0、1 时, 应该 在下一个时钟周期设置为 1。 在保持 = 1 的同时,FSM 必须监控 输入。 如果 在最多两个时钟周期内为 1,则 FSM 应保持 = 1 永久(即,直到重置)。 但是如果 在两个时钟周期内没有变为 1,那么 FSM 应永久设置 = 0(直到复位)。

(最初的考试问题只要求提供状态图。但在这里,实现 FSM。)

module top_module (
    input clk,
    input resetn,    // active-low synchronous reset
    input x,
    input y,
    output f,
    output g
);
    parameter A=0,B=1,C=2,D=3,E=4,F=5,G=6,H=7,I=8;
    reg [3:0]state,nstate ;
    always@(posedge clk )
        if(~resetn)
            state<=A;
        else
            state<=nstate;
    always@(*)
        case(state)
            A:nstate=B;
            B:nstate=C;
            C:nstate=x?D:C;
            D:nstate=x?D:E;
            E:nstate=x?F:C;
            F:nstate=y?H:G;
            G:nstate=y?H:I;
            H:nstate=H;
            I:nstate=I;
        endcase
    assign f=(state==B);
    assign g=(state==F||state==G||state==H);
        endmodule

posted on 2022-06-23 10:43  USSTer  阅读(401)  评论(0)    收藏  举报