Verilog | 轮询仲裁

news2024/11/27 4:16:34

仲裁

当多个源和用户需要共享同一资源时,需要某种仲裁形式,使得所有用户基于一定的规则或算法得到获取或访问共享资源的机会。

仲裁方案

  • 严格优先级轮询
    • 根据优先级的差异,用户访问共享资源的机会也不同。
    • 低优先级的用户可能时钟无法得到资源。
  • 公平轮询
    • 公平的对待所有请求。
    • 所有用户获得均等的访问机会,不会有用户时钟无法得到资源。
  • 权重轮询
    • 兼顾了公平性和差异性。
    • 在一个轮询周期内,不同权重的用户会得到不同的访问次数。
    • 在一个轮询周期内,不同权重的用户会得到不同的访问时间片。
  • 混合优先级(高优先级组和低优先级组)
    • 组间按照优先级轮询,组内采用公平轮询。

严格优先级轮询

  • 在严格优先级轮询方案中,发出请求的用户有固定的优先级。
  • 我们假设有8个用户(agent),agent0具有最高优先级,agent7具有最低优先级。
  • 在本方案中,优先级高的用户只要保持请求,就会持续得到授权。随着优先级不断降低,用户得到授权的机会也随之下降。该方案可以根据用户的重要新提供不同的服务,但低优先级的用户可能长时间得不到服务。此时可以通过对高优先级用户增加一些请求约束的方法来避免低优先级用户被“饿死”。

公平轮询

  • 在公平轮询方案中,所有用户优先级相等,每个用户依次获得授权。
  • 一开始,选择用户的顺序可以是任意的,但在一个轮询周期内,所有发出请求的用户都有公平得到授权的机会。以具有4个用户的总线为例,它们全部将请求信号置为有效(高电平)。request0将首先被授权,紧跟着是request1、request2,最后是request.3。当循环完成后,request0才会被重新授权。
  • 仲裁器每次仲裁时,依次查看每个用户的请求信号是否有效,如果一个用户的请求无效,那么将按序查看下一个用户。仲裁器会记住上一次被授权的用户,当该用户的操作完成后,仲裁器会按序轮询其他用户是否有请求。
  • 一旦某个用户得到了授权,它可以长时间使用总线或占用资源,直到当前数据包传送结束或一个访问过程结束后,仲裁器才会授权其他用户进行操作。这种方案的一个特点是仲裁器没有对用户获得授权后使用总线或访问资源的时间进行约束。该方案适用于基于数据包的协议,例如,以太网交换或PCI交换机,当多个入口的包希望从一个端口输出时,可以采用这种机制。
  • 此外还有一种机制,每个用户获得授权后,可以占用资源的时间片长度是受约束的,每个用户可以占用资源的时间不能超过规定的长度。如果一个用户在所分配的时间结束之前完成了操作,仲裁器将轮询后续的用户。如果在分配的时间内用户没有完成操作,则仲裁器收回授权并轮询后续用户。此方案适用于突发操作,每次处理一个突发(一个数据块),此时没有数据包的概念。传统的PCI总线或AMBA、AHB总线采用的就是这种方案。在PC中,仲裁器会给当前获得授权的主机留出一个或多个时钟周期的时间供主机保存当前操作信息,下一次再获得授权时,该主机可以接着传输数据。

公平轮询(仲裁w/o死周期)

  • 在前面公平轮询仲裁器的Verilog RTL代码中,每个用户有三个信号:request(请求)、grant(授权)和end access(结束访问)。为了满足定时要求,我们希望grant为寄存器输出的,同时用户的输出数据也是寄存器输出而不是通过组合逻辑输出的。在总线使用时,我们能观察到总线上存在不能进行数据传输的死周期。当传输的数据包较长或每个突发比较长时,其对传输效率影响不大。然而,当数据包很短时,死周期会影响到总线的使用效率。
  • 如图所示为没有间隔的公平轮询仲裁波形。下面给出了一些方法,用于减少甚至消除死周期。

