C/C++教程

IC常用知识6-信号跨时钟同步

本文主要是介绍IC常用知识6-信号跨时钟同步,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 1. 单bit信号跨时钟域传输
    • 1.1 电平同步器
    • 1.2 边沿检测器
    • 1.3 脉冲同步器
    • 1.4 电平延展-快到慢
  • 2. 多bit信号跨时钟域传输
    • 2.1. 握手
    • 2.2. 异步FIFO
    • 2.3 使用异步双口RAM
    • 2.4 DMUX
  • 3. 相关题目
    • 3.1 设计一个脉冲检测器
    • 3.2 介绍一下各种同步设计的优缺点
    • 3.3相关选择题

1. 单bit信号跨时钟域传输

按照信号用途将单bit跨时钟同步器分为:电平同步器,边沿检测器和脉冲同步器。
小结:

  1. 单bit信号传输我们要考虑它的实际用途,比如是串行数据信号,那么我们就需要知道比特率才能采样,如果是控制信号,我们需要是通过电平还是时钟沿进行控制。
  2. 单bit快到慢传输,快时钟需要时钟拓展;慢到快则直接打两拍的效果是电平同步

1.1 电平同步器

所谓电平同步器,顾名思义是将有用的电平信号同步至另一时钟域,电平信号需要在原时钟域保持至少两个时钟周期。其同步方法是将信号经过两个D触发器,即打两拍
image.png

1.2 边沿检测器

