【数字IC设计】循环优先级仲裁器 的 verilog实现原理、源码、仿真

1. 概述

在多主机的通讯结构中(如AXI、AHB),仲裁器往往是不可或缺的一个模块。其用于通过一定的策略,处理【多个主机同时请求获取总线权限】时的仲裁任务。

模块输入为一定宽度的请求信号,每一位代表一个主机的请求与否,输出则为同位宽的热独码。
因此模块接口可以描述为(以4个主机为例):

在这里插入图片描述


常见的仲裁策略有三种:

固定优先级仲裁器 循环仲裁器 循环优先级仲裁器
给每个主机分配固定的优先级,在多个设备发起请求时,始终将总线权限分配给高优先级的主机 通过一个指针对各个主机的请求进行轮询 根据上一次仲裁的结果进行优先级的重新分配,并应用于下一次的仲裁
其特点在于原理、结构和实现都很简单,但是可能出现低优先级主机迟迟无法获得总线权限的情况 各个端口获得总线的机会基本上是平等的,但是但主机数较多时,遍历的效率较低 每个主机获得总线的机会基本平等,而且只要有请求,在下一个周期必然可以输出仲裁结果,效率高
使用组合电路即可实现 使用一个计数器即可实现

循环优先级仲裁器(Round Robin arbiter)是一种【尽量均匀的将总线分配给不同主机】的策略。其基本思想如下:

  1. 在初始情况下,最低位代表的主机有着最高的优先级,且向左优先级依次递减。
    以A为最高优先级,D为最低优先级,则可以表示为 DCBA

  2. 若在一次仲裁中,某一位代表的主机获取了总线权限,则在下一次仲裁中,其左侧相邻位优先级变为最高,并向左优先级依次降低。

如下例

  1. 初始仲裁优先级:DCBA,第一次发起仲裁请求的输入为4’b1010,则优先级为B的端口获得权限,仲裁器输出为4‘b0010。
  2. 与此同时,下一次仲裁的优先级即变成了BADC,即刚刚获得权限的主机在下一次仲裁中的优先级最低。

2. verilog的实现原理

上述描述显得算法并不复杂,但是在实际的verilog可综合实现中却并不是那么直白。网上看到不少帖子里用了非常暴力的case分支,但是显然极其浪费资源。

几篇帖子中,有一个【数字IC手撕代码】Verilog轮询仲裁器|题目|原理|设计|仿真很有新意,但是通篇看下来发现并未对原理深入分析,代码也存在一定的问题,所以自己琢磨了一番。

原理

在这里插入图片描述

接下来是代码实现:

module round_robin_arb(
    input   clk         ,
    input   rst_n       ,
    
    input  [3:0] request,
    output [3:0] grant
);

    // 存储移位后上一次仲裁结果
    reg  [3:0] last_state;
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n)
            last_state <= 4'b0001;     // 默认值,表示最低位的优先级最高
        else if(|request)
            last_state <= {grant[2],grant[1],grant[0],grant[3]}; // 有仲裁请求,根据上一次的仲裁结果,左移1bit后用于控制新的优先级
        else
            last_state <= last_state;  // 无仲裁请求时,pre_state不更新
    end

    // 如果最左侧几个高优先级主机都为发起仲裁请求,需要从最低位开始轮询。
    // 此处通过两个request拼接,将右侧低位拼接到左侧,即可实现对低位的判断。
    wire [7:0] grant_ext;
    assign grant_ext = {request,request} & ~({request,request} - last_state);

    // 得到的grant_ext必定为一个热独码,但是置高位可能在代表低位的高4bit中,因此进行求或运算
    assign grant = grant_ext[3:0] | grant_ext[7:4];

endmodule

仿真代码:

`timescale 1ns / 1ps
module dut_top();

    bit       clk    ;
    bit       rst_n  ;
    bit [3:0] request;
    bit [3:0] grant  ;

    initial forever #5 clk = !clk;

    initial begin
        rst_n= 0;
        request = 4'h0;
        #15 rst_n = 1;
        @(posedge clk) #0 request = 4'b1101;
        #50;
        @(posedge clk) #0 request = 4'b0101;
        @(posedge clk) #0 request = 4'b0010;
        @(posedge clk) #0 request = 4'b0000;
        #100;
        $stop;
    end

    round_robin_arb u0_round_robin_arb_inst
    (
        .clk        ( clk       ) ,
        .rst_n      ( rst_n     ) ,
        .request    ( request   ) ,
        .grant      ( grant     ) 
    );

endmodule

仿真结果如下图:

在这里插入图片描述

综合得到的RTL为:

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340