数字设计小思 - 谈谈Latch:组合与时序逻辑的桥梁

news2024/11/25 16:04:57

前言

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

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

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

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

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

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

锁存器概念

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

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

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

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

image-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 是指触发后的状态。

CDQnQn+1
0X00
0X11
10X0
11X1

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

image-20220822213545151

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

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

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

  1. 毛刺敏感:锁存器最大的危害在于不能过滤毛刺和影响工具进行时序分析。这对于下一级电路是极其危险的。这也就是为什么寄存器不用电平触发而选择使用边沿触发的原因。所以,只要能用触发器的地方,就不用锁存器。
  2. 不能异步复位: 由于其能够储存上次状态的原因,上电后Latch处于不定态。
  3. 占用更多资源: 对于绝大多数当前主流的FPGA架构资源中,基本是不包含Latch,这也就意味着需要更多的资源去实现搭建Latch。在早些版本的某些FPGA内部包含了Latch。
  4. 使时序分析变得复杂: 锁存器没有时钟信号,只有数据输入和使能以及输出 q 端,没有时钟信号也就说明没有办法对这种器件进行时序分析, 这个在时序电路里面是非常危险的行为,因为可能引起时序不满足导致电路功能实现有问题。
  5. 额外的延时: 在ASIC设计中,锁存器也会带来额外的延时和DFT,并不利于提高系统的工作频率。

结构完整就能避免Latch?

大多数的人首先想到的是由于verilog代码中在if-else结构中缺少else或case结构中缺少default所导致,因此也往往在设计中要求if-else结构和case结构要写完整。但结构完整就真能完全避免Latch的产生吗?

module demo(
    input  wire [1:0] en,
    output reg[3:0] latchtest
);

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

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

latch测试

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

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

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

