数字电路基础-逻辑电路
组合电路的输出只与输入有关, 其运算可由真值表(truth table)完全描述;时序电路的输出和当前的输入和过去的输入都有关系。简单来说组合电路没有记忆而时序电路有记忆
常见组合逻辑电路
加减乘除器
两个二进制数相加,其中任意一位进行加法运算时,参与运算的除两位数外,还应有低位的进位。实现这种加法运算的电路称为全加器。不考虑进位的加法运算电路称为半加器
列出二位全加器布尔表达式并经过化简后可以使用常规门电路实现,根据进位方式不同,有串行进位加法器(Ripple)和超前进位加法器(Carry lookahead)两种,从性能上讲后者比前者强但后者更复杂。串行进位加法器利用代入定理简化了超前进位加法器的设计,但增加了延时。下图是 4 位串行进位加法器的实现示例
使用补码,加法器可以做减法。乘/除法器这里不做介绍,有一点需要说明,即使用 HDL 实现乘法相对比较耗时耗资源,所以 HDL 尽量少用乘法。如果乘法器必不可少,一般可以使用片上乘法单元或者使用优化好的 HDL 乘法模块
编码/译码器
编码器(Encoder)和译码器(Decoder)是互逆的操作。编码器将电信号转换为有特殊含义的编码,如 8421BCD 编码器;译码器将有特殊含义的编码为特定的电信号,如 8421BCD 显示译码器。下图为 8421BCD 编码器实现示例:
数据选择和分配器
下图为 2/4 选择器(Selector/Multiplexers)实现:
分配器(Demultiplexers):
比较器&奇偶校验
一个异或门可以用来比较两个数是否相等,而多个异或门的输出组合起来,可以实现多位数是否相等的比较。一个多位的异或函数可以计算 “模 2 和” 或输人的奇偶(如果其输人有奇数个 1,则其输出为 1)
使用异或门实现的奇偶校验电路,其连接方式有两种,菊形和树形,如下图所示
下图使用异或和或门实现了多位比较器,第一层每个异或单元的输入分别来自需要比较的数据 A 和 B
不使用算术单元可以实现数值比较器(Magnitude Comparator),即比较二进制数 A/B 的大小关系,且速度比算术单元要快。使用 HDL 实现数值比较时综合器有多种选择,使用算术单元或者使用不同的逻辑结构,此时可能需要编码人员对综合器做一些指导(即使认为干预,优化效果一般也不会超过 15%)
移位和旋转
简单的移位可以使用多路复用器实现,如下图所示。虽然这种方式简单明了,但比较耗资源
其他
七段解码器 / 优先编码器 / 三态器件
常见时序逻辑电路
存储器
半导体存储电路中使用的存储单元可以分为静态存储单元和动态存储单元两大类。 静态存储单元由门电路连接而成,其中包括各种电路结构形式的锁存器和触发器。 只要不切断供电电源,静态存储单元的状态会一直保持下去。 动态存储单元则是利用电容的电荷存储效应来存储数据的。由于电容的充放电需要一定的时间,因而它的工作速度低于静态存储单元
SR Latch&Flip-flop
SR 锁存器(Set-Reset Latch)可以使用不同的电路实现,比如使用两个与非门、两个或非门等,SR 锁存器是静态存储器的基础单元。锁存器新的状态 T(也称为次态) 不仅与输入状态有关, 而且与锁存器原来的状态(也称为初态)有关, 故将 Q 也作为一个变量列人了真值表, 并将 \(Q_{+1}\)(有时候也用 \(Q^*\) 表示)称为状态变量,将含有状态变量的真值表称为锁存器的特性表。SR 中 R 表示置零,S 表示置一
SR 锁存器的特点是一旦 Q 输出稳定,此时撤销 S/R 端信号,Q 的输出也会一直保存,Q 和 \(\bar Q\) 相互锁定。因为两个门电路之间的对称性,上图中 Set/Reset 操作也是对称的
SR 锁存器两端同时从 1 跳变为 0 会造成器件的震荡或者不稳定,为避免此类情况,部分器件给出了端口同时跳变的时间间隔,超过一定间隔后发生的跳变不看作“同时跳变”,这可避免器件进入亚稳态。这个时间间隔有时被称为恢复时间(\(t_{rec}\)),其会影响最小脉冲的设定
SR 锁存器的另一个缺点是输入的变化会直接影响输出,对于存储器而言,存储状态不应该直接跟随输入,需要有个 Load (CLK)信号来告知存储器件什么时候修改存储值,这就引出了触发器
触发器(flip-flop,双稳态器件,bistable devices)与锁存器的不同在于,它除了置 1、置 0 输人端以外,又增加了一个触发信号输人端(CLK)。触发器按照其特点,有两大分类方式:按触发方式(电平、脉冲、边沿) 、按逻辑功能(RS、JK、D、T)
触发器的逻辑分类
SR & D
为 SR 锁存器添加触发信号端即形成 SR 触发器(\(Q^{*}=S+R^{\prime} Q, SR=0\))。将 SR 触发器的输入端用反相器连接在一起即得 D 触发器,D 触发器(\(Q^{*} = D\))的特点是跟随
JK & T
T 触发器(\(Q^* = TQ'+T'Q, T = 1\)),每个 CLK,输出翻转一次(注意约束条件是 \(T=1\)),所以 T 触发器的输出频率是时钟频率的 1/2,T 触发器常用于分频与计数。使用 JK 触发器(\(Q^* = JQ'+K'Q\))可以很方便的实现 T 触发器:JK 输入端直接相连即为 T 触发器。下图为 JK 触发器逻辑图。使用边沿 D 触发器也可以构造 T 触发器
水平/边沿/脉冲
SR 水平触发器与锁存器的不同在于,它除了置 1 、 置 0 输人端以外,又增加了一个触发信号输人端。只有当触发信号到来时,触发器才能按照输人的置 1、 置 0 信号置成相应的状态,并保持下去。水平 D 触发器在 SR 触发器的基础上新增了一个反相器,从而实现一个信号控制触发器的状态,如下图所示:
水平触发器有个缺点,CLK 有效期间输入的波动会直接影响寄存器的输出。为了提高触发器的可靠性,增强抗干扰能力,工程师希望触发器的次态仅仅取决于 CLK 信号下降沿(或上升沿)到达时刻输入信号的状态,这就引出了边沿触发器。下图是使用 D 触发器实现的边沿触发器,因为 D 触发器的跟随特性,主触发器只会采样到 CLK 高电平结束瞬间的信号。使用传送门实现的边沿触发器更为简单,细节请参考其他资料
脉冲触发器和边沿触发器很像,其和边沿触发器的区别在于触发器的输出和有效脉冲期间的输入状态相关,而不仅仅是上升沿或者下降沿,下面以 JK 触发器为例做简单的说明
SR 锁存器在 SR 端都为 1 时,后续 Q 与 Q’ 信号是不确定的。JK 水平触发器通过引入反馈,消除了输入信号同为 1 造成输入结果不确定的问题,但同时引入了复杂性:一个周期内 Master latch 只能翻转一次。因为主 latch 只能翻转一次,所以脉冲有效期间如果主 latch 输入信号发生了不可预测的变化,那么触发器的输出也是不可预测的
时序电路的动态特性
延迟(Delay)
因电信号的传播速度有限,一个逻辑单元输出与时钟信号(或者输入)有一定的时间偏差,这个偏差被称为延迟(Delay)。下图展示了边沿 D 触发器时钟和输出端的 delay
传播延迟(Propagation delay)是指从输入发生变化到它所引起的输出发生变化的这段时间。一个给定的锁存器或者触发器,对于不同的输人输出信号对,可能有几种不同的传播延迟规格(如下面图中的 \(t_{pHL}/t_{pLH}\))。也就是说,输出从低到高变化与从高到低变化时,传播延迟的规格可以是不同的
稳态与亚稳态
上图是使用两个反相器实现的双稳态器件。使用 CMOS 工艺实现的反向器的传输函数如图 a 所示,输入电压在1~2v 时因为 MOS 管进入高增益区间,反相器的传输函数也进入快速变化区间
由图 b 可知,双稳态器件有三个稳定点,其中中间那个点是亚稳态,合理的电压噪声会促使电路退出不稳定点,随机进入一个稳定点
真实电路任何一点电压都不会突变,都有一个变化的过程,锁存器都有一个最小脉冲宽度(\(t_{pw(min)}\))的参数,输入电压维持时间小于这个时长可能造成锁存器的震荡,并最终造成不可预测的结果
上图是 D 寄存器波形图,D 寄存器解决了 SR 锁存器 S=R=1 的问题,但亚稳态问题依旧存在。如上图所示,G 下降沿附近有一个时间窗口(阴影部分),这个时间段内 D 的信号必需保持稳定(setup&hold),否则寄存器输出无法预测