题解 | #根据状态转移图实现时序电路#

根据状态转移图实现时序电路

https://www.nowcoder.com/practice/e405fe8975e844c3ab843d72f168f9f4

`timescale 1ns/1ns

module seq_circuit(
   input                C   ,
   input                clk ,
   input                rst_n,
 
   output   wire        Y   
);

parameter s1 = 4'b0001;
parameter s2 = 4'b0010;
parameter s3 = 4'b0100;
parameter s4 = 4'b1000;

reg  [3:0]statue;
reg       y_reg;

always@(posedge clk or negedge rst_n)
    if (rst_n == 1'b0)
        statue <= s1;
    else 
        case(statue)
            s1 : if (C == 1'b1)
                        statue <= s2;
                else if(C == 1'b0)
                        statue <= s1;
            s2 : if(C == 1'b1)
                        statue <= s2;
                else if(C == 1'b0)
                        statue <= s3;
            s3 : if (C == 1'b1)
                        statue <= s4;
                else if(C == 1'b0)
                        statue <= s3;
            s4 : if (C == 1'b1)
                        statue <= s4;
                else if(C == 1'b0)
                        statue <= s1;
            default : statue <= s1;
        endcase

always@(*)
    if (rst_n == 1'b0)
        y_reg <= 1'b0;
    else if (statue == s3)
        y_reg <= 1'b1;
    else if (statue == s4 && C == 1'b1)
        y_reg <= 1'b1;
    else 
        y_reg <= 1'b0;

assign Y = y_reg;

endmodule

这里采用二段式状态机进行解题,第一段为状态赋值块,第二段是输出赋值块。

(个人认为二段式比三段式好理解一点)

全部评论

相关推荐

头像
10-15 22:27
已编辑
门头沟学院 C++
罗格镇的小镇做题家:我投了hr打电话来说学历太低了不符合要求,建议投荣耀,结果荣耀也投了一定水花没有,非本211硕
投递华为等公司10个岗位
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务