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