FPGA设计中锁存器产生、避免与消除

news2024/10/6 18:30:35

FPGA设计中锁存器产生、避免与消除

  • 一、锁存器的产生
    • 1.1 组合逻辑中使用保持状态
    • 1.2 组合逻辑中的if-else语句或case语句未列出所有可能性
    • 1.3 小结
  • 二、锁存器的避免
  • 三、锁存器的消除
    • 3.1 情况一

一、锁存器的产生

  锁存器的产生主要有以下两种情况:(1)组合逻辑中使用保持状态;(2)组合逻辑中的if-else语句或case语句未列出所有可能性;

1.1 组合逻辑中使用保持状态

assign data_out = valid ? data_in : data_out; //变量保持当前值
always @(*) begin
    if(valid)
        data_out = data_in;
    else
        data_out = data_out; //变量保持当前值
end

1.2 组合逻辑中的if-else语句或case语句未列出所有可能性

  对于组合逻辑中,如果使用if-else语句,未补全else语句,则默认在其他条件下,数据均保持为原来的状态,那么也会产生锁存器。

//if-else语句缺少else
always @(*) begin
    if(valid)
        data_out = data_in;
end

  而如果在组合逻辑中使用case语句,未列出case中条件所有的可能性,则相当于对于未列出的那些情况,数据均保持为原来的状态,也会产生锁存器。

//case语句未列出所有可能性
always @(*) begin
    case(sel)
        2'b00: data_out = 2'b00;
        2'b01: data_out = data_in;
    endcase
end

1.3 小结

  那么,总而言之,言而总之。对于锁存器,其产生的原因可以总结为一点:想要通过组合逻辑保持数据不变。对于组合逻辑的实现,我们可以认为它是用很多门电路搭建而成的,那么,门电路与寄存器不同,其不具有保持当前状态的功能。也就是说,构成当前组合逻辑的电路中任何一个信号发生改变,都会导致输出结果发生改变。如果要通过组合逻辑实现保持数据的不变,那就只能产生锁存器了(可以参考《数字电子技术基础》第五版的SR触发器)。

二、锁存器的避免

  我们知道了锁存器的产生原因,就可以对症下药,在编写Verilog代码时注意编码风格,即可避免锁存器的产生。

(1)在组合逻辑中使用if-else语句时补全else语句

always @(*) begin
    if(sel)
        data_out = data_in;
    else
        data_out = 2'b00;
end

(2)在组合逻辑中使用case语句时,设置默认状态default,并默认状态下的数据进行赋值

always @(*) begin
    case(sel)
        xxx: data_out <= 2'b01;
        xxx: data_out <= data_in;
        default: data_out = 2'b00;
    endcase
end

(3)在组合逻辑中,不可一个变量赋值给变量自身

//错误示例
always @(*) begin
    if(sel)
        data_out = data_in;
    else
        data_out = data_out; //变量赋值给变量自身
end

//正确示例
always @(*) begin
    if(sel)
        data_out = data_in;
    else
        data_out = 2'b00; //需要赋值一个准确的数值或者其他变量
end

三、锁存器的消除

  在FPGA设计过程中,有可能出现一些情况,必须使用组合逻辑,保证其实时性,且需要保持数据不变,保证其他运算的正确性。那么又该如何处理?

3.1 情况一

  假如我们要实现如下面时序图所示功能,输出data_out在有效信号valid的上升沿处锁存输入data_in的值,那么要如何实现?

在这里插入图片描述

  最开始考虑的是采用时序逻辑进行实现,代码如下。

always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        data_out <= 'd0;
    else if(valid)
        data_out <= data_in;
    else
        data_out <= data_out;
end

  那么,采用时序逻辑实现,会导致延迟一怕,无法在有效信号valid的上升沿锁存数据,如下图所示。
在这里插入图片描述

  于是考虑使用组合逻辑进行实现,代码如下。

assign data_out = valid ? data_in : data_out;

  但是组合逻辑要实现保持状态,必然会产生锁存器。综合后会再Messages界面会警告出现锁存器,同时在Schematic中也可以看到出现了锁存器,如下图所示。而在我们的设计中,我们是不希望出现锁存器的,因为其不利于时序分析。

