状态机群的设计

状态机群的设计

“团结起来力量大”,“一个人做不了的事情也许十个人就能完成”,没错,当我们面对复杂问题的时候,完全可以通过使用多个状态机协同工作的方式来解决,即设计状态机群,千万不要总想着用一个状态机就将其搞定。当然了,从本质上来说,无论多么复杂的时序逻辑,只要它只包含一个时钟域,那么按照时序逻辑的定义来看,它其实都相当于一个状态机,但是由于人脑的能力有限,所以我们必须将其拆分成多个子部分,并分别进行状态机的抽象与描述。没错,这其实就是【开发流程→FPGA功能代码的编写】中提到的层次化、分模块的编程思路。按照多级状态机的结构特点,可从中总结出五类最基本的状态机群结构,即并联式状态机群、串联式状态机群、串行式状态机群、嵌套式状态机群、总分式状态机群,下面将分别进行介绍。

(1) 并联式状态机群

使用单个状态机最大的弊端就是任一时刻,状态机只能处于一个状态,因此各个状态对应的动作都是逐个发生的。如果同时有两件事情需要做,那么解决方法只有一个,就是将这两件事情对应的处理状态合并在一起,但是这样做会增加单个状态的复杂度,导致描述困难;如果这两件事情开始的时间和结束的时间都不相关,那么状态设计的难度就更加大了;如果类似这样待处理的事情不止两件,那么人脑几乎就无法仅用一个状态机来对其进行抽象;如果这些事情又不属于同一个时钟域,那么电脑也无法仅用一个状态机来实现它了,因为它就不可能仅用一个状态机来解决。

不如换个思路,既然这些事情之间没有什么相关性,那么只需要将每一件需要处理的事情抽象成一个状态机即可,这样一来,每个状态机的结构都会比较简单,整个复杂时序逻辑问题也便迎刃而解。

综上所述,凡是将一个复杂的时序问题拆分成多个独立的子时序问题,进而采用多个状态机分别解决的抽象结构,就叫做并联式状态机群。如图5 - 77所示即为并联式状态机群的原理图。
在这里插入图片描述

Summary

并联式状态机群通过将多个独立的子时序问题分解为不同的状态机来简化设计,适用于彼此之间没有相关性的任务。

(2) 串联式状态机群

如果需要做的多件事情不光可能并发,而且彼此之间还有着明显的传承关系,即数据传递,那么此时就应该用到串联式状态机群结构。注意,所谓串联式状态机群,并不是指前一级状态机的工作结束后才开始下一级状态机的工作,它内部的所有状态机仍然是同时工作,这点与并联式状态机群是相同的,不同之处仅仅在于串联式状态机之间存在着数据传递。由于数据传递对状态机行为的影响并不是直接的,因此从功能上来看,各级状态机之间仍是独立的。如图5 - 78所示即为串联式状态机群的原理图。
在这里插入图片描述

Summary

串联式状态机群适用于任务之间存在数据传递关系的情况,但各状态机仍可同时工作,只是状态之间有顺序上的依赖。

(3) 串行式状态机群

如果需要做的多件事情之间有着明显的先后关系且不能并发,那么这正好符合单个状态机的状态变迁规律,但是若每件事情本身又都比较复杂,采用一个状态机难以对所有的事情完成抽象。那么此时可以为每一件事情分配一个状态机,只不过需要在各个状态机之间传递控制信号,即前一级状态机在工作结束后才会向下一级状态机发送可以开始工作的控制信号,这便是串行式状态机群。
在这里插入图片描述

Summary

串行式状态机群适用于任务之间有明确的先后顺序且不能并发的情况,通过控制信号传递实现状态机之间的协调工作。

(4) 嵌套式状态机群

如果需要做的多件事情之间虽然不会并发,但却没有确定的先后关系,那么其实这也符合单个状态机的状态变迁规律,但是当每件事情本身又都比较复杂时,仍然无法采用一个状态机来对其进行抽象。不过此时,串行式状态机群结构就无法解决问题,因为这些事情之间是没有确定的先后关系的。所以,为了解决当前的问题,就需要用到另一种状态机群结构——嵌套式状态机群。

