先上两段代码:
第一段:
always @(posedge clk)
if(enable)
q <= data;
//else
//q <= 0;
第二段
always @(*)
if(enable)
q <= data;
//else
//q <= 0;
上面两个片段都是不完整if语句,区别在于一个是时序逻辑,另一个是组合逻辑,那么这两段代码都会产生锁存器吗?
对于时序电路,会生成触发器,触发器是有使能端的,使能端时无效数据不变,这段代码符合触发器的特性,跟锁存器无关。
对于组合逻辑电路,为了使数据保持不变,就得用锁存器来保存。第二个代码在enable为低时,数据不变,因此要生成锁存器。
所谓生成锁存器其实是针对使用always语句描述一个组合逻辑而言,因为如果描述时序逻辑总是使用时钟或者时钟+复位作为敏感列表条件,所生成的电路总是组合逻辑+DFF;如果是描述组合逻辑,敏感列表中必然没有时钟复位,而是组合逻辑的输入信号。在FPGA设计,避免使用锁存器,不利于时序分析和仿真。
还有一点,使用always描述组合逻辑时,好的习惯是使用always @(*)作为敏感列表, 并且需要检查每个分支都有明确的赋值,从而避免生成锁存器。
综上,只有组合逻辑才可能生成锁存器,时序逻辑不会生成锁存器。