序列检测器

状态机序列检测

使用状态机检测“1101”,串行输入的测试序列为“11101101011010”,输出信号为valid有效信号,检测到时输出高,否则为低,考虑序列叠加情况,比如“1101101”,则有两个“1101”。

画出状态机:

状态机
状态机分moore机和mealy机,其中:

  • moore机的输出只与状态有关
  • mealy机的输出与当前状态和输入都有关
  • 体现在状态转移图上就是,moore机的输出在状态圆圈内,mealy机的输出在转移曲线上
  • moore完全描述状态转移图会比mealy机多一个状态
  • 体现在verilog代码中就是,moore机的最后输出逻辑只判断state,mealy机的输出逻辑中判断state && input

三段式FSM:

1
module seq_detect(
2
	input clk,
3
    input rst_n,
4
	input data_in,
5
    output reg valid
6
);
7
    // 定义状态,这里采用的独热码(One-Hot),FPGA中推荐用独热码和格雷码(Gray)
8
	// 状态较少时(4-24个状态)用独热码效果好,状态多时格雷码(状态数大于24)效果好
9
    parameter IDLE = 5'b00001;
10
    parameter s1 = 5'b00010;
11
    parameter s2 = 5'b00100;
12
    parameter s3 = 5'b01000;
13
    parameter s4 = 5'b10000;
14
    
15
    reg [4:0] current_state;
16
    reg [4:0] next_state;
17
    
18
    // 同步时序逻辑,描述状态转换
19
    always @(posedge clk) begin
20
        if(!rst_n) begin
21
           current_state <= IDLE; 
22
        end
23
        else begin
24
           current_state <= next_state; 
25
        end
26
    end
27
    
28
    // 组合逻辑,状态转移条件
29
    always @(*) begin
30
        if(!rst_n) begin
31
            next_state <= IDLE;
32
        end
33
        else begin
34
            case(current_state)
35
               IDLE: begin
36
                   if(data_in == 1) 
37
                       next_state <= s1;
38
                	else
39
                        next_state <= IDLE;
40
               end
41
               s1: begin
42
                   if(data_in == 1)
43
                       next_state <= s2;
44
                   else
45
                       next_state <= IDLE;
46
               end
47
               s2: begin
48
                   if(data_in == 0)
49
                       next_state <= s3;
50
                   else
51
                       next_state <= s2;
52
               end
53
               s3: begin
54
                   if(data_in == 1)
55
                       next_state <= s4;
56
                   else
57
                       next_state <= IDLE;
58
               end
59
               s4: begin
60
                    if(data_in == 1)
61
                        next_state <= s2;
62
                    else
63
                        next_state <= IDLE;
64
               end
65
               default: next_state <= IDLE;
66
           endcase
67
        end
68
    end
69
70
    // 同步时序逻辑,描述状态输出,摩尔状态机
71
    always @(posedge clk) begin
72
        if (!rst_n) begin
73
            valid <= 1'b0;
74
        end
75
        else begin
76
            case(current_state)
77
                s4: valid <= 1'b1;
78
                default: valid <= 1'b0;
79
            endcase
80
        end
81
    end
82
endmodule