FPGA基础 -- Verilog 锁存器简介

由浅入深地讲解 Verilog 中的锁存器(Latch)**,包括:

  1. 什么是锁存器(定义与作用)
  2. 锁存器的分类(透明锁存器 vs 边沿触发器)
  3. Verilog 中锁存器的建模方式
  4. 锁存器与触发器的区别
  5. 锁存器的时序特性与设计陷阱
  6. 实际应用与避免锁存器的最佳实践
  7. 综合工具识别锁存器的方式与调试技巧

一、什么是锁存器(Latch)?

锁存器是一种电平敏感的时序逻辑单元,用于在特定控制信号(如 enableclk 为高电平)时锁存输入数据,否则保持原状态。

🔧 本质上,它在控制信号有效时“透明”地传输数据”,无效时“记住上次的值”

锁存器的简要逻辑图:

         +-----------+
D ------>|           ||  Latch    |----> Q
EN ----->| (Enable)  |+-----------+

二、锁存器的分类

类型控制信号敏感方式特点
透明锁存器(Transparent Latch)电平敏感(高电平或低电平)开启时透传,关闭时保持
边沿触发器(Flip-Flop)上升/下降沿敏感只在边沿更新值(由两个锁存器组合)

注意:触发器(如 D Flip-Flop)是由两个互补使能的锁存器串联形成的结构(主从结构),是锁存器的扩展版本。


三、Verilog 中锁存器的建模方式

锁存器一般是always 块中使用电平敏感的敏感列表并缺少完整的 else 分支时自动生成。

1. 透明锁存器建模示例

module latch_example (input  wire en,input  wire d,output reg  q
);always @(en or d) beginif (en)q = d;// 没有 else,q 会自动保持原值,综合器推断 latch
endendmodule

❗ 这是经典 latch 写法if 条件成立赋新值,条件不成立时,q 保持原值,导致 latch 自动生成。


2. 如果不小心写出 latch?

如下代码也会综合出 latch,因为 q 只有在某个条件下才赋值:

always @(a or b or sel) beginif (sel)q = a; // 没有对 sel==0 情况赋值 => latch!
end

为避免这种情况,建议始终覆盖所有逻辑分支,如:

always @(a or b or sel) beginif (sel)q = a;elseq = b;  // 所有分支覆盖 => 组合逻辑
end

四、锁存器与触发器的区别

特性锁存器(Latch)触发器(Flip-Flop)
敏感性电平敏感边沿敏感
控制方式Enable 信号Clock 上升/下降沿
透明性是(在 EN 有效时)
建模方法电平触发 always边沿触发 always_ff
延迟控制容易受组合逻辑影响较稳定,边沿采样
用途短暂锁存/流水线优化寄存器、状态保持

五、锁存器的时序特性与设计陷阱

时序特性:

  • 透明期内输入变化会直接影响输出,很容易引入毛刺或竞争;
  • 在综合中,如果 Latch 与组合逻辑交织使用,可能会出现 逻辑冒险(hazard)
  • Hold time 要求更严格,不易进行 STA(静态时序分析);

常见设计陷阱:

错误用法问题原因
没有覆盖所有 if/else 分支导致 latch 被综合
在组合逻辑路径中插入 latch不易分析,逻辑难以收敛
Latch 控制信号由组合逻辑生成产生不定延迟与冒险

六、实际应用场景与如何规避 latch?

✅ 可控使用的场景(明确要用 latch):

  • 异步数据采样或保持
  • 功耗优化(某些低速模块)
  • 状态保持器(FSM 中稀有)

❌ 一般应规避 latch:

在主流 FPGA 项目中,推荐只使用触发器,不主动写 latch,原因包括:

  • 综合工具难以时序约束 latch;
  • ILA 等调试工具难以观测 latch 的状态;
  • latch 可能引入冒险、毛刺、竞争,造成 bug;

七、Vivado/Quartus/Lattice 中 latch 检查方式

