本文共 1204 字,大约阅读时间需要 4 分钟。
实现一个输入宽度为inW,输出宽度为outW,可存n个outW宽度元素的FIFO。 a. 如果inW == outW,直接使用队列(Queue)实现; b. 如果inW > outW,则相当于每次输入多个元素,而输出只能有一个元素; c. 如果inW < outW,则相当于每次输出多个元素,而输入只能有一个元素; 需要注意的是,n指的是FIFO中可以存储的宽度为outW的元素的个数。 c. count: 队列内宽度为outW的元素的个数; require(inW % outW == 0, s"MultiWidthFifo: in: $inW not divisible by out: $outW") require(n % nBeats == 0, s"Cannot store $n output words when output beats is $nBeats") b. n/nBeats表示队列中存放的inW的个数(n表示队列中存放的outW的个数); 每次写的宽度为inW,总共可写的个数为n/nBeats: 把写端的数据转换为以outW宽度数据为单位的序列。 如果输入一个的同时输出一个,size = size + nBeats - 1; 如果只是输入一个,size = size + nBeats; 如果只是输出一个,size = size - 1; 如果队列满之后,输出一个元素。此时size < n,但是无法输入。因为nBeats > 1,所以需要至少输出2个元素才能输入。 参考inW < outW的情况下out.valid的实现,就不是直接使用size与0比较: 转载于:https://www.cnblogs.com/wjcdx/p/10989537.html