跨越时钟域

发布时间:2023-12-26  

设计可以使用多个。每个在内部形成一个“域”,如果在另一个中需要在一个中生成的信号,则需要格外小心。

本文引用地址:

跨1-信号

假设 clkB 域中需要来自 clkA 域的信号。 它需要“同步”到 clkB 域,因此我们要构建一个同步器设计,它从 clkA 域获取一个信号,并在 clkB 域中创建一个新信号。

在第一种设计中,我们假设与 clkA 和 clkB 时钟速度相比,“信号输入”变化缓慢。
您需要做的就是使用两个触发器将信号从 clkA 移动到 clkB。

module Signal_CrossDomain(    

input clkA, 

// we actually don't need clkA in that example, but it is here for completeness as we'll need it in further examples    input SignalIn_clkA,    

input clkB,   

output SignalOut_clkB

);

// We use a two-stages shift-register to synchronize SignalIn_clkA to the clkB clock domain

reg [1:0] SyncA_clkB;

always @(posedge clkB) SyncA_clkB[0] <= SignalIn_clkA;   // notice that we use clkB

always @(posedge clkB) SyncA_clkB[1] <= SyncA_clkB[0];   // notice that we use clkB

assign SignalOut_clkB = SyncA_clkB[1];  // new signal synchronized to (=ready to be used in) clkB domain

endmodule

两个触发器具有延迟信号的副作用。

例如,在以下波形中,您可以看到慢速移动的信号被两个触发器同步(和延迟)到 clkB 域:


跨时钟域 2 - 标志

另一个时钟域的标志

如果需要跨越时钟域的信号只是一个脉冲(即它只持续一个时钟周期),我们称之为“标志”。 以前的设计通常不起作用(标志可能会丢失,或者看到时间过长,具体取决于所使用的时钟的比例)。

我们仍然希望使用同步器,但该同步器适用于标志。

诀窍是将标志转换为电平变化,这样可以更容易地跨越时钟域。

module Flag_CrossDomain(

    input clkA,

    input FlagIn_clkA,   // this is a one-clock pulse from the clkA domain

    input clkB,

    output FlagOut_clkB   // from which we generate a one-clock pulse in clkB domain

);

reg FlagToggle_clkA;

always @(posedge clkA) FlagToggle_clkA <= FlagToggle_clkA ^ FlagIn_clkA;  // when flag is asserted, this signal toggles (clkA domain)

reg [2:0] SyncA_clkB;

always @(posedge clkB) SyncA_clkB <= {SyncA_clkB[1:0], FlagToggle_clkA};  // now we cross the clock domains

assign FlagOut_clkB = (SyncA_clkB[2] ^ SyncA_clkB[1]);  // and create the clkB flag

endmodule

现在,如果您希望 clkA 域收到确认(clkB 收到标志),只需添加繁忙信号即可。

module FlagAck_CrossDomain(

    input clkA,

    input FlagIn_clkA,

    output Busy_clkA,

    input clkB,

    output FlagOut_clkB

);

reg FlagToggle_clkA;

always @(posedge clkA) FlagToggle_clkA <= FlagToggle_clkA ^ (FlagIn_clkA & ~Busy_clkA);

reg [2:0] SyncA_clkB;

always @(posedge clkB) SyncA_clkB <= {SyncA_clkB[1:0], FlagToggle_clkA};

reg [1:0] SyncB_clkA;

always @(posedge clkA) SyncB_clkA <= {SyncB_clkA[0], SyncA_clkB[2]};

assign FlagOut_clkB = (SyncA_clkB[2] ^ SyncA_clkB[1]);

assign Busy_clkA = FlagToggle_clkA ^ SyncB_clkA[1];

endmodule

跨越时钟域 3 - 任务

在另一个时钟域中完成任务

如果 clkA 域中有任务需要在 clkB 域中完成,则可以使用以下设计。

这是一种方法

module TaskAck_CrossDomain(

    input clkA,

    input TaskStart_clkA,

    output TaskBusy_clkA, TaskDone_clkA,

    input clkB,

    output TaskStart_clkB, TaskBusy_clkB,

    input TaskDone_clkB

);

reg FlagToggle_clkA, FlagToggle_clkB, Busyhold_clkB;

reg [2:0] SyncA_clkB, SyncB_clkA;

