彻底理解锁存器,让你不再为锁存器头疼!
锁存器(latch):是电平触发的存储单元,数据存储的动作(状态转换)取决于输入时钟(或者使能)信号的电平值,尽当锁存器处于使能状态时,输出才会随着数据输入发生变化。
分为普通锁存器和门控锁存器,普通锁存器无控制信号,输出状态始终直接由输入决定。在实际的数字系统中,为了协调各部分的工作,往往需要有一个特定的控制信号去控制锁存器状态转换的时间,在控制信号无效时,输出保持不变,不随输入变换;当控制信号有效时,输出由输入决定,跟随输入变化。
①正是因为门控锁存器在控制信号有效的期间内,都可以接收输入信号, 所以,激励信
号的任何变化, 都将直接引起锁存器输出状态的改变。这时输入信号若发生多次变化,输出
状态也可能发生多次变化,这一现象称为锁存器的空翻。
②其次,当门控锁存器的控制信号有效时,锁存器就变成了一个组合电路,时序逻辑电
路的模型就等效为两个各组合电路互为反馈的反馈系统,因此,系统有可能会因为瞬态特性
不稳定而产生振荡现象。
触发器(flip-flop)是边沿敏感的存储单元,数据存储的动作(状态转换)由某一信号
的上升或者下降沿进行同步的(限制存储单元状态转换在一个很短的时间内) 。(钟控 D 触
发器其实就是 D 锁存器,边沿 D 触发器才是真正的 D 触发器)
触发器分为两种,一种是主从触发器和边沿触发器。主从触发器在时钟有效期内 (主触
发器) 接收数据,在时钟边沿输出状态转换。 边沿触发器在时钟边沿期间, 触发器才接收数
据并使输出状态转换。
目前,主从触发器基本上已经很少见了,实际使用的大都是边沿触发器。
寄存器(register):用来暂时存放参与运算的数据和运算结果。在实际的数字系统中,
通常把能够用来存储一组二进制代码的同步时序逻辑电路称为寄存器。
区别与联系:由于触发器内有记忆功能,因此利用触发器可以方便地构成寄存器。由于
一个触发器能够存储一位二进制码,所以把 n 个触发器的时钟端口连接起来就能构成一个存
储 n 位二进制码的寄存器。
从寄存数据的角度来讲,寄存器和锁存器的功能是相同的;它们的区别在于寄存器是同
步时钟控制,而锁存器是电位信号控制。
一般的设计规则是:在绝大多数设计中避免产生锁存器。它会让您设计的时序完蛋,并
且它的隐蔽性很强,非老手不能查出。锁存器最大的危害在于不能过滤毛刺 (使能信号有效
时,输出状态可能随输入多次变化,产生空翻) 。这对于下一级电路是极其危险的。所以,
只要能用 D 触发器的地方,就不用锁存器。
基本概念:
触发器是指有时钟边沿触发的存储单元。锁存器指一个由信号而不是时钟控制的电平敏
感的设备。
锁存器的工作原理:
锁存器不同于触发器,锁存器在不锁存数据时,输出端的信号随输入信号变化,就像信
号通过一个缓存器一样;一旦锁存信号起锁存作用,则数据被锁住,输入信号不起作用。因
此锁存器也称为透明锁存器,值得是不锁存是输出对输入是透明的。
锁存器具备下列三个缺点:
(1)对毛刺敏感,不能异步复位,因此在上电后处于不确定的状态。
(2)锁存器会使静态时序分析变得非常复杂,不具备可重用性。 (首先, 锁存器没有时
钟参与信号传递,无法做 STA;其次,综合工具会将 latch 优化掉,造成前后仿真结果不一
致)
(3)在 PLD 芯片中,基本的单元是由查找表和触发器组成的,若生成锁存器反而需要
更多的资源。根据锁存器的特点可以看出,在电路设计中,要对锁存器特别谨慎,如果设计
经过综合后产生出和设计意图不一致的锁存器,则将导致设计错误,包括仿真和综合。因此,
在设计中需要避免产生意想不到的锁存器。
如果组合逻辑的语句完全不使用 always 语句块,就可以保证综合器不会综合出锁存器,
例如:
assign a = din ? x : y;
上述语句不需要保持信号 a 的前一个状态,因此肯定不会产生锁存器。
在基于 always 的组合逻辑描述语句中容易综合出锁存器的地方:1:if 语句的使用中缺
少 else 语句(前提是不是始终边沿触发);2:case 语句中没有给出全部的情况。
从上图可以看出综合出来的是锁存器。
针对这种情路可以采用一些措施来防止生成锁存器:给输出变量幅初值;增加 else 语
句;将锁存器改为带使能的触发器。如下:
此时综合出来的就是选择器。