verilog实例-近期最少使用算法(LRU)

这篇具有很好参考价值的文章主要介绍了verilog实例-近期最少使用算法(LRU)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、LRU(Least Recently Used)简介

LRU算法用于cache管理或任何其他需要对访问权进行周期更新的场合。

  • 基于时间和空间考虑,cache中存储着近期将会用到的数据项。当cache被用满后,如果有新的数据项到来,需要将某个现有的数据项从cache中清除,为新进入者提供空间。此时通常使用的算法被称为LRU(Least Recently Used,近期最少使用),通过LRU算法可以找到最久未被使用过的数据项,cache将该数据项清除,并将新的数据项写入此处。
  • 另一个会用到LRU算法的地方是网络设备中的路由表管理电路。路由表的地址空间非常大,而在网络设备中用于存储路由表的存储器相对小得多,因此只有一部分路由表表项可以存储在CAM(Content Addressable Memory)存储器中。当CAM被用满后,如果有新的路由表表项到来,那么需要采用LRU算法找到当前CAM中最久未用过的表项,将其清除后把新的表项写人,新的表项成为最新表项。

2、LRU的矩阵实现

在RTL级实现LRU算法的方法有多种。一种采用硬件实现LRU的方法是矩阵法

  • 例如,有一个表,可存储4个表项,当前表项为A、B、C和D。我们的目标是确定哪一个是最久没有被访问过的,具体步骤如下:
    • 构建一个4×4的存储单元矩阵(每个存储单元是一个触发器)。
    • 将所有触发器初始化为零。
    • 无论何时,只要有一个表项被访问,其对应的一全部置为1,其对应全部置为0。
    • 只要某个表项被访问,重复上一步操作。
    • 全零的一行对应的表项是近期最少使用者,是要被新的表项替代的对象。

假定访问顺序为A、D、C、A、B,在此情形下,D是最近使用最少的表项,它应该被替换掉。下面用4×4矩阵解释上述算法。
最近最少使用算法,verilog实例设计,fpga开发
最近最少使用算法,verilog实例设计,fpga开发
可见,D行全为零,是近期最少使用者。B行的1最多,是近期最多使用者。文章来源地址https://www.toymoban.com/news/detail-720614.html

3、RTL design

