11.3 握手与并行数据传送
第 11.2 节使用状态位,让软件在自己选择的时刻读取设备状态。当两个单元的时序彼此独立时,传送需要更明确的约定。握手(handshake)使用控制信号,让发送方宣布数据有效,再由接收方确认已经接收。
完成四相握手
假设选通信号 STB 和应答信号 ACK 都是高电平有效。一次安全的四相传送按以下顺序进行:
1. 发送方把稳定的数据字放到并行数据线上。
2. 发送方置位 STB,宣布数据字有效。
3. 接收方锁存数据字,并置位 ACK。
4. 发送方看到 ACK 后清除 STB,随后可以释放数据线。
5. 接收方看到 STB 已无效,再清除 ACK,双方回到空闲状态。
各步之间不要求固定延迟。每一方都等待可观察的信号事件,因此快速发送方也能与较慢接收方通信。不过,从 STB 置位前到接收方给出应答为止,数据必须保持稳定。这段时间就是传送的有效数据窗口。
如果发送方在 ACK 到来前改变数据,接收方可能锁存到混合值或较新的值。如果任一方等待了错误的信号电平,接口可能发生死锁(deadlock):双方仍处于活动状态,却没有任何一方能够产生下一次跳变。
匹配生产者与消费者速率
并行通路一次传送多个位,但位宽本身不能保证可靠吞吐量。生产者(producer)生成数据字,消费者(consumer)接收数据字。若消费者忙碌时生产者仍能生成新字,接口就需要背压(backpressure)或临时存储。
背压是一种要求生产者暂停的信号。先进先出缓冲区(first-in, first-out buffer, FIFO)可以吸收短暂突发:每个被接收的数据字加入队尾,消费者总是从队首取走最早的字。FIFO 已满时生产者仍然写入,会发生上溢(overrun)并丢失数据;消费者从空 FIFO 读取,则发生下溢(underrun)。
增加 FIFO 深度可以容纳更长的短时突发,却无法解决生产者平均速率长期高于消费者的问题。可靠设计必须同时考虑位宽、握手延迟、缓冲深度和平均服务速率。
握手说明了传送机制。第 11.4 节将通过可编程 8255 接口应用这些机制,并把接口连接到看得见的键盘和显示硬件。