锁存器
Latch是锁存器,Latch 其实就是锁存器,是一种在异步电路系统中,对输入信号电平敏感的单元,用来存储信息。锁存器在数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓冲器,一旦锁存信号有效,则数据被锁存,输入信号不起作用,即输出不随着输入发生变化。
锁存器在组合逻辑电路中比较常见,由于在组合电路当中,输出与输入有关,如果输出的数据被锁存,则组合逻辑电路就无法正常工作,在组合电路当中应该尽量避免锁存情况的出现。
另外产生 Latch是我们在同步电路中尽量避免的,但并不表示 Latch 没有用的或者说是错误的,Latch 在异步电路中是非常有用的,只是我们设计的是同步电路,要尽量避免。
那么,为什么会出现锁存或者说什么情况下会出现锁存呢,一般而言,如果输出的信号不确定,就会产生锁存。
通常情况下,在verilog中以下情况会出现锁存:
1、条件判断语句if语句没有接else;
2、列举语句case语句没有default;
3、输出变量自己赋值给自己
因此,在组合逻辑电路的设计当中,一定要确保输出的信号的值是确定的。
如果不记得软件的操作和仿真设置可以点击下边链接查看。
锁存器举例——3-8译码器
一、if语句没有else
代码:
module latch_one(
input wire in1 , //输入信号 in1
input wire in2 , //输入信号 in2
input wire in3 , //输入信号 in3
output reg [7:0] out //输出信号 out
);
//out:根据 3 个输入信号选择输出对应的 8bit out 信号
always @ (*)
begin
if({in1, in2, in3} == 3'b000)
out = 8'b0000_0001;
else if({in1, in2, in3} == 3'b001)
out = 8'b0000_0010;
else if({in1, in2, in3} == 3'b010)
out = 8'b0000_0100;
else if({in1, in2, in3} == 3'b011)
out = 8'b0000_1000;
else if({in1, in2, in3} == 3'b100)
out = 8'b0001_0000;
else if({in1, in2, in3} == 3'b101)
out = 8'b0010_0000;
else if({in1, in2, in3} == 3'b110)
out = 8'b0100_0000;
else if({in1, in2, in3} == 3'b111)
out = 8'b1000_0000;
//else //把最后一个 if 的 else 注释掉
//out = 8'b0000_0001;
end
endmodule
从仿真结果可以看到10240行提示我们这里产生了锁存,这里是提示我们,虽然仿真不会产生错误,但也要注意这里的锁存是否符合电路的设计
从RTL视图视图我们可以看到,电路出现了锁存器out[i]$latch,i=0-7。
而正确的没有锁存的RTL视图如下(代码注释部分还原即可)
二、组合逻辑中 case 的条件不能够完全列举且不写 default
代码:
module latch_one(
input wire in1 , //输入信号 in1
input wire in2 , //输入信号 in2
input wire in3 , //输入信号 in3
output reg [7:0] out //输出信号 out
);
//out:根据 3 个输入信号选择输出对应的 8bit out 信号
always @ (*)
begin
case({in1, in2, in3})
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;
//3'b111 : out = 8'b1000_0000;
//defulat:out=8'b0000_0001
endcase
end
endmodule
RTL视图
锁存单元
三、组合逻辑中输出变量赋值给自己
代码
module latch_one(
input wire in1 , //输入信号 in1
input wire in2 , //输入信号 in2
input wire in3 , //输入信号 in3
output reg [7:0] out //输出信号 out
);
//out:根据 3 个输入信号选择输出对应的 8bit out 信号
always @ (*)
begin
if({in1, in2, in3} == 3'b000)
out = 8'b0000_0001;
else if({in1, in2, in3} == 3'b001)
out = 8'b0000_0010;
else if({in1, in2, in3} == 3'b010)
out = 8'b0000_0100;
else if({in1, in2, in3} == 3'b011)
out = 8'b0000_1000;
else if({in1, in2, in3} == 3'b100)
out = 8'b0001_0000;
else if({in1, in2, in3} == 3'b101)
out = 8'b0010_0000;
else if({in1, in2, in3} == 3'b110)
out = 8'b0100_0000;
else if({in1, in2, in3} == 3'b111)
out = 8'b1000_0000;
else
out = out;//变量赋值给自己
end
endmodule
RTL视图
在组合逻辑中一定要避免输出信号处于不定的状态,一定要让输出无论在任何条件下都有一个已知的状态,就可以避免 Latch 的产生。Latch 作为一种基本电路单元,会影响到电路的时序性能,应尽量避免使用,但出现 Latch 造成设计与意图不符的情况,是由于设计人员代码不规范造成的。一旦出现锁存,一定要清楚该锁存是否是设计者想要的。