单bit信号的跨时钟域采集verilog
1.慢时钟→快时钟
用快时钟采集慢时钟域下的信号比较简单,因为快时钟通常可以稳定采集到慢时钟域下的信号。通常有电平检测、边沿检测两种。
①打拍
在快时钟域下对需要采集的慢时钟域信号打两拍,目的是降低亚稳态影响。
注意:数据变化间隔>慢时钟周期+2*快时钟周期+路径延时。这样才能保证所有变化被采集到。
②边沿检测
若慢时钟域产生的是组合逻辑输出,在同步之前需要在慢时钟域下打一拍以避免毛刺。之后在快时钟域对其打拍并检测上升(下降)沿,并作为输出即可。
2.快时钟→慢时钟
用慢时钟采集快时钟域下的信号稍微复杂一点,因为可能会出现漏检。常用脉冲同步和展宽结绳的方法。
①脉冲同步
从快时钟域中取出单时钟周期脉冲宽度,并在慢时钟域中输出该时钟域下的单脉冲宽度信号。
首先在快时钟域下采集信号的上升(下降)沿,并设置一个标志信号toggle,该信号在出现上升(下降)沿时翻转,其他时间保持不变。然后讲toggle信号在慢时钟域下打两拍进行同步。最后对其进行逻辑异或,便可得到同步脉冲。
参考代码:************************
module sync_clk(
input clk_fast,
input clk_slow,
input data_in, //快时钟域信号
input rstn ,
output data_out //慢时钟域信号
);
reg toggle;
reg data_in_d;
always@(posedge clk_fast of negedge rstn) begin
if(!rstn)
data_in_d <= 1'b0;
end
else
data_in_d <= data_in;
always@(posedge clk_fast of negedge rstn) begin
if(!rstn)
toggle<= 1'b0;
end
else if (data_in & ~data_in_d)
toggle<= ~toggle;
reg [2:0] toggle_d;
always@(posedge clk_slow or negedge rstn)
if (!rstn)
toggle_d <= 2'b00;
else
toggle_d <= {toggle_d[1:0],toggle};
assign data_out = toggle_d[2] ^toggle_d[1];
endmodule
参考波形***********************************************************************
②展宽结绳
该方式是通过讲快时钟域下的信号边沿脉冲延长,直到慢时钟采集到时,再反馈给快时钟域一个标志信号,进行还原(解绳)。
但是该方式适合采集的数据较少。
代码***********************************
module sync_clk(
input clk_fast,
input clk_slow,
input data_in, //快时钟域信号
input rstn ,
output data_out //慢时钟域信号
);
reg signal_flag;
reg [2:0]signal_flag_d; //慢时钟打拍
reg feedback ;
reg [1:0]feedback_d ; //快时钟打拍
always@(posedge clk_fast of negedge rstn)
if(!rstn)
signal_flag <= 1'b0;
else if (data_in) //展宽***********
signal_flag <= 1'b1;
else if (feedback_d[1]) //解绳***********
signal_flag <= 1'b0;
else
signal_flag <= signal_flag ;
always@(posedge clk_slow or negedge rstn)
if (!rstn)
signal_flag_d <= 3'd0;
else
signal_flag_d <= {signal_flag_d[2:1],signal_flag};
always@(posedge clk_fast of negedge rstn)
if(!rstn)
feedback_d <= 2'b00;
else
feedback_d <= {feedback_d[1],signal_flag_d[2]};
assign data_out = signal_flag_d[3] & ~signal_flag_d[2];
endmodule
参考链接:https://blog.csdn.net/wnazhe45/article/details/119874288?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165890123516782350868059%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165890123516782350868059&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-119874288-null-null.142v35new_blog_fixed_pos,185v2control&utm_term=%E5%8D%95bit%E8%B7%A8%E6%97%B6%E9%92%9F%E5%9F%9F%E9%87%87%E9%9B%86verilog&spm=1018.2226.3001.4187