always @(posedge clkA) FlagToggle_clkA <= FlagToggle_clkA ^ (TaskStart_clkA & ~TaskBusy_clkA);

always @(posedge clkB) SyncA_clkB <= {SyncA_clkB[1:0], FlagToggle_clkA};

assign TaskStart_clkB = (SyncA_clkB[2] ^ SyncA_clkB[1]);

assign TaskBusy_clkB = TaskStart_clkB | Busyhold_clkB;

always @(posedge clkB) Busyhold_clkB <= ~TaskDone_clkB & TaskBusy_clkB;

always @(posedge clkB) if(TaskBusy_clkB & TaskDone_clkB) FlagToggle_clkB <= FlagToggle_clkA;

always @(posedge clkA) SyncB_clkA <= {SyncB_clkA[1:0], FlagToggle_clkB};

assign TaskBusy_clkA = FlagToggle_clkA ^ SyncB_clkA[2];

assign TaskDone_clkA = SyncB_clkA[2] ^ SyncB_clkA[1];

endmodule

下面是一个匹配的仿真波形

跨越时钟域 4 - 数据总线

数据总线到另一个时钟域

为了将数据总线(2 位宽或更高)从一个时钟域移动到另一个时钟域,我们可以使用多种技术。

这里有一些想法。

格雷码:如果数据总线是单调计数器(即仅递增或递减),我们可以将其转换为格雷码,该格雷码具有跨时钟域的能力(在某些时序条件下)。

数据冻结:如果数据总线是非单调的,则使用标志向另一个域发出信号以捕获该值(当它在源时钟域中冻结时)。

数据突发:如果数据总线有许多需要跨越时钟域的连续值,请使用异步 FIFO,从源时钟域推送值,然后从另一个域读回值。

文章来源于:电子产品世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    FPGA图像处理方法详解; 图像在采集和传输的过程中,通常会产生噪声,使图像质量降低,影响后续处理。因此......
    跨越时钟域(2023-12-26)
    下波形中,您可以看到慢速移动的信号被两个触发器同步(和延迟)到 clkB 域: 跨时钟域 2 - 标志 另一个时钟域的标志 如果需要跨越时钟域的信号只是一个脉冲(即它只持续一个时钟周期),我们......
    【vivado约束学习四】跨时钟域路径分析; 【vivado约束学习四】跨时钟域路径分析 若要查看跨时钟域路径分析报告,可选......
    8的例子,若使用格雷码,则应该是7(0100)--8(1100),这样就只有1个bit的变化了(最高位),这样就将多bit信号的跨时钟域转变成了单bit信号的跨时钟域,而单个bit的跨时钟域......
    功率放大器在电感式传感器金属颗粒材质识别中的应用; 实验名称: 功率放大器在电感式传感器金属颗粒材质识别中的应用 实验目的: 采用一种双锁相放大电路,将颗粒产生的复数域信号转化为一对直流信号。提出一种基于模糊隶属度函数的信号处理方法......
    迟) 技术在读数据通路上,采用了两种可选的、独特的采样方式进行数据转换,而不像其他DDR物理层供货商采用FIFO进行跨时钟域转换,此技术将延迟降低到最小,节省了硅面积。 True-Adaptive......
    频率,记住亚稳态本身与时钟没有任何关系,但是它和 MTBF 相关。自然的,我们会说一个可靠性好的电路具有很高的 MTBF 值。 ①:经典的处理方法......
    。为了能够在FPGA上无故障地运行电路,同步时钟分布是必不可少的。事实上,这是避免过多的时钟偏移(clock skew)和不可预测的时钟延迟的唯一方法。这意味着内部生成的时钟既不是波纹时钟(从FF时钟分频器产生的时钟信号......
    同步。 对在给定时钟域中使用同步复位方法的设计来说,使用标准的亚稳态解决电路(两个背对背触发器)就足以把全局复位引脚同步到特定的时钟域。这个同步复位信号可以利用触发器上的同步SR 端口初始化该时钟域......
    偏移(clock skew)和不可预测的时钟延迟的唯一方法。这意味着内部生成的时钟既不是波纹时钟(从FF时钟分频器产生的时钟信号),也不是门控时钟(从组合逻辑门中派生的时钟,如多路复用器)。这种......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>