1.前言
一个FPGA设计通常包含多个时钟域,不同时钟域之间进行数据交互就涉及到跨时钟域。根据不同的传输情况,可以分为单bit跨时钟域和多bit跨时钟域。其中,单bit跨时钟域还可以分为快时钟域到慢时钟域和慢时钟域到快时钟域两种情况,多bit跨时钟域一般采用双端RAM或者异步FIFO进行处理。
2.单bit处理
单bit跨时钟域传输的数据信号一般为使能或者标志信号,可以从两方面进行分析——快到慢和慢到快。
慢到快
慢时钟域到快时钟域的数据传输时一定可以被采集到的,但是可能会出现数据冗余(多次采集)的情况,如图所示。

原本在B时钟域只需要一个周期的信号,现在保持了4个B时钟。解决办法是:打两拍(防止亚稳态)+边沿检测(防止数据冗余)。
reg d0,d1,d2; //打拍寄存器
reg flag; //边沿检测标志(DB)
always @(posedge clkb or negedge rst_n)
if(!rst_n)begin
d0 <= 'b0;
d1 <= 'b0;
d2 <= 'b0;
end
else begin
d0 <= DB;
d1 <= d0;
d2 <= d1;
end
assign flag = (~d1 & d2);
快到慢
快时钟域的数据到慢时钟域有可能发生数据漏采的情况,主要原因是快时钟域的数据保持时间短,如下图所示。

很自然的可以想到,解决这种问题的办法就是将快时钟域的信号进行展宽处理,以使慢时钟信号可以采集到。最简单粗暴的方法就是在快时钟域设置一标志,拉高表示单bit信号到来。
reg flag; //展宽信号标志
always @(posedge clka or negedge rst_n)
if(!rst_n)
flag <= 'b0;
else if(DA)
flag <= 1'b1;
然后,慢时钟域对信号flag进行打拍和边沿检测。
3.多bit处理
多bit数据跨时钟域传输一般采用异步FIFO处理。
2556

被折叠的 条评论
为什么被折叠?



