考虑下图所示状态图描述的 FSM:

考试 2013q2.png

该 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 的优先级高于设备 2。 最低优先级。 因此,例如,设备 3 只有在它是唯一设备时才会收到授权 时发出请求 。 一旦设备 获得 FSM 的授权,即 只要设备的请求 r[i] = 1,设备就会继续接收授权。

编写代表此 FSM 的完整 Verilog 代码。 对状态使用单独的 always 块 表和状态触发器,就像在讲座中所做的那样。 描述 FSM 输出 g[i] 使用以下任 连续赋值语句或始终块(由您自行决定)。 分配任何状态 您希望使用的代码。

module top_module (
    input clk,
    input resetn,    // active-low synchronous reset
    input [3:1] r,   // request
    output [3:1] g   // grant
);
parameter
    A=2'd0,
    B=2'd1,
    C=2'd2,
    D=2'd3;
    reg [1:0]state,nstate;
    always@(posedge clk)
        if(~resetn)
            state<=A;
     else
            state<=nstate;
    always@(*)
        case(state)
            A:nstate=r[1]?B:(r[2]?C:(r[3]?D:A));
            B:nstate=r[1]?B:A;
            C:nstate=r[2]?C:A;
            D:nstate=r[3]?D:A;
        endcase
    assign g[1]=(state==B);
    assign g[2]=(state==C);
    assign g[3]=(state==D);
endmodule

posted on 2022-06-23 09:03  USSTer  阅读(186)  评论(0)    收藏  举报