-1

次のように設定されたアービターモジュールがあります。

// Code your design here
module arbiter#(parameter WIDTH=3)(
    input clk,rst,
    input [WIDTH-1:0] in,
    output reg [WIDTH-1:0] out
    ); 
    parameter IDLE=3'b0,G1=3'b001,G2=3'b010,G3=3'b100;
    reg [WIDTH-1:0] state;    
    wire [WIDTH-1:0] nextState;    

  always@(posedge clk)
     if (rst==1'b1)begin
       state<=3'b000;
       out=3'b000;
     end else begin
      case (state)
    IDLE:if (in==3'b000) begin
            state=IDLE;
            out=IDLE;
        end else if (in == 3'b001)begin
             state=G1;
             out=G1;
        end else if (in == 3'b010 | in==3'b011) begin
            state=G2;
            out=G2;
        end else if (in == 3'b100 | in==3'b101| in==3'b110| in==3'b111) begin
            state=G3;
            out=G3;
        end

   G1:if (in==3'bxx1) begin
            state=G1;
            out=G1;
        end else if (in==3'bxx0)begin
            state=IDLE;
            out=IDLE;
        end

    G2:if (in==3'bx0x) begin
             state=IDLE;
             out=IDLE;
        end else if (in==3'bx1x)begin
              state=G2;
              out=G2;
        end

     G3:if (in==3'b1xx) begin
               state=G3;
               out=G3;
        end else if (in==3'b0xx)begin
                state=IDLE;
                out=IDLE;
         end

endcase

end

endmodule

私のテストベンチは次のとおりです。

module basic_and_tb();

  reg [2:0] a;
  wire [2:0] out;
  reg clk,rst;

  arbiter uut(.clk(clk),.rst(rst),.in(a),.out(out));

  initial clk=1'b0;

  always #5 begin
    clk=~clk;
  end

  initial begin
    rst=1'b1;
    #10rst=1'b0;
    a=3'b000; $display("%b",out);
    #10 a=3'b010; $display("%b",out);
    #30 a=3'b011; $display("%b",out);
    #10 a=3'b000; $display("%b",out);
    #10 a=3'b100;$display("%b",out);
    #10 a=3'b101;$display("%b",out);
    #20 a=3'b011;$display("%b",out);
    #20 a=3'b010;$display("%b",out);
    #20 a=3'b000;$display("%b",out);
    #10 a=3'b100;$display("%b",out);
    #20 a=3'b000;$display("%b",out);
    #1 $display("%b",out);
    #10 $finish;
  end

endmodule

しかし、私が得る出力は

000
000
010
010
010
010
010
010
010
010
010
010

どの時点でも、出力の 1 ビットのみが High になります。アイドル状態の間に要求入力がアサートされると、回路は出力の対応するビットをアサートすることによってその要求を許可する必要があります。これは、対応する入力ビットがデアサートされるまでハイのままである必要があり、その時点で回路はアイドル状態に移行する必要があります。複数の入力ビットがアサートされると、最も優先度の高い要求が許可され、一番左のビットが最も優先度が高くなります。しかし、私の出力は最後まで 010 のままです。何が悪かったのか?

4

1 に答える 1

0

ステート マシンはステートG2('b010) でスタックします。これは、そのステートから遷移する条件にinx が必要なためです。ただし、常にin既知の値で運転します。おそらく、次のような意味でした:

G2:if (~in[1]) begin
         state=IDLE;
         out=IDLE;
    end else begin
          state=G2;
          out=G2;
    end

ステート G1 と G3 にも同様の変更が必要です。

于 2016-01-26T13:44:01.077 に答える