如何处理跨时钟域这些基础问题

时间:2025-09-12  作者:Diven  阅读:0

导言

如何处理跨时钟域这些基础问题

在很久之前便陆续谈过亚稳态,FIFO,复位的设计。本次亦安做一个简单的从宏观上给大家展示跨时钟域的解决方案。

什么是亚稳态?

对大多数工程师来讲,亚稳态是非常难以追踪的,因为具有不确定性,在相对规范的设计下,如果仍然发生这个问题,那么可能非常难以复现异常。简单来讲,当触发器不满足建立时间和保持时间要求时,就会导致亚稳态。亚稳态出现时,触发器既不是高逻辑也不是低逻辑,后续电路则可能读取为0或者1(不确定状态),导致电路逻辑做出不符合当前事物逻辑的事情。

对于数字设计人员来讲,只要信号从一个时钟域跨越到另一个时钟域,那么就可能发生亚稳态。我们称为“跨时钟域”即“Clock Domain Crossing”,或CDC。

所以今天主要简单了解如何处理CDC这些基础问题。

同步跨时钟域信号

对大多数初学者来讲,当我们遇到CDCs时,有经验的工程师会告诉我们“打两拍”,即让信号通过两个 flip-flops,每个flip-flop都由新时钟域的时钟驱动(如下图)。第一个触发器出现亚稳态的概率很高,但第二个触发器的输出亚稳态的概率就会低得多。当然更多的flip-flops会让亚稳态的概率进一步下降,但一般下降的概率差距不会太大,如何选择取决于设计者自己。但并非多数CDC问题都能用这种简单方法,这种设计适用于旧时钟域比新时钟域慢的多的情况。经典的可配置的代码如下。

 

 

// Language: Verilog-2001`resetall`timescale 1 ns / 1 ps`default_nettype noneModule sync_signal #(    parameter WIDTH=1, // width of the input and output signals    parameter N=2 // depth of synchronizer)(    input wire clk,    input wire [WIDTH-1:0] in,    output wire [WIDTH-1:0] out);reg [WIDTH-1:0] sync_reg[N-1:0];assign out = sync_reg[N-1];integer k;always @(posedge clk) begin    sync_reg[0] <= in;    for (k = 1; k < N; k = k + 1) begin        sync_reg[k] <= sync_reg[k-1];    endendendModule`resetall

异步复位同步释放

CDC中一个常见的例子就是异步复位,这个问题我在“FPGA复位信号设计讨论“一文中有详细的表述,这里简单讲解,对于初学者而言,不太建议用异步复位,尽管各有优劣,但至少对FPGA设计者而言,这个建议应该是有效的,即使是Xilinx官方也同样建议使用同步复位(UG949)。但有些状态下可能同步复位无效,比如在低功耗设计中,时钟可能在复位前就已经被“无效”,那么异步复位自然成为一个选择。异步复位关键点不在进入复位状态,而在于移除复位,因为移除状态可能会进入亚稳态,除了“FPGA复位信号设计讨论”一文,大家同样可以参阅我翻译的经典论文“同步复位与异步复位”。经典的代码如下所示,但请注意区别此处代码和“打两拍“的区别。

// Language: Verilog-2001`resetall`timescale 1ns / 1ps`default_nettype nonemodule sync_reset #(    // depth of synchronizer    parameter N = 2)(    input  wire clk,    input  wire rst,    output wire out);(* srl_style = "register" *)reg [N-1:0] sync_reg = {N{1'b1}};assign out = sync_reg[N-1];always @(posedge clk or posedge rst) begin    if (rst) begin        sync_reg <= {N{1'b1}};    end else begin        sync_reg <= {sync_reg[N-2:0], 1'b0};    endendendmodule`resetall

很多人争论高电平复位有效好还是低电平复位有效好,一般情况下我常见低电平复位有效,但高电平复位有效也不是没有,一般认为在FPGA中区别不是太大,但在ASIC中,低电平似乎更加常见。

跨时钟握手

有时需要方法来处理CDC,例如从慢时钟到快时钟,从快时钟到慢时钟,这时需要:握手信号,在“AXI4协议逻辑规范以及BUG处理”一文写过握手的注意点。握手的详细技术点感兴趣的朋友可以网上找相关资料。

FIFO

FIFO网上的文章特别多,具体的设计细节有很多需要讨论的地方,但对于跨时钟域而言,FIFO几乎是最方便的数据传输方式。这里不展开讲,之前我写过关于FIFO的相关文章,不是特别详细,接下来会有详细的关于FIFO的计划,在此之前,大家可以看Clifford E. Cummings经典论文,论文真的很推荐。

http://www.sunburst-design.com/papers/CummingsSNUG2008Boston_CDC.pdf


 

 

审核编辑:黄飞

 

猜您喜欢


APD(雪崩光电二极管)是特殊的光电探测器,应用于光通信、激光雷达、医疗成像等领域。与传统的光电二极管相比,APD具有更高的增益和更好的灵敏度,但也存在一些不足...
2025-04-06 22:00:35

现代电子技术中,二极管作为重要的基础元件,应用于整流、开关和信号处理等领域。其中,肖特基二极管和PIN二极管是两种常见的二极管类型。本文将对这两种二极管进行深入...
2025-03-31 13:01:06

电解电容是电子电路中常见的元件。在电路中起到储存和释放电能的作用。本文将介绍电解电容电路板符号的相关知识,帮助读者更好理解这些符号。基本符号电解电容的符号很简单...
2025-03-27 18:30:34


全称为“Temporal and Thermal Aggressive Inrush Adaptor”,是专为应对瞬时大电流冲击设计的保险丝。这种保险丝结合了时...
2020-09-13 04:57:30

自动化已经应用到工业的多个场景里,随着21世纪计算机的高速发展,全球工业水平也大幅度提升,PLC的成熟应用也是工业自动化的重要标志。市场对工业自动化的要求越来越...
2019-07-05 17:55:00

电子元器件中,二极管是最常见的器件。应用于电路中,主要用于整流、限流、稳压等功能。其中,开关二极管和稳压二极管是两种不同类型的二极管,虽然外观可能相似,但在功能...
2025-04-11 17:06:24


其产品在电压参数方面表现出色,深受市场青睐。SSM凭借很好的技术实力和丰富的产品线,为全球电子制造商提供了一系列高品质的铝壳电阻。本文将深入探讨SSM品牌铝壳电...
2017-05-23 08:49:30