异步FIFO设计的仿真与综合技术(5)

news2024/9/23 21:32:36

概述

        本文主体翻译自C. E. Cummings and S. Design, “Simulation and Synthesis Techniques for Asynchronous FIFO Design 一文,添加了笔者的个人理解与注释,文中蓝色部分为笔者注或意译。前文链接:

异步FIFO设计的仿真与综合技术(4)icon-default.png?t=N7T8https://blog.csdn.net/apple_53311083/article/details/132899707

5.0 空/满信号处理(Handling full & empty conditions)

        FIFO满和FIFO空的实现方式依赖于设计。

        本文中的FIFO设计假定如下:将在读时钟域中生成空标志,以确保在FIFO缓冲区为空时,立即检测到空标志,即读指针赶上写指针(包括指针MSBs)的瞬间。

        本文中的FIFO设计假设将在写时钟域中生成满标志,以确保在FIFO缓冲区已满时,立即检测到满标志,即写指针赶上读指针的瞬间(不同的指针MSBs除外)。

5.1 空标志生成(Generating empty)

        当读指针和同步写指针相等时,FIFO为空。产生空的比较方法很简单。我们使用比FIFO实际缓冲区所需位数多一位的指针(高位扩展法)。如果两个指针的额外位(指针的MSBs)相等,则指针回卷的次数相同,如果读指针的其余部分等于同步写指针,则FIFO为空。

        格雷码写指针必须通过在sync_w2r模块中找到的一对同步器寄存器同步到读时钟域。由于使用格雷码指针一次只更改一个位,因此在时钟域之间同步多位转换没有问题。

        为了有效地寄存rempty输出,同步的写指针实际上与rgraynext(将寄存到rptr中的下一个格雷码)进行了比较。空测试和附带的时序always块已从示例6的rptr_empty.v代码中提取,如下所示:

 assign rempty_val = (rgraynext == rq2_wptr);
 always @(posedge rclk or negedge rrst_n)
     if (!rrst_n) 
        rempty <= 1'b1;
     else 
        rempty <= rempty_val;

 5.2 满标志生成(Generating full)

        由于满标志是通过在写时钟域之间运行比较,在写时钟域中生成的,因此进行FIFO设计的一种安全技术要求在进行指针比较之前将读指针同步到写时钟域。

        满比较并不像空比较那么简单。和空比较一样,使用比处理FIFO内存缓冲区所需的地址大一位的指针进行比较,但是仅仅使用具有额外位的格雷码计数器来进行比较,这对判断满条件是无效的。问题在于,除了MSB之外,格雷码是一个对称码。

        考虑一下图6中所示的一个深度为8的FIFO的示例。在这个示例中,一个3位格雷码指针用于处理内存,并添加了一个额外的位(4位格雷码的MSB)来测试满条件和空条件。如果允许FIFO写满了前7个位置(word 0-6),然后通过读取相同的7个word将FIFO清空,则两个指针将相等,同时指向地址Gray-7(FIFO为空)。在下一个写操作中,写指针将增加4位格雷码指针(记住,只有3个LSB被用于地址内存),使4位指针上的MSB不同,但其余的写指针位将匹配读指针位,因此FIFO满标志将被生效。这是错的!不仅FIFO没有满,而且3个LSB也没有改变,这意味着被寻址的内存位置将覆盖被写入的最后一个FIFO内存位置。这也是错误的! 

        这就是为什么之前我们提到的,要使用双n位格雷码计数器。

        执行完整比较的正确方法是通过将rptr(读指针)同步到wclk域(写时钟域)来完成的,然后FIFO完全需要三个条件:

        (1)wptr(写指针)和同步的rptr(读指针)的MSB位并不相等(因为wptr必须比rptr多回卷一次)。

        (2)wptr和同步的rptr第二个高位不相等(因为一个指针第二高位的反(反:原来是0,反就是1,原来是1,反就是0)必须和另一个指针的第二高位(未反的)进行比较测试,如果MSB也是反向的----见上面的图6)。

        (3)所有其他的wptr位和同步的rptr位必须相等。

        为了有效地寄存wfull输出,同步的读指针实际上与wgnext(将在wptr中寄存的下一个格雷码)进行了比较。下面从示例7的.v代码中提取的时序always块中所示:

assign wfull_val = ((wgnext[ADDRSIZE] !=wq2_rptr[ADDRSIZE] ) &&
 (wgnext[ADDRSIZE-1] !=wq2_rptr[ADDRSIZE-1]) &&
 (wgnext[ADDRSIZE-2:0]==wq2_rptr[ADDRSIZE-2:0]));
always @(posedge wclk or negedge wrst_n)
 if (!wrst_n) 
    wfull <= 1'b0;
 else 
    wfull <= wfull_val;

        其实看代码更加直观,判断满的3个条件:(1)写指针和同步后的读指针最高位不同(2)写指针和同步后的读指针的第二高位不同,其实不难理解,如果是相同的,其实意味着LSBs并没有变化,只是MSB变化了,这是的FIFO并不是满的状态,错误原因在上文有所解释了。(3)除了最高位和次高位外,写指针和同步后的读指针其他位完全相同。

5.3 不同时钟速率(Different clock speeds)

         由于异步FIFOs有两个不同的时钟域,显然两个时钟以不同的速度运行。当将一个较快的时钟同步到一个较慢的时钟域时,将会有一些计数值被跳过,因为较快的时钟可能在较慢的时钟边缘之间半周期性地增加两次。这就引发了对以下两个问题的讨论:

First question

        考虑一个同步的格雷码已经递增了两次,但是只被采样了一次,将造成同步值(同步后的格雷码的值)的多位变化,这是否会导致多位同步问题? (简单解释一下:我们知道格雷码是一次只变化一位的,但是如果格雷码已经变化了两次,但是只进行了一次采样,那么这一次采样到的格雷码和上一次采样到的格雷码就有多位不同了,那这样会不会有问题呢)
        答案是否定的。只有当同步多位的变化在同步时钟的上升沿附近发生变化时,同步多位的变化才是一个问题。格雷码计数器可以在较慢的同步时钟沿之间增加两次(或更多),这意味着第一个格雷码变化将发生在较慢时钟的上升沿之前,只有第二个格雷码变化可以在上升时钟沿附近改变。 也就是不会发生多位变化同时发生在时钟沿附近 ,所以不会有多位变化问题。

Second question

        在考虑一下以下的情况:一个快速的格雷码计数器在慢时钟的两个上升沿之间可以增加不止一次,有可能格雷码计数器在更快的时钟域可以增加到满状态和满+1-状态之前检测,导致没有发现FIFO曾经满,导致FIFO溢出吗?(这个问题同样适用于FIFO空问题)。

        同样,对于本文中的FIFO设计方案来说,答案是否定的。首先考虑FIFO满的情况。当写指针赶上同步的读指针,并且在写时钟域中检测到FIFO-满状态时,FIFO将变满。如果wclk域比rclk域快,写指针最终将赶上同步的读指针,FIFO将被满,wfull位将被设置,FIFO将停止写入,直到同步的读指针再次前进。写指针不能提前超过wclk域中的同步读指针。

        对空标志的检查也类似,当读指针赶上同步写指针,并且在读时钟域中检测到FIFO-空状态时,FIFO为空。如果rclk域比wclk域快,读指针最终将赶上同步的写指针,FIFO将为空,空响应位将被设置,FIFO将停止读取,直到同步的写指针再次前进。读指针不能提前超过rclk域中的同步写指针。

        使用这个实现,当FIFO变满或空时,就会发生“满”或“空”的生效。但是“满”和“空”状态的移除是悲观的(但是其实不影响功能的正确,只是影响使用的效率)

