跨时钟域CDC

news2024/11/17 8:40:31

https://www.cnblogs.com/icparadigm/p/12794483.html
https://www.cnblogs.com/icparadigm/p/12794422.html

亚稳态

是什么

时序逻辑在跳变时,由于异步信号、跨时钟域等原因,不满足setup或hold条件,输出在0和1之间产生振荡。

原因

D触发器的内部是一个主从锁存器(master-slave latch),依靠背靠背的反相器锁存数据。
image-20201115220814212

时钟为低电平时,主锁存器更新输入值,从锁存器保持上一个输出值不变。 image-20201115221127230
时钟为高电平时,主锁存器保持上一个输出值不变,从锁存器更新输入。

image-20201115221511788
由于反相器需要一定时间才能锁定,若时钟跳变前后,未完成锁存时钟就改变,最后输出的电平高低会不稳定,这就是亚稳态。

危害

错误的逻辑会一直传递下去导致系统错误。

指标

MTBF-- mean time between failure. 两次失效之间的平均时间。
M T B F ( T M E T ) = e T M E T C 1 ∗ 1 C 2 ∗ f c l k ∗ f d a t a MTBF(T_{MET})=\frac{e^{T_{MET}}}{C_1} * \frac{1}{C_2*f_{clk}*f_{data}} MTBF(TMET)=C1eTMETC2fclkfdata1
C1 和C2 是常数,依赖于器件工艺和操作环境。
fCLK 和fDATA 参数取决于设计规格:fCLK 是接收异步信号的时钟域的时钟频率,fDATA 是异步数据的翻转频率(toggling frequency)。
TMET 参数是亚稳态转稳定的时间(Metastability setting time),或者说时序裕量大于寄存器Tco可以让潜在的亚稳态信号达到稳定的值的时间。TMET 对同步链来说就是链中每个寄存器输出时序裕量的和。

减少亚稳态的方法

1. 改善工艺
2. 降低时钟速率和数据翻转。
3. 增大时序裕量(使用多级同步器打拍)

单bit情况

