主要介绍高频时钟域下的信号如何传输到低频时钟域下。
例如,高频时钟下的脉冲信号可能不会在低频时钟下被采集到,这时就需要进行处理,让高频信号在低频时钟域下保持至少一个时钟周期。代码实现如下:
module sync(
input wire clk ,
input wire rst1 ,
output reg rst2
);
reg r0_rst = 1'b0 ;
reg r1_rst = 1'b1 ;
always @(*)begin
if(rst1 & !r0_rst)
r0_rst = 1'b1 ;
else if(r1_rst)
r0_rst = 1'b0 ;
else
r0_rst = r0_rst ;
end
always @(posedge clk)begin
if(r0_rst)
r1_rst <= 1'b1 ;
else
r1_rst <= 1'b0 ;
end
always @(posedge clk)
rst2 <= r1_rst ;
endmoudle
代码仅以高有效的复位信号举例,该信号可替换为任意单bit信号的输入。
异步数据处理可通过异步FIFO或双口RAM,握手信号等等方法。对于这些方法的认识其中异步FIFO最为常用,握手信号可能类似于IIC协议中的应答信号之类的,当然跨时钟域的信号处理本人用的最熟悉的还是异步FIFO。