专栏前言
本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网
这是一个典型的米利型状态机。三段式即可解决。
米利型状态机:即输出不仅和当前状态有关,也和输入有关。 其中ST0,ST1,ST3的输出可以化简,化简后和C无关。 但是ST2的输出,需要判断输入C。
`timescale 1ns/1ns
module seq_circuit(
input C ,
input clk ,
input rst_n,
output wire Y
);
parameter ST0 = 2'b00 ;
parameter ST1 = 2'b01 ;
parameter ST2 = 2'b10 ;
parameter ST3 = 2'b11 ;
reg [1:0] cur_state ;
reg [1:0] nxt_state ;
reg Y_r ;
always @ (posedge clk or negedge rst_n) begin
if (!rst_n) cur_state <= ST0 ;
else cur_state <= nxt_state ;
end
always @ (*) begin
case (cur_state)
ST0 : begin
if (C == 1'b0) nxt_state <= ST0 ;
else nxt_state <= ST1 ;
end
ST1 : begin
if (C == 1'b0) nxt_state <= ST3 ;
else nxt_state <= ST1 ;
end
ST2 : begin
if (C == 1'b0) nxt_state <= ST0 ;
else nxt_state <= ST2 ;
end
ST3 : begin
if (C == 1'b0) nxt_state <= ST3 ;
else nxt_state <= ST2 ;
end
endcase
end
always @ (*) begin
case (cur_state)
ST0 : begin
Y_r <= 1'b0 ;
end
ST1 : begin
Y_r <= 1'b0 ;
end
ST2 : begin
if (C == 1'b0) Y_r <= 1'b0 ;
else Y_r <= 1'b1 ;
end
ST3 : begin
Y_r <= 1'b1 ;
end
endcase
end
assign Y = Y_r ;
endmodule