Verilog | Round_Robin_Arbiter

news2024/11/15 13:34:01

重写了权重轮询仲裁,添加lock输入信号,表示请求方收到了仲裁许可,在对应的lock拉低之前,仲裁器不可以开启新的仲裁。

Generics

Generic nameTypeValueDescription
N4

Ports

Port nameDirectionTypeDescription
clkinput
rst_ninput
requestinput[N-1:0]
lockinput[N-1:0]
grantoutput[N-1:0]

Verilog实现

rtl代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/07/20 16:11:36
// Design Name: 
// Module Name: round_robin_arb
// ===================================================================================
// 功能:
// 		-1- Round Robin 仲裁器
//      -2- 仲裁请求个数N可变
// 		-3- 加入lock机制
// 		-4- 复位时的最高优先级定为 0 ,次优先级:1 -> 2 …… -> N-2 -> N-1
// 
// ===================================================================================

module Round_Robin_Arbiter #(
    parameter N = 4  //仲裁请求个数
) (
    input          clk,
    input          rst_n,
    input  [N-1:0] request,
    input  [N-1:0] lock,
    output [N-1:0] grant     //one-hot
);
 
    // 存储移位后上一次仲裁结果
    reg          aaa;
    wire         bbb;
    reg  [N-1:0] last_state;
    reg  [N-1:0] grant_r;

    assign bbb = ~|(lock & grant);
    assign grant = grant_r;

    always @(posedge clk or negedge rst_n)
        if (!rst_n) aaa <= 0;
        else aaa <= |request & ~(|(lock & grant));

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

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

    //得到的grant_ext必定为一个独热码,但是置高位可能在代表低位的高4bit中,因此进行求或运算
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            grant_r <= 0;
            //    		grant_ext <= 0;
        end else if (bbb) begin
            //    		grant_ext <= {request,request} & ~({request,request} - last_state);
            grant_r <= grant_ext[N-1:0] | grant_ext[2*N-1:N];
        end
    end
    

    // wire aaa;
    // assign aaa = (|request & ~(|(lock & grant)));
    // wire [3:0] last_state;
    // assign last_state = rst_n ? aaa ? {grant[N-2:0], grant[N-1]} : last_state : 'b0001;
    // assign grant      = bbb ? grant_ext[N-1:0] | grant_ext[2N-1:N] : grant;
endmodule

tb代码

// =====================================================================
// 功能:测试模块 Round_Robin_Arbiter 功能 
// =====================================================================
 
