当前位置: 首页 > news >正文

Round-Robin仲裁器

Round-Robin仲裁器

概念:Round-Robin仲裁器是一种公平的仲裁方式,每个请求者按照固定的顺序轮流获得授权。当授权信号释放后,授权将传给下一个请求者(每次授权后,上一次被授权的请求者在下一轮优先级最低)。

Round-Robin仲裁器基本概念

  • 功能:公平地在多个请求者之间轮流授权,避免低优先级请求者饥饿

  • 机制:

    • 记录上一次被授权的请求者(last_grant寄存器)
    • 下一次仲裁从last_grant的下一位开始循环搜索
  • 操作:

    1.根据 last_grant 生成优先级屏蔽掩码

    2.将请求分为高低优先级区域

    3.优先处理高优先级区域的请求

先实现简单的固定优先级仲裁器,再改进为Round-Robin仲裁器。

代码实现

1.生成优先级屏蔽掩码

// 寄存器:记录上一次授权
reg [3:0] last_grant;// 组合逻辑:生成优先级屏蔽掩码
wire [3:0] mask = last_grant == 4'b0000 ? 4'b0000 : ~((last_grant - 1) | last_grant);

说明: 根据上一次的授权信号 last_grant 计算出一个掩码 mask 用于在下一轮仲裁中屏蔽优先级低于或等于 last_grant 的请求,确保高优先级的请求能够被优先处理。

结果如下:

last_grant二进制运算生成的 mask
0000特殊处理0000
0001~(0000 OR 0001)1110
0010~(0001 OR 0010)1100
0100~(0011 OR 0100)1000
1000~(0111 OR 1000)0000

last_grant=0010mask=1100 :屏蔽低两位,保留高两位

2.分割高低优先级请求区域

// 分割高低优先级请求区域
wire [3:0] high_pri_req = req & mask;
wire [3:0] low_pri_req  = req & ~mask;

高优先级请求:仅保留比 last_grant 优先级高的请求

低优先级请求:保留优先级≤ last_grant 的请求

设计目的:避免低优先级请求“饿死”。每次授权后,下一轮会优先服务更高优先级的请求,若不存在则再处理低优先级请求。

3.仲裁逻辑

// 仲裁逻辑
wire [3:0] high_pri_grant = high_pri_req & -high_pri_req;
wire [3:0] low_pri_grant  = low_pri_req  & -low_pri_req;
wire [3:0] grant_next     = |high_pri_req ? high_pri_grant : low_pri_grant;

代码说明: -high_pri_req 表示 high_pri_req 的补码(取反+1)。

high_pri_grant = high_pri_req & -high_pri_req;

作用:在高优先级组内选择最低位的1。(表明该仲裁器是从最低位开始选择)

原理:X & -X 保留X中最低位的1。

grant_next = |high_pri_req ? high_pri_grant : low_pri_grant;

逻辑:若 |high_pri_req 为真(high_pri_req不为0,高优先级组存在请求),授权 high_pri_grant ;否则授权 low_pri_grant

意义:确保高优先级组绝对优先,避免低优先级请求饿死


最终程序:

module test (input        clk,input        rst_n,input  [3:0] req,       // 4位请求信号output [3:0] grant      // 4位授权信号
);// 寄存器:记录上一次授权
reg [3:0] last_grant;// 组合逻辑:生成优先级屏蔽掩码
wire [3:0] mask = last_grant == 4'b0000 ? 4'b0000 : ~((last_grant - 1) | last_grant);// 分割高低优先级请求区域
wire [3:0] high_pri_req = req & mask;
wire [3:0] low_pri_req  = req & ~mask;// 仲裁逻辑wire [3:0] high_pri_grant = high_pri_req & -high_pri_req;
wire [3:0] low_pri_grant  = low_pri_req  & -low_pri_req;
wire [3:0] grant_next     = |high_pri_req ? high_pri_grant : low_pri_grant;// 时序逻辑更新授权状态
always @(posedge clk or negedge rst_n) beginif (!rst_n)       last_grant <= 4'b0000;         // 复位清零else if (req != 0)   last_grant <= grant_next;      // 有请求时更新
endassign grant = grant_next;endmodule

测试

`timescale  1ns / 1psmodule sim();reg clk   ;    
reg rst_n    ; 
reg [3:0] req  ;
wire [3:0] grant;initial clk = 1;
always #10 clk <= ~clk;test u_test(.clk        (clk        ), .rst_n      (rst_n      ),.req        (req   ),.grant      (grant      ));initial beginrst_n = 0;req = 4'b0000;  // 初始化#50;rst_n = 1;// 持续请求测试req = 4'b1011; // A、B、D请求#100;// 请求变化测试req = 4'b0100; // 仅C请求#50;// 边界测试req = 4'b1000; // 仅最高位#50;
end
endmodule

在这里插入图片描述

http://www.dtcms.com/a/298640.html

相关文章:

  • <HMI><威纶通><触摸屏>基于威纶通MT8106iQ触摸屏,实现自定义登录窗口(优化)
  • 内核驱动相关知识点
  • 【Agent】Common Ground 团队协作模型:Partner、Principal 与 Associate
  • 数据结构自学Day14 -- 归并排序
  • 正则表达式 \b:单词边界
  • 模拟flink处理无限数据流
  • WAIC2025预告|英码深元AI一体机将亮相华为昇腾展区,以灵活部署的能力赋能行业智能化转型
  • 学习:JS[6]环境对象+回调函数+事件流+事件委托+其他事件+元素尺寸位置
  • ReVQ (Quantize-then-Rectify,量化后修正)
  • 笛卡尔积规避:JOIN条件完整性检查要点
  • FreeRTOS—互斥信号量
  • Sweet Home 3D:一款免费的室内装修辅助设计软件
  • 【集合】JDK1.8 HashMap 底层数据结构深度解析
  • 第二章: 解密“潜在空间”:AI是如何“看见”并“记住”世界的?
  • 深入解析C语言三路快速排序算法
  • 动态规划:从入门到精通
  • 多品种小批量如何实现柔性排产?
  • 无感交互,创意飞扬:AI摄像头动捕赋能中小学AI人工智能实训室
  • Python Requests-HTML库详解:从入门到实战
  • 环境变量-进程概念(7)
  • 对自定义域和 GitHub 页面进行故障排除(Windows)
  • 批改作业小工具(一)-read report
  • InfluxDB Line Protocol 协议深度剖析(一)
  • 07 51单片机之定时器
  • 10BASE-T1S核心机制——PLCA参数详解
  • 关于AI编程的分析报告
  • 【通识】算法案例
  • 【电赛学习笔记】MaxiCAM 项目实践——与单片机的串口通信
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(10):ような复习
  • [科普] 快速傅里叶变换(FFT)和离散傅里叶变换(DFT)的差异