0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

锁存器:组合电路与时序电路的桥梁

sanyue7758 来源:FPGA and ICer 2023-08-08 09:55 次阅读

前言

本系列整理数字系统设计的相关知识体系架构,为了方便后续自己查阅与求职准备。对于FPGAASIC设计中,避免使用Latch(锁存器)一直是个绕不开的话题,本文结合网上的文章,并根据示例介绍如何在实际设计中避免Latch。

锁存器:组合电路与时序电路的桥梁

在网上看到一个帖子说了这样一个说辞,我觉得很不错,分享给大家:锁存器不就是组合逻辑电路与时序逻辑电路的桥梁么?

其实仔细想想也是,之前功利性的学习根本没有仔细考虑为什么拿到数电基础的书后,目录设计总是按照组合逻辑、锁存器、时序逻辑去安排章节。

现在思考后我觉得很有道理(听我开始瞎掰)最初数字电路的组合逻辑解决了很多问题,但是却没有很好的解决如何将这个状态做存储,有些设计情况下不得不将一些信号的状态存储,所以就使用逻辑门构建了锁存器的概念,设计的灵活性得到进一步提升,但是同时又存在了另外一个问题,锁存器就像一个阀门,但是由于这个阀门打开后内部是随时可以变化的,这也给如何检验设计的正确性带来了难度,所以急需一个器件或者设计去解决这个问题,进而有了时序逻辑电路中触发器的概念,触发器也就随着 “需求和发展” 出现。

因此,组合逻辑、锁存器、时序逻辑,这样安排更像说明了数字电路的发展和迭代的历史,虽然锁存器的一般内容比较少,但不可否认,锁存器就是组合逻辑电路与时序逻辑电路的桥梁。

锁存器概念

锁存器( latch)是电平触发的存储单元,数据存储的状态取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据输入发生变化。

锁存器不同于触发器,锁存器在不锁存数据时,输出端的信号随输入信号变化,就像信号通过一个缓存器一样;一旦锁存信号起锁存作用,则数据被锁住,输入信号不起作用。因此锁存器也称为透明锁存器, 指的是不锁存时输出对输入是透明的。

锁存器的分类包括 RS 锁存器、门控 RS 锁存器和 D 锁存器, 此处介绍下 D 锁存器。

D 锁存器就是能够将输入的单路数据 D 存入到锁存器中的电路,D锁存器的电路图如下图所示。

c4d6ea08-351f-11ee-9e74-dac502259ad0.pngimage-20220822213310864

从 D 锁存器的电路图中可以看出,该电路主要是由两个部分组成,第一个部分是由 G1、 G2两个与非门组成的 RS 锁存器,第二个部分是由 G3、 G4 两个与非门组成的控制电路。C 为控制信号,用来控制 G3 和 G4 的激励输入。

下面来分析下 D 锁存器的工作原理

当控制信号 C=0 时,根据与非门的逻辑定律,无论 D输入什么信号, RD 和 SD 信号都会输出为1。RD 和 SD 都同时等于 1 的话,锁存器的输出端 Q 将维持原状态不变。

当控制端 C=1 时,如果此时 D=0,SD 就等于1, RD 就等于 0,根据 RS 锁存器的逻辑规律,电路的结果就为 0 状态;如果 D =1,那么 RD 就等于 1,SD 也就等于 0,锁存器的结果就为 1 状态,也就是说,此时锁存器的状态是由激励输入端 D 来确定的,D 等于什么,锁存器的状态就是什么。

根据上面的描述,可以推出 D 锁存器的特性表, Qn 是指触发器当前逻辑状态也即触发前的状态, Qn+1 是指触发后的状态。

C D Qn Qn+1
0 X 0 0
0 X 1 1
1 0 X 0
1 1 X 1

通过这个表格,可以看出,当 C 为 1 时, D 的状态和 Qn+1 的状态完全一样,当 D=0 时, Qn+1=0,当 D=1 时, Qn+1=1。进一步画出 D 锁存器的波形图。

c5027722-351f-11ee-9e74-dac502259ad0.pngimage-20220822213545151

从 D 锁存器的波形图可以看出, D 是锁存器的输入信号, C 是锁存器的控制信号,Q 是锁存器的输出信号。当控制信号 C 为高电平时,输出信号 Q 将跟随输入信号 D 的变化而变化。

为什么要避免锁存器?(Latch的危害)

前面虽然提到锁存器是组合逻辑电路与时序电路的桥梁,但是其灵活性很难保证在设计中进行精准分析。在实际使用中,Latch 多用于门控时钟(clock gating)的控制,在绝大多数设计中我们要避免产生锁存器。它会让设计的时序出问题,并且它的隐蔽性很强, 新人很难查出问题。

