【更新中】《硬件架构的艺术》笔记(三):处理多个时钟

news2024/11/18 14:44:07

介绍

单时钟设计更易于实现,也更少出现亚稳态、建立和保持时间违例方面的问题。但在实践中,很少有设计只在一个时钟下运行。

多时钟域

多个始终可以有以下一种或多种时钟关系:

1、时钟频率不同。

2、时钟频率相同,但相位不同。

多时钟域设计的难题

1、建立时间和保持时间的违背。

2、亚稳态。

事实上1就会导致2

违背建立时间和保持时间

多时钟域情况下,很容易出现一个时钟域的输出在另一个时钟域的时钟上升沿到来时发生改变的现象。

图中xclk_output1不满足建立时间和保持时间,所以会造成亚稳态。而xclk_output2则没有该问题。

多时钟设计的处理技术

通用准则:

1、时钟命名  

2、分模块设计

时钟命名法

为了方便脚本使用通配符对所有时钟进行操作,对时钟应有一个确定的命名,如sys_clk、tx_clk和rx_clk,同属一个时钟域的信号也应在命名时使用同样的前缀,这样可以方便分辨出信号所属时钟域,并决定时直接使用该信号,还是同步后使用。

分块化设计

  • 每个模块只因当在单个时钟下工作
  • 在信号跨时钟域传输时,使用同步器模块。
  • 同步器规模尽可能小。

优点:使静态时序分析变得很简单。单个模块可以看作是完全同步的。另外,同步模块不需要做静态时序分析,但是要保证满足保持时间要求。

如图所有跨时钟域传输的信号都要经过一个额外的同步器模块。

跨时钟域

两类:控制信号的传输、数据信号的传输。

控制信号的传输(同步化)

最常用的方式:多级同步器。(只能降低亚稳态可能性,增加更多级触发器,可以进一步降低亚稳态出现的可能性)

缺点(不可避免地开销):增加了电路的整体延时。

 可以看到,亚稳态如果在一个周期内稳定下来,第二级寄存器就能输出一个稳定的值。

有时第一级同步器信号从亚稳态进入稳态需要不止一个周期,第二级触发器输出依然亚稳态,这是为了安全起见,应加入三级同步器。

大多数设计中两级同步电路就足以避免亚稳态出现了,只有在时钟频率非常高的设计中才要求使用三级同步器电路。

数据信号的传输

两种方法:

1、握手信号

2、异步FIFO

同频零相位差时钟

其实就是单时钟设计。

 同频恒定相位差时钟

从这幅图看感觉对建立时间要求更高了,对保持时间要求变低了。对组合逻辑的延时约束会变得更紧。这种情况不需要同步器,只需要使设计STA通过即可。

非同频、可变相位差时钟

整数倍频率的时钟

clk2捕获数据的时间可能是T、2T、3T,取决于数据在clk1哪个边沿发出。任意路径的最差延迟都应在时钟边沿相位差T时满足建立时间要求。最差保持时间应在时钟边沿相位差为零时进行。

可以使源数据每三个源时钟改变一次,防止丢失数据。

非整数倍频率的时钟

情况一:源时钟有效沿和目的时钟有效沿之间有足够大的相位差,不会有亚稳态产生。

 clk1和clk2分别是对同一个时钟的3分频和2分频,如图,两个时钟最小相位差为2.5ns,满足建立时间和保持时间,但应避免在跨时钟位置使用任何组合逻辑。

慢到快不会有数据丢失;快到慢可能出现数据丢失,为了解决这个问题,必须将元数据保持至少一个目标时钟周期。

情况2:两个有效沿很近,但当再出出现挨着的情况前,接下来的几个周期两个时钟沿会保留足够的裕量。

 图中期望的波形使B1,实际的波形使B2。这里数据不会丢失(因为是从慢到快),但是可能不连贯。

从快倒满可能出现数据丢失,为了阻止这种情况,源数据应保持至少一个目标时钟周期不变。

情况三:相位差异小,能连续存在几个周期。

图中前两个周期可能违背建立时间,后两个周期可能违背保持时间。

这种情况下,即使数据从慢到快时钟域也可能丢失。

为了不丢数据,数据应保持至少两个目的时钟周期,这同时适用于快到慢和慢到快。但是数据不连续的问题依然存在。

