⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arb_fsm.v

📁 一个用verilog编写的总线仲裁程序。多个设备共享总线
💻 V
字号:
module arb_fsm(Gnt, count_reset, Req, Clk, Reset_l, count_done, gnt_done);

output [3:0]Gnt;
output count_reset;
input [3:0]Req;
input Clk;
input Reset_l;
input count_done, gnt_done;

parameter IDLE_ST=3'b000, Gnt0_ST=3'b001, Gnt1_ST=3'b010, Gnt2_ST=3'b011, Gnt3_ST=3'b100;
reg [2:0] CurrentState, NextState;

wire count_reset = (CurrentState == IDLE_ST);

always @(Reset_l or Req or count_done or CurrentState)
begin
  if(~Reset_l)
    NextState <= IDLE_ST;
  else
    case(CurrentState)
    IDLE_ST: begin
               if (Req[0])
                  NextState <= Gnt0_ST;
               else if (Req[1])
                  NextState <= Gnt1_ST;
               else if (Req[2])
                  NextState <= Gnt2_ST;
               else if (Req[3])
                  NextState <= Gnt3_ST;
               else
                  NextState <= IDLE_ST;                         
             end

    Gnt0_ST: if (count_done)
               begin                
                 if (Req[1])
                   NextState <= Gnt1_ST;
                 else if (Req[2])
                   NextState <= Gnt2_ST;
                 else if (Req[3])
                   NextState <= Gnt3_ST;
                 else if (Req[0])
                   NextState <= Gnt0_ST;
                 else
                   NextState <= IDLE_ST;
               end
             else
                NextState <= Gnt0_ST;

    Gnt1_ST: if (count_done)
               begin                
                 if (Req[2])
                   NextState <= Gnt2_ST;
                 else if (Req[3])
                   NextState <= Gnt3_ST;
                 else if (Req[0])
                   NextState <= Gnt0_ST;
                 else if (Req[1])
                   NextState <= Gnt1_ST;
                 else
                   NextState <= IDLE_ST;
               end
             else
                NextState <= Gnt1_ST;

    Gnt2_ST: if (count_done)
               begin                
                 if (Req[3])
                   NextState <= Gnt3_ST;
                 else if (Req[0])
                   NextState <= Gnt0_ST;
                 else if (Req[1])
                   NextState <= Gnt1_ST;
                 else if (Req[2])
                   NextState <= Gnt2_ST;
                 else
                   NextState <= IDLE_ST;
               end
             else
                NextState <= Gnt2_ST;
              
    Gnt3_ST: if (count_done)
               begin                
                 if (Req[0])
                   NextState <= Gnt0_ST;
                 else if (Req[1])
                   NextState <= Gnt1_ST;
                 else if (Req[2])
                   NextState <= Gnt2_ST;
                 else if (Req[3])
                   NextState <= Gnt3_ST;
                 else
                   NextState <= IDLE_ST;
               end
             else
                NextState <= Gnt3_ST;

    default:
              $display("******ERROR--Enter non-exist State!", $time);

    endcase
end

    
always @(posedge Clk or negedge Reset_l)
  begin
    if(~Reset_l)
      CurrentState <= IDLE_ST;
    else
      CurrentState <= NextState;
  end

assign Gnt[0] = gnt_done & (CurrentState == Gnt0_ST);
assign Gnt[1] = gnt_done & (CurrentState == Gnt1_ST);
assign Gnt[2] = gnt_done & (CurrentState == Gnt2_ST);
assign Gnt[3] = gnt_done & (CurrentState == Gnt3_ST);

endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -