zoukankan      html  css  js  c++  java
  • Rocket

    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. 附录
     
     
     
     
     
  • 相关阅读:
    第六周进度条
    团队开发需求分析视频连接
    敏捷开发综述
    数组2--数组首尾相接,求最大子数组
    数组1--求一个数的最大子数组
    第四周进度条
    四则运算3
    第三周进度条
    第二周进度条
    单元测试
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10989537.html
Copyright © 2011-2022 走看看