时序逻辑电路

# 时序逻辑电路

# 概述

输出方程 状态方程,次态方程

驱动方程(激励方程) 存储电路的输入信号

同步时序电路、异步时序电路

米利型 穆尔型 穆尔型 输出仅取决于存储电路的状态

时序电路是在有限个状态间转换,也称状态机state machine SM

# 时序逻辑电路的分析方法

同步时序逻辑电路的分析方法

写出驱动方程

写出状态方程

写出输出方程

各种图

状态转换表 类似真值表 假定一个初始状态,然后写出输出

将该状态当成初始,写出输出 检查有没漏的

状态转换图

以圆圈的内容表示当前状态

箭头表示转换的方向。通常将输入变量写在斜线上、输出写在斜线下

状态机流程图

类似算法流程图

时序图

异步时序逻辑电路的分析方法

# 若干常用的时序逻辑电路

移位寄存器,可实现串行-并行转换、数值运算以及数据处理

计数器

分类

# 时钟

# 时钟频率是个什么概念?? - 知乎 (opens new window)

时钟都是通过振荡器产生的。

振荡器有很多种,根据不同的时钟需求会使用不同的振荡器。

原始时钟信号一般会通过晶体振荡器产生。晶体振荡器的特点是根据晶体特性存在一个谐振频率,而且品质因子Q(目标频率能量占总能量的比值)非常高。这能够产生一个噪声非常小、震荡频率非常精确的时钟信号。

对于精度要求不那么高的时钟,也有使用LC振荡器生成的,不过很少见。

次级时钟信号可以通过将主时钟信号输入分频/倍频电路得到,比如锁相环。

锁相环的核心是鉴相器和压控振荡器。鉴相器比较输入时钟信号和输出时钟信号的相位差别,并将相位信号转化为电压信号,然后这个电压信号通过压控振荡器变为输出时钟信号。由于反馈回路的存在,输入和输出时钟会保持一个固定的相位差,这意味着两者频率完全相同。

通过在鉴相器输入端加入分频器,可以实现非整数倍倍频和分频电路。

还有一类通过外部输入信号产生时钟的电路——CDR(clock data recovery)。

因为外部输入的信号使用的是外部的时钟,和本地时钟存在同步问题,所以无法直接使用本地时钟采样。如果没有外部时钟输入,就必须从输入的信号中还原出外部时钟,这就是CDR电路。

CDR的基础结构和锁相环挺相似的,但是在滤波和鉴相电路上做了修改以保证输出时钟的稳定性,具体就不展开了。

上面这些没有电路基础大概看不懂吧……需要时钟的理由稍微简单一点……

任何电路都是有延迟的,从输入信号输入到电路完成计算输出结果是需要时间的。但是麻烦的是这个时间对于所有电路都是不一样的,所以我们不知道究竟要等多久上一个电路才算是完成了运算,可以读取输出了。对于人来说这个问题还不大,我们只要多等等保证算完了就好了,但是对于电路来说就麻烦了:每一级电路都需要上一级电路的输出结果作为输入,可是要等多久上一级才能完成计算?就算我知道上一级的计算需要10ns时间,但是我该从哪里开始计时?用什么进行计时?

于是电路设计师们不得不加入了非常复杂的“握手信号”来控制数据读取,简单的说就是前一级电路在完成运算之后向下一级发送一个“可以读取了”的信号,下一级收到这个信号之后才能读取;下一级读取完毕之后再发一个“我读完了”的信号返回上一级,上一级才能开始下一个运算。

这不仅浪费了大量的电路在握手上,还极大地加大了设计难度。

为了解决这个问题,工程师们设计了“同步电路”。同步电路加入了时钟信号,所有电路模块的读取与输出都受到时钟信号的控制。

比如一个电路模块,每次计算需要至多100ns的时间,而电路的时钟周期是50ns。那么我就知道这个电路至多需要两个周期的时间就能完成运算。为了冗余安全,我将这个模块设计为每三个时钟周期进行一次运算,它的下一级电路也每隔三个周期执行一次读取即可。

有了时钟信号,我只需要对每个电路设计“隔几个周期进行读/写”即可,不再需要在所有模块之间都设计握手信号,这极大地降低了设计难度。

指令执行周期指的是一条CPU指令,需要多少个CPU时钟周期(一个时钟周期内时钟信号震荡一次)完成。

典型RISC架构一条指令至少需要4个周期:

一个周期读取指令

一个周期读取执行指令所需的数据

一个周期执行指令

一个周期写入执行结果

可以看到这四个步骤是不同的电路模块负责的,在其中一个模块工作时,其他模块是空闲的。为了不浪费其他模块的时间,处理器采用了流水线结构,4条指令并行处理:

首先读取第一条指令。

第一条指令读取数据的时候,第二条开始读取指令。

第一条指令执行的时候,第二条开始读取数据,第三条开始读取指令。

第一条写入结果的时候,第二条开始执行,第三条开始读取数据,第四条开始读取指令。

第二条写入结果的时候,第三条开始执行,第四条开始读取数据,第五条开始读取指令。

……

实际上的处理器架构和指令都会更加复杂,所以需要更多的时钟周期才能处理。

比如最丧心病狂的NetBurst架构Prescott核心,使用了31级流水线,一条指令需要整整31个时钟周期,真是走火入魔了……

同步数字系统都需要“时钟” (Clock),其实我觉得台湾的翻译 “时脉 ”更贴切。

时钟就是一种信号,它给数字系统中每一个时序逻辑指定一个开始工作的时间点。

我们可以假想一条流水生产线:每一个加工步骤的工人在完成对一个部件的加工后, 如果啥也不管就直接扔给下一步骤的工人,同时下一步骤完成加工比前一工位慢;那么可以想见 ,部件就在比较慢的这个工位上堆积起来, 越堆越多, 最后造成生产线的阻塞。

所以为了保持流水线流畅不阻塞的运转,我们需要找出最慢的工位, 并把最慢工位处理一个部件需要的时间作为 “时钟周期”,然后由工长通过哨音,每隔一个时钟周期吹响一次哨子,工人们只在哨子吹响的时候才把部件传递给下一工位,这样就可以保证流水线不再发生阻塞。

时钟频率就是时钟周期的倒数,也就是上面例子中,每秒钟工长吹响哨子的次数。