Verilog中锁存器与多路选择器
-
Verilog是一种硬件描述语言,它代表的是硬件。
-
Verilog代表的就是逻辑门和连接线。
-
对于一个always@(*)控制的块而言,只要块中的表达式包含的任意的一个变量发生变化时,这个块都会被重新读取。
锁存器
always块不完整的敏感信号列表
if-else不完整结构
case忽略某些值
assign语句锁存器
只对电平敏感(不考虑posedge和negedge边沿敏感),且always块中的敏感变量表中没有包含在块中出现的所有变量(称为不完整的敏感变量表),那么这个块的功能就是某种类型的锁存器;
拥有完整的敏感变量列表则表明这是一个由组合们或者多路选择器等组合而成的组合逻辑电路。
但如果控制条件中包含的if或cace忽略掉了某些值的话,那么即使敏感变量是完整的,也有可能出现锁存的状态。
代码段一
always@(a,b,sel)
if(sel == 1'b1)
z = a;
else
z = b;
代码段二
always@(*)
if(sel == 1'b1)
z = a;
else
z = b;
代码段三
always@(sel)
if(sel == 1'b1)
z = a;
else
z = b;
代码段四
always@(a,b)
if(sel == 1'b1)
z = a;
else
z = b;
代码段一、二代表多路选择器,因为
[1] 表达式中的所有变量都被包含在了敏感信号表中(完整的敏感变量列表)
[2] if中的每一个选项都被赋给了一个输出(z)。
代码段三、四代表两种不同的锁存器,当敏感表中的变量不发生变化时实现锁存。
没有控制结构的非标准锁存器
always@(a,v)
z = a | b;
b值的变化对z的锁存并无影响,这种类型的锁存器通常是由敏感变量表中的输入错误造成的。
透明锁存器(可综合的推荐写法)
always@(*)
if(sel == 1'b1)
Q = D;
连续赋值的可综合锁存器
assign Z = (sel == 1'b1) ? D : Z;
避免锁存器
采用组合逻辑实现的锁存器的时序(包括可能出现的毛刺)容易出现问题。为了避免这些问题,应采用时钟控制结构(即触发器)二不是由使能控制的结构(即透明锁存器)来保存数据,避免使用锁存器。
参考资料
[1] Verilog数字VLSI设计教程 [美] John Williams 著 李林 等译