数字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复位。
- 但是这么做会引入不可预知的毛刺错误,且消耗了更多的时钟资源。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSPr1WZohmMjBHayMmdkNDW240MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxcjZxgTYmRmZhBjNzYGO5MDZxQTN0YWM1YDOyYDZiN2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)