verilog之状态机设计

1、状态机的原理

状态机,就是基于状态变化而设计的硬件模块,是一种常见的设计思路。掌握状态机的使用,是初步建立复杂逻辑设计能力的开始。所谓的状态机,和高级语言程序的流程图十分类似,具有逐步执行,步步递进的特点。由于硬件的特殊性,一般的状态机都是闭环的,要求能够回到初始状态。状态机就是硬件流程图,将并行执行的硬件结构通过时序控制转化为有效地顺序执行。

这一点体现在verilog中就是状态机通过一个状态块和一个条件块,将高级语言中的逐步特性短暂地建立于硬件中,是设计者可以有效地分析信号当前处于的区域。简而言之,状态机就是C语言中的while(1),不断地执行不同状态下的模块功能。当然,设计的语句比较复杂,实现每条语句的方法也是需要采用模块化设计。这里和软件上的设计思路还是有所区别的。

个人理解,状态机的作用是有效地减少了设计者在信号转化过程中需要不断考虑的时序问题,以及在条件转化中的约束问题。由于状态的限定,使得条件约束变得简单。当然,对于熟练的硬件设计者来说,自定义条件约束也是可以实现的。

2、状态机的组成

状态机由三部分组成:状态、驱动和输出。状态,这就不用多说,就是状态机名字的由来。通过数字或者其他标识,将每一段时间区分于一个状态。驱动,就是状态变化的条件。这个是状态机设计的关键。一般在设计状态机前会先绘制关系图,目的就是明确驱动。至于输出,就是根据状态区分条件从而达到控制输出的目的。

首先看一下状态的声明。一般而言,状态只需要有现在状态和下一状态,通过组合逻辑关联即可实现。最简单的就是状态1的下一状态为状态2,状态2的下一状态为状态1。采用组合关联而非时序关联,主要是减少时序冗余和可能的状态自锁。时序冗余好理解,组合逻辑总是比时序逻辑用的资源少。时序自锁,也就是状态延时变化可能导致的问题。比如前面的简单状态转化。在1->2时,现状态转化为2,在现状态保持2的第一个周期内,下一状态还是2,这就导致状态一直处于2.当然,这只是一个极端的情况。

至于驱动,就是根据每个状态下的条件判断出状态的变化。常用的有某信号出现高电平、某计数器计时到位、多个信号复杂条件等。驱动的最稳妥的方法就是画出状态图,以防遗漏。

输出,就是将运行成功的状态机的状态转化为标准的控制信号。这里的输出和单纯使用时钟外加控制线的方式输出的优势在于可以自动区分条件。比如,在状态1中的控制条件只会作用于状态1,而不会影响其他状态。这好比认为构建了一个局部条件。在信号越来越复杂的情况下,局部条件显然具有重要的优势。在设计比较大的模块时,随着信号变化的区分度越来越高,单纯使用转化信号来控制是困难的。

一般的状态机的写法也是基于这三部分来写的,可以合并。计数器可以认为是三合一的状态机,只不过大部分人只会使用计数到达或者计数不足两个状态,所以就直接合并在一起。对于直接输出状态的设计而言,只需要两个部分即可。

3、状态机的作用

在学习硬件设计时,状态机无疑是重要的一环。掌握状态机的设计,可以从逻辑思维过渡到硬件分析。掌握状态机,才能逐步地接触到硬件设计中的组合与时序的转化。可以说,状态机是组合逻辑和时序逻辑的标准搭配,如同集成电路中的CMOS单元一样基础。学习了状态机,就可以初步的了解状态和时序的搭配方法,为后面更为复杂的设计打下基础。