module demo(
    input  wire [1:0] en,
    output reg[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位进行了保持。

隐晦的latch设计

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

锁存器产生的根本原因

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

避免Latch的解决方法

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

  1. if else分支结构不完整
  2. 组合逻辑中case结构不完整
  3. 组合逻辑设计时使用三目运算符存在逻辑保持
  4. 使用原信号进行赋值或者使用原信号进行条件判断
  5. 敏感信号列表不完整

所以避免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 @(posedge clk or negedge rst_n) begin
     if(rst_n == 'd0)begin
       dout <= 'd0;
     end
     else if(adder1_outvld == 1)begin
       dout <= sum_in ;
     end
   end

Reference

  1. 【FPGA】Verilog中锁存器(Latch)原理、危害及避免
  2. 菜鸟教程 - 6.5 Verilog 避免 Latch
  3. Verilog专题(三)如何在组合逻辑中避免latch的产生
  4. Latch的产生和避免

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习如何通过构建一个简单的JavaScript颜色游戏来操作DOM

学习如何通过构建一个简单的JavaScript颜色游戏来操作DOM 题目要求 我们将构建一个简单的颜色猜谜游戏。每次游戏启动时&#xff0c;都会选择一个随机的RGB颜色代码。根据游戏模式&#xff0c;我们将在屏幕上提供三个&#xff08;简单&#xff09;或六个&#xff08;困难&…

基于 SpringBoot + Vue 的智能停车场项目。

一、开源项目简介 基于 SpringBoot Vue 的智能停车场项目。 智能停车场管理平台&#xff01;科学计费 多种计费方案灵活切换&#xff0c;商场、小区、停车场等场景均适用&#xff01;无人值守 云端控制实现无岗亭模式下的车辆自主进出&#xff0c;降低人工成本&#xff01; …

Nacos,OpenFeign,Ribbon,loadBalance如何相互协调工作

1、SpringCloud规范 对于Nacos而言其作用在于服务注册发现和配置中心&#xff0c;对于Ribbon而言作用在于实现实例负载均衡&#xff0c;对于OpenFeign而言要通过rpc实现远程调用 2、Nacos实现服务注册发现 SpringCloud提供了ServiceRegistration接口&#xff0c;实现服务注册…

软件保护器:Themida 3.1.14 Crack

先进的Windows软件保护系统 版本&#xff1a;3.1 版本&#xff1a;3.1.4.0 日期&#xff1a;2022 年 11 月 10 日 概述 在创建应用程序时&#xff0c;Compiler 会将应用程序源代码编译成多个由机器语言代码构成的目标文件。然后将目标文件链接在一起以创建最终的可执行文件。 与…

【chapter29】【PyTorch】[交叉验证】

前言 前面讲了 Underfit , Overfit ,这里重点讲解一下如何检测 一 数据集划分 训练的时候&#xff0c;我们一般把数据集分成 训练集 和 验证集 每训练一轮或者几轮.validation 一次,看一下当前 验证集上的loss&acc 是否 提升.如果已经是最佳值,则提前结束训练,防止过拟合…

如何做好联络口译的译前准备工作?

我们知道&#xff0c;译前准备与口译质量有着紧密的联系。在联络口译中&#xff0c;对口译员的双语能力和知识储备有着十分高的要求&#xff0c;为了能够顺利完成口译任务&#xff0c;就必须进行译前准备。那么&#xff0c;如何做好译前准备工作&#xff1f;联络口译的译前准备…

强烈推荐这 6 款 API 测试工具,绝对有一款没听过

Postman: Postman 是一个流行的 API 开发和测试工具&#xff0c;提供了丰富的功能&#xff0c;包括请求构建、测试自动化、数据驱动等。用户可以通过 Postman 的界面轻松创建和测试 RESTful API。 Insomnia: Insomnia 是一款功能强大的开源 API 测试工具&#xff0c;支持多种协…

Windows 远程桌面提示没有远程桌面授权服务器可以提供许可证

可参考之前发布的一篇文章&#xff0c;帮助你远程登录&#xff1a;远程连接提示 由于没有远程桌面授权服务器提供许可证_计算机没有远程桌面客户端访问许可证_csdn_aspnet的博客-CSDN博客 虽然上述文章命令可以远程进入系统&#xff0c;但是每次都需要使用上述文章中的命令进入…

MySQL高级篇——索引的创建与设计原则

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题 目录 一、索引的分类与使用 1.1 索引的分类 1.1.1. 普通索引 1.1.2. 唯一性索引 1.1.3. 主键索引&#xff08;唯一非空&#xff09; 1.1.4…

Jetson Orin MultiMedia 使用总结

1.Jetson Orin /Xavier 对于图片的输入以及输出处理有一套特定的API。代码存放在/usr/src/jetson_multimedia_api中。 2.其中最主要的几个头文件&#xff1a;缓存管理申请 nvbufsurface.h 缓存转换 nvbufsurftransform.h 显示 nvosd.h 以及显示模块。 3.YUV转RGB来分析一下各…

开发人员应考虑使用 Edge浏览器的 8 个理由

1.无限访问ChatGPT 这是正确的。您可以通过 Bing 访问 GPT-4。但与 2021 年后没有数据的 ChatGPT 不同&#xff0c;必应通过从自己的搜索引擎中提取最新数据来对其进行补偿。 首先&#xff0c;点击Edge 浏览器左上角的Bing 小图标 Bing 具有三个选项卡&#xff1a;Chat、Compo…

VMware虚拟机安装黑苹果10.15 || AMD R7 5800处理器

VMwar版本&#xff1a;16Pro 链接&#xff1a;https://pan.baidu.com/s/1qGHEynWSV4YS9WSNonxiuA?pwdazvh 提取码&#xff1a;azvh macOS链接&#xff0c;版本为Catalina 10.5。这个版本后&#xff0c;os安装包就过10G了&#xff0c;会特别卡。 链接&#xff1a;https://pan…

YOLOv1代码复现1:辅助功能实现

YOLOv1代码复现1&#xff1a;辅助功能实现 前言 ​ 在经历了Faster-RCNN代码解读的摧残后&#xff0c;下决心要搞点简单的&#xff0c;于是便有了本系列的博客。如果你苦于没有博客详细告诉你如何自己去实现YOLOv1&#xff0c;那么可以看看本系列的博客&#xff0c;也许可以帮助…

操作指南|如何创建x-chain DAO

DAO是一个去中心化组织&#xff0c;大体与任何其他组织一样&#xff0c;但它是由智能合约中编码的规则所管理&#xff0c;并使DApps等能够完全去中心化且自主运行。 &#x1f4c4; 查看MoonbeamDocs 这与通常的分步教程不同&#xff0c;该推文旨在分享关于运行去中心化自治组…

delta.io 2.3.0 overwrite模式 overwriteSchema df覆盖table的表schema

初始化一张表 overwriteSchema 默认为false 图中注意事项: Note that the schema cant be overwritten when using replaceWhere. overwriteSchema 配置为true 可成功覆盖插入 overwriteSchema=true的配置项必须配置.mode("overwrite") 而不能是.mode("append…

( 栈和队列) 225. 用队列实现栈 ——【Leetcode每日一题】

❓225. 用队列实现栈 难度&#xff1a;简单 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入…

国云筑基“翼”气风发,天翼云以科技创新绘就数字中国蓝图

科技云报道原创。 全球新一轮技术革命方兴未艾&#xff0c;特别是以数字技术为核心的信息技术革命&#xff0c;正在实现群体突破和加快广泛深度应用。 从2017年的“促进数字经济加快成长”&#xff0c;到2019年的“壮大数字经济”&#xff0c;到2020年的“全面推进‘互联网&am…

从0搭建Vue3组件库(八):使用 release-it 实现自动管理发布组件库

使用 release-it 实现自动管理发布组件库 上一篇文章已经打包好我们的组件库了,而本篇文章将介绍如何发布一个组件库。当然本篇文章介绍的肯定不单单只是发布那么简单。 组件库发布 我们要发布的包名为打包后的 easyest,因此在 easyest 下执行pnpm init生成package.json {&…

数字中国建设2522整体框架

作为影响中国未来发展的重磅文件&#xff0c;《数字中国建设整体布局规划》明确了两个重要时间节点&#xff1a; 到 2025 年&#xff0c;基本形成横向打通、纵向贯通、协调有力的一体化推进格局&#xff0c;数字中国建设取得重要进展&#xff1b; 到 2035 年&#xff0c;数字化…

Compiler- 尾调用

我们还是用例子来引入本次要探讨的问题--尾调用 #include <stdio.h>int fib(int a) {return a < 2 ? 1 : fib(a - 1) fib(a - 2); }int main() {int n,result;scanf("%d",&n);result fib(n);printf("result is %d.\n",result);return 0; …