walkman416(字母数字组合,好常见的组合方式,就叫他walkman好了):
个人理解: 所谓生成 latch 其实是针对使用 always 语句描述一个组合逻辑而言,因为如果描述时序逻辑总是使用时钟或者时钟 + 复位作为敏感列表条件,所生成的电路总是组合逻辑 + DFF;如果是描述组合逻辑,敏感列表中必然没有时钟复位,而是组合逻辑的输入信号。在 FPGA 设计,避免使用 latch,不利于时序分析和仿真。 楼上有提到 latch 比 DFF 省资源, 这个在 FPGA 设计中其实还好, 因为在 FPGA 中 DFF 就是一个专用的硬件资源,并且数量也比较多。
使用 always 描述组合逻辑时,好的习惯是使用 always @(*) 作为敏感列表, 并且需要检查每个分支都有明确的赋值,从而避免生成 latch.
哎呀说的真好,我等下也要总结下呢,walkman,好样的!
理解总结
- 看 always 敏感信息,如果是边沿触发,那么为时序逻辑,本问题中不会产生latch。但是我是强迫症啊喂,写了 if 不写 else 都是耍流氓啊喂,为了代码的整体性还是补齐 else 的好,可以写
else ;
也可以写else q<=q;
,总之补齐就好,这样说不定还有写别的什么好处我不知道呢,后续知道了再补上。 - FPGA 中现在对 latch 的理解不够深入,还是少用的好,也尽量的避免 latch 的产生,毕竟和 ASIC 有些区别,DFF 在 FPGA 中可以算是一种基本逻辑了。
- Walkman 说的不错,组合逻辑时,可以使用
always@(*)
作为敏感列表,并且检查每个 else 或者 case 分支都有明确的赋值。
希望对阅读的你有着帮助,欢迎探讨。如果有什么觉得不对的,一定不要客气的留言回复大力拍砖 ~