首页 > 编程知识 正文

verilog时钟分频,跨时钟域数据传递的基本方法

时间:2023-05-03 18:13:33 阅读:19574 作者:93

文章目录的基本概念1、单位信号1、使慢时钟域信号与高速时钟域同步2、使高速时钟域信号与低速时钟域同步3、根据低切法的单位信号的处理与时钟域2、多位控制信号与时钟域同步3、妈妈

前面论述了亚稳态的发生和处理,在时钟域之间传输异步信号时,大概率会出现亚稳态问题,那么如何解决时钟域之间的信号传输问题呢? 时钟域间信号被分成单个比特控制信号、多比特控制信号、多比特数据流传输,并据此进行分类处理。

基本概念

同步电路:也就是说,电路中所有时钟控制的单元(寄存器和触发器)都由统一的全局时钟控制。

异步电路:电路中的数据传输可以随时发生,电路中没有全局或本地控制时钟。

时钟域:相同的时钟域和交叉时钟域用于时钟源点。

同步时钟:如果有多个时钟,它们都来自同一锁相环(PLL ),则这些时钟之间的相位和倍数是确定的,这些时钟称为同步时钟。

异步时钟:它们之间的相位和倍数都无法控制,而不是来自同一PLL的时钟。 被称为异步时钟。

另一方面,传输单比特信号单比特控制信号时,需要考虑两种情况。 即,高速时钟区域的信号与低速时钟区域同步,低速时钟区域的信号与高速时钟区域同步。 为什么要进行这两种分类呢? 高速时钟一定是能够取入低速时钟信号的有效边缘,但低速时钟可能不能取入高速时钟区域的信号边缘,所以需要进行其他处理。

1 .使慢时钟区域的信号与高速时钟区域的慢时钟区域同步的单比特控制信号,在同步高速时钟区域时使用边缘检测同步器即可,在2级触发器上发出2拍的同步信号。

