跨时钟域CDC

news/2025/1/15 17:18:32/

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. 两次失效之间的平均时间。
MTBF(TMET)=eTMETC1∗1C2∗fclk∗fdataMTBF(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) beginif(rst) beginmeta1<=0;meta2<=0;synch_out<=0;endelse beginmeta1<=asynch_in;meta2<=meta1;synch_out<=meta2;endendassign 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) beginif(~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) beginif(~rst_n) beginq1_a2b<=0;q2_a2b<=0;sync_out<=0;endelse beginq1_a2b<=q;q2_a2b<=q1_a2b;sync_out<=q2_a2b;endend//always@(posedge clk_a or negedge rst_n) beginif(~rst_n) beginq1_b2a<=0;q2_b2a<=0;endelse beginq1_b2a<=sync_out;q2_b2a<=q1_b2a;endassign 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)
      beginif (rst_n == 1'b0)signal_deb <= {BIT_NUM{1'b0}} ;elsesignal_deb <= # DLY {signal_deb[BIT_NUM-2:0],signal_i} ;
      endalways @ (posedge clk or negedge rst_n)
      beginif (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.ppmy.cn/news/31211.html

相关文章

Java代码是如何被CPU狂飙起来的?

无论是刚刚入门Java的新手还是已经工作了的老司机&#xff0c;恐怕都不容易把Java代码如何一步步被CPU执行起来这个问题完全讲清楚。但是对于一个Java程序员来说写了那么久的代码&#xff0c;我们总要搞清楚自己写的Java代码到底是怎么运行起来的。另外在求职面试的时候这个问题…

Oracle表分区的创建、新增、拆分

Oracle中为了方便管理、查询数据当数据量大于500w或者2G时最好用分区表&#xff0c;常见的一种是使用时间作为分区。 分区表添加新的分区有 2 种情况&#xff1a; (1) 原分区里边界是 maxvalue 或者 default。 这种情况下&#xff0c;我们需要把边界分区 drop 掉&#xff0c;加…

【Python】tqdm 模块

import mathfrom tqdm import tqdm, trange# 计算阶乘 results_1 []for i in range(6666):results_1.append(math.factorial(i))这是一个循环计算阶乘的程序&#xff0c;我们不知道程序运行的具体情况&#xff0c;如果能加上一个程序运行过程的进度条&#xff0c;那可就太有趣…

Excel绘制数据对比表格-表格可视化

Word中生成的表格一般比较单调&#xff0c;若一组数据存在对比的情况时&#xff0c;读者/审稿人难以直接通过详细对比数据来分析&#xff0c;此时若可以将该组数据可视化来对比则为好&#xff0c;Excel则可实现该功能。 关于有些期刊需要提供表格中的数据便于复制等情况时&…

TiDB Server

文章目录TiDB Server架构TiDB Server作用TiDB Server的进程SQL语句的解析和编译SQL读写相关模块在线DDL相关模块GC机制与相关模块TiDB Server的缓存热点小表缓存TiDB Server架构 Protocol Layer、Parse、Compile负责sql语句的解析编译和优化&#xff0c;然后生成sql语句执行计划…

MySQL 中的 distinct 和 group by 哪个效率更高?

先说大致的结论 &#xff1a; 在语义相同&#xff0c;有索引的情况下&#xff1a;group by和 distinct 都能使用索引&#xff0c;效率相同。在语义相同&#xff0c;无索引的情况下&#xff1a;distinct 效率高于group by。原因是 distinct 和 group by都会进行分组操作&#x…

hive 分桶文件的大小多大最合适

hive 分桶文件的大小多大最合适 Hive 分桶文件大小的最佳选择取决于多个因素&#xff0c;例如数据的大小、查询模式、硬件配置和网络带宽等。一般来说&#xff0c;建议将每个桶的大小控制在128 MB到1 GB之间。 以下是一些关于选择分桶大小的建议&#xff1a; 根据数据大小选…

MySQL数据库基础

目录 数据库介绍 什么是数据库 数据库的分类 1. 数据库的操作 创建数据库 显示数据库 使用数据库 删除数据库 2. 表的操作 创建表 删除表 3. 常用数据类型 插入数据 查询数据 从本篇起就又要开始新的篇章了&#xff0c;数据结构初级阶段的就告一段落了&#xff0…