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

news2024/11/15 12:44:47

 相关文章

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

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

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

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

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

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

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

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

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


5.公平轮询

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

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

        没有死周期的公平轮询代码及仿真结果如下。

module arbiter_roundrobin(
            clk,resetb,
            req_vec,
            end_access_vec,
            gnt_vec,
            end_access_out);
    
    input clk, resetb;
    input [2:0] req_vec, end_access_vec;
    output [2:0] gnt_vec;
    output end_access_out;
    reg [1:0] arbiter_state, arbiter_state_nxt;
    reg [2:0] gnt_vec, gnt_vec_nxt;
    reg [2:0] relative_req_vec;
    wire any_req_asserted;
    reg [1:0] grant_posn, grant_posn_nxt;
    reg resource_idle_nxt, resource_idle;
    reg [2:0] start_access_vec, start_access_vec_nxt;
    parameter IDLE = 2'b00;
    parameter END_ACCESS = 2'b01;
    
    assign any_req_asserted = (req_vec != 0);
    assign end_access_out = |end_access_vec;
 
    always@(*) begin
        relative_req_vec = req_vec;
        case(grant_posn)
            2'd0: relative_req_vec = {req_vec[0], req_vec[2:1]};
            2'd1: relative_req_vec = {req_vec[1:0], req_vec[2]};
            2'd2: relative_req_vec = {req_vec[2:0]};
        endcase
    end
    always@(*) begin
        arbiter_state_nxt = arbiter_state;
        grant_posn_nxt = grant_posn;
        gnt_vec_nxt = gnt_vec;
        resource_idle_nxt = 1'b0;
        start_access_vec_nxt = 3'b0;
        case(arbiter_state)
            IDLE:begin
                    if(any_req_asserted)
                        arbiter_state_nxt = END_ACCESS;
                        resource_idle_nxt = 1'b1;
                    if(relative_req_vec[0])
                        case(grant_posn)
                            2'd0: begin gnt_vec_nxt = 3'b010; grant_posn_nxt = 3'd1; end
                            2'd1: begin gnt_vec_nxt = 3'b100; grant_posn_nxt = 3'd2; end
                            2'd2: begin gnt_vec_nxt = 3'b001; grant_posn_nxt = 3'd0; end
                        endcase
                    else if(relative_req_vec[1])
                        case(grant_posn)
                            2'd0: begin gnt_vec_nxt = 3'b100; grant_posn_nxt = 3'd2; end
                            2'd1: begin gnt_vec_nxt = 3'b001; grant_posn_nxt = 3'd0; end
                            2'd2: begin gnt_vec_nxt = 3'b010; grant_posn_nxt = 3'd1; end
                        endcase
                    else if(relative_req_vec[2])
                        case(grant_posn)
                            2'd0: begin gnt_vec_nxt = 3'b001; grant_posn_nxt = 3'd0; end
                            2'd1: begin gnt_vec_nxt = 3'b010; grant_posn_nxt = 3'd1; end
                            2'd2: begin gnt_vec_nxt = 3'b100; grant_posn_nxt = 3'd2; end
                        endcase
                    else
                        gnt_vec_nxt = 3'b000;
            end
            END_ACCESS:begin  
                if((resource_idle == 1'b1) || (end_access_out == 1'b1))
                    start_access_vec_nxt = gnt_vec;
                if(start_access_vec != 0)begin
                    if(relative_req_vec[0])
                        case(grant_posn)
                            2'd0: begin gnt_vec_nxt = 3'b010; grant_posn_nxt = 3'd1; end
                            2'd1: begin gnt_vec_nxt = 3'b100; grant_posn_nxt = 3'd2; end
                            2'd2: begin gnt_vec_nxt = 3'b001; grant_posn_nxt = 3'd0; end
                        endcase
                    else if(relative_req_vec[1])
                        case(grant_posn)
                            2'd0: begin gnt_vec_nxt = 3'b100; grant_posn_nxt = 3'd2; end
                            2'd1: begin gnt_vec_nxt = 3'b001; grant_posn_nxt = 3'd0; end
                            2'd2: begin gnt_vec_nxt = 3'b010; grant_posn_nxt = 3'd1; end
                        endcase
                    else if(relative_req_vec[2])
                        case(grant_posn)
                            2'd0: begin gnt_vec_nxt = 3'b001; grant_posn_nxt = 3'd0; end
                            2'd1: begin gnt_vec_nxt = 3'b010; grant_posn_nxt = 3'd1; end
                            2'd2: begin gnt_vec_nxt = 3'b100; grant_posn_nxt = 3'd2; end
                        endcase
                    else begin
                        gnt_vec_nxt = 3'b000;   
                        arbiter_state_nxt = IDLE;
                    end         
                end
            end
        endcase
    end
    
    always@(posedge clk or negedge resetb)begin
        if(!resetb) begin
            arbiter_state <= IDLE;
            gnt_vec <= 0;
            grant_posn <= 0;
            resource_idle <= 0;
            start_access_vec <= 0;
        end  
        else begin
            arbiter_state <= arbiter_state_nxt;
            gnt_vec <= gnt_vec_nxt;
            grant_posn <= grant_posn_nxt;
            resource_idle <= resource_idle_nxt;
            start_access_vec <= start_access_vec_nxt;
        end
    end
