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

文章介绍了如何在Verilog中实现轮询仲裁器,这种仲裁器在固定优先级基础上,让每个请求源按顺序轮流成为最高优先级。通过修改固定优先级仲裁器的代码,使用内部产生的round_priority信号来控制优先级顺序,实现了轮询机制。此外,还提到了更高级的权重轮询仲裁器和多因素影响仲裁器的设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上篇讲了固定优先级仲裁器的设计,并给出了指定最高优先级的实现方法

Verilog固定优先级仲裁器——Fixed Priority Arbiter_weixin_42330305的博客-CSDN博客

轮询仲裁就是在固定优先级仲裁器的基础上,所有的request轮流当最高优先级。

一、原理

        当N个source同时发出请求时,默认source 0的优先级最高,当source 0 被响应后,它的优先级变为最低,source 1的优先级转为最高,以此类推。

二、实现方法

        在固定优先级仲裁器的那一篇,讲了指定最高优先级的固定优先级仲裁器的实现方法。那么轮询仲裁器就是在固定优先级的基础上,最高优先级依次变化。

        即初始情况下,最高优先级为source 0,然后是source 1、source 2、……直到source N

        RTL如下:


module appoint_first_priority_arb
(
input 	[5:0]	req,
input	[5:0]	first_priority,
output 	[5:0]	grant
);
wire	[6*2-1:0]	double_req = {req,req};
wire	[6*2-1:0]	req_sub_first_priority = double_req - first_priority;
wire	[6*2-1:0]	double_grant = double_req & (~req_sub_first_priority);
 
assign	grant = double_grant[5:0] | double_grant[11:6];
 
endmodule

        若想实现轮询,需要将first_priority由input信号改为自己产生(first_priority为独热码)

module round_arb
(
input			clk,
input			reset_n,
input 	[5:0]	req,
output 	[5:0]	grant
);

reg    [5:0]    round_priority;

always @(posedge clk or negedge reset_n)
begin
  if(!reset_n)
    round_priority <= 6'b1;
  else if(|grant)
    round_priority <= {grant[4:0],grant[5]};
end
wire	[6*2-1:0]	double_req = {req,req};
wire	[6*2-1:0]	req_sub_round_priority = double_req - round_priority;
wire	[6*2-1:0]	double_grant = double_req & (~req_sub_round_priority);
 
assign	grant = double_grant[5:0] | double_grant[11:6];
 
endmodule

仲裁器进阶:

Verilog权重轮询仲裁器设计——Weighted Round Robin Arbiter_weixin_42330305的博客-CSDN博客

verilog多因素影响仲裁器设计_weixin_42330305的博客-CSDN博客

公平轮询仲裁(Fair Round-Robin Arbiter)是一种常用的硬件电路设计,用于在多个请求者之间公平地分配资源。在Verilog中,可以使用状态机的方式来实现公平轮询仲裁。 公平轮询仲裁的基本原理是按照一定的顺序依次选择每个请求者,并将资源分配给选中的请求者。具体实现时,可以使用一个计数来记录当前轮询到的请求者编号,然后根据计数的值选择对应的请求者。每次轮询完成后,计数递增,以便下一次轮询选择下一个请求者。 以下是一个简单的Verilog代码示例,实现了一个4个请求者的公平轮询仲裁: ```verilog module fair_arbiter ( input wire clk, input wire [3:0] req, output wire [3:0] grant ); reg [1:0] counter; reg [3:0] round_robin; always @(posedge clk) begin if (req != 4'b0000) begin // 寻找下一个有效请求者 repeat (4) begin round_robin = round_robin + 1; if (round_robin == 4) round_robin = 0; if (req[round_robin] == 1'b1) break; end end // 更新计数 counter = counter + 1; if (counter == 2'b01) begin // 分配资源给选中的请求者 grant = {3{1'b0}, req[round_robin]}; end else begin // 不分配资源 grant = 4'b0000; end end endmodule ``` 在上述代码中,`clk`是时钟信号,`req`是4个请求者的请求信号,`grant`是分配资源的输出信号。每个请求者的请求信号为1表示有请求,为0表示无请求。`counter`用于计数,`round_robin`用于记录当前轮询到的请求者编号。 请注意,上述代码只是一个简单的示例,实际应用中可能需要根据具体需求进行修改和优化。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值