理论上说,任何一个需要周而复始的执行一系列任务(例如CPU中按顺序从存储器取出指令、再执行指令)的时序系统都可以用状态机(state machine)模型来描述。时序系统的运行周期可以描述为一个预定顺序的时间周期序列,每个周期都对应状态机中一个指定的状态。状态机在每个周期中产生特定的操作,完成相应的任务;同时,状态机由时钟驱动,按照外部输入信号和当前状态的反馈,在下一个周期到来之际进行预定的状态转移。
根据状态数目是否有限,状态机可以分为有限状态机和无限状态机;根据是否有一个公共的时钟控制,状态机可以分为同步状态机和异步状态机。其中,最常用的同步有限状态机又可以分为以下两种类型:Moore状态机和Mealy状态机。
图1. 同步有限状态机示意图
Moore状态机的特征是其输出z(t)与输入x(t)无关,只与当前状态s(t)有关。状态寄存器的当前状态s(t)为现态,当前输入x(t)和现态s(t)共同输入组合逻辑C1后,使状态机进入的下一个状态s(t+1)称为次态。在时钟clk的驱动下,状态机不断进行s(t)→s(t+1)的状态转移。与Moore状态机相比, Meanly状态机主要差异是:其当前输出z(t)不仅与当前输入x(t)有关,而且还与现态s(t)有关。上述状态机的核心是状态转移电路,其主要有以下两种类型:环形计数器和扭环计数器。
环形计数器是由D触发器构成的移位寄存器加上反馈电路闭环构成,四位环形计数器的电路如下图2所示:移位寄存器的低位触发器输出端接入相邻高位触发器输入端,而反馈电路从最高位触发器的串行输出端接入,其输出则连到最低位触发器的串行输入端。
图2. 环形计数器的时序逻辑电路
环形计数器不能自启动,在开始运行前必须使能信号#START=0,使得环形计数器的四位触发器输出[D3, D2, D1, D0]的状态初始化为0001;然后,在时钟CLK驱动下,四位环形计数输出[D3, D2, D1, D0]按照以下顺序循环转换:0001→0010→0100→1000→0001→…如下图3(左)所示。环形计数器的特征是:n位环形计数器的状态数目N=n,而且其输出[D3, D2, D1, D0]是单热点(one hot)编码,即任何状态下只有一个Dx=1。所以,环形计数器的输出Dx即是状态的节拍信号,标志相应的状态。
图3. 环形计数器和 扭环计数器的状态图
扭环计数器的结构同环形计数器基本类似(2位扭环计数器的电路如下图4所示),只是其反馈电路略有差别:扭环计数器的反馈电路是从最高位触发器的串行输出端接入,经过反向后再连到最低位触发器的串行输入端。2位扭环计数器的状态图则如上图(右)所示:扭环计数器的初始状态00,在CLK时钟驱动下,其输出[DB, DA]按照以下顺序转换:00→01→11→10→00→…扭环计数器的优点是具有自启动特性,无须初始化;而且n位扭环计数器的状态数目N=2n,比n位环形计数器的容量高一倍,效率较高。但是扭环计数器的输出不是单热点(one hot)编码,所以其2位触发器输出端须通过2-4译码器74LS139才能转换成状态的节拍信号:S0→S1→S2→S3→S0→…
图4. 扭环计数器的时序逻辑电路
在上述扭环计数器构成的状态转移电路中,状态机的下一个状态(次态)仅由当前状态(现态)决定。在一些更复杂的时序系统中,状态机的次态不仅与现态有关,而且还与当前输入有关,例如下图5(右)所示的状态图中,当前状态S0时,若输入条件C0=0,状态机保持在状态S0;若输入条件C0=1,则在时钟clk的驱动下,状态机如常进行状态转移:S0→S1。该状态图对应的扭环计数器电路如下图5(左)所示,在反馈电路上增加了基于条件C0的判断逻辑。值得注意的是,条件C0只在状态S0有效,其它状态不起作用。
图5. 条件判断的扭环计数器
图6所示是一个交通灯系统,展示如何运用状态机原理来设计时序系统。交通灯的状态机总共有T1、T2和T3三个状态,每个状态都有不同的亮灯模式和亮灯持续的时间(以倒计时的形式显示),如下图6(左)所示。该状态机没有输入,其状态转移仅仅取决于当前的状态。在时钟clk(φ)驱动下,状态机按照以下顺序循环转移:T1→T2→T3→T1→…,状态转移时序图如下图6(右)所示。
图6. 交通灯的状态图和状态转移的时序图
交通灯系统的电路如下图7所示:环形的路口上有南北向的两组红黄绿LED灯和一对数码管(显示倒计时),路口左边是整个系统的核心:时序发生器电路;路口下方是一个由BUS总线连接的计数器电路。在上图6(左)中,状态机在每个状态【Tx】中完成两个操作:LED灯亮和显示倒计时。时序发生器产生节拍{#T1, #T2, #T3},直接控制红黄绿交通灯;而计数器电路负责数码管的倒计时显示。
图7. 交通灯系统电路图
时序发生器电路如下图8(左)所示:右边的状态转移电路是由两个D触发器组成的2位扭环计数器,其反馈电路增加了限制:若扭环计数器当前状态输出端为01,则下一个状态输出端被强制修改为10,即跳过状态11。因此,扭环计数器输出经过2-4译码器后产生以下节拍序列{#T1, #T2, #T3}:{0,1,1}→{1,0,1}→{1,1,0}→{0,1,1}→…状态图则如下图8(右)所示。状态转移电路左边是一个基于寄存器74LS175的状态寄存器电路。当加载信号#LOAD=0时刻,其下降沿将把节拍序列{#T1, #T2, #T3}锁存,输出信号{R,Y,G}控制红黄绿交通灯:节拍 #T1和#T3分别反向生成信号G(绿灯亮)和R(红灯亮),节拍#T2则反向后和时钟信号CLOCK逻辑与生成信号Y(黄灯闪烁亮)。
图8. 交通灯时序发生器电路及其状态图
值得注意的是,状态转移电路输出的节拍序列{#T1, #T2, #T3}实际上是红黄绿交通灯当前状态【Tx】的次态【Tx+1】(即下一个状态 ),当加载信号#LOAD=0的下降沿时刻,节拍序列{#T1, #T2, #T3}加载到状态寄存器,生成交通灯新状态【Tx+1】。然后,信号#LOAD=1加载完成之际,其上升沿触发右边状态转移电路,刷新节拍序列{#T1, #T2, #T3}为交通灯当前状态【Tx+1】的次态【Tx+2】,等待下一次加载时刻(#LOAD=0)到来。
本文的内容节选自作者编撰的教材专著《基于Proteus的计算机系统实验教程——逻辑、组成原理、体系结构、微机接口》(机械工业出版社),更详细的内容可以直接在书中查阅。
读者如有兴趣,可以在 当当网图书, 京东图书,亚马逊上搜索作者姓名赖晓铮即可找到这本著作。
本书详细描述了在proteus虚拟仿真环境中,从逻辑电路开始,一步一步构造运算器、存储器、控制器,最终用三种CPU体系架构(微程序、硬布线、流水线)实现了一个8位的CPU。并且,这个CPU不仅可以做逻辑、算术运算,拥有循环、分支、堆栈等程序结构,还可以完整实现对8086所有外设的控制,即替代8086完整实现了传统《微机原理》里讲到的所有外设实验。
本书的全部proteus工程文件,PPT,实验视频以及配套的两种形式课程设计(纯汇编、硬件改动)的资料都放在 百度网盘,提取密码:34ad
广州风标为本书配套了实验箱(如下图所示),可以让学生在电脑的proteus虚拟仿真环境中设计CPU或选择已有的8086、8051、ARM等CPU模型,然后通过虚拟总线映射到实验箱的物理总线,控制实验箱面板上的真实外设。有兴趣的读者可以自行联系 广州风标教育技术股份有限公司。