【【深入浅出跨时钟域异步处理方法】】
两个异步跨时钟域下的信号并不会完全保持隔离,有时候也需要交流。所以怎么处理好两个时钟域下的时序问题就显得尤为关键。
这就需要用到一种名为跨时钟域处理的方法( Clock Domain Crossing CDC ) 处理
信号可以分为电平信号和脉冲信号,也可以分为单比特信号和总线信号。
单比特电平信号的跨时钟域处理方法 : 背靠背跨时钟域处理方法
将一个信号分别打了两拍 :
对于单比特脉冲信号的跨时钟域处理,需要比较源时钟和目的时钟的时钟快慢关系。
一 : 如果源时钟相比目的时钟慢,则源时钟的脉冲信号相比目的时钟来说是一个电平信号。这种跨时钟域的处理处理先按照上述的方法进行背靠背结构将脉冲信号打进来,然后再取得这样一个信号的上升沿或下降沿,就能转变成目的时钟域的脉冲信号 。
assign a_fall = (~a_latch) & a_latch_r ; // 采样下降沿 新为0 旧为1
assign a_rise = (a_latch) & (~a_latch_r) ; // 采样上升沿 新为1 旧为0
二 : 若源时钟要比目的时钟快,则源时钟上的脉冲信号,在目的时钟看来可能会变成一个毛刺,因此为了处理这样的问题,需要进行如下的操作
下面附上这里的代码
```c
```c
```c
module clk1toclk2( // 怎么系统的把一个时钟域下的a 转化成另一个时钟域下的b
input clk1 ,
input clk2 ,
input a ,
input rst1_n ,
input rst2_n ,
output b ,
output busy
);
reg a_latch ;
reg b_latch ;
reg b_latch_r ;
reg b_latch_2r ;
reg b_feedback_latch ;
reg c_latch ;
reg c_latch_r ;
// ----------------------------------
always@(posedge clk1 or negedge rst1_n)
begin
if(rst1_n == 0)
a_latch <= 0 ;
else if(a