数字IC设计——跨时钟域篇3(单比特处理)
Posted 摆渡沧桑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字IC设计——跨时钟域篇3(单比特处理)相关的知识,希望对你有一定的参考价值。
数字IC设计——跨时钟域篇3(单比特处理)
下面介绍常见的单比特跨时钟域的处理方法
一、慢时钟域信号同步到快时钟域的处理方法:
-
两级寄存器同步
慢时钟信号进入到更快的时钟域时(频率相差2倍以上),此时不用考虑快时钟域信号采样丢失问题,可以考虑使用两级触发器进行同步处理。 -
边沿检测同步器
慢时钟信号进入到更快的时钟域时(频率相差2倍以上),为了避免快时钟域多次采样到有效信号,快时钟需要对信号进行边沿检测。需要使用边沿检测同步器 -
握手处理(单比特比较少用)
当一个慢时钟域的单比特信号进入到更快的时钟域,但是两个时钟频率相差不大(频率相差2倍以下),为了避免快时钟采样丢失,需要进行握手的同步处理
二、边沿检测
之前说了如果慢时钟信号进入快时钟域信号,并且频率相差较大,那么快时钟域可以一直采样到慢时钟域信号,为了只在上升沿和下降沿或者双边沿采样到值,因此需要使用到边沿检测同步器。
之前写过一篇博客,可以参考:
FPGA基础入门篇(四) 边沿检测电路
数字IC设计verilog编写——3边沿检测
-
上升沿检测
快时钟先将输入信号进行两级同步处理,再进行一个时钟的延迟,延迟后的信号取反与同步信号做与逻辑,得到信号的上升沿。
-
下降沿检测
快时钟先将输入信号进行两级同步处理,再进行一个时钟的延迟,延迟后的信号与取反后同步信号做与逻辑,得到脉冲信号的下降沿。
-
双沿检测
快时钟先将输入信号进行两级同步处理,再进行一个时钟的延迟,延迟后的信号与同步信号做异或逻辑,就可得到信号的双沿脉冲。
-
边沿检测的verilog RTL代码:
module edge_detect(
clk,
rstn,
signal_a,
pos_edge_flag,
neg_edge_flag,
double_edge_flag
);
input clk,rst;
input signal_a;
output pos_edge_flag, neg_edge_flag,double_edge_flag;
reg signal_reg_1,signal_reg_2,signal_reg_3;
//sync
always @(posedge clk or negedge rstn) begin
if (!rstn)
{signal_reg_3,signal_reg_2,signal_reg_1} <= 3'b000;
else
{signal_reg_3,signal_reg_2,signal_reg_1} <= {signal_reg_2,signal_reg_1,signal_a};
end
//pos_edge falg pull up
assign pos_edge_flag = signal_reg_2 & !signal_reg_3;
//neg_edge falg pull up
assign neg_edge_flag = !signal_reg_2 & signal_reg_3;
//double_edge flag
assign double_edge_flag = signal_reg_2 ^ signale_reg_3;
endmodule
说明:
在跨时钟域处理时,首先对单比特信号进行二级同步的处理得到稳定的信号,然后第三级在处理边沿检测。总共需要三拍的操作。
三、快时钟域到慢时钟域处理方法
快时钟域信号同步到慢时钟域的处理方法:
-
电平拓展
如果已知慢时钟域的时钟频率,可以考虑将快时钟域的信号进行电平扩展,使得足以被慢时钟域采样。 -
脉冲同步器
快时钟域中需要同步的信号是脉冲信号,它出发原时钟域的翻转电路,每当翻转电路时,电路被翻转一次,慢时钟域的同步器对翻转后的信号进行采样,和边沿检测,再重新在本时钟域恢复出脉冲信号。具体RTL设计可以参考之前写的一篇博客:
数字IC设计verilog编写——6脉冲同步器脉冲同步器的原理结构图:翻转电路 + 边沿检测电路
局限性:
1.脉冲需要是单脉冲信号
2.多个脉冲之间需要大于两个需要同步时钟域周期以上(边沿检测)。如果小于2个周期,可能最终的信号恢复出来的高电平脉冲连在一起或者重叠为一个周期。
3.不能用在快时钟域采样慢时钟域
-
握手处理(稳定可靠,不管是单比特还是多比特,均可采用)
当一个快时钟的单比特信号进入到慢时钟域,同样可以使用握手的方式进行同步处理。
四、典型电路
- 跨时钟域的多个相关连的单比特信号不可以通过打拍的方式同步到目的时钟域。
对跨时钟域的timing path如果不处理,容易导致亚稳态。
如果做了同步处理,但同步处理不当俨然会出现glitch,多路扇出问题,re-convergence,datahold等问题导致电路实际运行出现故障。
CLKA domain中,DA1和DA2分别为两个DFF的输出,理想状态下,DA1和DA2到达与门两个输入端的时间是一样的,这样设计就不会出现问题。
但是后端布局环境等因素,导致的传播延迟Td会使A&B存在一个glitch(信号到达与门的时间不一致)。而由于CLKB和CLKA为两个CLK Domain,之间不存在固定的相位关系,假设这个glitch恰好被CLKB锁存住,那么就会在DB2生成一个有效的高电平信号,这个高电平信号不是我们的设计所期望的,那就会导致后续的电路功能出现问题。
跨时钟域的多个相关联的单比特信号不可以通过打拍的方式同步到目的时钟域。
错误使用方法:(异步单bit控制信号组合逻辑输出的错误使用)
正确的解决方案(在原来时钟域先进行打拍处理):
以上是关于数字IC设计——跨时钟域篇3(单比特处理)的主要内容,如果未能解决你的问题,请参考以下文章