毛刺敏感:锁存器最大的危害在于不能过滤毛刺和影响工具进行时序分析。这对于下一级电路是极其危险的。这也就是为什么寄存器不用电平触发而选择使用边沿触发的原因。所以,只要能用触发器的地方,就不用锁存器。

不能异步复位: 由于其能够储存上次状态的原因,上电后Latch处于不定态。

占用更多资源: 对于绝大多数当前主流的FPGA架构资源中,基本是不包含Latch,这也就意味着需要更多的资源去实现搭建Latch。在早些版本的某些FPGA内部包含了Latch。

使时序分析变得复杂: 锁存器没有时钟信号,只有数据输入和使能以及输出 q 端,没有时钟信号也就说明没有办法对这种器件进行时序分析, 这个在时序电路里面是非常危险的行为,因为可能引起时序不满足导致电路功能实现有问题。

额外的延时: 在ASIC设计中,锁存器也会带来额外的延时和DFT,并不利于提高系统的工作频率。

结构完整就能避免Latch?

关于如何避免,可能大多数的人首先想到的是组合逻辑电路中,在if-else结构中缺少else或case结构中缺少default所导致,所以中要求if-else结构和case结构要写完整。但结构完整就真能完全避免Latch的产生吗?

moduledemo(
inputwire[1:0]en,
outputreg[3:0]latchtest
);

always@(*)begin
if(en==1)begin
latchtest='d6;
end
elseif(en==2)begin
latchtest='d3;
end
elsebegin
latchtest=latchtest;
end
end
endmodule

图上示例这种情况,虽然逻辑完整但也会生成latch,其原因是针对该逻辑信号进行了保持,构成了逻辑环路。

c52bd48c-351f-11ee-9e74-dac502259ad0.pnglatch测试

同样下图中的设计也会产生锁存器,原因是虽然逻辑完备但是没有针对单一信号进行完备逻辑的处理,在部分逻辑信号进行了保持,所以逻辑仍生成了latch。

//demo1
reglatchtest1,latchtest2;
always@(*)begin
if(enable)
latchtest1=in;
else
latchtest2=in;
end

下面的设计是我认为比较隐晦的latch。乍一看,分支完备,case语句也有default,但在EDA工具进行分析后仍出现latch

moduledemo(
inputwire[1:0]en,
outputreg[3:0]latchtest
);

always@(*)begin
case(en)
0:latchtest[0]='d1;
1:latchtest[1]='d1;
2:latchtest[2]='d1;
3:latchtest[3]='d1;
default:latchtest='d1;
endcase
end

分析其根本原因仍然是,针对相关的分支条件该信号的部分bit位进行了保持。

c54d36f4-351f-11ee-9e74-dac502259ad0.png隐晦的latch设计

此外,三目运算符在组合逻辑设计时进行逻辑保持,同样会引入latch。

锁存器产生的根本原因

生成latch的例子很多,从例子来看不论是单个信号或者是一个信号某些位,只要在组合逻辑设计时他存在逻辑保持都有可能生成latch,但说锁存器产生的根本原因,即为代码设计时的逻辑:需要在组合逻辑中避免保持的操作。当组合逻辑需要保持时,就会综合出锁存器。

避免Latch的解决方法

整理常见出现组合逻辑保持的情况,也即能得到避免生成latch的相关方法。

if else分支结构不完整

组合逻辑中case结构不完整

组合逻辑设计时使用三目运算符存在逻辑保持

使用原信号进行赋值或者使用原信号进行条件判断

敏感信号列表不完整

所以避免latch的方法就是,要对以上或者其他未列举的组合逻辑中存在逻辑保持的情况进行改写和规避,即可避免头疼的latch生成。简单来说就是:优化代码逻辑,避免组合逻辑的逻辑保持。 当遇到逻辑保持的情况时,要对存在逻辑保持的分支进行补全,或者使用赋初值的方法进行覆盖逻辑保持时的情况。

//补全条件分支结构
always@(*)begin
if(en)
dout=in;
else
dout='d0;
end

//赋初值
always@(*)begin
dout='d0;
if(en)
dout=data;//如果en有效,改写q的值,否则q会保持为0
end

必要的逻辑保持怎么处理?

可能对于有些情况无法完全避免掉组合逻辑设计的逻辑保持,对于这种情况,可以在这个组合逻辑路径中插入一级寄存器,寄存器的输出替代原来逻辑保持的部分,示例如下:

