基于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。

状态机图如下:

 

代码如下:

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) beginif(!rst_n)state <= S0;else case(state)S0:  beginif(in == 1'b1)state <= S1;elsestate <= S0;endS1:  begin if(in == 1'b0)state <= S2;elsestate <= S1;endS2:  beginif(in == 1'b0)state <= S3;elsestate <= S1;endS3:  beginif(in == 1'b1)state <= S4;elsestate <= S0;endS4:  beginif(in == 1'b0)state <= S5;elsestate <= S1;endS5:  beginif(in == 1'b0)state <= S0;elsestate <= S1;end         default:state <= S0;endcase
endassign Bingo = state == S5;endmodule

 

Testbench如下:

`timescale 1ns/1nsmodule Tb_Xulie;reg  clk, rst_n,in;
wire Bingo;initial beginclk     = 0;rst_n   = 0;in      = 0;#100;rst_n   =1;
endinitial 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;
endalways #10 clk <= ~clk;Xulie Xulie_inst(.clk       (clk),.rst_n     (rst_n),.in        (in),.Bingo     (Bingo)
);endmodule

 

 

波形图如下:

 

转载于:https://www.cnblogs.com/rickyli/p/10740684.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部