基于VerilogHDL的状态机设计探讨
基于Verilog的有限状态机编程方式及研究

胡正洋
(西安电子科技大学微电子学院,陕西西安 710126)
摘要:采用Verilog语言编程可以简化有限状态机设计过程,并优化硬件资源配置。本方案首先介绍了利用Verilog设计有限
状态机的流程和不同方式,其次从电路的容错性、延时、面积等因素进行考量,着重对编码方式进行比较,最后根据在Modelsim
有限状态机FSM(Finite State Machine)的基本结构 由状态寄存器和组合逻辑电路组成, 通过对触发器输入 端输入信号, 并由状态寄存器对状态完成保持或转换, 最 后通过组合电路完成特定的输出。分为以下两种情况:
(1)Moore型有限状态机:输出的信号只与当前状态有 关。( 2 ) M e a l y 型有限状态机: 输出信号不仅与当前状态有 关, 而且与输入信号有关。
每一步的选择都会导致编程风格的不一样, 更会导致 有限状态机性能上各方面的差异。
2 有限状态机的状态编码选择
状态编码确定维持状态所需的触发器的数量并影响 实现下一个状态和输出时所用的组合逻辑的复杂度[ 4 ] 。 Verilog中常用的状态编码方式有二进制码,格雷(Gray)码 和独热(One-hot)码,如表1所示:
reg [1:0]state,next_state;
单进程式描述方式只有一个always过程块。这种情况
reg z;
下, 如果均采用非阻塞语句赋值, 电路不会产生毛刺。由于
always @(posedge clk or negedge rst)
一段式的描述方法是为STATE本身分配一个值,因此会引
if(!rst) state <= S0;
SE-64 10.6d上进行的仿真实验,进一步得出不同使用环境下的最优编程方式。
Verilog HDL与FPGA数字系统设计ch05_FSM

5.1.2状态机的状态图表示法
需要强调指出,米利型状态图中,输出值的表示方法容 易引起读者的误解。当状态机处于所在的状态,并且在所示 的输入的作用下,就会产生输出值,并非在状态机转移到下 一状态时才出现输出。由于穆尔型电路的输出只依赖于状态 机的当前状态,其状态图的表示方法略有不同,通常将输出 变量写在表示状态的圆圈内部,图5.1.3是穆尔型状态图表示 的例子。
描述状态图的方法多种多样,下面介绍几种:
5.2.2 推荐的状态图描述方法
1. 单个always块描述状态机的方法(应该避免的写法) 用一个always块对该例的状态机进行描述,其代码如下: module Detector1 ( Sin, CP, nCR, Out) ;
input Sin, CP, nCR; //声明输入变量 output Out ; //声明输出变量 reg Out; reg [ 1 : 0 ] State; //声明两个状态触发器变量state[1]和 state[0],记忆电路现态 //The state labels and their assignments parameter [1:0] S0=2'b00, S1=2'b01, S2 = 2'b10, S3 = 2'b11; always @(posedge CP or negedge nCR) begin if (~nCR)
图 5.1.3 穆尔型状态图
5.1.3状态机的设计步骤
一般来说,状态机的设计步骤如下所示: 1.依据具体的设计原则,确定采用穆尔型状态机还是米 利型状态机。 2.分析设计要求,列出状态机的所有状态,并对每一个 状态进行状态编码。 3.根据状态转移关系和输出函数,画出状态图。 4.根据所画的状态图,采用硬件描述语言对状态机进行 描述。 第3步是最困难也是最有创造性的一步。状态图直观地 反映了状态机各个状态之间的转换关系以及转换条件,但要 求设计的状态个数不能太多。状态个数较多,采用状态表的 方法列出状态机的转移条件。输出信号较多,可采用输出逻 辑真值表进行表示。
Verilog代码描述对状态机综合的研究剖析