1.慢时钟域到快时钟域(目标时钟频率必须是源时钟频率1.5倍或者以上

电平同步,直接打拍。

 /*
            +---------+        +---------+       +---------+
 asynch_in  |         | meta1  |         | meta2 |         | synch_out
 +----------+ D     Q +--------+ D     Q +-------+ D     Q +-------+
            |         |        |         |       |         |
  clk_b     |         | clk_b  |         |  clk_b|         |
 +----------+ CLK     | +------+ CLK     | +-----+ CLK     |
            |    R    | |      |     R   | |     |         |
            +----+----+ |      +-----+---+ |     +----+----+
                 |      +            |     +          |
                 |                   |                |
                 |                   |                |
  +--------------+-------------------+----------------+
 
 */
 
 always @(posedge clk_b or posedge rst) begin
     if(rst) begin
         meta1<=0;
         meta2<=0;
         synch_out<=0;
     end
     else begin
         meta1<=asynch_in;
         meta2<=meta1;
         synch_out<=meta2;
     end
 end
 assign pos_out_b=synch_out&~meta2;//高电平跳变沿
 assign neg_out_b=~synch_out&meta2;//低电平跳变沿

2.快时钟域到慢时钟域

脉冲同步器,即加握手信号,通过组合逻辑把脉冲展宽为电平信号,再向clkb传递,当确认clkb已经“看见”信号同步过去之后,再清掉clka下的电平信号。在应答信号到来之前,不允许源信号改变,可能漏采。

 module pluse_sync
 (
     input rst_n,
     input clk_a,
     input clk_b,
     input pulse_a_in,
     output pulse_b_out,
     output level_b_out
 );
     reg q;//展宽脉冲信号
     reg q1_a2b,q2_a2b,sync_out;//a向b同步信号
     reg q1_b2a,q2_b2a;//b向a同步信号
     
     //q的置位与清零
     always @(posedge clk_a or negedge rst_n) begin
         if(~rst_n)
             q<=0;
         else if(pulse_a_in)
             q<=1;
         else if(q2_b2a)
             q<=0;        
     end
     
     //
     always@ (posedge clk_b or negedge rst_n) begin
         if(~rst_n) begin
             q1_a2b<=0;
             q2_a2b<=0;
             sync_out<=0;
         end
         else begin
             q1_a2b<=q;
             q2_a2b<=q1_a2b;
             sync_out<=q2_a2b;
         end
     end
     
     //
     always@(posedge clk_a or negedge rst_n) begin
         if(~rst_n) begin
             q1_b2a<=0;
             q2_b2a<=0;
         end
         else begin
             q1_b2a<=sync_out;
             q2_b2a<=q1_b2a;
         end
         assign pulse_b_out=sync_out&(~q2_a2b);
         assign level_b_out=sync_out;
 endmodule
  • 在使用同步器同步信号时,要求输入信号必须是源时钟域的寄存输出。即Asynch_in必须是clk_a的DFF信号,中间不能经过组合逻辑。

    • 原因:根据FF的特性,输出在一个时钟周期内是不会改变的,数据的变化频率不会超过时钟频率,这样就能降低跨时钟信号变化的频率,减小亚稳态发生的概率
  • 应用

    • 输入去抖debounce

      //可以滤掉的宽度是两个clk的cycle,对于大于两个cycle而小于三个cycle的信号,有些可以滤掉,有些不能滤掉,这与signal_i相对clk的相位有关。
      parameter BIT_NUM  = 4 ;
      reg [BIT_NUM-1 : 0] signal_deb ; 
      always @ (posedge clk or negedge rst_n)
      begin
          if (rst_n == 1'b0)
              signal_deb <= {BIT_NUM{1'b0}} ;
          else
              signal_deb <= # DLY {signal_deb[BIT_NUM-2:0],signal_i} ;
      end
      
      always @ (posedge clk or negedge rst_n)
      begin
          if (rst_n == 1'b0)
              signal_o <= 1'b1 ;
          else if (signal_deb[3:1]==3'b111) 
              signal_o <= # DLY 1'b1 ;
          else if (signal_deb[3:1]==3'b000)
              signal_o <= # DLY 1'b0 ;
          else ;
      end
      

      根据希望滤除的宽度,换算到clk下是多少个cycle数,从而决定使用多少级DFF。

      如果希望滤除的宽度相对cycle数而言较大,可以先在clk下做一个计数器,产生固定间隔的脉冲,再在脉冲信号有效时使用多级DFF去抓signal_i;或者直接将clk分频后再使用。

      也不一定全为1或0才判断有效/无效,见project/uart_tx 输入去抖。

多bit情况

  • 多个信号合并

    如果可能,将多个信号合为一个传递。

  • 多周期路径法

    (常见于单bit同步,多bit一般用AFIFO)

  • 使用格雷码传递多个CDC位

    格雷码最常见的应用是在异步FIFO中,相邻的状态只变化一位,转化为单bit情况。

    **格雷码必须是计数到2n才是每次改变一个bit。**如果计数器是从0~5计数,那么从5->0的计数,不止一个bit改变,就失去了只改变一个bit的初衷。所以就算浪费面积,也需要把FIFO深度设置为2N。

  • 使用异步FIFO来传递多位信号

Valid-Ready握手协议

https://blog.csdn.net/maowang1234588/article/details/100065072

VALID信号由源设备控制,READY信号由宿设备控制。源设备拉起VALID信号表示其把数据(或地址等信号)放上了总线,等待宿设备接收;在宿设备接收数据以前,源设备必须要保持住总线上的数据不变。宿设备只有在可以接收数据时,才可以拉起READY信号,否则只能拉低READY信号。只有当VALID和READY信号同时有效时,一次数据传输才算完成。

AXI协议保障数据正确传输使用了该握手协议,所有的通道都采用同样的握手协议。

Valid-Ready信号产生有两种情况。

  • Ready-Before-Valid

    Ready-Before-Valid是Ready信号在Valid信号之前有效。在数据来临之前,通道已准备好接收数据,可以保持通道的最大吞吐量,因为Ready先产生,这个通道保持刷新等待数据。通道作为接受数据端采用这样的设计。

    img

  • Valid-before-Ready

    Valid-before-Ready是Valid信号在Ready信号之前有效。通道作为数据输出端采用这样的设计。收到下游接收端的准备接收信号,才开始传输数据。

    img

  • Stalemate 死锁

    输出端用Ready-Before-Valid而接受端使用Valid-before-Ready,就会出现输出端等待接受端给出的Ready来输出数据,但是接收端也在等待输出端给出Valid信号来接受数据。两者都在等待却没有一方先给,所以这个时候这个通道就是无效的,被“锁住”了。

  • verilog实现

    • 无缓存(见典型电路)

    • 带缓存(用同步FIFO实现)

      img

      assign  valid_o = ~fifo_empty;
      assign  ready_o = ~fifo_full;
      assign  wr_en = ready_o & valid_i;
      assign  rd_en = ready_i & valid_o;
      

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

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

相关文章

Canny算法原理和应用

Canny算法的原理使用高斯滤波器滤波使用 Sobel 滤波器滤波获得在 x 和 y 方向上的输出&#xff0c;在此基础上求出梯度的强度和梯度的角度edge为边缘强度&#xff0c;tan为梯度方向上图表示的是中心点的梯度向量、方位角以及边缘方向&#xff08;任一点的边缘与梯度向量正交&am…

如何在MySQL 8中实现数据迁移?这里有一个简单易用的方案

文章目录前言一. 致敬IT领域的那些女性二. 进制方式安装MySQL2.1 下载软件包2.2 配置环境&#xff1a;2.2.1 配置yum环境2.2.2 配置安全前的系统环境2.3 开始安装2.4 初始化MySQL2.5 修改配置文件2.6 将MySQL设为服务并启动测试三. MySQL数据迁移总结前言 正好赶上IT女神节&am…

《Linux运维实战:ansible中的变量定义及以及变量的优先级》

一、配置文件优先级 Ansible配置以ini格式存储配置数据&#xff0c;在Ansible中⼏乎所有配置都可以通过Ansible的Playbook或环境变量来重新赋值。在运⾏Ansible命令时&#xff0c;命令将会按照以下顺序查找配置⽂件。 # ⾸先&#xff0c;Ansible命令会检查环境变量&#xff0c…

【node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 最全面有效的解决方案】

执行nodejs文件错误&#xff1a; 这个错误提示通常是由于你的系统无法识别 "node" 命令&#xff0c;可能是由于你没有正确地安装或配置 Node.js 环境变量。 问题描述 ​​​​​​​​​​​​​​ 原因分析&#xff1a; 可能原因包括&#xff1a; 1.Node.js未正确安…

JVM堆与堆调优以及出现OOM如何排查

调优的位置——堆 Heap&#xff0c;一个JVM只有一个堆内存&#xff0c;堆内存的大小是可以调节的。 类加载器读取了类文件后&#xff0c;一般会把什么东西放到堆中?类&#xff0c;方法&#xff0c;常量&#xff0c;变量~&#xff0c;保存我们所有引用类型的真实对象; 堆内存中…

【Linux修炼】15.进程间通信

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 进程间通信进程间通信一.理解进程间通信1.1 什么是通信1.2 为什么要有通信1.3 如何进行进程间通信二.管道2.1 匿名管道2.2 匿名管道编码部分2.3 管道的特点2.4 如何理解命令行中的管道2.5 进程控制多个子进程三.命名管道3.…

openEuler用户软件仓(EUR)介绍

什么是 EUR EUR(openEuler User Repo)是openEuler社区针对开发者推出的个人软件包托管平台&#xff0c;目的在于为开发者提供一个易用的软件包分发平台。 链接&#xff1a;https://eur.openeuler.openatom.cn/ 为什么我们需要 EUR 在操作系统的世界&#xff0c;软件包是一等…

数据库基本功之复杂查询-多表连接

1. 简单查询的解析方法 全表扫描:指针从第一条记录开始,依次逐行处理,直到最后一条记录结束;横向选择纵向投影结果集 2. 多表连接 交叉连接(笛卡尔积) 非等值连接 等值连接 内连 外连接(内连的扩展,左外,右外,全连接) 自连接 自然连接(内连,隐含连接条件,自动匹配连接字段) …

以创作之名致敬女性开发者

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 前言 在昨天的2023年3月8日&#xff0c;是咱们女性朋友的节日妇女节&#xff0c;本章将会…

腾讯云GPU游戏服务器/云主机租用配置价格表

用于游戏业务的服务器和普通云服务器和主机空间是不同的&#xff0c;游戏服务器对于硬件的配置、网络带宽有更大的要求&#xff0c;一般游戏服务器根据不同的配置和适用场景会有十几元一小时到几十元一小时&#xff0c;而且可以根据不同的按量计费。而普通的云服务器可能需要几…

Linux程序替换

Linux程序替换创建子进程的目的&#xff1f;程序替换如何实现程序替换&#xff1f;什么是程序替换&#xff1f;先见一见单进程版本的程序替换程序替换原理多进程版本的程序替换execl函数组简易版Shell创建子进程的目的&#xff1f; 目的:为了帮助父进程完成一些特定的任务&…

网络实时变更监控

网络变更监控 未经授权的配置变更会严重破坏业务连续性&#xff0c;这就是为什么检测和跟踪变更是网络管理员的一项关键任务。虽然可以手动跟踪变更&#xff0c;但此方法往往很耗时&#xff0c;并且经常会导致人为错误&#xff0c;例如在跟踪时遗漏了关键网络设备的配置。 要解…

JavaEE简单示例——Spring的控制反转

简单介绍&#xff1a; 在之前的入门程序中&#xff0c;我们简单的介绍了关于Spring框架中的控制反转的概念&#xff0c;这次我们就来详细的介绍和体验一下Spring中的控制反转的理论和实操。 使用方法&#xff1a; 控制反转&#xff08;IoC&#xff09;是面向对象编程中的一个…

HTML5 和 CSS3 的新特性

目标能够说出 3~5 个 HTML5 新增布局和表单标签能够说出 CSS3 的新增特性有哪些HTML5新特性概述HTML5 的新增特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题&#xff0c;基本是 IE9 以上版本的浏览器才支持&…

CentOS 部署rocketmq集群

一、rocketmq 概览 1.rocketmq简介 rocketmq是一个队列模型的消息中间件&#xff0c;具有高性能、高可靠、高实时、分布式特点。能够保证严格的消息顺序&#xff0c;提供丰富的消息拉取模式&#xff0c;高效的订阅者水平扩展能力&#xff0c;实时的消息订阅机制。 2.rocketmq结…

项目四:使用路由交换机构建园区网-任务三:配置路由交换机并进行通信测试

配置路由交换机并通信测试1、在RS-1上创建VLAN并配置Trunk接口2、测试通信结果3、配置RS-1的三层路由接口&#xff08;SVI&#xff09;1、在RS-1上创建VLAN并配置Trunk接口 进入系统视图&#xff0c;关闭信息中心&#xff0c;重命名为RS-1 system-view undo info-center enab…

day48第九章动态规划(二刷)

今日任务 198.打家劫舍213.打家劫舍II337.打家劫舍III 今天就是打家劫舍的一天&#xff0c;这个系列不算难&#xff0c;大家可以一口气拿下。 198.打家劫舍 题目链接&#xff1a; https://leetcode.cn/problems/house-robber/description/ 题目描述&#xff1a; 你是一个…

synchronized轻量级锁优化

synchronized优化轻量级锁 使用场景 如果一个对象虽然有多个线程访问&#xff0c;但多线程访问时间是错开的&#xff0c;也就是没有竞争&#xff0c;那么可以使用轻量级锁优化&#xff1b; 原理 1、每个线程的栈帧中有锁记录 包括&#xff1a;记录锁对象的地址Object refer…

一次有效沟通的组成

犹记得之前看过一篇文章当中写道 『Tech Lead 作为开发团队的技术负责人&#xff0c;对内对外都起到至关重要的作用。Tech Lead 对外是团队技术能力的展现窗口&#xff0c;需要将团队的技术能力呈现给客户或业务团队。对内他需要和各个角色紧密协作&#xff0c;给非技术角色技术…

50年前的程序员女神,用代码把人类送上月球

1969年7月20日&#xff0c;经过4天飞行的阿波罗11号终于来到了最关键的时刻&#xff1a;降落到月球表面。就在这个时候&#xff0c;飞船计算机突然开始闪烁报警。全球6亿人在观看电视直播&#xff0c;NASA飞行控制中心的气氛让人窒息。人类的首次登月计划面临着艰难的抉择&…