言归正传,dff 是边沿敏感的,latch 是电平敏感的。
上图使用情况:
功能模拟:
以下部分摘录别人的技术经验:
锁存器(latch)和DFF(D触发器)的区别
1、锁存器由电平触发,异步控制。 当使能信号有效时,锁存器相当于一条通路,当使能信号无效时,锁存器保持输出状态。 DFF由时钟边沿触发并同步控制。
2、Latch容易产生毛刺(),但DFF不易产生毛刺。
3. 如果使用门电路来构建锁存器和DFF,则锁存器比DFF消耗更少的门资源。 这就是latch优于DFF的地方。 因此,在ASIC中使用Latch的集成度要高于DFF,但在FPGA中则相反,因为FPGA中没有标准的Latch单元,但有DFF单元,而一个LATCH需要多个LE来实现。
4. Latch使得静态时序分析变得极其复杂。
一般设计规则是:在大多数设计中避免使用锁存器。 它会破坏你设计的时序,而且非常隐蔽,没有经验的用户无法察觉。 插销最大的危险是不能过滤毛刺。 这对于下一级电路来说是极其危险的。 因此,只要能使用D触发器,就不需要锁存器。
有些地方没有时钟,所以我们必须使用锁存器。 比如现在用一个clk连接到latch的使能端(假设是高电平使能)。 所需的建立时间是在时钟下降沿之前数据所需的时间。 但如果是DFF,那么建立时间就是时钟上升沿所需的时间。 这意味着如果数据晚于控制信号,则只能使用锁存器。 这种情况就是前面提到的latch。 基本上这就像借用了一个高水平的时间。 换句话说,锁存器借用时间也是有限的。
if语句和case不完整时很容易产生latch,需要注意。
问题:这两个代码组合时哪一个更有可能产生锁存器:
代码1
@(或ina或inb)
开始
如果()
开始
=伊娜;
结尾
别的
开始
=inb;
结尾
结尾
代码2
输入[3:0];
@()
开始
案件()
0:输出1=1'b1;
1,3:out2 = 1'b1;
2,4,5,6,7 : out3 = 1'b1;
:out4 = 1'b1;
结尾
答案是代码 2 在综合期间更有可能产生锁存器。
因为案例中的作业不完整! 例如,当=0时,仅给出out1=1'b1。 那么out2、out3、out4就没有被赋值,所以out2、out3、out4保留原来的值。 这是闩锁。
如果为每个 case 值都分配了 out1、out2、out3 和 out4,则不会生成锁存器。
总结一下latch的优缺点:
闩锁的缺点:
1、锁存器是电平触发的,无法实现同步操作,这与我们正常的时序逻辑电路设计思路不一致。
2、锁存器对输入电平敏感,受布线延迟影响较大,容易造成输出毛刺。
3. Latch会使静态时序分析和DFT变得非常复杂。
4、ASIC中使用Latch的集成度比DFF高,但FPGA中则相反,因为FPGA中没有标准的Latch单元,但有DFF单元,而一个LATCH需要多个LE实施的。
锁存器的优点:
因为可以使用锁存器,所以在高速电路设计中(会很紧张),有时需要使用锁存器。