这时,使用握手和FIFO传输数据就更有效,因为它们解决了数据不连续的问题。

握手信号方法

  • X将数放在数据总线上兵发出xreq信号,表示有效数据已经发到接收器Y的数据总线上。
  • xreq信号同步到接收器时钟域ylk上。
  • Y在识别xreq同步的信号yreq2后,锁存数据总线上信号。
  • Y发出确认信号yack,表示其已经接收了数据。
  • yack同步到发送时钟xclk上。
  • X识别到同步的xack2信号后,将下一个数据放到数据总线上。

如图,安全地将一个数据从发送器传输到接收器需要5个时钟周期。

握手信号的要求

数据应在发送时钟域内稳定至少两个时钟上升沿。

xreq宽度应该超过两个上升沿时钟,否则从高速时钟域到低速时钟域传递可能无法捕捉到该信号。

握手信号缺点

传输单个数据延迟比FIFO传输同样的数据大得多。

使用同步FIFO传输数据

DPRAM(双端口RAM)用作FIFO以使读、写可以独立进行。

  •  写指针指向下一个要写的地址,读指针指向下一个要读的地址。写使能使写指针递增,读使能使读指针递增。
  • 根据读写指针可以产生空信号和满信号,也可以对FIFO内数据进行计数。
  • DPRAM可以同步读取或者异步读取。同步读时,应在FIFO输出有效前给都信号。异步读时,输出不会寄存。数据只要一写入就可用。

 FIFO空满的产生

 图中为FIFO满的情况,当读指针等于写指针加一并进行写操作,FIFO满。

同样,当读操作使两个指针在下个周期相等时,FIFO变空。

另一种方法

另一种方法使使用计数器来指示FIFO中空或满位置的个数。写入数据时计数器加一,读取数据时计数器减一。

这种方法原理上简单,但是要增加额外的硬件(比较器)。FIFO深度增加,比较器宽度也会增加,这最终会降低FIFO操作的最高频率。

异步FIFO

 如上图,X通过xclk将数据写入FIFO,Y通过yclk将数据读出。注意这里写满标志信号在写时钟域,空信号在读时钟域。

对比握手信号,异步FIFO用于对性能要求较高的设计中,尤其是时钟延迟比系统资源更重要的环境中。

异步FIFO主要需要注意信号亚稳态的问题。

 避免用二进制计数器实现指针

如果使用二进制计数,一次可能变换多位,这时就需要将多位数据同步到另一个时钟域,很容易造成错误。

 使用格雷码取代二进制计数

格雷码优势是在一个数变成另一个数时,只有一位出现变化。所以其在转换中最多只会一位错误,读取时要么读到旧值,要么读到新值,但是不会读到其他值。

同步指针的影响

 需要注意的是在t6、t7的时候,由于同步电路需要两个时钟周期(两级同步缓解亚稳态),所以fifo_full会多拉高两个周期,这样阻止了两个周期的数据写入,但是对数据的准确性是无害的。

同样,空也会多两个周期阻止FIFO读访问。

 空判断是将写指针同步到读时钟域,在读空后写入FIFO,需要两个周期读时钟域才能得到写指针增加的信息,所以空信号也会多延两个周期。同样这里组织了对FIFO的读操作,也是无害的。

用格雷码实现FIFO指针

 1、将格雷码转换成二进制码。

2、根据条件递增二进制值。

3、二进制转格雷码。

4、保存到寄存器。

格雷码到二进制转换器

 转换公式:

所以可以将格雷码右移i位再按位异或得到二进制码

二进制-格雷码转换器

可以直接将二进制码右移一位后与自身异或操作,计算出格雷码。

格雷码计数器的实现

将四个步骤结合起来,就可以实现一个格雷码计数器。

 

FIFO满和FIFO空的产生

为了判断空满,还需要额外一位对两种情况进行区分。

最高位不同,其他位相同,FIFO满。

所有位相同,FIFO为空。

由于存在XOR链路,最大操作频率取决于格雷码计数器速度:当电路中存在 XOR 链路 时,XOR 门的延迟会影响整个电路的反应时间。如果格雷码计数器的输出需要经过多个 XOR 门进行处理,那么这些 XOR 门的串联延迟将成为影响最大操作频率的一个关键因素。

如图,一共用了四个转换器,如果直接使用格雷码实现空满操作就可以省掉这些转换器,但是这会增加复杂度并需要额外的逻辑。

