天天看点

数字IC秋招手撕代码(五)脉冲检测题目分析代码

数字IC秋招手撕代码(五)脉冲检测

  • 题目
  • 分析
  • 代码

题目

用verilog实现快时钟域到慢时钟域的脉冲检测电路

分析

如果是慢时钟到快时钟,或者是同时钟域的情况下,检测脉冲用两级同步器加一个组合逻辑即可实现。

但是快时钟到慢时钟,可能会出现慢时钟检测不到脉冲,从而丢失数据。所以要在两级同步器加一级以脉冲信号作为clk的触发器,并在脉冲检测完后复位第一级。

但是,如果两次脉冲出现的太近该怎么办呢? 暂时没有方案。

代码

module Sync_pluse(
	input		pulse_in,
	input		clk,
	input		rstn,
	output		pulse_out
)

reg		pulse_tmp;							//展宽信号
reg		over;								//展宽撤销信号
reg		pulse_dly0,pulse_dly1;

assign pulse_out = pulse_dly0 & !pulse_dly1;
assign over = !pulse_out;

always @(posedge clk)begin
	if(!rstn)
		pulse_tmp <= 1'b0;
	else if(pulse_in)
		pulse_tmp <= 1'b1;
	else if(over)
		pulse_tmp <= 1'b0;
end

always @(posedge clk)begin
	if(!rstn)begin
		pulse_dly0 <= 1'b0;
		pulse_dly1 <= 1'b0;
	end
	else begin
		pulse_dly0 <= pulse_in;
		pulse_dly1 <= pulse_dly0;
	end
end

           
  • 之前一直没思考到,如果脉冲来的很近用什么办法解决,今天突然看到,可以用异步复位,同步释放的思想来解决。
  • 异步输入作为第一个DFF的clk端,在用两级同步器缓冲,如果同步后的clk2 domain能检测到这个脉冲说明可以对DFF1复位。
  • 但是这么做会引入不可预知的毛刺错误,且消耗了更多的时钟资源。
数字IC秋招手撕代码(五)脉冲检测题目分析代码

继续阅读