在这里插入图片描述
在这里插入图片描述

  那么,也可以采用组合逻辑+时序逻辑的方式实现,通过多使用一部分寄存器资源,来实现在valid上升沿处进行数据采样,且不产生锁存器,代码如下。重新综合后,可见锁存器消失,同时可以对齐进行仿真,时序符合前面的要求。

reg     [3:0]    r_data_in;

always @(posedge sys_clk or negedge sys_rst_n)
    if(!sys_rst_n)
        r_data_in <= 'd0;
    else
        r_data_in <= data_in;

assign data_out = valid ? data_in ? r_data_in;

在这里插入图片描述

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

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

相关文章

【模拟IC学习笔记】 电流偏置的设计

电流偏置、电压偏置 电压偏置&#xff1a; 1、对走线电阻引起的IR压降敏感 2、对噪声干扰敏感 3、器件相隔较远&#xff0c;匹配较差 电流偏置&#xff1a; 1、对走线电阻引起的IR压降不敏感 2、抗干扰能力强 3、需要匹配的器件可以放在一起&#xff0c;匹配更好。 模…

一文打通java中内存泄露

目录 前置知识 内存泄漏&#xff08;memory leak&#xff09; 内存溢出&#xff08;out of memory&#xff09; Java中内存泄露的8种情况 静态集合类 单例模式 内部类持有外部类 各种连接&#xff0c;如数据库连接、网络连接和IO连接等 变量不合理的作用域 改变哈希值 …

USB2.0(一):基础

一、总线标准 USB1.1&#xff1a;支持12Mbps全速率&#xff08;FullSpeed&#xff09;和1.5Mbps低速率&#xff08; HalfSpeed&#xff09;USB2.0&#xff1a;支持480Mbps高速率&#xff08;High Speed&#xff09;&#xff0c;兼容1.1USB3.0&#xff1a;支持5Gbps超高速率&am…

