🔈声明:
🔑未经作者允许,禁止转载
🚩推荐一个IC、FPGA新手入门的好网站:👉快 点 击 进 入 学 习 吧👈
题目
用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复位。
- 但是这么做会引入不可预知的毛刺错误,且消耗了更多的时钟资源。
最后给大家安利一个好网站:
Verilog的学习还是要多以练习为主,想要练习Verilog的同学,推荐可以去nowcoder看看,他们现在的题库内容很丰富,属于国内做的很好的了,而且是课程+刷题+面经+求职+讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费