verilog之状态机的更多相关文章

  1. Verilog 加法器和减法器(7)

    在计算机中浮点数 表示通常采用IEEE754规定的格式,具体参考以下文章. https://www.cnblogs.com/mikewolf2002/p/10095995.html 下面我们在Veri ...

  2. 目标反射回波检测算法及其FPGA实现(准备篇): 用Verilog-HDL状态机控制硬件接口

    基于FPGA的目标反射回波检测算法及其实现(准备篇) :用Verilog-HDL状态机控制硬件接口 前段时间,开发了一个简单的目标反射回波信号识别算法,我会分几篇文章分享这个基于FPGA的回波识别算法 ...

  3. FSM之三--代码风格

    FSM设计之一http://www.cnblogs.com/qiweiwang/archive/2010/11/28/1890244.html Moore型状态机与mealy型状态机相比,由于其状态输 ...

  4. (原创)Verilog三段式状态机

    下面以上图一个简单的FSM说明三段式Verilog状态机范式: `timescale 1ns / 1ps module FSM( clk,rst_n, in1,in2, out1,out2, CS,N ...

  5. i2c状态机方法设计-verilog

    2010-09-05 21:04:00 verilog语言基础学的差不多了.接着就是看看华为的语言编写规范.状态机设计方法是fpga的重要设计方法.所以我要记上一笔. 只要会FSM方法,用fpga编写 ...

  6. 10010序列检测器的三段式状态机实现(verilog)

    序列检测器是时序数字电路设计中经典的教学范例,夏宇闻的<verilog数字系统设计教程>一书中有这个例子,用verilog设计一个“10010”序列的检测器.看完后我觉得F和G两个状态多余 ...

  7. 状态机的Verilog写法

    “硬件设计很讲究并行设计思想,虽然用Verilog描述的电路大都是并行实现的,但是对于实际的工程应用,往往需要让硬件来实现一些具有一定顺序的工作,这就要用到状态机思想.什么是状态机呢?简单的说,就是通 ...

  8. FPGA 状态机-序列检测器verilog

    实现功能:检测出串行输入数据4位Data二进制序列0101,当检测到该序列的时候,out=1,否则out=0 (1)给出状态编码,画出状态图 (2)门电路实现 (3)verilog实现 首先规定Q3Q ...

  9. Verilog学习笔记设计和验证篇(四)...............状态机的置位与复位

    1)状态机的异步置位和复位 异步置位与复位是于时钟无关的.当异步置位或复位信号来临时,他们立即分别置触发器的输出为1或0,不需要等待时钟沿的到来.要将他们列入always块的事件控制信号内就能触发al ...

  10. 信号滤波模块verilog代码---UNLOCK,LOCK状态机方式

    信号滤波模块verilog代码 `timescale 1ns / 1ps /////////////////////////////////////////////////////////////// ...

随机推荐

  1. 【Android】截图案例

    1 工作空间 2 代码 ​ MainActivity.java package com.zhyan8.demo; import android.graphics.Bitmap; import andr ...

  2. Js实现链表操作

    Js实现链表操作 JavaScript实现链表主要操作,包括创建链表.遍历链表.获取链表长度.获取第i个元素值.获取倒数第i个元素值.插入节点.删除节点.有序链表合并.有序链表交集. 创建链表 cla ...

  3. 微信小程序引入iconfont实现添加自定义颜色图标

    说明 最近搞微信小程序,需要添加一些图标,发现引入iconfont还是有几个步骤,就记录下来分享以下. 以下配置方法支持自定义颜色的. 操作步骤 1. 在iconfont网站挑选自己需要的图标,添加到 ...

  4. Java实现文件下载断点续传(一)

    参考文章:https://www.ibm.com/developerworks/cn/java/joy-down/ 1.原理介绍 想象一下我们下载一个10G的文件,当下载到9.99G的时候断网了... ...

  5. 责任链模式与spring容器的搭配应用

    背景 有个需求,原先只涉及到一种A情况设备的筛选,每次筛选会经过多个流程,比如先a功能,a功能通过再筛选b功能,然后再筛选c功能,以此类推.现在新增了另外一种B情况的筛选,B情况同样需要A情况的筛选流 ...

  6. ALTER TABLE 加字段的时候到底锁不锁表?

    Mysql5.6版本之前 更新步骤 对原始表加写锁 按照原始表和执行语句的定义,重新定义一个空的临时表. 对临时表进行添加索引(如果有). 再将原始表中的数据逐条Copy到临时表中. 当原始表中的所有 ...

  7. 使用 MSYS2 编译 exe 可执行程序

    MSYS2 是一个在 Windows上 运行的软件环境,它提供了一种在 Windows 上使用 GNU 工具链的方式,包括 GCC 编译器和 GNU Make 构建系统. 在 MSYS2 中,你可以使 ...

  8. String - 一些测试(持续更新)

    void main() { char *buffer = new char(1000); memset(buffer, 0, 1000); char buffer1[1000] = {}; buffe ...

  9. 阿里云 SMS 短信 Java SDK 封装

    Github & Issues: https://github.com/cn-src/aliyun-sms 官方文档:https://help.aliyun.com/document_deta ...

  10. typing模块中Protocol协议的使用

    说明 在 Python 的 typing 模块中,Protocol 是一个用于定义协议(Protocol)的类. 协议是一种形式化的接口,定义了一组方法或属性的规范,而不关心具体的实现.Protoco ...