D触发器是指由时钟边沿触发的存储器单元,锁存器指一个由信号而不是时钟控制的电平敏感的设备。锁存器通过锁存信号控制,不锁存数据时,输出端的信号随输入信号变化,就像信号通过缓冲器一样,一旦锁存信号起锁存作用,则数据被锁住,输入信号不起作用。

锁存器和D触发器实现的逻辑功能基本相同,都是暂存数据。由与非门搭建的话,锁存器所耗用的逻辑资源比D触发器少,所以使用锁存器有更高的集成度,但锁存器有一下缺点:

(1)对毛刺敏感,毛刺信号会传递下去,无异步复位端,不能在芯片上电时处在一个确定的状态;

(2)会使静态时序分析变得复杂,可测性不好,不利于设计的可重用,所以当今的ASIC设计中除了CPU这种甚高速电路,一般不提倡使用锁存器;

(3)FPGA器件中有大量的D触发器结构而没有锁存器这种现成的结构,使用锁存器会更耗资源,

如何避免使用锁存器:

(1)时序逻辑电路中,可用带使能端的D触发器实现;

(2)在组合进程中赋默认值;

(3)对所有输入条件赋输入值,以覆盖所有条件分支(特别是if..else..和case结构);

(4)避免产生组合电路反馈,组合电路反馈会引起精确静态时序分析难以实现等一系列问题。

在有些设计中,不可避免的需要用到锁存器,如在PCI接口设计中要完成PCI规范中对Reset功能的定义。可以通过多位选择器,有测试模式管脚做选择控制位来使设计是可测试的。

 

"触发器" 泛指一类电路结构, 它可以由触发信号 (如: 时钟, 置位, 复位等) 改变输出状态, 并保持这个状态直到下一个或另一个触发信号来到时, 触发信号可以用电平或边沿操作. 锁存器是触发器的一种应用类型. 在 CMOS 电路中典型的锁存器 (LATCH) 是由两个反相器和两个数据开关组成, 其中输入数据开关在闸门 (GATE) 电平操作下开启送入数据. 当闸门关闭后, 另一个数据开关开启, 使两个反相器的串联闭合, 形成 RS 触发器类型的正反馈电路, 数据保持在这个 RS 触发器中, 以达到锁存的目的, 直到下一个闸门周期.


由两个这样的锁存器可以级联成主从结构, 并执行互补的操作. 即前一个送入数据时, 后一个保持先前的数据, 而前一个锁存数据时, 后一个送入这个新数据到输出端. 形成一个边沿触发的 D 触发器, 而闸门控制信号成为触发器的时钟. 也可以认为 D 触发器是用时钟边沿锁存数据的, 但习惯上不称其为锁存器 LATCH.
在 CMOS 芯片内部经常使用锁存器, 但是在 PCB 板级结构上, 建议用触发器在时钟边沿上锁存数据. 这是因为在锁存器闸门开启期间数据的变化会直接反映到输出端, 所以要注意控制闸门信号的脉冲宽度. 而对于触发器, 只考虑时钟的边沿

 

 

latch和flip-flop都是时序逻辑,区别为:latch同其所有的输入信号相关,当输入信号变化时latch就变化,没有时钟端;flip-flop受时钟控制,只有在时钟触发时才采样当前的输入,产生输出。当然因为二者都是时序逻辑,所以输出不但同当前的输入相关还同上一时间的输出相关。

latch缺点:

1、没有时钟端,不受系统同步时钟的控制,无法实现同步操作,和当前我们尽可能采用时序电路的设计思路不符;

2、latch对毛刺敏感,受布线延迟影响较大,很难保证输出没有毛刺产生;latch是电平触发,相当于有一个使能端,且在激活之后(在使能电平的时候)相当于导线了,随输出而变化,在非使能状态下是保持原来的信号,这就可以看出和flip-flop的差别,其实很多时候latch是不能代替ff的。如果使用门电路来搭建latch和ff,则latch消耗的门资源比ff要少,这是latch比ff优越的地方。

3.在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现。

4.latch将静态时序分析变得极为复杂,目前latch只在极高端电的路中使用,如intel 的P4等CPU。

 

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

组合逻辑避免产生latch的一种常用做法。 在process里面的最开头对组合逻辑的输出赋初值。

举例说明如下:

              process (Rd_lenth,Wr_Addr_En,Rd_Addr_En,MRd_En,MWr_En,lm_Ack_n)

         begin

            next_state<=cur_state;

             case cur_state is

                     when idle=>

                         if(x) then

                            next_state<=busy;

                            else

                              ........

                            end if;

                            ........

              End process;

相当的电路是在每个状态底下,如果下一个clk到来时,下一个状态条件没满足,状态机继续留在原状态,相当于在cur_state的寄存器前面做了一个选择器。在if语句和case不全很容易产生latch。