仲裁器理论基础

在多模块共享同一资源时,需要仲裁器来决定谁可以使用共享资源(如memory access).所以输入是各模块的请求(req),输出是grant。

仲裁器(arbiter) 在FPGA主要用于多个source源同时发出请求时,根据相应的优先级来响应哪一个source。FPGA的仲裁器分为轮询仲裁器(Round-Robiin)固定优先级仲裁器(Fixed-Priority)

    轮询仲裁器规则
    轮询仲裁的规则是当0、1、2、、、N-1个source信号源同时向仲裁器发出请求时,初始情况下source 0的优先级最高当仲裁器响应了source0后,source1的优先级最高,依次类推。
    轮询仲裁器实现
    轮询仲裁器的实现分为检测仲裁器输入口source信号源的request,根据当前仲裁器的优先级响应相应的request,仲裁器grant输出source端的请求,更新仲裁器的优先级。
  
    固定优先级仲裁器规则
Fixed-priority Arbiter顾名思义当0、1、2、、、N-1个source同时发起request,Source 0的优先级最高,即便source0被响应完后,仍为最高优先级,其中优先级按照序号逐渐降低
    固定优先级仲裁实现
固定优先级仲裁器在FPGA实现与轮询仲裁器类似,唯一不同的是轮询仲裁在每次响应完request后会对优先级进行更新,而固定优先级则不需要此步骤。
 

       SoC 设计广泛采用共享总线式的片上通信,其中的仲裁器是共享总线的关键技术之一。AMBA AXI 总线协议以高性能、高频率的系统设计为目标,适合高带宽、低延迟的系统设计,可以达到高频率的操作而不需要复杂的总线桥,满足众多部件的接口要求,具备高度灵活的互联结构,并且向后兼容 AHB 和 APB 接口。

        共享总线是一种常见的总线结构,多个总线上的设备拥有共同的地址线和数据线。
当一个总线设备希望占据总线进行数据收发操作时,需要通过属于自己的arequest信号向仲裁器发出申请,只有得到仲裁器的许可(对应的agrant置1 )时才能进行数据收发操作,没有得到许可的总线设备不能发起数据操作,否则将会出现多个设备同时驱动总线的错误。
下图是有两个总线设备的总线仲裁器电路,areq0和areq1以及agnt0和agnt1分别是master1和master2的请求和确认信号,rid是仲裁方式选择信号。当多个总线设备同时发出请求时,仲裁器根据内部控制寄存器的值按照固定优先级( rid=1, master2拥有高优先级)或者循环判断( rid=0,从master1->master2->master1循环判断)两种机制给相应的总线设备发出确认信号。

 设计代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Design Name: 
// Module Name: Arbiter
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
//

module Arbiter(clk,reset,areq0,areq1,agnt0,agnt1,rid);
input clk,reset;
input areq0,areq1;
input rid;
output agnt0,agnt1;
reg [1:0] current_state,nx_state;
parameter idle=2'b00,master1=2'b01,master2=2'b10;
/
always @(posedge clk or posedge reset)
   if(reset)
      current_state<=idle;
   else
      current_state<=nx_state;
/
always @(current_state or areq0 or areq1 or rid)
   begin
   case(current_state)
   idle:if(areq1==1 && areq0==0)
           nx_state=master2;
        else if(areq1==0 && areq0==1)
           nx_state=master1;
        else if(areq1==1 && areq0==1 && !rid)
           nx_state=master1;
        else if(areq1==1 && areq0==1 && rid)
           nx_state=master2;
        else nx_state=idle;
   master1:if(areq1==1)
              nx_state=master2;
           else if(areq1==0 && areq0==0)
              nx_state=idle;
           else nx_state=master1;
   master2:if(areq0==1)
              nx_state=master1;
           else if(areq1==0 && areq0==0)
              nx_state=idle;
           else nx_state=master2;
   default:nx_state=idle;
   endcase
end
assign agnt0=(current_state==master1)?1:0;
assign agnt1=(current_state==master2)?1:0;
endmodule

测试代码

`timescale 1ns / 1ps
module Arbiter_tb;
reg clk;
reg reset;
reg areq0,areq1;
reg rid;
wire agnt0,agnt1;
always begin
   #10 clk=1;
   #10 clk=0;
end
/
initial begin
   clk=0;
   reset=1;
   areq0=0;
   areq1=0;
   rid=0;
   #100;
   reset=0;
   
   //rid=0,路径1->2
   repeat(1)@(posedge clk);
   #2; areq0=1;areq1=1;
   repeat(1)@(posedge clk);
   #2; areq0=0;areq1=0;
   repeat(1)@(posedge clk);
   #2; areq0=1;areq1=1;
   repeat(1)@(posedge clk);
   #2; areq0=0;areq1=0;
   
   //rid=0,路径4->3
   repeat(1)@(posedge clk);
   #2; areq0=0;areq1=1;rid=1;
   repeat(1)@(posedge clk);
   #2; areq0=0;areq1=0;
   repeat(1)@(posedge clk);
   #2; areq0=1;areq1=1;
   repeat(1)@(posedge clk);
   #2; areq0=0;areq1=0;
   
   //路径1->5->6->2
   repeat(4)@(posedge clk);
   #2; areq0=1;areq1=0;
   repeat(1)@(posedge clk);
   #2; areq0=0;areq1=1;
   repeat(1)@(posedge clk);
   #2; areq0=1;areq1=0;
   repeat(1)@(posedge clk);
   #2; areq0=0;areq1=0;
end
Arbiter U1(
            .clk    (clk   ),
            .reset  (reset ),
            .areq0  (areq0 ),
            .areq1  (areq1 ),
            .agnt0  (agnt0 ),
            .agnt1  (agnt1 ),
            .rid    (rid   ));
endmodule

参考链接:https://blog.csdn.net/Hennys/article/details/107662757

 

  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Verilog仲裁器是一种用于控制多个用户对共享资源进行访问的电路。它根据一定的规则和算法,决定哪个用户有权使用资源,并在不同的情况下进行相应的处理。在Verilog中,仲裁器的设计和实现可以有多种方式。根据引用所提到的公平轮询仲裁器的Verilog RTL代码,可以实现一个公平轮询的仲裁器。在公平轮询方案中,所有用户优先级相等,每个用户依次获得授权。仲裁器按序检查每个用户的请求信号是否有效,如果一个用户的请求无效,则按序查看下一个用户。仲裁器会记住上一次被授权的用户,在该用户的操作完成后,会按序轮询其他用户是否有请求。一旦某个用户获得了授权,它可以长时间使用总线或占用资源,直到当前数据包传输结束或一个访问过程结束后,仲裁器才会授权其他用户进行操作。这样的仲裁器适用于基于数据包的协议,如以太网交换或PCI交换机。除了公平轮询方案,还可以使用其他的仲裁算法和策略来实现Verilog仲裁器,例如优先级仲裁、旋转仲裁、定时仲裁等,具体的选择取决于系统的需求和设计要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [verilog实例-仲裁(Arbiter)](https://blog.csdn.net/qq_70829439/article/details/127611837)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值