上传者: sunjianty
|
上传时间: 2026-01-28 09:04:19
|
文件大小: 505KB
|
文件类型: DOC
CDC Clock Domain Crossing
CDC (Clock Domain Crossing) 是指在数字电路设计中,信号从一个时钟域到另一个时钟域的传输过程。这种传输可能会引发时序问题,例如时钟偏移、保持时间冲突等。本文将 CDC 分解为两部分:同步时钟域信号处理和异步时钟域信号处理。
同步时钟域信号处理
在全同步设计中,如果信号来自同一时钟域,各模块的输入不需要寄存。只要满足建立时间、保持时间的约束,可以保证在时钟上升沿到来时,输入信号已经稳定,可以采样得到正确的值。但是,如果模块需要使用输入信号的跳变沿(例如帧同步信号),千万不要直接使用。因为 begin ... end 语句段涉及到多个 D 触发器,无法保证这些触发器时钟输入的跳变沿到达的时刻处于同一时刻。
为了解决这个问题,可以使用边沿检测电路,例如:
```vhdl
always @ (posedge Clk) begin
inputs_reg <= inputs;
if (inputs_reg == 1'b0 && inputs == 1'b1) begin
...
end
...
end
```
异步时钟域信号处理
异步时钟域信号处理可以分为单一信号和总线信号处理两部分。
2.1 单一信号处理
如果输入信号来自异步时钟域(例如 FPGA 芯片外部的输入),一般采用同步器进行同步。最基本的结构是两个紧密相连的触发器,第一拍将输入信号同步化,同步化后的输出可能带来建立/保持时间的冲突,产生亚稳态。需要再寄存一拍,减少亚稳态带来的影响。这种最基本的结构叫做电平同步器。
如果需要用跳变沿而不是电平,又可以使用边沿同步器。边沿同步器在电平同步器之后再加一级触发器,用第二级触发器的输出和第三级触发器的输出来进行操作。
2.2 总线信号处理
如果简单的对异步时钟域过来的一组信号分别用同步器,那么对这一组信号整体而言,亚稳态出现的几率将大大上升。基于这一观点,对于总线信号的处理可以有两种方式。
如果这组信号只是顺序变化的话(如存储器的地址),可以将其转换为格雷码后再发送,由于格雷码相邻码字只相差一个比特,上面说的同步器可以很好的发挥作用。
但是如果信号的变化是随机的(如存储器的数据),这种方法便失效了,这时可以采用握手协议来同步总线信号。
CDC Clock Domain Crossing 是数字电路设计中一个非常重要的问题,需要根据具体情况选择合适的同步方法,避免时序问题的出现。