因为大多数的FPGA内部的触发器数目相当多,又加上独热码状态机(one hot code machine)的译码逻辑最为简单,所以在FPGA实现状态机时,往往采用独热码状态机(即每个状态只有一个寄存器置位的状态机)。建议采用case语句来建立状态机的模型,因为这些语句表达清晰明了,可以方便的由当前状态转向下一个状态并设置输出。记得:不要忘记在case语句的最后写上default分支,并将状态设置为'bx这就等于告诉综合器case语句已经指定了所有的状态。这样综合器就可以删除不必要的译码电路使生成的电路简洁。

如果将默认的状态设置为某一确定值的状态可不可以呢?

这样会导致,虽然综合器产生的逻辑和设置default:state=’bx;相同,但是状态机的Verilog模型综合前和综合后的仿真结果不一致。因为启动仿真器时,状态机的所有状态都不确定,因此立即进入default状态。这时便会导致开始的状态为state1,但是实际的硬件电路在通电以后,进入的状态是不确定的,很可能不是state1的状态,因此'bx更切合实际一些。但是再有多余状态的情况下,可以通过哦综合指令(高级教程)将默认状态设置为某一确定的有效状态,因为这样能够使得状态机在偶然进入多余状态后,仍能在下一时钟跳变沿返回正常工作状态,否则引起死锁。

目前大多数综合其往往不支持在一个always快中由多个事件触发的状态机(隐含状态机,implicit state machine),为了能综合出有效的电路,用Verilog描述的状态机应明确的由唯一时钟触发。如果比需要用到不同时钟触发的状态机,可以采用以下程序:编写另一个模块,并采用第二种时钟触发;然后用适中调用的方法再领一个模块中将它们连接起来。为了使设计更简单,调试更加容易,通常使得两个状态机的周期由一定的关系。

在Verilog中状态必须明确赋值,使用参数parameter和define都可以实现:

参数定义:parameter state1=2'0,state2=2'1;

...

current_state=state1;

宏定义:`define state1=2'b0,state2=2'b1;

....

current_state=`state2;

语言指导原则:

1)always块

(1)每个always块只能有一个事件控制@(event-control),而且要紧跟在always关键词后面。

(2)always块可以表示时序逻辑或者组合逻辑,也可以同时表示透明锁存器和组合逻辑,但是不建议使用,因为可能产生不希的透明锁存器。

(3)带有posedge和negedge关键词的事件表达式代表边沿触发的时序逻辑,没有这两种关键词的表示组合逻辑或者点评敏感的锁存器,如果有多个沿和电平,期间必须用or隔离。

(4)每个在always中复制的信号都必须定义成reg型或整型。整形变量默认位32位,可以对整形变量的范围进行规定,如 integer  [7:0]amm;

(5)always块中应避免组合反馈回路。每个表示时序的always块只能有一个时钟沿跳变触发,置位和复位信号最好也由该时钟触发。

在用always块设计纯组合逻辑网络时,在生成组合逻辑的always中参与复制的所有信号都必须有明确的值,即在赋值表达式右边赋值信号必须都在always的敏感列表中列出。如果某一变量没有出现在变量列表中,那么在综合时将会该信号隐含的产生一个透明锁存器,这是因为该信号的变化并不能改变赋值的变化,而要先把该信号的变化存起来,等到敏感列表中的其他值发生变化时再起作用,纯组合逻辑不能做到这一点。这样综合后的电路就不是纯组合电路了,这时综合器会发出警告,提示设计插入了锁存器。见下例:

1    input a,b,c;
2 reg e,d;
3 always @(a or b or c)
4 begin
5 e=d&a&b;
6 /*因为d没有在敏感列表中列出,多以d变化时,e不能立刻变化,必须等到a或b或c变化时才体现出来。这就是说实际上相当于存在一个电平敏感的透明锁存器在起作用,把d的信号变化锁存在其中*/
7 d=e|c;
8 end

2)赋值

(1)对一个寄存器变量(reg)和整型(integer)变量给定位的赋值,只允许在一个alawys块内进行,如果在另一个always块中也赋值,这是非法的。

(1)把一个信号的值赋值为'bx,综合器就把他解释成无关状态,因而综合器为其生成的硬件电路最简洁。

