描述
设计一个状态机,用来检测序列 1011,要求:
1、进行重叠检测 即10110111 会被检测通过2次
2、寄存器输出,在序列检测完成下一拍输出检测有效
注意rst为低电平复位
信号示意图:
状态转移图的绘制
设置5个状态。
IDLE初始状态。data为1跳转到S0。 SOdata为0跳转到S1。data为1保持在S0状态。,S1data为1跳转到S2,data为0返回IDLE状态,S2状态data为1,跳转到S3data为0,跳转到S1状态. S3最终状态,表示检测到序列将flag拉高。data为0回到S1状态,data为1回到S0状态。
采用独热码编码,任何状态只有1bit为1,其余皆为0,编码密度低。
三段式状态机。 状态 状态转移条件(组合逻辑) 根据状态进行输出
module sequence_test2(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
parameter IDLE=5'b00001,S0=5'b00010,S1=5'b00100,S2=5'b01000,S3=5'b10000;
reg [4:0]state,next_state;
always@(posedge clk or negedge rst)
if(!rst)
state <= IDLE;
else
state <= next_state;
always@(*)
if(!rst)
next_state <= IDLE;
else
case(state)
IDLE: next_state <= data?S0:IDLE;
S0: next_state <= data?S0:S1;
S1: next_state <= data?S2:IDLE;
S2: next_state <= data?S3:S1;
S3: next_state <= data?S0:S1;
default: next_state <= IDLE;
endcase
always@(posedge clk or negedge rst)
if(!rst)
flag<=0;
else
flag <= state == S3;
//*************code***********//
endmodule
```