序列检测1011?重复检测&非重复检测
请设计一个检测序列为1011的检测电路?
序列检测一般采用状态机实现。状态机一般采用三段式状态机实现。
重复检测 即在 1011011011 中检测 三次
非重复检测 即在 1011011011 中检测 两次
序列检测示意:
非重复检测 状态转移图
重复检测 状态转移图
设计代码和激励代码如下:
module state( input sys_clk , input sys_rst_n , input in , output reg flag ); //独热码定义状态 parameter S0 = 5'b00001; //初始状态 parameter S1 = 5'b00010; //1 parameter S2 = 5'b00100; //10 parameter S3 = 5'b01000; //101 parameter S4 = 5'b10000; //1011 reg [4:0] c_state; reg [4:0] n_state; //状态机的第一段采用同步时序描述状态转移 always@(posedge sys_clk or negedge sys_rst_n) begin if(!sys_rst_n) c_state<=S0; else c_state<=n_state; end //状态机的第二段采用组合逻辑判断状态转移条件 always@(*) begin case(c_state) S0 : begin if(in==1'b1) n_state<=S1; else n_state<=S0; end S1 : begin if(in==1'b0) n_state<=S2; else n_state<=S0; end S2 : begin if(in==1'b1) n_state<=S3; else n_state<=S0; end S3 : begin if(in==1'b1) n_state<=S4; else n_state<=S2; end S4 : begin if(in==1'b1) n_state<=S0; //n_state<=S1; /* 不重复检测 在输入为1 跳转S0,重复检测跳转至S1 */ else n_state<=S0; /*不重复检测 在输入为0 跳转S0 */ //n_state<=S2; /*重复检测跳转至S2*/ end default : n_state<=S0; endcase end //状态机的第三段描述状态输出(这里采用时序电路输出) always@(posedge sys_clk or negedge sys_rst_n) begin if(!sys_rst_n) flag<=1'b0; else if(c_state==S4) flag<=1'b1; else flag<=1'b0; end endmodule
`timescale 1ns/1ns module tb_state(); reg sys_clk ; reg sys_rst_n ; reg in ; wire flag ; initial begin sys_clk<=1'b0; sys_rst_n<=1'b0; in<=1'b0; #20 sys_rst_n<=1'b1; #20 in<=1'b1; //模拟序列输入 #20 in<=1'b0; #20 in<=1'b1; #20 in<=1'b1; #20 in<=1'b0; #20 in<=1'b1; #20 in<=1'b1; #20 in<=1'b1; #20 in<=1'b0; #20 in<=1'b1; #20 in<=1'b1; #20 in<=1'b0; #20 in<=1'b1; #20 in<=1'b1; #20 in<=1'b0; #20 in<=1'b1; #20 in<=1'b1; #20 in<=1'b0; #20 in<=1'b1; #20 in<=1'b1; #20 in<=1'b0; #20 in<=1'b1; #20 in<=1'b1; #20 in<=1'b1; #20 in<=1'b1; #20 in<=1'b0; #20 in<=1'b1; #20 in<=1'b0; #20 in<=1'b1; #20 in<=1'b1; #20 in<=1'b0; #20 in<=1'b0; #20 in<=1'b1; #20 in<=1'b0; #20 in<=1'b1; #20 in<=1'b0; #20 in<=1'b0; #20 in<=1'b1; end always #10 sys_clk<=~sys_clk; state state_inst( .sys_clk (sys_clk ) , .sys_rst_n (sys_rst_n) , .in (in ) , .flag (flag ) ); endmodule
非重复检测波形图:
在输入为10110111011 序列下 检测到两次目标序列
重复检测波形图:
在输入为10110111011 序列下 检测到三次目标序列
若有不对的地方,敬请指正,万分感谢。
参考资料:1、(117条消息) IC/FPGA校招笔试题分析(四)再看Moore状态机实现序列检测器_摩尔状态机1011序列检测器_李锐博恩的博客-CSDN博客