集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 36742|回复: 48

关于状态机问题的汇总贴

[复制链接]
fpga 发表于 2010-5-11 10:13:59 | 显示全部楼层 |阅读模式
状态机的编写方法


在中大型设计中,状态机的使用也越来越频繁,我们要如何编写一个让人容易读懂的状态机就是眼前最重要的事情。下面我们先来回顾一下状态机的分类。状态机共分为两大类一类是Moore状态机,一类是Mealy状态机。这两类状态机的区别主要是Moore的输出值只取决与当前状态,而Mealy状态机不仅与当前状态有关,还和输入值有关。如何区分是Moore还是Mealy型状态机,主要是看程序中状态转移的always语句中的条件转移变量。例如:
input a,clk;                                                                                                                                                input a,clk;
output dout;                                                                                                                                              output dout;
reg dout;                                                                                                                                                   reg dout;
parameter st0=1,st1=1,st2=2,st3=3;  (编码方式,下面再讲)                                                                parameter st0=1,st1=1,st2=2,st3=3;      (编码方式,下面再讲)
reg [1:0] state;                                                                                                                                          reg [1:0] state;
[email=always@(negedge]always@(negedge[/email] clk)                                                                                                                             [email=always@(negedge]always@(negedge[/email] clk)
case(state)------------(case中只有状态,没有输入a,所以他是Moore状态机)                                         case(state or a)------------(case既有有状态,也有输入a,所以他是Mealy状态机)
...                                                                                                                                                              ...
...                                                                                                                                                              ...
endcase                                                                                                                                                   endcase
endmodule                                                                                                                                               endmodule
下面我在介绍一下我们在写状态机的时候用什么样的编码方式。状态机的编码方式主要有二进制编码,格雷编码和一位热码编码。下面我就对这三种编码分别做以介绍。一般二进制编码就是用 二进制来做编码,如000,001,010,111,等等。其实就是按照二进制的顺序进行编码,作为简单的编码,可以采用此编码方式,但是有一点要记住,再用此编码方式时,一定要做好毛刺处理的问题,因为当状态在发生变化的时候,编码也同时跟着发生变化,所以就会产生毛刺。产生毛刺的主要原因还是因为二进制码在变化时,最少有两位会同时发生变化,在时延上是不相等的。所以二进制码不能很好的剔除毛刺,同时会出现暂态过程,引起逻辑上的错误,从而造成程序跑飞。格雷编码其实就是变化的二进制编码,它主要要解决的问题就是去除毛刺,减少暂态过程。提高稳定性。例如:三位二进制码(000,001,010,011,100,101,110,111),变为格雷码(000,001,011,010,110,111,101,100)。在将二进制码变为格雷码时要记住变化时只能有一位变化,其他位保持不变。同时,要保证位数越高变化越慢。例如(000,001,101,111,011,010,110,100)在这个编码中最高位的变化速率是原来的两倍。在高速电路中这是一种不好的编码方式。最后我在讲讲一位热码编码。采用这种编码方式,相对于格雷码来说虽然增加了触发器,但是节省了组合电路。提高了电路的速度和可靠性。例如5位的热码编码(5'b00001,5'b00010,5'b00100,5'b01000,5'b10000;)。与格雷码一样都是一位进行变化,唯一不同的是,一位热码是不需要进行逻辑运算的。
最后我在讲讲整个状态机的编写如何让人很快的读懂。首先我们要知道自己的状态机一共有几部分组成,我在这里所指的几部分是说时序和组合逻辑。一般状态机都是由时序和组合逻辑两部分组成(只有一部分组成的在这里先不讲)。那么我们要怎么写才容易让人读懂呢?把状态机的时序部分作为第一部分,把状态机的组合逻辑作为第二部分。那么在第一部分里我们要做些什么工作呢?在第一部分里我们主要是用时序来控制状态机的同步描述,状态机的初始化。第二部分我们可以分为两个小步,第一步是进行状态机的状态转移,第二步是进行状态机的输出描述。其实第二部分也可以不分为两个小步,但是本人觉得分开后程序更清晰了。在第二部分中我们就可以选择是用Moore型还是Mealy型状态机了。
好了这次先讲这么多,有不对的地方请大家多多批评指正。在此新年之际祝大家新年快乐。

相关帖子

 楼主| fpga 发表于 2010-5-11 10:19:06 | 显示全部楼层
什么叫状态机
状态机就是在流程图的基础上,分配好各种状态的01逻辑.
而流程图,是对一个事件的逻辑的处理的抽象
 楼主| fpga 发表于 2010-5-11 10:19:34 | 显示全部楼层
单进程的状态机从功能上来讲是没有问题的,但不是好的编码风格,不太好理解代码;同时,这种风格的状态机不利于eda工具进行分析,如在覆盖率分析时可能不会把这段代码映射成状态机,这样eda工具就不能很好的分析状态机的完整性和安全性,同样也不利于综合工具对其进行优化。采用两段式或者三段式的话,eda工具能知道你描述的是一个状态机,具体是采用两段式还是三段式,和具体设计相关(是FPGA还是ASIC,时序要求如何等)。
 楼主| fpga 发表于 2010-5-11 10:28:56 | 显示全部楼层
Moore状态机的输出只与当前状态有关,与输入无关
Mealy状态机的输出不仅与当前状态有关,而且与当前的输入有关。
fpgaw 发表于 2010-5-14 21:19:55 | 显示全部楼层
经典状态机的论文
http://www.fpgaw.com/viewthread.php?tid=1656&highlight=%D7%B4%CC%AC%BB%FAverilog
fpgaw 发表于 2010-5-14 21:20:08 | 显示全部楼层
状态机资料
http://www.fpgaw.com/viewthread.php?tid=1385&highlight=%D7%B4%CC%AC%BB%FA
ljpdb 发表于 2010-6-3 10:20:55 | 显示全部楼层
不错,很好!
fenlido 发表于 2010-7-22 21:16:37 | 显示全部楼层
iamzhongzheng 发表于 2010-7-26 21:17:20 | 显示全部楼层
恩,不错
正在学习
ktboy0502 发表于 2010-8-2 20:05:46 | 显示全部楼层
很好,谢谢
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-23 12:14 , Processed in 0.066268 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表