用高频时钟检测低频时钟的上升沿,用两个D触发器还是一个D触发器?
时间:10-02
整理:3721RD
点击:
用高频时钟检测低频时钟的上升沿,用两个D触发器还是一个D触发器?
一个D触发器,如下描述
always@(posedge clk_quick)
begin
clk_buf<=clk_slow;
end
always@(posedge clk_quick)
begin
if({clk_slow,clk_buf}==2'b01)
rise_flag<=1'b1;
else
rise_flag<=1'b0;
end
上面的描述实现仅需一个时钟
两个D触发器
always@(posedge clk_quick)
begin
clk_buf[1:0]<={clk_buf[0],clk_slow};
end
always@(posedge clk_quick)
begin
if(clk_buf[1:0]==2'b01);
rise_flag<=1'b1;
else
rise_flag<=1'b0;
end
如上描述也常见,那么大家是如何选择的?
上述两种结构各有什么优缺点?
一个D触发器,如下描述
always@(posedge clk_quick)
begin
clk_buf<=clk_slow;
end
always@(posedge clk_quick)
begin
if({clk_slow,clk_buf}==2'b01)
rise_flag<=1'b1;
else
rise_flag<=1'b0;
end
上面的描述实现仅需一个时钟
两个D触发器
always@(posedge clk_quick)
begin
clk_buf[1:0]<={clk_buf[0],clk_slow};
end
always@(posedge clk_quick)
begin
if(clk_buf[1:0]==2'b01);
rise_flag<=1'b1;
else
rise_flag<=1'b0;
end
如上描述也常见,那么大家是如何选择的?
上述两种结构各有什么优缺点?
都不行,得3个触发器...
这个~你是指需要同步吗?
如果忽略前面的同步,那么怎么办呢? 感觉第一种方法就足够了,但是第二种又经常见,还找不出来使用的原因~
经典的是2级触发器
我觉得也是,可是既然一个D触发器就可以完成的任务,为甚么还要用两个呢?
如果时钟相位固定的话,使用一级也是可以的
如果是完全异步的话,至少使用两级,因为存在亚稳态的问题
说的有道理~
2级已经足够很多应用,3级比较保险。
能不能详细讲讲亚稳态的消除,求教
关于亚稳态的讲解,有很多文档说明的,你可以搜索下,并且讲的相对更详细
总体来讲,就是一句话:如果不满足采样的时序要求,就会出现亚稳态,也就是所保存的数据跟输入数据没有了必然的关系了
如果两个时钟是异步的关系,CDC 就需要两级,生成边沿pulse还需要一个,总起来起码需要3个DFF。
如果两个时钟是同源的, CDC可以省略,则1个DFF
