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

1.原理

仲裁器主要用于当多个source发出请求时,根据一定的规则,来选择响应哪一个source。

固定优先级,就是每个source的优先级是提前分配好的,是固定的。

比如说source有6个,编号分别为0、1、2、3、4、5,优先级依次减小。那么当3号发出请求时,就无视4号、5号,响应3号的请求。同样的,当0号发出请求时,就响应0号,无视1-5号是否发出了请求。

2.实现方法

我们用rtl实现一下,interface如下:

port namebit widthI/O typedescription
req6input每bit代表每个source发出的请求
grant6output每bit代表给每个source的请求的响应

实现代码如下:

module fixed_arb
(
input 	[5:0]	req,
output 	[5:0]	grant
);
wire	[5:0] req_sub_one;
assign	req_sub_one = req - 1'b1;

assign	grant = req & (~req_sub_one);
endmodule

假设我们有2个source同时发出请求,req = 6'b001100

那么req_sub_one = 6'b001011        最低bit(优先级最高)取反

~req_sub_one = 6'110100        除最高优先级外,其余bit为0

grant = 6'b000100        

以上是基于bit位最低的优先级最高,随bit位升高,优先级依次降低。若想要灵活配置最高优先级要如何实现?

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为独热码,为1的位置表示该模块的优先级最高,其左侧为次高,向左优先级依次下降。当到最左侧bit时,转到最右侧bit,再依次向左优先级下降,直到bit为1的位置的相邻右边bit,其优先级最低。

举例:

first_priority = 6‘b000100;

那么优先级req[2]>req[3]>req[4]>req[5]>req[0]>req[1]

double_req是对req的扩展,因为first_priority的值有可能大于req。

固定优先级的种类有很多,可以根据需求进行编码。

仲裁器进阶:

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

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

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

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Verilog中的固定优先级仲裁器是一种用于解决多个请求的优先级冲突的电路设计。它根据预先定义的优先级规则来确定哪个请求应该被优先处理。 在Verilog中实现固定优先级仲裁器可以采用以下步骤: 1. 创建一个包含多个请求输入的模块。每个请求输入都与一个请求信号相关联,表示该请求是否被激活。 2. 为每个请求输入定义一个优先级。可以使用参数或常量来指定每个请求的优先级。 3. 使用条件语句(if-else或case语句)来比较每个请求的优先级,并根据优先级激活相应的输出。 4. 确定输出信号的逻辑。可以使用一个输出信号表示选中的请求,或者使用多个输出信号来表示每个请求的状态。 下面是一个简单的Verilog代码示例,演示了一个4个请求的固定优先级仲裁器: ```verilog module priority_arbiter ( input [3:0] requests, output [1:0] selected ); // 定义请求的优先级 parameter PRIORITY_0 = 2'b00; parameter PRIORITY_1 = 2'b01; parameter PRIORITY_2 = 2'b10; parameter PRIORITY_3 = 2'b11; always @* begin // 比较请求的优先级 case (requests) 4'b0001: selected = PRIORITY_0; 4'b0010: selected = PRIORITY_1; 4'b0100: selected = PRIORITY_2; 4'b1000: selected = PRIORITY_3; default: selected = 2'b00; // 如果没有请求被激活,输出为0 endcase end endmodule ``` 在上述代码中,`requests`是一个4位的输入信号,每个位表示一个请求。`selected`是一个2位的输出信号,表示被选中的请求。 这只是一个简单的示例,实际应用中的固定优先级仲裁器可能更加复杂。可以根据具体的需求进行相应的修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值