同一时钟下模块之间数据传输.同步问题

[复制链接]
2025|5
 楼主| naught 发表于 2012-11-15 10:40 | 显示全部楼层 |阅读模式
小弟在http://blog.sina.com.cn/s/blog_aec06aac01011zgm.html 中看了关于降低亚稳态的方法,突然有个问题想请教下各位。。。

比如在同一时钟clk下,有模块A -> B -> C。 A将数据data和enable信号传输到B模块。enable为高时,表示有数据;为低时,没数据。

像这种同一个时钟域下,不同模块之间的数据传输,有没有必要做几个D寄存器来避免亚稳态?

还有一个问题,各位的enable信号一般怎么设置的? 是比数据提前一周期设为1发送到B模块;还是跟数据data一起变化设为1,同时传到B模块啊?

谢谢各位啦!
 楼主| naught 发表于 2012-11-15 11:23 | 显示全部楼层
对于第二个问题 我在一般的时序图上看到 比如使能en或者rst等信号,都会在clk上升沿之前assert或者de-assert,这样在clk上升沿到来时,en或者rst已经稳定了。

我想知道的是,如果在时钟上升沿的瞬间(setup time内),使能信号en才有效,那么,下面两段代码会有不同吗?
我跑过...貌似都一样。。不知道有没有错。。。

我理解是,第一段代码是同步使能,由于en是在时钟上升沿才有效的,则当前D寄存器会认为en依然无效,下一个周期才读入数据。
第二段代码是异步使能,则D寄存器会读入在时钟上升沿前就稳定的data_in。。。

我隐约的感觉,好像使能信号和D寄存器读入数据有点不同? 是不是使能信号en不需要延时这种考虑?即当前有效了,就会对当前的D寄存器产生影响,而不是像数据一样被延时一个周期才考虑(无论同步异步,除非把使能信号直接输入另一个寄存器D2,再用D2的输入Q2来做使能)?

  1. process(clk,en)
  2. begin
  3. if(clk`event and clk = '1') then
  4.    if(en) then
  5.       D <= data_in;
  6.    end if;
  7. end if;
  8. end

  1. process(clk,en)
  2. begin
  3. if(en) then   
  4.    if(clk`event and clk = '1') then
  5.       D <= data_in;
  6.    end if;
  7. end if;
  8. end
GoldSunMonkey 发表于 2012-11-15 20:55 | 显示全部楼层
小弟在http://blog.sina.com.cn/s/blog_aec06aac01011zgm.html 中看了关于降低亚稳态的方法,突然有个问题想请教下各位。。。

比如在同一时钟clk下,有模块A -> B -> C。 A将数据data和enable信号传输到B模块。enab ...
naught 发表于 2012-11-15 10:40
同一时钟域不用加几拍时钟,如果组合逻辑不大的话。如果组合逻辑大,可以加几拍,但是不能说就是为了消除亚稳态。
如何进入下一个模块看你的需求,没有固定的说法。
Backkom80 发表于 2012-11-16 08:00 | 显示全部楼层
猴哥,V5
sleepybear 发表于 2012-11-16 10:06 | 显示全部楼层
打几拍消除亚稳态,是不是主要用于异步时钟之间的单个控制信号吧?多bit并行数据不能这么做吧?

从模块设计和时序角度,同步设计是不是在入口和出口用寄存器缓存一下比较好呢?

有时候,不同模块之间会有时钟同频不同相的情况,可以用FIFO隔离一下。
GoldSunMonkey 发表于 2012-11-16 22:05 | 显示全部楼层
打几拍消除亚稳态,是不是主要用于异步时钟之间的单个控制信号吧?多bit并行数据不能这么做吧?

从模块设计和时序角度,同步设计是不是在入口和出口用寄存器缓存一下比较好呢?

有时候,不同模块之间会有时钟同频 ...
sleepybear 发表于 2012-11-16 10:06
并行的也能,只是没意思。

其他的你说的都对。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部