-
2020-04-12 16:55:00
1.为什么要分析跨时钟域数据传输问题?
-
正常来讲同步时钟域下的数据传输,只要建立和保持时间满足,外部环境(核心电压/温度)没有剧烈变化,一般情况下可以保证数据可靠传输。而异步时钟域在时序约束的时候已经设置了不同的clock group,相互之间的数据是不会进行时序分析的,因此即便是静态时序分析没有报告时序问题也不意味着异步数据传输可以可靠进行。因此说,跨时钟域的数据传输是设计出来的,而不是约束出来的。
-
需要明确的是只要是异步数据传输就必然会有亚稳态的问题,通过一些特殊设计,比如打两拍同步等只能减低亚稳态概率而不能完全消除。因此在设计中应该尽量选择同步设计的方式。若一定要用到异步设计,那也应当处理好跨时钟域数据传输的问题,尽量使得系统对亚稳态错误不敏感。
-
亚稳态其实就是数据没有满足寄存器的建立和保持时间而引发的现象,说白了就是数据到来的时机和采样沿挨得太近,导致寄存器不知道这次数据到底是0还是1,在经历了一段决断时间之后,随机地输出了一个值&#
更多相关内容 -
-
FPGA的跨时钟域信号处理——专用握手信号
2020-07-20 00:45:22在逻辑设计领域,只涉及单个时钟域的设计并不多。尤其对于一些复杂的应用,FPGA往往需要和多个时钟域的信号进行通信。异步时钟域所涉及的两个时钟之间可能存在相位差,也可能没有任何频率关系,即通常所说的不同频... -
跨时钟域的数据传递方法——针对2个同源的时钟信号
2020-07-20 21:23:41本文介绍跨时钟域的数据传递方法,是针对2个同源的时钟信号,大家一起看下。 -
握手信号方法_跨时钟域数据信号传输
2022-04-19 14:27:11使用握信号是最古老的跨时钟域传递数据的方式 将双时钟域分为两个独立系统 2 握手步骤 1 发送器发送xreq信号,表示有效数据已经发送 2 把xreq同步到接收器的时钟域yclk上 3 接收器识别到xreq的同步的信号yreq...目录
1 介绍
使用握信号是最古老的跨时钟域传递数据信号的方式
将双时钟域分为两个独立系统
2 握手步骤
1 发送器发送xreq信号,表示有效数据已经发送
2 把xreq同步到接收器的时钟域yclk上
3 接收器识别到xreq的同步的信号yreq2后,锁存数据总线上的信号
4 接收器发出yack,表示接受了数据
5 发送器在识别同步的xack2后,将下一个数据放到数据总线上
时序图如图
安全的将一个数据发送到接收器需要5个时钟周期
3 握手信号的要求
数据在发送时钟域至少稳定两个时钟上升沿
请求xreq信号的宽度应该超过两个上升沿时钟,否则从高到低时钟传递可能无法捕捉到该信号。
4 握手信号的缺点
传输单个数据的延迟比使用FIFO传输相同的数据延迟要大的多。
5 代码实现
module handshack( input yclk, input yrst_n, input xreq, //请求信号,高电平有效 input[7:0] datain, output yack, //应答信号,高电平有效 output[7:0] dataout ); //req上升沿检测 reg yreq1, yreq2,yreq3; always @(posedge yclk or negedge yrst_n) if(!rst_n) begin reqr1 <= 1'b0; reqr2 <= 1'b0; reqr3 <= 1'b0; end else begin //将xreq跨时钟到yclk,并进行同步 yreq1 <= xreq; yreq2 <= yreq1; yreq3 <= yreq2; end //pos_req2比pos_req1延后一个时钟周期,确保数据被稳定锁存 wire pos_req1 = yreq1 & ~yreq2; //req上升沿标志位,高有效一个时钟周期 wire pos_req2 = yreq2 & ~yreq3; //req上升沿标志位,高有效一个时钟周期 //数据锁存 reg[7:0] dataout_r; always @(posedge yclk or negedge rst_n) if(!rst_n) dataoutr <= 8'h00; else if(pos_req1) //检测到req有效后锁存输入数据 dataout_r <= datain; assign dataout = dataoutr; //产生应答信号ack reg yack_r; always @(posedge yclk or negedge rst_n) if(!rst_n) yackr <= 1'b0; else if(pos_req2)//确保数据被稳定锁存后,发送yack yackr <= 1'b1; else if(!req) yack_r <= 1'b0; assign yack = yack_r; endmodule
参考《硬件架构的艺术》
-
FPGA:跨时钟域数据交互
2016-05-07 14:15:03收藏大神们的牛贴。以便学习。 为了实现OV7725视频采集,同时实时显示于VGA显示器,我们需要将捕获后的数据交给VGA进行实时显示,但...因此我们直接解决了这一个问题,才能完成不同时钟域的数据交互,以保证数据流收藏大神们的牛贴。以便学习。
为了实现OV7725视频采集,同时实时显示于VGA显示器,我们需要将捕获后的数据交给VGA进行实时显示,但我们却不能简单的实现这一功能~~~~(>_<)~~~~,太多人问过我这个问题,今天在这里总结一下!!!
这并非OV7725输入的视频流数据量有多大,也不是因为输入视频数据不连续,而是因为时钟的不同步,造成我们不能直接进行数据的交互。因此我们直接解决了这一个问题,才能完成不同时钟域的数据交互,以保证数据流的连续性,完成实时VGA视频显示的功能。分析OV7725视频采集到显示之间的时钟域,主要有以下几个方面(这里只考虑RGB565/YUV422格式,RAW直接输出12.5MHz):
① 在RGB565/YUV422下,OV7725在25MHz的时钟驱动下,以25MHz的数据时钟的速率,输出8Bit的数据流。
② OV7725输出视频流经FPGA捕获、解码后,以12.5MHz的速率输出拼接后的16Bit像素数据,并且每秒30帧。
③ 针对640*480分辨率,VGA格式为640*480@60Hz,此时VGA的驱动时钟为25MHz(OV7725像素时钟的2倍),帧率为60(与OV7725输出帧率不一致)。
这样,在整个系统的框架中,我们得到了3个时钟域,如下图所示:
3个时钟域的数据交互,涉及到了2次跨时钟域的过程。首先在采集时从25MHz过渡到12.5MHz,在这需要从12.5MHz提升到25MHz给VGA显示。如果我们不经过处理,直接在时钟2驱动下读取时钟1输出的数据,直接跨越了时钟,是否可行?
由于跨时钟域数据的操作,当输入信号从时钟域1跨入时钟域2时,对于时钟域2而言,该数据是一个异步信号。而异步信号造成的亚稳态不稳定性,Bingo过去的文章种豆提到过,这一潜在的危机,也许会造成致命的伤害。为了避免这种情况的发生,实现数据从一个时钟域过渡到另一个时钟域,我们需要需要采用一定的办法,来解决跨时钟数据交互问题。
广义的跨时钟域,不仅仅局限于时钟频率的不同,始终相位的不同也可以认为是跨时钟,典型的2个处理器即便主频一样,也认为为跨时钟域,因为两者相位不可能一样。为了解决跨时钟数据交互,Bingo认为,主要有以下3种方法:
① 采用使能信号实现跨时钟域数据交互
这一方式我们在前面已经多次应用。比如在FPGA与MCU进行SPI总线通信时,FPGA捕获外部输入的SPI_CLK信号,通过边沿采样原理,得到SPI_CLK的上升沿使能时钟(mcu_en)。继而进行使能的判断,读取外部输入的数据,实现跨时钟域数据的交互,框图如下所示:
通过FPGA边沿采样原理,捕获使能时钟来解决跨时钟域数据交互,在FPGA设计中非常的常用。采用使能时钟进行跨时钟域数据交互,实现方式非常的简单,也非常适用于FPGA实现。不过这种方法也有一定的局限性,由于高频时钟能采样到高频时钟,而高频时钟不能采样到低频时钟,因此这决定了数据流只能由低频域向高频域传输时。比如在SPI总线通信中,MCU的时钟相对于FPGA而言,属于低频域。
当外部时钟与FPGA主时钟旗鼓相当时,采用这种方式进行跨时钟与数据交互就会有很大的问题。比如当年Bingo在进行CPLD与STM32的FSMC总线通信时,在FSMC以较低时钟运行时,数据交互完全没有问题;而在设定FSMC以最高速率运行,数据的丢失就很严重。最后用逻辑分析仪观察STM32输入的信号,如下图所示:
同时查阅手册,发现了问题的所在。由于STM32的FSMC以硬件电路运行,能达到很高的速率(实际测试能达到每秒10张以上的1024*768的模拟图片),而在最高速率下,STM32的FSMC总线的WR信号,将在72MHz的主频下运行。问题在于项目中CPLD主时钟为50MHz,因此使用50MHz去采样72MHz的时钟域数据,不出问题才怪……最后,通过更换100MHz的晶振,解决了WR的是能采样问题。
② 采用片内存储器实现跨时钟域数据交互
这个方法主要是利用存储器的双端口读取,由于FPGA片内RAM、FIFO等,都可以设置成双端口读取模式,即独立的读时钟与写时钟。由于双端口 RAM、DCFIFO等读写操作,其固有特性决定了可以在2个时钟域下进行数据的读写操作。双端口RAM与DCFIFO的Module如下图所示:
在跨时钟域读写操作中,将输入连接到时钟域1,将输出连接到时钟域2,通过地址,或者判断存储器内存储的数据,确定数据达到了饱和,开始进行数据的交互。
由于DCFIFO采用的是先入先出机制,同时根据存储的容量判断所存储的跨时钟域数据的量,很容易的就能实现跨时钟与数据的数据交互。个人觉得采用DCFIFO实现跨时钟与数据的交互更容易,更适合。在SDRAM控制器中Bingo就采用了2个DCFIFO实现跨时钟域数据的交互。
采用DCFIFO实现跨时钟域的数据交互的好处在于,能实现低频域到高频域的数据交互,同时由于FIFO有一定的存储量,也可以实现由高频率到低频域的数据交互。在实际项目开发的跨时钟域数据交互中,采用DCFIFO作为交互的中介,非常的使用。
③ 采用SRAM/SDRAM等存储器作为跨时钟域数据交互
由于片内存储器有限,当数据量较大时,采用外部存储器,也能实现跨时钟与数据交互。这里的SRAM/SDRAM相当于双端口RAM。最简单的方式,可以采用2片SRAM/SDRAM,模拟实现双端口RAM,实现循环“时钟域1写、时钟域2读”的乒乓读写机制,框图如下所示:
从乒乓读写操作框图中分析,这种方式实现的跨时域数据交互主要是如下3个过程:
① 在第一时刻,外部数据通过时钟域1写入SRAM1/SDRAM1,同时通过时钟域2读取SRAM2/SDRAM2数据;
② 在第二时刻,外部数据通过时钟域2写入SRAM2/SDRAM2,同时通过时钟域2读取SRAM1/SDRAM1数据。
③ 当SRAM1/SDRAM1写入完毕,并且SRAM2/SDRAM2读取完毕,切换一次乒乓操作。这需要处理SRAM1/SDRAM1写入完毕,而SRAM2/SDRAM2未读写完毕的数据。
以SRAM/SDRAM来实现跨时钟域数据交互,好处在于实现海量跨时钟与数据的处理,能同时实现低频域到高频域,或者高频域到低频与的跨时钟数据转换。另外,SRAM的驱动时序简单,便于实现,但是价格高;而SDRAM的驱动时序复杂,实现困难,但是价格便宜。在实际项目开发中,根据周期与产品的成本敏感程度而定。
上述三种跨时钟域数据交互的方法,在OV7725视频采集显示的设计中,每一种都淋漓尽致的应用到了。处理好跨时钟域数据的交互,有效地提高系统的稳定性,防止数据的错位与丢失,在开发中极为重要。最后,给出Bingo设计的OV7725视频采集系统中,3个跨时钟域数据处理的框图,如下所示:
-
FPGA中跨时钟域数据处理办法
2021-10-09 16:08:57时钟域 假如设计中所有的触发器都使用一个全局网络,比如FPGA的主时钟输入,那么我们说这个设计只有一个时钟域。假如设计有两个输入时钟,如图1所示,一个时钟给接口1使用,另一给接口2使用,那么我们说这个设计中有...-
时钟域
假如设计中所有的触发器都使用一个全局网络,比如FPGA的主时钟输入,那么我们说这个设计只有一个时钟域。假如设计有两个输入时钟,如图1所示,一个时钟给接口1使用,另一给接口2使用,那么我们说这个设计中有两个时钟域。
-
亚稳态
触发器的建立时间和保持时间在时钟上升沿左右定义了一个时间窗口,如果触发器的数据输入端口上数据在这个时间窗口内发生变化(或者数据更新),那么就会产生时序违规。存在这个时序违规是因为建立时间要求和保持时间要求被违反了,此时触发器内部的一个节点(或者要输出到外部的节点)可能会在一个电压范围内浮动,无法稳定在逻辑0或者逻辑1状态。换句话说,如果数据在上述窗口中被采集,触发器中的晶体管不能可靠地设置为逻辑0或者逻辑1对应的电平上。所以此时的晶体管并未处于饱和区对应的高或者低电平,而是在稳定到一个确定电平之前,徘徊在一个中间电平状态(这个中间电平或许是一个正确值,也许不是)。如图2所示,这就是所谓的亚稳态。
一般解决信号亚稳态有三种方法:
相位控制
相位控制技术可以在一个时钟频率是另外一个时钟的数倍,并且其中一个时钟可以由FPGA 内部PLL 或者DLL 控制时使用。
多级寄存器
一般针对单bit控制信号跨越两个异步时钟域传输,可以采用多级寄存器,俗称多打拍。同步电路中的第一拍后也许会产生亚稳态,但是信号有机会在其被第二级寄存以及被其它逻辑看到之前稳定下来。常用的就是对单bit信号打两拍,这也是最简单、最常见的处理方式。
异步FIFO缓存
一般用于跨时钟域传输数据,写端和读端分别对应两个时钟域,由空/满信号控制着读写过程,实现数据的跨域传输。
每种方法应对的情况不同,下面着重介绍最常用的单bit信号消除亚稳态的方法:多级触发器法。- 多级寄存器处理
在全同步设计中,如果信号来自同一时钟域,各模块的输入不需要使用寄存器来寄存。只要满足建立时间和保持时间的约束,可以保证在时钟上升沿到来时,输入信号已经稳定,可以采样得到正确的值。但是如果要采用输入信号的边沿来触发某一过程,则需要寄存来检测上升沿,这是另外一个范畴的问题。
一般而言单bit信号就是我们所用到的脉冲信号或者电平信号。假设A和B是两个时钟域,各自的频率是clk_a和clk_b,clk_a的频率高于clk_b(同频相位差稳定的,不在讨论范围内),那么单bit信号传输分为两种情况。
3.1 信号从B到A(慢到快)
在时钟域B下的脉冲信号pulse_b在时钟域A看来,是一个很宽的“电平”信号会,保持多个clk_a的时钟周期,所以一定能被clk_a采到。经验设计采集过程必须寄存两拍。第一拍将输入信号同步化,同步化后的输出可能带来建立/保持时间的冲突,产生亚稳态。需要再寄存一拍,减少亚稳态带来的影响。一般来说两级是最基本要求,如果是高频率设计,则需要增加寄存级数来大幅降低系统的不稳定性。也就是说采用多级触发器来采样来自异步时钟域的信号,级数越多,同步过来的信号越稳定。特别需要强调的是,此时pulse_b必须是clk_b下的寄存器信号,如果pulse_b是clk_b下的组合逻辑信号,一定要先在clk_b先用D触发器(DFF)抓一拍,再使用两级DFF向clk_a传递。这是因为clk_b下的组合逻辑信号会有毛刺,在clk_b下使用时会由setup/hold时间保证毛刺不会被clk_b采到,但由于异步相位不确定,组合逻辑的毛刺却极有可能被clk_a采到。一般代码设计如下:
always @ (posedge clk_a or negedge rst_n)
begin
if (rst_n == 1’b0)
begin
pules_a_r1 <= 1’b0;
pules_a_r2 <= 1’b0;
pules_a_r3 <= 1’b0;
end
else
begin //打3拍
pules_a_r1 <= pulse_b;
pules_a_r2 <= pules_a_r1;
pules_a_r3 <= pules_a_r2;
end
endassign pulse_a_pos = pules_a_r2 & (~pules_a_r3); //上升沿检测
assign pulse_a_neg = pules_a_r3 & (~pules_a_r2); //下降沿检测
assign pulse_a = pules_a_r2;实际上,具体打几拍背后是有时序收敛的理论作支撑的,对于一般的设计而言,打两三拍就已经足够了。
3.2 信号从A到B(快到慢)
如果单bit信号从时钟域A到时钟域B,那么存在两种不同的情况,传输脉冲信号pulse_a或传输电平信号level_a。实际上,在一般情况下只有电平信号level_a的宽度能被clk_b采集到才可以保证系统正常工作。那么对于脉冲信号pulse_a采取怎样的处理方法呢?可以用一个展宽信号来替代pulse_a实现垮时钟域的握手。
主要原理就是先把脉冲信号在clk_a下展宽,变成电平信号signal_a,再向clk_b传递,当确认clk_b已经“看见”信号同步过去之后,再清掉signal_a。代码通用框架如下:
module Sync_Pulse (
clk_a,
clk_b,
rst_n,
pulse_a_in,pulse_b_out, b_out );
/****************************************************/
input clk_a; input clk_b; input rst_n; input pulse_a; output pulse_b_out; output b_out;
/****************************************************/
reg signal_a; reg signal_b; reg signal_b_r1; reg signal_b_r2; reg signal_b_a1; reg signal_b_a2;
/****************************************************/
//在时钟域clk_a下,生成展宽信号signal_a
always @ (posedge clk_a or negedge rst_n)
begin
if (rst_n == 1’b0)
signal_a <= 1’b0;
else if (pulse_a_in) //检测到到输入信号pulse_a_in被拉高,则拉高signal_a
signal_a <= 1’b1;
else if (signal_b_a2) //检测到signal_b1_a2被拉高,则拉低signal_a
signal_a <= 1’b0;
else;
end//在时钟域clk_b下,采集signal_a,生成signal_b always @ (posedge clk_b or negedge rst_n) begin if (rst_n == 1'b0) signal_b <= 1'b0; else signal_b <= signal_a; end //多级触发器处理 always @ (posedge clk_b or negedge rst_n) begin if (rst_n == 1'b0) begin signal_b_r1 <= 1'b0; signal_b_r2 <= 1'b0; end else begin signal_b_r1 <= signal_b; //对signal_b打两拍 signal_b_r2 <= signal_b_r1; end end //在时钟域clk_a下,采集signal_b_r1,用于反馈来拉低展宽信号signal_a always @ (posedge clk_a or negedge rst_n) begin if (rst_n == 1'b0) begin signal_b_a1 <= 1'b0; signal_b_a2 <= 1'b0; end else begin signal_b_a1 <= signal_b_r1; //对signal_b_r1打两拍,因为同样涉及到跨时钟域 signal_b_a2 <= signal_b_a1; end end assign pulse_b_out = signal_b_r1 & (~signal_b_r2); assign b_out = signal_b_r1;
endmodule
这样一来,实际上clk_a下的脉冲信号“作用”到了clk_b时钟域下,它对于clk_a与clk_b的时钟频率关系没有任何限制,快到慢,慢到快就都没问题了。
总而言之,在设计中可以简单的牢记以下五条原则:
- 再全局时钟的跳变沿最可靠。
- 来自异步时钟域的输入需要寄存一次以同步化,再寄存一次以减少亚稳态带来的影响。
- 不需要用到跳变沿的来自同一时钟域的输入,没有必要对信号进行寄存。
- 需要用到跳变沿的来自同一时钟域的输入,寄存一次即可。
- 需要用到跳变沿的来自不同时钟域的输入,需要用到3个触发器,前两个用以同步,第3个触发器的输出和第2个的输出经过逻辑门来判断跳变沿。
3.3 设计分区同步器模块
在顶层为设计分区是一个好的设计实践行为,这样任何功能模块外面都包含一个独立的同步器模块。这样有利于在划分模块的基础上实现所谓的理想时钟域情况(即整个设计模块只有一个时钟),如下图所示:
对设计进行分区有很多理由。首先,对每个独立的功能模块进行时序分析变得简易,因为模块都是完全的同步设计。其次,整个同步模块中的时序例外也很容易得到定义。再次,底层模块的同步器加时序例外在代入到设计顶层时,大大降低了由于人为失误造成的疏漏。所以,同步寄存器应该在功能模块外单独分区。
-
-
使用握手信号实现跨时钟域数据传输
2022-04-10 17:15:27使用握手信号实现跨时钟域数据传输 题目描述 分别编写一个数据发送模块和一个数据接收模块,模块的时钟信号分别为clk_a,clk_b。两个时钟的频率不相同。数据发送模块循环发送0-7,在每个数据传输完成之后,间隔5个... -
跨时钟域数据同步
2016-07-25 20:47:35在一些较复杂的逻辑设计中,通常会涉及到多个时钟域,在跨时钟域设计时,要保证数据同步,可采用如下策略使得设计满足时序要求: (1) 采用双端口RAM或异步时钟FIFO (2) 利用多级寄存器缓存数据 最近在做数据... -
跨时钟域处理
2018-08-30 09:00:05跨时钟域处理是FPGA和ASIC中非常常见的问题,这里有详细的文档介绍了6中跨时钟域处理的中文文档。 -
FPGA设计之跨时钟域数据传输
2020-04-19 09:59:091.为什么要分析跨时钟域数据传输问题? 正常来讲同步时钟域下的数据传输,只要建立和保持时间满足,外部环境(核心电压/温度)没有剧烈变化,一般情况下可以保证数据可靠传输。而异步时钟域在时序约束的时候已经... -
跨时钟域传输和Verilog代码
2021-07-18 10:30:06结绳法处理单bit信号跨时钟域二、多bit控制信号跨时钟域同步三、多bit数据流跨时钟域同步 前面我们谈到了亚稳态的产生与处理,在异步信号进行跨时钟域传输时,很大概率会产生亚稳态的问题,那么该如何解决跨时钟域... -
亚稳态及跨时钟域处理
2021-01-25 18:54:20本文基于《数字电路中的亚稳态产生原因和处理方法》、《FPGA中的亚稳态》整理所得,虽然这两篇只是针对亚稳态,实质上是在谈论跨时钟域处理,可点击跳转查看之前的文章《CDC:跨时钟域处理》。 1. 亚稳态 1.1 什么是... -
跨时钟域问题
2021-03-15 23:33:01跨时钟域问题 当信号产生于一个时钟域,并穿过该时钟域边界,作用于另一时钟域时,称该信号为跨时钟信号,由– 此引发的一系列问题称之为 CDC(clock domain crossing, 简称 CDC)问题。 跨时钟域风险 1. 亚稳态 ... -
基于FPGA设计跨时钟域的同步策略
2021-01-19 22:25:23但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免。如果对跨时钟域带来的亚稳态、采样丢失、潜在逻辑错误等等一系列问题处理不当,将导致系统无法... -
数据跨时钟域的三种传输方法
2019-03-14 11:33:24 -
FPGA实现跨时钟域传输问题
2021-09-17 08:37:42以单bit跨时钟域讲解说明 (多bits)跨时钟域有异步fifo或者异步双口RAM实现。 分为2种情况,以单Bit信号从慢时钟域到快时钟域和快时钟域到慢时钟域来说明。 文章目录1、慢时钟域到快时钟域2、快时钟域到慢时钟域二... -
【Verilog】CDC跨时钟域同步处理
2022-03-18 14:34:44由于当下的IC/FPGA设计全是基于同步设计,而一个系统不可能只有一个时钟,所以跨时钟域无可避免,而跨时钟域同步处理则是每一个IC/FPGA设计工程师所必须掌握的基础技能。 CDC主要从几个方面考虑: 单bit数据/多bit... -
跨时钟域信号的几种同步方法研究
2021-01-31 07:07:36为使跨时钟域信号能够被目标时钟正确采集,提出并总结了几种同步方法,详尽论述了这些方法所涉及的存储器计算和synthesis设置。跨时钟域信号的同步方法应根据源时钟与目标时钟的相位关系、该信号的时间宽度和多个跨... -
FPGA跨时钟域处理数据总结
2017-12-04 10:26:29跨时钟域的数据传递的方法可以分为好几种,一下介绍两种: 1.打节拍:就是用同一个时钟控制数据的进入,用两个寄存器,这样能造成时钟延时一个周期,这个要注意一下,这种方法是用来外来的信号和咱这个模块的... -
EDA/PLD中的基于FPGA设计跨时钟域的同步策略
2020-10-21 10:32:02但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免。如果对跨时钟域带来的亚稳态、采样丢失、潜在逻辑错误等等一系列问题处理不当,将导致系统无法... -
跨时钟域处理(二):格雷码
2022-02-19 14:25:10在跨时钟域处理(一)中,我们介绍了针对单bit信号的跨时钟域处理方法—使用DFF打两拍,然而这个方法对多bit的数据并不管用。 首先,我们知道,使用DFF打两拍可以基本消除亚稳态的问题,但是无法保证采样得到的数据是... -
单比特信号跨时钟域处理
2020-07-29 21:14:28本文主要介绍单比特信号跨时钟域处理问题,感性趣的朋友可以参考下。 -
《Clock Domain Crossing》 翻译与理解(5)多信号跨时钟域传输
2021-03-17 11:17:16多信号传输和多比特数据跨时钟域传输是不完全相同的,多信号通常指的是多个单比特控制或使能信号,跨时钟域后对某个寄存器或者触发器进行控制,当然本文介绍的传输方法也适用于多比特数据跨时钟域传输。 -
跨时钟域信号处理中同步通信的设计的重要性及解决方法
2021-01-19 21:13:28上次提出了一个处于异步时钟域的MCU与FPGA直接通信的实现方式,其实在这之前,特权同学想列举一个异步时钟域中出现的很典型的问题。也就是要用一个反例来说明没有足够重视异步通信会给整个设计带来什么样的危害。 ... -
FPGA 设计时序篇 —— 跨时钟域问题及解决方法
2021-03-10 22:57:22一、什么是跨时钟域问题 为什么要跨时钟域?就是因为一个时钟域要采集另一个时钟域传输的数据。 举个例子:FPGA外部信号 A 在时钟 CLK1 的节奏下反复旋转跳跃,FPGA需要采集外部信号A,但FPGA采集用的时钟CLK2很可能... -
FPGA设计高级技巧(五)--使用FIFO结构处理多比特跨时钟域信号
2022-04-26 14:34:54跨时钟域传输数据目前用的最多的方法是使用先入先出(FIFO)结构。FIFO可以用于在两个异步时钟域之间传输多比特信号。 通常看到的FIFO应用包括在两个标准总线之间传输数据,以及从可突发访问的存储器中读出数据或者... -
源同步信号跨时钟域采集的两种方法
2020-08-04 01:48:17对于数据采集接收的一方而言,所谓源同步信号,即传输待接收的数据和时钟信号均由发送方产生。FPGA应用中,常常需要产生一些源同步接口信号传输给外设芯片,这对FPGA内部产生时钟或数据的逻辑和时序都有较严格的要求... -
异步FIFO_跨时钟域数据信号传输
2022-04-17 09:54:00在大规模ASIC或FPGA设计中,多时钟系统往往是不可避免的,这样就产生了不同时钟域数据传输的问题,其中一个比较好的解决方案就是使用异步FIFO来作不同时钟域数据传输的缓冲区,这样既可以使相异时钟域数据传输的时序... -
跨时钟域信号传输(二)——数据信号篇
2019-11-22 10:08:20一、使用握手信号进行跨时钟域的数据传输 下面叙述的意义相同:前级时钟=发送时钟; 后级时钟=采样时钟=接收时钟 使用握手信号传输数据不是我们的重点,重点是FIFO的设计。在使用握手信号进行数据传输之前... -
跨时钟域之全握手信号(Verilog)
2021-04-07 14:09:11跨时钟域之全握手信号(Verilog) 1、Verilog的实现 实现多位数据的跨时钟域传输,存在一定的数据延迟 module class_3_clka_clkb#( parameter Width = 31 )( input wire i_clk_a , input wire i_clk_b