打印

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

[复制链接]
1462|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来做使能)?

process(clk,en)
begin
if(clk`event and clk = '1') then
   if(en) then
      D <= data_in;
   end if;
end if;
end

process(clk,en)
begin
if(en) then   
   if(clk`event and clk = '1') then
      D <= data_in;
   end if;
end if;
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

使用特权

评论回复
5
sleepybear| | 2012-11-16 10:06 | 只看该作者
打几拍消除亚稳态,是不是主要用于异步时钟之间的单个控制信号吧?多bit并行数据不能这么做吧?

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

有时候,不同模块之间会有时钟同频不同相的情况,可以用FIFO隔离一下。

使用特权

评论回复
6
GoldSunMonkey| | 2012-11-16 22:05 | 只看该作者
打几拍消除亚稳态,是不是主要用于异步时钟之间的单个控制信号吧?多bit并行数据不能这么做吧?

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

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

其他的你说的都对。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

3

帖子

0

粉丝