fpga系列 HDL: 竞争和冒险 02

竞争和冒险

在 Verilog 设计中,竞争(race conditions)和冒险(hazards)是数字电路设计中不期望出现的现象,它们会影响电路的正确性。了解并解决竞争和冒险问题对于确保电路稳定运行非常重要。

竞争(Race Condition)

  • 竞争是指多个信号或触发器在同一时刻更新时,由于不同路径的延迟差异导致的未定义行为。在 Verilog 中,竞争通常出现在时序电路中,如在使用触发器和寄存器的场合。例如:

冒险(Hazards)

  • 冒险是指由于信号延迟或逻辑实现方式导致电路在特定条件下短暂地输出错误逻辑值,通常分为两类:

  • 静态冒险(Static Hazard):输入变化时输出短暂地产生错误的尖峰或抖动。比如,一个函数期望在某个输入变化时输出保持1,但由于路径延迟问题,输出短暂变成了0,这就是静态1冒险。

  • 动态冒险(Dynamic Hazard):当输入发生快速变化时,输出产生不止一次的错误跳变。这在多级逻辑电路中较常见,且难以完全消除。

示例

1. 当两个或多个触发器在相同时钟上运行,但它们的输入信号的延迟不同,这可能导致逻辑错误。

  • 输出应恒为0,错误由 Δ t 1 \Delta t_1 Δt1造成
Layer 1
  • 解决竞争问题的方法:小心设计触发器,减少路径之间的延迟差异。
    • 适当的冗余设计:通过在逻辑表达式中添加冗余项,减少由于延迟造成的错误。
        BC00  01  11  10+----------------0 |  1   1   0   0A    |1 |  0   1   1   0
  • Y = A ′ B ′ + A C Y = A'B' + AC Y=AB+AC中,当 B ′ = 1 且 C = 1 B'=1且C=1 B=1C=1时,存在竞争,为了消除竞争冒险,可以引入一个额外的冗余项,使得表达式为: Y = A ′ B ′ + A C + B ′ C Y = A'B' + AC + B'C Y=AB+AC+BC。 VHDL 代码逻辑:
module my_logic (input wire A,input wire B,input wire C,output wire Y
);assign Y = (~A & ~B) | (A & C) | (~B & C);
endmodule
  • 冗余项由表达式中原有的一部分项目组成,如下图所示 A ′ B ′ = m 0 + m 1 A'B'=m_0+m_1 AB=m0+m1, A C = m 5 + m 7 AC=m_5+m_7 AC=m5+m7,再加一个 m 1 + m 5 m_1+m_5 m1+m5即B’C,不会改变原来的值,且会消除竞争现象,当 B ′ = 1 且 C = 1 B'=1且C=1 B=1C=1时,保持输出为1。

在这里插入图片描述

2.在组合逻辑中,当两个或多个语句同时发生时,当语句执行顺序改变时,最终谁先更新可能会影响下一级的逻辑电平,从而导致不可预知的输出。

  • 以下代码中,由于两个 always 块都是由同一个事件(时钟上升沿)触发,Verilog 模拟器中的调度程序在一个时钟周期内可能会先执行其中一个块。如果首先执行 y1 = y2; 的赋值,y1 将取 y2 的先前值;但如果先执行 y2 = y1;,y2 将取 y1 的先前值。这种不确定性可能导致振荡行为在不同的仿真运行中变化,或者在不同的模拟器实现中表现不同。
module fbosc1 (y1, y2, clk, rst);output reg y1, y2;input      clk, rst;always @(posedge clk or posedge rst)if (rst) y1 = 0;  // resetelse     y1 = y2;always @(posedge clk or posedge rst)if (rst) y2 = 1;  // presetelse     y2 = y1;
endmodule
  • 解决竞争问题的方法: 如果是组合逻辑,可以用额外的寄存器进行延时匹配,确保所有信号在相同时间点更新。使用非阻塞赋值 (<=) 来确保逻辑的同步更新(但是非阻塞赋值所取值为上一个状态的值)。
module fbosc1 (y1, y2, clk, rst);output reg y1, y2;input      clk, rst;always @(posedge clk or posedge rst)if (rst) y1 <= 0;  // resetelse     y1 <= y2;always @(posedge clk or posedge rst)if (rst) y2 <= 1;  // presetelse     y2 <= y1;
endmodule

3.在关键信号通路上使用触发器,确保输出稳定。

  • 以下为一个异步时钟信号async_in经过两级D触发器后被同步成同步信号sync_out,这样可以减少亚稳态的发生,从而确保输出信号的稳定性。
