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来过滤信号的非稳定性,并要使对延迟进行严格控制。
非同步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是读使能信号。
本文未完,待续。
没有评论:
发表评论