单比特跨时钟域的应用非常广泛,例如不同时钟域之间控制信号的传递、异步复位同步释放电路,都属于单比特跨时钟域的应用场景。下面根据不同的应用场景,总结单比特跨时钟域的处理方法。
整体的处理流程如下:
图中,先根据单比特信号是否为复位信号(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