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

news2024/11/16 3:46:16

相关文章

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

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

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

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

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

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

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

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

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

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


6.带权重的轮询(第一部分)

        带权重的轮询(Weighted Round Robin, WRR)方案与常规的轮询方案类似,所不同的是不同的用户得到许可的机会存在差异,也就是说,不同的用户权重不同,权重高的用户得到许可的机会更多。权重的分配存在多种方式,这里介绍两种。第一种方法是为每个用户分配一个变量,该变量决定了在一个轮询周期内该用户能够得到许可(被授权)的次数。该变量是可以通过软件编程进行修改的,因此其轮询权重也可以相应调整。例如,有三个用户,agent0的权重为3,、agent1的权重为2、agent2的权重为1。在一个轮询周期中,agent0最大可以得到3次许可,agent1可以得到2次许可,agent2可以得到1次许可。在一个轮询周期开始时,变量N_agnt0、N_agnt1和N_agnt2分别被预置为3、2和1.每次轮询过后对应的变量值减1,一个轮询周期结束后,这些变量会被重新设置为预置的初值。如果所有的用户同时请求,仲裁器将按照下面两种方式之一给予许可:

        1、一个用户可以连续地获取许可,获得许可的次数由预置的权重值决定。当所有用户同时发出请求时,许可序列依次为:

                (A,A,A),(B,B),C,    (A,A,A),(B,B),C ......

        2、在所有存在许可机会的用户之间进行公平轮询,一个循环周期内,不同用户得到的总许可机会由预置的权重值决定。当所有请求同时发生时,许可序列为:

                A,B,C,A,B,A     B,C,A,B,A,A ......

        在第二种方案中,可软件编程的定时器被用于分配权重。一个仲裁周期开始时,定时器数值被加载。当一个用户获得许可后,定时器开始计时,直到计满,此时如果被授权的用户没有完成操作,仲裁器停止对当前用户的许可并根据优先级轮询下一个用户。

        下面是采用WRR轮询方案的Verilog代码及仿真结果,它采用的是第一种方法的第一种许可方式,序列为A,A,A,B,B,C...。

