引言
本文就固定优先级仲裁器和轮询调度仲裁器作简单阐述并实现。给出设计、测试源码。
仲裁请求个数以 4 为例进行说明。
固定优先级仲裁
不论何时,不论何种情况,仲裁的优先级总是 1号 > 2号 > 3号 > 4号。这个在FPGA里用 Verilog是比较容易实现的。
设计源码
// ====================================================================
// | 功能:固定优先级仲裁器
// | 作者:Xu Y. B.
// | 时间:2023-02-11
// | 注意:支持4个仲裁请求
// | 优先级:1 > 2 > 3 > 4
// ====================================================================
`timescale 1ns / 1ps
module FPA(
// ======================= 模块输入输出端口 =======================
input I_OPR_CLK,
input I_OPR_RSTN,
input [3:0] I_AREQ,//仲裁请求
output reg [1:0] O_AGRANT
);
always @ (posedge I_OPR_CLK)
begin
if(~I_OPR_RSTN)
begin
O_AGRANT <= 2'd0;
end
else if(I_AREQ[0])
begin
O_AGRANT <= 2'd0;
end
else if(I_AREQ[1])
begin
O_AGRANT <= 2'd1;
end
else if(I_AREQ[2])
begin
O_AGRANT <= 2'd2;
end
else if(I_AREQ[3])
begin
O_AGRANT <= 2'd3;
end
else
begin
O_AGRANT <= 2'd0;
end
end
endmodule
测试源码
// ====================================================================
// | 功能:固定优先级仲裁器 测试程序
// | 作者:Xu Y. B.
// | 时间:2023-02-11
// | 注意:支持4个仲裁请求
// | 优先级:1 > 2 > 3 > 4
// ====================================================================
`timescale 1ns / 1ps
module TB_FPA_();
// ======================= 模块输入输出端口 =======================
reg I_OPR_CLK;
reg I_OPR_RSTN;
reg [3:0] I_AREQ;//仲裁请求
wire [1:0] O_AGRANT;
initial I_OPR_CLK = 0;
always #10 I_OPR_CLK = ~I_OPR_CLK;
initial
begin
I_OPR_RSTN = 0;
I_AREQ = 4'd0;
#103;
I_OPR_RSTN = 1;
#192;
@(posedge I_OPR_CLK)
I_AREQ <= 4'b1101;
@(posedge I_OPR_CLK)
I_AREQ <= 4'b1111;
@(posedge I_OPR_CLK)
I_AREQ <= 4'b1110;
@(posedge I_OPR_CLK)
I_AREQ <= 4'b1100;
@(posedge I_OPR_CLK)
I_AREQ <= 4'b1000;
#105;
$finish;
end
FPA INST_FPA
(
.I_OPR_CLK (I_OPR_CLK),
.I_OPR_RSTN (I_OPR_RSTN),
.I_AREQ (I_AREQ),
.O_AGRANT (O_AGRANT)
);
endmodule
仿真结果
轮询调度仲裁
轮询调度仲裁的规则是当0、1、2、3 共4个source信号源同时向仲裁器发出请求时,初始情况下source 0的优先级最高,当仲裁器响应了source0后,source1的优先级最高,依次类推。
设计源码
// ====================================================================
// | 功能:轮询调度优先级仲裁器 Round Robin Arbiter
// | 作者:Xu Y. B.
// | 时间:2023-02-11
// | 注意:支持4个仲裁请求
// |
// ====================================================================
`timescale 1ns / 1ps
module RRA(
// ======================= 模块输入输出端口 =======================
input I_OPR_CLK,
input I_OPR_RSTN,
input [3:0] I_AREQ,//仲裁请求
output reg [1:0] O_AGRANT
);
always @ (posedge I_OPR_CLK)
begin
if(~I_OPR_RSTN)
begin
O_AGRANT <= 2'd3;
end
else
begin
case(O_AGRANT)
2'd0:
begin
if(I_AREQ[1])
begin
O_AGRANT <= 2'd1;
end
else if(I_AREQ[2])
begin
O_AGRANT <= 2'd2;
end
else if(I_AREQ[3])
begin
O_AGRANT <= 2'd3;
end
else if(I_AREQ[0])
begin
O_AGRANT <= 2'd0;
end
else
begin
O_AGRANT <= O_AGRANT;
end
end
2'd1:
begin
if(I_AREQ[2])
begin
O_AGRANT <= 2'd2;
end
else if(I_AREQ[3])
begin
O_AGRANT <= 2'd3;
end
else if(I_AREQ[0])
begin
O_AGRANT <= 2'd0;
end
else if(I_AREQ[1])
begin
O_AGRANT <= 2'd1;
end
else
begin
O_AGRANT <= O_AGRANT;
end
end
2'd2:
begin
if(I_AREQ[3])
begin
O_AGRANT <= 2'd3;
end
else if(I_AREQ[0])
begin
O_AGRANT <= 2'd0;
end
else if(I_AREQ[1])
begin
O_AGRANT <= 2'd1;
end
else if(I_AREQ[2])
begin
O_AGRANT <= 2'd2;
end
else
begin
O_AGRANT <= O_AGRANT;
end
end
2'd3:
begin
if(I_AREQ[0])
begin
O_AGRANT <= 2'd0;
end
else if(I_AREQ[1])
begin
O_AGRANT <= 2'd1;
end
else if(I_AREQ[2])
begin
O_AGRANT <= 2'd2;
end
else if(I_AREQ[3])
begin
O_AGRANT <= 2'd3;
end
else
begin
O_AGRANT <= O_AGRANT;
end
end
default:
begin
O_AGRANT <= 2'd0;
end
endcase
end
end
endmodule
测试源码
// ====================================================================
// | 功能:轮询调度优先级仲裁器 Round Robin Arbiter 测试程序
// | 作者:Xu Y. B.
// | 时间:2023-02-11
// | 注意:支持4个仲裁请求
// |
// ====================================================================
`timescale 1ns / 1ps
module TB_RRA_();
// ======================= 模块输入输出端口 =======================
reg I_OPR_CLK;
reg I_OPR_RSTN;
reg [3:0] I_AREQ;//仲裁请求
wire [1:0] O_AGRANT;
initial I_OPR_CLK = 0;
always #10 I_OPR_CLK = ~I_OPR_CLK;
initial
begin
I_OPR_RSTN = 0;
I_AREQ = 4'd0;
#103;
I_OPR_RSTN = 1;
#192;
@(posedge I_OPR_CLK)
I_AREQ <= 4'b1101;
@(posedge I_OPR_CLK)
I_AREQ <= 4'b1111;
@(posedge I_OPR_CLK)
I_AREQ <= 4'b1110;
@(posedge I_OPR_CLK)
I_AREQ <= 4'b1100;
@(posedge I_OPR_CLK)
I_AREQ <= 4'b1000;
#105;
$finish;
end
RRA INST_RRA
(
.I_OPR_CLK (I_OPR_CLK),
.I_OPR_RSTN (I_OPR_RSTN),
.I_AREQ (I_AREQ),
.O_AGRANT (O_AGRANT)
);
endmodule
仿真结果
文章来源:https://www.toymoban.com/news/detail-634313.html
文章来源地址https://www.toymoban.com/news/detail-634313.html
到了这里,关于仲裁器设计——Verilog源码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!