17 / 24 · 概念
FIFO 空、满与同时传送
区分占用量与指针,并规定边界上的入队/出队行为。
课时内容可免费阅读,选课后可保存学习进度。
队列保持接收顺序
FIFO 先交付最早接收的数据项。读指针标识最旧条目,写指针标识下一个存储位置。仅凭指针相等无法区分空与满,因此这个设计维护占用计数。深度为四时,指针需要两位,而计数需要三位才能表示零到四。标签与数据一起存储。
这个寄存式 FIFO 不支持空队列直通。Output-valid 为 count>0,pop 为 output-valid AND output-ready。Input-ready 为 count<depth OR pop,允许满队列在交付队首的同时接收替换项。Push 为 input-valid AND input-ready。下一 count 为 count+push-pop。分别用两项赋值递增和递减 count,可能错误处理同时传送;应采用一个合并更新,或明确列出各情况。
| 旧 count | 条件 | push | pop | 新 count |
|---|---|---|---|---|
| 0 | 有输入且接收端 ready | 1 | 0 | 1 |
| 1 | 有输入且接收端 ready | 1 | 1 | 1 |
| 4 | 有输入且接收端停顿 | 0 | 0 | 4 |
| 4 | 有输入且接收端 ready | 1 | 1 | 4 |
空队列不能只因为接收端 ready 就出队。新输入最早在下一个时钟沿传送。满队列 [A,B,C,D] 同时取走 A、接收 E 后,变为 [B,C,D,E],仍然已满。读写同一物理位置时,应验证底层存储器行为。
四槽 FIFO,初始为空,读写指针均为 0。非空时接受 pop;有空位或同一边沿接受 pop 时,接受 push。
二的幂次深度可以依靠指针位自然回绕。深度三需要明确规定从位置二转到零。应分别测试回绕、移除最后一项和满队列替换。
接收端停顿五周期时,深度四的空队列只能容纳四个数据项。第五个输入必须等待。无法停顿的源端需要更多容量,或明确的数据丢失策略。任何有限 FIFO 都无法解决使用速率永久较慢的问题。检查 0≤count≤depth、accepted-delivered=count 和标签顺序;只有计数无法暴露重排。
自己试试
深度二的队列为 [tag3,tag4],out-ready=1 时提供输入 tag5。求 push、pop、下一 count 和队列。如果队列为空,tag5 会立即出队吗?
阅读解释
Pop=1 使 input-ready 在满占用时仍为高,因此 push=1。下一 count 仍为二,队列为 [tag4,tag5]。空队列的 out-valid=0,因此 tag5 被存储,直到之后的时钟沿才可能出队。