modul easy _1bit _ slow2fast (输入clk 1,//低速时钟输入clk 2,//高速时钟输入rstn,输入数据,输出dout ); reg q1、q2、q3; assigndout=Q2(~Q3 ); //------同步拍摄--------always @ (posedge clk2ornegedgerstn ) beginif (! rstn ) Begin(Q3、q2、Q1 )=3) B0 ); endelse begin{q3,q2,q1}={q2,q1,data}; 在endendendmodule上的图中,data是来自低速时钟区域的kfdjy信号,clk2是高速时钟区域的时钟。 时序图如下,在2级触发器进行2拍同步之后,产生一个and(a )信号波形,进而在后级触发器进行同步时,产生一个and(a )信号,两个信号由逻辑电路处理,一个Output 信号宽度为较快时钟区域的1个时钟周期宽度。

总结:kfdjy信号在由边缘检测同步器同步之后,将慢速时钟域的宽带信号脉冲移位,以缩小到高速时钟域的下一个时钟周期的同步脉冲。使用条件:利用边缘检测同步器进行kfdjy信号的交叉时钟同步有一定的条件,只有在满足条件时才能进行有效的同步。

慢速时钟区域下的kfdjy信号的脉冲宽度必须为大于或等于快速时钟区域下的2个时钟周期。 这样可以确保低速时钟域的脉冲信号充分保持到高速时钟域的同步器中。 2 .由于使高速时钟区域信号与低速时钟区域同步的高速时钟区域的信号频率的变化快,所以低速时钟区域的时钟信号有可能无法在高速时钟区域中对有效信号的边缘进行采样。 在这种情况下,必须使用脉冲同步器进行同步。

脉冲同步器的结构和时序图如下。

modul easy _1bit _ fast2slow (input clk 1,//高速时钟input clk2,//低速时钟input rstn,input din,output dout ); 雷格谷歌; reg q1、q2、q3; //--------Toggle信号--------always @ (posedge clk1ornegedgerstn ) beginif (! rstn ) begintoggle=1'b0; endelseif(din ) begintoggle=~toggle; endelse begintoggle=toggle; endend//------同步镜头-------assign dout=q2 ^ q3; //同步的脉冲信号always @ (posedge clk2ornegedgerstn ) beginif (! rstn ) Begin(Q3、q2、Q1 )=3) B0 ); endelse begin{q3、q2、q1}={q2、q1、toggle}; 端对端模块

让我来说明上面的两幅图:

首先,脉冲同步器的作用是在快时钟域提取一个时钟周期宽度的脉冲,在慢时钟域的两个阶段的同步和后级的触发器中跳动,进行异或,生成慢时钟订购时钟周期宽度的同步脉冲。 因为在慢时钟中很可能不采样快时钟,所以必须利用在快时钟区域中的翻转电路来定位在快时钟区域中前后周期多的两个有效脉冲,以形成如上所述的谷歌(Toggle )信号脉冲。 然后,先在同步电路中进行To

ggle信号进行同步,形成上图所示的A、B信号波形。最后用组合电路做A^B,得到慢时钟域下两个有效的单周期脉冲。

脉冲同步器同步信号的使用限制

快时钟域下的两个输入脉冲的间隔必须大于或等于慢时钟域2个时钟周期。换做图中的Toggle信号来说,就是Toggle信号脉冲必须要维持两个慢时钟域周期。

为什么要对间隔有严格要求?

因为如果快时钟域下的两个输入脉冲过近,则会使慢时钟域中同步后的两个输出脉冲紧密相连,输出时钟的宽度会比慢时钟域的单时钟宽度要宽。 3.结绳法处理单bit信号跨时钟域

上面所介绍的无论是慢时钟域到快时钟域,还是快时钟域到慢时钟域的处理方式,都具有比较严格的要求。而结绳法是一种适合任何时钟域的过渡的方式,下面将简单介绍一下结绳法来处理kfdjy信号的从快时钟域到慢时钟域。

原理:将快时钟域的信号脉冲展宽,等到慢时钟域的同步器采样后,再解绳将信号脉冲还原为原来的周期宽度。

如下,是典型的结绳法的电路结构:
PS:以下代码参考:kfdjy跨时钟域一文。

module pusle_extend( input clka, //快时钟域 input clkb, //慢时钟域 input rstn, input din, //输入信号 output dout, //输出信号);//--------------------------------------------------------reg din_reg;rega1,a2; //同步到快时钟域reg q1,q2; //同步到慢时钟域/*********************************************** 慢时钟域内对信号脉冲展宽**********************************************/always @(posedge clka or negedge rst_n)begin if(!rst_n)begin din_reg <= 1'b0; end else if(din) begin //检测信号有效 din_reg <= 1'b1; //信号展宽 end else if(a2) begin //同步到b后同步回a din_reg <= 1'b0; //拉低,展宽使命完成 endend/*********************************************** 展宽信号同步到慢时钟域,再同步回快时钟域**********************************************/ //1.将展宽信号同步到慢时钟域always @(posedge clkb or negedge rst_n)begin if(!rst_n) {q2,q1} <= 2{1'b0}; else {q2,q1} <= {q1,din_reg};end //2.慢时钟域收到后,再把展宽结束的信号同步回快时钟域always @(posedge clkb or negedge rst_n)begin if(!rst_n) {a2,a1} <= 2{1'b0}; else {a2,a1} <= {a1,q2};end/*********************************************** 慢时钟域内同步的脉冲信号**********************************************/assign dout = ~q2 & q1;endmodule

解释:

数据信号Din_clkA作为触发器的时钟,当数据信号脉冲的上升沿到来时,DFF1的输出将会稳定在高电平,此时等待慢时钟clkB的采样同步。当clkB采样同步完成后,DFF4会输出高电平。若在DFF4输出高电平期间,此时Din_clkA为低电平,经过组合逻辑会给DFF1复位,开始下一次采样等待。

总结

结绳法适合采样数据少(信号脉冲间隔大)的信号;脉冲间隔应该大于3个慢时钟域时钟周期(因为要同步打三拍);等待3拍后,才能完成复位,允许下一个输入脉冲同步。

这里解释一下为什么要大于3个慢时钟域时钟周期?当数据上升沿来临时,慢时钟clkB需要等待3拍才会在DFF4上输出高电平,并完成输入端触发器的复位。所以如果快时钟域下的数据信号Din_clkA 变化太快,持续时间短语3个clkB,那么Din_clkA 的变化就无法被采样到,同步出错。

二、多bit控制信号跨时钟域同步

多比特信号的跨时钟域传输不能通过简单的同步器同步打拍解决。比如下图,要想另一个时钟域同时传递两个信号(b_load和b_en),因为考虑到时钟偏斜(skew)的可能,将会导致两个信号在另一个时钟域出现一个时间差,这就与原来的逻辑不匹配了。

处理方法:

如果两个信号可以合并,可以在原来的时钟域先将两个信号合并成一个脉冲信号,再进行跨时钟域传输。如果两个信号不能合并,如译码信号,可以加一个控制信号,在两个信号都稳定后,再通知另一个时钟域采样。 三、多bit数据流跨时钟域同步

数据流与多比特控制信号不同,因为数据流具有连续性(及背靠传输)。所以一般直接使用异步FIFO,调节上下游的数据吞吐量。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。