verilog之状态机
verilog之状态机设计
1、状态机的原理
状态机,就是基于状态变化而设计的硬件模块,是一种常见的设计思路。掌握状态机的使用,是初步建立复杂逻辑设计能力的开始。所谓的状态机,和高级语言程序的流程图十分类似,具有逐步执行,步步递进的特点。由于硬件的特殊性,一般的状态机都是闭环的,要求能够回到初始状态。状态机就是硬件流程图,将并行执行的硬件结构通过时序控制转化为有效地顺序执行。
这一点体现在verilog中就是状态机通过一个状态块和一个条件块,将高级语言中的逐步特性短暂地建立于硬件中,是设计者可以有效地分析信号当前处于的区域。简而言之,状态机就是C语言中的while(1),不断地执行不同状态下的模块功能。当然,设计的语句比较复杂,实现每条语句的方法也是需要采用模块化设计。这里和软件上的设计思路还是有所区别的。
个人理解,状态机的作用是有效地减少了设计者在信号转化过程中需要不断考虑的时序问题,以及在条件转化中的约束问题。由于状态的限定,使得条件约束变得简单。当然,对于熟练的硬件设计者来说,自定义条件约束也是可以实现的。
2、状态机的组成
状态机由三部分组成:状态、驱动和输出。状态,这就不用多说,就是状态机名字的由来。通过数字或者其他标识,将每一段时间区分于一个状态。驱动,就是状态变化的条件。这个是状态机设计的关键。一般在设计状态机前会先绘制关系图,目的就是明确驱动。至于输出,就是根据状态区分条件从而达到控制输出的目的。
首先看一下状态的声明。一般而言,状态只需要有现在状态和下一状态,通过组合逻辑关联即可实现。最简单的就是状态1的下一状态为状态2,状态2的下一状态为状态1。采用组合关联而非时序关联,主要是减少时序冗余和可能的状态自锁。时序冗余好理解,组合逻辑总是比时序逻辑用的资源少。时序自锁,也就是状态延时变化可能导致的问题。比如前面的简单状态转化。在1->2时,现状态转化为2,在现状态保持2的第一个周期内,下一状态还是2,这就导致状态一直处于2.当然,这只是一个极端的情况。
至于驱动,就是根据每个状态下的条件判断出状态的变化。常用的有某信号出现高电平、某计数器计时到位、多个信号复杂条件等。驱动的最稳妥的方法就是画出状态图,以防遗漏。
输出,就是将运行成功的状态机的状态转化为标准的控制信号。这里的输出和单纯使用时钟外加控制线的方式输出的优势在于可以自动区分条件。比如,在状态1中的控制条件只会作用于状态1,而不会影响其他状态。这好比认为构建了一个局部条件。在信号越来越复杂的情况下,局部条件显然具有重要的优势。在设计比较大的模块时,随着信号变化的区分度越来越高,单纯使用转化信号来控制是困难的。
一般的状态机的写法也是基于这三部分来写的,可以合并。计数器可以认为是三合一的状态机,只不过大部分人只会使用计数到达或者计数不足两个状态,所以就直接合并在一起。对于直接输出状态的设计而言,只需要两个部分即可。
3、状态机的作用
在学习硬件设计时,状态机无疑是重要的一环。掌握状态机的设计,可以从逻辑思维过渡到硬件分析。掌握状态机,才能逐步地接触到硬件设计中的组合与时序的转化。可以说,状态机是组合逻辑和时序逻辑的标准搭配,如同集成电路中的CMOS单元一样基础。学习了状态机,就可以初步的了解状态和时序的搭配方法,为后面更为复杂的设计打下基础。