慢时钟域信号同步到快时钟域的处理方法:
- 两级触发器同步(频率相差2倍以上):不需要考虑快时钟域信号采样的丢失,但可能会采样到冗余信号
- 边沿检测同步器(频率相差2倍以上):为了避免快时钟多次采样,需要对信号进行边沿检测,使用边沿检测同步
- 握手处理(频率相差2倍以下):为了避免快时钟采样丢失,需要进行握手的同步处理
上升沿检测:快时钟先将输入信号进行两级同步处理,再进行一个时钟的延迟,延迟后的信号取反与同步信号做与逻辑。得到信号上升沿
module posedge_detection (
input clk,
input rst_n,
input i_data_in,
output o_rising_edge
);
reg r_data_in1;
reg r_data_in2;
reg r_data_in3;
always@(posedge clk, negedge rst_n) begin
if (!rst_n) begin
r_data_in1 <= 0;
r_data_in2 <= 0;
r_data_in3 <= 0;
end
else begin
r_data_in3 <= r_data_in2;
r_data_in2 <= r_data_in1;
r_data_in1 <= i_data_in;
end
end
assign o_rising_edge = ~r_data_in3 & r_data_in2;
endmodule
是否能将D2取反后与D1做与的逻辑运算,输出D_OUT?
- 不能,跨时钟域的D_IN信号需要在CLK2先进行2级触发器同步,才能得到稳定可靠的