design detil

  • 当grant信号有效时,该用户的第一个数据已经准备好并且有效输出。原来的方案中,在用户的grant有效后,它在下一个周期输出数据,现在改为当grant采样为高时,在同一个周期就开始输出数据。此时需要用户提前从内部电路中读出第一个数据。采用这种方案时,仲裁器的设计不变,用户部分需要进行修改。
  • 第二种方法是增加额外的信号start_access,它和end_access一起使用。一个用户获得总线使用权并开始操作后,仲裁器通过将start_accees置为有效表示开始新的仲裁过程而不是等待end_access信号变高来开始新的仲裁过程,这样就减少了转换期间的死周期。当下一个用户被授权时,当前用户仍在使用总线,此时新用户不能立即使用总线。仲裁器在当前用户完成操作时会给出end_access_outf信号,新的授权用户此后就可以开始操作了。仲裁器在没有用户使用公共资源时,将resource_idle置为1。当resource_idle为1时,获得授权的用户不需要查看end_access_out信号就可以开始数据操作。

权重轮询(WRR)

  • 带权重的轮询(Weighted Round Robin,WRR)方案与常规的轮询方案类似,所不同的是不同的用户得到许可的机会存在差异,也就是说,不同的用户权重不同,权重高的用户得到许可的机会更多。
  • 权重的分配存在多种方式,这里介绍两种。
    • 第一种方法是为每个用户分配一个变量,该变量决定了在一个轮询周期内该用户能够得到许可(被授权)的次数。该变量是可以通过软件编程进行修改的,因此其轮询权重也可以相应调整。

      • 例如,有三个用户,agent0权重为3、agentl权重为2、agent2权重为1。在一个轮询周期中,agent0最大可以得到3次许可,agent1可以得到2次许可,agent22可以得到1次许可。在一个轮询周期开始时,变量N_agnt0、N_ agnt1和Nagnt_2分别被预置为3、2和1。每次轮询后对应的变量值减1,一个轮询周期结束后,这些变量会被重新设置为预置的初值。

      • 如果所有的用户同时请求,仲裁器将按照下面两种方式给予许可:

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

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

    • 在另一种方案中,可软件编程的定时器被用于分配权重。一个仲裁周期开始时,定时器数值被加载到本地变量中。当一个用户获得许可后,本地变量减1,直到减至0为止。如果被轮询的用户没有完成操作,仲裁器停止对当前用户的许可并根据优先级轮询下一个用户。

接下来,我们给出了采用WRR轮询方案的Verilog RTL代码及仿真结果,它采用的是第一种许可方式,序列为A,A,A,B,B,C…。

权重轮询(WRR):第二种方法

(1)design detil

下面是采用第二种权重轮询方式的Verilog代码及仿真结果,当所有用户都同时发出请求时,轮询序列为:

两组轮询(混合轮询)

  • 在一些应用中,用户被分成两组:快组和慢组。
  • 如图所示,快组内的用户具有相同的优先级,内部采用公平轮询方式。类似地,慢组内的用户也具有相同优先级,慢组内部也采用公平轮询方式。快组、慢组之间采用权重轮询方式。
  • 例如,快组有两个用户(A,B),慢组也有两个用户(C,D)。如果所有用户都发出请求,那么轮询序列为:

参考《verilog高级数字系统设计技术与实例分析》,仅用于本人记录学习笔记,如有侵权请联系删除。

权重轮询仲裁代码

所谓轮询仲裁,就是指每次访问结束后都会更新优先级,举个栗子:假设有N个请求,分别编号为0,1,2,…,N-1,初始时刻,这N个请求的优先级为0>1>2>…>N-1,某个时刻,仲裁器将总线的控制权交给了请求i(0<=i<=N-1),则这之后这N个请求的优先级修改为i+1>i+2>…>N-1>0>1>…>i。

在本文中,我们设计了一个3请求的总线仲裁器,代码如下:


