FPGA学习笔记四:使用有限状态机解决输入序列判定的若干问题系列一(基于Verilog)

本文介绍如何使用Verilog实现两种序列检测器,包括简单的序列检测器和基于双状态机的序列检测器。前者针对特定输入序列设置不同标志位,后者通过状态机在输入s和w的控制下监测连续w输入。文章详细阐述了设计思路、代码实现及状态机验证。
摘要由CSDN通过智能技术生成


前言

本次博客主要基于HDLBits中关于两種不同难度的 序列识别电路 的实现的复盘,第一种序列识别器较为简单,通过理解其逻辑功能后就能够轻松实现;第二种识别检测器基于双状态机,即状态转移中需要考虑不只一種输入的影响,对于第二类题目,笔者提供了两種解决方案以供参考。


一:简单的序列检测器

题目:先上题目传送门(HDLBits中的一道练习题)☞序列识别器【By HDLBits】。本题要求对输入序列进行识别:当输入为0111110即只有五个1时,舍弃位(discard)要求被置高;当输入01111110即正正又六个1时,标志位(flag)被置高;当输入有七个或七个以上的1时,错误标志位(error)被置高。

1.设计思路

设计时,加上错误标志位的置位,一共有10个状态,因此可根据题目的逻辑要求画出状态转移图(如下):
在这里插入图片描述

要注意,当序列状态达到五个1且下一个输入为0时,此时舍弃位置一,即s8状态时disc = states8;当达到6个1且下一输入为零即状态s9时,标志位置高flag = states9;序列中出现7哥或以上的1即维持在s7时,错误标志位被置高,error = state==s7;

2.代码

根据上述整理出的设计思路编写代码:

module fsm_sequence_reg(clk,reset,in,disc,flag,err)
    input clk;
    input reset;    // Synchronous reset
    input in;
    output disc;
    output flag;
    output err;
    
    parameter s0=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,s7=7,s8=8,s9=9;
    reg [3:0]state,next_state;
    
    always @(posedge clk) begin
        if(reset)
            state <= s0;
        else 
            state <= next_state;
    end
            
    always @(*) begin
        case(state)
            s0:next_state = in?s1:s0;
            s1:next_state = in?s2:s0;
            s2:next_state = in?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值