デジタル回路の不定とハイインピーダンス

デジタル回路の不定とハイインピーダンス

 VHDLやVerilogの教科書にも「不定」や「ハイインピーダンス」という言葉が載っています。デジタル回路はそもそも「1」と「0」の世界で設計するので、「不定」や「ハイインピーダンス」というのは何なのか? 初心者が明確に理解しにくい言葉だと思います。

 VHDLやVerilogでは不定を’x’と記し、ハイインピーダンスは’z’で示します。つまり、’1′,’0′,’x’,’z’の4通りあることになります。これを明確に捉えることで不具合の少ない回路設計ができますので、マスターしましょう。

 「不定」ですが、これは文字通り定まっていない状態を意味します。つまり、’1’にも’0’にも定まっていない状態です。もう少しわかりやすくすると、’1’でも’0’でもどっちも可という意味です。使われる場面で多いのは条件分岐などの場合で、ビットの指示を無視したい場合などになります。たとえば、次のような場合です。

if (wSawwave < 8’b111011xx) begin

 上の例では、ビット0とビット1が’x’なので不定になります。つまり、ビット0とビット1は’1’でも’0’でも良い。という事になります。これは書き換えると

if (wSawwave[7:2] < 6’b111011) begin

という書き方になります。古くからハードウェアに携わっている人はこの書き方の方が馴染むようです。上記の例は2進数での記述ですが、16進数でも不定を使う事ができます。

if (wSawwave < 8’hfx) begin

これはビット0~3が不定になります。このように不定を使うと、wSawwaveのビット4~7だけを比較する回路になりますので、ハードウェアのリソースは減る方向になり、速度を気にする場合などには有効な設計手段です。

不定は CASE文などで使う場面が多いようです。次にような書式になります。

    case (rCorrectShift)
        3'b00x :    rCorrect <= 0;

 このように条件の一部に不定を使いますが、値として不定を使う事はありません。以下のような記載はコンパイルが通ることが多いのですが、この場合は不定としてではなく、ハイインピーダンスとして回路が構成される場合が多くなります。コンパイラによってはワーニングやエラーが出る事もあります。

        if (wSawwave < rpwmreg) begin
            rLEDcathode <= 1'bx;

 VHDLやVerilogでの作法とは違いますが、設計の現場では「不定」を「結果としての不定」として使うことがあります。上の例ではrLEDcathodeが不定になっている。という言い方をします。一般的に回路設計において、不定は好ましい事ではありません。不定な回路にはノイズが混入する事が多く、一旦ノイズが混入すると回路は誤動作したり故障したりします。したがって、このような回路はハイインピーダンスに置き換えるようにします。

 ハイインピーダンスはその配線のインピーダンスが高い。という意味ですが、まずはFPGAの回路に限って説明します。

 FPGAやPLDが出始めの頃は、ハイインピーダンスの回路をFPGA内に作ることができなかったのですが、最近のデバイスやコンパイラでは許している事が多いようです。ハイインピーダンス回路をVHDLやVerilogで書いたときに、コンパイラの生成結果やワーニングを注意して読むようにすると良いでしょう。

 普通のデジタル回路であれば、’1’と’0’の状態をデジタルレベルHiやLowというように表現して、2進数を表現しますが、この状態にもう一つハイインピーダンス状態にできる回路。というのがあります。このようなデバイスをトライステートデバイスもしくはスリーステートデバイスといいます。’1’と’0’と’z’の三つの状態なのでトライステート(スリーステート)です。回路図記号と真理値表を示します。

 入力が2つあります。Aの入力は普通のデバイスと同じですが、Gの入力が回路の脇に入っています。脇に入っている意味は無いのですが、トライステートデバイスの場合、このように脇にG入力を描く事が多いです。おそらく、Aの入力ピンに比べて振る舞いが遅かったり、ON/OFFスイッチ的な扱いをされることが多いので、区別しているのだと思います。

 赤矢印で示した部分を見ると、GがLowの時に、Aが”不定”になっています。これまで解説した”不定”の状態です。つまり、’1’でも’0’でも(HiでもLowでも)良いという状態です。
 GがLowならば、Aがどのような状態でもYは’Z’になります。この’Z’の状態がハイインピーダンスです。回路図記号としてではく、デバイスの等価回路などを学習したい方は74HC126のデバイスを検索してみてください。

 ハイインピーダンスがHiでもLowでもない状態だというのはどのような事かというのが重要ですが、以下のような場面が想定されます。

 スイッチが閉じた状態では5VがDFFの入力にかかっていますが、スイッチが開の時、電圧はかかっていません。このような状態をハイインピーダンスといいます。現場では”オープン”という事もあります。このように、HiでもLowでもない状況があり得るので、それを避けるために通常はプルアップやプルダウンといって、抵抗を追加してHiかLowの状態にします。

 上はプルダウン抵抗を付けてスイッチが開の時には0Vになるようにした例です。このように、ハイインピーダンスにならないように回路を工夫します。
※一般的にスイッチ回路はプルアップ側で使用します。

 それでは、どうしてハイインピーダンスという状態を作る指示がVHDLやVerilogで存在するのかといえば、出力側でハイインピーダンスを使うメリットがあるからです。

 冒頭の真理値表に示したように、GがLowの時に出力をハイインピーダンスにする事ができます。これは2通りの使い方が考えられます。

 ワイヤード・オア回路とオープン・コレクタ回路です。

 ワイヤード・オア回路は上図のようにEnableがONになっている回路だけが有効になり、EnableがOFFの回路は’Z’になる回路です。このようにすることで、青矢印で示した箇所のOR回路を節約できるメリットがあります。上図のように3回路程度であれば、3回路のORを使った方が分かりやすいですが、これが8ビットのバスで各々10回路のORを取りたい場合等はメリットが生きてきます。なので、ワイヤード・オア回路はバスの切り替えなどに多く利用されています。

 次にオープン・コレクタ回路ですが、これはトランジスタの回路構成の名前が由来しています。下図のように、トランジスタのコレクタ端子が出力ピンに直接接続された状態になっています。

 FPGA内部にトランジスタと同等の回路があり、コレクタ端子をIOピンに接続することで、外部の制御回路がわで動作電圧を決められる。という物です。昨今のFPGAはIOピンの電圧が3.3V以下のサポートという事が多くなりましたが、外部の5Vの回路と接続したい場合などに利用します。

 ハイインピーダンスにするには’z’を用いますので、下記のように記述します。

assign output_ans = (enable == 1’b1)? rSeldSignal: 1’bz;

 enable == 1’b1の時にはrSeldSignalがoutput_ansに出力され、enable == 1’b0の時にはoutput_ansがハイインピーダンスになります。冒頭の真理値表と同じ動きを示します。

 output_ansが出力ピンの場合、そのまま出力ピンがハイインピーダンスになります。つまり、オープンコレクタになっていますので、外部で何らかの電流を流して電圧に変換しなくてはなりません。多くのFPGAでこのように出力ピンをオープンコレクタ(オープンドレイン)で扱う事ができますが、稀にこれを許さないデバイスもありますので、使用するFPGAのデータシートで確認することが必要です。また、通常オープンコレクタで使用すると、速度が遅くなりますので、速度が要求されるピンではオープンコレクタ回路は避けるべきです。