`timescale 1ns/10ps
module bus_arbitor(
    input logic clk, 
    input logic rst_n, 
    input logic signal_a,                     //三个主机,轮询仲裁 
    input logic signal_b,
    input logic signal_c, 
    output logic [1:0] grant);
logic [1:0] last_grant;                  //记录上一次总线仲裁结果
parameter A = 2'b00;                     //将总线控制权交给A
parameter B = 2'b01;                     //总线控制权交给B
parameter C=  2'b10;                     //总线控制权交给C
parameter NULL = 2'b11;                  //
always@(posedge clk,negedge rst_n)
if(~rst_n)
begin
     grant<=NULL;
     last_grant<=NULL;
end
else 
begin
    case({signal_a,signal_b,signal_c})
        3'b000:begin
                   grant<=NULL;
                   last_grant<=last_grant;
        end
        3'b001:begin 
                  grant<=C;
                  last_grant<=C;
        end
        3'b010:begin
                  grant<=B;
                  last_grant<=B;
        end
        3'b100:begin
                  grant<=A;
                  last_grant<=A;
        end
        3'b110:begin           //A,B同时请求总线,需要进行仲裁
                  case(last_grant)
                      A:begin grant<=B;last_grant<=B;end
                      B:begin grant<=A;last_grant<=A;end
                      C:begin grant<=A;last_grant<=A;end
                      NULL:begin grant<=A;last_grant<=A;end
                  endcase
        end
        3'b101:begin             //A,C同时请求总线
                   case(last_grant)
                       A:begin grant<=C;last_grant<=C;end
                       B:begin grant<=C;last_grant<=C;end
                       C:begin grant<=A;last_grant<=A;end
                       NULL:begin grant<=A;last_grant<=A;end
                   endcase
        end
        3'b011:begin           //B,C同时请求总线
                   case(last_grant)
                       A:begin grant<=B;last_grant<=B;end
                       B:begin grant<=C;last_grant<=C;end
                       C:begin grant<=B;last_grant<=B;end
                       NULL:begin grant<=B;last_grant<=B;end
                   endcase
        end
        3'b111:begin            //三个总线同时请求
                  case(last_grant)
                      A:begin grant<=B;last_grant<=B;end
                      B:begin grant<=C;last_grant<=C;end
                      C:begin grant<=A;last_grant<=A;end
                      NULL:begin grant<=A;last_grant<=A;end
                  endcase
        end
        default:begin grant<=NULL;last_grant<=last_grant;end
    endcase
end
endmodule

tb代码

`timescale 1ns / 1ps

module sim_tb;
logic clk;
logic rst_n;
logic signal_a;
logic signal_b;
logic signal_c;
logic [1:0] grant;
initial begin
    clk=0;
    forever begin
        #5 clk=~clk;
    end
end
//rst_n
initial
begin
    rst_n=0;
    #100
    rst_n=1;
end
//signal_a,b,c
always@(posedge clk,negedge rst_n)
if(~rst_n)
    {signal_a,signal_b,signal_c}<=0;
else if($urandom%2==1)
    {signal_a,signal_b,signal_c}<=$urandom%8;
else
    {signal_a,signal_b,signal_c}<=0;        
//inst
bus_arbitor U(.*);
    // input logic clk, 
    // input logic rst_n, 
    // input logic signal_a,                     //三个主机,轮询仲裁 
    // input logic signal_b,
    // input logic signal_c, 
    // output logic [1:0] grant);
endmodule

可以看到,当A获得请求后,优先级顺序变为BCA,B获得请求后,优先级顺序变为CAB,C获得请求后,优先级顺序变为ABC,若当前无请求,则last_grant信号保持不变(last_grant信号用于保存上一次仲裁器给出的结果,都无请求时仲裁结果不保存)。

固定优先级轮询仲裁

优先级固定不变,比如优先级永远都是0>1>2>…>N-1。代码实现:


