单bit信号的跨时钟域采集verilog

单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

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值