https://mp.weixin.qq.com/s/vlyOIsQxR6bCqDDMtRQLLg

 
实现队列模块,先入先出(FIFO)。
 
参考链接:
 
 
1. QueueIO
 
队列(Queue )输入输出接口,entries为队列的容量。这些接口的方向都是从队列的角度来定义的。
 
a. enq:队列输入接口。
 
b. deq:队列输出接口。
 
c. count:当前队列的深度。
 
2. Queue
 
a. 继承自Module
 
 
b. 接口
 
 
c.内部变量
 
1) ram为队列使用的内存;
2) enq_ptr为入队时使用的指针;
3) deq_ptr为出队时使用的指针;
4) 队列状态指示:empty/full;
5) 当前是否在入队或出队:do_enq/do_deq;
 
因为enq_ptr/deq_ptr都是Counter类型,Counter是循环的,即到达最大值之后就返回从0开始。所以队列也是一个循环队列。
 
d.入队
 
如果do_enq置位,则把入队数据(io.enq.bits)存下来,并递增指针;
 
入队需要队列处于ready状态,只要队列没有full,则可以接收数据:
 
e.出队
 
如果do_deq置位,则递增出队指针;
 
 
出队需要deq接口处于valid状态,只要队列没有空,则io.deq.valid为真;
 
f. maybe_full
 
maybe, 名字取的很贴切。可能满,也可能没有满。
 
 
如果正在入队和正在出队状态的值不一致,则更新maybe_full。
 
分为四种情况:
1) 正在入队(do_enq = 1),没有出队(do_deq = 0)
 
只有入队,没有出队,则队列有可能满。
 
2) 没有入队(do_enq = 0),没有出队(do_deq = 0)
 
队列中元素个数未变,不更新maybe_full的值。
 
3) 正在入队(do_enq = 1),正在出队(do_deq = 1)
 
正在入队,也正在出队。每一个clock最多只入队一个,只出队一个。没有变化,不更新。
 
4) 没在入队(do_enq = 1),正在出队(do_deq = 1)
 
队列中元素个数在减少,不可能满。
 
g. full/empty
 
 
当入队和出队指针相同时,有可能是空也有可能是满,此时需要使用maybe_full来做一个指示性判断。
 
h. count
 
 
队列中元素的个数为:
会不会存在负数?不存在,value为无符号数。
 
抽象成形式 C = A - B。
 
假设队列容量为entries:
如果A > B,很好理解,元素个数 C = A - B;
如果A < B,发生了回环,元素个数 C = A + entries - B;
其中,A, B都会在entries处发生回环,从0开始。
 
1) 如果entries为2的指数
 
如果entries为2的指数即2^n,无论A/B的大小关系,元素个数的计算方法是一样的,即 C = A - B。
 
n为无符号二进制数,随意加多少2^n,值都不变。即 A - B = A + 2^n - B。
 
如3位无符号数,entries = 2^3 = 8:
3 - 5 = (3 + 2^3 - 5) % 2^3 = 6
 
需要处理的情形是当ptr_diff为0时,存在的empty/full两种情况。
 
这里存在两种情况,如果为maybe_full && ptr_match为0,则队列未满,使用ptr_diff;如果为1,则队列满,ptr_diff为0。
 
2) 如果entries不是2的指数
 
如果enq_ptr等于deq_ptr,则要看是empty还是full,如果为full,则count为entries;如果为empty,则count为0;
 
如果enq_ptr不等于deq_ptr,则要先比较大小。如果A > B,则使用 A - B,即ptr_diff;如果A < B,则使用A + entries - B,即entries.asUInt + ptr_diff。
 
i. pipe/flow
 

