显示标签为“GALS”的博文。显示所有博文
显示标签为“GALS”的博文。显示所有博文

2009年1月3日星期六

GALS设计讨论(part3)异步控制部件协议,STG

GALS设计中常常涉及各种异步控制部件协议和STG,这里我很简单地讨论一下这些概念。

常用的异步控制部件协议有(具体解释见Google&Wiki):

  1. 两段打包(bundled data)协议使用Two-Phase Handshake,发送端发出REQUEST,接收端收到数据后发出ACK确认,使用信号的跳变。
  2. 四段打包(bundled data)协议使用Four-Phase Handshake,发送端发出REQUEST,接收端收到数据后发出ACK确认,使用信号电平来表示REQUEST和ACK。
  3. 四段双轨(dual rail)协议使用两根信号表示每位数据的逻辑电平。

Two and Four- phase handshake protocols

两段打包,四段打包优点是简单,面积小,能耗低,缺点是对延迟敏感。而使用四段双轨协议的电路正好相反。

STG:signal transition graph STG,是一种信号转换图(属于petri网),是常见的描述异步电路信号控制行为描述方法。

非常简单的例子,请参考下面链接: A Case for Using Signal Transition Graphs for Analysing and ... 看完这个例子,我想你一定已经了解STG。

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和寄存器,对输出和输入信号还有数据进行“保护”。

本系列文章未完,待续。

2008年12月20日星期六

GALS设计讨论(part1)ack request机制

Handshake Protocol 是在硬件设计时,基础通信的协议。ack request信号的使用是其要点,这篇文章并不对其的基本原理进行讨论,这里着重对于ack request机制在GALS(全局非同步,局部同步系统)应用的讨论。

一般典型设计,以下是一个简单的示例:


模块1 模块2
| request_out |--> |request_in |
| ack_in |<-- |ack_out |

GALS系统设计,以下是一个简单的示例:

模块1 非同步FIFO控制模块 模块2
| request_out |--> |request_A(in) request_B(out)| --> |request_in |
| ack_in |<-- |ack_A(out) ack_B(in)| <-- |ack_out |

因为这里要使用到一个 “非同步FIFO控制模块”过渡,所以时序问题的考虑就特别重要,在多次的实验中,我发现 非同步FIFO控制模块 会使一些信号产生延迟,延迟问题常常是致命的,例如:当ack_A(out)无法在正确的时序给定给模块1时(常常,这个信号已经丢失了),模块1就会不断发送request_out信号,因为不能得到正确的ack_in 信号,整个系统就会停摆,或产生错乱。 这时要导入,几个一级flip flop来过滤信号的非稳定性,并要使对延迟进行严格控制。

Struktur der Synchronisierung der 1-Bit breite Kontrollsignale zwischen den Clock Domains

非同步FIFO控制模块有左右两侧接口。为了命名方便,左侧接口为request_A(in),ack_A(out),右侧则命名为B端。非同步FIFO控制模块的左右两端的信号接口,不仅是作为接口,起到链接作用,更为重要的是从模块1和2获得控制信号,并且通过输出信号ack_A(out) 和request_B(out)对模块1和2进行控制。模块1和2的输出信号request_A(in),ack_B(in),也可以进行对非同步FIFO的控制。

接下来讨论, 非同步FIFO控制模块的具体控制问题。

当非同步FIFO控制模块得到request_A(in)等于1时,说明(同一时间)有有效数据传输,这时将数据和request_A(in)信号输入寄存器,然后非同步FIFO从寄存器中读取数据,并发送 "ack_A(out) <= WR_ACK" 给模块1。

说明:WR_ACK是非同步FIFO的写入反馈信号,WR_EN是写使能信号。RD_ACK是非同步FIFO的读出反馈信号,RD_EN是读使能信号。

本文未完,待续。