固定優先順位アービター設計

序文

アービター Arbiter はデジタル設計において非常に一般的なモジュールであり、幅広い用途があります。定義は、2 つ以上のモジュールが同じリソースを占有する必要がある場合、どのモジュールがリソースを占有するかを決定するアービターが必要であるということです。一般に、リソースの占有を提案するモジュールはリクエストを生成する必要があり、すべてのリクエストがアービトレータに送信された後、アービトレータは許可を返さなければなりません。

固定優先アービタ(固定優先)

固定優先度 各モジュールの優先度は固定であらかじめ割り当てられており、2 つのモジュールが同時にリクエストを発行した場合、優先度の高いモジュールがグラントを取得できます。CBA としてモジュールが 3 つあるとします。リクエストを表すのに 3 ビットの request を使用し、ビットの優先順位が低いほど優先順位が高くなります。つまり、request = 3'b011 の場合、A の優先順位が最も高いため、grant=3'b001 とすると、モジュール A にバス制御が与えられます。

1. casex ステートメントの優先順位の調停を修正しました。

casex ステートメントを使用して、固定優先順位のアービトレーションを実行できます。verilog コードは次のとおりです。

1.1 コード

module fixed_arbiter(
    input              rstn    ,
    input              clk     ,
    input      [2:0]   request ,
    
    output reg [2:0]   grant
);

always @(posedge clk)begin
    if(!rstn)begin
        grant <= 3'b000;
    end 
    else begin
        casex(request)
            3'b??1: grant <= 3'b001;
            3'b?10: grant <= 3'b010;
            3'b100: grant <= 3'b100;
            default: grant <= 3'b000;
        endcase
    end
end

endmodule

casez ステートメントと case ステートメントの使用法は非常に似ていますが、唯一の違いは、casez ステートメントでは状態 z が通常の z 状態とはみなされませんが、式内で z とマークされたビット (またはそれら) はドントケア (ドントケア) とみなされます。casex ステートメントと casez ステートメントの使用方法は非常に似ていますが、唯一の違いは、casex が状態 x と状態 z の両方をドントケア (ドントケア) として扱うことができることです。

上記のコードと同様に、最下位ビットが 1 の場合、最初の 2 ビットが何であるかは関係なく、最下位ビットが 1 であれば許可に 3'b001 を割り当てます。

1.2テストベンチ

module fixed_arbiter_tb();

reg clk, rstn;
wire [2:0] grant;

reg [2:0] request;
initial begin
    forever #5 clk <= ~clk;
end
initial begin
    clk  <= 1'b0;
    rstn <= 1'b0;
    #15
    rstn <= 1'b1;
    request <= 3'b110;
    #10
    request <= #1 3'b011;
    #10
    request <= #1 3'b111;
    #10
    request <= #1 3'b010;
    #50
    $finish();
end

fixed_arbiter u_fixed_arbiter(
    .clk        (clk)       ,
    .rstn       (rstn)      ,
    .request    (request)   ,
    .grant      (grant)
);

initial begin
    $fsdbDumpfile("fixed_arbiter.fsdb");
    $fsdbDumpvars(0);
end 

endmodule

波形

2. 相補コードの特性を利用して優先度を判断します。

数値とその補数の AND 演算の結果はワンホット コードであり、ワンホット コードが 1 であるビットは数値の最下位 1 です

たとえば、a=4'b1011 の場合、a の補数は ~(a-1)=4'b0101 となります。a とその補数の AND は次のようになります: 4'b0001。

たとえば、a=4'b1010 の場合、a の補数は ~(a-1)=4'b0110 となります。a とその補数の AND は次のようになります: 4'b0010。

この機能を使用すると、(ビットごとの演算子を使用して) 非常に単純な固定優先順位アービターを取得できます。

2.1 コード

module fixed_arbiter(
    input              rstn    ,
    input              clk     ,
    input      [2:0]   request ,
    
    output reg [2:0]   grant
);

always @(posedge clk)begin
    if(!rstn)begin
        grant <= 3'b000;
    end 
    else begin
        grant <= request & (~(request-1));
    end
end

endmodule

実際、これは数値とその補数という特徴を使用しており、その結果はワンホット コードであり、ワンホット コードが 1 であるビットは数値の最小の 1 です

おすすめ

転載: blog.csdn.net/qq_57502075/article/details/129767386