数字IC前端学习笔记:近期最少使用(LRU)算法

news2024/10/5 17:17:09

相关文章

数字IC前端学习笔记:LSFR(线性反馈移位寄存器)

数字IC前端学习笔记:跨时钟域信号同步

数字IC前端学习笔记:信号同步和边沿检测

数字IC前端学习笔记:锁存器Latch的综合

数字IC前端学习笔记:格雷码(含Verilog实现的二进制格雷码转换器)

数字IC前端学习笔记:FIFO的Verilog实现(一)

数字IC前端学习笔记:FIFO的Verilog实现(二)

数字IC前端学习笔记:仲裁轮询(一)

数字IC前端学习笔记:仲裁轮询(二)

数字IC前端学习笔记:仲裁轮询(三)

数字IC前端学习笔记:仲裁轮询(四)

数字IC前端学习笔记:仲裁轮询(五)

数字IC前端学习笔记:仲裁轮询(六)


目录

1.LRU简介

2.LRU的矩阵实现

3.采用矩阵法实现LRU的Verilog代码


1.LRU简介

        LRU算法用于cache管理或任何其他需要对访问权进行周期更新的场合。基于时间和空间考虑,cache中存储着近期将会用到的数据项。当cache被用满后,如果有新的数据项到来,需要将某个现有的数据项从cache中清除,为新进入者提供空间。此时通常使用的算法被称为LRU(Least Recently Used,近期最少使用),通过LRU算法可以找到最久未被使用过的数据项,cache将该数据项清除,并将新的数据项写入此处。

        另一个会用到LRU算法的地方是网络设备中的路由表管理电路。路由表的地址空间非常大,而在网络设备中用于存储路由表的存储器相对小得多,因此只有一部分路由表表项可以存储在CAM(Content Addressable Memory)存储器中,那么需要采用LRU算法找到当前CAM中最久未用过的表项,将其清楚后把新的表项写入,新的表项成为最新表项。

2.LRU的矩阵实现

        在RTL级实现LRU算法的方法有多种。一种采用硬件实现LRU的方法是矩阵法。例如,有一个表,可存储4个表项,当前表项为A,B,C和D。我们的目标是确定哪一个是最久没有被访问过的,具体步骤如下:

  • 构建一个4×4的存储单元矩阵(每个存储单元是一个触发器)。
  • 将所有触发器初始化为零。
  • 无论何时,只要有一个表项被访问,则将其对应的一行全部置1,然后将其对应列全部置0。
  • 只要某个表项被访问,重复上一步操作。
  • 全零的一行对应的表项是近期最少使用者,是要被新的表项代替的对象。

        假定访问顺序为A,D,C,A,B,在此情形下,D是最近使用最少的表项,它应该被替换掉。下面用4×4矩阵解释上述算法。

        初始条件

ABCD
A0000
B0000
C0000
D0000

        参考序列:A

ABCD
A0111
B0000
C0000
D0000

        参考序列:A、D

ABCD
A0110
B0000
C0000
D1110

        参考序列:A、D、C

ABCD
A0100
B0000
C1101
D1100

        参考序列:A、D、C、A

ABCD
A0111
B0000
C0101
D0100

        参考序列:A、D、C、A、B

ABCD
A0011
B1011
C0001
D0000

        D行为全零,是近期最少使用者。B行的1最多,是近期最多使用者。

3.采用矩阵法实现LRU的Verilog代码