无线传感器网络(WSN)中的空穴和边界节点检测(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 ​由于无线传感器网络中可能会出现覆盖漏洞,导致网络无法提供高质量的数据,所以需要检测边界节点以准确找到覆盖漏洞进行修复。…

通用医学图像分割模型UniverSeg

虽然深度学习模型已经成为医学图像分割的主要方法&#xff0c;但它们通常无法推广到涉及新解剖结构、图像模态或标签的unseen分割任务。给定一个新的分割任务&#xff0c;研究人员通常必须训练或微调模型&#xff0c;这很耗时&#xff0c;并对临床研究人员构成了巨大障碍&#…

交互式数据分析和处理新方法:pandas-ai =Pandas + ChatGPT

Python Pandas是一个为Python编程提供数据操作和分析功能的开源工具包。这个库已经成为数据科学家和分析师的必备工具。它提供了一种有效的方法来管理结构化数据(Series和DataFrame)。 在人工智能领域&#xff0c;Pandas经常用于机器学习和深度学习过程的预处理步骤。Pandas通…

windows下Ubuntu保姆级安装教程 [附VMware资源]

windows下Ubuntu保姆级安装教程 [附VMware资源] 前言1. VMware安装2. Ubuntu镜像下载3.创建新的虚拟机开启虚拟机 前言 一直在用Linux开发板&#xff0c;都忘记自己的新电脑没装虚拟机了。 这期我们来学习Windows环境下VMware安装Ubuntu虚拟机&#xff0c;以便后续学习Linux。…

「领域驱动设计」DDD,六边形架构,洋葱架构,整洁架构和CQRS的整合

这篇文章是软件架构编年史的一部分&#xff0c;一系列关于软件架构的文章。在这些文章中&#xff0c;我写了我对软件架构的了解&#xff0c;我如何看待它&#xff0c;以及我如何使用这些知识。如果您阅读了本系列以前的文章&#xff0c;那么本文的内容可能更有意义。 今天的帖子…

Java基础(十六)泛型

1. 泛型概述 1.1 生活中的例子 举例1&#xff1a;中药店&#xff0c;每个抽屉外面贴着标签 举例2&#xff1a;超市购物架上很多瓶子&#xff0c;每个瓶子装的是什么&#xff0c;有标签 举例3&#xff1a;家庭厨房中&#xff1a; Java中的泛型&#xff0c;就类似于上述场景中的…

聚观早报|五一假期机票均价超1200元;苹果自动驾驶测试减员超25%

今日要闻&#xff1a;五一假期国内机票均价超1200元&#xff1b;谷歌、微软、OpenAI等将讨论AI问题&#xff1b;苹果自动驾驶测试司机团队减员超25%&#xff1b;“五一”最热十大景区出炉&#xff1b;李想辟谣理想汽车砸钱雇媒体营销 五一假期国内机票均价超1200元 5 月 3 日…

DGIOT智慧农业案例分享

场景说明 农业-农业大棚智能监测场景 背景 在农业大棚中&#xff0c;引入物联网技术&#xff0c;实现温室种植的高效和精准化的管理。物联网技术可以应用到温室生产的不同阶段&#xff0c;把不同阶段植物的表现和环境因子进行分析&#xff0c;反馈到下一轮的生产中。实现精准…

JVM原理之详解现代垃圾回收器 Shenandoah 和 ZGC

Shenandoah Shenandoah 一词来自于印第安语&#xff0c;十九世纪四十年代有一首著名的航海歌曲在水手中广为流传&#xff0c;讲述一位年轻富商爱上印第安酋长 Shenandoah 的女儿的故事。 后来美国有一条位于 Virginia 州西部的小河以此命名&#xff0c;所以 Shenandoah 的中文译…

【图像分割】【深度学习】SAM官方Pytorch代码-各模块的功能解析

【图像分割】【深度学习】SAM官方Pytorch代码-各功能模块解析 Segment Anything&#xff1a;建立了迄今为止最大的分割数据集&#xff0c;在1100万张图像上有超过1亿个掩码&#xff0c;模型的设计和训练是灵活的&#xff0c;其重要的特点是Zero-shot(零样本迁移性)转移到新的图…

mysql数据库高级操作

文章目录 一、克隆表1.方法一2.方法二 二、清空表&#xff0c;删除表内所有数据1.方法一2.方法二3.drop、truncate、delete对比 三、创建临时表四、用户管理五、忘记root密码的解决措施六、用户授权总结 一、克隆表 1.方法一 ​create table 新表名 like 复制的表名; ​ ​复…

如何应用PreMaint预测性维护助力企业节能减排

随着全球能源资源的日益减少和环境的变化&#xff0c;各行各业都在积极探索节能降耗的方法&#xff0c;以减少能源消耗和环境污染。而在工厂生产过程中&#xff0c;设备的稳定运行是节能降耗的关键。设备健康管理软件在这方面的应用&#xff0c;对于提高工厂的节能降耗效果具有…

NSSCTF之Misc篇刷题记录⑧

NSSCTF之Misc篇刷题记录 [MMACTF 2015]welcome[虎符CTF 2022]Plain Text[SWPUCTF 2021 新生赛]原来你也玩原神[SWPUCTF 2021 新生赛]我flag呢&#xff1f; NSSCTF平台&#xff1a;https://www.nssctf.cn/ PS&#xff1a;记得所有的flag都改为NSSCTF [MMACTF 2015]welcome NSS…

MySQL MVCC 机制

什么是mvcc mvcc(多版本并发控制&#xff09;&#xff0c;作用在于可无锁实现隔离级别中的“可重复读” 提高数据库关于事务处理上的性能问题&#xff0c;其中"多版本" 指的是 UndoLog 链中的多个事务&#xff0c;“控制” 指的是我当前应当读取那个事务id对应的数据…

「STC8A8K64D4开发板」——外部中断(INT0~INT4)

第2-4讲&#xff1a;外部中断(INT0~INT4) 学习目的学习中断的相关概念。掌握外部中断配置及中断优先级配置的程序设计。掌握中断服务程序的编写。 中断相关概念 什么是中断 中断系统是为使 CPU 具有对外界紧急事件的实时处理能力而设置的。 CPU在处理某一事件A时&#xff0c…

面试题30天打卡-day19

1、TCP 和 UDP 协议有什么区别&#xff0c;分别适用于什么场景&#xff1f; TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种常用的传输层协议&#xff0c;两者的区别比较如下&#xff1a; TCPUDP可靠性…

数据库初认识之MySQL

关系型数据库 数据结构 二维表格 库 -> 表 -> 列&#xff08;字段&#xff09;&#xff1a;用来描述对象的一个属性 行&#xff08;记录&#xff09;&#xff1a;用来描述一个对象的信息 Mysql&#xff08;5.7/8.0&#xff09; …