题解 | #根据状态转移写状态机-三段式#
https://www.nowcoder.com/practice/d8394a6d31754e73ace8c394e9465e2a
`timescale 1ns/1ns
module fsm1(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
parameter s0 = 3'b000;
parameter s1 = 3'b001;
parameter s2 = 3'b010;
parameter s3 = 3'b100;
reg [2:0] cs,ns;
always@(posedge clk or negedge rst) begin
if(!rst) cs<='b0;
else cs<=ns;
end
always @(*) begin
case (cs)
s0: ns=data ? s1:s0;
s1: ns=data ? s2:s1;
s2: ns=data ? s3:s2;
s3: ns=data ? s0:s3;
default: ns = s0;
endcase
end
always @(posedge clk or negedge rst) begin
if(!rst) flag<=0;
else if((cs==s3)&&data) flag<=1;
else flag<=0;
end
//*************code***********//
endmodule
module fsm1(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
parameter s0 = 3'b000;
parameter s1 = 3'b001;
parameter s2 = 3'b010;
parameter s3 = 3'b100;
reg [2:0] cs,ns;
always@(posedge clk or negedge rst) begin
if(!rst) cs<='b0;
else cs<=ns;
end
always @(*) begin
case (cs)
s0: ns=data ? s1:s0;
s1: ns=data ? s2:s1;
s2: ns=data ? s3:s2;
s3: ns=data ? s0:s3;
default: ns = s0;
endcase
end
always @(posedge clk or negedge rst) begin
if(!rst) flag<=0;
else if((cs==s3)&&data) flag<=1;
else flag<=0;
end
//*************code***********//
endmodule