arbiter circuit(以Verilog FSM实现仲裁器)

有限状态机实现仲裁器

状态图如下:
状态图

题目要求:

这个FSM作为一个仲裁器电路,控制着三个请求设备对某种类型资源的访问。每个设备通过设置一个信号r[i]=1来提出对资源的请求,其中r[i]是r[1]、r[2]或r[3]。每个r[i]是FSM的一个输入信号,代表三个设备中的一个。只要没有请求,FSM就会保持在状态A。当一个或多个请求发生时,FSM决定哪个设备收到使用资源的授权,并改变到一个状态,将该设备的g[i]信号设置为1。每个g[i]是FSM的一个输出。有一个优先级系统,即设备1比设备2的优先级高,设备3的优先级最低。因此,举例来说,当FSM处于状态A时,设备3只有在它是唯一提出请求的设备时才会收到授予。一旦设备i被FSM授予授予,只要它的请求r[i]=1,该设备就会继续收到授予。
编写完整的Verilog代码来表示这个FSM。

module top_module (
    input clk,
    input resetn,    // active-low synchronous reset
    input [3:1] r,   // request
    output [3:1] g   // grant
); 
    reg [2:0]state,next_state ;
parameter A=3'b000,B=3'b001,C=3'b010,D=3'b100;

//FF
always@(posedge clk)begin
    if(!resetn)
        state<=A;
    else
        state<=next_state;
end

//Transition
    always @(*) begin
    case (state)
        A:  
            casez(r)  //优先级判断,也可以用if-else
                3'b000:next_state=A;
                3'bzz1:next_state=B;
                3'bz1z:next_state=C;
                3'b1zz:next_state=D;
                default:next_state=A;
            endcase
        B:  //被授权后只用考虑r1变化
            next_state=r[1]?B:A;
        C:
            next_state=r[2]?C:A;
        D:
            next_state=r[3]?D:A;
        default:
            next_state=A;
    endcase
end

//output
always@(*)begin
    g=3'b000; //default_state
    case(state)
        B:
            g[1]=1'b1;
        C:
            g[2]=1'b1;
        D:
            g[3]=1'b1;
endcase
end
endmodule

if-else判断A状态的优先级:

       A:  
           if(r == 3'b000)
           		next_state = A;
           else if(r[1]) 
           		next_state = B;
           else if(r[2:1] == 2'b10) 
                next_state = C;
           else if(r == 3'b100) 
           		next_state = D;
           else
                next_state=A;
轮询仲裁是一种简单的仲裁方式,其原理是每个设备都有一个优先级,从高到低依次轮询每个设备请求总线,如果当前设备发出请求但总线已被占用,则该设备需要等待下一次轮询。以下是一个简单的 Verilog 实现示例: ```verilog module arbiter( input clk, // 时钟信号 input [3:0] req, // 请求信号,4个设备分别占用1位 output reg [1:0] grant // 授权信号,2位二进制数表示哪个设备获得总线控制权 ); reg [1:0] priority = 2'b00; // 初始优先级为0 always @(posedge clk) begin if (grant == 2'b00) begin // 如果总线未被占用 case (priority) 2'b00: if (req[0] == 1) grant <= 2'b01; // 设备1请求 2'b01: if (req[1] == 1) grant <= 2'b10; // 设备2请求 2'b10: if (req[2] == 1) grant <= 2'b11; // 设备3请求 2'b11: if (req[3] == 1) grant <= 2'b01; // 设备4请求,回到第一个设备 endcase end else begin // 如果总线已被占用 if (grant == 2'b01 && req[1] == 1) priority <= 2'b01; // 设备2优先级提高 if (grant == 2'b10 && req[2] == 1) priority <= 2'b10; // 设备3优先级提高 if (grant == 2'b11 && req[3] == 1) priority <= 2'b11; // 设备4优先级提高 end end endmodule ``` 上述代码中,req 输入信号表示四个设备的请求,grant 输出信号表示哪个设备获得总线控制权。priority 是一个寄存,用于记录当前轮询到的设备优先级,初始值为 0。在时钟上升沿时,如果总线未被占用,则根据当前优先级依次轮询各个设备的请求,如果有设备发出请求,则将 grant 输出信号设置为该设备的编号,并更新优先级。如果总线已被占用,则检查当前占用总线的设备和下一个优先级的设备,如果后者发出请求,则将其优先级提高,以确保总线控制权能够顺利转移。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢凡凡

xixixi

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值