跨时钟域处理:单比特跨时钟域处理方法汇总

单比特跨时钟域的应用非常广泛,例如不同时钟域之间控制信号的传递、异步复位同步释放电路,都属于单比特跨时钟域的应用场景。下面根据不同的应用场景,总结单比特跨时钟域的处理方法。

整体的处理流程如下:

跨时钟域处理:单比特跨时钟域处理方法汇总

图中,先根据单比特信号是否为复位信号(Reset signal)划分为 2 个分支。

一、复位信号的跨时钟域处理

如果是复位信号,则根据是否为异步复位信号,再次分为两个分支,应用不同的源语:XPM_CDC_SYNC_RST 或者 XPM_CDC_ASYNC_RST。

1.1 同步复位信号

XPM_CDC_SYNC_RST 为同步复位信号同步释放,对应的源语代码为:

   xpm_cdc_sync_rst #(
      .DEST_SYNC_FF(4),   // DECIMAL; range: 2-10
      .INIT(1),           // DECIMAL; 0=initialize synchronization registers to 0, 1=initialize synchronization
                          // registers to 1
      .INIT_SYNC_FF(0),   // DECIMAL; 0=disable simulation init values, 1=enable simulation init values
      .SIM_ASSERT_CHK(0)  // DECIMAL; 0=disable simulation messages, 1=enable simulation messages
   )
   xpm_cdc_sync_rst_inst (
      .dest_rst(dest_rst), // 1-bit output: src_rst synchronized to the destination clock domain. This output
                           // is registered.

      .dest_clk(dest_clk), // 1-bit input: Destination clock.
      .src_rst(src_rst)    // 1-bit input: Source reset signal.
   );

综合后的 RTL 为:

跨时钟域处理:单比特跨时钟域处理方法汇总

RTL 比较简单,就是对原始信号打拍处理。

1.2 异步复位同步释放

XPM_CDC_ASYNC_RST 为异步复位信号同步释放,对应的源语代码为:

   xpm_cdc_async_rst #(
      .DEST_SYNC_FF(4),    // DECIMAL; range: 2-10
      .INIT_SYNC_FF(0),    // DECIMAL; 0=disable simulation init values, 1=enable simulation init values
      .RST_ACTIVE_HIGH(0)  // DECIMAL; 0=active low reset, 1=active high reset
   )
   xpm_cdc_async_rst_inst (
      .dest_arst(dest_arst), // 1-bit output: src_arst asynchronous reset signal synchronized to destination
                             // clock domain. This output is registered. NOTE: Signal asserts asynchronously
                             // but deasserts synchronously to dest_clk. Width of the reset signal is at least
                             // (DEST_SYNC_FF*dest_clk) period.

      .dest_clk(dest_clk),   // 1-bit input: Destination clock.
      .src_arst(src_arst)    // 1-bit input: Source asynchronous reset signal.
   );

综合后的 RTL 为

跨时钟域处理:单比特跨时钟域处理方法汇总

对应的仿真波形:

跨时钟域处理:单比特跨时钟域处理方法汇总

根据仿真波形,可以看出异步复位信号转换成了同步复位信号,并且源语中设定的触发器级数延长复位信号的时长。

二、非复位信号的单比特跨时钟域处理

根据要传输的单比特信号是否为脉冲信号,作分支处理。如果不是脉冲信号,则使用 XPM_CDC_SINGLE 源语,对应的源语代码为:

   xpm_cdc_single #(
      .DEST_SYNC_FF(4),   // DECIMAL; range: 2-10
      .INIT_SYNC_FF(0),   // DECIMAL; 0=disable simulation init values, 1=enable simulation init values
      .SIM_ASSERT_CHK(0), // DECIMAL; 0=disable simulation messages, 1=enable simulation messages
      .SRC_INPUT_REG(1)   // DECIMAL; 0=do not register input, 1=register input
   )
   xpm_cdc_single_inst (
      .dest_out(dest_out), // 1-bit output: src_in synchronized to the destination clock domain. This output is
                           // registered.

      .dest_clk(dest_clk), // 1-bit input: Clock signal for the destination clock domain.
      .src_clk(src_clk),   // 1-bit input: optional; required when SRC_INPUT_REG = 1
      .src_in(src_in)      // 1-bit input: Input signal to be synchronized to dest_clk domain.
   );

对应的 RTL 为:

跨时钟域处理:单比特跨时钟域处理方法汇总

其实就是在原时钟下打一拍,再在目标时钟下打 2~10 拍,以降低亚稳态的传播概率。这种方法也是慢到快时钟的常用方法,当然,如果快时钟下的有效信号时长足够,也可以采用此方法;如果不满足则按照 pusle 的方法处理,也就是 XPM_CDC_PULSE 源语,源语代码为:

   xpm_cdc_pulse #(
      .DEST_SYNC_FF(4),   // DECIMAL; range: 2-10
      .INIT_SYNC_FF(0),   // DECIMAL; 0=disable simulation init values, 1=enable simulation init values
      .REG_OUTPUT(0),     // DECIMAL; 0=disable registered output, 1=enable registered output
      .RST_USED(1),       // DECIMAL; 0=no reset, 1=implement reset
      .SIM_ASSERT_CHK(0)  // DECIMAL; 0=disable simulation messages, 1=enable simulation messages
   )
   xpm_cdc_pulse_inst (
      .dest_pulse(dest_pulse), // 1-bit output: Outputs a pulse the size of one dest_clk period when a pulse
                               // transfer is correctly initiated on src_pulse input. This output is
                               // combinatorial unless REG_OUTPUT is set to 1.

      .dest_clk(dest_clk),     // 1-bit input: Destination clock.
      .dest_rst(dest_rst),     // 1-bit input: optional; required when RST_USED = 1
      .src_clk(src_clk),       // 1-bit input: Source clock.
      .src_pulse(src_pulse),   // 1-bit input: Rising edge of this signal initiates a pulse transfer to the
                               // destination clock domain. The minimum gap between each pulse transfer must be
                               // at the minimum 2*(larger(src_clk period, dest_clk period)). This is measured
                               // between the falling edge of a src_pulse to the rising edge of the next
                               // src_pulse. This minimum gap will guarantee that each rising edge of src_pulse
                               // will generate a pulse the size of one dest_clk period in the destination
                               // clock domain. When RST_USED = 1, pulse transfers will not be guaranteed while
                               // src_rst and/or dest_rst are asserted.

      .src_rst(src_rst)        // 1-bit input: optional; required when RST_USED = 1
   );

对应的 RTL:

跨时钟域处理:单比特跨时钟域处理方法汇总

三、总结

针对不同功能的单比特信号做了分类处理,后续在使用时可以方便的选择对应的源语。

扫码关注尚为网微信公众号

尚为网微信公众号
每天学习电路设计嵌入式系统的专业知识,关注一波,没准就用上了。

原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/1273.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年8月31日
下一篇 2022年9月3日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注