边沿检测器的原理是在电平同步器的输出加一个触发器(第一级可能存在亚稳态,利用二三级触发器结果判断信号是上升沿还是下降沿)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HyxsBLF7-1618539128392)(https://upload-images.jianshu.io/upload_images/9246563-fb1305938ad82022.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

1.3 脉冲同步器

脉冲同步器的作用是检测原时钟域的脉冲并在新时钟域上产生一个新的脉冲
image.png
以上是较为简单的脉冲同步器,此脉冲同步器对于某些情况下是不可靠的,若要可靠的完成脉冲的同步,可以引入握手机制。具体的握手机制如下:
若源时钟域脉冲来临,且同步器处于空闲状态,则向同步器发出同步请求;
同步请求信号到达目的时钟域,目的时钟域产生应该信号表示同步完成;
源时钟域检测到应答信号后清楚请求信号;
目标时钟域检测到源时钟域请求信号清除后清除应答信号;
同步器回到空闲状态,进行下一个脉冲的同步;

1.4 电平延展-快到慢

CLR高电平有效

module Sync_Pulse(
    input           clka,
    input           clkb,
    input           rst_n,
    input           pulse_ina,
    output          pulse_outb,
    output          signal_outb
);
//-------------------------------------------------------
reg             signal_a;
reg             signal_b;
reg             signal_b_r;
reg             signal_b_rr;
reg             signal_a_r;
reg             signal_a_rr;
//-------------------------------------------------------
//在clka下,生成展宽信号signal_a
always @(posedge clka or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        signal_a <= 1'b0;
    end
    else if(pulse_ina == 1'b1)begin
        signal_a <= 1'b1;
    end
    else if(signal_a_rr == 1'b1)
        signal_a <= 1'b0;
    else 
        signal_a <= signal_a;
end
//-------------------------------------------------------
//在clkb下同步signal_a
always @(posedge clkb or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        signal_b <= 1'b0;
    end
    else begin
        signal_b <= signal_a;
    end
end
//-------------------------------------------------------
//在clkb下生成脉冲信号和输出信号
always @(posedge clkb or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        signal_b_r <= 'b0;
        signal_b_rr <= 'b0;
    end
    else begin
        signal_b_rr <= signal_b_r;
        signal_b_r <= signal_b;
    end
end
assign    pulse_outb = ~signal_b_rr & signal_b_r;
assign    signal_outb = signal_b_rr;
//-------------------------------------------------------
//在clka下采集signal_b_rr,生成signal_a_rr用于反馈拉低signal_a
always @(posedge clka or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        signal_a_r <= 'b0;
        signal_a_rr <= 'b0;
    end
    else begin
        signal_a_rr <= signal_a_r;
        signal_a_r <= signal_b_rr;
    end
end
endmodule

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jpn5diKF-1618539128394)(https://upload-images.jianshu.io/upload_images/9246563-5c05464f8cba4bc1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

image.png
两种电路图的功能一致。在参考链接2中也有一个设计,但是设计复杂,优点是每个触发器采取的是时钟触发。
参考链接:
https://blog.csdn.net/qq_21842097/article/details/88657046
https://blog.csdn.net/Reborn_Lee/article/details/96714098
https://www.cnblogs.com/iclearner/p/6579754.html

2. 多bit信号跨时钟域传输

2.1. 握手

2.2. 异步FIFO

2.3 使用异步双口RAM

2.4 DMUX

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WibGwZi4-1618539128396)(https://upload-images.jianshu.io/upload_images/9246563-8f5bf16e45faeea8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

由图可见,DMUX有一个MUX和一个触发器构成,在数据输入使能有效的时候采样端口信号,数据输入使能无效的时候数据保持。在VCS综合中会综合成为低功耗设计,增加一个门控电路。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4H4DhOsW-1618539128397)(https://upload-images.jianshu.io/upload_images/9246563-ad9ac4b396be3c16.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

小结:DMUX的原理类似于脉冲检测器

3. 相关题目

3.1 设计一个脉冲检测器

image.png

image.png
根据这个时序图,d_req是根据d_in产生的,根据d_ack截止的。d_req从s到d,再从d_到s变为ack。

3.2 介绍一下各种同步设计的优缺点

  1. 双触发器同步法:它的根本目的是为了减少亚稳态的发生,它有很多局限性,比如快时钟向慢时钟传递有可能采样不到
  2. 双触发器+反馈回路:它的目的就是时钟展宽,然后在进行同步,它的缺点是如果源时钟数据变化太快,展宽后会被覆盖
  3. 握手法:其实单bit握手的电路就是法2,因此它的缺点一样是数据不能变化太快
  4. 异步FIFO:它都适用,目前没发现缺点。

3.3相关选择题

  1. 异步时钟数据采样方法错误的是()D
    A 单bit高频时钟脉冲展宽后给低频时钟进行采样
    B 握手信号后再采样
    C 使用FIFO隔离进行多bit采样
    D 高频时钟直接采样低频时钟的多bit数据
  2. 以下不能对多bit的数据总线的时钟异步处理的是()C
    A. DMUX synchronizer
    B. Gray_code
    C. 寄存器同步
    D. AFIFO
  3. 高频时钟域的总线数据(每时钟周期都变化)传递给低频时钟域时,哪种同步方式正确()B
    A. 使用握手信号进行同步
    B. 使用异步FIFO
    C. 使用同步FIFO
    D. 使用打两拍进行同步
    解析:握手的使用缺陷是数据不能变化太快,每次握手需要等待一定的时钟周期
  4. 对于双触发器异步处理电路说法正确的是 BCD
    A. 对任何单bit信号都可以用此电路
    B. 各个寄存器之间不能有组合逻辑
    C. 需要考虑两个时钟的频率和信号的宽度
    D. 无法绝对避免亚稳态
  5. 下面哪种异步处理的方法完全正确()C
    A. 在对数据总线进行异步处理前转化为格雷码,然后打拍处理,同步后,再转化成源码
    B. 在模块A,有两个控制信号通过正确的同步方法把两个信号进行同步到B时钟域,然后再在B时钟域对两个信号进行逻辑运算
    C. 实现异步FIFO时,在地址穿越时钟域前转化为Gray-Code
    D. 单bit信号在跨越时钟域前不需要寄存器输出
    解析:数据总线是乱变的,而地址总线是递增的,而gray码在相邻状态机之间的跳变只有一位发生了变化
  6. 下列跨时钟域设计存在的问题是()B
    A. FIFO设计地址跨时钟域,可以通过格雷码转换+打2拍的方式
    B. 希望得到C=A&B,AB在clkx域,c在clky域,则单独用clky打A和B2拍产生Adly2, Bdly2,然后在进行组合逻辑
    C. 单bit跨时钟域,在目的时钟域打3拍后使用,打拍过程中不带组合逻辑
    D. 一组数据总线跨时钟域,如果数据有足够的持续不便时间,可以通过握手机制实现
  7. 150M时钟域的多bit信号A[63:0]需要同步到50MHz时钟域,可能使用的同步方式有()ABD
    A. DMUX
    B. 双向握手
    C. 打拍
    D. 异步FIFO
  8. 假设一个3bit计数器(计数范围为0-6)工作在38M时钟域下,要把此计数器的值传递到100M的时钟域,以下方式不正确的是()C
    A. 锁存+握手
    B. 使用DMUX电路
    C. 使用格雷码
    D. 使用异步FIFO
    解析:虽然格雷码可以裁剪,但它的要求是状态数必须是偶数,0-6有7个状态是不满足条件的。
    以下关于跨时钟域信号处理描述不正确的是()
    A. 并不是所有的跨时钟域信号都需要做异步处理
    B. 当单比特脉冲信号需要跨时钟域进行同步时,只需在目标时钟将此信号同步两拍即可
    C. 对与跨时钟阈的数据传输,通常可以采用异步FIFO的方法
    D. 对于跨时钟域的多比特信号传输,可以采用握手信号来处理
这篇关于IC常用知识6-信号跨时钟同步的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!