5.4 悲观的空和满(Pessimistic full & empty)

        本文中描述的FIFO使用“悲观”方法实现了满移除和空移除。也就是说,“满”和“空”都是准时生效的,但移除得很晚。 

        由于写时钟用于生成FIFO-full状态,并且当写指针赶上同步的读指针时,发生FIFO-full,因此full检测是“准确的”和即时的。清楚“满”状态是悲观的,因为“满”比较是使用同步读指针完成的。当读指针出现增量时,FIFO不再满,但满生成逻辑将不会检测到变化,直到两个上升的wclk沿将更新后的rptr同步到wclk域中。这通常不是问题,因为这意味着数据发送硬件被“推迟”了,或者被告知FIFO在额外的几个wclk周期仍然是满的状态。重要的是是要确保FIFO不会溢出。向数据发送者发送信号,暂时停止写操作,只会让FIFO有时间为接收更多数据腾出空间。

        类似地,由于读时钟用于生成FIFO-empty状态,而且当读指针赶上同步写指针时就会发生FIFO-empty,因此空检测是“准确的”和即时的。删除“空”状态是悲观的,因为“空”比较是使用同步的写指针完成的。当写指针增加时,FIFO不再为空,但是空生成逻辑将不会检测到更改,直到两个上升的rclk沿将更新后的wptr同步到rclk域。这通常不是问题,因为它意味着数据接收逻辑被“搁置”,或者被告知FIFO对于几个额外的rclk边仍然是空的。重要的细节是要确保FIFO不会下溢出。向数据接收器发出信号,暂时停止读操作,只会让FIFO填充更多的数据。

5.4.1 “Accurate” setting of full & empty

        请注意,如果两个指针同时递增,则设置满标志或空标志可能不太准确。例如,如果写指针赶上同步读指针,则将设置满标志,但如果读指针与写指针同时增加,则满标志将提前设置,因为由于“写到满”操作同时发生的读操作,FIFO并没有真正满,但读指针尚未同步到写入时钟域中。满标志的设定有点太早,也有点悲观。但是这不是一个设计问题。