产生空满的另一种方法

该方法创建两个格雷码计数器,一个n位,另一个n-1位。通过n位格雷码的最高两位异或,来产生一个n-1位格雷码的MSB。其余n-2位与n位格雷码的n-2位保持一致。

 使用这两个格雷码计数器,就可以进行FIFO空满判断。

 

双时钟FIFO设计

FIFO空条件的产生

这里直接比较读写指针格雷码,相比先将格雷码转化成二进制码,直接对比格雷码可以节省4个转换器。

同步后的写指针wr_ptr_sync和rd_gtemp(下一个将要寄存进入rd_ptr的格雷码,不然产生空满信号需要一个周期,空满信号被采样到用于控制FIFO读写又需要一个周期,会造成FIFO满了还向FIFO中写入的现象。)

FIFO满条件的产生

 如图,rd_ptr=7,wr_ptr=8时,会出现FIFO满的错误声明。使用二元n位格雷码计数器可以轻松避免该情况。

以下三个条件同时为真时,满标志拉高。

1)同步后的读指针rd_ptr_sync的MSB应该与下一个写指针的格雷码wr_gtemp的MSB应该不同。

2)写时钟域两位MSB异或应与读指针一样。

3)剩下的LSB都应该一样。

(其实总结一下就是最高位相反,剩下的低位应该完全相等)

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

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

相关文章

Python_爬虫1_Requests库入门

目录 Requests库 7个主要方法 Requests库的get()方法 Response对象的属性 爬取网页的通用代码框架 理解requests库的异常 HTTP协议及Requests库方法 HTTP协议 HTTP协议采用URL作为定位网络资源的标识。 HTTP协议对资源的操作 理解PATCH和PUT的区别 HTTP协议与Requse…

从客户需求视角去认识ZLG | 边缘计算网关多种应用

在工业领域,串行总线与EtherNET总线广泛应用,物联网的兴起带来众多智能应用。尽管应用多样,但底层技术逻辑却殊途同归,本文将介绍ZLG致远电子串行总线和EtherNET总线之间的联动应用。 本文将从系统集成需求出发,以ZLG致…

Koa进阶:掌握中间件和参数校验的艺术

目录 一、首先下载依赖 二、在index.js中引入koa-parameter,一般挂载这个中间件时会放在注册请求体的后面 三、使用实例 四、如果跟我们所需求的参数不同,返回结果直接会返回422 koa-parameter一般是用来校验请求传过来的参数是否是自己所需要的的 G…

Linux下使用miniconda构建python运行环境

文章目录 miniconda安装构建python运行环境 miniconda安装 miniconda在linux环境下载安装: # Linux环境下使用wget命令下载选定的miniconda # 这里使用的是清华镜像,这个命令每次下载的是最新版本的miniconda wget -c https://mirrors.tuna.tsinghua.e…

解决failed to execute PosixPath(‘dot‘) 或者GraphViz‘s executables not found

在网上找了很多方法都没解决,所以写一篇文章帮助和我遇到同样问题的人 解决方法: 因为python解释器会解释转移字符,因此在环境变量中把\bin换成\\bin即可 解决过程: 系统:win10 已安装pip install graphviz&#xff0…

Deep-Live-Cam -面部交换、视频深度伪造

文章目录 一、关于 Deep-Live-Cam免责声明 二、安装(Windows/Nvidia)安装(手动)基本安装(CPU) GPU加速(可选)CUDA执行提供商(Nvidia)CoreML执行提供商&#x…

计算机毕业设计Python美食推荐系统 美团爬虫 美食可视化 机器学习 深度学习 混合神经网络推荐算法 Hadoop Spark 人工智能 大数据毕业设计

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

Scala-数据类型-概述(Scala 3.x 类型层次结构)

Scala Scala-数据类型 Scala1. Any — 顶级类型2. Matchable — 匹配类型3. AnyVal — 值类型的父类4. AnyRef — 引用类型的父类5. Null - 引用类型的子类型Tips: 为什么 null 不推荐使用? 6. Nothing - 底层类型 (Bottom Type)整理不易,对您有帮助的话…

嵌入式linux中红外接收基本方法分析