wire[DATA_WIDTH-1:0]accsum_in=(ab_sum_valid)?sum_in:dout;
always@(posedgeclkornegedgerst_n)begin
if(rst_n=='d0)begin
dout<= 'd0;
     end
     else if(adder1_outvld == 1)begin
       dout <= sum_in ;
     end
   end

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21326

    浏览量

    593242
  • asic
    +关注

    关注

    34

    文章

    1158

    浏览量

    119266
  • 时序电路
    +关注

    关注

    1

    文章

    113

    浏览量

    21588
  • 锁存器
    +关注

    关注

    8

    文章

    745

    浏览量

    41040
  • 组合电路
    +关注

    关注

    0

    文章

    10

    浏览量

    6676

原文标题:Reference

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基本时序电路设计实验

    实验二 基本时序电路设计(1)实验目的:熟悉QuartusⅡ的VHDL文本设计过程,学习简单时序电路的设计、仿真和硬件测试。(2)实验内容:Ⅰ.用VHDL设计一个带异步复位的D触发,并利用
    发表于 10-11 09:21

    时序电路的分析与设计方法

    逻辑功能,若电路存在问题,并提出改进方法。在分析同步时序电路时分为以下几个步骤:分清时序电路的组成.列出方程. 根据时序电路组合部分,写出
    发表于 08-23 10:28

    什么是时序电路

    什么是时序电路时序电路核心部件触发的工作原理
    发表于 03-04 06:32

    PLD练习2(时序电路)

    PLD练习2(时序电路)
    发表于 05-26 00:14 20次下载

    同步时序电路

    同步时序电路 4.2.1 同步时序电路的结构和代数法描述
    发表于 01-12 13:31 4793次阅读
    同步<b class='flag-5'>时序电路</b>

    什么是时序电路

    什么是时序电路 任意时刻的稳定输出,不仅与该时刻的输入有关,而且还
    发表于 01-12 13:23 8196次阅读
    什么是<b class='flag-5'>时序电路</b>

    组合电路时序电路的讲解

    组合电路时序电路是计算机原理的基础课,组合电路描述的是单一的函数功能,函数输出只与当前的函数输入相关;
    的头像 发表于 09-25 09:50 2.5w次阅读

    锆石FPGA A4_Nano开发板视频:时序电路的分析与设计

    时序电路,是由最基本的逻辑门电路加上反馈逻辑回路(输出到输入)或器件组合而成的电路,与组合电路
    的头像 发表于 09-27 07:10 2206次阅读
    锆石FPGA A4_Nano开发板视频:<b class='flag-5'>时序电路</b>的分析与设计

    时序电路之触发器

    时间的重要性不言而喻,加上时间这个维度就如同X-Y的平面加上了一个Z轴,如同打开了一个新的世界。所以今天我们就要来聊聊时序电路。 在时序电路中,电路任何时刻的稳定状态输出不仅取决于当前的输入,还与
    的头像 发表于 01-06 17:07 4473次阅读

    时序电路基本介绍

    组合逻辑和时序逻辑电路是数字系统设计的奠基石,其中组合电路包括多路复用器、解复用器、编码器、解码器等,而
    的头像 发表于 09-12 16:44 7615次阅读
    <b class='flag-5'>时序电路</b>基本介绍

    基本逻辑电路时序电路组合电路设计

    从今天开始新的一章-Circuits,包括基本逻辑电路时序电路组合电路等。
    的头像 发表于 10-10 15:39 918次阅读

    什么是同步时序电路和异步时序电路,同步和异步电路的区别?

    同步和异步时序电路都是使用反馈来产生下一代输出的时序电路。根据这种反馈的类型,可以区分这两种电路时序电路的输出取决于当前和过去的输入。时序电路
    的头像 发表于 03-25 17:29 1.9w次阅读
    什么是同步<b class='flag-5'>时序电路</b>和异步<b class='flag-5'>时序电路</b>,同步和异步<b class='flag-5'>电路</b>的区别?

    时序电路包括两种类型 时序电路必然存在状态循环对不对

    时序电路是由触发器等时序元件组成的数字电路,用于处理时序信号,实现时序逻辑功能。根据时序元件的类
    的头像 发表于 02-06 11:22 416次阅读

    时序电路的分类 时序电路的基本单元电路有哪些

    时序电路是一种能够按照特定的顺序进行操作的电路。它以时钟信号为基准,根据输入信号的状态和过去的状态来确定输出信号的状态。时序电路广泛应用于计算机、通信系统、数字信号处理等领域。根据不同的分类标准
    的头像 发表于 02-06 11:25 660次阅读

    时序电路基本原理是什么 时序电路由什么组成

    时序电路基本原理是指电路中的输出信号与输入信号的时间相关性。简单来说,就是电路的输出信号要依赖于其输入信号的顺序和时间间隔。 时序电路由时钟信号、触发器和
    的头像 发表于 02-06 11:30 575次阅读