module arbiter_wrr(clk,resetb,req_vec,
                   req_vec_wt_0,
                   req_vec_wt_1,
                   req_vec_wt_2,
                   req_n_valid,
                   end_access_vec,
                   gnt_vec);
    input clk;
    input resetb;
    input [2:0] req_vec;
    input [3:0] req_vec_wt_0;
    input [3:0] req_vec_wt_1;
    input [3:0] req_vec_wt_2;
    input req_n_valid;
    input [2:0] end_access_vec;
    output reg [2:0] gnt_vec;
    
    reg [2:0] arbiter_state,arbiter_state_nxt;
    reg [2:0] gnt_vec_nxt;
    reg [3:0] count_req_vec [2:0];
    reg [3:0] count_req_vec_nxt [2:0];
    wire [3:0] req_vec_wt [2:0];
    reg [3:0] req_vec_wt_stored [2:0];
    reg [3:0] req_vec_wt_stored_nxt [2:0];
    wire [2:0] cnt_reqdone_vec;
    
    parameter IDLE = 3'b001;
    parameter ARM_VALUE = 3'b010;
    parameter END_ACCESS = 3'b100;
    

    assign req_vec_wt[0] = req_vec_wt_0;
    assign req_vec_wt[1] = req_vec_wt_1;
    assign req_vec_wt[2] = req_vec_wt_2;    

    always@(*) begin
        arbiter_state_nxt = arbiter_state;
        gnt_vec_nxt = gnt_vec;
        count_req_vec_nxt[0] = count_req_vec[0];
        count_req_vec_nxt[1] = count_req_vec[1];
        count_req_vec_nxt[2] = count_req_vec[2];
        req_vec_wt_stored_nxt[0] = req_vec_wt_stored[0];
        req_vec_wt_stored_nxt[1] = req_vec_wt_stored[1];
        req_vec_wt_stored_nxt[2] = req_vec_wt_stored[2];
        case(arbiter_state)
            IDLE:begin
                if(req_n_valid)begin
                    arbiter_state_nxt = ARM_VALUE;
                    count_req_vec_nxt[0] = req_vec_wt[0];
                    count_req_vec_nxt[1] = req_vec_wt[1];
                    count_req_vec_nxt[2] = req_vec_wt[2];
                    req_vec_wt_stored_nxt[0] = req_vec_wt[0];
                    req_vec_wt_stored_nxt[1] = req_vec_wt[1];
                    req_vec_wt_stored_nxt[2] = req_vec_wt[2];
                end
            end
            ARM_VALUE:begin
                if((gnt_vec == 0) ||
                   (end_access_vec[0] & gnt_vec[0]) ||
                   (end_access_vec[1] & gnt_vec[1]) ||
                   (end_access_vec[2] & gnt_vec[2]))
                    begin
                        if(req_vec[0] & !cnt_reqdone_vec[0]) begin
                            arbiter_state_nxt = END_ACCESS;
                            gnt_vec_nxt = 3'b001;
                            count_req_vec_nxt[0] = count_req_vec[0] - 1;
                        end
                        else if(req_vec[1] & !cnt_reqdone_vec[0]) begin
                            arbiter_state_nxt = END_ACCESS;
                            gnt_vec_nxt = 3'b010;
                            count_req_vec_nxt[1] = count_req_vec[1] - 1;
                        end
                        else if(req_vec[2] & !cnt_reqdone_vec[1]) begin
                            arbiter_state_nxt = END_ACCESS;
                            gnt_vec_nxt = 3'b100;
                            count_req_vec_nxt[2] = count_req_vec[2] - 1;
                        end
                        else begin
                            count_req_vec_nxt[0] = req_vec_wt_stored[0];
                            count_req_vec_nxt[1] = req_vec_wt_stored[1];
                            count_req_vec_nxt[2] = req_vec_wt_stored[2];
                            gnt_vec_nxt = 3'b0;
                        end
                    end
            end
            END_ACCESS:if((end_access_vec[0] & gnt_vec[0]) ||
                          (end_access_vec[1] & gnt_vec[1]) ||
                          (end_access_vec[2] & gnt_vec[2]))
                        begin
                            arbiter_state_nxt = ARM_VALUE;
                            
                            if(req_vec[0] & !cnt_reqdone_vec[0]) begin
                                arbiter_state_nxt = END_ACCESS;
                                gnt_vec_nxt = 3'b001;
                            count_req_vec_nxt[0] = count_req_vec[0] - 1;
                            end
                            else if(req_vec[1] & !cnt_reqdone_vec[0]) begin
                                arbiter_state_nxt = END_ACCESS;
                                gnt_vec_nxt = 3'b010;
                                count_req_vec_nxt[1] = count_req_vec[1] - 1;
                            end
                            else if(req_vec[2] & !cnt_reqdone_vec[1]) begin
                                arbiter_state_nxt = END_ACCESS;
                                gnt_vec_nxt = 3'b100;
                                count_req_vec_nxt[2] = count_req_vec[2] - 1;
                            end
                            else begin
                                count_req_vec_nxt[0] = req_vec_wt_stored[0];
                                count_req_vec_nxt[1] = req_vec_wt_stored[1];
                                count_req_vec_nxt[2] = req_vec_wt_stored[2];
                                gnt_vec_nxt = 3'b0;
                            end
                        end
        endcase
    end

    assign cnt_reqdone_vec[0] = (count_req_vec[0] == 0);
    assign cnt_reqdone_vec[1] = (count_req_vec[1] == 0);
    assign cnt_reqdone_vec[2] = (count_req_vec[2] == 0);
    
    always@(posedge clk or negedge resetb) begin
        if(!resetb) begin
            arbiter_state <= IDLE;
            gnt_vec <= 0;
            count_req_vec[0] <= 0;    
            count_req_vec[1] <= 0; 
            count_req_vec[2] <= 0;
            req_vec_wt_stored[0] <= 0;
            req_vec_wt_stored[1] <= 0;
            req_vec_wt_stored[2] <= 0; 
        end 
        else begin
            arbiter_state <= arbiter_state_nxt;
            gnt_vec <= gnt_vec_nxt;
            count_req_vec[0] <= count_req_vec_nxt[0];    
            count_req_vec[1] <= count_req_vec_nxt[1]; 
            count_req_vec[2] <= count_req_vec_nxt[2];
            req_vec_wt_stored[0] <= req_vec_wt_stored_nxt[0];
            req_vec_wt_stored[1] <= req_vec_wt_stored_nxt[1];
            req_vec_wt_stored[2] <= req_vec_wt_stored_nxt[2]; 
        end
    end
