トライステートのプリミティブのメモ
bufif0 u1(Z, A, G);
G = 0のとき、Z = A
G = 1のとき、Z = z
等価な記述 wire Z = G ? 1'bz : A; // wireはtriも可, G = 1または0のときのみ
bufif1 u2(Z, A, G);
G = 0のとき、Z = z
G = 1のとき、Z = A
等価な記述 wire Z = G ? A : 1'bz;
notif0 u3(Z, A, G);
G = 0のとき、Z = ~A
G = 1のとき、Z = z
等価な記述 wire Z = G ? 1'bz : ~A;
notif1 u4(Z, A, G);
G = 0のとき、Z = z
G = 1のとき、Z = ~A
等価な記述 wire Z = G ? ~A : 1'bz;
trireg z;
ラッチの一種、入力が全てzのときは最後の状態を覚えています。バスに使えますが、xilinxのISEでは未サポートのエラーになります。
bufif0, bufif1, notif0, notif1は等価なverilog記述がありますが、triregをverilogで記述する方法は分かりませんでした。今時、使うこともないんでしょうがとりあえずメモ。
7/4 追記 等価な記述が全部逆になっていたので直しました。のりたんさん、ありがとうございます。
bufif0 u1(Z, A, G);
G = 0のとき、Z = A
G = 1のとき、Z = z
等価な記述 wire Z = G ? 1'bz : A; // wireはtriも可, G = 1または0のときのみ
bufif1 u2(Z, A, G);
G = 0のとき、Z = z
G = 1のとき、Z = A
等価な記述 wire Z = G ? A : 1'bz;
notif0 u3(Z, A, G);
G = 0のとき、Z = ~A
G = 1のとき、Z = z
等価な記述 wire Z = G ? 1'bz : ~A;
notif1 u4(Z, A, G);
G = 0のとき、Z = z
G = 1のとき、Z = ~A
等価な記述 wire Z = G ? ~A : 1'bz;
trireg z;
ラッチの一種、入力が全てzのときは最後の状態を覚えています。バスに使えますが、xilinxのISEでは未サポートのエラーになります。
bufif0, bufif1, notif0, notif1は等価なverilog記述がありますが、triregをverilogで記述する方法は分かりませんでした。今時、使うこともないんでしょうがとりあえずメモ。
7/4 追記 等価な記述が全部逆になっていたので直しました。のりたんさん、ありがとうございます。
ご指摘のとおり全部逆です。直しておきます。ありがとうございます。
triregには元々そういう由来があったんですね。パズルみたいなノリで何か別な表現ができないかと思ったのですが、できませんでした。
これ、すべて論理が逆になっていませんか?
上の例では、"G"が"TRUE(1'b1)"のときに"A"を出力するので、"bufif1"と等価だと思います。
"trireg"は、アクティブな素子ではなく、どちらかというと浮遊容量です。昔は、トライステートバスのグリッチを無視するための方便として、浮遊容量を期待した配線の記述に使っていました。今は、もちろん、使っていません。