https://mp.weixin.qq.com/s/CUnrpyQN5LRBR5bxC5u86A
简单介绍MultiWidthFifo的实现。
1. 基本介绍
实现一个输入宽度为inW,输出宽度为outW,可存n个outW宽度元素的FIFO。
a. 如果inW == outW,直接使用队列(Queue)实现;
b. 如果inW > outW,则相当于每次输入多个元素,而输出只能有一个元素;
c. 如果inW < outW,则相当于每次输出多个元素,而输入只能有一个元素;
需要注意的是,n指的是FIFO中可以存储的宽度为outW的元素的个数。
2. 实现
1) io
a. in: 输入,宽度为inW;
b. out: 输出,宽度为outW;
c. count: 队列内宽度为outW的元素的个数;
2) inW == outW
输入输出宽度相等,直接使用队列实现。
3) inW > outW
输入宽度大于输出宽度,先决条件:
a. 输入宽度是输出宽度的整数倍:
require(inW % outW == 0, s"MultiWidthFifo: in: $inW not divisible by out: $outW")
b. 队列可以存储整数倍个输入宽度的数据:
require(n % nBeats == 0, s"Cannot store $n output words when output beats is $nBeats")
也就是说:
a. nBeats表示inW中outW的个数;
b. n/nBeats表示队列中存放的inW的个数(n表示队列中存放的outW的个数);
具体实现如下:
a. 写端
每次写的宽度为inW,总共可写的个数为n/nBeats:
b. 读端
把写端的数据转换为以outW宽度数据为单位的序列。
c. 输入
输入以inW宽度为单位,head是输入序号;
d. 输出
输出以outW宽度为单位,tail是输出序号;
e. size
FIFO中宽度为outW的元素的个数。
如果输入一个的同时输出一个,size = size + nBeats - 1;
如果只是输入一个,size = size + nBeats;
如果只是输出一个,size = size - 1;
如果没有发生上述情况,size = size;
f. 可输出
队列中有宽度为outW的元素即可:
g. 可输入
这个实现是有问题的。
如果队列满之后,输出一个元素。此时size < n,但是无法输入。因为nBeats > 1,所以需要至少输出2个元素才能输入。
参考inW < outW的情况下out.valid的实现,就不是直接使用size与0比较:
可以考虑改成:
h. 队列中宽度为outW的元素的个数
4) inW < outW
参考inW > outW的实现。
3. 附录
略