Chisel3 - util - Queue的更多相关文章

  1. Java中的队列:java.util.Queue接口

    队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作. Queue接口与List.Set同一级别,都是继承了Collection接口.Linked ...

  2. java中使用队列:java.util.Queue

    在java5中新添加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口.Queue使用时要尽量避免Collection的add()和 ...

  3. java.util.Queue用法

    队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有元素时,称为空队列. 在队列这 ...

  4. java中使用队列:java.util.Queue(转)

    队列是一种特殊的线性表,是运算受到限制的一种线性表,只允许在表的一端进行插入,而在另一端进行删除元素的线性表.队尾(rear)是允许插入的一端.队头(front)是允许删除的一端.空队列是不含元素的空 ...

  5. java.util.Queue(队列)的简单使用

    import java.util.LinkedList; import java.util.Queue; import org.junit.Before; import org.junit.Test; ...

  6. JDK源码(1.7) -- java.util.Queue<E>

    java.util.Queue<E> 源码分析(JDK1.7) -------------------------------------------------------------- ...

  7. java.util.Queue

    转载于:https://www.runoob.com/java/data-queue.html 队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList ...

  8. Chisel3 - util - OneHot

    https://mp.weixin.qq.com/s/Jsy8P3m9W2EYKwneGVekiw   独热码相关的电路生成器.   参考链接: https://github.com/freechip ...

  9. Chisel3 - util - MixedVec

    https://mp.weixin.qq.com/s/mO648yx4_ZRedXSWX4Gj2g   可以容纳不同类型的变量的向量.   参考链接: https://github.com/freec ...

随机推荐

  1. Code::Blocks20.03 编译报错

    Code::Blocks最近出了新版20.03,进入官网选择下载了附带MinGW版的安装包后,编译HelloWorld就报错(CB一直以来都有问题,新版还是这样...) 主要有两个问题: ld.exe ...

  2. 绝对一个月精通vue

    马上从vue-cli4练手,要不然,学几年,你也不懂组件式开发,不懂VUEX,不懂路由, 也许你会说你懂, 麻烦你花一个月学vue-cli4以一个完整购物商城来练手,   一个月后,如果还觉得我错,我 ...

  3. X Error:BadDrawable (individ Pixmap or Window parameter 9)

    #描述 平台:aarch64 系统:ubuntu16.04.02 Qt Version:4.8.7 Qt程序可以正常运行,界面渲染出现问题以及乱码,控制提示错误内容: "unable to ...

  4. STM32学习笔记——USART

    STM32的USART组件支持异步.同步.单线半双工.多处理器.IrDA.LIN.SmartCard等模式,本文介绍的是异步即UART模式. 总线通信有三种模型:轮询.中断和DMA.DMA对我来说是陌 ...

  5. Winform GDI+ 绘图一:绘制2D电池

    winform桌面软件开发,在工业控制领域的使用还是很广泛的,打算好好学习一下GDI+绘图.以前都是用别人的轮子,自己也打算封装一些工业控制领域常用的控件. 今天要将的是,利用缓动函数动态绘制电池. ...

  6. 不吹牛X,我真的干掉了if-else

    我们在web开发中,经常使用数据库表中的字段作为"标记"来表示多个"状态",比如: 我们就以某宝的在线购物流程为例进行分析.在订单表中,使用zt字段来表示定单的 ...

  7. Docker之docker log详解

    1.显示所有log docker logs [OPTIONS] <CONTAINER>   #显示某个容器的所有log docker-compose logs  #显示启动的所有容器的lo ...

  8. ubuntu软件管理工具的使用——dpkg和apt

    deb.rpm.tar.gz三种Linux软件包的区别在哪里呢,这种区别可能使安装进行不下去,那么我们应该下载什么格式的包呢?下面具体讲解一下. rpm包是在Redhat.Suse和Fedora可以直 ...

  9. 【雕爷学编程】Arduino动手做(59)---RS232转TTL串口模块

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...

  10. 1.2Go环境搭建之Mac

    1.下载mac版go开发工具包,源码包或是安装包都可以 //官方下载地址 https://golang.org/dl/ //下载地址在此 https://dl.google.com/go/go1.11 ...