首页 > 其他分享 >Verilog队列链表操作

Verilog队列链表操作

时间:2024-07-22 15:31:39浏览次数:15  
标签:队列 RAM 链表 出队 Verilog 空闲 指针

链表在缓存管理中有重要的应用,对所有输入的数据都放在一块大的RAM中缓存,并且根据一定的规则将数据分类并划归不同的队列,不同队列的数据可以分别控制输出,队列内,数据按严格先进先出的顺序操作 我们假设输入数据的位宽为256,并且开辟一个2^20深度的RAM用于缓存,那么RAM大小为32MB。将输入数据划归1024个队列,则需要对RAM进行链表操作,或者说是队列管理。 首先需要一个链表RAM,深度与数据RAM深度相同,队列链表RAM存放的是数据RAM的地址,所以位宽为20。其次,每个队列都需要维护对应的首指针和尾指针,队列的首尾指针需要依据链表规模决定使用RAM或者寄存器,对于本例,队列首指针(或者尾指针)大小为1024x20,需要使用RAM存储。此外,对于空闲链表,需要通过寄存器维护其首尾指针。 在初始状态,需要初始化链表及队列信息,包括 1、链表首指针指向链表RAM首地址0,链表尾指针指向链表RAM尾地址2^20-1 2、初始化链表RAM的值,往地址addr中写入数据addr+1 3、给所有队列空标记置1 初始化完毕后,可以进行队列的入队和出队操作,入队指的是接受数据,并加入队列的过程,出队即入队的逆过程

入队过程

入队是从数据队列的角度看,但是从空闲队列的角度看,其实是出队过程。将接收数据写入空闲队列首指针的地址即可,队列链表管理操作如下: 首先是空闲队列的操作,空闲队列为出队,出队需要更新队列首指针,取出当前队列首指针,并从链表中取得当前首指针的下一跳,将得到的下一跳作为新的首指针。 然后是数据队列的操作,数据队列为入队,对于入队,分为2种情况:队列为空与队列非空。这就需要用到前面初始化时提到的队列空标记。 当队列为空,将从空闲队列出队的值作为当前队列的首尾指针,空标记置0,无需对链表操作。 当队列非空,往链表当前队列尾指针地址写入从空闲队列出队的值,且将该值作为新的队列尾指针。

出队过程

同样的,这里说的出队是对数据队列而言,对空闲队列而言则是入队。从当前队列首指针把数据读出即完成了数据的处理,队列链表管理操作如下: 对于数据队列来说,也是需要分2种情况讨论:当前是否为队列的最后一个数据。这可以通过当前队列的首尾指针是否相等来判定,相等为最后一个数据,否则不是最后一个数据。 当为最后一个数据,将队列空标记置1即可,无需操作队列首尾指针。 当不为最后一个数据,从链表中取得当前队列首指针的下一跳,并将它作为新的首指针。 空闲队列的操作为,往当前空闲队列尾指针写入数据队列出队的首指针,并且将它作为新的空闲队列尾指针。   请注意,上述表述中未提及空闲队列的空标记操作过程,具体实现时按照数据队列的逻辑控制即可

标签:队列,RAM,链表,出队,Verilog,空闲,指针
From: https://www.cnblogs.com/qingkai/p/18316078

相关文章

  • 教你如何手撕双向链表
    1.双向链表1.1概念与结构注意:这⾥的“带头”跟前⾯我们说的“头结点”是两个概念,实际前⾯的在单链表阶段称呼不严谨,但是为了同学们更好的理解就直接称为单链表的头结点。带头链表⾥的头结点,实际为“哨兵位”,哨兵位结点不存储任何有效元素,只是站在这⾥“放哨......
  • (算法)合并两个有序链表————<递归>
    1.题⽬链接:21.合并两个有序链表 2.题⽬描述: 3.解法(递归):算法思路:1.递归函数的含义:交给你两个链表的头结点,你帮我把它们合并起来,并且返回合并后的头结点;2.函数体:选择两个头结点中较⼩的结点作为最终合并后的头结点,然后将剩下的链表交给递归函数去处理;3.递归出......
  • day1-数组和链表
    力扣704.二分查找给定一个n个元素的有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回小标,否则返回-1。思路:二分查找法,定义左右边界[left,right);不断取中值缩小查找范围。classSolution{publicintsearch(int[]nums,int......
  • 代码随想录训练营 Day4打卡 链表part02 24. 两两交换链表中的节点 19.删除链表的倒数
    代码随想录训练营Day4打卡链表part02一、力扣24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]算法思路:引入虚......
  • 《算法笔记》总结No.10——链表
        从第10期破例插叙一期单链表的实现,这个东东相当重要!考研的同学也可以看:相较于王道考研的伪码不太相同,专注于可以运行。如果是笔试中的伪码,意思正确即可~ 注:博主之前写过一个版本的顺序表和单链表的C++实现,和这篇的写法有所不同,不过内容也较全,大家可以先行阅读~......
  • 在实际应用中,systemverilog相比vefilog2000有哪些重大的提升
    SystemVerilog相较于Verilog-2000有多项重大提升,这些提升使得SystemVerilog成为更强大的硬件描述和验证语言。以下是一些关键的改进:数据类型扩展:SystemVerilog引入了 logic 数据类型,可以替代Verilog-2000中的 wire 和 reg 类型,提供更灵活的使用方式。支持更广......
  • 初阶数据结构的实现2 双向链表
    1.双向链表1.1概念与结构1.2实现双向链表1.2.1定义程序目标#define_CRT_SECURE_NO_WARNINGS1#pragmaonce#include<stdio.h>#include<assert.h>#include<stdlib.h>#include<stdbool.h>typedefintLTDateType;//定义双向链表结构typedefstructListNode{......
  • 抽象队列同步器AQS
    AQS是AbstractQueuedSynchronizer的简称,即抽象队列同步器,从字面上可以这样理解:抽象:抽象类,只实现一些主要逻辑,有些方法由子类实现;队列:使用先进先出(FIFO)的队列存储数据;同步:实现了同步的功能。AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的同步......
  • 【软考】数据结构与算法基础 - 数组和链表
    一、数组和链表的区别(很简单,但是很常考,记得要回答全面)什么是数组:C++语言中,可以用数组,处理一组数据类型相同的数据,不可以动态定义数组的大小(使用前,必须指定大小。)在实际应用中,用户使用数组之前,无法确定数组的大小只能够将数组定义成足够大小,多余出来空间可能不被使用,......
  • 【数据结构】栈和队列
    数据结构是计算机存储、组织数据的方式。栈和队列是两种常用的线性数据结构,它们在程序设计中扮演着重要角色。一、栈(Stack)栈是一种遵循后进先出(LastInFirstOut,LIFO)原则的数据结构。其主要特点如下:1.基本操作:栈的操作主要有两种——压栈(push)和出栈(pop)。压栈:在栈顶插......