endmodule

        代码中使用了req_vec_wt_stored信号保存各用户的权重值,使用count_req_vec保存用户的当前剩余请求次数。注意:一旦出现了空档期,则所有用户的剩余请求次数会重置。

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

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

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

相关文章

网络安全|渗透测试入门学习,从零基础入门到精通—动态分析技术工具OllyDbg界面介绍

目录 动态分析技术调试器 什么是OllyDbg OllyDbg能干什么 OllyDbg窗口介绍 1、反汇编面板窗口 2、信息面板窗口 3、数据面板窗口 4、寄存器面板窗口 5、栈面板窗口 动态分析技术调试器 动态分析技术中最重要的工具是调试器&#xff0c;分为用户模式和内核模式两种类型…

【c++11】万能引用和完美转发

c11 万能引用完美转发 这一节是对上一篇右值引用的补充。 链接: 右值引用 万能引用 看如下代码 void Fun(int &x){ cout << "左值引用" << endl; } void Fun(const int &x){ cout << "const 左值引用" << endl; }void …

推荐四款常用在档案室温湿度记录的传感器记录仪

A.数字信号485信号输出的温湿度传感器/变送器 主要参数 液晶显示、485信号输出、9-24/VDC供电、壁挂式安装/吸顶式安装、走线/连接方式485总线、标准modbus RTU通讯协议 B。数字信号RJ45信号输出的温湿度传感器/变送器 ​主要参数 液晶显示、RJ45信号输出、9-24/VDC供电/标…

Zabbix Timeout 设置不当导致的问题

哈喽大家好&#xff0c;我是咸鱼 今天跟大家分享一个关于 zabbix Timeout 值设置不当导致的问题&#xff0c;这个问题不知道大家有没有碰到过 问题 事情经过是这样的&#xff1a; 把某一台 zabbix agent 的模板由原来的 Template OS Windows by Zabbix agent 换成了 Templa…

第一章:项目整体介绍【基于Servlet+JSP的图书管理系统】

一、项目介绍 1.项目说明 本项目是一个完全从0带领大家实现的一个非常基础的WEB项目&#xff0c;非常适合零基础和在校的大学生来动手实现。既能提升技术熟练度了解软件开发的具体过程。同时也能帮助大家搞定毕业设计的需求。之前在B站也分享了一个图书管理系统的视频。但是实…

超简单 display:flex教学

display 弹性盒子解释 Flex是Flexible Box的缩写&#xff0c;意为"弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。 它的作用&#xff1a; 它能够更加高效方便的控制元素的对齐、排列。 可以自动计算布局内元素的尺寸&#xff0c;无论这个元素的尺寸是固定的还是…

如何用文字生成图片?试试这几个方法吧

在日常生活中&#xff0c;想必很多小伙伴都喜欢绘画&#xff0c;但碍于自己平时需要上班、学习等等&#xff0c;没有时间去进行创作。不过&#xff0c;现在已经有很多ai绘画工具能帮助我们进行创作&#xff0c;而且操作简单&#xff0c;无需经验也可轻松上手&#xff0c;但你知…

三章:局域网架设+文件夹共享+防火墙配置

目录 一、路由器架设局域网 二、配置文件夹共享功能 为什么需要配置文件夹共享功能&#xff1f; 访问共享文件夹 配置取消用户名和密码认证 三、winServer2008防火墙配置 一、路由器架设局域网 1、进入路由器的管理界面 2、网络参数 -> LAN口设置 3、IP地址为路由器的ip…

大数据应用——HBASE实验

任务一&#xff1a;搭建HBase集群 1.1 搭建Zookeeper 1. 官网下载Linux环境的tar包 &#xff08;1&#xff09;官网地址&#xff1a;Apache ZooKeeper &#xff08;2&#xff09;下载Linux环境的tar包 2. 拷贝安装包到Linux系统下并解压到指定目录 [hadoophadoop101 softwar…