module sync_stabilizer (input wire clk,           // 时钟信号input wire async_in,      // 异步输入信号output reg sync_out       // 同步输出信号
);// 中间级信号,用于锁存第一级触发器的输出reg sync_stage1;// 第一阶段触发器:将异步信号锁存到第一级触发器中always @(posedge clk) beginsync_stage1 <= async_in;end// 第二阶段触发器:将第一级触发器的输出锁存到同步输出always @(posedge clk) beginsync_out <= sync_stage1;endendmodule
  • 这个模块在关键路径上使用了触发器,以确保输出信号的稳定性。代码中两个异步时钟信号signal_asignal_b经过两级D触发器后被同步成同步信号sync_out
module stable_logic_with_ff(input             clk,input             rstn,input             signal_a,input             signal_b,output reg        output_flag);reg signal_a_ff;  // 用于存储信号 a 的触发器reg signal_b_ff;  // 用于存储信号 b 的触发器// 在时钟上升沿捕获输入信号always @(posedge clk or negedge rstn) beginif (!rstn) beginsignal_a_ff <= 1'b0;signal_b_ff <= 1'b0;endelse beginsignal_a_ff <= signal_a;  // 捕获 signal_asignal_b_ff <= signal_b;  // 捕获 signal_bendendwire condition = signal_a_ff & signal_b_ff;  // 使用触发器的输出进行组合逻辑always @(posedge clk or negedge rstn) beginif (!rstn) beginoutput_flag <= 1'b0;endelse beginoutput_flag <= condition;  // 使用稳定的信号endend endmodule

CG

  • 菜鸟教程 Verilog 竞争与冒险
  • 深入计算机组成原理(二十二)冒险和预测(一):hazard是“危”也是“机”
  • 注:卡诺图是首尾相邻的

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

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

相关文章

尚硅谷-react教程-求和案例-数据共享(下篇)-完成数据共享-笔记

#1024程序员节&#xff5c;征文# public/index.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>redux</title></head><body><div id"root"></div></body> </html&…

MobileNetv2网络详解

背景&#xff1a; MobileNet v1中DW卷积在训练完之后部分卷积核会废掉&#xff0c;大部分参数为“0” MobileNet v2网络是由Google团队在2018年提出的&#xff0c;相比于MobileNet v1网络&#xff0c;准确率更高&#xff0c;模型更小 网络亮点&#xff1a; Inverted Residu…

力扣题86~90

题86&#xff08;中等&#xff09;&#xff1a; python代码 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def partition(self, head: Optional[Li…

(史上超级清晰带图解)红黑树的实现--C++

文章目录 一、红黑树的概念1、红黑树的规则&#xff1a;2、那红黑树如何确保最长路径不超过最短路径的2倍的&#xff1f;3、红黑树的效率&#xff1a; 二、红黑树的实现1、红黑树的结构2、红黑树的插入2.1、红黑树树插入一个值的大概过程2.2、情况1&#xff1a;变色2.3、情况2&…

大模型低资源部署策略

文章目录 解码效率分析大模型训练后量化方法经验性分析与相关结论由于大模型的参数量巨大,在解码阶段需要占用大量的显存资源,因而在实际应用中的部署代价非常高。在本文中,我们将介绍一种常用的模型压缩方法,即模型量化(ModelQuantization),来减少大模型的显存占用,从…

基于spootboot学生选课系统设计与实现

资料下载 https://download.csdn.net/download/qq_63753925/89888794 https://download.csdn.net/download/qq_63753925/89888793 https://download.csdn.net/download/qq_63753925/89885091 https://download.csdn.net/download/qq_63753925/89882320 摘 要 近年来&#xf…

25届电信保研经验贴(自动化所)

个人背景 学校&#xff1a;中九 专业&#xff1a;电子信息工程 加权&#xff1a;92.89 绩点&#xff1a;3.91/4.0 rank&#xff1a;前五学期rank2/95&#xff0c;综合排名rank1&#xff08;前六学期和综合排名出的晚&#xff0c;实际上只用到了前五学期&#xff09; 科研…

Gateway 统一网关

一、初识 Gateway 1. 为什么需要网关 我们所有的服务可以让任何请求访问&#xff0c;但有些业务不是对外公开的&#xff0c;这就需要用网关来统一替我们筛选请求&#xff0c;它就像是房间的一道门&#xff0c;想进入房间就必须经过门。而请求想要访问微服务&#xff0c;就必须…