/*----------------------------------------------------------
Filename				:	LRU
Author					:	deilt
Description				:	Least Recently Used, matrix 矩阵法
Called by				:	
Revision History		:	11/1/2022
                            Revison 1.0
Email					:	cjdeilt@qq.com
Company:Deilt Technology.INC
Copyright(c) 1999, Deilt Technology Inc, All right reserved
--------------------------------------------------------------*/
module LRU
#(
    parameter       SIZE = 8
)
(
    input           clk             ,
    input           rstn            ,
    input           update_entry    ,
    input [2:0]     update_index    ,
    output[2:0]     lru_index       
);
    reg [SIZE-1:0]  matrix[SIZE-1:0]        ;
    reg [SIZE-1:0]  matrix_nxt[SIZE-1:0]    ;
    reg [2:0]       lru_index               ;
    reg [2:0]       lru_index_nxt           ;
    

    //resetn all unit of matrix to zero
    generate
        genvar i;
        for(i=0;i<SIZE;i=i+1)
            begin
                always@(posedge clk or negedge rstn)begin
                    if(!rstn)
                        matrix[i] <= 'd0        ;
                    else
                        matrix[i] <= matrix_nxt[i]  ;
                end
            end
    endgenerate
    
    //when update_index put in as i, then matrix[i] = 8'b1, matrix[i][i] = 1'b0
    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_entry && j == update_index && k != update_index)
                            matrix_nxt[j][k] = 1'b1 ;
                        else if(update_entry && j == update_index && k == update_index)
                            matrix_nxt[j][k] = 1'b0 ;
                    end
                end
        end
    endgenerate

    //output the lru_index
    always @(*) begin
        lru_index_nxt = lru_index ;
        if(matrix[0]=='d0)
            lru_index_nxt = 0   ;
        else if(matrix[1] == 'd0)
            lru_index_nxt = 1   ;
        else if(matrix[2] == 'd0)
            lru_index_nxt = 2   ;
        else if(matrix[3] == 'd0)
            lru_index_nxt = 3   ;
        else if(matrix[4] == 'd0)
            lru_index_nxt = 4   ;
        else if(matrix[5] == 'd0)
            lru_index_nxt = 5   ; 
        else if(matrix[6] == 'd0)
            lru_index_nxt = 6   ;
        else if(matrix[7] == 'd0)
            lru_index_nxt = 7   ;       
    end


    always @(posedge clk or negedge rstn)begin
        if(!rstn)
            lru_index <= 'd0;
        else
            lru_index <= lru_index_nxt;
    end

endmodule

到了这里,关于verilog实例-近期最少使用算法(LRU)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • codeTop01:LRU (最近最少使用) 缓存的实现

    请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: ● LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 ● int get(int key) 如果 key 存在于缓存中,则返回的值,否则返回 -1 。 ● void put(int key, int value) 如果 key 已

    2024年03月08日
    浏览(45)
  • 146. LRU Cache最近最少使用 (LRU) 缓存 Least Recently Used (LRU) cache.

    Design a data structure that follows the constraints of a Least Recently Used (LRU) cache. Implement the LRUCache class: LRUCache(int capacity) Initialize the LRU cache with positive size capacity. int get(int key) Return the value of the key if the key exists, otherwise return -1. void put(int key, int value) Update the value of the key if the key exists. O

    2024年02月10日
    浏览(56)
  • Verilog设计实例(二):交通信号灯设计实例

    本文为Verilog实例开发的第二弹,缺少Verilog代码练手或者有些生疏的可以在这里参考一些设计实例进行练习。 本系列导航: Verilog设计实例(一):自动售货机设计实例 设计一个交通灯控制电路,红灯30s后转为绿灯。共x,y方向两组交通灯,每组红绿灯各一个,红灯亮30s,绿

    2024年02月03日
    浏览(87)
  • Verilog设计实例(一):自动售货机设计实例

    本系列为FPGA设计实例,基于Verilog HDL,题目一般是我在网上看到的一些FPGA相关的实验题目,基本会是一个实际场景的系统实现,而不是简单单元的设计,这是为了能更全面的练习,这些实例一般是可以基于FPGA进行实现的,因为正好手里有一块zynq板子,所以想把这个东西用起

    2024年02月05日
    浏览(35)
  • 【算法训练-模拟 一】模拟设计LRU缓存结构

    废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是LRU缓存结构设计,这类题目出现频率还是很高的,几乎所有大厂都常考。 当然面对这道题,首先要讲清楚LRU是干什么的 LRU(Least Recently Used)缓存结构是一种常见的缓存管理策略, 用于

    2024年02月10日
    浏览(53)
  • 【算法设计与分析】分治法(最近点对问题)

    目录 实验目的 实验内容与结果 蛮力法求解 分治法求解 实验总结 (1)掌握分治法思想。 (2)学会最近点对问题求解方法。 算法过程: 遍历n个点与剩余n-1个点之间的距离,在计算点对距离时不断更新最短距离的值,遍历完所有点对后即可求得最短点对距离。 伪代码: 复

    2024年02月08日
    浏览(48)
  • 算法通过村第五关-队列和Hash黄金笔记|LRU的设计与实现

    提示:我曾如此渴望命运的波澜,到最后才发现:人生最曼妙的风景,竟是内心的淡定从容。 我们层如此盼望世界的认可,到最后才知道:世界是自己,与他人毫无关系。 --杨绛 LRU 是非常经典的问题,而且在常年的算法中也是热门,但是他是存在技巧的,我们这就来一起看

    2024年02月09日
    浏览(38)
  • 选读SQL经典实例笔记17_最多和最少

    2024年02月14日
    浏览(34)
  • 操作系统:用C语言模拟先进先出的算法(FIFO)、最久未使用算法(LRU)、改进的Clock置换算法的命中率。

      通过请求页面式存储管理中页面置换算法设计,了解存储技术的特点,掌握请求页式存储管理的页面置换算法。 用程序实现生产者——消费者问题,将指令序列转换为用户虚存中的请求调用页面流。 具体要求: l页面大小为1K l用户内存容量为4页到40页 l用户外存的容量为

    2024年02月03日
    浏览(53)
  • FPGA verilog设计的MODBUS CRC算法

    已经测试通过。 `timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 20:14:12 05/18/2023 // Design Name: // Module Name: Modbus_CRC // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module Modbus_CRC( input clk, input rst

    2024年02月06日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包