:::danger 对于时序逻辑电路而言,我们倾向于采用状态机的方式进行解决,当然也可以对逻辑表达式进行化简以后使用转移方式来解决。 ::: image.png :::danger 分析:
    初态为00状态,当输入为0,次态就是01状态并且输出0;
    当输入为1,次态就是11状态并且输出0;
    以此类推。在实际观察状态转换图的时候,要抓输出为1的状态:即如果现态是11状态,那么当输入为0的时候,次态就是00并且会输出1,当输入为1的时候,次态就是10且会输出1。 ::: FSM实例主要是三段式状态机,其写法可以参考:有限同步状态机
    解答:
    首先根据状态转换表绘制出状态转换图
    3.1 根据状态转移表实现时序电路 - 图2

    1. `timescale 1ns/1ns
    2. module seq_circuit(
    3. input A,
    4. input clk,
    5. input rst_n,
    6. output wire Y
    7. );
    8. reg [1:0] cur_state;
    9. reg [1:0] nex_state;
    10. always @(posedge clk or negedge rst_n) begin
    11. if(!rst_n) begin
    12. cur_state <= 2'b00;
    13. nex_state <= 2'b00;
    14. end
    15. else begin
    16. cur_state <= nex_state;
    17. end
    18. end
    19. always @(*) begin
    20. case(cur_state)
    21. 2'b00 : nex_state = (A == 0)? 2'b01: 2'b11;
    22. 2'b01 : nex_state = (A == 0)? 2'b10: 2'b00;
    23. 2'b10 : nex_state = (A == 0)? 2'b11: 2'b01;
    24. 2'b11 : nex_state = (A == 0)? 2'b00: 2'b10;
    25. default : nex_state = 2'b00;
    26. endcase
    27. end
    28. assign Y = (cur_state == 2'b11)? 1:0;
    29. endmodule

    image.png