【FPGA学习笔记】VL36 状态机-重叠序列检测
------------恢复内容开始------------
设计一个状态机,用来检测序列 1011,要求:
1、进行重叠检测 即10110111 会被检测通过2次
2、寄存器输出,在序列检测完成下一拍输出检测有效
注意rst为低电平复位
信号示意图:
波形示意图:
题目要求检测1011序列。重复序列检测状态机的难点是确定不同输入的情况下状态如何转移。根据波形,从左向右对序列进行匹配:
- S0: 初始状态,代表目前没有接收到满足要求的数据。
data==1
时,等于1011中的第一个数,进入S1状态;data==0
时,保持状态。 - S1:代表目前已经有了1个匹配的数据。
data==0
时,当前序列为10,等于1011中的前两个数,进入S2状态;data==1
时,当前序列为11,不是1011的前两个数,但1是1011的第一个数,所以保持S1状态。 - S2:代表目前已经有了2个匹配的数据。
data==1
时,当前序列为101,等于1011中的前三个数,进入S3状态;data==0
时,当前序列为100,不是1011的前两三个数,00、0都不能匹配,所以返回S0状态。 - S3:代表目前已经有了3个匹配的数据。
data==1
时,当前序列为1011,与要求序列匹配,进入S4桩体;data==0
时,当前序列为1010,与要求序列不配,010也不匹配,但10与1011的前两个数匹配,所以进入S2状态。 - S4:最终状态,代表目前已经得到了匹配的序列,并且在下个周期将
flag
拉高。data==0
时,当前序列为10110,10与要求序列的前两个数匹配,所以进入S2状态;data==1
时,当前序列为10111,只有最后一位的1匹配,所以进入S1状态。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
`timescale 1ns/1ns module sequence_test2( input wire clk , input wire rst , input wire data , output reg flag ); //*************code***********// parameter S0= 0 , S1= 1 , S2= 2 , S3= 3 , S4= 4 ; reg [ 2 : 0 ] state, nstate; always@(posedge clk or negedge rst) begin if (~rst) state <= S0; else state <= nstate; end always@(*) begin if (~rst) nstate <= S0; else case (state) S0 : nstate <= data? S1: S0; S1 : nstate <= data? S1: S2; S2 : nstate <= data? S3: S0; S3 : nstate <= data? S4: S2; S4 : nstate <= data? S1: S2; default : nstate <= S0; endcase end always@(posedge clk or negedge rst) begin if (~rst) flag <= 0 ; else flag <= state==S4; end //*************code***********// endmodule |