Verilog使用有限状态机实现对特定序列的识别

目的

使用Moore状态机完成对一输入序列的检测,当输入序列中有1011的特征时,输出一个时钟周期的高电平。举例如下:
如果输入的序列为:

0001_0110_1011_0111_0010_1010_1101_0000_1011_1101_1000_0010_1101_1011_0011...

则输出的序列为:

0000_0010_0001_0010_0000_0000_0100_0000_0001_0000_1000_0000_0100_1001_0000...

实现

1 detect_serial_fsm.v
        根据设计需求,需要识别序列中出现的1011这一特定序列,使用Moore状态机来描述过程。那么可以设定:
        当输入为1,从闲置态到达状态1;若输入为0则停留在闲置态。
        在状态1若输入0,到达状态2;若为1则停留在状态1。
        在状态2若输入为1,进入状态3;否则进入闲置态。
        在状态3若输入为1进入状态4;否则返回状态2.
        在状态4若输入为1,返回状态1,否则回到状态2,只有状态4产生输出1,且两种情况都输出1.
        以上结果是在实验了几次最初画的状态图发现问题之后做出的。主要是考虑了返回时到达的状态。接下来主要说明判断识别返回的分支,由于判断的序列是1011,
        来到状态1时,已经输过了1。此时若为1则出现11的序列,对比1011,只能重新从1开始识别,故回到状态1已经输过1的状态。
        来到状态2时,已经输过10.此时若为0,则出现100序列,对比1011,只能从闲置态重新开始。
        来到状态3时,已经输过101。若此时输入为0,则为1010,对比1011,只能从状态2(已经输过10)重新开始.
        来到状态4时,已经输过1011。若此时输入1,则为10111,返回到状态1;若输入为0,已有10110对比1011回到状态2.
        综上画出状态机如图:
fsm1.2
思路完成,根据思路,设计代码如下(采用三段式写法):

module detect_serial_fsm(
    input               clk_i,
    input               rst_i,
    input               signal_i,
    output  reg         detected_o,
    output  [4:0]       curent_state_o //为观察方便ÿ
  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值