Verilog序列检测器-两例
2017-12-03 21:23
417 查看
1
序列检测器在数据通讯,雷达和遥测等领域中用与检测步识别标志。它是一种用来检测一组或多组序列信号的电路。例如检测器收到一组串行码{1110010}后,输出标志1,否则,输出0。考查这个例子,每收到一个符合要求的串行码就需要用一个状态进行记忆。串行码长度为7位,需要7个状态;另外,还需要增加一个“未收到一个有效位”的状态,共8个状态;S0~S7,状态标记符的下标表示有几个有效位被读出。
画出状态转换图,如图所示,很显然这是一个莫尔状态机。8个状态机根据编码原则可以用3位二进制数来表示。
module seq(in,out,state,clk,reset); input in,clk,reset; output out;output[2:0]state; reg[2:0]state;reg out; parameter s0='d0,s1='d1,s2='d2,s3='d3,s4='d4,s5='d5,s6='d6,s7='d7; always @(posedge clk) begin if(reset) begin state<=s0;out<=0;end else casex(state) s0:begin if(in==0) begin state<=s0;out<=0;end else begin state<=s1;out<=0;end end s1:begin if(in==0) begin state<=s0;out<=0;end else begin state<=s2;out<=0;end end s2:begin if(in==0) begin state<=s0;out<=0;end else begin state<=s3;out<=0;end end s3:begin if(in==0) begin state<=s4;out<=0;end else begin state<=s3;out<=0;end end s4:begin if(in==0) begin state<=s5;out<=0;end else begin state<=s1;out<=0;end end s5:begin if(in==0) begin state<=s0;out<=0;end else begin state<=s6;out<=0;end end s6:begin if(in==0) begin state<=s7;out<=1;end else begin state<=s2;out<=0;end end s7:begin if(in==0) begin state<=s0;out<=0;end else begin state<=s1;out<=0;end end default:state<=s0; endcase end endmodule
仿真图片
状态机处于S3状态时,若再输入一个“1”,为什么状态机仍停留在S3状态,而不是其他状态?
答:因为连续四个1了,而检测要求的是三个1;所以检测还是当作连续三个1来算。
2
设计一个“1001”串行数据检测器。使得但输出序列中出现“1001”时,结果中就输出1。输入/输出如下所示:输入x:000 101 010 010 011 101 001 110 101
输出z:000 000 000 010 010 000 001 000 000
初始状态设为s0,此时检测数据序列为“0000”,当再检测到一个0时,仍为s0,当检测到1时,进入下一个状态s1,此时序列为“0001”;当在状态s1检测到0时,进入到状态s2,此时序列为“0010”,当检测到1时,仍为s1;当在状态s2检测到0时,进入到状态s3,此时序列为“0100”,当检测到1时,进入s1;当在状态s3检测到0时,进入s0,当检测到1时,进入状态s4,此时序列为“1001”,结果输出为1;当在s4检测到0时,进入状态s2,当检测到1时,进入状态s1。状态图如下:
module sjjcq10_3(x,z,clk,reset,state); input x,clk,reset; output z; output[2:0]state; reg[2:0]state; reg z; parameter s0='d0,s1='d1,s2='d2,s3='d3,s4='d4; always@(posedge clk) begin if(reset)begin state<=s0;z<=0;end else casex(state) s0: begin if(x==0) begin state<=s0;z<=0;end else begin state<=s1;z<=0;end end s1: begin if(x==0) begin state<=s2;z<=0;end else begin state<=s1;z<=0;end end s2:begin if(x==0) begin state<=s3;z<=0;end else begin state<=s1;z<=0;end end s3:begin if(x==0) begin state<=s0;z<=0;end else begin state<=s4;z<=1;end end s4:begin if(x==0) begin state<=s2;z<=0;end else begin state<=s1;z<=0;end end default: state<=s0; endcase end endmodule
相关文章推荐
- Verilog语言——序列检测器
- 6-1 Verilog Mealy状态机之序列检测器
- 第一次verilog实验——序列检测器的实现
- verilog 有限状态机的小小实例演示及仿真——序列检测器
- [试验]10010序列检测器的三段式状态机实现(verilog)
- 10010序列检测器的三段式状态机实现(verilog)
- 10010序列检测器的verilog实现
- 三段式序列检测器的实现
- 状态机的应用之序列检测器的实现与仿真
- 序列检测器
- m序列的原理以及verilog实现
- 序列检测器
- 用verilog实现m序列生成
- FPGA之verilog第一天学习(00011101序列产生器)
- 序列检测器二
- m序列的verilog实现
- FPGA Verilog HDL 系列实例--------序列信号发生器
- 【温故而知新】【4】Verilog序列检测
- 序列检测器
- 序列检测器改编