有限状态机是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. nginx.conf 配置解析之 server配置

    server{} 包含在http{}内部,每一个server{}都是一个虚拟主机(站点) 以下为nginx.conf配置文件中server{  }部分的内容. server { listen ; // ...

  2. 在vb.net中使用委托:经理 和 员工

    现在开发的一个 vb.net系统,其中有两个窗体:alert窗体和 case窗体. 在alert窗体中列出了当前可以操作的若干个alert(可以理解为数据记录),用户可以选择将其中一个或几个alert ...

  3. lintcode-828. 字模式

    题目描述: 828.字模式 给定一个模式和一个字符串str,查找str是否遵循相同的模式.这里遵循的意思是一个完整的匹配,在一个字母的模式和一个非空的单词str之间有一个双向连接的模式对应. 样例 给 ...

  4. 第9期《jmeter接口自动化实战》零基础入门!

    2019年 第9期<jmeter接口自动化实战>课程,12月6号开学! 上课方式:QQ群视频在线教学 本期上课时间:12月6号-1月18号,每周五.周六晚上20:00-22:00 报名费: ...

  5. Node.js之判断字符串中是否包含某个字符串

    server.txt内容如下: 阿里云服务器 关于应用场景,就不多说了,字符串是不论是后端开发还是前端开发等,都是要经常打交道了. test.js(node.js代码,只要被本地装了node.js环境 ...

  6. NSIS安装或卸载时检查程序是否正在运行

    转载:https://www.cnblogs.com/z5337/p/4766415.html 转载:https://www.gongzi.org/nsisbuildqqstop.html 转载:ht ...

  7. vue---父子组件之间的通信【props,$refs、$emit】

    在用vue进行项目开发的时候,父子组件之间的通信是经常被用到的,下面就来具体说说父子组件通信的三种方式: 父组件: <template> <div> <h1>我是父 ...

  8. scrapy入门案例

    一. 新建项目(scrapy startproject) 在开始爬取之前,必须创建一个新的Scrapy项目.进入自定义的项目目录中,运行下列命令: scrapy startproject scrapy ...

  9. Java学习-059-Jsoup爬虫获取中国所有的三级行政区划数据(四),生成相应的 JSON 数据并输出

    还是直接上马,对应的源码如下所示: 生成的三级行政区划部分 JSON 数据如下所示:

  10. Python3基础 print %xX 十六进制大小写

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...