精华内容
下载资源
问答
  • CDC跨时钟域处理方法

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

    2018-08-30 09:00:05
    跨时钟域处理是FPGA和ASIC中非常常见的问题,这里有详细的文档介绍了6中跨时钟域处理的中文文档。
  • 本文主要介绍单比特信号跨时钟域处理问题,感性趣的朋友可以参考下。
  • 跨时钟域处理的3大方法,讲的很细,很清楚,很适合初学者的学习
  • Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog 外文经典
  • FPGA跨时钟域处理方式

    2020-01-03 14:42:54
    跨时钟处理有三种方式: 控制信号脉冲检测法,适合于快时钟采慢时钟; 握手信号法,适合慢时钟采快时钟; 异步fifo法,适合大量数据的传输 脉冲检测法 在快时钟的上升沿,使用两级或三级寄存器,检测慢时钟域的...

    FPGA时钟是整个系统的心跳,如果各个模块的心跳异常,会导致手脚不协调。

    跨时钟处理有三种方式

    1. 控制信号脉冲检测法,适合于快时钟采慢时钟;
    2. 握手信号法,适合慢时钟采快时钟;
    3. 异步fifo法,适合大量数据的传输

    脉冲检测法       

    在快时钟的上升沿,使用两级或三级寄存器,检测慢时钟域的使能信号,然后在快时钟域产生一个周期的脉冲信号。

    input    clk;
    input    rst;
    input    wr_en;
    
    reg      wr_r;
    reg      wr_r2;
    wire     pos_wr;
    
    always@(posedge clk ,negedge rst)
    begin
        if(rst)begin
            wr_r <= 1'b0;
            wr_r2<= 1'b0;
        end else 
            wr_r <= wr_en;
            wr_r2 <= wr_r;
        end
    end
    
    assign    pos_wr= !wr_r && wr_r2 ; //写选通信号上升沿,拉高一个周期的脉冲信号

    握手信号法

    快时钟域产生写请求和data,慢时钟域检测到写请求,锁存数据后产生应答信号,快时钟域检测到应答信号后,撤销写请求,至此完成一次写操作。

    module handshack (
        input        clk,
        input        rst_n,
        input        req,
        input  [7:0] datain,
        output       ack,
        output       data_out
    )
    //****************************
    //上升沿信号检测
    reg    req_r ,req_r2,req_r3 ;
    always@ (posedge clk or negedge rst_n)
    begin
        if (!rst_n)begin
            req_r  <= 1'b1 ;
            req_r2 <= 1'b1 ;
            req_r3 <= 1'b1 ; 
        end else begin
            req_r <= req ;
            req_r2 <= req_r ;
            req_r3 <= req_r2 ;
        end
    end
            
    //pos_req2 比 pos_req1 延时一个时钟周期,确保数据被稳定锁存
    wire     pos_req1 =  req_r &&  ~ req_r2 ;
    wire     pos_req2 =  req_r2 && ~ req_r3 ; 
    //***************************************
    // 数据锁存
    reg  [7:0]     dataoutr;
    
    always@(posedge clk or negedge rst_n )begin
        if(!rst_n)
            dataoutr <= 8'h0;
        else if(pos_req1)
            dataoutr <= datain ; //检测到req有效后锁存输入数据
    end
    
    assign dataout =dataoutr
    //**************************************
    //产生应答信号ack
    reg ackr;
    
    always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            ackr <= 1'b0;
        else if (pos_req2)
            ackr <= 1'b1;
        else if(!req)
            ackr <= 1'b0 ;
    end
    
    assign ack =ackr;
    
    endmoudle

    异步fifo法

    读写时钟各自按照两个时钟域的时钟,控制wreq、和req进行读写命令操作。

     

    展开全文
  • 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的综合处理

    后记

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

    展开全文
  • FPGA跨时钟域处理3大方法1 打两拍2 异步双口RAM3 格雷码转换 跨时钟域处理是FPGA设计中不可避免的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者的必修课。如果是还在校生,跨时钟域处理也是面试中...

    FPGA跨时钟域处理3大方法


    跨时钟域处理是FPGA设计中不可避免的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者的必修课。如果是还在校生,跨时钟域处理也是面试中经常常被问到的一个问题。

    这里主要介绍三种跨时钟域处理的方法,这三种方法可以说是FPGA界最常用也最实用的方法,这三种方法包含了单bit和多bit数据的跨时钟域处理,学会这三招之后,对于FPGA相关的跨时钟域数据处理便可以手到擒来。

    这里介绍的三种方法跨时钟域处理方法如下:

    • 打两拍
    • 异步双口RAM
    • 格雷码转换

    1 打两拍

    处理跨时钟域的数据有单bit和多bit之分,而打两拍的方式常见于处理单bit数据的跨时钟域问题。

    打两拍的方式,其实说白了,就是定义两级寄存器,对输入的数据进行延拍。如下图所示。
    在这里插入图片描述应该很多人都会问,为什么是打两拍呢,打一拍、打三拍行不行呢

    展开全文
  • Verilog--CDC跨时钟域处理(快时钟域到慢时钟域)CDC问题单比特信号的跨时钟域问题从快时钟域到慢时钟域从慢时钟域到快时钟域多比特信号的跨时钟域问题异步FIFO握手协议 今天先写单比特信号从快时钟域到慢时钟域的...


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

    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触发器

    展开全文
  • 跨时钟域处理方法总结

    千次阅读 2020-03-08 10:54:00
    目录 跨时钟域处理 1. 异步时序定义 2. 亚稳态 3. 同步策略 方法一:双锁存器 方法二:握手信号(结绳法) 方法三:异步双口RAM+格雷码 跨时钟域处理 为了彻底理...
  • FPGA跨时钟域处理方法

    2021-07-17 20:19:16
    前提条件是 快时钟域到慢时钟域,原因有两个,1)只有快时钟域到慢时钟域,才能保证慢时钟域的脉冲信号能被快时钟域采样到。2)两级寄存器的主要作用是消除亚稳态(不能完全消除亚稳态,但可以使亚稳态出现的概率...
  • 跨时钟域处理--最终详尽版

    千次阅读 多人点赞 2020-03-27 23:30:40
    跨时钟域处理–最终详尽版 文章目录跨时钟域处理--最终详尽版1. 异步时序定义2. 亚稳态3. 单比特同步策略方法一:双锁存器注意问题1注意问题2注意问题34.多比特同步策略控制信号多比特同步同步变化的控制信号控制...
  • 异步fifo跨时钟域处理

    2011-11-30 15:08:16
    使用FPGA内部FIFO做跨时钟域的信息处理,避免亚稳态的传播。
  • 时钟域信号同步到快时钟域处理方法: 两级触发器同步(频率相差2倍以上):不需要考虑快时钟域信号采样的丢失,但可能会采样到冗余信号 边沿检测同步器(频率相差2倍以上):为了避免快时钟多次采样,需要对...
  • FPGA 跨时钟域处理

    2020-08-28 12:38:03
    跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者的必修课。如果是还在校生,跨时钟域处理也是面试中经常常被问到的一个问题。 这里主要介绍三种跨时钟域处理的...
  • 1.电平检测 ...注意跨时钟域同步的时候输出的脉冲必须是寄存器信号,如果需要被同步的脉冲是通过组合逻辑产生的,那么在同步之前一定要在本时钟域下用寄存器抓一拍。比如,clka下通过计数器产生了脉冲信号pls
  • 跨时钟域处理三大方法

    万次阅读 多人点赞 2017-09-07 22:51:54
    跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者的必修课。如果是还在校的本科生,跨时钟域处理也是面试中经常常被问到的一个问题。 在本篇文章中,主要介绍3种...
  • 跨时钟域处理(CDC)

    2021-09-04 10:17:33
    信号跨时钟域传输时,两个时钟的上升沿相位差没有固定关系,所以采样时钟很容易出现建立保持时间违例而采到亚稳态。 不做处理 如图,如果不做处理,A信号建立保持时间违例,导致B为亚稳态,对下游很危险。(B之后是...
  • 点击上方“蓝字”,学习更多干货!在数字电路中,跨时钟域处理是个很庞大的问题,因此将会作为一个专题来陆续分享。今天先来从处理单bit跨时钟域信号同步问题来入手。01握手(handshake...
  • 本文我们主要来讨论一下基于FPGA的跨时钟域信号处理同步设计的重要,希望能对你的学习有所帮助。
  • cdc跨时钟域处理-结绳握手法

    千次阅读 2019-08-13 19:37:00
    对于信号需要跨时钟域处理而言,最重要的就是确保数据能稳定的传送到采样时钟域。 普通的cdc处理方法需要关注时钟域速度的异同,即分慢时钟域到快时钟域、快时钟域到慢时钟域、相位关系等问题,会让人瞬间爆炸。 ...
  • 最近在做一个小项目,里面涉及到了一个单bit的高脉冲跨时钟域处理,是从慢时钟域到快时钟域的,这个网上很多资料而且自己也是用过的方法就是: 慢时钟域信号打1拍后快时钟域打两拍,如下: //慢时钟域打1拍 reg rlow...
  • 跨时钟域处理方式

    2019-01-28 19:19:00
    假如设计中所有的 D 触发器都使用一个全局网络 GCLK ,比如 FPGA 的主时钟输入,那么我们说这个设计只有一个时钟域。假如设计有两个输入时钟,分别给不同的接口使用,那么我们说这个...跨时钟域处理方式: 1、对于...
  • 单bit(脉冲)跨时钟域处理 简要概述: 在上一篇讲了总线全握手跨时钟处理,本文讲述单bit脉冲跨时钟域的处理为总线单向握手跨时钟域处理做准备。脉冲同步器其实就是带边沿检测的单bit同步器,基本原理就是把脉冲信号...
  • 单bit:两级触发器同步(适用于慢到快) ...跨时钟域处理https://www.cnblogs.com/ninghechuan/p/9828705.html 跨时钟域信号传输(一)——控制信号篇 https://www.cnblogs.com/IClearner/p/6485389.html 跨时钟...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,882
精华内容 2,352
关键字:

跨时钟域处理