嵌套式状态机群的思路是:先从每一件事情抽象出一个独立的子状态机,最后再编写一个更高一层级的主状态机,每个子状态机都对应主状态机中的一个状态,子状态机完成具体的工作,主状态机的状态仅完成子状态机的调用和监控工作,注意,如果只调用、不监控,最好在主状态机和子状态机之间添加控制信号等的缓冲区,否则子状态机可能会漏掉一些响应。例如,我们需要编写一个SDRAM的控制器,SDRAM的常用操作有初始化、读、写、刷新等,那么我们可以编写四个子状态机分别对应完成SDRAM的初始化、读、写、刷新工作,然后再编写一个主状态机,状态集合包括——初始化、读、写、刷新这四个状态,当主状态机跳转至这四个状态之一时,便向子状态机发送相应的开始触发信号,并监听子状态机反馈的任务完成信号,以保证在当前操作完成后,才能开始下一个操作。由此可见,嵌套式状态机就相当于将原主状态机每一个状态该做的事情用子状态机来实现,所以子状态机好像是嵌入到相应主状态机的状态中,故得此名。通过上面的分析可知,嵌套式状态机群的各个子状态机之间也不是独立的,如图5 - 80所示即为嵌套式状态机群的原理图。
在这里插入图片描述

Summary

嵌套式状态机群适用于任务之间没有确定的先后顺序,但每个任务本身较为复杂的情况,通过主状态机调用和监控子状态机来实现功能。

(5) 总分式状态机群

如果需要做的多件事情之间不仅没有确定的先后关系,而且还可能有一次性触发多件事情的情况,那么就需要用到总分式状态机群结构了。与嵌套式状态机群的思想类似,只不过总分式状态机群中,主状态机的一个状态可能会触发及监控多个子状态机进行工作罢了。由于子状态机的工作仍受制于主状态机,因此它们之间仍不是完全独立的,如图5 - 81所示即为总分式状态机群的原理图。
在这里插入图片描述

Summary

总分式状态机群适用于任务之间没有确定的先后顺序且可能一次性触发多个任务的情况,通过主状态机触发和监控多个子状态机来实现功能。

(6) 时序逻辑的状态机群设计

时序逻辑的设计其实就是状态机群的设计,上述五种基本的状态机群结构在实际中可以非常灵活地结合运用,因此如果要去观察一些较为复杂的时序逻辑对应的状态机群关系,可以发现以上五种基本机群均可以变化为“你中有我,我中有你”,而且根据状态机将一个信号当成数据来看还是控制信号来看,甚至也会在不改变功能的情况下让这些基本机群“你变成我,我变成你”,所以状态机群的设计非常灵活,不易把握。不过通常来说,比较推荐的状态机群设计原则如下:

第一步:结合“并联”、“串联”的状态机群思路,将复杂的时序逻辑问题划分为多个独立的子问题。对于每个子问题,如果其仍过于复杂,那么继续采用这种思路对其进行划分,每划分一次,状态机群树状结构的深度便向下增加一层。通常来说,最后的状态机群树状结构以不超过3层或4层为宜。该步其实就是著名的“模块化设计思想”,它的好处有很多,诸如便于仿真、便于问题定位、便于功能重用等等,更为详细的说明参见【本篇→编程思路→设计方法学讨论】。

第二步:对于状态机群树状结构中的那些叶子节点,如果其功能已经足够简单,那么就直接使用单个状态机完成其功能抽象;否则,结合“串行”、“嵌套”、“总分”的状态机群思路,完成其功能抽象。当采用“嵌套”或“总分”的思路时,子状态机最好是不需要再拆分成状态机群结构,如果子状态机真的太过复杂,那么更大的可能性是在第一步的时候,状态机群划分得有些不太合理。

值得一提的是,状态机群的设计并不是在需要着手编写代码的时候才开始的,其实早在FPGA项目方案的设计阶段,这项工作就已经开始。

Summary

时序逻辑的状态机群设计通过灵活组合各种状态机结构来解决复杂问题,推荐遵循模块化设计原则,并在项目早期就开始设计状态机群。

总的来说以上状态机设计,可以理解为类似树状图的状态机的设计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值