✅ Vivado 示例:

  1. 编译后,在 Messages -> Synthesized Design -> Latches Inferred 会列出 latch;

  2. 可通过约束文件添加:

    set_property HD.CLK_SRC {NONE} [get_cells -hierarchical -filter {CELLTYPE == latch}]
    

    来阻止 latch 合成;

✅ 建议工具策略:

  • 使用 always_ff @(posedge clk)(SystemVerilog)
  • 在组合逻辑使用 always @(*)全分支赋值

总结

知识点说明
锁存器本质电平敏感,控制信号有效时透明,反之保持
建模方式条件赋值但未赋全分支时会被综合出 latch
与触发器区别触发器是边沿敏感,锁存器是电平敏感
风险容易引起时序问题、冒险、毛刺
建议组合逻辑必须全分支赋值,时序逻辑建议统一用触发器

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

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

相关文章

Eclipse Memory Analyzer (MAT) 相关配置调整

一、JDK版本过低提示 已安装高于 jdk 17 的版本依旧提示 jdk 版本过低,打开MAT的安装目录,在配置文件 MemoryAnalyzer.ini 中添加配置指向JDK即可。新增两行配置: -vm D:/jdk_21.0.7/bin/javaw.exe //jdk安装路径 bin 目录下的javaw.exe二…

机器学习常用评估指标

机器学习常用评估指标 机器学习的评价指标有精度、精确率、召回率、P-R曲线、F1 值、TPR、FPR、ROC等指标,还有在生物领域常用的敏感性、特异性等指标。 基础 在分类任务中,各指标的计算基础都来自于对正负样本的分类结果,用混淆矩阵表示&…

视频相似度检测算法(带课设报告)

