0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如果在FPGA设计中不允许latch中现,又如何避免呢?

FPGA设计论坛 来源:FPGA设计论坛 作者:FPGA设计论坛 2022-11-08 15:07 次阅读

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

1 锁存器、触发器和寄存器的比较

(1)锁存器

锁存器(latch)是电平触发的存储单元,数据存储的动作(状态转换)取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据输入发生变化。

分为普通锁存器和门控锁存器。普通锁存器无控制信号,输出状态始终直接由输入决定。在实际的数字系统中,为了协调各部分的工作,往往需要有一个特定的控制信号去控制锁存器状态转换的时间,在控制信号无效时,输出保持不变,不随输入变换;当控制信号有效时,输出由输入决定,跟随输入变化。

①正是因为门控锁存器在控制信号有效的期间内,都可以接收输入信号,所以,激励信号的任何变化,都将直接引起锁存器输出状态的改变。这时输入信号若发生多次变化,输出状态也可能发生多次变化,这一现象称为锁存器的空翻。

②其次,当门控锁存器的控制信号有效时,锁存器就变成了一个组合电路,时序逻辑电路的模型就等效为两个各组合电路互为反馈的反馈系统,因此,系统有可能会因为瞬态特性不稳定而产生振荡现象。

(2) 触发器(flip-flop)

触发器(flip-flop)是边沿敏感的存储单元,数据存储的动作(状态转换)由某一信号的上升或者下降沿进行同步的(限制存储单元状态转换在一个很短的时间内)。(钟控D触发器其实就是 D 锁存器,边沿 D 触发器才是真正的 D 触发器)

触发器分为两种,一种是主从触发器和边沿触发器。主从触发器在时钟有效期内(主触发器)接收数据,在时钟边沿输出状态转换。边沿触发器在时钟边沿期间, 触发器才接收数据并使输出状态转换。目前,主从触发器基本上已经很少见了,实际使用的大都是边沿触发器。

(3)寄存器(register)

寄存器(register)用来暂时存放参与运算的数据和运算结果。在实际的数字系统中,通常把能够用来存储一组二进制代码的同步时序逻辑电路称为寄存器。

区别与联系:由于触发器内有记忆功能,因此利用触发器可以方便地构成寄存器。由于一个触发器能够存储一位二进制码,所以把 n 个触发器的时钟端口连接起来就能构成一个存储 n 位二进制码的寄存器。

从寄存数据的角度来讲,寄存器和锁存器的功能是相同的;它们的区别在于寄存器是同步时钟控制,而锁存器是电位信号控制。一般的设计规则是:在绝大多数设计中避免产生锁存器。它会让您设计的时序完蛋,并且它的隐蔽性很强,非老手不能查出。

2 锁存器具备的特点

(1)对毛刺敏感(使能信号有效时,输出状态可能随输入多次变化,产生空翻,对下一级电路很危险),不能异步复位,因此在上电后处于不确定的 状态。

(2)锁存器会使静态时序分析变得非常复杂,不具备可重用性。(首先, 锁存器没有时钟参与信号传递,无法做 STA;其次,综合工具会将 latch 优化掉,造成前后仿真结果不一致)

(3)在FPGA中基本的单元是由查找表和触发器组成的,若生成锁存器反而需要更多的资源。根据锁存器的特点可以看出,在电路设计中,要对锁存器特别谨慎,如果设计经过综合后产生出和设计意图不一致的锁存器,则将导致设计错误,包括仿真和综合。因此,在设计中需要避免产生意想不到的锁存器。如果组合逻辑的语句完全不使用 always 语句块,就可以保证综合器不会综合出锁存器。

(4)但如果锁存器和触发器两者都由与非门搭建的话,锁存器耗用的逻辑资源要比D触发器少(D触发器需要12个MOS管,锁存器只需6个MOS管),锁存器的集成度更高。

所以在的ASIC设计中会用到锁存器。但锁存器对毛刺敏感,无异步复位端,不能让芯片在上电时 处在确定的状态;另外,锁存器会使静态时序分析变得很复杂,不利于设计的可重用,所以,在ASIC设计中,除了CPU这高速电路,或者RAM这种对面积很敏感的电路,一般不提倡用锁存器。

3 锁存器的出现以及解决办法

在基于always的组合逻辑描述语句中容易综合出锁存器的地方:

在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。

总结:

锁存器产生的根本原因:当组合逻辑需要保持时,就会综合出锁存器。

锁存器的危害:

(1)latch会产生毛刺(glitch),这种毛刺对下一级电路是很危险的;

(2)不能异步复位,因此在上电后处于不确定的 状态;

(3)锁存器会使静态时序分析变得非常复杂,不具备可重用性

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5249

    浏览量

    119162
  • 触发器
    +关注

    关注

    14

    文章

    1990

    浏览量

    60853
  • Latch
    +关注

    关注

    1

    文章

    48

    浏览量

    16169

