首页 > 技术 > 内容

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

时间:2026-01-17  作者: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


 

 

审核编辑:黄飞

 

猜您喜欢


你是否想过,为什么你的手机可以使用充电宝充电,而笔记本电脑却需要笨重的适配器?这背后,都离不开一种叫做DC/DC转换器的小巧装置。简单来说,DC/DC转换器就像...
2024-03-17 00:00:00
现代生活中,汽车已经成为了我们生活中重要的一部分,而越来越多的电子设备也走进了我们的车厢。从手机导航、行车记录仪到车载冰箱、车载吸尘器,都需要稳定的电源才能正常...
2024-02-13 00:00:00
当今电子设备日益普及的时代,稳定的电源供应成为确保设备正常运行的关键因素。线性直流稳压器作为一种常见的电源解决方案,以其稳定可靠的性能,应用于各种电子设备中,为...
2024-10-01 00:00:00
现代工业和制造业中,配件的作用不可小觑。配件不仅能提升产品的功能性,还能增强其市场竞争力。本文将着重介绍“Accessories_31.9X27.5MM_TM”...
2025-04-26 20:00:07
选购电脑主机时,电源往往是被忽略的一环。许多人只关注CPU、显卡等核心部件,却忽视了电源的重要性。殊不知,电源作为主机的心脏,为所有硬件提供动力,其稳定性直接影...
2024-04-06 00:00:00
贴片电阻上的47R0和470看起来很像,但实际上代表不同的阻值,因此不能直接替换使用。47R0表示阻值为47欧姆。R是字母Ω(欧姆)的缩写,用于区分小数点。 而...
2024-11-29 10:25:44
压铆螺母是常用于金属和塑料材料连接的紧固件,其规格尺寸直接影响到其应用效果和使用安全性。常见的压铆螺母规格有M3、M4、M5、M6、M8等,表示螺纹的直径。每种...
2019-03-20 00:00:00
刻刀套装是专为雕刻和细致切割而设计的工具组合,通常包含多种类型的刻刀和配件,以满足不同的雕刻需求。应用于木工、皮革、陶艺、模型制作等领域。每套刻刀一般包括不同形...
2022-05-27 00:00:00
仪表放大器是用于信号放大的电子设备,应用于传感器信号处理、数据采集和医疗设备等领域。了解仪表放大器的关键参数,有助于选择合适的设备以满足特定需求。增益是仪表放大...
2021-12-03 00:00:00