Art hardware architectures (three) clock domain

Design single clock (synchronous design), as compared with the multi-clock design, this design is easy to implement, and less to produce metastable, and the establishment of hold time violation area.
Multiple clock domains :( In case multiple clock domains, it is prone to a case where the output clock domain arrival of the rising edge of the clock is changed to another clock domain, resulting in a metastable)
frequency (1) different clock
( 2) the same clock frequency, but different phases

Multi-clock processing art designs:
(1) Clock naming convention
example: The system clock can be named sys_clk, transmit clock can be named tx_clk, the receiving clock can be named rx_clk, which can be operated with all clock use wildcards in the script. Likewise, the same clock signal belonging to the domain use the same prefix when naming.
(2) sub-module design
1, each module operates at a single clock
2, the cross-clock domain transmission signal, using a synchronization module, a clock signal entering the domain module, synchronized with the clock module
3, synchronization module size as small as possible
Here Insert Picture Description
across clock domains:
(1) transfer control signals :
to reduce the impact metastable, designers of most common way is to use a multi-stage synchronizer, i.e. two or more flip-flops connected in series together to form synchronizing circuit (using two synchronization circuit is sufficient to avoid metastability, the clock frequency is very high only in the design only requires the use of tri-level sync circuit)
Here Insert Picture Description
transmission (2) data signals :
data from one clock domain often transmit clock domain to another, to ensure the normal data in two ways between different clock domains transmission:
1, using the handshaking mode
2, the use of asynchronous FIFO

一、同频零相位差时钟
唯一要求:保证STA(静态时序分析)通过,如果这一条件满足,就不会出现亚稳态问题和数据丢失或不一致问题。

二、同频恒定相位差时钟
Here Insert Picture Description
当数据从clk1 传输至clk2 时,由于更小的建立时间/保持时间余量,对于组合逻辑的延时约束都会变得更紧,如果组合逻辑的延时能够保证满足采样沿处建立时间和保持时间的要求,数据就可以正确传输,并且没有亚稳态产生(不需要同步器)
一般会创建这种情况以满足时序的要求(通过在发射边沿和捕获边沿加入偏移)

