基于FPGA的序列检测器10010
2019-04-20 13:26 江南夜色下的小桥屋檐 阅读(1839) 评论(0) 编辑 收藏 举报最近在学习状态机,用状态机实现序列检测器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。
状态机图如下:
代码如下:
module Xulie( input wire clk, input wire rst_n, input wire in, output wire Bingo ); reg [5:0] state; parameter [5:0] S0 = 6'b00_0001; parameter [5:0] S1 = 6'b00_0010; parameter [5:0] S2 = 6'b00_0100; parameter [5:0] S3 = 6'b00_1000; parameter [5:0] S4 = 6'b01_0000; parameter [5:0] S5 = 6'b10_0000; always @ (posedge clk or rst_n) begin if(!rst_n) state <= S0; else case(state) S0: begin if(in == 1'b1) state <= S1; else state <= S0; end S1: begin if(in == 1'b0) state <= S2; else state <= S1; end S2: begin if(in == 1'b0) state <= S3; else state <= S1; end S3: begin if(in == 1'b1) state <= S4; else state <= S0; end S4: begin if(in == 1'b0) state <= S5; else state <= S1; end S5: begin if(in == 1'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 = 0; rst_n = 0; in = 0; #100; rst_n =1; end initial begin #210; in = 1; #20; in = 1; #20; in = 0; #20; in = 0; #20; in = 1; #20; in = 0; #20; in = 1; #20; in = 1; #20; in = 0; #20; in = 1; #20; in = 0; #20; in = 0; #20; in = 1; #20; in = 0; #20; in = 1; end always #10 clk <= ~clk; Xulie Xulie_inst( .clk (clk), .rst_n (rst_n), .in (in), .Bingo (Bingo) ); endmodule
波形图如下: