有限状态机是Verilog中十分基本也是十分重要的知识。本文对有限状态机做了一个简单介绍。

1.状态机三要素

  有限状态机具有三个要素:状态跳转、跳转判断、状态操作;

  1)状态跳转:现态跳转到次态;

  2)跳转判断:状态跳转的判断条件;

  3)状态操作:状态对应的操作;

2.状态机的实现方式

  1)一段式:状态机三要素集成于一个 always 块中。

     always@(posedge clk or negedge rst_n)
    begin
      if(!rst_n)begin
        state <= 'b00;
        Qout <= 'b0;
      end
      else case(state)
        'b00: begin
          if(A)begin
            state <= 'b01;
            Qout <= 'b1;
          end
          else begin
            state <= 'b00;
            Qout <= 'b0;
          end
        end
        'b01: begin
          if(!A)begin
            state <= 'b00;
            Qout <= 'b0;
          end
          else begin
            state <= 'b01;
            Qout <= 'b1;
          end
        end
        default:;
      endcase
    end

FMS_ONE

  2)二段式:状态机三要素分别设计于两个 always 块。

     always@(posedge clk or negedge rst_n)
    begin
      if(!rst_n)
        state <= 'b00;
      else case(state)
        'b00: begin
          if(A)
            state <= 'b01;
          else
            state <= 'b00;
        end
        'b01: begin
          if(!A)
            state <= 'b00;
          else
            state <= 'b01;
        end
        default:;
      endcase
    end always@(posedge clk or negedge rst_n)
    begin
      if(!rst_n)
        Qout <= 'b0;
      else case(state)
        'b00: Qout <= 1'b0;
        'b01: Qout <= 1'b1;
        default:;
      endcase
    end

FMS_TWO

  3)三段式:状态机三要素分别于三个 always 块。

FMS_THREE

     always@(posedge clk or negedge rst_n)//状态跳转
    begin
      if(!rst_n)
current_state <= 'b00; //复位
      else
current_state <= next_state//在时钟上升沿刷新现状态
    end always@(current_state) //跳转判断
    begin
case(current_state)
'b00:begin
if(A)
next_state = 'b01;
else
next_state = 'b00;
end
'b01:begin
if(!A)
next_state = 'b00;
else
next_state = 'b01;
end
default:;
    end always @ (*) //状态操作
begin
case(current_state)
'b00:Qout <= 1'b0;
'b01:Qout <= 1'b1;
default:;
endcase
end

3.状态机设计要求

  1)根据设计需求选择合适的风格;

  2)case语句中都应加入default语句;

  3)巧加DFF中继,提高可靠性;

  4)课采用独热编码、格雷码设计状态;

  5)记得采用全局复位;

【基本知识】FMS有限状态机设计的更多相关文章

  1. kafka知识体系-kafka设计和原理分析

    kafka设计和原理分析 kafka在1.0版本以前,官方主要定义为分布式多分区多副本的消息队列,而1.0后定义为分布式流处理平台,就是说处理传递消息外,kafka还能进行流式计算,类似Strom和S ...

  2. HDMI接口基础知识及硬件设计

    参考资料:http://blog.csdn.net/u013625961/article/details/53434189: http://blog.csdn.net/u014276460/artic ...

  3. kafka知识体系-kafka设计和原理分析-kafka文件存储机制

    kafka文件存储机制 topic中partition存储分布 假设实验环境中Kafka集群只有一个broker,xxx/message-folder为数据文件存储根目录,在Kafka broker中 ...

  4. kafka知识体系-kafka设计和原理分析-kafka leader选举

    kafka leader选举 一条消息只有被ISR中的所有follower都从leader复制过去才会被认为已提交.这样就避免了部分数据被写进了leader,还没来得及被任何follower复制就宕机 ...

  5. kafka知识体系-kafka设计和原理分析-消息传递语义

    消息传递语义 消息传递保障 本节讨论Kafka如何确保消息在producer和consumer之间传输.有以下三种可能的传输保障(delivery guarantee): At most once: ...

  6. JAVA核心技术I---JAVA基础知识(常量设计和常量池)

    一:常量---一种不会修改的变量 –Java没有constant关键字 –不能修改,final –不会修改/只读/只要一份,static –方便访问publicJava中的常量 –public sta ...

  7. UI设计初学者教程:色彩基础知识

    编辑:千锋UI设计 初学设计都会先认识三原色,通常我们说的三原色指的是颜料三原色:红.黄.蓝:其实三原色还有色光三原色:红.绿.蓝.我们通常说的红黄蓝就是减色法三原色,而红绿蓝是加色法三原色.可能这么 ...

  8. 得到知识服务app原型设计比较与实践

    一.几种原型设计工具的比较 墨刀 优点: 拥有PC端.手机端.网页版,让你随时随地可以进行产品原型设计: 其定位是主要用于设计移动APP原型,其控件的拖拉.大小的调整,都会自然去匹配相应的母版大小,非 ...

  9. 至芯FPGA培训中心-1天FPGA设计集训(赠送FPGA开发板)

    至芯FPGA培训中心-1天FPGA设计集训(赠送开发板) 开课时间2014年5月3日 课程介绍 FPGA设计初级培训班是针对于FPGA设计技术初学者的课程.课程不仅是对FPGA结构资源和设计流程的描述 ...

随机推荐

  1. File Browser文件资源服务器

    要是想一键启动的,这里有个封装版本的,上传到服务器,执行sh命令就能直接启动,也可以修改配置 链接:https://pan.baidu.com/s/1oVP5DrEQSV9hQmnF2bzM9A提取码 ...

  2. Mercurial 的hook使用

    1. Handling repository events with hooks可以通过Mercurial版本管理工具提供的hooks机制来处理repo的各种事件,从而实现对Mercurial的扩展, ...

  3. C复习---动态内存分配

    原型extern void *malloc(unsigned int num_bytes);头文件#include <stdlib.h>#include <malloc.h>函 ...

  4. 冰多多团队-第八次Scrum例会

    冰多多团队-第八次Scrum会议 工作情况 团队成员 已完成任务 待完成任务 zpj debug, IAT debug, IAT 牛雅哲 将语音部分迁移到IatDemo上,去将科大讯飞的语音听写dem ...

  5. 分析 Kaggle TOP0.1% 如何处理文本数据

    感觉大佬的代码写的就是好,在处理数据的方面,首先定义一个 提取特征的类, class Extractor(object):,然后每一种方法对这个类进行重构,这个类主要结构就是: class Extra ...

  6. 修改 ulimit 时 需要注意的问题

  7. CentOS7.6 X64搭建mysql服务

    1.官方安装文档 http://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/ 2.下载 Mysql yum包 http://dev.mysql.co ...

  8. 使用ssh-keygen生成私钥和公钥

    1.使用ssh-keygen生成私钥和公钥 命令如下: ssh-keygen -t rsassh-keygen -t rsa -C "用户名自取"可以是邮箱 例子: fdipzon ...

  9. 运维笔记--线上服务器git环境配置

    场景描述: 我们采用git去管理代码分支,本地开发环境,线上服务器多数情况下也会使用git去管理程序代码,那么新的一台服务器,如果指定了目标路径作为代码存放路径,该如何配置git环境, 以达到跟远程服 ...

  10. JDBC操作数据库工具类(使用阿里Druid原生API创建数据源)

    1.数据库配置类 package com.zdlt.auth.api.common.druid; import java.util.Properties; import static com.alib ...