题解 | #根据状态转移表实现时序电路#
根据状态转移表实现时序电路
https://www.nowcoder.com/practice/455c911bee0741bf8544a75d958425f7
根据题目的状态表可知,此题的解答需要采用状态机,所以可以选用三段式状态机,需要注意的是,输出没有延时,所以在第三段的时候,状态应该是nex_state,不能是cur_state,不然会存在一个延时一拍 `timescale 1ns/1ns module seq_circuit( input A , input clk , input rst_n, output wire Y ); localparam Zero = 2'b00; localparam One = 2'b01; localparam Two = 2'b10; localparam Thre = 2'b11; reg Y_temp; assign Y = Y_temp; reg [1:0] cur_state; reg [1:0] nex_state; always@(posedge clk or negedge rst_n) begin if(!rst_n) cur_state <= Zero; else cur_state <= nex_state; end always@(*) begin nex_state = One; case(cur_state) Zero : nex_state = (A) ? Thre : One; One : nex_state = (A) ? Zero : Two; Two : nex_state = (A) ? One : Thre; Thre : nex_state = (A) ? Two : Zero; default : nex_state = One; endcase end always @(posedge clk or rst_n) begin if(!rst_n) Y_temp <= 1'b0; else begin case(nex_state) //这里需要注意的是,必须填写nex状态,因为,这个是时序逻辑,会存在延时一拍的现象,所以下个状态是他,那么下个时钟的cur就是它,那么刚好就能输出下面的非阻塞赋值,因为他也存在延时一拍的现象 Zero : Y_temp <= 1'b0; One : Y_temp <= 1'b0; Two : Y_temp <= 1'b0; Thre : Y_temp <= 1'b1; endcase end end endmodule