什么是latch
Latch 其实就是锁存器,是一种在异步电路系统中,对输入信号电平敏感的单元,用来 存储信息。锁存器在数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓 冲器,一旦锁存信号有效,则数据被锁存,输入信号不起作用。因此,锁存器也被称为透 明锁存器,指的是不锁存时输出对于输入是透明的。
为什么要避免latch
在同步时序逻辑电路中latch会给电路结构带来不必要的麻烦,但是在异步时序逻辑电路中锁存却是必要的。
常见的latch产生的情况
-
组合逻辑电路中if语句没有else;
-
组合逻辑中case的条件不能够完全列举时且不加default,
-
组合逻辑电路中输出变量赋值给自己
情况一:组合逻辑电路中if语句没有else产生latch
module decorder
(
input wire in_1,
input wire in_2,
input wire in_3,
output reg [7:0] out
);
always@(*)
if({in_1, in_2, in_3} == 3'b000)
out = 8'b0000_0001;
else if({in_1, in_2, in_3} == 3'b001)
out = 8'b0000_0010;
else if({in_1, in_2, in_3} == 3'b010)
out = 8'b0000_0100;
else if({in_1, in_2, in_3} == 3'b011)
out = 8'b0000_1000;
else if ({in_1, in_2, in_3} == 3'b100)
out = 8'b0001_0000;
else if ({in_1, in_2, in_3} == 3'b101)
out = 8'b0010_0000;
else if ({in_1, in_2, in_3} == 3'b110)
out = 8'b0100_0000;
else if ({in_1, in_2, in_3} == 3'b111)
out = 8'b1000_0000;
else//此处如果去掉else,就会产生latch锁存
out = 8'b0000_0001;
endmodule
上述硬件语言仿真的结果为:
情况二:组合逻辑中case的条件不能完全列举或不写default
module latch_1
(
input wire in_1,
input wire in_2,
input wire in_3,
output reg [7:0] out
);
always@(*)
case({in_1,in_2,in_3})
3'b000 : out = 8'b0000_0001;
3'b001 : out = 8'b0000_0010;
3'b010 : out = 8'b0000_0100;
3'b011 : out = 8'b0000_1000;
3'b100 : out = 8'b0001_0000;
3'b101 : out = 8'b0010_0000;
3'b110 : out = 8'b0100_0000;
//注释掉最后一种情况,此时case的情况不能完全列举完会产生latch.
//3'b111 : out = 8'b1000_0000;
//default : out = 8'b0000_0001;
endcase
endmodulea
仿真后的硬件电路
情况三:组合逻辑电路中输出变量赋值给自己
module decorder
(
input wire in_1,
input wire in_2,
input wire in_3,
output reg [7:0] out
);
always@(*)
if({in_1, in_2, in_3} == 3'b000)
out = 8'b0000_0001;
else if({in_1, in_2, in_3} == 3'b001)
out = 8'b0000_0010;
else if({in_1, in_2, in_3} == 3'b010)
out = 8'b0000_0100;
else if({in_1, in_2, in_3} == 3'b011)
out = 8'b0000_1000;
else if ({in_1, in_2, in_3} == 3'b100)
out = 8'b0001_0000;
else if ({in_1, in_2, in_3} == 3'b101)
out = 8'b0010_0000;
else if ({in_1, in_2, in_3} == 3'b110)
out = 8'b0100_0000;
else if ({in_1, in_2, in_3} == 3'b111)
out = out;
endmodule
、仿真后的硬件电路为
总结
在组合逻辑中一定要避免输出信号处于不定的状态,一定要 让输出无论在任何条件下都有一个已知的状态,就可以避免 Latch 的产生。Latch 作为一种 基本电路单元,会影响到电路的时序性能,应尽量避免使用。