其实并不是说锁存器会有什么坏处,只是产生锁存器一般都是不想得到的(锁存器是由电平触发的存储器)。用verilog写的话,进程有两种,一种是电平触发的,一种是边缘触发的。边沿触发的是触发器,电平触发的一般是组合逻辑,但也有锁存器,有时会需要锁存器。但锁存器的产生一般并不是我们所希望得到的。看下边的例子:(如果你用的VHDL,也是类似)reg [2:0]case(a) 0:q=d0; 1:q=d1; 2:q=d2; 3:q=d3; 4:q=d4;endcase可能是根本不需要a等于其它值的情形,或者是电路根本不会产生a的其它值(实际上不可能不产生其它值的)。但综合器不这样认为,他会产生一个锁存器来保存状态,所以综合后的结果就不完全是个数据选择器,而是选择器加一个锁存器,这个锁存器当然是不需要的。
所以case语句如果不完全一定要加一个default项。
在上面的语句中加入default:q='bx;
这样就可以避免产生锁存器,生成一个单纯的选择器(组合逻辑)。不光是case语句,
就是if语句在电平触发的的进程中如果有一个else分支没有对某个变量进行赋值的话也
会产生锁存器。还有事件敏感表中变量不完全也是同理。边沿触发的不会有这种担心,
因为边沿触发的本身就是存储器,可以保持状态的。