三、非同频、可变相位差时钟
(1)整数倍频率时钟
两个时钟的有效边沿的相位差是可变的,这两个时钟的有效边沿的最小相位差始终等于其中较快的那个时钟的时间周期(以下的图,数据是由快时钟到慢时钟,可能会出现数据丢失,所以必须要将源数据保持至少一个目标时钟周期,可以使用一个简单的FSM实现
Here Insert Picture Description

clk1的频率是时钟clk2的三倍。clk2捕获数据的时间可能是T、2T或3T,取决于数据是在clk1哪一个边沿发送出来,所以应满足任意路径的最差延迟都应在时钟边沿相位差为T时满足建立时间的要求。
由于至少都有较快时钟的一个完整的周期用来传输数据,所以通常可以保证满足建立时间和保持时间的要求,基本不会存在亚稳态或数据不一致的问题,也就无需使用同步器。

(2)非整数倍频率的时钟
由于一个时钟的频率是另一个时钟的非整数倍,所以有效边沿的相位差是可变的。此时两时钟之间的最小相位差足以使亚稳态发生(取决于实际的频率倍数和设计工艺)
1、第一种情况,在源时钟有效沿和目的时钟有效沿之间有足够大的相位差,不会有亚稳态
例如:clk1和clk2分别是clk=30ns的三分频与二分频,即clk1的周期是15ns,clk2的周期是10ns。这两个时钟的最小相位差为2.5ns,对于满足建立时间和保持时间足够了。(以下的图,数据是由慢时钟到快时钟,必须增加逻辑以保证数据在快时钟域中只取样一次,防止数据丢失
Here Insert Picture Description
但是由于该相位差小,应该避免在跨越两个时钟的位置使用任何的组合逻辑(也就是仅仅只能满足建立时间和保持时间),如果需要增加组合逻辑,那么必须使用同步器。

2、第二种情况,源时钟和目的时钟有效沿非常接近,导致产生亚稳态问题。
一旦有时钟边沿接近这种情况出现,下一个时钟周期就会留出足够大的时间冗余,使得数据的捕获不会出现违背建立时间或保持时间的要求。
Here Insert Picture Description
3、第三种情况,两个时钟的时钟沿在许多连续的周期中都非常接近,(与异步时钟类似,但是以上情况下均是有源时钟进行分频信号处理所得到的时钟,所以两个时钟之间的相位差是可以计算的,具有周期性),这种情况下时钟间的相位差异很小,并能持续存在几个周期。clk1=10ns,clk2=9ns
在前两个周期中可能违背建立时间(源时钟在目的时钟之前),而在后两个时钟周期中可能会违背保持时间(目的时钟在源时钟之前)(除了亚稳态问题,数据从慢时钟域传递至快时钟域也可能丢失)

Here Insert Picture Description
为了不丢失数据,数据需要保持稳定至少两个目的时钟周期,既适用于从快到慢的传输,也适用于从慢到快的传输。

四、握手信号方法
Here Insert Picture Description
Here Insert Picture Description
(1)发送端将数据放到数据总线上并发送(xreq)信号,表示有效数据已经发送接受端的数据总线上,途中xreq->yreq1即将xreq同步至yclk时钟。
(2)接收器通过一个同步器,识别yreq2后,锁存数据总线上的数据,并发出确认信号yack
(3)yack信号同步至xclk,产生信号xack1
(4)发送端通过一个同步器,识别xack2。
(5)下一个时钟周期,将下一个数据放到数据总线上
所以安全地将一个数据从发送端传输至接受端需要5个时钟周期。由此看来握手信号的缺点也十分明显,传输单个数据的延迟太长。

握手信号的要求
(1)通过上述分析,接受端锁存数据总线上的数据,至少要经过两个时钟周期,所以数据在发送时钟域内稳定至少两个时钟上升沿
(2)与之前分析相同,当数据由快时钟向慢时钟发送时,请求信号xreq的宽度应该超过两个上升沿时钟

五、同步FIFO
Here Insert Picture Description
同步FIFO的工作原理:在同一个时钟信号下,通过读、写指针产生各自的读、写地址,再通过产生的读、写地址分别从FIFO存储器中读取和写入数据。使用状态模块产生的fifo_empty和fifo_full信号。如果fifo_empty有效,说明FIFO已经“读空”,如果fifo_full有效,说明FIFO已经“写满”。
而在读写指针相等时,FIFO要么空要么满,所以需要对这两种情况进行区分。
(1)写操作使两个指针在下个时钟保持相等,即FIFO满

always@(posedge clk or negedge rst_n)
begin:full_gen
if(!rst_n)
	full<=0;
else if(wr&&(wp+1'b1==rp)
	full<=1;
else
	full<=0;
end

(2)同理,如果使读操作使两个指针在下个时钟保持相等,即FIFO空

always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		empty<=0;
	else if(rd&&(rp+1'b1==wp))
		empty<=1;
	else
		empty<=0;
end

或者采用计数器的方法,计数器复位后初始化为0,之后写操作加一,读操作减一,当计数器为0时,即FIFO空;当计数器为FIFO的宽度时,即FIFO满,但是这种方案会增加额外的硬件(比较器)来产生FIFO空和满的条件。

六、异步FIFO
Here Insert Picture Description
异步FIFO的工作原理:原理上,与同步FIFO的区别在于读写数据工作在不同时钟域下。(与握手信号不同,异步FIFO用于性能要求较高的设计中,延迟比系统资源更为重要)
(1)避免使用二进制计数器,使用格雷码同步实现指针;
由于指针与各自的时钟同步,而彼此的之间异步,使用二进制计数器实现指针,可能会导致用于比较的指针值取样错误。(比如从FFF->000所有位都会发生改变,所以本次采用格雷码进行操作)
(2)数据指针如何在不同时钟域传递
(1)xclk的写指针(二进制)->gray 码 ->经过同步器 ->读写指针比较是否产生“写满”状态
(2)yclk的读指针(二进制) ->gray码 ->经过同步器 ->读写指针比较是否产生"读空"状态
(3)gray码的读写指针如何比较产生读写状态
判断读空时:需要读时钟域的格雷码rgray_next和被同步到读时钟域的写指针wp每一位都相同。
判断写满时:需要写时钟域的格雷码wgray_next和被同步到写时钟域的读指针rp高两位不同,其余各位完全相同。

Published 54 original articles · won praise 4 · Views 1074

Guess you like

Origin blog.csdn.net/buzhiquxiang/article/details/103368697