仲裁器的FPGA实现方式

仲裁器(arbiter) 在FPGA主要用于多个source源同时发出请求时,根据相应的优先级来响应哪一个source。FPGA的仲裁器分为轮询仲裁器(Round-Robiin)和固定优先级仲裁器(Fixed-Priority),接下来本文就两种不同仲裁器的规则和实现方式进行说明。

  1. 轮询仲裁器规则
    轮询仲裁的规则是当0、1、2、、、N-1个source信号源同时向仲裁器发出请求时,初始情况下source 0的优先级最高,当仲裁器相应了source0后,source1的优先级最高,依次类推。
  2. 轮询仲裁器实现
    轮询仲裁器的实现分为检测仲裁器输入口source信号源的request,根据当前仲裁器的优先级响应相应的request,仲裁器输出source端的请求,更新仲裁器的优先级。
    首先,检测仲裁器输入端request并进行仲裁,采用状态机来实现。
always@(*)
    case(cur_state)
        IDLE : if ((|svalid[n-1:0]) && enable)
                   next_state = TIME;
               else
                   next_state = IDLE;
        TIME : if (dvalid && dready)
                   next_state = IDLE;
               else
                   next_state = TIME;
     endcase

然后,根据当前仲裁器的优先级来响应相应的输入source request,并将source数据输出,代码以输入源为2个为例。

always@(posedge clk or posedge rst)
    if (rst)
        sready <= 2'b00;
    else if (cur_state == TIME)
        casex({enabel,svalid,prio})
            4'b1x10 : sready <= 2'b01;
            4'b1100 : sready <= 2'b10;
            4'b11x1 : sready <= 2'b10;
            4'b1011 : sready <= 2'b01;
            default : sready <= 2'b00;
        endcase

 always @(posedge clk or posedge rst)
     if (rst)
         duser <= 8'h0;
     else if (cur_state == TIME)
        casex({enabel,svalid,prio})
            4'b1x10 : duser <= suser[7:0];
            4'b1100 : duser <= suser[15:8];
            4'b11x1 : duser <= suser[15:8];
            4'b1011 : duser <= suser[7:0];
            default : duser <= 8'h0;
        endcase      

最后,更新仲裁器的优先级。

always @(psoedge clk or posedge rst)
    if (rst)
        prio <= 1'b0;
    else if (cur_state == TIME)
        casex(enable,svalid,prio)
            4'b1x10 : prio <= 1'b1;
            4'b11x1 : prio <= 1'b0;
            default : prio <= prio;
        endcase
  1. 固定优先级仲裁器规则
    Fixed-priority Arbiter顾名思义当0、1、2、、、N-1个source同时发起request,Source 0的优先级最高,即便source0被相应完后,仍为最高优先级,其中优先级按照序号逐渐降低。
    2.固定优先级仲裁实现
    固定优先级仲裁器在FPGA实现与轮询仲裁器类似,唯一不同的是轮询仲裁在每次响应完request后会对优先级进行更新,而固定优先级则不需要此步骤。
  • 10
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
四源轮询仲裁器是一种常见的硬件电路,可以用于多个设备之间的资源共享。在verilog中实现四源轮询仲裁器,需要按照以下步骤进行: 1. 定义输入输出端口:根据四源轮询仲裁器的功能,需要定义4个设备的请求信号输入端口和一个仲裁结果输出端口。例如: ``` module arbiter(input req1, input req2, input req3, input req4, output arb); ``` 2. 定义内部变量:需要定义一个轮询计数器变量,用于记录当前轮询到哪个请求信号。例如: ``` reg [1:0] count = 2'b00; ``` 3. 实现轮询逻辑:将请求信号和计数器变量结合,实现轮询逻辑。例如: ``` always @ (req1 or req2 or req3 or req4) begin case (count) 2'b00: if (req1) begin count <= 2'b01; arb <= 1'b1; end 2'b01: if (req2) begin count <= 2'b10; arb <= 1'b1; end 2'b10: if (req3) begin count <= 2'b11; arb <= 1'b1; end 2'b11: if (req4) begin count <= 2'b00; arb <= 1'b1; end default: arb <= 1'b0; endcase end ``` 4. 编写完整的模块代码:将以上步骤合并,编写完整的四源轮询仲裁器模块代码。例如: ``` module arbiter(input req1, input req2, input req3, input req4, output arb); reg [1:0] count = 2'b00; always @ (req1 or req2 or req3 or req4) begin case (count) 2'b00: if (req1) begin count <= 2'b01; arb <= 1'b1; end 2'b01: if (req2) begin count <= 2'b10; arb <= 1'b1; end 2'b10: if (req3) begin count <= 2'b11; arb <= 1'b1; end 2'b11: if (req4) begin count <= 2'b00; arb <= 1'b1; end default: arb <= 1'b0; endcase end endmodule ``` 需要注意的是,以上代码仅为示例,具体实现可能因为不同的系统需求而有所不同。在实际使用时,需要根据实际情况进行适当修改和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值