关于一阶状态机跳转问题的研究与心得
来源:互联网 发布:视频制作gif软件 编辑:程序博客网 时间:2024/06/05 03:59
转自:http://www.cnblogs.com/craftor/archive/2011/04/09/2010461.html
简单来说,HDL的精髓就是if、case、FSM(有限状态机),而if、case通常又是伴随在状态机之中的。所以,状态机的重要性是毋庸置疑的。通常,在一个always或者process中,用到的都是一阶的状态机比较多,二阶以上的较复杂,代码可读性不高,所以不用常见,也极少用到。
状态机的核心在于状态的跳转,也是很多初学者头疼的地方,尤其是当一个状态机里的状态数超过10个的时候,考虑不周,很容易混乱。本文中,笔者将用一种新方式来控制状态机的跳转,不同于Xilinx或Altera的参考Coding Style。虽然不一定是最好的,但是仍有一定的借鉴价值,供读者参考交流。
通常,我们是这样定义状态机的:
verilog:parameter st1 = 8'b00000001;parameter st2 = 8'b00000010;parameter st3 = 8'b00000100;parameter st4 = 8'b00001000;parameter st5 = 8'b00010000;parameter st6 = 8'b00100000;parameter st7 = 8'b01000000;parameter st8 = 8'b10000000;reg [7:0] state = st1;
VHDL:type state_value is (st1, st2, st3, ...);signal state : state_value := st1;
这样定义状态机,就需要我们对每个状态机的功能、跳转条件非常清楚,当然,这也是必须的。
而有的时候,初学者,是一边写代码一边思考的,到底要定义多少状态数、每个状态的跳转条件,不一定都是非常清楚的。所以,如果这时候还用上述的方式定义状态机,就可能需要一边写一边修改状态机的定义。状态多到一定程度的时候,自己可能就乱了,糊涂了。那么,有没有一种更好的方法来定义状态机,省去这样的麻烦呢?答案:有!肯定有!必须有!
笔者的思路是这样的:将状态机的状态转理解成CPU中的中断向量地址,然后将状态大概分成几类,每类状态提供一个入口地址。这样,我们仅需要清楚这几类状态的入口状态跳转条件即可,状态数的增加并不会增加状态机的复杂度。
状态机的定义:
verilog:parameter st_init = 8'd0;parameter st_read_data = 8'd10;parameter st_math = 8'd20;parameter st_write_data = 8'd30;reg [7:0] state = st_init; VHDL:constant st_init :integer := 0;constant st_read_data :integer := 10;constant st_math :integer := 20;constant st_write_data :integer := 30;signal state : integer range 0 to 255 := 0;
假设状态机分成这样几类:初始化(st_init)、取数据(st_read_data)、数学处理(st_math)、写数据(st_write_data),每个类状态都不止一个,所以给第类状态预留了10个状态数的间隔。当然,这只是例子。
这样,在写状态机代码的时候,可以这样写:
verilog:case(state)st_init :st_init + 1:st_init + 2:st_math :st_math + 1:st_math + 2:st_read_data :st_read_data + 1:st_read_data + 2:st_write_data:st_write_data + 1:st_write_data + 2:default:endcaseVHDL:case state iswhen st_init =>when st_init + 1 =>when st_init + 2 =>when st_read_data =>when st_read_data + 1 =>when st_read_data + 2 =>when st_math =>when st_math + 1 =>when st_math + 2 =>when st_write_data =>when st_write_data + 1 =>when st_write_data + 2 =>when others =>end case;
状态机在同一类状态下,只需要自加1就可以了,而在同类最后一个状态才要进行状态的跳转判断,这样状态的跳转就变得容易控制了。
虽然可能看上去与一般的状态机写法和跳转法则没太大的区别,但这确实是笔者在实际应用中写代码的时候思考和探索过的问题,也确实在一定程度上减轻了状态数很多的情况下跳转问题的复杂度。
- 关于一阶状态机跳转问题的研究与心得
- 关于状态机的思想问题
- 关于野人与传教士问题的心得
- 状态机--状态机7,关于战斗兵种的状态机进阶设计与消息系统
- 关于最近研究XmlHttp的一些心得
- 关于GraphicsMagick+im4java的研究心得【原创】
- 关于研究Java中GlassPane的心得
- 研究类加载问题的心得
- 关于TCP的状态机
- 关于WF4 State Machine 状态机工作流的发布问题.
- [Perl] 关于 Bugzilla 的一些问题与研究
- 关于『65535问题』的一点研究与思考
- 关于Android在线直播问题的讨论与研究
- 关于python进制与字符转换的问题研究
- 关于Android在线直播问题的讨论与研究
- Python字符串的encode与decode研究心得——解决乱码问题
- (转)Python字符串的encode与decode研究心得——解决乱码问题
- Python字符串的encode与decode研究心得——解决乱码问题
- ubuntu指定静态IP
- 怎样在有限状态机中延时
- 天嵌科技TQ2440的uboot启动流程分析学习笔记
- 文件操作二
- Log信息获取调用类和调用方法名的实现原理
- 关于一阶状态机跳转问题的研究与心得
- arm9(TQ2440)移植小结---环境搭建
- LOG4J原理以及配置的研究
- 我有一个梦想
- 推荐9个指导开发者快速编码/学习的网站
- 如何在Android源码里查找Java中native方法对应的C++实现
- 搜索引擎面试算法
- Common Lisp开发的的窗口管理器stumpwm
- 利用XML在不同数据库中交换数据