Verilog——一个简单仲裁器的实现
Verilog——一个简单仲裁器的实现
仲裁器基本功能
仲裁器(arbiter) 的主要功能是,多个source源同时发出请求时,根据当前的优先级来判断应响应哪一个source。
仲裁器分为轮询优先级仲裁器(Round-Robiin)和固定优先级仲裁器(Fixed-Priority)。轮询仲裁器对各个source的响应优先级随各个source请求轮询变化,最终对各个source的优先级是较为均衡的。
轮询仲裁器的规则是:当0、1、2、、、N-1个source信号源同时向仲裁器发出请求时,初始情况下source 0的优先级最高,当仲裁器响应了source0后,source1的优先级最高,依次类推。
固定优先级仲裁器规则是:当0、1、2、、、N-1个source同时发起request,Source 0的优先级最高,即便source0被相应完后,仍为最高优先级,其中优先级按照序号逐渐降低。
轮询仲裁器和固定优先级仲裁器在FPGA实现的类似,唯一不同的是轮询仲裁在每次响应完request后会对优先级进行更新,而固定优先级则不需要此步骤。
下面是一个简单轮询仲裁器模块的实现方案。该实现方案的关键点是:
- 根据当前优先级变量prrty的数值来决定响应优先级;
- 响应结束后更改优先级prrty。
module arbiter(input clk ,//时钟input rst_n ,//复位input request0 ,//请求0input request1 ,//请求1input request2 ,//请求2input request3 ,//请求3input end_transaction0,//请求0结束标志input end_transaction1,//请求1结束标志input end_transaction2,//请求2结束标志input end_transaction3,//请求3结束标志output grant0 ,//响应请求0output grant1 ,//响应请求1output grant2 ,//响应请求2output grant3 //响应请求3
);localparam S_IDLE = 4'b0000;
localparam S_GNT0 = 4'b0001;
localparam S_GNT1 = 4'b0010;
localparam S_GNT2 = 4'b0100;
localparam S_GNT3 = 4'b1000;reg [3:0] state ;
reg [3:0] grant ;
reg [3:0] prrty ;//优先级 //grant3, grant2, grant1, grant0
assign {grant3, grant2, grant1, grant0} = grant;//state
always @(posedge clk or negedge rst_n) beginif(~rst_n) beginstate <= S_IDLE;prrty <= 4'b1000;endelsecase(state)S_IDLE: case(1'b1)prrty[3]: beginif(request0)state <= S_GNT0;else if(request1)state <= S_GNT1;else if(request2)state <= S_GNT2;else if(request3)state <= S_GNT3;endprrty[0]: beginif(request1)state <= S_GNT1;else if(request2)state <= S_GNT2;else if(request3)state <= S_GNT3;else if(request0)state <= S_GNT0;endprrty[1]: beginif(request2)state <= S_GNT2;else if(request3)state <= S_GNT3;else if(request0)state <= S_GNT0;else if(request1)state <= S_GNT1;endprrty[2]: beginif(request3)state <= S_GNT3;else if(request0)state <= S_GNT0;else if(request1)state <= S_GNT1;else if(request2)state <= S_GNT2;endendcaseS_GNT0: if(end_transaction0) beginprrty <= 4'b0001;state <= S_IDLE;endS_GNT1: if(end_transaction1) beginprrty <= 4'b0010;state <= S_IDLE;endS_GNT2: if(end_transaction2) beginprrty <= 4'b0100;state <= S_IDLE;endS_GNT3: if(end_transaction3) beginprrty <= 4'b1000;state <= S_IDLE;endendcase
end
//grant
always @(*) begincase(state) S_IDLE:grant <= 4'b0000;S_GNT0:grant <= 4'b0001;S_GNT1:grant <= 4'b0010;S_GNT2:grant <= 4'b0100;S_GNT3:grant <= 4'b1000;default: grant <= 4'b0000;endcaseendendmodule
仿真代码如下:
//tb_arbiter.vmodule tb_arbiter();reg clk ;
reg rst_n ;
reg request0 ;
reg request1 ;
reg request2 ;
reg request3 ;
reg end_transaction0;
reg end_transaction1;
reg end_transaction2;
reg end_transaction3;
wire grant0 ;
wire grant1 ;
wire grant2 ;
wire grant3 ; arbiter arbiter_inst(.clk (clk ),.rst_n (rst_n ),.request0 (request0 ),.request1 (request1 ),.request2 (request2 ),.request3 (request3 ),.end_transaction0 (end_transaction0 ),.end_transaction1 (end_transaction1 ),.end_transaction2 (end_transaction2 ),.end_transaction3 (end_transaction3 ),.grant0 (grant0 ),.grant1 (grant1 ),.grant2 (grant2 ),.grant3 (grant3 )
);initial beginclk = 1'b0; rst_n = 1'b0; //复位操作request0 = 1'b0; request1 = 1'b0; request2 = 1'b0; request3 = 1'b0; end_transaction0 = 1'b0;end_transaction1 = 1'b0;end_transaction2 = 1'b0;end_transaction3 = 1'b0;#100;rst_n = 1'b1; //复位完成#100;bus_request();#100bus_request();#100;bus_request();#100;bus_request();#100;bus_request();#100;bus_request();#100;bus_request();#100;bus_request();#100;bus_request();
endalways #10 clk = ~clk;task bus_request();
beginrequest0 = 1'b1; request1 = 1'b1; request2 = 1'b1; request3 = 1'b1; #20;request0 = 1'b0; request1 = 1'b0; request2 = 1'b0; request3 = 1'b0; #200;if(grant0 == 1'b1)end_transaction0 = 1'b1;else if(grant1 == 1'b1)end_transaction1 = 1'b1;else if(grant2 == 1'b1) end_transaction2 = 1'b1;else if(grant3 == 1'b1)end_transaction3 = 1'b1;#20;end_transaction0 = 1'b0;end_transaction1 = 1'b0;end_transaction2 = 1'b0;end_transaction3 = 1'b0;
end
endtaskendmodule
仿真结果:
Verilog——一个简单仲裁器的实现相关推荐
- 【数字IC手撕代码】Verilog固定优先级仲裁器|题目|原理|设计|仿真
芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...
- 如何用FFmpeg编写一个简单播放器详细步骤介绍
如何用FFmpeg编写一个简单播放器详细步骤介绍(转载) FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具.FFMPEG几乎为你把所有的繁重工作都做了,比如解码.编码.复用和解复用. ...
- Verilog固定优先级仲裁器——Fixed Priority Arbiter
1.原理 仲裁器主要用于当多个source发出请求时,根据一定的规则,来选择响应哪一个source. 固定优先级,就是每个source的优先级是提前分配好的,是固定的. 比如说source有6个,编号 ...
- Verilog轮询仲裁器设计——Round Robin Arbiter
上篇讲了固定优先级仲裁器的设计,并给出了指定最高优先级的实现方法 Verilog固定优先级仲裁器--Fixed Priority Arbiter_weixin_42330305的博客-CSDN博客 轮 ...
- 如何用 FFmpeg 编写一个简单播放器.pdf
An ffmpeg and SDL Tutorial.pdf 如何用 FFmpeg 编写一个简单播放器.pdf 中文版
- python批量下载文件只有1kb_详解如何用python实现一个简单下载器的服务端和客户端...
话不多说,先看代码: 客户端: import socket def main(): #creat: download_client=socket.socket(socket.AF_INET,socke ...
- arbiter circuit(以Verilog FSM实现仲裁器)
有限状态机实现仲裁器 状态图如下: 题目要求: 这个FSM作为一个仲裁器电路,控制着三个请求设备对某种类型资源的访问.每个设备通过设置一个信号r[i]=1来提出对资源的请求,其中r[i]是r[1].r ...
- 一个简单限速器的java实现[1]
在日常开发过程中,经常遇到对资源使用频度的限制,例如:某个接口只允许每秒调用300次,或者某个资源对象只允许每秒使用300等等,下面是一个简单的限速器的java实现,它可以实现对一个资源在若干时间(毫 ...
- FFmpeg编写一个简单播放器 -1
2019独角兽企业重金招聘Python工程师标准>>> 指导1:制作屏幕录像 概要 电影文件有很多基本的组成部分.首先,文件本身被称为容器Container,容器的类型决定了信息 ...
最新文章
- 计算机的未来科技作文700字,未来的科技与绿*的作文700字
- 推荐系统技术演进趋势:排序篇
- env-FindClass()为NULL的一种解决办法
- 一个网页如何决定是当前页打开还是新窗口打开?
- ctfmon是什么启动项_win7系统启动项中没有ctfmon进程的解决方法
- 定积分证明题例题_数列极限求法十五种(25个例题+推文送给微积分和数学分析同学)...
- Linux tty字符终端下VIM显示混乱的解决方法
- python -- 计算 平方、乘方、平方根_python如何求平方
- _,predicted=中_,的作用
- 小米路由器R3G救砖TTL教程
- Java基础第一讲:Java的故事和Java编程环境搭建
- 用一个小故事模拟Spring-Aop(三)--Advice适配器
- 关于Protel 2004 绘制电路原理图——元件库的建立
- android关闭触摸声音,如何在Android中关闭所有触摸声音 | MOS86
- 中专计算机英语词汇,中职英语新课标词汇表.doc
- application.yml与bootstrap.yml的区别
- GetLastError返回值大全(英文最新版)(1000-4000)
- (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
- 母婴商城设置路由分发规则
- 华为ensp,wireshark3.0.0,virtualbox 5.2.22 安装包