`timescale 1ns / 1ps
module TB_Round_Robin_Arbiter();
 
parameter 		N 		= 		4; //仲裁请求个数
 
reg 							clock;
reg 							reset_b;
reg 			[N-1:0]			request;
reg 			[N-1:0]			lock;
wire 			[N-1:0] 		grant;//one-hot
 
initial clock = 0;
always #10 clock = ~clock;
 
initial
begin
	reset_b <= 1'b0;
	request <= 0;
	lock <= 0;
	#20;
	reset_b <= 1'b1;
	@(posedge clock)
	request <= 2;
	lock <= 2;
 
	@(posedge clock)
	request <= 0;
 
	@(posedge clock)
	request <= 5;
	lock <= 7;
 
	@(posedge clock)
	lock <= 5;
 
	@(posedge clock)
	request <= 1;
 
	@(posedge clock)
	lock <= 1;
 
	@(posedge clock)
	request <= 0;
 
	@(posedge clock)
	lock <= 0;

    #40;

    @(posedge clock)
	request <= 0;
	lock <= 2;
 
	@(posedge clock)
	request <= 0;
 
	@(posedge clock)
	request <= 5;
	lock <= 7;
 
	@(posedge clock)
	lock <= 5;
 
	@(posedge clock)
	request <= 1;
 
	@(posedge clock)
	lock <= 1;
 
	@(posedge clock)
	request <= 0;
 
	@(posedge clock)
	lock <= 0;
 
	#100;
	$finish;
end
 
Round_Robin_Arbiter #(
		.N(N)
	) inst_Round_Robin_Arbiter (
		.clk     (clock),
		.rst_n   (reset_b),
		.request (request),
		.lock    (lock),
		.grant   (grant)
	);
 
endmodule

仿真结果:

在这里插入图片描述

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

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

相关文章

MSP432自主开发笔记4:DS3115舵机的0~180全角度驱动

芯片使用&#xff1a;MSP432P401R. 今日学习一款全角度15KG大扭力舵机的驱动&#xff0c;最近电赛学习任务紧&#xff0c;更新一篇比较水的文章&#xff1a; 文章提供原理解释&#xff0c;全部代码&#xff0c;整体工程&#xff1a; 目录 舵机驱动原理: 这是舵机DS3115MG:…

Python怎么实现贪婪排名算法

目录 什么是贪婪排名算法 贪婪排名算法的优点 贪婪排名算法的应用 Python怎么实现贪婪排名算法 总结 什么是贪婪排名算法 贪婪排名算法是一种常见的排序算法&#xff0c;在许多优化问题中得到广泛应用。它的主要思想是通过每次选择当前看起来最优的选择&#xff0c;逐步构…

嵌入式:QT Day3

一、完成闹钟的实现 首页&#xff1a; 启动后&#xff1a; 点击停止后&#xff1a; 二、思维导图

Ansible的应用

Ansible简介 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主机…

4. 方法(函数)

文章目录 4.1. 什么是方法的返回值?返回值在类的方法里的作用是什么?4.2. 为什么 Java 中只有值传递&#xff1f; 4.1. 什么是方法的返回值?返回值在类的方法里的作用是什么? 方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果&#xff01;&#xff08;前提…

MessageBox弹出框中加入DatePicker日期选择器

效果&#xff1a; 代码片段 重点是open函数中&#xff0c;使用了h函数来写dom。关于h函数的解释可见一下博文点击跳转博文&#xff1a;解析h函数 在element-ui的官方文档中&#xff0c;对这种方式有清晰的解释。点击跳转官网可见 <template><div><el-button t…

appium介绍

移动自动化测试工具appium。appium目前在移动UI自动化测试领域占有重要地位&#xff0c;不仅支持Android和IOS两大平台&#xff0c;还支持多种编程&#xff0c;因而得到广泛的应用。 移动应用类型 移动应用类型主要分为以下几类 Native App&#xff1a;原生应用。Mobile Web…

Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁)

先来了解下一个空白app的进程中线程数量&#xff1a; 分析迷你世界中app线程之前&#xff0c;先来了解下空白app &#xff0c;中线程情况&#xff1a; 一个空白app的线程大概是27个&#xff1a; 一个空白的的app&#xff0c;包含FinalizerDaemon线程、FinalizerWatchd线程、R…

GitHub Copilot:让开发编程变得像说话一样简单

引用&#xff1a; 人类天生就梦想、创造、创新。但今天&#xff0c;我们花太多时间被繁重的工作所消耗&#xff0c;花在消耗我们时间、创造力和精力的任务上。为了重新连接我们工作的灵魂&#xff0c;我们不仅需要一种更好的方式来做同样的事情&#xff0c;更需要一种全新的工…

“从世界第一黑客到顶级安全咨询专家” 凯文·米特尼克去世

一、人物简介 凯文米特尼克&#xff08;英语&#xff1a;Kevin David Mitnick&#xff0c;1963年8月6日—2023年7月16日&#xff09;&#xff0c;是美国计算机安全顾问&#xff0c;作家和黑客。他拥有“世界头号黑客”&#xff0c;“世界上最著名的黑客”、“地狱黑客”、“头号…

SPI通信

文章目录 SPI通信简介硬件电路移位示意图SPI时序基本单元1.起始条件2.终止条件模式1模式0模式2模式3 SPI时序 SPI通信简介 四根通信线&#xff1a; SCK"串行时钟线 MOSI:主机输出从机输入 MISO:主机输入从机输出 SS:从机选择 通信方式&#xff1a;同步&#xff0c;全双工…

向量数据库Milvus的四个版本

目录 MilvusLite版 单机版 分布式版 Milvus Cloud版 Milvus是一个功能强大的向量数据库管理系统,提供了多种版本,以满足不同用户的需求。以下是关于Milvus四个版本的具体介绍。 MilvusLite版 MilvusLite版是Milvus的轻量级版本,适合于小规模数据集和高性能计算场景。…

使用for循环输出左上三角、右上三角、左下三角、右下三角、上下三角

1、输出如下图形&#xff1a; #include<stdio.h> int main() {/*输出图形 666666666666666*/for(int i1;i<5;i){for(int j1;j<i;j){putchar(6);}printf("\n"); } return 0; } 2、输出如下图形&#xff1a; #include<stdio.h> int main() {/*输出图…

合作客户销售数据可视化分析

以一个案例进行实际分析&#xff1a; 数据来源&#xff1a;【地区数据分析】 以此数据来制作报表。 技巧一&#xff1a;词云图 以城市名称来显示合同金额的分布&#xff0c;合同金额越大&#xff0c;则城市文字显示越大。 2 2 2 2 2 2

【MySQL数据库备份】

目录 一、概述 二、数据备份的重要性 1. 数据保护 2. 灾难恢复 3. 数据完整性 4. 合规性要求 三、造成数据丢失的原因 1. 硬件故障 2. 人为错误 3. 黑客攻击 4. 自然灾害 5. 软件故障 四、备份类型 1.物理与逻辑角度 1.1 概念 1.2 物理备份 1.2.1 冷备份 1.2…

php-golang-jsonrpc2.0 rpc-codec/jsonrpc2和tivoka/tivoka实践

golang代码&#xff1a; package main import ( "context" "net" "net/rpc" "github.com/powerman/rpc-codec/jsonrpc2" ) type App struct{} type Res struct { Code int json:"code" Msg string json:"msg&quo…

kafka集群

目录 broker ZooKeeper consumer group&#xff08;消费者组&#xff09; 分区&#xff08;Partitions&#xff09; 副本&#xff08;Replicas&#xff09; 主题&#xff08;Topic&#xff09; 偏移量&#xff08;offset&#xff09; broker 一个kafka进程就是一个broker…

C++ 名字空间namespace

在C中支持三种域&#xff1a;局部域、名字空间域和类域。 名字空间域是随标准C而引入的。它相当于一个更加灵活的文件域&#xff08;全局域&#xff09;&#xff0c;可以用花括号把文件的一部分括起来&#xff0c;并以关键字namespace开头给它起一个名字&#xff1a; namespac…

多线程与高并发(17)——多线程总结(很全)

总结并复习了一下之前写的多线程的知识&#xff0c;见下图。 不够清楚可私信或者processOn。

983. 最低票价;1911. 最大子序列交替和;894. 所有可能的真二叉树

983. 最低票价 核心思想&#xff1a;对于365天中的一天&#xff0c;如果它不在旅行的日子&#xff0c;我们在这一天可以不花钱&#xff1b;如果它在旅行的日期&#xff0c;那么要么这一天花钱&#xff0c;要么在前面花钱的时间范围内。所以想到了动态规划&#xff0c;对于dp[x…