设计一个用于识别2进制序列“1011”的状态机

实验:设计一个用于识别2进制序列“1011”的状态机
基本要求:
电路每个时钟周期输入1比特数据,当捕获到1011的时钟周期,电路输出1,否则输出0
使用序列101011010作为输出的测试序列
扩展要求:
给你的电路添加输入使能端口,只有输入使能EN为1的时钟周期,才从输入的数据端口向内部获取1比特序列数据。
设计思路:
要得到“1011”序列,从最低位开始匹配,匹配成功就跳转到下一状态,继续匹配下一位,如果匹配不成功就返回到0状态重新开始匹配。
注意加上使能信号后,只有当EN = 1时才可以将输入数据进行匹配。
状态输入逻辑值
在这里插入图片描述
状态转换图
在这里插入图片描述
输出逻辑值
在这里插入图片描述
识别2进制序列“1011”的状态机代码

module state_machine_1011(
  CLK	,
  RST	,
  IN	,
  EN	,
  OUT   );
  
input  CLK	; 
input  RST  ; 
input  EN	;
input  IN   ; 
output OUT  ;

parameter ST_0 = 0;
parameter ST_1 = 1;
parameter ST_2 = 2;
parameter ST_3 = 3;
parameter ST_4 = 4;

reg [2-1:0]stateR       ;
reg [2-1:0]next_state   ;
reg        OUT          ;

//calculate next_state
always @ (IN or EN or stateR) begin
  case (stateR)
    ST_0 :begin if(IN == 0 && EN == 0) next_state = ST_0 ; else if (IN == 0 && EN == 1) next_state = ST_0 ;else if (IN == 1 && EN == 0) next_state = ST_1 ;else if (IN == 1 && EN == 1) next_state = ST_1 ; end
    ST_1 :begin if(IN == 0 && EN == 0) next_state = ST_1 ; else if (IN == 0 && EN == 1) next_state = ST_2 ;else if (IN == 1 && EN == 0) next_state = ST_1 ;else if (IN == 1 && EN == 1) next_state = ST_1 ; end
    ST_2 :begin if(IN == 0 && EN == 0) next_state = ST_2 ; else if (IN == 0 && EN == 1) next_state = ST_0 ;else if (IN == 1 && EN == 2) next_state = ST_1 ;else if (IN == 1 && EN == 1) next_state = ST_3 ; end
    ST_3 :begin if(IN == 0 && EN == 0) next_state = ST_3 ; else if (IN == 0 && EN == 1) next_state = ST_2 ;else if (IN == 1 && EN == 0) next_state = ST_3 ;else if (IN == 1 && EN == 1) next_state = ST_4 ; end
    ST_4 :begin next_state = ST_0 ; end
  endcase 
end

//calculate output
always @ (stateR) begin
  if(stateR == ST_4) 
     OUT = 1'b1;
  else 
     OUT = 1'b0;
end

// state DFF
always @ (posedge CLK or posedge RST)begin
  if(RST)
    stateR <= ST_0;
  else
    stateR <= next_state;
end

endmodule

识别2进制序列“1011”的状态机时序仿真图
在这里插入图片描述

通过观察时序仿真图可知:
若输入信号为101011010时,当使能端EN= 1,状态机能够正常输出序列1011;
当使能端EN= 0时,由于不能识别输入信号状态机会保持原状态不变,直到使能信号 EN= 1才继续读数。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值