题目
设计一个状态机,用来检测序列 10111,要求:
1、进行重叠检测 即10110111 会被检测通过2次
2、寄存器输出,在序列检测完成下一拍输出检测有效
注意rst为低电平复位。
波形示意图:
输入输出描述:
信号 | 类型 | 输入/输出 | 位宽 | 描述 |
---|---|---|---|---|
clk | wire | Intput | 1 | 系统时钟信号 |
rst_n | wire | Intput | 1 | 异步复位信号,低电平有效 |
data | wire | Intput | 1 | 单比特串行输入数据 |
flag | reg | Output | 1 | 检测通过信号 |
答案
在题目中,要求使用状态机设计,也可以使用移位寄存器设计,下面我们分别给出了使用状态机进行序列检测与使用移位寄存器进行序列检测的代码。
`timescale 1ns/1ns
module sequence_test2(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
//状态机
reg r_flag;
reg [3:0] curr_state;
reg [3:0] next_state;
localparam S0 = 4'b0001,
S1 = 4'b0010,
S2 = 4'b0100,
S3 = 4'b1000;
always @(posedge clk or negedge rst)
if(!rst)
curr_state <= S0;
else
curr_state <= next_state;
always @(*)
case(curr_state)
S0: next_state = data ? S1 : S0;
S1: next_state = data ? S1 : S2;
S2: next_state = data ? S3 : S0;
S3: next_state = data ? S1 : S2;
default : next_state = S0;
endcase
always @(posedge clk or negedge rst)
if(!rst)
r_flag <= 1'b0;
else if(curr_state == S3 && data)
r_flag <= 1'b1;
else
r_flag <= 1'b0;
always @(posedge clk or negedge rst)
if(!rst)
flag <= 1'b0;
else
flag <= r_flag;
//移位寄存器
/*
reg [3:0] r_data;
always @(posedge clk or negedge rst)
if(!rst)
r_data <= 4'd0;
else
r_data <= {r_data,data};
always @(posedge clk or negedge rst)
if(!rst)
flag <= 1'b0;
else if(r_data == 4'b1011)
flag <= 1'b1;
else
flag <= 1'b0;
*/
//*************code***********//
endmodule