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——一个简单仲裁器的实现相关推荐

  1. 【数字IC手撕代码】Verilog固定优先级仲裁器|题目|原理|设计|仿真

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  2. 如何用FFmpeg编写一个简单播放器详细步骤介绍

    如何用FFmpeg编写一个简单播放器详细步骤介绍(转载) FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具.FFMPEG几乎为你把所有的繁重工作都做了,比如解码.编码.复用和解复用. ...

  3. Verilog固定优先级仲裁器——Fixed Priority Arbiter

    1.原理 仲裁器主要用于当多个source发出请求时,根据一定的规则,来选择响应哪一个source. 固定优先级,就是每个source的优先级是提前分配好的,是固定的. 比如说source有6个,编号 ...

  4. Verilog轮询仲裁器设计——Round Robin Arbiter

    上篇讲了固定优先级仲裁器的设计,并给出了指定最高优先级的实现方法 Verilog固定优先级仲裁器--Fixed Priority Arbiter_weixin_42330305的博客-CSDN博客 轮 ...

  5. 如何用 FFmpeg 编写一个简单播放器.pdf

    An ffmpeg and SDL Tutorial.pdf 如何用 FFmpeg 编写一个简单播放器.pdf 中文版

  6. python批量下载文件只有1kb_详解如何用python实现一个简单下载器的服务端和客户端...

    话不多说,先看代码: 客户端: import socket def main(): #creat: download_client=socket.socket(socket.AF_INET,socke ...

  7. arbiter circuit(以Verilog FSM实现仲裁器)

    有限状态机实现仲裁器 状态图如下: 题目要求: 这个FSM作为一个仲裁器电路,控制着三个请求设备对某种类型资源的访问.每个设备通过设置一个信号r[i]=1来提出对资源的请求,其中r[i]是r[1].r ...

  8. 一个简单限速器的java实现[1]

    在日常开发过程中,经常遇到对资源使用频度的限制,例如:某个接口只允许每秒调用300次,或者某个资源对象只允许每秒使用300等等,下面是一个简单的限速器的java实现,它可以实现对一个资源在若干时间(毫 ...

  9. FFmpeg编写一个简单播放器 -1

    2019独角兽企业重金招聘Python工程师标准>>> 指导1:制作屏幕录像 概要   电影文件有很多基本的组成部分.首先,文件本身被称为容器Container,容器的类型决定了信息 ...

最新文章

  1. 计算机的未来科技作文700字,未来的科技与绿*的作文700字
  2. 推荐系统技术演进趋势:排序篇
  3. env-FindClass()为NULL的一种解决办法
  4. 一个网页如何决定是当前页打开还是新窗口打开?
  5. ctfmon是什么启动项_win7系统启动项中没有ctfmon进程的解决方法
  6. 定积分证明题例题_数列极限求法十五种(25个例题+推文送给微积分和数学分析同学)...
  7. Linux tty字符终端下VIM显示混乱的解决方法
  8. python -- 计算 平方、乘方、平方根_python如何求平方
  9. _,predicted=中_,的作用
  10. 小米路由器R3G救砖TTL教程
  11. Java基础第一讲:Java的故事和Java编程环境搭建
  12. 用一个小故事模拟Spring-Aop(三)--Advice适配器
  13. 关于Protel 2004 绘制电路原理图——元件库的建立
  14. android关闭触摸声音,如何在Android中关闭所有触摸声音 | MOS86
  15. 中专计算机英语词汇,中职英语新课标词汇表.doc
  16. application.yml与bootstrap.yml的区别
  17. GetLastError返回值大全(英文最新版)(1000-4000)
  18. (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  19. 母婴商城设置路由分发规则
  20. 华为ensp,wireshark3.0.0,virtualbox 5.2.22 安装包

热门文章

  1. 《淘宝网》质量属性分析
  2. java版飞信协议实现
  3. 怎样快速写出热点文章,紧跟热点热度?
  4. cass出现验证许可_南方cass简码识别不能使用,出现如图情况,什么原因怎么解决?...
  5. python怎么后撤步_后撤步的四种玩法,实战学会就牛逼了!
  6. 移动端苹果浏览器默认滚动条bug处理(橡皮糖现象 ) 亲测有效
  7. Address Book
  8. RibbonGroup
  9. HD DVD和蓝光刻录
  10. 矩阵行列互换算法-二维数组