module matrix_lru #(parameter SIZE = 8)
       (clk, rstb,
        update_the_entry,
        update_index,
        lru_index);
    input clk;
    input rstb;
    input update_the_entry;
    input [2:0] update_index;
    output [2:0] lru_index;
    reg [(SIZE - 1):0] matrix [0:(SIZE - 1)];
    reg [(SIZE - 1):0] matrix_nxt [0:(SIZE - 1)];
    reg [2:0] lru_index;
    reg [2:0] lru_index_nxt;
    
    generate
        genvar i;
        for(i = 0; i < SIZE; i = i + 1) begin
            always@(posedge clk or negedge rstb) begin
                if(!rstb)
                    matrix[i] <= 0;
                else 
                    matrix[i] <= matrix_nxt[i];
            end
        end
    endgenerate

    generate
        genvar j, k;
        for (j = 0; j < SIZE; j = j + 1) begin
            for(k = 0; k < SIZE; k = k + 1)begin
                always@(*) begin
                matrix_nxt[j][k] = matrix[j][k];
                if(update_the_entry && (j == update_index) && (k != update_index))
                    matrix_nxt[j][k] = 1'b1;
                else if(update_the_entry && (k == update_index))
                    matrix_nxt[j][k] = 1'b0;
                end
            end
        end
    endgenerate

    always@(*) begin
        lru_index_nxt = lru_index;
        
        if(matrix[0] == 8'b0)
            lru_index_nxt = 0;
        else if(matrix[1] == 8'b0)
            lru_index_nxt = 1;
        else if(matrix[2] == 8'b0)
            lru_index_nxt = 2;
        else if(matrix[3] == 8'b0)
            lru_index_nxt = 3;
        else if(matrix[4] == 8'b0)
            lru_index_nxt = 4;
        else if(matrix[5] == 8'b0)
            lru_index_nxt = 5;
        else if(matrix[6] == 8'b0)
            lru_index_nxt = 6;
        else if(matrix[7] == 8'b0)
            lru_index_nxt = 7;
    end
    
    always@(*) begin
        if(!rstb)
            lru_index <= 0;
        else
            lru_index <= !lru_index_nxt;
    end
endmodule

        仿真截图如下所示。

 以上内容来源于《Verilog高级数字系统设计技术和实例分析》

        

                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/704814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java新特性-Functon接口

Java新特性-Functon接口 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ Spring专栏&#x1f449;https://blog.csdn.net/weixin_53580595/category_12279588.html Sprin…

使用CRM系统如何让你的企业受益

随着市场的竞争日益加剧&#xff0c;企业需要更好地管理客户关系和提高销售。为此&#xff0c;很多企业已经开始使用CRM系统。CRM系统是一种管理客户关系的工具&#xff0c;可以帮助企业更好地了解客户需求&#xff0c;提高销售效率&#xff0c;提高客户满意度和忠诚度等。在这…

【ARM AMBA APB 入门 2 -- Debug APB总线介绍】

文章目录 1.1 DEBUG APB 介绍1.1.1 Debug APB interface 1.2 Debug APB 与 APB 的区别 1.1 DEBUG APB 介绍 ARM Debug APB是一种用于调试ARM处理器的总线协议。它是一种简化的、低功耗的调试接口&#xff0c;用于与处理器内部的调试逻辑进行通信。 ARM Debug APB具有以下特点…

使用Py2neo构建知识图谱(概念与实现)

知识图谱是一种用于描述实体之间关系的图形化知识表示方法&#xff0c;它将实体、属性和关系组织成一个大型的、半结构化的知识库。知识图谱的应用非常广泛&#xff0c;包括语义搜索、智能问答、个性化推荐、内容分发等领域。 知识图谱的构建方法有很多种&#xff0c;其中比较…

基于SpringBoot和Vue的医疗设备管理系统的设计与实现(源码+文档+报告)

伴随着网络技术的发展&#xff0c;网络巨头们也在各自的行业中展开了激烈的竞争。网络技术已经渗透到了社会的各个角落&#xff0c;移动支付、远程医疗和健康管理等多种网络技术的普及也日益广泛。同时&#xff0c;网络产业的崛起也极大地影响了传统产业。对医疗设备管理系统的…

Axure设计之动态柱状图教程(中继器)

中继器作为复杂的元件&#xff0c;通常被用来制作“高保真”的动态原型&#xff0c;以达到良好的视觉效果和交互效果。本文将教大家通过AxureRP9工具如何使用中继器设计动态柱状图表。 一、案例效果 下载地址&#xff1a; https://download.csdn.net/download/u010709330/8797…

多元分类预测 | Matlab鹈鹕算法(POA)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,POA-HKELM分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab鹈鹕算法(POA)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,POA-HKELM分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab…

QT5.12安卓环境的搭建(转载保存留档查看)

1. QT环境搭建 Qt 5.12.6安装的时候 添加 “Android ARM64-v8a”&#xff0c;也可以添加 “Android ARMv7” 。 &#xff08;其它为搭建qgc时需要添加的&#xff09; 2. Android 环境搭建 QT官方的指导&#xff1a; Qt 5.12 Getting Started with Qt for Android Qt 5.15 …

C语言-函数栈帧(每次调用函数,开辟函数的大概流程)

思路&#xff1a; emm&#xff0c;有点懵&#xff0c;这一块&#xff0c;只知道个大概&#xff0c;如果后期我深挖的话&#xff0c;我再回头来补充上图括号的位置&#xff0c;便是每次创建&#xff0c;调用函数的时候&#xff0c;所产生的函数栈帧&#xff0c;也可以理解为每次…

(五)Qt 动态手势识别“左右滑动”以及实现翻页效果

系列文章目录 通过Qt实现手势识别控制软件操作相关系列技术方案 &#xff08;一&#xff09;Qt 将某控件、图案绘制在最前面的方法&#xff0c;通过QGraphicsScene模块实现 &#xff08;二&#xff09;Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方&#xff0c;实现圆…

Spring Boot 中的 SockJS

Spring Boot 中的 SockJS 在 Spring Boot 中&#xff0c;SockJS 是一个用于实现 WebSocket 的兼容性解决方案。本文将介绍 SockJS 的原理、使用方法和示例代码。 什么是 SockJS SockJS 是一种浏览器与服务器之间的通信协议&#xff0c;它可以在浏览器和服务器之间建立一个基于…

python--tornado服务

一、前言 Tornado是一个基于非阻塞I/O的Web框架&#xff0c;具有可以处理大量并发连接&#xff0c;适用于高并发的场景的高性能&#xff0c;轻量级和异步支持的优点。 本篇主要展示了使用 tornado http post 和 get 服务 二、代码 tornado http post 和 get 服务 # -*- codin…

视频拼接融合产品的产品与架构设计(一)

1视频拼接产品概述 将多达8个视频拼接在一起&#xff0c;拼成上帝视角的大图&#xff0c;并且可以共享最终生成的画面。 1.1 三维方案 三维方案是我在晚上思考的时候无意想到&#xff0c;这种方案应该是最接近事实的方案&#xff0c;多个画面应该是在三个维度&#xff0c;x&…

智慧产业园区管理系统主要包含哪些

智能设备管理 本文介绍的是智慧产业园区管理系统中的智能设备管理。智能设备管理是智慧产业园区管理系统中的重要组成部分&#xff0c;它可以为企业提供高效、智能化的设备管理服务。通过智能设备管理系统&#xff0c;企业可以对设备进行实时监控和在线运维&#xff0c;及时发…

JS知识点汇总(五)--执行上下文

1. JavaScript中执行上下文和执行栈是什么&#xff1f; 1、执行上下文 执行上下文是一种对Javascript代码执行环境的抽象概念&#xff0c;也就是说只要有Javascript代码运行&#xff0c;那么它就一定是运行在执行上下文中 执行上下文的类型分为三种&#xff1a; 全局执行上…

2023年智慧水利综合解决方案,数字孪生,领导驾驶舱,水文监测

导读&#xff1a;原文《2023年智慧水利综合解决方案》共56页PPT&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式&#xff1a; 如需获取…

C++数据结构笔记(4)企业链表的实现(Linux内核链表)

1.企业链表本质上是一种Linux内核链表。 2.最本质的区别在于&#xff0c;传统的结点类型中直接同时包含了指针域和数据域&#xff0c;用来实现和其他结点之间的串联&#xff1b;而在企业链表中&#xff0c;结点本身只含有指针域&#xff0c;而数据部分的具体实现则在测试文件中…

细数 List 的10个坑,保证你一定遇到过!

List 在实际的业务开发中&#xff0c;使用的非常频繁&#xff0c;但同样也有不少的坑&#xff0c;一旦使用不当&#xff0c;就可能带来一系列的问题&#xff1b;今天我们主要来说一说这些问题&#xff0c;以及面对这些坑的时候我们要怎么解决。 Arrays.asList转换基本类型数组…

深度学习----第J2周:ResNet50V2算法实现

深度学习----第J2周&#xff1a;ResNet50V2算法实现 文章目录 深度学习----第J2周&#xff1a;ResNet50V2算法实现前言一、ResNetV2与ResNet结构对比二、模型复现2.1 Residual Block2.2 堆叠的 Residual Block2.3 ResNet50V22.4 查看模型结构2.5 tf下全部代码 三、Pytorch复现3…

有哪些数据分析的工具?

来了&#xff0c;9款大数据&数据分析工具推荐&#xff0c;分享点和别人不一样的。 一、基于 Apache Hudi 的 Onehouse https://www.onehouse.ai 近日&#xff0c;开源大数据项目 Apache Hudi 创始人 Vinoth Chandar 发文官宣基于 Hudi 构建的商业公司和产品 Onehouse&…