Verilog学习笔记设计和验证篇(三)...............同步有限状态机的指导原则的更多相关文章

  1. Verilog学习笔记设计和验证篇(二)...............同步有限状态机

    上图表示的就是数字电路设计中常用的时钟同步状态机的结构.其中共有四个部分产生下一状态的组合逻辑F.状态寄存器组.输出组合逻辑G.流水线输出寄存器组.如果状态寄存器组由n个寄存器组成,就可以记忆2^n个 ...

  2. Verilog学习笔记设计和验证篇(五)...............层次化事件队列

    详细的了解层次化事件队列有助于理解Verilog的阻塞赋值和非阻塞赋值功能.所谓层次化事件队列指的是用于调度仿真时间的不同Verilog事件队列.在IEEE的5.3节中定义了层次化事件队列在逻辑上分为 ...

  3. Verilog学习笔记设计和验证篇(一)...............总线和流水线

    总线 总线是运算部件之间数据流通的公共通道.在硬线逻辑构成的运算电路中只要电路的规模允许可以比较自由的确定总线的位宽,从而大大的提高数据流通的速度.各个运算部件和数据寄存器组可以通过带有控制端的三态门 ...

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

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

  5. Verilog学习笔记简单功能实现(三)...............同步有限状态机

    在Verilog中可以采用多种方法来描述有限状态机最常见的方法就是用always和case语句.如下图所示的状态转移图就表示了一个简单的有限状态机: 图中:图表示了一个四状态的状态机,输入为A和Res ...

  6. Deep Learning(深度学习)学习笔记整理系列之(三)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  7. BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记看另一篇吧】

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3975  Solved: 2421[Submit][Stat ...

  8. Shiro:学习笔记(1)——身份验证

    Shiro——学习笔记(1) 1.核心概念 1.Shiro不会自己去维护用户.维护权限:这些需要我们自己去设计/提供:然后通过相应的接口注入给Shiro.2.应用代码直接交互的对象是Subject,也 ...

  9. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

随机推荐

  1. English Metric Units and Open XML

    English Metric Units and Open XML 在Open XML里使用了English Metric Units(EMUs)来作为度量单位.比如 public class Ext ...

  2. 关于"The dependency was added by the project system and cannot be removed" Error

    阅读一个简单地工程代码,其中一个工程BaseCode是 static lib,另一个工程RunBaseCode使用该lib,但在工程设置的“Linker\Input\AdditionalDepende ...

  3. IOS Application Security Testing Cheat Sheet

    IOS Application Security Testing Cheat Sheet    [hide]  1 DRAFT CHEAT SHEET - WORK IN PROGRESS 2 Int ...

  4. debian+apache+acme_tiny+lets-encrypt配置笔记

    需要预先将需要申请ssl的域名指向到服务器,此方法完全通过api实现,好处是绿色无污染,不需要注册账号,不会泄露私人信息环境为 debian7+apache apt-get install apach ...

  5. Backbone1.0.0数据验证的变化

    0.5.3版本对Model数据验证时,绑定Error就可以了: (function(){ var Model = Backbone.Model.extend({ initialize : functi ...

  6. SEO优化之Title 和 Meta 标签

    对搜索引擎最友好(Search Engine Friendly)的网页是静态网页,但大部分内容丰富或互动型网站都不可避免采用到相关技术语言来实现内容管理和交互功能.SEO 思想指导下的技术支持,主要是 ...

  7. Android 2.1 和 Android 4.4 工程目录超详细对比及详解

    在搭建Android开发环境及简单地建立一个HelloWorld项目后,本篇将通过HelloWorld项目来介绍Android项目的目录结构.本文的主要主题如下: 1.1.HelloWorld项目的目 ...

  8. spark 编译

    http://blog.csdn.net/zyj8170/article/details/44678405

  9. solr的建议搭建

    公司培训了solr,我打算自己练练手!就下载了solr-4.4.0.zip~呵呵 1.基本环境Tomcat 1.6 和JDK1.6 2.解压solr-4.4.0.zip , 把dist/solr-4. ...

  10. overflow:hidden的另一层含义

    overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是 很了解.一提到清除浮动,我们就会想到另外一个CSS样式 ...