:::danger
对于时序逻辑电路而言,我们倾向于采用状态机的方式进行解决,当然也可以对逻辑表达式进行化简以后使用转移方式来解决。
:::
:::danger
分析:
初态为00状态,当输入为0,次态就是01状态并且输出0;
当输入为1,次态就是11状态并且输出0;
以此类推。在实际观察状态转换图的时候,要抓输出为1的状态:即如果现态是11状态,那么当输入为0的时候,次态就是00并且会输出1,当输入为1的时候,次态就是10且会输出1。
:::
FSM实例主要是三段式状态机,其写法可以参考:有限同步状态机
解答:
首先根据状态转换表绘制出状态转换图
`timescale 1ns/1ns
module seq_circuit(
input A,
input clk,
input rst_n,
output wire Y
);
reg [1:0] cur_state;
reg [1:0] nex_state;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cur_state <= 2'b00;
nex_state <= 2'b00;
end
else begin
cur_state <= nex_state;
end
end
always @(*) begin
case(cur_state)
2'b00 : nex_state = (A == 0)? 2'b01: 2'b11;
2'b01 : nex_state = (A == 0)? 2'b10: 2'b00;
2'b10 : nex_state = (A == 0)? 2'b11: 2'b01;
2'b11 : nex_state = (A == 0)? 2'b00: 2'b10;
default : nex_state = 2'b00;
endcase
end
assign Y = (cur_state == 2'b11)? 1:0;
endmodule