三段式状态机:
状态寄存器 描述当前状态的状态寄存器:
always@(posedge clk or posedge areset)begin if(areset)begin current_state <= B; end else begin current_state <= next_state; end
状态转移条件判断 描述下一状态的状态寄存器:
always@(*)begin case(current_state) B:begin if(in == 1'b1)begin next_state = B; end else begin next_state = A; end end A:begin if(in == 1'b1)begin next_state = A; end else begin next_state = B; end end endcase end
状态输出 根据next_state进行状态输出:
always@(posedge clk or posedge areset)begin if(areset)begin out <= 1'b1; end else if(next_state == B)begin out <= 1'b1; end else begin out <= 1'b0; end end
Moore型状态机 Mealy型状态机
Moore型状态机 ,状态机的输出只与当前的状态有关。
Mealy型状态机的输出不仅与当前的状态有关,还与当前的输入有关。
检测序列1101
请用Moore型状态机实现序列“1101”从左至右的不重叠检测。
电路的接口如下图所示。当检测到“1101”,Y输出一个时钟周期的高电平脉冲。
module det_moore(
input clk ,
input rst_n ,
input din ,
output reg Y
);
// 定义状态变量 5个状态,第四个状态可以等价于第一个状态
// 采用独热码,每个状态只有一位表示
parameter S0 = 5'b00001,
S1 = 5'b00010,
S2 = 5'b00100,
S3 = 5'b01000,
S4 = 5'b10000;
//定义状态寄存器 state next_state
reg [4:0]state,next_state;
//三段式状态机
//当前状态寄存器描述
always@(posedge clk or negedge rst_n)
if(!rst_n)
state <= S0;
else
state <= next_state;
//下一状态的状态寄存器描述
always@(*)
case(state)
S0: next_state <= din?S1:S0;
S1: next_state <= din?S2:S0;
S2: next_state <= ~din?S3:S2;
S3: next_state <= din?S4:S0;
//为1,下一状态跳转到S1,否则跳转到S0
S4: next_state <= din?S1:S0;
default:next_state <= S0;
endcase
//状态输出
always@(posedge clk or negedge rst_n)
if(!rst_n)
Y <= 1'b0;
else if(state == S4)
Y <= 1'b1;
else
Y <= 1'b0;
endmodule