【数字】异步FIFO面试的几个小问题与跨时钟域时序约束
入门数字设计的时候,跨时钟域的数据处理是绕不开的课题,特别是多比特数据跨时钟域时,都会采用异步FIFO的方法。
异步FIFO中涉及较多的考点这里记录几个以供大家参考。
1. 异步FIFO的空满判断分别在哪个域?
根据异步FIFO的结构,可以很清楚的分析出,在进行空满判断的时候是通过对读写指针的比较来判断空满的情况。但因为读写时钟域的不同,读写指针在跨时钟域的时候会使用同步器进行同步处理。所以往往写时钟域的写指针较读指针来说是实时的,因为读指针实际上是2拍之前的值了,所以会在写时钟域来判断满的情况。反之在读时钟域判断空的情况。但是判断空满会存在延迟即"虚空"和“虚满”的情况。这样是否是有问题的呢?这样虽然会影响FIFO的性能,但是并不会使FIFO的功能出错,因为满的时候不会继续写入,空的时候不会继续读取,不会导致FIFO功能出错。
异步空满判断因为格雷码的对称性:
满:高位不同,次高位不同,低位相同。
空:全相同。
2. 为什么要将二进制转换成格雷码来进行读写指针的传递呢?
这里需要突出的是格雷码的特性,每次状态跳变时只有一位变化,在能够保证bus skew的前提下,即使是在跨时钟域时,也能避免因多位同时变化而导致的错误状态。因为只有1位跳变的话,即使是发生亚稳态的情况,最差是状态不变。但如果是多位变化情况就不一定。
3.如果没有保证格雷码的时序会出现什么问题呢?
正常情况下的跨时钟域
格雷码各bit之间存在较大偏移的情况,bit0_delay > bit1_delay > bit2_delay,且这些bit之间的skew大于clk_wr,出现了010->111多bit位跳变的情况,111->110错误跳变的情况。
由上可知当各bit之间的skew较大的时候无法发挥格雷码的特性且可能会出现错误的情况。所以需要在设计的时候保证各bit之间的skew关系。所以为了避免过大的skew,可以对mult-bit设置set_max_delay,将延时限制在有效的范围内。
查阅网上有些同学说需要保证将限制设置在读写时钟中最快时钟周期的一半,或者设置成源端时钟的一半,或者设置成源端时钟的倍数且bit间的skew明显小于一个源端时钟周期。
使用ateris的工具里面建议的是在pre-CTS的时候set_max_delay设置成源端时钟周期。在Post-CTS的时候需要保证(CLK_A+Delay)Skew < Ttxclk - CLK_B(skew)即保证单个bit的传输必须不能超过其他bit。
我们来分析一下这个公式的由来,如果是在pre-CTS阶段,时钟网络是ideal的不存在CLK_A和CLK_B的skew,Delay小于Ttxclk即可。那为什么不是像网上提到的那样约束比较严格呢?
分情况讨论这样的情况:
1)如果是慢时钟往快时钟传:
下面是慢时钟周期每个cycle打一个数据,可以看到快时钟采样要么是下一个状态要么是当前状态。只要每个bit的延迟不超过源时钟即可。
2)如果是快时钟往慢时钟传:
可以看到慢时钟域实际上看到的格雷码跳变是,0000->0001->0110,发生了3个bit同时跳变的情况,但是0110并不是从0001直接跳变而来的,而是在中间周期稳定了一个源端时钟周期之后跳变的,所以有风险的只有bit2,并且即使恢复成0或者1对FIFO的判断也没有影响。所以保证各个状态之间没有重叠也不会影响功能,所以设置成源端时钟周期即可。
还有个博主提到了如下情况:
当快慢时钟域之间频率差距过大的时候,会出现慢时钟域的有效沿采样的时候,有较多bit发生跳变的情况。
假设慢时钟域的有效亚稳态窗如上,假设为10%,快时钟域的状态至少撑满一个亚稳态窗。其实这个窗应该就是setup和hold满足时的区间。
4.如果深度是不是2^n应该如何设置格雷码的跳变?
同步fifo里,深度任意可配的同步fifo里使用了两个非饱和的cnt计数器记录读写地址指针,waddr和raddr均比实际地址多一位,最高位用来指示套圈情况。当waddr和raddr的最高位相同时,fifo_cnt = waddr-raddr;当waddr和raddr的最高位相反时,fifo_cnt = DEPTH + waddr[ADDR_WIDTH-1:0] - raddr[ADDR_WIDTH-1:0]。最高位作为标志位,当低位计数到DEPTH-1时,高位翻转。
assign waddr_d_h = (waddr[DP_WD-1:0] == DEPTH-1) ? ~waddr[DP_WD] : waddr[DP_WD];
assign waddr_d_l = (waddr[DP_WD-1:0] == DEPTH-1) ? 0 : waddr[DP_WD-1:0] + 1;
always @(posedge clk or negedge rst_n)beginif(~rst_n) waddr <= 0;else if(wenc) waddr <= {waddr_d_h, waddr_d_l};
end
异步fifo中,如何仍然采用上面的方法就有可能出现非相邻的跳转,会出现多bit跳变的情况。
由上图可以看到格雷码对称性的特性。
根据这个特性假设现在的深度为5,那可知当计数到4的时候即格雷码0110时,下一个状态应该跳转到11即格雷码1110,才能保证只出现单bit的跳转。
偏移的规律是5的话2^3=8,8-5=3,8+3=11。
parameter DEPTH = 11;
parameter WIDTH = $clog2(DEPTH);//4
parameter DEPTH_TO2 = 2 ^ WIDTH;//16
parameter SHIFT = DEPTH_TO2 - DEPTH;//16-11=5
相关文章:
【数字】异步FIFO面试的几个小问题与跨时钟域时序约束
入门数字设计的时候,跨时钟域的数据处理是绕不开的课题,特别是多比特数据跨时钟域时,都会采用异步FIFO的方法。 异步FIFO中涉及较多的考点这里记录几个以供大家参考。 1. 异步FIFO的空满判断分别在哪个域? 根据异步FIFO的结构&…...
云原生时代的开发利器
云原生时代的开发工具集之中,至少应有这样一种利器:基于微服务架构的低代码开发平台,同时与业界标准的云原生技术支撑设施能够完全协同和融合。低代码开发平台的构建不仅仅是采用微服务开发框架,更加重要的是符合当前主流的中台和…...
利用IDEA将Java.class文件反编译为Java文件:原理、实践与深度解析
文章目录 引言:当.class文件遇到源代码缺失第一章:反编译技术基础认知1.1 Java编译执行原理1.2 反编译的本质1.3 法律与道德边界 第二章:IDEA内置反编译工具详解2.1 环境准备2.2 三步完成基础反编译2.3 高级反编译技巧2.3.1 调试模式反编译2.…...
C++ Primer 参数传递
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
2.7 静态方法/构造函数Mock
静态方法/构造函数Mock 在单元测试中,静态方法和构造函数的Mock是相对复杂的需求,因为Mockito的核心设计基于对象实例的模拟。然而,通过扩展工具或特定技巧,可以实现对这些场景的处理。本章详解两种主流方案:PowerMoc…...
注册Gmail如何跳过手机验证环节?
很多小伙伴在注册Gmail的时候都会遇到一个难题:手机号码验证,有可能包括了“手机号无法验证” “国内手机号验证失败” “收不到验证码”等等问题,但 根据真实案例,还有部分人则是“幸运地”没有手机号验证环节,那么今…...
【算法专场】哈希表
目录 前言 哈希表 1. 两数之和 - 力扣(LeetCode) 算法分析 算法代码 面试题 01.02. 判定是否互为字符重排 编辑算法分析 算法代码 217. 存在重复元素 算法分析 算法代码 219. 存在重复元素 II 算法分析 算法代码 解法二 算法代码 算法…...
5、pod 详解 (kubernetes)
pod 详解 (kubernetes) Pod 的基础概念pause 容器Pod 的分类与创建自主式 Pod控制器管理的 Pod静态 Pod Pod容器的分类基础容器(infrastructure container)初始化容器(initcontainers)应用容器(…...
二叉树详解:Java实现与应用
在计算机科学中,数据结构是构建高效算法的基石,而二叉树作为一种基础且重要的树形结构,在诸多领域都有着广泛应用,如数据库索引、文件系统、编译器设计等。本文将从基础概念入手,带你逐步深入理解二叉树,并…...
GPT和BERT
笔记来源: Transformer、GPT、BERT,预训练语言模型的前世今生(目录) - B站-水论文的程序猿 - 博客园 ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频(RNN模型与NLP应用) 一、GPT 1.1 GPT 模型的…...
【工业安全】-CVE-2024-30891- Tenda AC18路由器 命令注入漏洞
1.漏洞描述 2.漏洞复现 2.1 qemu-user 模拟: 2.2 qemu-system模拟: 3.漏洞分析 4.poc代码: 1.漏洞描述 漏洞编号:CVE-2024-30891 漏洞名称:Tenda AC18 命令注入 威胁等级:高危 漏洞详情:Ten…...
如何从0开始将vscode源码编译、运行、打包桌面APP
** 网上关于此的内容很少,今天第二次的完整运行了,按照下文的顺序走不会出什么问题。最重要的就是环境的安装,否则极其容易报错,请参考我的依赖版本以及文末附上的vscode官方指南 ** 第一步:克隆 VSCode 源码 首先…...
登录弹窗效果
1,要求 点击登录按钮,弹出登录窗口 提示1:登录窗口 display:none 隐藏状态; 提示2:登录按钮点击后,触发事件,修改 display:block 显示状态 提示3:登录窗口中点击关闭按钮࿰…...
wps或office的word接入豆包API(VBA版本)
直接上代码,由于时间匆忙,以后写个详细的教程 #If VBA7 ThenPrivate Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As…...
深入浅出 Python Logging:从基础到进阶日志管理
在 Python 开发过程中,日志(Logging)是不可或缺的调试和监控工具。合理的日志管理不仅能帮助开发者快速定位问题,还能提供丰富的数据支持,让应用更具可观测性。本文将带你全面了解 Python logging 模块,涵盖…...
系统巡检脚本分享:守护服务器的“健康卫士”
在日常的运维工作中,系统巡检是一项至关重要的任务。它可以帮助我们及时发现服务器的潜在问题,确保系统的稳定运行。今天,我想和大家分享一个实用的系统巡检脚本,它能够帮助我们快速、全面地检查服务器的健康状况。 一、为什么需…...
【Elasticsearch】运行时字段(Runtime Fields)索引时定义运行时字段
在 Elasticsearch 中,运行时字段(Runtime Fields)是一种在查询时动态计算的字段,而不是在索引时预先存储的字段。运行时字段为数据处理提供了极大的灵活性,尤其是在处理结构不固定的日志数据或需要动态生成字段值的场景…...
C++从入门到实战(四)C++引用与inline,nullptr
C从入门到实战(四)C引用与inline,nullptr 前言一、C 引用(一)什么是引用(二)引用的特点(三)引用作为函数参数(四)引用作为函数返回值(…...
DeepSeek 助力 Vue 开发:打造丝滑的卡片(Card)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
Azure Synapse Dedicated SQL Pool统计指定表中各字段的空值、空字符串或零值比例
-- 创建临时表存储结果 CREATE TABLE #Results (DatabaseName NVARCHAR(128),TableName NVARCHAR(128),ColumnName NVARCHAR(128),DataType NVARCHAR(128),NullOrEmptyCount INT,TotalRows INT,Percentage DECIMAL(10,2) );DECLARE db_name SYSNAME DB_NAME(); -- 获取当前数…...
【深度学习】计算机视觉(CV)-目标检测-SSD(Single Shot MultiBox Detector)—— 单次检测多框检测器
🔹 SSD(Single Shot MultiBox Detector)—— 单次检测多框检测器 1️⃣ 什么是 SSD? SSD (Single Shot MultiBox Detector) 是一种用于 目标检测(Object Detection) 的 深度学习模型,由 Wei L…...
力扣100. 相同的树(利用分解思想解决)
Problem: 100. 相同的树 文章目录 题目描述思路Code 题目描述 思路 题目要求判断两个二叉树是否完全相同,而此要求可以利用问题分解的思想解决,即判断当前节点的左右子树是否完全相同,而在二叉树问题分解的一般题目中均会带有返回值ÿ…...
在SpringBoot服务器端采购上,如何选择操作系统、Cpu、内存和带宽、流量套餐
在Spring Boot服务器端采购时,选择操作系统、CPU、内存、带宽和流量套餐需根据应用需求、预算和性能要求综合考虑。以下是具体建议: 1. 操作系统 Linux发行版(如Ubuntu、CentOS):适合大多数Spring Boot应用ÿ…...
我的新书《青少年Python趣学编程(微课视频版)》出版了!
🎉 激动人心的时刻来临啦! 🎉 小伙伴们久等了,我的第一本新书 《青少年Python趣学编程(微课视频版)》 正式出版啦! 📚✨ 在这个AI时代,市面上的Python书籍常常过于枯燥&…...
elementUI rules 判断 el-cascader控件修改值未生效
今天修改一个前端项目,增加一个多选字段,使用的是el-cascader控件,因页面是通过引用子页面组件形式使用,出现一个点选后再勾选原有值,输入框内不展示或取消后的也未正常隐藏,如果勾选的值是全新的则其他已选…...
深度学习与人工智能:解锁未来的无限可能
在当今这个科技飞速发展的时代,深度学习和人工智能已不再只是科幻小说中的概念,它们正以惊人的速度渗透到我们生活的方方面面,从智能手机上的语音助手到医疗领域的疾病诊断,从自动驾驶汽车到金融市场的风险预测,其影响…...
pwa应用进阶2-动态加载manifest.json文件
接pwa应用进阶-区分AB面-添加安装按钮而且区分不同的系统和浏览器的各种情况继续优化,主要是让manifest.json文件动态加载。 pwa应用进阶2-动态加载manifest.json文件 主要用途如下: 动态切换PWA的清单文件,例如根据不同的语言或者主题加载不…...
UI用例调试_元素能定位到且不在frame内_无法点击/录入文本
关于单据新增,编辑子集信息遇到的2个阻塞点,做记录已供后续参考 1、新增按钮元素能定位,就是无法点击 实现效果: 单据新增时,前面单据数据编辑完之后,开始新增证件信息,需要先点击新增按钮。…...
Python的web框架Flask适合哪些具体的应用开发?
Flask 适用的具体应用及实现案例代码 Flask 是一个轻量级的 Web 应用框架,以其简洁性和灵活性而广受欢迎。以下是 Flask 适合的具体应用场景及相关的实现案例代码: 1. 小型网站或博客 由于 Flask 的简洁性和易于使用的特性,它非常适合用来搭建个人博客或者小型的企业网站…...
oracle使用动态sql将多层级组织展平
ERP或者其他企业管理软件中都会有一张组织机构表,可以写固定sql的方式将其展平获取组织表中的字段信息,如负责人、上级组织负责人、分管领导、成立时间等。但是这种方式有个缺陷,就是如果只写到处理4个层级,那么后期层级增多就无法…...
vue学习笔记10
ChatGPT & Copilot AI 的认知 两个工具 1、ChatGPT 3.5 2、Github Copilot ChatGPT 的基本使用 - Prompt 优化 AI 互动的过程中,容易出现的问题: 1、 AI未能理解问题的核心要点 2、 AI的回答过于宽泛 或 过于具体 3、 AI提供了错误的信息或…...
网络安全常识
随着互联网和移动互联网的持续火热,人们的生活也越来越离不开网络,网络安全,在这个信息化时代显得尤为重要,那么网络攻击和安全,这一攻守之间,主要涵盖哪些要点呢,下面我们就来对此进行抽丝剥茧…...
如何在 Visual Studio Code 中使用 DeepSeek R1 和 Cline?
让我们面对现实吧:像 GitHub Copilot 这样的 AI 编码助手非常棒,但它们的订阅费用可能会在你的钱包里烧一个洞。进入 DeepSeek R1 — 一个免费的开源语言模型,在推理和编码任务方面可与 GPT-4 和 Claude 3.5 相媲美。将它与 Cline 配对&#…...
从Sora到有言:3D视频生成技术的突破与应用
近年来,AIGC领域飞速发展,这个词也越来越高频地出现在了大家的生活中。AIGC 能完成的任务也越来越多,大模型的能力飞速增长 —— 从Deepseek生成文字,到StableDiffusion生成图像,再到Sora可以生成视频。 而现在&#x…...
算法18(力扣136)只出现一次的数字
1、问题 给你一个 非空 整数数组 nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 2、示例 (1&…...
基于HTML5 Canvas 和 JavaScript 实现的烟花动画效果
以下是一个使用 HTML5 Canvas 和 JavaScript 实现的烟花动画效果代码盒子: <!DOCTYPE html> <html> <head><title>烟花效果...
网络变压器的主要电性参数与测试方法(1)
Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(1).. 今天我们就一起先来看看网络变压器的2个主要电性参数与它的测试方法: 1. 开路电感(OCL or Lx----Open Circuit Ind…...
Python + WhisperX:解锁语音识别的高效新姿势
大家好,我是烤鸭: 最近在尝试做视频的质量分析,打算利用asr针对声音判断是否有人声,以及识别出来的文本进行进一步操作。asr看了几个开源的,最终选择了openai的whisper,后来发现性能不行,又换了…...
Qt的isVisible ()函数介绍和判断窗口是否在当前界面显示
1、现象:当Qt的窗口最小化时,isVisible值一定是true,这是正常的。 解释:在Qt中,当你点击窗口的最小化按钮时,Qt内部不会自动调用 hide() 方或 setVisible(false) 来隐藏窗口。相反,它会改变窗口…...
Github 2025-02-12 C开源项目日报 Top7
根据Github Trendings的统计,今日(2025-02-12统计)共有7个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目7Python项目2OpenSSL - 强大的开源加密工具包 创建周期:4012 天开发语言:C协议类型:Apache License 2.0Star数量:23449 个Fork数量:10…...
PostgreSQL 数据类型
PostgreSQL 数据类型 PostgreSQL 是一款功能强大的开源关系型数据库管理系统,它以其出色的性能、灵活的数据类型和强大的扩展性而闻名。在 PostgreSQL 中,数据类型是构建数据库表和执行各种操作的基础。本文将详细介绍 PostgreSQL 中常用的数据类型,并探讨它们的使用场景。…...
synchronized关键字
文章目录 synchronized 关键字介绍synchronized 的内存语义 synchronized 关键字介绍 synchronized 块是 Java 提供的一种原子性 内 置锁, Java 中的每个对象都可以把它当作一个 同步锁来使用 , 这些 Java 内置的使用者看不到的锁被称为内部锁 …...
MATLAB计算反映热需求和能源消耗的度数日指标(HDD+CDD)(全代码)
目录 度数日(Degree Days, DD)概述计算公式MATLAB计算代码调用函数1:计算单站点的 CDD参考度数日(Degree Days, DD)概述 度数日(Degree Days, DD)是用于衡量建筑、城市和地区的热需求和能源消耗模式的指标。它分为两部分: 加热度日(Heating Degree Days, HDD):当室…...
在Linux中Redis不支持lua脚本的处理方法
redis安装在IP为x.x.x.x的服务器上 redis安装 第一步,安装前,检测系统是否安装了redis。若安装了redis,则需要删除redis;若没有安装redis,则需要安装2.6版本以上的redis。 # 确保Redis版本支持Lua脚本。从Redis 2.6…...
第39周:猫狗识别 2(Tensorflow实战第九周)
目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 5.1 上次程序的主要Bug 5.2 修改版…...
SpringBoot自定义starter
首先创建Maven项目 引入依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>3.4.2</version></dependency> </dependencies…...
JVM学习
JVM 1、JVM是一个跨语言的平台,与语言无关 2、java虚拟机规范:一流企业做标准,二流企业做品牌,三流企业做产品 JVM种类 Hotspot:Oracle 公司,有商业版和免费版 open jdk 内部包含免费版本hotspot虚拟机 Jr…...
RAG入门: RetroMAE、BGE、M3、MemoRAG
RAG实际上第一步都是先做Retrieval,关于Retrieval的思路有很多,持续更新: RetroMAE (论文RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder) RetraoMAE包括两个模块,…...
ruby 的安装
在51cto搜索的资料 ruby on rails的安装 http://developer.51cto.com/art/200906/129669.htm http://developer.51cto.com/art/200912/169391.htm http://developer.51cto.com/art/200908/147276.htm 史上最完整的ruby,rails环境架设配置(Apachefast…...
MySQL的备份与还原
备份数据库 使用mysqldump工具是备份MySQL数据库的一种常用方法。mysqldump可以导出数据库的结构和数据到一个SQL文件中,这个文件稍后可以被用来重新创建数据库或恢复数据。以下是mysqldump命令的详细扩写: mysqldump -u <username> -p<passw…...