时序逻辑电路
[TOC]
第一讲 | 时序逻辑电路概述
输出结果的输出不仅由外部输入决定,还由当前的状态决定(or 由过去时刻的行为)
当输入新的信号之后,电路的状态可以改变,也可以保持在当前状态
有限状态机 | Finite state machine (FSM)
有限状态机时用来刻画状态转换的工具
通常,用状态图来表示有限状态机
- 状态用圆圈表示
- 状态转换用箭头(
有向边
),并标注状态转变的输入信号和输出信号;
在图中,状态转换的箭头上面用 输入信号/输出信号 表示输入和输出
例:检测输入序列是否为连续4个“1”
A-初始态:若输入1,则转B
B-连续1个“1”:若输入1,则转C
C-连续2个“1”:若输入1,则转D
D-连续3个“1”:若输入1,则状态不变 ,并输出为1(表示检测到连续4个1)
任何状态下,输入0都会转到初态A

如何用数字逻辑实现一个FSM?
用二进制编码的方式,表示输入输出,状态(关键是状态)
- 输出函数:由初态来决定输出(
Moore型
)、由输出和初态来决定输出(Mealy
型)
实际采取Moore型还是Mearly型由设计得到的输出函数决定
- 激励函数:输入初态,得到激励输出
- 记忆模块:用D触发器存储当前状态(每一位状态编码用一个D触发器来存储)
时序逻辑电路的结构
状态记忆模块:由多个状态记忆单元构成(存储元件)
次态激励逻辑模块F :激励函数(现态和外部输入的逻辑函数)
激励函数和输出函数都是组合逻辑电路,状态记忆模块是时序逻辑电路
输出逻辑模块G :输出函数(现态和外部输入的逻辑函数)
Mealy型:输出依赖于当前状态和当前输入信号
Moore型:输出仅依赖于当前状态,和当前输入信号无关


其中的激励函数和输出函数模块都是组合逻辑电路
!!!
记忆模块把旧的状态给激活函数和输出模块,然后激励模块才把新的状态给记忆模块;
拿旧状态去算新状态和输出!
同步时序逻辑电路 和 异步时序逻辑电路
- 同步时序逻辑电路:在统一的时钟信号控制下进行状态转换
通过Clk来控制记忆模块
异步时序逻辑电路:没有统一的时钟信号来控制状态的改变
时钟脉冲
时钟脉冲之间的时间间隔称为时钟周期
。单位是秒。通常将1秒内所产生的脉冲个数称为时钟频率
。单位是Hz计算机中的系统时钟就是一个典型的、频率精确和稳定的脉冲信号发生器。
时序逻辑电路的定时

第二讲 | 锁存器和触发器
双稳态元件
一种可以表示两种状态的元件。
- 状态1:置位态(Set)
- 状态0:复位态(Reset)
双稳态元件的简单实现:
串联两个反相器,则反相器的输出状态不同,且保持稳定Q为高电平时,为置位状态;Q为低电平时,为复位状态

用两个反相器串联构建的 双稳态元件无法改变电路状态
用1个或多个输入信号能驱动 双稳态元件进入稳定状态,这 些输入信号称为激励信号 或激励输入。
锁存器 | latch
通过激励信号的电平信号来控制存储元件的状态
置位复位锁存器(Set-Reset latch):
- 具有置位和复位激励信号置位激励信号Set有效时,强制存储元件的输出Q为1
- 复位激励信号Reset有效时,强制存储元件的输出Q为0

触发器 | flip-flop
具有时钟控制信号(clock) 通过时钟信号的边沿和set/reset的电平共同来触发存储元件改变状态

SR 锁存器
SR锁存器:使用一对交叉耦合的或非门构成双稳态电路,也称为置位-重置(复位)锁存器。
S是置位输入端,R是重置输入端
从输入驱动信号有效开始,到输出达到稳定为止有一定的延迟,这个延迟称为触发延迟或**锁存延迟
**

- S和R至多一个为高电平
- 如果S为高电平的话,Q输出高电平;如果R为高电平的话,Q输出低电平。
状态转移表,状态转移方程
使用状态转移表来表示状态的转移。
状态转移方程:
$$
Q*= S+ \overline R \cdot Q
$$
$$
S \cdot Q \neq 1
$$
D锁存器
D锁存器有一个驱动信号和一个使能端
当使能端为高电平的时候,驱动信号才能有效,驱动信号为高电平的时候,输出高电平;