5.5 多位异步复位(Multi-bit asynchronous reset

        人们非常关注确保FIFO指针一次只变化一位。问题是,是否会出现与异步复位相关的问题,这通常会导致多个指针位同时发生变化?

        答案是否定的。复位表示FIFO也已被重置,并且在FIFO中没有有效的数据。在复位时,所有的同步寄存器、wclk域逻辑(包括已寄存的满标志)和rclk域逻辑都会同时进行异步复位。同时,还设置了已寄存的空标志。更重要的问题是有序地去除复位信号。

        请注意,本文中包含的设计对wclk和rclk域使用了不同的复位信号。本设计中使用的复位旨在使用Mills and Cummings[2]中描述的技术进行异步设置和同步删除。异步复位FIFO指针不是一个问题。 

5.6 将满/将空(Almost full and almost empty)

        许多设计需要通知一个未决的满或空状态,并生成“将满”和“将空”的状态位。有许多方法可以实现这两个状态位,并且每个实现都依赖于指定的设计要求。

        一些FIFO设计需要可编程的FIFO-full和FIFO-空值,这样当两个指针之间的差小于编程差时,生效相应的将满或将空位。其他FIFO设计也许以固定的差异实现,以生成将满或空。当FIFO指针的MSB关闭时,其他FIFO可能会满足于松散地生成满和空的情况。然而,其他设计可能只需要知道FIFO何时超过,或不到一半。(简单说就是不同的FIFO设计需求,提出了对于FIFO将空/将满指示的不同的需求)。

        记住,当wptr赶上同步rptr时,FIFO是满的,将满的条件可以描述为(wptr+4)赶上同步rptr的条件。(wptr+4)值可以在中所示的格雷码指针逻辑中生成

        图3通过在格雷码到二进制组合逻辑之后放置第二个加法器,向二进制值添加4个并寄存结果。这个寄存值在wclk域中将同步rptr转换为二进制值后,对同步rptr进行减法,如果差小于4,则可以设置一个将满的位。当wptr在赶上同步rptr的0-4个计数范围内时,一个小于的操作确保将满位被设置为full range。类似的逻辑可以使用rclk域的逻辑来生成将空的标志。本文中显示的Verilog RTL代码中没有包含将满和将空。

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

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

相关文章

小目标检测高效解决方案汇总,附19篇原论文&开源代码

目标检测发展至今&#xff0c;涌现出了许多非常实用的方法&#xff0c;但在小目标检测领域&#xff0c; 由于小目标经常存在图片模糊、信息少、分辨率低等问题&#xff0c;性能水平仍然难以提升。 不过在近几年间&#xff0c;已经有许多有效的解决方法被提出&#xff0c;我今天…

前端录入音频并上传

目录 纯 js 实现&#xff08;有问题&#xff09;使用插件 recorder-core &#xff08;没问题&#xff09; 纯 js 实现&#xff08;有问题&#xff09; 上传音频文件时 blob 数据中 size 一直是0&#xff0c;导致上传之后音频不可播放&#xff08;本地录制后本地是可以播放的&am…

什么是CORS(跨源资源共享)?如何解决前端中的CORS问题?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CORS&#xff08;跨源资源共享&#xff09;⭐ 解决前端中的CORS问题的方法⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为…

【前端知识】Three 学习日志(三)—— 光源对物体表面的影响

Three 学习日志&#xff08;三&#xff09;—— 光源对物体表面的影响 一、设置材质为受光照影响 //MeshLambertMaterial受光照影响 const material new THREE.MeshLambertMaterial();此时&#xff0c;场景中一片漆黑&#xff0c;无法看到原来的物体&#xff0c;需要设置光源…

24v转5v稳压芯片-5A大电流输出ic

这款24V转5V5A汽车充电芯片具有以下特性和参数&#xff1a; - 宽输入电压范围&#xff1a;4.5V至36V - 最大输出电流&#xff1a;5.0A - 高达92%的转换效率 - 恒流/恒压模式控制 - 最大占空比100% - 可调输出电压 - 2%的输出电压精度 - 集成40mΩ高侧开关 - 集成18mΩ低侧开关 …

网络安全深入学习第六课——热门框架漏洞(RCE— Weblogic反序列化漏洞)

文章目录 一、Weblogic介绍二、Weblogic反序列化漏洞历史三、Weblogic框架特征1、404界面2、登录界面 四、weblogic常用弱口令账号密码五、Weblogic漏洞介绍六、Weblogic漏洞手工复现1、获取账号密码&#xff0c;这是一个任意文件读取的漏洞1&#xff09;读取SerializedSystemI…

K8s(Kubernetes)学习(六)——Ingress

第六章 Ingress 什么是 IngressIngress 和 Service 区别Ingress 控制器 Traefik 使用Ingress Route的定义 1 简介 https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/ Ingress 是一种 Kubernetes 资源类型&#xff0c;它允许在 Kubernetes 集群中暴露…

浏览器报错内容:Provisional headers are shown

浏览器报错内容&#xff1a;Provisional headers are shown 如下图&#xff1a; 解决方法&#xff1a;nginx 443 启用HTTP/2模式&#xff0c;如下图&#xff1a; server {listen 443 ssl http2;server_name callcenterda.umworks.com;client_max_body_size 200M;ssl_session_…

Idea注释相关配置模板

设置-编辑器-实时模板。 这里可以自己建立一个文件夹&#xff0c;建立自己的模板 1、普通多行注释 2、方法注释 我的方法注释模板文本&#xff1a; ** *$param$$return$ **/ 点击编辑变量&#xff1a; 两个默认值分别为&#xff1a; groovyScript("if(\"${…

倾情奉献,纯css(无图,无JS)原创中秋贺卡!!!

&#x1fab4; 背景故事 中秋节马上就要到了&#xff0c;在这里我提前祝大家生活美满万年长&#xff0c;阖家幸福永平安&#xff01;&#x1f973; 好了进入正题&#xff0c;最近掘金出了一个“中秋创意投稿”活动&#xff0c;我向来对这种可以写一些具有创意性的代码的活动很…

问题记录:两台Ubuntu之间传输文件(SCP)

1.查看IP地址 首先查看目标设备的 IP 地址&#xff1a;要把文件传到哪台机器上&#xff0c;就看哪台机器的 IP 地址&#xff0c;有两种方法 1.在终端输入 ifconfig: 2.设置里面看 2. 在自己的PC端 ping 一下目标机器的 IP 地址&#xff0c;看是否可以连接 ping 172.17.160…

使用ROS与Movelt实现myCobot 280运动轨迹规划和控制

ROS的技术案例 Introduction 今天这篇文章将记录我使用myCobot 280 M5stack 在ROS当中是如何使用的。为什么使用ROS呢&#xff0c;因为提及到机器人都离不开ROS这个操作系统&#xff0c;今天是我们第一次使用ROS这个系统。 今天我将从ROS的介绍&#xff0c;环境的配置以及mycob…

DPU加速AI应用“遍地开花”,中科驭数亮相2023全球AI芯片峰会

9月15日&#xff0c;2023全球AI芯片峰会&#xff08;GACS 2023&#xff09;在深圳举行&#xff0c;聚集了全球AI芯片产业的领军者和中坚力量&#xff0c;共探AI芯片的求新、求变、求索之径。中科驭数高级副总裁张宇应邀在智算中心算力与网络高峰论坛发表题为《基于DPU的高效AI大…

《2023年中国数字孪生行业报告》丨附下载_三叠云

✦ ✦✦ ✦✦ ✦✦ ✦ 随着近年来人工智能、物联网、虚拟现实等技术的持续发展以及元宇宙概念的兴起&#xff0c;数字孪生概念进一步完善&#xff0c;适用范围不断拓宽。然而非业界人士对数字孪生概念仍缺乏统一认知。对此&#xff0c;本报告介绍数字孪生概念、行业情况、市场…

java开发之个微机器人的开发

简要描述&#xff1a; 根据消息回调收到的xml转发文件消息&#xff0c;适用于同内容大批量发送 请求URL&#xff1a; http://域名地址/sendRecvFile 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#…

uniapp 使用subNVue原生子窗体显示弹框或悬浮框

效果展示 在uniapp中&#xff0c;我们可以使用subNVue原生子窗体来解决web-view等原生页面中弹框无法显示的问题。 subNVue原生子窗体是uniapp提供的一种原生组件&#xff0c;可以在uniapp中嵌入原生页面&#xff0c;并且可以与uniapp页面进行通信。我们可以在原生页面中使用…

web浏览器公网远程访问jupyter notebook【内网穿透】

文章目录 前言1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 前言 Jupyter Notebook&#xff0c;它是一个交互式的数据科学和计算环境&#xff0c;支持多种编程语言&#xff0c;如…

leetcode 102.二叉树的层序遍历

⭐️ 二叉树的层序遍历I 题目描述 &#x1f31f; leetcode链接&#xff1a;二叉树的层序遍历I 思路&#xff1a; 使用一个辅助队列来层序遍历二叉树&#xff0c;不同的是需要使用一个二维数组来存放每个节点&#xff0c;而每一层的所有节点又需要是一个一维数组。 而最重要的问…

DNS解析流程

DNS 层次结构如下&#xff1a; 根 DNS 服务器 &#xff1a;返回顶级域 DNS 服务器的 IP 地址顶级域 DNS 服务器&#xff1a;返回权威 DNS 服务器的 IP 地址权威 DNS 服务器 &#xff1a;返回相应主机的 IP 地址 为了提高 DNS 的解析性能&#xff0c;很多网络都会就近部署 DNS …

如何在idea中新建第一个java小程序

如何在idea中新建第一个java小程序 1.打开软件2.新建项目3.找到安装的jdk文件路径4.继续下一步5.创建项目名称并配置项目路径6.点击完成即可。7.在项目文件的src文件夹下创建java类&#xff0c;程序等7.1其他java项目或文件不能运行的原因&#xff1a; 8.新建类并运行程序9.输入…