首页 > 其他分享 >触发器dff与锁存器latch的用法和区别

触发器dff与锁存器latch的用法和区别

时间:2023-11-22 11:23:02浏览次数:34  
标签:存器 out3 out4 dff b1 DFF latch

dff与latch的用法和区别

废话少说,dff是边沿敏感,latch是电平敏感。

用法上图:

功能仿真:

 

以下部分是摘抄别人的技术心得:

latch(锁存器)与 DFF(D触发器)的区别

1、latch由电平触发,非同步控制。在使能信号有效时latch相当于通路,在使能信号无效时latch保持输出状态。DFF由时钟沿触发,同步控制。

2、latch容易产生毛刺(glitch),DFF则不易产生毛刺。

3、如果使用门电路来搭建latch和DFF,则latch消耗的门资源比DFF要少,这是latch比DFF优越的地方。所以,在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现。

4、latch将静态时序分析变得极为复杂。

   一般的设计规则是:在绝大多数设计中避免产生latch。它会让您设计的时序完蛋,并且它的隐蔽性很强,非老手不能查出。latch最大的危害在于不能过滤毛刺。这对于下一级电路是极其危险的。所以,只要能用D触发器的地方,就不用latch。

    有些地方没有时钟,也只能用latch了。比如现在用一个clk接到latch的使能端(假设是高电平使能),这样需要的setup时间,就是数据在时钟的下降沿之前需要的时间,但是如果是一个DFF,那么setup时间就是在时钟的上升沿需要的时间。这就说明如果数据晚于控制信号的情况下,只能用latch,这种情况就是,前面所提到的latch timing borrow。基本上相当于借了一个高电平时间。也就是说,latch借的时间也是有限的。

 

在if语句和case不全很容易产生latch,需要注意。

问:这两个代码哪个综合更容易产生latch:
代码1
always@(enable or ina or inb)
begin
if(enable)
begin
data_out = ina;
end
else
begin
data_out = inb;
end
end
代码2
input[3:0] data_in;
always@(data_in)
begin
case(data_in)
0 :              out1 = 1'b1;
1,3 :           out2 = 1'b1;
2,4,5,6,7 : out3 = 1'b1;
default:      out4 = 1'b1;
endcase
end
答案是代码2在综合时更容易产生latch。

因为case下赋值不全呀!比如当data_in=0时,只是给out1=1'b1,那out2,out3,out4呢,没有赋值,所以out2,out3,out4就保持原值。这就是latch。

如果把每一个case值下都把out1,out2,out3,out4都做一遍赋值,那就不会产生latch了。

latch的优缺点总结:

latch的缺点:

1. latch是电平触发,无法实现同步操作,与我们正常的时序逻辑电路设计思路不符。
2. latch会对输入电平敏感,受布线延迟影响较大,比较容易导致输出有毛刺产生。
3. latch会导致静态时序分析和DFT会很复杂。
4. 在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现。

latch的好处:
因为使用latch可以timing borrow,在高速电路设计中(timing会很紧),有时候就需要用latch。

标签:存器,out3,out4,dff,b1,DFF,latch
From: https://www.cnblogs.com/yanghonker/p/17848557.html

相关文章

  • 汇编-标志寄存器
      CF进位标志位一般情况下,在进行无符号整数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。有进位或者借位时CF=1 注意:incloop 不会影响CF    ......
  • 知道CountDownLatch是做什么的,那你知道它的底层是如何实现的吗?
    一、概述CountDownLatch是一个多线程控制工具,用来控制线程的等待。设置需要countDown的数量num,然后每一个线程执行完毕后,调用countDown()方法,而主线程调用await()方法执行等待,直到num个子线程执行了countDown()方法,则主线程解除阻塞,开始继续执行。其具体操作流程类似火箭发射,我们......
  • 汇编-64位寄存器
      在64位模式下,虽然处理器目前只支持48位的地址,但在理论上,地址可大到64位。从寄存器来看,与32位处理器最主要的区别如下:●16个64位通用寄存器(在32位模式下只有8个通用寄存器)●8个80位浮点寄存器●1个64位状态标志寄存器,称为RFLAGS(只使用了低32位)●1个64位指令指针寄......
  • 锁存器(Latch)
    锁存器(Latch)设置-复位锁存器(SRLatch)SR锁存器是最简单的锁存器,它有两个输入:Set和Reset,一个输出。它在Set端输入1后,输出端可以保持为1,直到Reset端输入1后,输出端才会变为0。实现设置和重置的功能。初始状态下,输出为0.当Set输入为1时,输出为1;当Set重置为0时,输出保持为1。只有......
  • 汇编-浮点单元寄存器
      浮点单元(Floating-PointUnit,FPU)执行高速浮点算术运算。之前为了实现这个目的,需要一个单独的协处理器芯片。从Intel486开始,FPU已经集成到主处理器芯片上了。FPU中有8个浮点数据寄存器,分别命名为ST(0)、ST(1)、ST(2)、ST(3)、ST(4)、ST(5)、ST(6)及ST(7)。其余的控制......
  • Modbus协议详解5:Modbus数据模型、寄存器、功能码 (非常重要)
    Modbus是应用层上的协议,还是一种主从的通信协议,通信过程按照一定的协议规则进行,数据的交互也是有固定的格式的。总的来说,Modbus是有着明确且固定的数据模型的,并且通信过程中的数据交互识别是要按照功能码进行的。接下来会介绍Modbus的数据模型、寄存器和功能码。1. Modbus的数据模......
  • 2-2 CC2530的通用IO及相关寄存器
    I/O端口相关寄存器为了便于记忆和使用,每个特殊功能寄存器都会起一个名字,在程序设计时,引入头文件“ioCC2530.h”,才能直接使用寄存器的名称与通用I/O端口相关的常用寄存器有下面4个:PxSEL:端口功能选择,设置端口使用I/O还是外设功能端口,0为设置通用I/O,1为设置外设功能PxDIR:......
  • 2-1将寄存器某位清0或置1
    将寄存器的某位清0同时不影响其他位与操作:任何值与1相与,保持原值​ 任何值与0相与,结果为0例:寄存器TMP的当前值为0x62,要将第2、3、6位清00x62:01100010​ 101100110x4c:01001100相与: 00100010用C语言表示:TMP&=~0x4c在程序设计中具体操作:寄存器......
  • GPDB中Latch等待与唤醒实现机制
    GPDB中Latch等待与唤醒实现机制GreenPlum/PostgreSQL中有很多Latch以帮助多进程以及主线程与从线程之间协作。那么Latch是如何实现的呢?Latch可以在多进程之间以及主线程和从线程之间实现等待与唤醒,WaitEventSet是实现这项功能的关键结构。本文我们聊聊WaitEventSet的实现以及一个用......
  • 《面试1v1》CountDownLatch 和 CyclicBarrier
    我是javapub,一名Markdown程序员从......