首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >脉冲和电平信号的时钟域交叉

脉冲和电平信号的时钟域交叉
EN

Stack Overflow用户
提问于 2016-06-28 12:57:30
回答 2查看 3.7K关注 0票数 2

对于脉冲,我们使用脉冲同步器,对于电平信号,我们使用2触发器同步器,但如果信号可以是脉冲或电平行为怎么办。有没有同步的方法?

EN

回答 2

Stack Overflow用户

发布于 2016-07-08 12:39:48

可以,但解决方案需要基于输入脉冲相对于输出时钟的宽度。

当输出时钟非常慢,并且您有一个脉冲时,您需要添加一个在输入时钟域工作的串联脉冲展宽器。扩展由下面的stretch_out位宽度定义,并且“必须”大于输出时钟域上的一个时钟。

代码语言:javascript
复制
reg [3:0] stretch_out;
always @ (posedge inclk)
begin 
   stretch_out <= in_signal ? 4'b1111 : {stretch_out[2:0],1'b0}; 
end

现在你可以使用你的双翻转同步器了。

代码语言:javascript
复制
reg [1:0] out_sync;
always @ (posedge outclk)
begin 
    out_sync <= {out_sync[0],stretch_out[3]};
end

这应该使电平和脉冲从快域同步到慢域。

唯一的问题是,您将添加比通常的两个flop延迟更多的延迟。

票数 0
EN

Stack Overflow用户

发布于 2016-07-08 23:52:30

您可以使用目标域中的信号进行异步设置,使用双flops进行同步,然后检测上升沿。对于短脉冲和长电平都应该有效。

代码语言:javascript
复制
// Prevent DRC violations if using scan
wire in_signal_n = scan_mode ? 1'b1 : !signal_in;

// Following code creates a flop with both async setb and resetb
reg sig_n_async;
always @ ( posedge outclk or negedge reset_n or negedge in_signal_n)
  if (!reset_n)
    sig_n_async <= 0;
  else if (!in_signal_n)
    sig_n_async <= 1;
  else
    sig_n_async <= 0;


// Synchronizer
reg [1:0] out_sync;
always @ (posedge outclk or negedge reset_n)
  if (!reset_n)
    out_sync <= 0;
  else
    out_sync <= {out_sync[0],sig_n_async};


// Rising edge
reg out_sync_del;
always @ (posedge outclk or negedge reset_n)
  if (!reset_n)
    out_sync_del <= 0;
  else
    out_sync_del <= out_sync[1];

wire signal_out = out_sync[1] & !out_sync_del;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38067346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档