原文标题:FPGA设计中如何才能不出现Latch锁存器

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    电力系统不允许发生谐振的原因

    电力系统谐振是指在电力系统,由于某些特定条件的满足,导致系统内部的电感和电容元件相互配合,形成一种振荡现象。谐振现象在电力系统不允许发生的,因为它会带来一系列严重的问题和危害。以下是对电力系统
    的头像 发表于 08-22 14:21 181次阅读

    ESP8266是否不允许将pwm API与at命令固件一起使用?

    :esp_iot_sdk_v1.5.1/examples/at) 编译和下载还可以,但它似乎没有像我预期的那样工作。 调用pwm_init()后,AT命令I/O太迟钝,PWM信号波形也不稳定。 是否不允许将 pwm API 与 at 命令固件一起使用? 您能给我展示有关此的工作示例或文档吗?
    发表于 07-22 06:05

    什么情况下变压器不允许调压

    定情况下,变压器是不允许调压的。 一、变压器调压的原理 变压器调压的原理主要基于电磁感应原理。当原边绕组通过交流电时,会在铁芯中产生交变磁通,这个交变磁通会感应到副边绕组,从而产生副边电压。通过改变原边和副边绕组
    的头像 发表于 07-19 10:35 355次阅读

    使用USBUART组件与主机PC通信,如果在串行端口打开的情况下终止固件,主机端为什么会报错?

    我正在使用 USBUART 组件与主机 PC 通信,我一直在寻找某种机制来关闭 MCU 端的串行端口,或者至少通知主机我将关闭端口。 我遇到过这样一个问题:如果在串行端口打开的情况下终止固件(如重置
    发表于 06-03 08:41

    SSWLBIST触发ESR0脉冲的原因?

    在 TC377 电路板上,如果在 UCB 启用了 LBIST,则 ESR0 在释放 4.4ms 后会有一个 579us 脉冲。 如果在 UCB 禁用 LBIST,ESR0 将直接释
    发表于 06-03 08:04

    电力电容器为什么不允许短时间内过电压运行

    在电力系统,电容器是一种重要的电气设备,常用于提高功率因数、改善电网稳定性等方面。然而,电容器作为一种电压敏感的元件,对于电压波动非常敏感,特别是在短时间内的过电压情况下,可能引发严重的问题。为什么电力电容器不允许短时间内过电压运行?
    的头像 发表于 02-26 14:30 553次阅读

    FPGA竞争与冒险的前世今生

    竞争冒险:在组合电路,当逻辑门有两个互补输入信号同时向相反状态变化时,输出端可能产生过渡干扰脉冲的现象,称为竞争冒险。那么 FPGA 产生竞争冒险的原因是什么? 信号在 FPGA
    发表于 02-21 16:26

    时序电路为什么在FPGA上综合成了latch

    有朋友提问,下面的代码为什么在DC里可以综合成DFF,而在FPGA上却综合成了latch
    的头像 发表于 02-20 16:12 644次阅读
    时序电路为什么在<b class='flag-5'>FPGA</b>上综合成了<b class='flag-5'>latch</b>?

    CMOS闩锁测试的电流脉冲如何加上的?

    闩锁测试中进行电流注入测试时,管脚电压还不允许超多1.52倍最大电压,这个如何做到?注入的电流需要是在工作电流+100mA。
    发表于 02-04 07:29

    “tc1.3”编译报错不允许使用向量表编号TriCore™怎么解决?

    “tc1.3” TriCore™ 不允许使用矢量表编号
    发表于 01-22 08:33

    FPGA读ad7401数据时,FPGA发出的时钟如果在线路上有丢失,AD7401还能输出正确的MDATA吗?

    FPGA读ad7401的数据时。FPGA发出的时钟如果在线路上有丢失,AD7401还能输出正确的MDATA吗?有没有一套机制是防止时钟信号丢失的。
    发表于 12-07 08:03

    减速机为什么不允许有轴向窜动现象?

    减速机为什么不允许有轴向窜动现象? 减速机是一种用来改变输入轴传动力矩和转速的装置。作为机械设备的核心部件之一,减速机在各个行业起到非常重要的作用,广泛应用于机械传动系统。 在减速机
    的头像 发表于 11-23 10:46 689次阅读

    python的set类型

    Python的set类型是一种无序、可变的集合数据类型,它的主要特点是不允许重复元素的存在。本文将详尽、详实、细致地介绍set类型的使用场景、常用操作以及与其他类型的比较等方面,以帮助读者全面了解
    的头像 发表于 11-21 16:25 626次阅读

    如何在层堆栈管理器定义单层板?

    如何在层堆栈管理器定义单层(单面)板?电路板目前有两层,但Layer Stack Manager不允许我删除其中一个信号层。
    的头像 发表于 11-10 15:19 611次阅读

    Linux为什么中断不允许休眠

    Linux 为什么中断不允许休眠? 所谓的睡眠,就是调用 schedule 让出 CPU,调度器选择另外个进程继续执行,这个过程涉及进程栈空间的切换。 1、假如中断上下文中调用 schedule
    的头像 发表于 09-27 17:48 1042次阅读