Verilog HDL代码描述对状态机综合的研究1 引言作为当今国际主流的HDL 语言, 在芯片的前端设计中有着广泛的应用。
它的语法丰富, 成功地应用于设计的各个阶段:建模、仿真、验证和综合等。
可综合是指综合工具能将Verilog HDL代码转换成标准的门级结构网表, 因此代码的描述必须符合一定的规则。
大部分数字系统都可以分为控制单元和数据单元两个部分, 控制单元的主体是一个状态机, 它接收外部信号以及数据单元产生的状态信息, 产生控制信号, 因而状态机性能的好坏对系统性能有很大的影响。
有许多可综合状态机的Verilog 代码描述风格, 不同代码描述风格经综合后得到电路的物理实现在速度和面积上有很大差别。
优秀的代码描述应当易于修改、易于编写和理解, 有助于仿真和调试, 并能生成高效的综合结果。
2 有限状态机有限状态机(Finite State Machine,FSM在数字系统设计中应用十分广泛。
根据状态机的输出是否与输入有关, 可将状态机分为两大类:摩尔(Moore型状态机和米莉(Mealy型状态机。
Moore 型状态机的输出仅与现态有关;Mealy 型状态机的输出不仅与现态有关, 而且和输入也有关。
图1是有限状态机的一般结构图, 它主要包括三个部分, 其中组合逻辑部分包括状态译码器和输出译码器, 状态译码器确定状态机的下一个状态, 输出译码器确定状态机的输出, 状态寄存器属于时序逻辑部分, 用来存储状态机的内部状态。
图1 状态机的结构框图2.1 好的状态机标准好的状态机的标准很多, 最重要的几个方面如下:第一, 状态机要安全, 是指FSM 不会进入死循环, 特别是不会进入非预知的状态, 而且由于某些扰动进入非设计状态, 也能很快的恢复到正常的状态循环中来。
这里面有两层含义。
其一要求该FSM 的综合实现结果无毛刺等异常扰动, 其二要求FSM 要完备, 即使受到异常扰动进入非设计状态, 也能很快恢复到正常状态。
基于Verilog和VHDL的状态机设计技术

基于Verilog和VHDL的状态机设计技术作者:纪勇来源:《电脑知识与技术》2012年第24期摘要:对于数字逻辑工程师来说,设计一个同步有限状态机(FSM)是一项很常见的任务。
该论文讨论了若干关于设计有限状态机方面的问题,包括用于状态分配的状态编码方法,状态机的输入输出等等。
关键词:有限状态机;状态编码;状态分配中图分类号:TP399文献标识码:A文章编号:1009-3044(2012)24-5897-02Design Technology of State Machine Based on Verilog and VHDLJI Yong(Yangzhou Polytechnic Institute, Yangzhou 225127, China)Abstract: Designing a synchronousfinite state machine (FSM) is a common task for a digital logic engineer. This paper will discuss a vari? ety of issues regarding FSM design, including status coding method for status assignment, input and output of state machine.Key words: FSM; state coding; state assignment通常情况下设计一个状态机最重要的决策是使用什么状态编码。
一个不恰当的选择会导致状态机使用太多的逻辑或者运行太慢,甚至这两种坏结果都会出现。
现在已经开发出了很多能够选择优化的状态编码的工具和技术。
这些方法一般都使用了最少的状态位或者采取诸如PLA 的两层逻辑实现。
下面将进行详细讨论。
3.1高级编码的状态分配一个高级编码的状态分配对于状态向量来说只使用很少的触发器,同时需要一个附加的逻辑来完成状态的编码和译码。
Verilog三段式状态机的建模方法和注意事项

Verilog三段式状态机(FSM)网上收集整理……时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息。
状态机采用VerilogHDL语言编码,建议分为三个always段完成。
这是为什么呢?设计FSM的方法和技巧多种多样,但是总结起来有两大类:第一种,将状态转移和状态的操作和判断等写到一个模块(process、block)中。
另一种是将状态转移单独写成一个模块,将状态的操作和判断等写到另一个模块中(在Verilog代码中,相当于使用两个“always”block)。
其中较好的方式是后者。
其原因如下。
首先FSM和其他设计一样,最好使用同步时序方式设计,好处不再累述。
而状态机实现后,状态转移是用寄存器实现的,是同步时序部分。
状态的转移条件的判断是通过组合逻辑判断实现的,之所以第二种比第一种编码方式合理,就在于第二种编码将同步时序和组合逻辑分别放到不同的程序块(process,block)中实现。
这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。
三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器,然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。
三段式描述方法虽然代码结构复杂了一些,但是换来的优势是使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。
示例如下://第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器always @ (posedge clk or negedge rst_n) //异步复位if(!rst_n)current_state <= IDLE;elsecurrent_state <= next_state;//注意,使用的是非阻塞赋值//第二个进程,组合逻辑always模块,描述状态转移条件判断always @ (current_state) //电平触发beginnext_state = x; //要初始化,使得系统复位后能进入正确的状态case(current_state)S1: if(...)next_state = S2; //阻塞赋值...endcaseend//第三个进程,同步时序always模块,格式化描述次态寄存器输出always @ (posedge clk or negedge rst_n)...//初始化case(next_state)S1:out1 <= 1'b1; //注意是非阻塞逻辑S2:out2 <= 1'b1;default:... //default的作用是免除综合工具综合出锁存器。
Verilog HDL入门基础之时序状态机的设计

时序状态机的设计入门与提高计算机及具有存储器或按照所存储信息执行一系列操作的其他数字系统统称为“时序状态机”,其电路可以通过时序逻辑进行建模。
时序状态机的性能与组合逻辑不同,因为时序状态机的输出不仅仅取决于当前的输入值,而且取决于历史的输入值。
时序状态机被广泛应用于需要指定顺序操作的应用中。
所有的时序状态机都具有如图的通用反馈结构,在这种结构中时序状态机的下一状态是由当前状态和当前输入一起形成的:时序状态机可以按是否受一个公共的时钟控制(钟控)分为同步状态机和异步状态机;根据状态数目是否有限分为有限状态机和无限状态机。
此处只讨论有限状态机。
有限状态机的(FSM)分类有限状态机有米利(Mealy)机和摩尔(Moore)机:米利(Mealy)机:米利(Mealy)机的下一状态和输出都取决于当前状态和当前输入。
摩尔(Moore)机:摩尔(Moore)机的下一状态取决于当前状态和当前输入,而输出仅仅取决于当前状态。
有限状态机常用的描述、开发方法有限状态机可以借助时序图、状态表、状态图以及ASM图进行系统的描述与设计。
•时序图可以用于说明系统中及系统与周围环境的接口中信号的有效输入与状态转移之间的关系。
•状态表与状态转移表以表格的形式表示在当前状态和输入的各种组合下状态机的下一状态和输出•状态转移图(STG)是一种有向图,图中带有标记的节点或顶点与时序状态机的状态一一对应。
当系统处于弧线起点的状态时,用有向边或弧线表示在输入信号的作用下可能发生的状态转移。
米利机STG的顶点用状态进行标记,状态转移图的有向边有下面两种标记方法:(1)用能够导致状态向指定的下一状态转移的输入信号来标记(2)在当前状态下,用输入信号的输出来进行标记摩尔机的状态转移图与米利机相类似,但它的输出是由各状态的顶点来表示的,而不是在弧线上表示•算法状态机(ASM)图是时序状态机功能的一种抽象,是模拟其行为特性的关键工具。
它类似于软件流程图,但显示的是计算流程图(如寄存器操作)的时间顺序,以及在状态机输入影响下发生的时序步骤。
基于Verilog HDL的有限状态机的优化设计

第二个进程组合逻辑 a as l y 模块的设计和二段式 的 w 设计相似 , 但是其只进行输入判断和状态转移规律描述 , 而不进行组合逻辑输出 ; 第三个进程也设计成 同步时序 a as l y 模块 ,采用同 w
步时序逻辑寄存 F M 的输出。 S
4三种状态机的逻辑、 电路 、 仿真分析
mp _t a e — ” jgi u uc O 一 / jg u— i s em r i / p / p t v. ” O” p/ t g r m n _ S m o
)
警
图 1 频 采集 图像 0视
图 8内核启动前加载摄 像头驱 动信息
不管你在何时插入 , 以上信息之一都表明 , 出现 摄像
头驱动加载成功 。驱动加载成功后 同时会在 /e dv目录下 产生一个 v eO i o 的设备节点 。 l命令可 以查看 , 图 9 d 用 s 如
所示 。
一
检验所设计 的 F M 的完备性 ,如果所设 计 的 F M不完 S S 备, 则会进入任意状态 , 仿真时很容易发现。
33三段式(h e — l y ) - T re awa s状态机 三段式状态机的设计 即使用三个进程对状态机进行 描述。第一个 a as l y 模块使用 同步时序描述状态之间的 w 转移 ; 第二个 a as l y 模块使用组合逻辑判 断状 态转移条 w 件, 描述状态转移规律 ; 第三个 a as l y 模块采用同步时序 w
成了远程视频数据 的采集 ,为整个 网络智能家居监控 系
统的实现打下了基础 。
摄像头被驱动后 ,需要编写一个对视频流采集 的应
用程序。 系统 中采用的是 m pg s em, 本 je—t a 这是一个视频 r 流服务器 , 里面有对整个视频采集及处理发送 的过程 。 首 先要 将其移植 到 目标板 上 , 也就 是 ¥ C 4 0平 台 , 3 24 并在 目标板上运行此视频流服务器 , 命令如下 :
verilog有限状态机的设计

习
题
8
8.5 设计一个汽车尾灯控制电路。已知汽车左右两侧各 有3个尾灯,要求控制尾灯按如下规则亮灭。 (1)汽车沿直线行驶时,两侧的指示灯全灭; (2)右转弯时,左侧的指示灯全灭,右侧的指示灯按 000,100,010,001,000循环顺序点亮; (3)左转弯时,右侧的指示灯全灭,左侧的指示灯按与 右侧同样的循环顺序点亮; (4)如果在直行时刹车,两侧的指示灯全亮;如果在转 弯时刹车,转弯这一侧的指示灯按上述的循环顺序点 亮,另一侧的指示灯全亮。
always @(state) /*该过程产生输出逻辑*/ begin case(state) S3: z=1'b1; default:z=1'b0; endcase end endmodule
“101”序列检测器(单过程描述)
module fsm4_seq101(clk,clr,x,z); input clk,clr,x; output reg z; reg[1:0] state; parameter S0=2'b00,S1=2'b01,S2=2'b11,S3=2'b10; /*状态编码,采用格雷(Gray)编码方式*/ always @(posedge clk or posedge clr) Begin if(clr) state<=S0; //异步复位,s0为起始状态 else case(state) S0:begin if(x) begin state<=S1; z=1'b0;end else begin state<=S0; z=1'b0;end end S1:begin if(x) begin state<=S1; z=1'b0;end else begin state<=S2; z=1'b0;end end S2:begin if(x) begin state<=S3; z=1'b0;end else begin state<=S0; z=1'b0;end end S3:begin if(x) begin state<=S1; z=1'b1;end else begin state<=S2; z=1'b1;end end default:begin state<=S0; z=1'b0;end /*default语句*/ endcase end endmodule
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于VerilogHDL的状态机设计探讨
作者:黄金凤张红
来源:《电脑知识与技术》2016年第23期
摘要:在日常生活中,我们经常看到很多循环控制产品,如十字路口的交通灯、自动饮料收货机、电梯运行、微波炉、电饭锅等,它们的控制系统其实都可以用Verilog HDL的状态机设计方法来完成。
该论文首先讲述了状态机设计方法,然后讲述了如何有效的运用3种过程描述来设计状态机。
关键词:Verilog HDL;状态机;过程描述
中图分类号:TP18 文献标识码:A 文章编号:1009-3044(2016)23-0204-02
1 概述
有限状态机(Finite State Machine,FSM)是时序电路设计中经常采用的一种方式,尤其适合设计数字系统的控制模块,在一些需要控制高速器件的场合,用状态机进行设计是一种很好的解决问题的方案,具有速度快、结构简单、可靠性高等优点。
有限状态机非常适合用FPGA器件实现,用Verilog HDL的case语句能很好地描述基于状态机的设计,再通过EDA工具软件的综合,一般可以生成性能极优的状态机电路,从而使其在执行时间、运行速度和占用资源等方面优于用CPU实现的方案。
2 状态机设计
有限状态机可以认为是组合逻辑和寄存器逻辑的特殊组合,它一般包括组合逻辑和寄存器逻辑两部分,寄存器逻辑用于存储状态,组合逻辑用于状态译码和产生输出信号。
根据输出信号产生方法的不同,状态机可分为两类:摩尔型(Moore)和米里型(Mealy)。
Moore型状态机的输出只和当前状态有关,和输入无关。
Mealy型状态机的输入是由当前状态和输入共同决定。
如图1和图2所示。
使用Verilog HDL语言设计状态机的步骤:
1)将实际问题抽象成状态图
分析实际问题,找出输入信号、输出信号,最好画出一个具有输入和输出的框图,要给输入、输出信号取字母名。
取状态机上电的状态为初始状态,并由此状态开始,根据输入条件决定状态机的次态及输出,直至所有情况描绘素完毕,画出完整的状态图。
2)定义变量
定义描写次态逻辑、状态寄存器中需要的变量,注意在always块中使用的变量应该定义成寄存器变量,而连续赋值语句中使用的变量应该定义成连线变量。
3)状态编码
根据状态图选择状态变量,进行状态编码,虽然有多种编码方式,但可以找一种编码试一试。
例如,使用自然二进制码。
4)描写次态逻辑
使用always块或是连续赋值语句描写次态逻辑。
5)描写状态寄存器
使用always块描写状态寄存器。
6)描写输出逻辑
使用always块或是连续赋值语句描写输出逻辑(输出逻辑可以与次态逻辑在一个块中描述)。
7)仿真
根据状态机输入信号的要求,用图形或文本方式编辑输入信号波形,然后进行功能仿真,根据仿真结果的正确与否决定是否修改设计,例如在状态转换时出现不该有的尖峰脉冲,则可以更改状态编码试一试。
如果仿真成功,就可以在引脚锁定后,进行编译形成文件下载到芯片中,试一试是否成功。
在用Verilog HDL描述的有限状态机时,其中重要的核心部分是描述方式,有以下3种描述方式。
1)三段式过程描述:即现态(CS)、次态(NS)、输出逻辑(OL)各用一个always过程描述。
2)二段式过程描述:分为两种,第一种:CS+NS、OL双过程描述,使用两个always过程来描述有限状态机,一个过程描述现态和次态时序逻辑(CS+NS);另一个过程描述输出逻辑(OL)。
第二种,CS、NS+OL双过程描述,一个过程用来描述现态(CS);另一个过程描述次态和输出逻辑(NS+OL)。
3)一段式过程描述:将状态机的现态、次态和输出逻辑(CS+NS+OL)放在一个always 过程中进行描述。
3 状态机的3种过程描述
一般而言,对于符合图1或图2两种模块图的状态机设计而言,3种过程描述方式都是适合的,只不过,一段式过程描述一般不推荐使用,因为它只适合设计简单的状态机,对于复杂的状态机,一段式不仅浪费了触发器资源,而且其代码难以修改调试。
所以,通常情况下,我们都用二段式过程描述和三段式过程描述。
对于图1(图2)中的次态逻辑模块中的输入信号,如果不受时钟信号控制,二段式和三段式过程描述设计方法是一样的,但如果次态逻辑模块是时序电路,输入信号受时钟信号控制,就适合采用二段式过程描述方法。
下面以单通道交通灯设计为例加以验证。
题目要求:单通道交通灯设计,南北方向,初始状态为绿灯,绿灯停留6秒变为黄灯,黄灯停留4秒变为红灯,红灯停留6秒变为绿灯,如此反复。
通过图3和图4的仿真结果图,我们可以看出,图3满足题目要求,而图4却是凌乱的。
当次态逻辑模块和现态寄存器模块都受同一时钟控制时,如果采用三段式分开描述这两个模块,那么现态变量和次态变量的值其实相互之间产生了干扰。
所以建议使用二段式过程描述方式以避免逻辑的混乱。
4 结语
状态机理论最初的发展在数字电路设计领域。
状态机设计是HDL设计里面的精华,几乎所有的设计里面都或多或少地使用了状态机的思想。
状态机,顾名思义,就是一系列状态组成的一个循环机制,这样的结构使得编程人员能够更好地使用HDL语言,同时具有特定风格的状态机也能提高程序的可读性和调试性。
参考文献:
[1]魏芳,刘志军,王立华.基于Verilog HDL的可综合有限状态机设计[J].电子工程师,2006(6).
[2]温国忠.基于Verilog HDL的高效状态机设计[J].电子工程师,2006(6).
[3]刘小平,何云斌,董怀国.基于Verilog HDL的有限状态机设计与描述[J].计算机工程与设计,2008(4).
[4]杨庆.有限状态机的设计与优化[J].湖北民族学院学报(自然科学版),2006(1).。