`timescale 1ns/10ps
module fixed_bus_arbitor(
    input logic clk, 
    input logic rst_n, 
    input logic signal_a,                     //三个主机,轮询仲裁 
    input logic signal_b,
    input logic signal_c, 
    output logic [1:0] grant);
parameter A = 2'b00;
parameter B = 2'b01;
parameter C = 2'b10;
parameter NULL =2'b11;
//
always@(posedge clk,negedge rst_n)
if(~rst_n)
     grant<=NULL;
else
begin
    casez({signal_a,signal_b,signal_c})              //优先级A>B>C
        3'b1zz:grant<=A;
        3'bz1z:grant<=B;
        3'bzz1:grant<=C;
        default:grant<=NULL;
    endcase
end
endmodule

仿真测试文件和轮询仲裁所给出的一致,只需修改例化时模块的名字即可,以下是仿真波形:
在这里插入图片描述

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

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

相关文章

数据智能服务商奇点云完成近亿元C2轮融资

奇点云集团宣布已于2022年底完成近亿元C2轮融资&#xff0c;余杭国投领投&#xff0c;中银渤海基金跟投。 截至目前&#xff0c;奇点云共获近3亿元C轮融资。C轮领投方包括泰康人寿&#xff08;旗下泰康资产执行&#xff09;、余杭国投&#xff0c;跟投方包括字节跳动、德同资本…

九龙证券|巴菲特又出手了!嗅到了什么?日本央行新行长发声

巴菲特或再发日元债&#xff0c;嗅到了什么&#xff1f; 有商场消息称&#xff0c;知情人士泄漏&#xff0c;沃伦巴菲特旗下伯克希尔哈撒韦已开端就出售日元债券向投资者征求意见。这似乎印证了稍早之前的信息&#xff0c;此前&#xff0c;据彭博报导&#xff0c;伯克希尔哈撒韦…

实验手册 - 第5周Pair RDD与分区

目录标题实验1实验2实验3实验4实验5import findspark findspark.init() from pyspark import SparkContextsc SparkContext()实验1 实验1&#xff1a;已知内存数据源 list01 [1, 2, 3, 4, 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44, 51, 52, 53, 54] …

redis数据结构底层原理及相关运用

Redis的数据结构 Redis的数据结构&#xff0c;可以在两个不同的层面来讨论它。 第一个层面&#xff0c;是从使用者的角度。比如&#xff1a;string、list、hash、set、zset(sorted set)五种数据类型 这一层面也是Redis暴露给外部的调用接口&#xff0c;也就是我们平时使用re…

多态-虚函数表

VS的对象内存分析: /d reportSingleClassLayout类名 使用方法:项目 -- 属性 -- C/C -- 命令行--其他选型(D) 添加命令.如图所示: Father类: class Father { public:virtual void Func1() { cout << "Father::Func1" << endl; }virtual void Func2() { c…

【Redis】亿级数据的收集+清洗+统计+展现

文章目录聚合统计(set->共同好友)排序统计(zset->评论排序)二值统计(bitmap->签到打卡)基数统计(hyperloglog->亿级UV统计方案)地理坐标(GEO)布隆过滤器面试题定义产生背景作用底层原理聚合统计(set->共同好友) 统计多个集合元素的聚合结果&#xff0c;就是前面…

DF竞赛平台助力首届“深水云脑杯”全国智慧水务数据创新大赛圆满落幕

首届“深水云脑杯”全国智慧水务数据创新大赛决赛现场 首届“深水云脑杯”全国智慧水务数据创新大赛已圆满落幕&#xff0c;DataFountain大数据竞赛平台&#xff08;简称DF平台&#xff09;作为官方竞赛平台为本次大赛提供办赛支持。该赛事以数字化创新模式为抓手&#xff0c;…

从零学习SDK(6)调试和测试SDK的库

在前面的文章中&#xff0c;我们介绍了什么是SDK&#xff0c;以及如何选择和接入合适的SDK。在本文中&#xff0c;我们将重点讲解如何调试和测试SDK的库&#xff0c;以确保我们的应用能够正常运行&#xff0c;没有错误或异常。 SDK的库是什么呢&#xff1f;简单来说&#xff0…

DAF Trucks EDI项目案例

DAF Trucks是一家荷兰卡车制造商&#xff0c;通过EDI系统与其供应商和客户之间进行电子交换。DAF Trucks EDI系统包括订单处理、发货通知、发票和付款等功能&#xff0c;能够快速、准确地交换业务文档&#xff0c;提高供应链管理水平。DAF计划将其EDI系统扩展到更多的供应商和客…

JavaScript学习笔记(二)

文章目录第4章&#xff1a;变量、作用域与内存1. 原始值与引用值2. 执行上下文与作用域3. 垃圾回收第5章&#xff1a;基本引用类型1. Date&#xff1a;参考了Java早期版本中的java.util.Date2. RegExp3. 原始值包装类型第6章&#xff1a;集合引用类型1. Object2. Array&#xf…

三电技术之电池管理技术

三电技术之电池管理技术 1 功能概述 电池管理系统 (Battery Management System), 即管理电池的充放电&#xff0c;使电池处于一个最佳的状态。 电池是由多个电芯组成的&#xff0c;每个电芯充放电都是一个电化学反应的过程。无论电芯的制造多精密&#xff0c;随着使用时间、…

OpenText 企业内容管理平台介绍

OpenText 企业内容管理平台介绍 将 ECM 扩展到领先的业务应用程序中&#xff0c;为内容添加上下文&#xff0c;从而提高效率和决策能力 突出优点&#xff1a; 1、企业拥有更多数据、更多来源、更多用途并按需提供 2、员工需要一种新的交互、共享和消费内容的方式 3、更多内容需…

系统分析师冲刺班练习题

系统配置与性能评价---性能指标 吞吐量是指网络、设备、端口、虚拟电路或其他设备&#xff0c;单位时间内成功地传送数据的数量&#xff08;以比特、字节、分组等测量&#xff09; 系统配置与性能评价---性能评价方法 指令执行速度法&#xff1a;在计算机发展的初期&#xff…

【C++】2.C++的输入与输出

文章目录前言一、C的输入\出头文件二、C的输入&输出关键字2.1 输出cout2.2 输入cin三、c输入输出与c语言的输入输出前言 c语言中我们使用scanf,printf等来进行输入、输出操作&#xff0c;在C中我们是否有其他方式呢&#xff1f;答案是有的&#xff0c;下面我们来介绍c的输…

JavaSE学习进阶day05_01 Collection集合概述

第九章 Collection集合 9.1 集合概述 在前面基础班我们已经学习过并使用过集合ArrayList<E> ,那么集合到底是什么呢? 集合&#xff1a;集合是java中提供的一种容器&#xff0c;可以用来存储多个数据。 集合和数组既然都是容器&#xff0c;它们有什么区别呢&#xff1…

快排(动图详细版,快速理解)

注&#xff1a;本文主要介绍六大排序中的快排 文章目录前言一、三大法则1.1 Hoare法1.2 挖坑法1.3 双指针法&#xff08;更加便捷&#xff09;1.4 三种方法时间复杂度计算二、快排栈问题优化方式2.1 三数取中2.2 小区间优化三、非递归快排前言 快速排序是Hoare于1962年提出的一…

生活污水处理设备选购指南

生活污水中含有大量的有机物&#xff08;如蛋白质、碳水化合物、脂肪、尿素、氨氮等&#xff09;及大量的病原微生物&#xff0c;可导致传染病蔓延流行。因此&#xff0c;生活污水在排放前&#xff0c;需要进行处理。那么如何正确的选择生活污水处理设备呢&#xff1f; 一、生活…

移动机器人设计与实践-基础概念汇总

如下全文在关键词提示词等脚本交互下&#xff0c;由文图版本生成式人工智能在1分钟内创作完成。 AI自动生成文章评分已经远超大部分博文评分值。 人类社会经历过农业时代&#xff08;最强代表汉唐&#xff09;-工业时代&#xff08;最强代表日不落帝国&#xff09;-信息时代&a…

利用MyBatis实现CRUD操作

文章目录一、添加按姓名查询用户记录功能1、添加按姓名查询的映射语句2、在用户映射器接口里添加按姓名查询用户记录的方法3、添加按姓名查询用户记录的测试方法4、测试按姓名查询用户记录二、插入表记录1、在UserMapper.xml里增加映射语句 - insert2、在UserMapper接口里增加i…

【三十天精通Vue 3】第七天 Vue 3 响应式系统详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 响应式系统概述1.1 响应式系统的简介1.2 响应式系统…