轮询仲裁器

轮询仲裁器:每次访问结束后都会更新优先级;假设有四个请求A,B,C,D,某个时刻这4个请求的优先级为A>B>C>D,这个时刻将总线控制权交给C,则这个请求后的优先级修改为D>A>B>C,代码中以3请求为例:
上代码:
bus_arbitor:

module bus_arbitor(
    input wire clk,
    input wire rstn,
    input wire singal_1,
    input wire singal_2,
    input wire singal_3,
//    input wire singal_4,
    output reg [2:0] out_signal,//[1,2,3]
    output reg [1:0] current_arb
);
parameter S1=2'b01;
parameter S2=2'b10;
parameter S3=2'b11;
parameter NULL=2'b00;
//reg [1:0]current_arb;
reg [1:0]last_arb;

always @(posedge clk or negedge rstn) begin
    if(~rstn) begin
        current_arb<='b0;
        last_arb<='b0;
    end
    else begin
        case({singal_1,singal_2,singal_3})
            3'b000:begin
                current_arb<='b0;
                last_arb<='b0;
            end
            3'b001:begin
                current_arb<=S3;
                last_arb<=S3;
            end
            3'b010:begin
                current_arb<=S2;
                last_arb<=S2;
            end
            3'b100:begin
                current_arb<=S1;
                last_arb<=S1;
            end
            3'b011:begin
                case(last_arb)
                S1:begin current_arb<=S2; last_arb<=S2;end
                S2:begin current_arb<=S3; last_arb<=S3;end
                S3:begin current_arb<=S2; last_arb<=S2;end
                endcase
            end
            3'b101:begin
                case(last_arb)
                S1:begin current_arb<=S3; last_arb<=S3;end
                S2:begin current_arb<=S3; last_arb<=S3;end
                S3:begin current_arb<=S1; last_arb<=S1;end
                endcase
            end
            3'b110:begin
                case(last_arb)
                S1:begin current_arb<=S2; last_arb<=S2;end
                S2:begin current_arb<=S1; last_arb<=S1;end
                S3:begin current_arb<=S1; last_arb<=S1;end
                endcase
            end
            3'b111:begin
                case(last_arb)
                S1:begin current_arb<=S2; last_arb<=S2;end
                S2:begin current_arb<=S3; last_arb<=S3;end
                S3:begin current_arb<=S1; last_arb<=S1;end
                endcase
            end
            default:begin
                current_arb<=NULL;
                last_arb<=last_arb;
            end
        endcase
    end
end

always @(*) 
    case(current_arb)
        S1:begin out_signal=3'b100;end
        S2:begin out_signal=3'b010;end
        S3:begin out_signal=3'b001;end
        default:out_signal=3'b000;
    endcase
endmodule

tb:

`timescale  1ns/1ps
module tb_ar();
reg clk;
reg rstn;
reg singal_1;
reg singal_2;
reg singal_3;
//    input wire singal_4,
wire [2:0]out_signal;//[1,2,3]
wire current_arb;
parameter perd = 20;
initial begin
    rstn=1;
    clk=1;
    #20 rstn =0;
    #20 rstn =1;
end

always #(perd/2) clk =~clk;
initial begin
    singal_1=0;singal_2=0;singal_3=0;
    #85 singal_2=1;
    #20 singal_1=1;singal_2=0;singal_3=1;

end



bus_arbitor bus_arbitor_inst( 
    .clk(clk),
    .rstn(rstn),
    .singal_1(singal_1),
    .singal_2(singal_2),
    .singal_3(singal_3),
//    input wire singal_4,
    .out_signal(out_signal),//[1,2,3]
    .current_arb(current_arb)
);

endmodule

在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
公平轮询仲裁(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个

红包金额最低5元

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

抵扣说明:

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

余额充值