[整理]一个有关 Latch (锁存器)的有趣问题

起源

今天诳论坛,突然发现了一个有关 latch 的问题,由于对 D Flip-Flop 和 Latch 还有些疑问,就点击了进去,一看果然有些意思,也挺有学习意义的,于是本文就诞生了。喊出口号 ~ Just note it.

有意思的问题图

这是个图片,仔细看代码
两个问题。

  • 上面左边描述的电路,如果不加else q<=0;,会生成 latch 吗?
  • 上面右边描述的电路,如果不加else q<=0;,会生成 latch 吗?

集思广益

论坛上还是有很多的大神和前辈的,几个回答相当不错,有着极强指导意义,让人不禁思考问题,然后开始默默思考人生。噗呜,不多说了,我们来看下参考。(有删减哦,在此谢过原大大提供自己的见解)

老阮(一看名字就知道是个老油条,手动滑稽):

  • 时序电路,生成触发器,触发器是有使能端的,使能端无效时数据不变,这是触发器的特性。
  • 组合逻辑,由于数据要保持不变,只能通过锁存器来保存。
  • 第一个代码,由于是时序逻辑,生成的触发器在 enable 无效时就可以保存数据。跟锁存器无关。
  • 第二个代码就是在 enable 为低时,数据不变,因此要生成锁存器。

看起来很有道理呢,分析的较为详细了,就此问题详细介绍了两者的区别,很有指导意义啊。

我是各楼主的分隔线

chengroc(英文字母的 ID 呢,看起来貌似是姓成呢,就叫程先生吧,什么你说两个 cheng 不一样,哎呀不要在意这些细节,看下面)

  • latch 其实比 dff 结构更简单啊
  • 数字设计中如果你能控制好时序,有意识地用 latch 也不是不可以。但同时也会增加后面时序分析的工作量。前端设计与后端时序分析要传递的信息量比较多,也容易遗漏,但也可以做好。
  • 就怕无意识地用了 latch,例如本想实现一个组合逻辑功能,却因为条件没有写完备导致出现了 latch,后端再一疏忽,导致完全不可控。
  • 而用 dff 实现数据保持的功能,问题就简化多了

程先生简单的说明了下 latch 和 dff 呢,虽然并不深入,但对现在的我而言,嗯是够用了,后面我再深入的去看 D 触发器和锁存器的一些知识点。

我是各楼主的分隔线

walkman416(字母数字组合,好常见的组合方式,就叫他walkman好了)

  • 个人理解: 所谓生成 latch 其实是针对使用 always 语句描述一个组合逻辑而言,因为如果描述时序逻辑总是使用时钟或者时钟 + 复位作为敏感列表条件,所生成的电路总是组合逻辑 + DFF;如果是描述组合逻辑,敏感列表中必然没有时钟复位,而是组合逻辑的输入信号。在 FPGA 设计,避免使用 latch,不利于时序分析和仿真。 楼上有提到 latch 比 DFF 省资源, 这个在 FPGA 设计中其实还好, 因为在 FPGA 中 DFF 就是一个专用的硬件资源,并且数量也比较多。

  • 使用 always 描述组合逻辑时,好的习惯是使用 always @(*) 作为敏感列表, 并且需要检查每个分支都有明确的赋值,从而避免生成 latch.

哎呀说的真好,我等下也要总结下呢,walkman,好样的!

理解总结

  1. 看 always 敏感信息,如果是边沿触发,那么为时序逻辑,本问题中不会产生latch。但是我是强迫症啊喂,写了 if 不写 else 都是耍流氓啊喂,为了代码的整体性还是补齐 else 的好,可以写 else ; 也可以写 else q<=q;,总之补齐就好,这样说不定还有写别的什么好处我不知道呢,后续知道了再补上。
  2. FPGA 中现在对 latch 的理解不够深入,还是少用的好,也尽量的避免 latch 的产生,毕竟和 ASIC 有些区别,DFF 在 FPGA 中可以算是一种基本逻辑了。
  3. Walkman 说的不错,组合逻辑时,可以使用 always@(*) 作为敏感列表,并且检查每个 else 或者 case 分支都有明确的赋值。

希望对阅读的你有着帮助,欢迎探讨。如果有什么觉得不对的,一定不要客气的留言回复大力拍砖 ~

posted on 2019-09-03 20:03  青鸟晴空  阅读(960)  评论(0编辑  收藏  举报

导航