2008年12月24日星期三

GALS设计讨论(part2)flow control机制

前面讨论了ack requst 机制在GALS设计的应用。但是,GALS系统(这里假定一个简单的GALS系统由CLK_DOMAIN_A和CLK_DOMAIN_B组成并使用非同步FIFO作为两个DOMAIN的接口),常常需要使用到flow control机制,这时候就需要,flow control signal:例如:(ready, hold信号)。

使用HOLD信号,可以简单的是CLK_DOMAIN_A 保持了高电平。这时DOMAIN_A发送的DATA信号便保持了最后一个值不变,在DOMAIN_A里的模块,就保持“冻结”状态,只有当HOLD = '0' 时,“冻结”状态被解除。这里所谓的“冻结”状态有两个好处:

  1. 可以防止,系统时序的错乱,我做过几个实验,并没有采用flow control机制,仅仅采用ack requst 机制,当DOMAIN_B里的模块要从非同步FIFO系统需要读出数据时,要对DOMAIN_A发送ACK_A= '0'的信号,注意这里很容易会产生 系统时序的错乱。
  2. 可以节能 Energy Efficient。很简单,当DOMAIN_A里的模块,保持“冻结”状态时,这时模块就几乎不会耗能。

使用同样的原理,我们可以很容易地对DOMAIN_B里的模块控制,使其达到“冻结”状态,当往非同步FIFO里写入数据时。以下是一个 stretchable clock 的例子:

Example of the output from a stretchable clock

现在我们有了非同步FIFO(及其控制信号如WR_EN, RD_EN等等),flow control机制里的hold信号,ack requst 机制的ack request信号,我们可以快速的建立一个很简单的GALS系统。

经验:最好不要将ack requst 机制的ack request信号直接对非同步FIFO的控制信号如WR_EN, RD_EN进行控制,理论上是可以成功,但实践上会遇到很多譬如时序,延迟的问题。

比较聪明的解决方法是:建立一个INPUTINTERFACE(也可以叫做INPUTPORT)和一个OUTPUTINTERFACE(也可以叫做OUTPUTPORT)分别放在非同步FIFO两端,仅仅使用INPUTINTERFACE和OUTPUTINTERFACE的内部信号对FIFO进行控制。对于外部INPUTINTERFACE和OUTPUTINTERFACE控制和接受ack requst 机制的ack request信号,控制flow control机制里的hold信号。并且在INPUTINTERFACE和OUTPUTINTERFACE中放置一系列的flipflops和寄存器,对输出和输入信号还有数据进行“保护”。

本系列文章未完,待续。

没有评论: