module module_name( // Defines the input signal // Defines the output signal as reg --To reduce the probability of Matastable State input sys_clk, input areset, input in, output reg out );
parameter A = 1'b0; parameter B = 1'b1;
// Define intermediate signal as reg --To reduce the probability of Matastable State reg state;
always @(posedge clk or posedge areset) begin if (areset) begin state <= B; out <= 1'b1; end
else begin case( state ) B:begin if( in == 1'b1 ) begin state <= B; out <= 1'b1; end
else begin state <= A; out <= 1'b0; end end
A:begin if( in <= 1'b1 ) begin state <= A; out <= 1'b0; end end
default:begin state <= B; out <= 1'b1; end
endcase end end
endmodule
二段式状态机设计
`timescale 1ns / 1ps
module module_name( // Defines the input signal // Defines the output signal as reg --To reduce the probability of Matastable State input sys_clk, input areset, input in, output reg out );
parameter A = 1'b0; parameter B = 1'b1; // Define intermediate signal as reg --To reduce the probability of Matastable State // reg state; reg current_state; reg next_state;
always @(posedge clk or posedge areset) begin if (areset) begin current_state <= B; end
else begin current_state <= next_state; end end
always @ (*) begin case( current_state ) B:begin if( in == 1'b1 ) begin next_state = B; end
else begin next_state = A; end out = 1'b1; end
A:begin out = 1'b0; if( in == 1'b1 ) begin next_state = A; end
else begin next_state = B; end out = 1'b0; end endcase end
endmodule
三段式状态机
`timescale 1ns / 1ps
module module_name( // Defines the input signal // Defines the output signal as reg --To reduce the probability of Matastable State input sys_clk, input areset, input in, output reg out );
parameter A = 1'b0; parameter B = 1'b1;
// Define intermediate signal as reg --To reduce the probability of Matastable State // reg state; reg current_state; reg next_state;
always @(posedge sys_clk or posedge areset) begin if (areset) begin current_state <= B; end
else begin current_state <= next_state; end end
always @ (*) begin case( current_state ) B:begin if( in == 1'b1 ) begin next_state = B; end
else begin next_state = A; end // out = 1'b1; end
A:begin out = 1'b0; if( in == 1'b1 ) begin next_state = A; end
else begin next_state = B; end // out = 1'b0; end endcase end
always @( posedge sys_clk or negedge areset ) begin if ( areset ) begin out <= 1'b1; end