endmodule

        在Verilog实现过程中,使用了两个状态IDLE和END_ACCESS,分别表示仲裁器处于无请求和仲裁器授权的状态。在IDLE状态时,任何请求信号能使状态转移至END_ACCESS状态,并将resource_idle信号置1(这是为了IDLE状态下start_access的置位而设计的信号),并根据请求信号给出相应授权。在END_ACCESS状态,会根据resource_idle或end_access_out信号使用gnt_vec对start_access置位。当start_access信号有效时,根据请求信号进行下一次授权。若此时没有请求信号,则状态回到IDLE等待。

 

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

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

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

相关文章

mitmproxy抓包原理

文章目录 mitmproxy原理详解1 mitmproxy 基本原理2 作为中间代理获取HTTP请求信息2.1 应对显式HTTP请求2.2 应对隐式HTTP请求 3 作为中间代理获取HTTPS请求信息3.1 显式HTTPS请求1) 获取远程主机名2) 处理主题备用名称SAN3) 处理服务器名称指示SNI4) 显式HTTPS请求信息获取整个…

基于深度学习的高精度烟雾检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度烟雾检测识别系统可用于日常生活中或野外来检测与定位烟雾目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的烟雾目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

为什么数据库字段建议设置为NOT NULL?

目录 一、性能 二、开发的友好性 三、聚合函数不准确 四、null与其它值计算 五、distinct、group by、order by的问题 六、索引问题 七、其它问题 一、性能 如果查询中包含可为null的列&#xff0c;对MYSQL来说更难优化&#xff0c;因为可为null的列使得索引、索引统计…

NUCLEO-F411RE RT-Thread 体验 (9) - GCC环境 PWM的驱动移植以及简单使用

NUCLEO-F411RE RT-Thread 体验 (9) - GCC环境 PWM的驱动移植以及简单使用 驱动移植 驱动位于drv_pwm.c文件中&#xff0c;components层代码位于rt_drv_pwm.c中。 修改Makefile文件 修改配置文件rtconfig.h LED2链接PA5&#xff0c;而TIM2_CHANNEL1可从PA5输出PWM&#xff0…

ubuntu命令

查看当前用户 whoami 进入root权限 sudo su 修改用户名密码 sudo passwd username #修改用户密码 //username是用户设置用户名&#xff0c;记得替换 sudo passwd root #修改root密码 https://blog.csdn.net/m0_54647521/article/details/127521032 重启…

图形编辑器开发:以光标位置缩放画布

大家好&#xff0c;我是前端西瓜哥。 画布缩放是图形设计工具中很重要的基础能力。 通过它&#xff0c;我们可以像举着一台摄影机&#xff0c;在图形所在的世界到处游逛&#xff0c;透过镜头&#xff0c;可以只看自己想看的图形&#xff1b;可以拉近摄影机&#xff0c;看到图…

SpringBoot 如何使用 @ControllerAdvice 注解进行全局异常处理

