考虑下图所示状态图描述的 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 的优先级高于设备 2。 最低优先级。 因此,例如,设备 3 只有在它是唯一设备时才会收到授权 时发出请求 A 。 一旦设备 i 获得 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
浙公网安备 33010602011771号