关于Verilog中不完整if产生锁存器的问题

先上两段代码:
第一段:

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 @(*)作为敏感列表, 并且需要检查每个分支都有明确的赋值,从而避免生成锁存器。

综上,只有组合逻辑才可能生成锁存器,时序逻辑不会生成锁存器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值