精华内容
下载资源
问答
  • Verilog--CDC跨时钟域处理(快时钟域到慢时钟域)
    千次阅读
    2021-04-17 18:28:22


    今天先写单比特信号从快时钟域到慢时钟域的方法,后续继续填坑

    CDC问题

    单比特信号的跨时钟域问题

    从快时钟域到慢时钟域

    设计思想

      从慢时钟域到快时钟域通常使用打两拍的方法,这也适用于从快时钟域到慢时钟域时,但是如果当单比特信号持续时间小于快时钟域的一个周期时,需要用展宽信号再打两拍的方法。

    设计相关代码

    module Sync_Pulse
    (
        input   clka,           //快时钟域
        input   clkb,			//慢时钟域
        input   rst_n,
        input   pulse_ina,      //脉冲或电平信号都可以
        output  pulse_outb,     //脉冲信号
        output  signal_outb     //电平信号
    );
    //--------------------------------------------------------
    reg         signal_a;
    reg         signal_a_r1;
    reg         signal_a_r2;
    reg         signal_b;
    reg         signal_b_r1;
    //--------------------------------------------------------
    //--    a时钟域生成展宽信号
    //--------------------------------------------------------
    always @(posedge clka or negedge rst_n)begin
        if(!rst_n)begin
            signal_a <= 1'b0;
        end
        else if(pulse_ina) begin        //检测到脉冲
            signal_a <= 1'b1;           //拉高
        end
        else if(signal_a_r2) begin      //同步到b后同步回a
            signal_a <= 1'b0;           //拉低,展宽使命完成
        end
    end
    //--------------------------------------------------------
    //--    展宽信号同步到b时钟域再同步回a时钟域
    //--------------------------------------------------------
    always @(posedge clkb or negedge rst_n)begin
        if(!rst_n)begin
            signal_b    <= 1'b0;
            signal_b_r1 <= 1'b0;
        end
        else begin
            signal_b    <= signal_a;
            signal_b_r1 <= signal_b;
        end
    end
    
    always @(posedge clka or negedge rst_n)begin
        if(!rst_n)begin
            signal_a_r1 <= 1'b0;
            signal_a_r2 <= 1'b0;
        end
        else begin
            signal_a_r1 <= signal_b_r1;
            signal_a_r2 <= signal_a_r1;
        end
    end
    //--------------------------------------------------------
    //--    脉冲信号输出,上升沿检测
    //--------------------------------------------------------
    assign pulse_outb = ~signal_b_r1 & signal_b;
    //--------------------------------------------------------
    //--    电平信号输出,b时钟域展宽信号
    //--------------------------------------------------------
    assign signal_outb = signal_b_r1;
    
    
    endmodule
    

    tb文件

    `timescale 1ns/100ps
    module tb_cdc_f2s ();
        
    reg clka;
    reg clkb;
    reg rst_n;
    reg pulse_ina;
    wire pulse_outb;
    wire signal_outb;
    
    
    initial begin
        clka = 0;
        clkb = 0;
        rst_n = 0;
        #10
        rst_n = 1;
    end
    
    initial begin
        pulse_ina = 0;
        #30 
        pulse_ina = 1;
        #2
        pulse_ina = 0;
        #218 
        pulse_ina = 1;
        #2
        pulse_ina = 0;
    end
    
    always #10 clka = ~clka;
    always #20 clkb = ~clkb;
    
    cdc_f2s u_cdc_f2s(
        .clka           (clka),
        .clkb           (clkb),
        .rst_n          (rst_n),
        .pulse_ina      (pulse_ina),
        .pulse_outb	    (pulse_outb),
        .signal_outb    (signal_outb)
    );
    endmodule
    

    Modelsim仿真结果
    在这里插入图片描述

    从慢时钟域到快时钟域

    多比特信号的跨时钟域问题

    异步FIFO

    可以看我这一篇
    https://blog.csdn.net/weixin_44425619/article/details/115406095

    握手协议

    DMUX

    格雷码+双D触发器

    更多相关内容
  • CDC跨时钟域处理方法

    2018-08-14 09:37:05
    根据各种应用场景,详细介绍了各种CDC跨时钟域电路的处理方法
  • CDC跨时钟域处理.rar

    2019-08-09 22:55:39
    跨时钟域基础文档,主要讲解跨时钟域处理方法及基础,值得入门学习
  • CDC跨时钟域处理

    千次阅读 多人点赞 2020-12-10 17:10:23
    CDC(clock domain crossing)检查(跨时钟域的检查)是对电路设计中同步电路设计的检查。非同步时钟没有固定的相位关系,这样Setup/Hold不满足而产生了亚稳态是无法避免的。我们采用同步设计的方法保证亚稳态不会...

    前言(还未整理好)

    CDC(clock domain crossing)检查(跨时钟域的检查)是对电路设计中同步电路设计的检查。非同步时钟没有固定的相位关系,这样Setup/Hold不满足而产生了亚稳态是无法避免的。我们采用同步设计的方法保证亚稳态不会无序的在电路中传播,从而导致功能问题。

    随着当今SOC设计的规模越来越大,时钟越来越多,工作模式越来越复杂。跨时钟域电路不但多,而且非常复杂。 在当今的电路设计中我们通常使用多级同步,异步FIFO,握手等同步设计来保证亚稳态信号不会在电路中无序的传播。

    但同步设计中,同步处理不当依然会出现glitch,多路扇出等问题导致电路实际运行出现故障。
    目前我们的数字设计大部分是基于RTL设计的,直接通过RTL检查"跨时钟域的同步设计" 很难做到100%覆盖的检查,特别是当今SOC中集成大量IP,直接通过RTL检查几乎不可能的。 电路设计中同步电路设计的检查都是使用专门的EDA工具做静态的CDC检查。常用的CDC检查工具有Conformal CDC 和 Spyglass CDC。

    此外CDC检查也是前端sign off 重要项目和数字IC设计工程师的必备的技能。

    第一讲 时钟域

    1.1 什么是时钟

    · 时钟信号是一个按一定电压幅值、一定时间间隔连续发出的脉冲信号

    • 脉冲信号之间的时间间隔称为周期;
    • 将单位时间(如1秒)内所产生的脉冲个数称为频率。

    · 每一次脉沖到来,芯片内的晶体管就改变一次状态,让整个芯片完成一定任务

    · 时钟相当于芯片的脉搏,心脏跳动
    在这里插入图片描述

    时钟偏斜(clock skew)

    时钟偏斜,指的是同一个时钟信号到达两个不同寄存器之间的时间差值,Skew的定义就是时钟最长路径减去最短路径的值
    在这里插入图片描述

    时钟抖动(jitter)

    时钟抖动,指的是两个时钟周期之间存在的差值,这个误差是在时钟发生器内部产生的,和晶振或者PLL内部电路有关。

    1.2 什么是时钟源

    数字电路里一般用晶振提供基本的时钟信号。晶振是晶体振淓器( Quartz Crystal OSC)的简称。
    在这里插入图片描述

    ・有些芯片的一部分时钟来自于其他芯片。它的时钟源就是外部芯片的输出信号。比如芯片12C、SPI接口时钟就来自外部芯片。
    在这里插入图片描述

    • 下面这个电路图就是两个时钟源(CLKA是外部时钟源、clk_osc是晶体振荡器提供的)
      在这里插入图片描述

    1.3 同步时钟

    • 同源,比如分频
    • 有固定的相位关系
      在这里插入图片描述
      右下角的图中:如果C1和C2是一个时钟源,则为同步时钟。

    ASIC中的时钟结构

    在这里插入图片描述

    FPGA中的时钟结构

    • MMCM( Mixed- Mode Clock Manager)混合模式时钟管理器

    • High-performance Clock

    • BUFG(全局时钟缓冲器)

    • BUFH( horizontal clock buffers横向BANK时钟绶冲器)

    • BUFR(用于纵向BANK时钟缓冲器)

    • BUFMR (multi-clock region buffers)

    • BUFIO(用于IO输入输出缓冲)
      在这里插入图片描述

    1.4 异步时钟

    • 不同源
    • 没有固定的相位关系

    下图中,CLKA和CLK_OSC就是异步时钟。
    在这里插入图片描述
    问题:有两个不同频率的时钟A和B。A:clk0 为100MHz,B:clk1为99MHz。他们两个是不是异步时钟?
    不一定!
    问题:有两个相同频率的时钟A和B,他们无固定相位,他们两个是不是同步时钟?
    不是同步时钟!

    1.5 什么是时钟域

    时钟域(Clock Domain)是以捕获时钟划分时钟域

    单时钟(Single clock domain):数据发送和接收一个时钟
    多时钟(Multiple clock domain):数据发送和接收不是一个时钟
    在这里插入图片描述

    1.6 跨时钟域问题

    跨时钟域

    • 若一个电路 launch时钟和 capture时钟不是同一个时钟,就是跨时钟电路
    • 若两个时钟是同步时钟就是同步时钟域
    • 若两个时钟是异步时钟就是异步时钟
      在这里插入图片描述
    • 跨时钟域的例子
    • 单个模块:switches, UART receivers, USB-FPGA interfacing
    • 整个系统:Different clock in a large design, e.g., Socs

    跨时钟域问题

    在这里插入图片描述
    CLK1与CLK2来自不同的时钟源。
    由于时钟源不同,对REG2和REG3来讲,在同一时刻,一个认为REG1的输出是1,另一个认为是0,这必定造成电路判断出现错误。

    第二讲 亚稳态

    2.1 建立时间和保持时间

    • 建立时间t(su)(setup time)

    • 对任何一种触发器,在时钟触发沿前后的一个小时向窗口内,输入信号必须稳定。

    • 触发器的时钟信号上升沿到来以前,数据稳定不变的时间。输入信号应提前时钟上升沿(假设上升沿有效)T时间到达芯片,这个T就是建立时间 Setup time。如不满足setup time,这个正确的数据(或稳定后的数据)就不能被这一时刻时钟打入触发器
      在这里插入图片描述

    • 保持时间t(H)(hold time)

    • 保持时间是指触发器的时钟信号上升沿到来以后,数据稳定不变的时间。如果 hold time不够,数据同样不能被正确打入触发
      在这里插入图片描述

    2.2 什么是亚稳态

    亚稳态

    触发器无法在某个规定时间段内达到一个可确认的状态。亚稳态会带来功能的错误

    亚稳态时

    既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。触发器输岀一些中间级电平,或者可能处于振荡状态。

    亚稳态传播

    这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去
    在这里插入图片描述

    2.3 如何处理亚稳态

    • ①降低系统时钟
    • ②用反应更快的FF
    • ③引入同步机制,防止亚稳态传播
    • ④改善时钟质量,用边沿变化快速的时钟信号

    2.4 二级寄存器

    使用同步器降低亚稳态发生的概率:
    1.亚稳态需要一段时间才能到达稳态
    2.二级寄存器可以增加一个 clock cycle的时间使亚稳态稳定

    在这里插入图片描述

    2.5 MTBF

    平均故障间隔时间MTBF (Mean Time Between Failure )

    在这里插入图片描述
    使用同步器降低亚稳态发生的概率
    两级并不能完全隔离亚稳态危害,但极大的概率隔离了亚稳态发生概率。
    在这里插入图片描述

    第三讲 跨时钟域设计——单比特信号的跨时钟域处理

    3.1 慢时钟域信号同步到快时钟域的处理方法

    两级触发器同步

    慢时钟信号进入到更快的时钟域时(频率相差2倍以上),此时不用考虑快时钟域信号采样的丢失,可以考虑使用两级触发器进行同步处理

    边沿检测同步器

    慢时钟信号进入到更快的时钟域时(频率相差2倍以上),为了避免快时钟多次采样到有效信号,快时钟域需要对信号进行边沿检测。需要使用边沿检测同步器

    握手处理

    当一个慢时钟域的单比特信号进入到更快的时钟域,但是两个时钟频率相差不大(频率相差2倍下),为了避免快时钟采样丢失,需要进行握手的同步处理

    3.2 信号上升沿检测

    快时钟先将输入信号进行两级同步处理,再进行一个时钟的延迟,延迟后的信号取反与同步信号做与逻辑,得到信号的上升沿
    在这里插入图片描述

    3.3 信号下降沿检测

    快时钟先将输入信号进行两级同步处理,再进行一个时钟的延迟,延迟后的信号与取反同步信号后做与逻辑,得到脉冲信号的下降沿
    在这里插入图片描述

    3.4 双沿检测器

    快时钟先将输入信号进行两级同步处理,再进行一个时钟的延退,延迟后的信号与同步信号做异或逻辑,就可得到信号的双沿脉冲。
    在这里插入图片描述

    3.5 快时钟域信号同步到慢时钟域的处理方法

    电平拓展

    如果已知慢时钟域的时钟频率,可以考虑将快时钟域的信号进行电平扩展,使其足以被慢时钟域采样。

    脉冲同步器

    快时钟域中需要同步的信号是脉冲信号,它触发原时钟域的反转电路,每当翻转电路收到脉冲时,电路翻转一次慢时钟域的同步器对翻转后的信号进行采样,和边沿检测,重新在本时钟域恢复出脉冲信号

    握手处理

    当一个快时钟域的单比特信号进入到慢的时钟域,同样可以使用握手的方式进行同步处理

    3.6 脉冲同步器(快时钟域到慢时钟域)

    脉冲同步器的使用中,快时钟域的有效信号需要时单脉冲信号,且两个有效信号的时间间隔需要大于等于两个同步器的时钟周期,否则无法恢复出有效信号
    在这里插入图片描述

    3.7 典型电路案例分析(此处再看)

    对跨时钟域的 Timing path如果不处理容易导致亚稳态。如果做了同步处理,但同步处理不当俨然会出现 glitch,多路扇出,Re-convergence,Datahold等问题导致电路实际运行出现故障

    CLKA domain中,DA1和DA2分别为两个DFF的输出,理想状态下,DA1和DA2到达与门两个输入端的时间是一样的,这样设计就不会出问题。但由于后端布局,环境等因素导致的传播延迟Td会使A&B存在一个 Glitch。而由于CLKB和CLKA为两个 clock domain,之间不存在固定的相位关系,假设这个 Glitch恰好被CLKB锁存住,那么就会在DB2生成一个有效的高电平信号,这个高电平信号不是我们的设计所期望的,那就会导致后继的电路功能出现问题。
    在这里插入图片描述
    错误解决方案
    跨时钟域的多个相关连的单比特信号不可以通过打拍的方式同步到目的时钟域

    第四讲 跨时钟域设计——多比特信号的跨时钟域处理

    4.1 两级触发器的问题

    两级触发器用来处理多比特信号的同步的问题

    • 如果简单的按照单比特信号穿越方法各bit打两拍单独穿越,则会造成各个bit穿越时间不一致(寄存器
      对于每个信号的延迟时间不ー样),则会造成另一个时钟域里面有一些被前一个时钟沿采到了,有些
      被后面的采到了,导致目的时钟域采到的值错误,造成中间态无意义的数据。

    在这里插入图片描述

    两级触发器同步多比特信号的解决方法

    如果多比特信号之间存在逻辑相关性。可以在源时钟域将信号合成一个单一的控制信号然后进行两级寄存器同步
    在这里插入图片描述

    4.2 多比特信号跨时钟域的处理方法

    格需码编码

    通过编码的方式将多位信号转化为每次只有一位变化的信号,将“多比特”的跨时钟域变换成“单比特”进行处理。

    异步FFO

    异步FIFO融合了寄存器同步,格雷码编码,握手控制等处理方式,是处理跨时钟域数据传输最常用的方式。

    握手处理

    所谓握手,是指通信双方使用了专用控制信号进行数据收发的状态指示。这个控制信号既有发送域给接收域的,也有接收域给发送域的,有别于前面的单向控制信号检测方式。类似于DMA与外设模块的通信,会用到dma_req,dma_ack

    4.3 格雷码编码处理跨时钟域

    什么是格雷码

    • 是一种特殊的二进制编码方式,在一定程度上优于二进制编码
    • 可以通过算法与二进制编码进行相互转换
    • 相邻两个编码之间只有一位不同
      在这里插入图片描述

    格码编码的跨时钟域处理

    格雷码的特点是相邻的两个编码之间只有1位不同,消除了在同一个时钟沿,多比特信号或者数据同时变化所带来的跨时钟域问题
    应用局限:只有在数据在相数值间连续变化的情况下才有用,不适用于大多数信号传输或者数据传输的情况。
    在这里插入图片描述

    4.4 异步FIFO

    异步FIFO的特点

    • 异步FIFO的特点是拥有两个相互独立的读写时钟,允许两个独立时钟的频率有较大的差距
    • 跨时钟域的读写地址传输采用格雷码编码,然后加上两级寄存器同步的方式。
    • “满”逻辑用来控制写信号,将读时钟域的读指针同步到写时钟域,在写时钟域进行比较。
    • “空”逻辑用来控制读信号,将写时钟域的写指针同步到读时钟域,在读时钟域进行比较。

    异步FIFO的结构

    • 写控制逻:控割写操作与满信号(wfuI)的判断与产生。
    • 读控制逻辑:控割读操作与空信号(empy)的判断与产生
    • RAM:双端口RAM
    • 二进制码与格雷码转换模块:用于将读写地址二进剖码转成格番码。
    • 跨时钟同步模块:将读地址的格雷码与wclk同步;将写地址的格雷码与rclk同步。主要操作就是两级寄存器同步
      在这里插入图片描述

    在这里插入图片描述

    4.5 多比特跨时钟域的握手处理

    握手方式的原理

    • 握手方式处理跨时钟域数据传输,需要对双方的握手信号(req和ack)分别使用脉冲检测方法进行同步。
    • 在具体实现中,发送域先把数据放入总线,随后发送有效的req信号给接收域。接收域在检测到有效的req信号后锁存数据总线,然后回送一个有效的ack信号表示读取完成应笞。发送域在检测到有效ack信号后撤销当前的req信号,接收域在检测到req撤后也相应撤销ack信号,此时完成一次正常握手通信。
    • 握手方式是一种稳定可靠的同步处理方式,但控制信号握手检测会消耗通信双方较多的时间。
      在这里插入图片描述

    第五讲 跨时钟域设计——握手处理

    5.1 握手的原理

    握手,即通信双方使用约定的控制信号进行数据传输的状态指示。这个控制信号既有发送域给接收域的,也有接收域给发送域的。

    5.2 什么时候使用握手同步处理

    • 通信过程需要保障数据的稳定可靠,并能允许通信过程消耗双方较多的时间
    • 当通信双方不能预知相互的响应时间时,握手能让两个时钟域间实现有效的通信
    • 方式一般使用在总线数据的传输上

    5.3 握手电路的实现

    • 双方对握手信号(req和ack)分别使用脉冲检测方法进行同步。
    • 接收方利用脉冲有效沿对传输的数据进行锁存。
    • 完成数据锁存后通知接收方。
      在这里插入图片描述

    第六讲 跨时钟域设计——异步FIFO

    6.1 异步FIFO的应用

    异步FIFO的作用

    解决两个不同时钟域之间批量数据的高效传递。

    异步FIFO的应用

    数据速率的转换,比如突发速率转换为线性均匀速率( burst write and single read).
    不同时钟域数据快速传输与緩存。
    不同数据位宽的数据接口的匹配。

    6.2 异步FFO的结构

    异步FIFO的一般结构

    • 双端口RAM:用于存储效据。
    • 读控制逻辑:控制读操作与空信号( empty)的判断与产生,属于读时钟域。
    • 写控制逻辑:控制写操作与满信号(wfull)的判断与产生,属于写时钟域。
    • 二进制码与格雷码转换模块:用于将读写地址二进制码转成格雷码。
    • 跨时钟同步模块:将读地址的格雷码与wclk同步;将写地址的格雷码与rclk同步。

    异步FIFO处理的核心问题

    • FIFO深度的计算。
    • 读写地址的编码
    • 控制信号、读写地址的跨时钟域同步
    • 读写控制信号的产生。

    经典异步FIFO的结构一

    将读时钟域的读地址(经格雷码转换后),再同步到写时钟域,进行逻辑比较
    将写时钟域的写地址(经格雷码转换后),再同步到读时钟域,进行逻辑比较
    在这里插入图片描述

    经典异步FFO的结构二

    将读写地址(经格雷码转换后)同步到一个组合逻辑电路中(异步比较)直接比较空满,然后将空满信号同步到各自对应的模块中。
    在这里插入图片描述

    6.3 异步FIFO深度的计算

    异步FIFO深度的计算

    • 计算异步FIFO的深度,需要综合考虑读、写的时钟频率,读、写数据的位宽,读、写的频率等。
    • 写快读慢的情况下,突发 burst写入的数据减去该 burst时间内读出的数据,多余的数据需要能缓冲下来,让接收端在剩下空闲的时间能从容地把多余的数据读出来。
    • 读快写慢的情况下,FIFO的深度最小可以设置为1.

    异步FIFO深度的计算示例1

    • FIFO读、写位宽都为8,写时钟 wclk为100MHz,读时钟rclk为95MHz,写入数据的总长为4Kbit,且两次写操作之间的时间间隔足够大。每一个rclk读取一个数据。求FIFO的深度。

    • 写入的突发长度: burst_length=4K/8=500字节(即T时间内写入了500字节的数据)

    • 要保证FIFO不溢出,那么在T时间内,500字节数据要被全部读出。T=500/100MHz.

    • T时间段读取的数据量为:T95MHz=475字节,FIFO的深度至少要大于等于25

    • 公式总结:fifo_depth= burst_ length-( burst_ length /w_clk)r_cIkX/Y

    • 这里X、Y代表的意思:每Y个rclk会有X个数据读出FIFO

    异步FIFO深度的计算示例2

    • FIFO读、写位宽都为8,写时钟wclk为80MHz,读时钟rclk为40MHz,写入数据的总长为120byte,每2个写时钟写入一个数据,每4个读时钟读取一个数据。求FIFO的深度。

    • 写入的突发长度: burst length=120字节(即T时间内写入了120字节的数据)

    • 等效的写时钟频率wclk=80/2=40M

    • 等效的读时钟频率rclk=40/4=10M

    • 要保证FIFO不溢出,那么在T时间内,120字节数据要被全部读出。T=120/40MHz

    • T时间段读取的数据量为:T*10MHz=30字节,FIFO的深度至少要大于等于90字节

    6.4 异步FIFO读写地址的编码

    异步FIFO读写地址的格雷码编码

    • FIFO的读写地址都是连续的。采用格雷码编码,每次地址的变化,都只有1位数据跳变,有利于信号的跨时钟域同步。

    二进制码转换成格雷码

    转换规则:从最右边一位起(最低位开始),依次与前一位“异或",作为该位的输出,最高位不变

    module BINARY_TO_GRAY(binarycode,graycode);
    	parameter n = 4;
    	
    	input 		[n-1:0]	binarycode;
    	output	reg	[n-1:0]	graycode;
    	
    	integer i;
    	
    	always@(binarycode)begin
    		graycode[n-1] = binary[n-1];
    		for(i=0;i<n;i++)
    			graycode[i] = binarycode[i]^binarycode[i-1];
    	end
    endmodule
    

    格雷码转换成二进制码

    转换规则:最高位不变,从最左边起将产生的每一位二进制码,与下一位相邻的格雷码"异或”,作为二进制码的下一位。

    module GRAY_TO_BINARY(graycode,binarycode);
    	parameter n = 4;
    	
    	input 		[n-1:0]	graycode;
    	output	reg	[n-1:0]	binarycode;
    	
    	integer i;
    	
    	always@(graycode)begin
    		binarycode[n-1] = graycode[n-1];
    		for(i=0;i<n;i++)
    			binarycode[i] = graycode[i]^graycode[i-1];
    	end
    endmodule
    

    6.5 异步FIFO读写时钟域的信号同步

    异步FIFO的跨时钟域信号同步

    • 满”信号控制写逻辑,在写时钟域产生。“满控制信号不需要同步到读时钟域。只需要将写地址进行跨时钟域的同步。
    • “空信号控制读逻辑,在读时钟域产芏。“空”控制信号不需要同步到写时钟域。只需要将读地址进行跨时钟域的同步。
    • 跨时钟域地址同步:将读地址的格雷码与wclk同步;将写地址的格雷码与rclk同步。主要操作就是两级寄存器同步。

    为什么使用两级寄存器同步多比特位宽的地址信号?

    • 异步FIFO读写地址都是连续变化的,在进行两级寄存器同步之前,进行格雷码编码,可以将多比特变化的信号变成每次只有单一比特変化的信号进行同步。

    6.6 异步FFO满空信号的产生

    异步FIFO空满信号的产生

    • 读写控制信号判断与产生是通过对读写地址指针的比较判断出来的
    • 二进制比较:因为跨时钟域同步后的地址是格雷码,需要在本时钟域对地址进行二进制转换
    • 格雷码直接比较:省去了二进制的转换,直接将本时钟域的格雷码编码地址与同步过来的格雷码地址进行比较

    传统二进制比较

    当wren有效,写地址=读地址-1或者写地址=读地址+ FIFO_DEP,full为1.写指针超越读指针
    当rden有效,读地址=写地址-1或者读地址=写地址+FIFO_DEP, empty为1;读指针超越写指针

    格需码直接比较产生空满信号

    • 假如FIFO的深度为8,我们用宽度为4的指针对FIFO进行寻址
    • 如果读指针的最高位为0,而写指针的最高位为1,说明写指针超前于读指针,这时如果读写指针指向同一存储空间(次高位相异),则可判断为full
    • 如果读指针的最高位为1,而写指针的最高位为0,说明写指针发生了回转,这时如果读写指针指向同一存储空间(次高位相异),则可判断为full
    • 当读指针完全与写指针相同时,则判断为 empty
      在这里插入图片描述

    格码直接比较产生空满信号举例

    • 假如FIFO的深度为8,我们用宽度为4的指针对FIFO进行寻址
    • 起初初始化时。Wr_ptr_bin=“0000,rd_ptr_bin=0000、此时,FIFO空”
    • 首先执行8次写操作。Wr_ptr_bin=1100,rd_ ptr bin=0000此时,FIFO满。
    • 然后执行8次读操作。Wr_ptr_bin=“1100,rd_ptr_bin=21100.此时,FIFO空”。
    • 最后执行8次写操作。Wr_ptr_bin=0000,rd_ptr_bin=1100,此时,FIFO满。

    6.7 异步FIFO读写时钟快慢对信号同步的影响

    读写指针的两级寄存器同步所带来的延迟,对空满信号的判断有影响吗

    • 将写指针同步到读时钟域再和读指针比较进行FIFO空状态判断时,因为在同步写指针时需要时间,而在这个同步的时间内有可能还会写入新的数据,因此同步后的写指针一定是小于或者等于当前实际的写指针,所以此时如果FIFO为空”,则实际的写指针可能仍然大于读指针,FIFO并不是真的“空。这样可能会影响FIFO的性能,但是并不会出错。
    • 将读指针同步到写时钟域再和写指针比较进行FIFO满状态判断,同步后的读指针一定是小于或者等于当前的读指针所以此时判断FIFO为满不一定是真满
    • 总结来说异步逻辑转到同步逻辑不可避免需要额外的时钟开销,这会导致满空趋于保守,但是保守并不等于错误,这么写会稍微有性能损失,但是不会出错。

    异步FFO读写时钟频率相差很大,对空满信号的判断有影响吗

    • 假设异步fifo,写时钟500M,读时钟100M,相差5倍。
    • 满信号的判断是在写时钟域,比较同步过来的读指针,由于写时钟500M大于读时钟100M,快时钟采样慢信号,满的判断不会有间题。
    • 空”信号的判断是在读时钟域,比较同步过来的写指针,由于读时钟频率低,采样的写指针可能是离散值(3,6,9).但是采样到的写指针,必定小于写时钟域的写指针。所以判断出来的空”信号,是一个保守的“空”信号。在实际应用中没有问是题。

    第七讲 跨时钟域设计——复位同步问题

    7.1 同步复位和异步复位的特点

    同步复位

    • 复位信号只有在时钟上升沿到来时,オ能有效。复位时间需要大于系统周期,否则,无法完成对系统
      的复位工作。
    • 同步复位可以滤除高于时钟频率的毛刺。是完整的同步设计,有利于时序分析。
    • 同步复位会耗费较多的逻辑资源,并会产生组合逻辑路径延时,复位延时等。

    异步复位

    • 只要综合工艺库有可异步复位的触发器,那么该触发器的数据输入通道就不需要额外的组合逻辑
    • 无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
    • 异步复位设计简单,可以很方便的实现系统的全局复位。

    7.2 异步复位的问题

    异步复位的问题

    • 最大的问题在于它属于异步逻辑,间题出现在复位释放时,如果复位释放接近时钟有效沿,则触发器
      的输出可能进入亚稳态,从而使复位失败
    • 可能因为噪声或者毛刺造成虚假复位信号

    如何解决异步复位的问题

    异步复位同步释放

    7.3 异步复位同步释放

    • 复位信号是异步有效的,即复位的发生与clk无关。后半句“同步释放”是指复位信号的撤除的时侯收到时钟信号的同步(同步释放)。
    • rst_async_n异步复位后, rst_sync_n将拉低,即实现异步复位。当复位信号rst_async_n撤除时,由于双緩冲电路(两级蝕发器)的作用, rst_sync_n复位信号不会随着 rst_async_n的撤除而撤除。
      在这里插入图片描述

    第八讲 跨时钟域设计——跨时钟的代码检查

    8.1 Spyglass功能

    Spyglass

    • Lint
      在RTL阶段对代码的语法,可综合性,结构进行深入分析,并且对代码的错误提供完整、可调试的修改方案
    • SDC
      帮助设计人员在设计的整个流程中生成,验证和管理他们的约東文件。
    • CDC
      提供了业界最完整的多时钟域解决方案,能自动识别各种同步手段(包括 Handshake,FIFO),能采用 Formal引擎验证同步方法在功能上的正确性
    • DFT
      提供了能的骭测ATPG的测试覆盖率分析的能力,基于这个选项,用户可以很容易地预计所作设计的可测试性并且利用工具提供的指导来提高设计的可测试性。
    • Power
      能够让用户能够快速分析出设计中的功耗效率问题,从而在还没有达到后端工序的情况下快速地进行功耗的优化,用户甚至可以在不进行逻辑综合和物理实现的情况下对功耗进行量化的计算。

    Spyglass优势

    Spyglass的检查验证处在设计的前段RTL阶段,枏比较于后端的时序分析和网表验证, spyglass前能更早的发现问题并修正。
    能够让用户能够快速分析出设计中的功耗效率问题,从而在还没有达到后端工序的情况下快速地进行功耗的优化,用户甚至可以在不进行逻辑综合和物理实现的情况下对功耗进行量化的计算。

    Spyglass CDC的特点

    Spyglass CDC检查可以发现仿真、FPGA测试中很难发现的潜在的跨时域处理问题。
    可以检查出复位、时钟是否使用正确,对跨时域设计进行评估检查。

    8.2 Spyglass CDC使用流程

    Spyglass CDC使用方式

    • TCL脚本的方式,TCL方便快捷省去了UI界面上的繁琐操作。
    • 软件UI界面操作,跨时域设计一般设计到的层次较多,界面方式 debug较直观。
    • 通常我们会用脚本启动 Spyglass,走流程,然后在UI界面里面 Debug

    Spyglass CDC所需文件

    • Filelist.f:用户RTL的文件列表。
    • spyglass. sgc: spyglass用的sgdc约東文件。
    • spyglass.tcl:如果是脚本方式启动需要准备tcl脚本文件,并在脚本中对CDC的Goal做声明。

    Spyglass CDC界面方式

    下面是界面方式的使用流程:

    • 建立好文件夹,准备好们elst. spyglass. sgc文件。
    • 打开 Terminal,输入命令: spyglass&。启动 spyglass。
    • 点击 Add File(s),添加filelist和 spyglass.sgdc文件。并点击OK确认。

    8.3 CDC rules check1

    8.4 CDC rules check2

    第九讲 跨时钟域设计——时钟域的综合处理

    9.1时钟的定义

    9.2.同步时钟的约束

    9.3.异步时钟的约束

    9.4.DC的综合处理

    9.5. DC timing分析

    9.6.FPGA的综合处理

    后记

    文章中未展开说明的部分,不是小编目前关注的点。供大家参考。

    展开全文
  • cdc跨时钟域处理-结绳握手法

    千次阅读 2019-08-13 19:37:00
    对于信号需要跨时钟域处理而言,最重要的就是确保数据能稳定的传送到采样时钟域。 普通的cdc处理方法需要关注时钟域速度的异同,即分慢时钟域到快时钟域、快时钟域到慢时钟域、相位关系等问题,会让人瞬间爆炸。 ...

    参考文档

    https://blog.csdn.net/u011412586/article/details/10009761

    前言

    对于信号需要跨时钟域处理而言,最重要的就是确保数据能稳定的传送到采样时钟域。

    普通的cdc处理方法需要关注时钟域速度的异同,即分慢时钟域到快时钟域、快时钟域到慢时钟域、相位关系等问题,会让人瞬间爆炸。

    那么,是否有一种相对稳定,又无需关注传送时钟域和接收时钟域两者时钟速度、相位关系的数据传递方式呢?

    这里仿真验证握手结绳法,自己想的,不知道跟结绳法是不是一致的。。。。。。

    思考方式为:要绝对的保证数据被接收,自然是握手应答机制。

     

    流程

    首先考虑亚稳态说明:对于异步信号的采集,不可避免的会有亚稳态,但亚稳态的恢复时间一般为1个时钟或者两个时钟,同样其不会是0、1的中间值,而是一个开发者无法确定的定值,同时你的时钟频率越高,亚稳态发生的概率就越大。

    网上感觉都说的不明就里,对于简单的使用多级触发器,然后使用最高的2bit进行边沿检测,目测是不行的。

    可以理解为仿真中的x值,但数字电路的本质上是有值的,要么0,要么1。

    所以如果是检测一个信号的上升沿,即使采到亚稳态,那就分两种情况:

    (1)边沿比较陡峭,时钟只采到1次亚稳态,那么边沿寄存器的值就可能为:00、01。检测到00,下一次就会采到01。如果是检测到01,就是想要的沿。

    (2)边沿一点都不陡峭,导致时钟采到两次甚至更多次的亚问题,那这就没得玩了。因为你不知道当前是00\01\10\11,这就可能导致你的后续逻辑完蛋了。

    当然这里第二种情况不予考虑,FPGA内部不太可能出现这么糟糕的上升沿,除非你的时钟过快,在时钟沿到来前,亚稳态还没有恢复过来。

    极端的处理方式是(本质上是滤波):用更多位的寄存器,比如8bit,当检测到为8'b0000_1111,那就是上升沿啦,虽然这阔以绝对可靠的检测到边沿,但检测出沿的所用的时间更长,同时需要保证前级信号的高低电平长度,否则就被滤波了。。。。。。

    所以,信号的边沿陡峭性是很重要的,专业术语叫做:上升时间、下降时间。

    言归正传,那么握手结绳法是咋样的操作呢?

    如下图所示:有点复杂

    如图所示,则操作流程为:上述方法应该是支持多bit数据跨时钟域的,这里的多bit说的是FPGA内部数据,pulse_clk1表示发送数据使能,clk1检测到使能则拉高pulse_delay_clk1开始结绳。在clk2中,检测到clk1中的结绳信号的上升沿则产生pulse_clk2,clk2检测到pulse_clk2则启动clk2中的结绳pulse_delay_clk2,在clk1中检测到clk2中的结绳信号为高则解掉clk1的结绳。在clk2中检测到clk1的结绳拉低,则解绳clk2中的结绳信号pulse_delay_clk2,完成传输。

    待传送数据在clk2的结绳上升沿被采样。

    busy信号为clk1中的信号,在clk1的发送数据使能到来则拉高,在pulse_delay_clk2的下降沿则拉低。

    可以看到,这种方式只适合少量的慢速的数据传输。

     

    源代码

     

    `timescale 1ns/1ps
    module cdc_test (
        input               i_clk1               ,
        input               i_clk2               ,
        // input               i_rst_n              ,
        input               i_en_clk1            ,
        input     [15:0]    i_data_clk1          ,
        output              o_busy_clk1          ,
        output              o_valid_clk2         ,
        output    [15:0]    o_data_clk2             
    );
    ////clk1
    ////clk1的发送使能边沿检测
    reg [1:0] r_en_clk1_edge = 2'b00;
    always @(posedge i_clk1)
    begin
        r_en_clk1_edge <= {r_en_clk1_edge[0],i_en_clk1};
    end
    reg r_en_clk2 = 1'b0;clk2的使能边沿检测
    reg [1:0] r_en_clk2_edge = 2'b00;
    always @(posedge i_clk1)
    begin
        r_en_clk2_edge <= {r_en_clk2_edge[0],r_en_clk2};
    end
    reg r_en_expand = 1'b0; clk1的使能延长
    always @(posedge i_clk1)
    begin
        if (r_en_clk1_edge == 2'b01) 
            r_en_expand <= 1'b1;
        else if (r_en_clk2_edge == 2'b01)
            r_en_expand <= 1'b0;
    end
    reg r_busy_clk1 = 1'b0; 传输忙碌指示,忙碌的时候clk1的数据不可发生改变
    always @(posedge i_clk1)
    begin
        if (r_en_clk1_edge == 2'b01)
            r_busy_clk1 <= 1'b1;
        else if (r_en_clk2_edge == 2'b10)
            r_busy_clk1 <= 1'b0;
    end
    
    ////clk2
    reg [1:0] r_en_expand_edge = 2'b00; clk1的扩展后的使能边沿检测
    always @(posedge i_clk2)
    begin
        r_en_expand_edge <= {r_en_expand_edge[0],r_en_expand};
    end
    
    always @(posedge i_clk2) ////clk2中的使能
    begin
        if (r_en_expand_edge == 2'b01)
            r_en_clk2 <= 1'b1;
        else if (r_en_expand_edge == 2'b10)
            r_en_clk2 <= 1'b0;
    end
    
    reg r_valid_clk2 = 1'b0;
    always @(posedge i_clk2)
    begin
        if (r_en_expand_edge == 2'b01) 上升沿表示数据有效
            r_valid_clk2 <= 1'b1;
        else 
            r_valid_clk2 <= 1'b0;
    end
    reg [15:0] r_data_clk2 = 16'd0;
    always @(posedge i_clk2)
    begin
        if (r_en_expand_edge == 2'b01) 上升沿刷新数据
            r_data_clk2 <= i_data_clk1;
    end
    
    ////信号输出
    
    assign o_busy_clk1  = r_busy_clk1;
    assign o_valid_clk2 = r_valid_clk2;
    assign o_data_clk2  = r_data_clk2;
    
    
    endmodule // end the cdc_test model

     

    仿真看看。

    可以看到数据正确传输,不管是快到慢还是慢到快。

    以后再板级测试啦。

    以上。

     

    展开全文
  • 跨时钟域处理CDC

    千次阅读 2021-09-04 10:17:33
    信号跨时钟域传输时,两个时钟的上升沿相位差没有固定关系,所以采样时钟很容易出现建立保持时间违例而采到亚稳态。 不做处理 如图,如果不做处理,A信号建立保持时间违例,导致B为亚稳态,对下游很危险。(B之后是...

    单比特数据CDC处理

    1、理论知识

    信号跨时钟域传输时,两个时钟的上升沿相位差没有固定关系,所以采样时钟很容易出现建立保持时间违例而采到亚稳态。

    如果不做处理会出现亚稳态

    如图,如果不做处理,A信号建立保持时间违例,导致B为亚稳态,对下游很危险。(B之后是正常的逻辑电路)
    在这里插入图片描述

    使用两级同步器处理

    两级同步器能降低亚稳态发生的概率,注意是概率!(通过计算MTBF(平均错误间隔时间),时间很长),只是使信号变为稳态再往下传输,保证安全但并不保证正确。(以后再研究如何保证正确,猜测应该是做了啥处理,使信号即使出现错误也不影响逻辑)
    如图,A信号建立保持时间违例,导致B为亚稳态,但是由于有F3的存在,使其有足够的时间恢复稳态,所以C信号为稳态,对下游是安全的
    注意:对亚稳态采样的值是不确定的,很可能想传一个1,但是由于亚稳态变成了0,就会出现错误,想了很久,现在也不懂如何避免这个错误
    在这里插入图片描述

    2、单比特数据CDC处理方法

    ①单比特CDC—慢到快

    跨时钟信号的宽度 > 采样时钟的两个周期 → 两级同步

    直接使用两级同步即可

    跨时钟信号的宽度 < 采样时钟的两个周期 → 先脉冲扩展,再两级同步

    先脉冲扩展,把脉冲信号的宽度扩展为 大于 采样时钟的两个周期,再使用两级同步。

    ②单比特CDC—快到慢

    这种情况下,跨时钟信号的宽度(最小为快时钟的一个周期)肯定 小于 采样时钟(慢)的两个周期

    跨时钟信号的宽度 < 采样时钟的两个周期 → 先脉冲扩展,再两级同步

    先脉冲扩展,把脉冲信号的宽度扩展为 大于 采样时钟的两个周期,再使用两级同步。

    ③快慢不确定

    在SOC中经常会使用软件配置时钟频率导致跨时钟域的快慢不确定

    握手处理

    A时钟域向B时钟域发送req信号,保持为高
    B时钟域对req打两拍采样到1,再返回ack信号
    A时钟域对ack打两拍采样到1,拉低req
    在这里插入图片描述

    3、多比特跨时钟域

    多比特跨时钟域打两拍存在的问题

    两个信号同时变化有延迟,导致采样时钟采样错误,本来应该是同时拉高,但是跨过来之后错开了。
    在这里插入图片描述

    解决方法

    ①多比特信号合并为单比特信号

    如果需要跨时钟域的信号存在逻辑关系,可以合并为单比特信号再跨时钟域传输
    在这里插入图片描述
    在这里插入图片描述

    ②格雷码

    把多比特信号转为格雷码再进行跨时钟域传输。保证同一时刻只有1bit变化
    二进制码转为格雷码:二进制码右移一位,和原值异或

    assign gray = (bin << 1) ^ bin
    

    格雷码转为二进制码:bin[i] = 格雷码右移i位做 位异或

    bin[i] = ^(gray >> i)
    

    ③使用单比特握手信号

    使用握手信号req和ack
    A时钟域和B时钟域握手,握手期间保证传输的多bit数据稳定不变(稳定的数据可以随便跨时钟域)
    在这里插入图片描述
    在这里插入图片描述

    ④使用异步FIFO

    数据通过FIFO传输
    读写指针(格雷码)跨时钟域传输

    展开全文
  • CDC(Clock Domain Crossing) 由于当下的IC/FPGA设计全是基于同步设计,而一个系统不可能只有一个时钟,所以跨时钟域无可避免,而跨时钟域同步处理则是每一个IC/FPGA设计工程师所必须掌握的基础技能。 CDC主要从几个...
  • 跨时钟域CDC总结

    2022-01-21 15:34:11
    跨时钟域2.单bit信号的跨时钟域传输(1).慢时钟域到快时钟域(2).快时钟域到慢时钟域3.多bit信号的跨时钟域传输(1).MUX同步器(2).握手协议(3).异步FIFO 1.跨时钟域 对于跨时钟域的信号传输问题,从信号的性质方面考虑...
  • 多个时钟来自不同的来源,而由这些时钟驱动的逻辑单元部分为时钟域,这些异步时钟域之间的接口信号称为时钟域交叉(CDC)路径。 如图一,divCLK是由CLK分频得到的,所以divCLK和CLK为同步时钟,也是属于同一个时钟域的...
  • (大疆2020数字芯片)下列关于多bit数据跨时钟域处理思路,错误的有() A. 发送方给出数据,接收方用本地时钟同步两拍再使用; B. 发送方把数据写到异步fifo,接收方从异步fifo里读出; C. 对于连续变化的信号,...
  • 跨时钟域问题
  • Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog 外文经典
  • 跨时钟域CDC)3.2.CDC问题——亚稳态3.3.CDC问题——数据收敛 一、什么是亚稳态? 亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。 导致触发器出现亚稳态的根本原因是由于输入信号不满足触发器的...
  • 如果 CDC 信号在时钟域之间传递时不能被跳过,则在时钟域之间传递时考虑信号的宽度和同步技术很重要。 与同步器相关的一个问题是,来自发送时钟域的信号可能会在采样之前更改两次值,或者可能过于接近较慢时钟域的...
  • CDC(一)总线全握手跨时钟域处理

    千次阅读 2021-04-03 16:47:56
    在芯片设计过程中,一个系统通常是同步电路和异步电路并存,这里经常会遇到CDC也就是跨时钟域处理的问题,常见的处理方法,可能大家也已经比较熟悉了,主要有单bit跨时钟处理、多bit跨时钟处理两大类,本文以一个...
  • FPGA跨时钟域处理方法

    2021-07-17 20:19:16
    前提条件是 快时钟域到慢时钟域,原因有两个,1)只有快时钟域到慢时钟域,才能保证慢时钟域的脉冲信号能被快时钟域采样到。2)两级寄存器的主要作用是消除亚稳态(不能完全消除亚稳态,但可以使亚稳态出现的概率...
  • 这篇文章可能帮助您:1、了解什么是跨时钟域设计(CDC);2、如何进行单bit信号的跨时钟域传输。
  • 单比特信号的跨时钟域传输3.多比特信号的跨时钟域传输 1.CDC简介 含义:Clock Domain Conversion(时钟域转换) 场景:跨时钟域传输(数据从ck_a 传输至 ck_b) 存在问题:亚稳态现象 含义:触发器无法在某个规定的...
  • 跨时钟域信号处理-Clock Domain Crossing(CDC
  • 跨时钟域处理解析(二)(Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog)
  • 这篇文章可能帮助您:1、了解什么是跨时钟域设计(CDC);2、如何进行多bit信号的跨时钟域传输。
  • 跨时钟域(CDC)

    千次阅读 2021-07-18 20:51:59
    时钟域a的数据adat需要传输到时钟域b,由于adata对于bclk是异步的,所以有可能adata在DFF的建立时间的窗口期内发生跳变,造成bdat1是一个不确定的状态,也就是DFF出现了亚稳态,注意,跨时钟域并不一定会出现亚稳态...
  • 总线半握手跨时钟域处理 简要概述: 在上一篇讲了单bit脉冲同步器跨时钟处理,本文讲述控制信号基于脉冲同步机制的总线单向握手跨时钟域处理。由于是单向握手,所以比全握手同步效率高一些。 总线半握手同步器应用...
  • 跨时钟域处理解析(一)(Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog)
  • 跨时钟域处理

    2022-04-23 18:21:32
    建立时间(tsu):触发器时钟信号上升沿到来以前,数据稳定不变的时间; 保持时间(th):触发器时钟信号上升沿到来以后,数据稳定不变的时间; tsu和th都是为了可靠地对数据进行采样,时钟边沿触发事件,同步设计...
  • 单比特信号的跨时钟域传输 慢时钟域到快时钟域 快时钟域到慢时钟域 多比特信号的跨时钟域传输 异步FIFO 握手协议 前言 CDC(Clock Domain Conversion)问题,一直是IC前端设计,FPGA设计的热点问题,特别是在校招...
  • 本文基于《数字电路中的亚稳态产生原因和处理方法》、《FPGA中的亚稳态》整理所得,虽然这两篇只是针对亚稳态,实质上是在谈论跨时钟域处理,可点击跳转查看之前的文章《CDC跨时钟域处理》。 1. 亚稳态 1.1 什么是...
  • 跨时钟域之全面解析

    千次阅读 多人点赞 2020-07-04 17:33:47
    跨时钟域(Clock Domain Crossing,CDC)信号处理问题,首先要考虑的就是亚稳态。 1.亚稳态 亚稳态是指在设计的正常运行过程中,信号在一定时间内不能到达稳定的0或者1的现象。 在多时钟设计中,亚稳态是不可避免的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 384
精华内容 153
关键字:

cdc跨时钟域处理