序文
アービター 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 です。