大家好,今天主要给大家分享一下,如何使用Linux系统中的红外接收驱动控制方法。 第一:Linux红外基本简介 红外遥控是我们常见的一种无线收发设备,具有抗干扰能力强,功耗低,成本低,易实现等优点。被很多电子设备特别是家用电器广泛采用,如电视遥控、空调遥控等。红外遥控…

AWTK-WIDGET-WEB-VIEW 实现笔记 (2) - Windows

在 Windows 平台上的实现,相对比较顺利,将一个窗口嵌入到另外一个窗口是比较容易的事情。 1. 创建窗口 这里有点需要注意: 父窗口的大小变化时,子窗口也要跟着变化,否则 webview 显示不出来。创建时窗口的大小先设置…

pgAdmin简单介绍

pgAdmin介绍 官网:https://www.pgadmin.org/ pgAdmin is the most popular and feature rich Open Source administration and development platform for PostgreSQL, the most advanced Open Source database in the world. pgAdmin may be used on Linux, Unix…

Linux笔记---调试工具GDB(gdb)

1. gdb的概念 GDB,全称GNU Debugger,是一个功能强大的开源调试工具,广泛用于Unix和类Unix系统,以及Microsoft Windows和macOS平台。GDB允许开发者在程序执行过程中查看内部运行情况,帮助定位和修复程序中的错误。 gd…

如何在 Ubuntu 上安装 Mattermost 团队协作工具

简介 Mattermost 是一个开源、自托管的通信平台,专为团队协作设计。它类似于 Slack,提供聊天、消息传递和集成功能。Mattermost 在重视数据隐私的组织中特别受欢迎,因为它允许团队在自己的服务器上管理通信。以下是 Mattermost 的一些关键特…

2. Django中的URL调度器 (自定义路径转换器)

在 Django 中&#xff0c;URL 路由通常使用路径转换器&#xff08;path converters&#xff09;来匹配和捕获 URL 中的特定模式&#xff0c;例如整数、字符串或 slug 等。默认情况下&#xff0c;Django 提供了一些内置的路径转换器&#xff0c;如 <int>、<str>、&l…

【STM32】USB 简要驱动软件架构图

STM32 USB 软件架构比较复杂&#xff0c;建议去看 UM 1734 或者 st wiki STM32 USB call graph STM32 USB Device Library files organization Reference [1]: https://wiki.stmicroelectronics.cn/stm32mcu/wiki/Introduction_to_USB_with_STM32 [2]: UM1734

MATLAB 使用教程 —— 命令窗口输入命令,工作区显示变量

命令在命令窗口输入变量在工作区显示 MATLAB 桌面包含的面板如下&#xff1a; 当前文件夹 - 此面板允许访问项目文件夹和文件。命令窗口 - 这是主要区域&#xff0c;用户在命令行中输入命令&#xff0c;命令提示符(>>).工作区 - 工作区显示所有变量&#xff0c;无论是创…

华为USG5500防火墙配置NAT

实验要求&#xff1a; 1.按照拓扑图部署网络环境&#xff0c;使用USG5500防火墙&#xff0c;将防火墙接口加入相应的区域&#xff0c;添加区域访问规则使内网trust区域可以访问DMZ区域的web服务器和untrust区域的web服务器。 2.在防火墙上配置easy-ip&#xff0c;使trust区域…

时钟之CSS+JS版

写在前面 此版本绘制的时钟基于CSSJS模式。 优点操作简单&#xff0c;缺点当然是不够灵活。下一篇会基于HTML5的canvas标签&#xff0c;使用JS绘制。会更灵活&#xff0c;元素更加丰富。 HTML代码 <div class"box"><article class"clock"><…

blender 骨骼的动画基础 笔记总结

一、世界纹理 1.首先打开Node Wrangler&#xff08;世界纹理&#xff09;插件 在编辑的偏好设置这里&#xff0c; 演示一下这个插件&#xff1a; 然后通过shift a添加环境纹理 对其连接颜色后&#xff0c;选中世界纹理&#xff0c;通过按键ctrl t 二、动画 点击动画 1.…

java ssm 健康医馆管理系统 中医馆管理 健康平台 药店 源码jsp

一、项目简介 本项目是一套基于SSM的健康医馆管理系统&#xff0c;主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本、软件工具等。 项目都经过严格调试&#xff0c;确保可以运行&#xff01; 二、技术实现 ​后端技术&#x…