SpringBoot 如何使用 ControllerAdvice 注解进行全局异常处理 在 Web 开发中&#xff0c;异常处理是非常重要的一环。在 SpringBoot 框架中&#xff0c;我们通常使用 ExceptionHandler 注解来处理 Controller 层的异常。但是&#xff0c;如果想要处理全局异常&#xff0c;我们…

【MySql】MySql事务常见操作

文章目录 准备工作事务常见操作方式总结 准备工作 将mysql的默认隔离级别设置成读未提交 set global transaction isolation level read uncommitted;注意&#xff1a;设置完毕之后&#xff0c;需要重启终端&#xff0c;进行查看 select tx_isolation 创建测试表 mysql>…

HTML5 的新特性

html基础知识html基础知识_上半场结束&#xff0c;中场已休息&#xff0c;下半场ing的博客-CSDN博客html5的新特性HTML5 的新特性_上半场结束&#xff0c;中场已休息&#xff0c;下半场ing的博客-CSDN博客 目录 1.0 HTML5 的新特性 1.1 HTML5 新增的语义化标签 1.2 HTML5 新增的…

LabVIEW何得知是谁在连接远程前面板

LabVIEW何得知是谁在连接远程前面板 想要知道连接远程前面板的用户的身份。如何来得知用户的身份和他们连接远程前面板的时间&#xff1f; 解答: 可以使用Remote Panel: Connections To Clients属性或者Remote Panel Client Connections方法来得知连接远程面板用户的身份。Re…

TypeScript ~ TS 掌握编译文件配置项 ⑤

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

【2023,学点儿新Java-20】流程控制语句关键字及其介绍:while、do、break、continue、return

前情回顾&#xff1a; 【2023&#xff0c;学点儿新Java-19】Java特殊空类型关键字 | Java流程控制语句关键字 | switch-case 选择结构的执行过程&注意点 | 详解&#xff1a;for循环的普通和增强版本【2023&#xff0c;学点儿新Java-18】Java关键字汇总说明 |附&#xff1a…

chatgpt赋能python:Python新手常见的报错提示及解决方法

Python新手常见的报错提示及解决方法 Python是一种非常流行的编程语言。对于新手来说&#xff0c;Python在学习过程中可能会遇到许多报错提示&#xff0c;这些提示可能会让人感到很困惑。本文将介绍Python新手常见的报错提示&#xff0c;并提供解决方法。 IndentationError: …

ninja的简单使用

文章目录 Ninja安装windows环境Linux环境 入门使用与CMake一起使用 Ninja安装 windows环境 问题的解决通常有多种方法。按照结果的好坏程度&#xff0c;可以将解决方法简单的划分为&#xff0c;上中下三个层次&#xff0c;见:为什么谋士总喜欢提上中下三策&#xff1f; 在w…

SpringBoot 如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理

SpringBoot 如何使用 RestControllerAdvice 注解进行 RESTful 异常处理 在 SpringBoot 应用程序中&#xff0c;RESTful 异常处理是一个非常重要的话题。当 RESTful API 出现异常时&#xff0c;我们需要对异常进行处理&#xff0c;以保证 API 的稳定性和可靠性。SpringBoot 提供…

【SpringBoot】SpringBoot的发展沿革,相关介绍,特点,重要策略以及安装步骤讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

Java·Map和Set

文章目录 &#x1f3ef;1. 搜索&#x1f3ef;1.1 概念及场景1.2 模型 &#x1f3f0;2. Map 的使用&#x1f3f0;2.1 关于Map的说明2.2 关于Map.Entry的说明2.3 Map 的常用方法说明2.4 TreeMap的使用案例2.5HashMap源码分析 ⛺️3. Set 的说明⛺️3.1 常见方法说明 &#x1f3ed…

设计模式—访问者模式

需求&#xff1a;店铺采购了一批水果&#xff08;苹果及橘子&#xff09;&#xff0c;现在市场监督局来店里检查过期的水果。 public class Fruit {private String name;private Date pickDate;public Fruit(String name, Date pickDate) {this.name name;this.pickDate pic…

【Unity之IMGUI】—位置信息类和控件基类的封装

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a; ⭐…

出现线程死锁缺陷一般有那些原因?该怎么解决?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言什么是线程死锁线程…