原创 Latch 与 FF

2010-4-12 16:29 3228 7 7 分类: FPGA/CPLD

 


这里先转载网上的几个帖子,让大家对 Latch 和FF有个认识。

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

latch缺点:
1、没有时钟端,不受系统同步时钟的控制,无法实现同步操作;
2、对输入电平敏感,受布线延迟影响较大,很难保证输出没有毛刺产生;

在xilinx和altera器件的slice和LE中都能够同时支持生产d-latch和d-ff,在这一层面上二者有什么区别暂时没有想到。如果使用门电路来搭建latch和ff,则latch消耗的门资源比ff要少,这是latch比ff优越的地方。

latch的最大缺点就是没有时钟端,和当前我们尽可能采用时序电路的设计思路不符。

latch是电平触发,相当于有一个使能端,且在激活之后(在使能电平的时候)相当于导线了,随输出而变化,在非使能状态下是保持原来的信号,这就可以看出和flip-flop的差别,其实很多时候latch是不能代替ff的
1.latch对毛刺敏感
2.在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现
3.latch将静态时序分析变得极为复杂
4.目前latch只在极高端电的路中使用,如intel 的P4等CPU。

FPGA中有latch单元,寄存器单元就可以配置成latch单元,在xilinx v2p的手册将该单元成为register/latch单元,附件是xilinx半个slice的结构图。其它型号和厂家的FPGA没有去查证。——个人认为xilinx是能直接配的而altera或许比较麻烦,要几个LE才行,然而也非xilinx的器件每个slice都可以这样配置

altera的只有DDR接口中有专门的latch单元,一般也只有高速电路中会采用latch的设计。

altera的LE是没有latch的结构的,又查了sp3和sp2e,别的不查了,手册上说支持这种配置。有关altera的表述wangdian说的对,altera的ff不能配置成latch,它使用查找表来实现latch。


一般的设计规则是:在绝大多数设计中避免产生LATCH.

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

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

对latch进行STA的分析其实也是可以,但是要对工具相当熟悉才行.不过很容易出错.当前PrimeTime,是支持进行latch分析的.现在一些综合工具内置的STA分析功能也支持,比如RTL compiler, Design Compiler. 除了ASIC里可以节省资源以外。
我感觉latch这个东西在同步设计里出现的可能还是挺小的吧,现在处理过程中大都放在ff里打一下,影响不太大吧

组合逻辑避免产生latch的一种常用做法。

在process里面的最开头对组合逻辑的输出赋初值。举例说明如下:

process (Rdlenth,WrAddr_En,RdAddr_En,MRd_En,MWr_En,lm_Ackn)
          begin
            next_state<=cur_state;
            case  cur_state  is
                       when idle=>
                         if(xxxx) then
                              next_state<=busy;
                            else
                              。。。。。。
                            endif;
                     。。。。。。
              End process;

       相当的电路是在每个状态底下,如果下一个clk到来时,下一个状态条件没满足,状态机继续留在原状态,相当于在cur_state的寄存器前面做了一个选择器。

  原因分析:为什么是这样的,要把VHDL的语法拿出来复习了:在一个进程以内,对一个信号如果多次赋值,最后一个对信号的赋值有效。
在if语句和case不全很容易产生latch

VIA题目——题目问的是这两个代码哪个综合更容易产生latch

if case不全会产生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
当然是下面一个更容易产生LATCH啦。其实,对于下面的情况,如out1而言,只是类似于if(data_in == 0) out1 = 1'b1;如果在default里面,把out1,out2,out3都描述一下就不会产生LATCH了。


上次说假期再来做实验,碰巧现在就有时间,就写了简单的一行代码,用ISE自带的XST综合软件做了一下综合。把结果共享给大家。

先上源代码:

module test (input i_rst_n, input i1, input i2, output o1)
  assign o1 = i1 ? i2 : o1;
endmodule

这个代码会综合出什么样的结果呢?把代码载入ISE,跑一下综合。我们看到:
- 输入信号 i1 后接了一个BUFGP,也就是说综合结果是把该信号当作了一个时钟(其实就是latch里面的gate信号)
- 输入信号 i2 后接了一个IBUF,也就是一个普通输入
- 输出信号 o1 后接了一个OBUF,也就是一个普通输出
- 最关键的核心部分是一个LD,忘了全称了,估计是 Latched D-register 的意思,也就是我们俗称的latch。

可以看到,i1接入到了latch的gate端,i2接到了latch的data端,o1则和Q端相连。

上述现象和ineedpower的代码吻合,也就是latch中的gate端,会被报告为clock。

 

这是Xilinx的LD原语的构造图。FPGA型号为 XC9000,不知道在virtex中是不是会有不同,但是我们还是可以作为参考来了解一下。
大家可以发现,一个latch是由一个FDCP(寄存器)加两个与门构成的,也就是说,在FPGA实现中,一个latch远比一个FF要大。
下面是贴图(来自xilinx官网)

Figure 7.3 LD Implementation XC9000
点击看大图

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条