D为数据输入端,C为控制端;只有一个激励输入端
C=0的时候,电路状态不变;C=1时,将D的数据锁存。
状态图,状态转移表,状态方程,时序图:
D | Q* |
---|---|
0 | 0 |
1 | 1 |

D触发器
主从结构的D触发器

CLK | 主锁存器 | 从锁存器 |
---|---|---|
L | 写入 QM变为D | 不变Q=last |
上升沿 | 锁存QM=D | 写入Q变为QM |
H | 不变 QM=D | 不变Q=QM |

(上升沿到来之前,把D已经存入QM,之后在上升沿结束以后把QM存入Q)
锁存延迟 | Clock -> Q延迟
在clk边沿到来后,到Q输出改变为D的时间。

建立时间 | setup
输入信号D在时钟边沿到来前,需要稳定的时间**主锁存器
稳定下来的时间**。
保持时间 | hold time
输入信号D在时钟边沿到来后,需要稳定的时间,要让从锁存器
成功写入的时间。
避免主锁存器在上升沿过程中写入新的D值
这个D触发器是上升沿触发,还有下降沿触发的触发器

当Clk信号为高电平时,左边的D锁存器打开,Q和D的信号一致;
当Clk信号由高电平转成低电平的时候,右边的寄存器打开,使得第二个寄存器能够输出原先D的信号。
带使能端的D触发器
能够通过使能端控制是否要写入激励输入端D的值

注意到: 前面其实接入了一个二路选择器,输入分别是D和Q,使能端为EN;
带复位功能的D触发器
同步触发:在时钟信号才能更改触发器的状态
PR: preset,CLR:clear

T触发器
在每一次时钟周期都会改变存储的状态,每一次时钟周期到来都会取反。
隐藏了初始化的线路,实际上是有初始化的功能的。

可以加入使能端En,当使能端为高电平时才能改变触发器;
存储? 电路在一直工作的时候,只要在一定的激励输入下,输出稳定不不变,Q值保持稳定,因此为存储
组合逻辑电路只能按照输入计算出输出,不是存储。
最简单的时序逻辑电路: 存储元件(锁存器和触发器)
经典的时序逻辑电路:寄存器
第三讲 | 同步时序逻辑设计
设计一个检测是否由连续的“101”的电路
分析需求,画状态图

状态图/状态表的要求:
互斥性:从每个状态出发的所有状态转换路径上的转换条件都 是互斥的,如本例中,转移条件分别是X=0和X=1,互斥。
完备性:从每个状态出发的所有状态转换路径上的转移表达式 的逻辑或等于1(逻辑真)。如X=0和X=1,0+1=1。
即,线不少(所有的有向边都要画出),线不重(同一个输入只能有一个输出)
化简状态图
等价状态:两个状态等价指在所有输入组合下,它们的输出相同且(次态相同 或次态等价)
我们合并等价状态可以获得简单的状态表

将所有给定相同的输入X得到相同的次态的现态编码为同一种。
状态编码
将化简之后的状态表中的每一个状态进行编码。显然,编码尾数m要满足$2^m > n$ ,n为状态数目。
通常采取相邻法来寻求较优的编码方案:
- 次态相同,编码最好相邻
- 同一个现态的次态最好相邻
- 输出相同的现态最好相邻
考试会给出确定的编码
有了编码以后,就可以用编码来表示状态了:

之后,我们可以得出次态的每一位(Y1* and Y0* )以及输出(Z)的次态输出函数和输出逻辑函数:
$$
Y1^{*} = \overline Y1 \cdot Y2 \cdot \overline X
$$
$$
Y0\text{有多个1,写起来比较复杂,但是我们可以通过无关项化简}
$$
$$
Z=...
$$
因为我们有一个编码没有用上:10,所以这个是无关项,我们在上面三个逻辑函数的卡诺图中都加上无关项d



电路设计
推导激励函数
我们需要根据次态函数
和存储元件的特征方程
,通常我们使用D触发器
$$
\text{状态转移方程为} Q^*=D
$$
所以我们可以得到激励函数:

$$
\text{次态方程: } Y1^* = \overline Y1 \cdot Y0 \cdot \overline X
$$
$$
\text{次态方程: } Y0^* = \overline Y1 \cdot Y0 \cdot X
$$
含义是,现态
(Y1,Y0)和输入(X)经过运算,作为触发器的激励输入,得到次态(Y1* ,Y0*)。
画电路图

在这里,包括了次态激励模块,状态记忆存储模块,输出模块
电路分析
未用状态分析
因为编码空间大于实际的状态数目,所以存在未用状态;可能在未用状态进入了循环,称为挂起现象。
如果电路能够在有限的时钟内,进入正确的工作状态,有正确的输出,称为电路能够自启动。
对于我们前面的未用状态:10
当输入x为0时,带入激励函数,得到次态00,输出0;次态正确,输出正确。
输入x为1时,得到次态01,次态正确,但是输出为1,错误;
因此需要对输出函数进行一些修改:
$$
Z=Y1X \rightarrow Z=Y1Y0*X
$$
电路定时分析

- 时钟信号改变 -> D触发器的输出改变->计算次态 | clk-to-Q延迟+ 组合逻辑延迟+ 触发器setup
需要setup的原因,setup时间是将D1信号存入
主锁存器
,如果没有setup时间,那么当时钟沿到来的时候,没法成功地将正确的信号给从锁存器
;
- 而输出因为只依赖于现态和输入,因此只要输出延迟小于一个clk周期就行。
延迟限制:
- clk周期 > clk_to_Q + 次态激励函数延迟+D触发器的setup时间
- clk周期 < 输出逻辑函数的延迟
- hold时间 < clk_to_Q+次态函数逻辑延迟
第三条需要的原因是: 我们知道输出函数一定是依赖于初态的,如果在锁存延迟和激励函数延迟太短的话(低于setup)就会导致输出信号的异常。因为setup的定义就是:输入端D,在setup时间内,一定不能改变,否则就会导致输出信号的错误。
第四讲 | 典型的同步时序逻辑电路设计
计数器
异步行波加法计数器
这里的异步指的是clk信号不同,前面章节说的异步时序逻辑电路指的是没有一个统一clk来驱动电路
我们可以借助T触发器来设计一个计数器

因为每一个T触发器都是在clk信号下降沿
时触发, 前一个触发器改变两次(一个周期)才能引起下一个触发器变化一次,从而实现计数的原理。
延迟: 四个锁存延迟
同步并行加法计数器
- 所有的触发器都使用同一个clk信号

延迟: 与门传播延迟+触发延迟
异步行波减法计数器
这里虽然用的是D触发器,但是其实和T触发器的功能是类似的,只不过多了一个RST

这里的触发器是上升沿触发,即从0->1的时候,才会引起下一位的变化
寄存器
寄存器是一种时序逻辑电路,只能存储数据,在没有新的clk脉冲到来之前,寄存器能够保持内容不变。
在CPU里面寄存器通过三态门和总线相连(同一时刻,只能有一个寄存器将数据送入总线)

可以给寄存器中,加入复位,清零,使能等功能。
寄存器堆
寄存器堆也称GPRs(通用寄存器组:Gerneal Purpose Register set)
寄存器堆中的每一个寄存器都有它的编号。
bus的意思是
总线
图中为一个简单的寄存器堆的示意图:

- busW是写入的信号,具体写入那个寄存器要由RW(写入寄存器的编号)决定。busW的数据有n位,说明每一个寄存器也是n位,即每一个寄存器都有n个D锁存器。
- RW,RA,RB代表的寄存器的编号,因此最多只能有$2^k$个寄存器。
- 读操作是组合逻辑操作 ,写操作属于时序逻辑操作。

一个可能的结构如下图所示:

其中busA和busB一直有数据,不由clk决定。 As long as the circut is working!
每一个寄存器是32位,里面有32个D锁存器;
寄存器有2^5个。
思考:如果正在写寄存器1,到那时又要读寄存器1,那么读出来额度是旧的还是新的?
注意busW,busA和busB的位数都代表数据的位数,而RA,RB,RW的位数代表了选择端的位数,最多从2的多少次方里面选择
移位寄存器
能够根据clk的信号来控制,实现左移 or 右移的操作。

四位通用移位寄存器:

具体实现比较复杂,这里略去。
桶型移位器:
这其实是一个组合逻辑电路,而非时序逻辑电路,在Lab2中有涉及
