基于FPGA的序列检测器10010

时间:2023-03-09 15:00:31
基于FPGA的序列检测器10010

最近在学习状态机,用状态机实现序列检测器10010.

思路如下:

1. S0代表当前数据0,如果检测到0就停在S0,如果检测到1就进入S1。

2. S1代表当前数据1,如果检测到0就进入S2,如果检测到1就停在S1。

3. S2 代表数据10,如果检测到0就进入S3,如果检测到1就回到S1。

4. S3代表数据100,如果检测到0就回到S0,如果检测到1就进入S4。

5. S4代表数据1001,如果检测到0就进入S5,如果检测到1就回到S1。

6. S5代表数据10010,如果检测到0就回到S0,如果检测到1就进入S1。

状态机图如下:

基于FPGA的序列检测器10010

代码如下:

module Xulie(
input wire clk,
input wire rst_n,
input wire in,
output wire Bingo ); reg [:] state; parameter [:] S0 = 'b00_0001;
parameter [:] S1 = 'b00_0010;
parameter [:] S2 = 'b00_0100;
parameter [:] S3 = 'b00_1000;
parameter [:] S4 = 'b01_0000;
parameter [:] S5 = 'b10_0000; always @ (posedge clk or rst_n) begin
if(!rst_n)
state <= S0;
else case(state)
S0: begin
if(in == 'b1)
state <= S1;
else
state <= S0;
end
S1: begin
if(in == 'b0)
state <= S2;
else
state <= S1;
end
S2: begin
if(in == 'b0)
state <= S3;
else
state <= S1;
end
S3: begin
if(in == 'b1)
state <= S4;
else
state <= S0;
end
S4: begin
if(in == 'b0)
state <= S5;
else
state <= S1;
end
S5: begin
if(in == 'b0)
state <= S0;
else
state <= S1;
end default:
state <= S0; endcase
end assign Bingo = state == S5; endmodule

Testbench如下:

`timescale 1ns/1ns

module Tb_Xulie;

reg  clk, rst_n,in;
wire Bingo; initial begin
clk = ;
rst_n = ;
in = ;
#;
rst_n =;
end initial begin
#;
in = ;
#;
in = ;
#;
in = ;
#;
in = ;
#;
in = ;
#;
in = ;
#;
in = ;
#;
in = ;
#;
in = ;
#;
in = ;
#;
in = ;
#;
in = ;
#;
in = ;
#;
in = ;
#;
in = ;
end always # clk <= ~clk; Xulie Xulie_inst(
.clk (clk),
.rst_n (rst_n),
.in (in),
.Bingo (Bingo)
); endmodule

波形图如下:

基于FPGA的序列检测器10010