状态机序列检测
使用状态机检测“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 |