STM32主从定时器输出个数、频率可调的脉冲

STM32中发出脉冲一般有两种方式&#xff1a; 1&#xff09;利用定时中断输出脉冲&#xff0c;但是间隔的延时会影响其他主程序的进程&#xff0c;当控制多个电机的时候就非常不可取&#xff1b; 2&#xff09;利用PWM脉宽调制&#xff0c;并通过主从定时器进行设定&#xff0…

微知-Lecroy力科的PCIe协议分析仪型号命名规则(PCIe代,金手指lanes数量)

文章目录 要点主要型号命名规则各代主要产品图片Summit M616 协议分析仪/训练器Summit T516 分析仪Summit T416 分析仪Summit T3-16分析仪Summit T28 分析仪 综述 要点 LeCroy(力科)成立于1964年&#xff0c;是一家专业生产示波器厂家。在美国纽约。一直把重点放在研制改善生产…

安卓14上蓝牙调用SystemProperties.set(),解决找不到SystemProperties.set()的问题

近期遇到一个需求&#xff0c;要在安卓14的蓝牙模块中调用SystemProperties.set()。 安卓14中的蓝牙&#xff0c;和安卓12的版本有较大的不同。它在packages/modules目录下&#xff0c;而安卓12是分散在packages/apps和frameworks/base等目录下&#xff1b;安卓14的蓝牙打包产…

Hash表算法

哈希表 理论知识&#xff08;本文来自于代码随想录摘抄&#xff09;什么是哈希常见的三种哈希结数组&#xff1a;set:map:其他常用方法或者技巧&#xff08;自己总结的&#xff09; 练习题和讲解有效的字母移位词349. 两个数组的交集1. 两数之和454. 四数相加 II15. 三数之和 总…

4款专业音频在线剪辑工具帮你开启创意之路。

音频在线剪辑工具能够为我们提供很大的便利&#xff0c;对于不管是专业的音乐制作人还是音频创作爱好者来说&#xff0c;都能借助一些音频编辑工具来充分发挥自己的创意。所以这一次&#xff0c;我要给大家介绍几个专业方便的音频剪辑工具。 1、福昕音频在线 直达链接&#x…

基于yolov8的布匹缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的布匹缺陷检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的布匹缺陷检测系统是在 PyTo…

基于SSM的心理咨询管理管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的心理咨询管理管理系统拥有三个角色&#xff1a;学生用户、咨询师、管理员 管理员&#xff1a;学生管理、咨询师管理、文档信息管理、预约信息管理、测试题目管理、测试信息管理…

Cesium基础-(Entity)-(Corridor 走廊)

里边包含Vue、React框架代码详细步骤、以及代码详细解释 4、Corridor 走廊 以下是 CorridorGeometry 类的属性、方法和静态方法,以表格形式展示: 属性 属性名类型默认值描述positionsArray.定义走廊中心的坐标点数组。widthnumber走廊

预览 PDF 文档

引言 在现代Web应用中&#xff0c;文件预览功能是非常常见的需求之一。特别是在企业级应用中&#xff0c;用户经常需要查看各种类型的文件&#xff0c;如 PDF、Word、Excel 等。本文将详细介绍如何在Vue项目中实现 PDF 文档的预览功能。 实现原理 后端API 后端需要提供一个…

GIT使用list

清空当前commit区 方法 1&#xff1a;软重置到初始状态 如果希望保留文件内容&#xff0c;但清空所有 commit 历史&#xff0c;可以使用以下命令&#xff1a; git reset --soft $(git rev-list --max-parents0 HEAD)解释&#xff1a; --soft 表示重置 commit 历史&#xff…

uniapp的IOS证书申请(测试和正式环境)及UDID配置流程

1.说明 本教程只提供uniapp在ios端的证书文件申请&#xff08;包含正式环境和开发环境&#xff09;、UDID配置说明&#xff0c;请勿用文档中的账号和其他隐私数据进行测试&#xff0c;请勿侵权&#xff01; 2.申请前准备 证书生成网站&#xff1a;苹果应用上传、解析&#x…

【AscendC算子开发】笔记3 矩阵计算及高级开发技巧

pytorch调用算子 矩阵计算 为什么上图提供了两种矩阵结果访问方式&#xff1f; 如果只需要结果&#xff0c;那么拿注释的一行代码就可以得到结果&#xff0c;如果之后还有其他的操作&#xff0c;可以计算一小块就用起来&#xff0c;那么需要使用上述操作&#xff0c;可以形成流…