摘 要 本文提出了一种基于关键帧特征提取的视频相似度检测方法,通过融合自适应采样与特征降维技术实现高效准确的视频内容比对。系统采用三阶段处理流程:首先对输入视频进行自适应关键帧采样,通过均匀间隔算法提取固定数量(默…

微服务江湖的爱恨情仇:Spring Cloud 与 Kubernetes 的双雄演义

引言:双雄并立,一个时代的序幕 微服务革命,如同一场燎原之火,将庞大、笨重的单体应用烧成灰烬,宣告了一个敏捷、独立、快速迭代的新纪元。然而,这场革命在摧毁旧世界的同时,也催生了一片混沌的新…

深度拆解RAGFlow分片引擎之切片实现

上一篇深度拆解RAGFlow分片引擎!3大阶段视觉增强,全网最硬核架构解析 讲了切片的整体流程,今天我们来拆下切片的实现。 我们在设置的时候,可以选择切片方法。这个参数是parser_id 在创建知识库的时候,选择对应的切片方…

CSS平滑滚动效果实现方法

一、纯CSS实现方案 使用 scroll-behavior 属性 属性值 auto (默认值):滚动框立即滚动smooth:滚动框以平滑的方式滚动 /* 全局平滑滚动 */ html {scroll-behavior: smooth; }/* 特定容器平滑滚动 */ .scroll-container {scroll-behavior: smooth;over…

李沐动手深度学习(pycharm中运行笔记)——12.权重衰退

12.权重衰退(与课程对应) 目录 一、权重衰退 1、使用均方范数作为硬性限制 2、使用均方范数作为柔性限制(通常这么做) 3、演示对最优解的影响 4、参数更新法则 5、总结 二、代码实现从零实现 三、代码实现简介实现 一、权重…

React Native【实战范例】同步跟随滚动

最终效果 实现原理 主动滚动区触发滚动事件,原生监听滚动值的变化,并用动画的方式实时同步到跟随滚动区 技术要点 使用 Animated.ScrollView 使用动画变量 const scrollY useRef(new Animated.Value(0)).current;主动滚动触发 onScroll,用 …

如何仅用AI开发完整的小程序<3>—创建小程序基础框架

1、启动小程序开发者工具-选择小程序,点击 2、创建一个项目工程 项目名称:自己填默认的也行,最好不要中文,拼音也行 目录:选择你的项目创建路径 AppID:可以先点测试号,后面再替换自己的AppID就…

SQL等价改写优化

or 与 union all的优化 在SQL开发中,我们经常会遇到这样的情况:需要组合多个相似但略有不同的查询结果。大多数开发者本能地使用UNION/UNION ALL来解决,这种方式直观易懂,但在特定场景下却隐藏着巨大的性能浪费。 本案例将从执行…

【已解决】 数据库INSERT操作时,Column count doesn’t match value count at row 1

【已解决】数据库INSERT操作时,ColumnColumn count doesn’t match value count at row 1 在开发过程中,我们经常会遇到数据库操作错误,其中之一就是 MySQL 中的 “Column count doesn’t match value count at row1” 错误。这个错误通常发…

管件接头的无序抓取

文章目录 1,目的2,过程3,易混易错点4,代码详解4.1,初始化窗口4.2,创建多视角立体视觉模型。4.3,创建表面匹配模型4.4,多视角立体视觉重建管件堆表面模型4.5,管道接头查找…

移远通信 × 紫光展锐,推动FWA “5G+AI”新体验

6月19日,在2025 MWC上海期间,移远通信宣布,携手紫光展锐,推出面向下一代CPE应用的“5GAI”融合解决方案。目前双方正联合多家CPE厂商开展方案深度调优,以加速5GAI CPE终端的产业化落地进程。 该方案以移远5G模组RG620…

深入理解Grad-CAM:用梯度可视化神经网络的“注意力“

深入理解Grad-CAM:用梯度可视化神经网络的"注意力" 引言 在深度学习的发展过程中,模型的可解释性一直是一个重要的研究方向。尽管现代神经网络在图像识别、自然语言处理等任务上取得了令人瞩目的成果,但它们往往被称为"黑盒…

离线环境jenkins构建前端部署镜像

gitlabjenkins 实现前端项目打包成 docker 镜像;gitlab部署就不赘述了;因部署的gitlab版本的webhooks有问题,无法进行配置,所以文章的构建是手动触发的。并且nodejs部署应该也能跟docker一样直接安装进jenkins的镜像(但是多版本可能就有其他问…

案例:塔能科技×某市智能照明——从传统亮化到智慧光生态的跨越

在城市发展的滚滚浪潮中,市政照明不仅是驱散黑夜的光明使者,更是衡量城市智能化水平的关键标尺。贵州某市的城市照明系统正经历一场意义深远的革新,塔能科技以创新科技为核心驱动力,为这座城市的夜间照明生态注入全新活力。通过智…

LeapMotion-HandPoseRecorder 脚本详解

HandPoseRecorder 脚本详解 这个脚本是一个用于在 Unity 中录制和保存 Leap Motion 手部姿势的工具。下面我将详细解释脚本的各个部分: 核心功能 该脚本的主要作用是: 从 Leap Motion 设备捕获当前手部姿势数据 将姿势数据序列化为可重用的 ScriptableObject 在 Unity 项目…

【Guava】0.做自己的编程语言

【Guava】0.做自己的编程语言 0.前言1.明确你的目标1.2.设计1.3.写一个介绍 2.开始吧! 0.前言 DO WHAT THE F**K YOU WANT TO DO 我相信,网上有许多各式各样的做自己的编程语言教程,but 都是这样 收费 shit 本教程教你真正教你实现一个名叫G…

【软考高级系统架构论文】论无服务器架构及其应用

论文真题 近年来,随着信息技术的迅猛发展和 应用需求的快速更迭,传统的多层企业应用系统架构面临越来越多的挑战,已经难以适应这种变化。在这一背景下,无服务器架构(Serverless Architecture) 逐渐流行,它强调业务逻辑…

国产MCU A\B SWAP原理及实操

看到有读者留言说还是没理清A\B SWAP的原理。 今天就以某国产MCU为例,实际演示一番,看看大家在芯片设计时思路是什么。 我们首先回顾下SWAP的基本思想。 SWAP的基本思想是将PFLASH分成两组Bank,Bank A(假设是active)和Bank B(假设是inacti…