FPGA设计中latch的产生原因、危害与避免措施

    在进行FPGA设计的过程中,经常会在编译程序时发现有一些warning提示生成了一些latch,而且一般FPGA的设计规则也不建议有latch生成。那么,latch究竟是什么东西呢?如果在FPGA设计中不允许latch中现,又如何避免呢?

    Latch,中文译成锁存器,是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。锁存,就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存,其次完成高速的控制其与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个 I/O 口既能输出也能输入的问题。虽然定义复杂,简单来说,锁存器的结构模型如下图所示:

    当其中X为输入,Y为输出,OE为使能信号。当OE=1时(使能有效),Y=X;当OE=0时(使能无效),Y值保持不变。

    在FPGA程序设计过程中,出现latch绝大多数情况是因为if和case语句的不完全描述,导致程序在综合过程中出现了latch的功能行为。举个简单的例子,写个译码器,输入为a,输出为b,其中a为2位输入,b为8位输出,若如下所写,

always@( * )

        case(a)

            2’b00: b = 8’d1;

            2’b01: b = 8’d5;

            2’b10: b = 8’d8;

            2’b11: b = 8’d17;

        endcase   

    则综合后的原理图如下所示,

    但是若将a的位数改为3,如下所写

    always@( * )

        case(a)

            3’b000: b = 8’d1;

            3’b001: b = 8’d5;

            3’b010: b = 8’d8;

            3’b011: b = 8’d17;

        Endcase

    则综合后原理图变为如下,     

    可以看到,第二张综合图里面出现了latch。然而,两段程序的不同仅仅是a的位数从2变到了3,这究竟是为什么?

    其实这就是因为case的不完全描述所致。在第一段程序中,输入a可能的四种取值都穷举到了,所以是完全描述的。而第二段程序中,a变为了3位数,而取值只有3’b000、3’b001、3’b010、3’b011四个,而3’b100到3’b111之间的数据并没有列举出,虽然在实际执行过程中输入并不会出现未列举出的数值,但是系统在编译时并不知情,所以它会在3’b100到3’b111之间的值出现时将b的输出锁存,也就是出现了latch的功能行为。

    之所以在硬件设计中避免latch的出现,主要原因是latch会产生毛刺(glitch),这种毛刺对下一级电路是很危险的。并且其隐蔽性很强,不易查出。因此,在设计中,应尽量避免latch的使用。

    从其产生原因可以看出,为了防止出现latch,对于if语句和case语句一定要做到完全描述,最常用的方法就是总是加上else和default

版权声明:本文转载自FPGA设计中latch的产生原因、危害与避免措施

未经允许不得转载:TacuLee » FPGA设计中latch的产生原因、危害与避免措施

赞 (0)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址