佩戴舒适的蓝牙耳机推荐,内行推荐这五大品牌蓝牙耳机

真无线蓝牙耳机怎么选购&#xff1f;对新手来说有点难度&#xff0c;看见很多网友都在讨论这些问题&#xff0c;蓝牙耳机什么品牌好&#xff1f;音质表现好的有哪些&#xff1f;佩戴舒适性好的又有哪些值得入手的&#xff1f;等等大量问题。我从网上整理五款佩戴舒适且音质表现…

linux(线程互斥与同步下)

目录&#xff1a; 1.条件变量概念 2.生产者消费者模型 3.将条件变量生产者消费者blockqueue&#xff08;阻塞队列&#xff09;生产者消费者模型 4.重新复盘生产者消费者模型应用的理解 ------------------------------------------------------------------------------------…

智慧垃圾分类大数据可视化监管系统

前言 随着城市化进程的不断加快和居民生活水平的日益提高&#xff0c;城市生活垃圾产生量亦在与日剧增。 建设背景 随着城镇化进程加速、人民生活水平持续提升,城市生活垃圾产生量也在逐年增长。生活垃圾是“放错地方的资源”,能否处理好这些“放错地方的资源”,关系着城乡人…

HackTheBox - 学院【CPTS】复习4 - Web Attacks

Web Attacks 本模块涵盖三种常见的 Web 漏洞&#xff0c;即 HTTP 动词篡改、IDOR 和 XXE&#xff0c;每个漏洞都可能对公司的系统产生重大影响。我们将介绍如何通过各种方法识别、利用和防止它们中的每一个。 HTTP HEAD/GET/POST/PUT/OPTIONS IDOR寻找 一般能够从前端js找到…

HTML5 新增的标签有哪些

HTML5&#xff08;超文本标记语言第五版&#xff09;是一种用于创建和呈现网页内容的标准标记语言。是最新的html标准&#xff0c;拥有新的语义、图形以及多媒体元素&#xff0c;简化web应用程序&#xff0c;专为丰富的web内容而设计的&#xff0c;简称“H5”。 语义化标签 H5是…

大数据下批处理性能问题分析优化分享

大数据下批处理性能问题分析优化分享 互联网的步伐加速了硬件资源的发展&#xff0c;而硬件资源的改进&#xff0c;促进社会的建设的快速发展&#xff0c;特别是这互联互通大数据时代&#xff0c;多用户大数据下&#xff0c;单核服务器无法承受处理&#xff0c;特别是对于一个并…

【AI底层逻辑】——篇章3(上):数据、信息与知识香农信息论信息熵

目录 引入 一、数据、信息、知识 二、“用信息丈量世界” 1、香农信息三定律 2、一条信息的价值 3、信息的熵 总结 引入 AI是一种处理信息的模型&#xff0c;我们把信息当作一种内容的载体&#xff0c;计算机发明以前很少有人思考它的本质是什么。随着通信技术的发展&a…

【C++从入门到放弃】模板进阶——非类型模板参数、类模板的特化、模板的分离编译

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《C从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; 模板进…

行业报告 | 人工智能现状报告(中)

原创 | 文 BFT 机器人 03 行业 与NVIDIA的GPU相比&#xff0c;后起之秀的AL芯片公司还有机会吗? NVIDIA公司的FY2021数据中心收入为106亿美元。在2021年4月&#xff0c;他们确认了32.6亿美元&#xff0c;按年度计算&#xff0c;这比排名前二的人工智能半导体初创公司的估值总和…

Android 14 新功能:区域偏好 Regional Preferences

翻译自 https://alexzh.com/regional-preferences-in-android-14/ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9YLBwPZs-1687502002096)(/Users/ellisonchan/Nutstore Files/ellison-wiki/docs/文章输出/原创/locale/android14-base-locale.png)]…

微信管理系统太多?该如何选择

“您的手机号就是您的微信号吗&#xff1f;我可以加您微信&#xff0c;然后给您发送我们的产品资料和报价。” 毕竟微信是一个月活跃用户超过10亿的应用&#xff0c;成为企业员工&#xff0c;尤其是销售人员沟通联络的首要选择&#xff0c;即使有其他专用办公工具&#xff0c;…