(5)FPGA仿真——Latch锁存器

锁存器

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 造成设计与意图不符的情况,是由于设计人员代码不规范造成的。一旦出现锁存,一定要清楚该锁存是否是设计者想要的。

下节内容——D触发器

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值