よく、アナログとディジタルは比較されます。
だいたい、これまでは身の回りで「ディジタル」と名前につくものは、数字、しかも「日」な数字が表示される物と相場が決まっていましたが、最近はもうすこし本来のディジタルの意味が見えるようになってきて、DVDの一個がディジタルだというのも知られていると思います。
(DVD=Digital Versatile Disk , versatile=多芸、Digital Video Disk ではありません<多分最初はそういう発想だったんじゃないかと)
昔は、音を記録するのも映像を記録するのもアナログでしたが、いまどきはディジタルです。音声や映像信号そのものはいまでもアナログなことが多いのですが、徐々に再生に関しては完全にディジタル処理だけというシステムが出始めています。
では、なぜ、ディジタルがどんどん増えてきているのでしょう。アナログに対して優位性があるからとは思えます。
以下、思い当たる比較をします。
比較対象 | アナログ | ディジタル |
値の扱い | 電圧や電流の連続的な大小をそのまま信号の値として考える。 | 電圧や電流をオン/オフ、十分大きい/十分小さいと極端に違う状態でつかい、信号は2種類しか考えない。値の種類を多くする場合は信号線を複数本にする。 |
信号の扱いやすさ | 線一本で値が伝わるため、配線は少ない。しかし、途中の部品の精度、信号へのノイズなどの影響を直接受け、精度の低下要因がいろいろある。 | 値の種類に応じて、線が多くなる。たとえば、0〜5万程度の整数値を扱う場合は最低16本必要。しかし、信号の電圧が極端であるため、多少の回路の誤差の影響は受けず、またノイズなどの影響も受けにくい。そのため、値の精度は原則として低下しない。 |
回路の作りやすさ | 配線本数はすくない。しかし、設計や作り手の腕で回路の性能が変わる。 | 配線本数は非常に多くなりやすい。しかし、普通は正しく配線すれば「だれがつくっても動く」回路ができる。 |
※ディジタルで、線一本で、時間方向に送る信号を高速で切り替えて、線一本で多くの情報をおくる「シリアル」という方式があります。線をたくさん使う方法は「パラレル」。パソコンでは、通信端子の多くはシリアル方式、プリンタ接続用のコネクタ、内部に増設するボード、ハードディスク、メモリなどはパラレル(最近シリアル化が進みつつある)。
ディジタル回路は配線こそ多くなりますが、なれれば単純な物で、失敗もしにくいため、それほど難しくありません。また、いまどきは電気製品でコンピュータを積まない物は少なくなってきていますが、コンピュータはディジタル回路の固まりです。そんなわけで、ここではディジタル回路について学びます。
ちなみに、針が回る時計、よく見ると、秒針は1秒ごとか、4分の1秒ごととかで進んでいます。あれ、アナログ時計と称しますけど、中は普通はディジタル回路でできています。
なお、Digital の表記として、よく使われるのは「デジタル」ですが、専門的には普通な原音に近い「ディジタル」をここでは使用します。
この1と0を取り扱うとき、ブール代数というものを使います。日常的に数学では四則演算が定義され、それに基づいて様々な演算が行われますが、ブール代数は「0と1しかない」ことを前提とした数学です。逆に、このブール代数(論理数学)を満たすようにディジタル回路の構成要素が組み立てられるため、「ロジック回路」と呼ばれることもあります。
この数学は「0と1」しかないのですごく簡単です。以下、見てみましょう。
それぞれ、以下のように定義されています。
A | B | A AND B | A OR B | NOT A |
0 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 0 |
これらについて、基本法則があります。
これに加えて、非常に大事な法則、「ド・モルガンの法則」があります。
これをブール代数的に証明するのは簡単です。
これら法則は、ディジタル回路を読み書き設計するときに大変重要なものなので、覚えておくようにしましょう。
これは「ABの否定は、Aの否定もしくはBの否定」とかけますが、ANDとORとNOTがあったときに、回路設計やプログラム開発において互いにいれかえることができます。
たとえば、日常的な例では
「明日は晴れて暖かくなる」
の否定は、
「明日は晴れないか、暖かくない」
になります。別のたとえをすれば、
「材力の単位をとれなかった」もしくは「熱力の単位をとれなかった」
は
「材力と熱力、両方の単位がとれた」
の否定になります。
A B /A /B /(AB) /A + /B /(A+B) (/A)(/B) 0 0 1 1 1 1 1 1 0 1 1 0 1 1 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 0
回路の規模が小さく、手計算できるなら、このような表「真理値表」を作成すると、簡単に証明できます。
これを数値として使う場合には、2進数をつかいます。
b3,b2,b1,b0 | 正数のみ | 正負 | 16進数 |
0000 | 0 | 0 | 0 |
0001 | 1 | 1 | 1 |
0010 | 2 | 2 | 2 |
0011 | 3 | 3 | 3 |
0100 | 4 | 4 | 4 |
0101 | 5 | 5 | 5 |
0110 | 6 | 6 | 6 |
0111 | 7 | 7 | 7 |
1000 | 8 | −8 | 8 |
1001 | 9 | −7 | 9 |
1010 | 10 | −6 | A |
1011 | 11 | −5 | B |
1100 | 12 | −4 | C |
1101 | 13 | −3 | D |
1110 | 14 | −2 | E |
1111 | 15 | −1 | F |
これで正の正数のみを表す場合は、0〜15を表のように割り当てます。
b0〜b3部分はよくみると、普段10進数で数えるときに0→9まで数えると桁上がりするように、0、1ときたらもう桁上がりするというだけで、特に変なルールはありません。単に順番にならんでいるだけです。
最後の16進数というのは、プログラムをつくったりするときに扱いやすくするための数字です。見ての通り、2進数と10進数は桁が多くなってくると直感的には変換できません。一方で、数値を2進数で表記するとなると(機械をいじるソフトをかくとそういうことがあります)、0と1をひたすら羅列するとほぼ間違いなく、数え間違いなどのトラブルがおきます。そこで、2進数と直接変換でき、ある程度人間が見てもわかりやすいものとして16進数が使われています。具体的には、2進数を4桁ごとに区切り、0〜9、A〜Fの16の数と置き換えます。四則演算は頭のなかでやるには困難を極めますが(99ならぬFF?)、表記という点では10進数よりもディジタルよりです。
さて、次に、2進数の演算です。
掛け算例(3×5):
別の見方をすると、
で計算されるとも言えます。
負の数も使いたいときは、0〜7までは同じで、8〜15の部分は正数のときから「16」引きます。別の見方をすると、2進数で最上位のb3が、「負」を表す値になって、ここが「1」のときに、b2〜b0の数値から8を引くようになっています。こう表記すると便利な理由はあとで説明します。
これでおしまいです。10進数に比べてはるかにルールは簡単ですがその分、桁数は多くなります。
0+0=0
0+1=1
1+0=1
1+1=10 (桁上がり)
0×0=0
0×1=0
1×0=0
1×1=1
10進数にくらべて繰上がりが多発します。
基本的に、1を乗じなければ0になるので、積の2行目4行目はなくてもかまいません。また、乗算回路は加算回路(と0と差し換える回路)を並べただけで作れます。
一般に、4桁の数値で加算するという回路を組むと、4桁よりはみ出した部分は無視されます(ので、先ほどの足し算の例は、5桁以上用意しておかないといけない)。これと、先ほどの負数の定義を使用すると、こういう計算になります。逆に、負の数でも問題なく足し算できるように作られたのが、この負数の定義なわけです。
減算=「×(−1)」して加算なので、正負反転があれば減算できます。
負にするには、各ビットをNOTして、全体に1を加えます。
例:5
5=0101→NOT→1010→(+1)→1011→−5
ちなみに、この1を加えるために、減算回路は加算回路が2個必要になりそうですが、加えるのは1だけなので、最下位にも桁上がりの演算を入れておいて、これを加えます。詳しくはいずれ。
以上が2進数の概要です。10進数でも除算はやっかいですが、2進数でもやっかいですので略しますが、乗算が×0×1しかないため、商の数字を確定していく作業は単純に大小比較だけですみます。
ディジタル回路では、上述のように、電圧信号をはっきり区別して使用します。ディジタルICは、そのような特性、すなわち、入力電圧については、どこかに境界をもうけて、その上下で入力が0にあたるか1にあたるかを決定します。また、出力は、なるべく両極端の電圧が出るようにします。
たとえば、
出力0 | ≒0 | ≒VCC(電源電圧) | 出力1 | |||
入力0扱い | 0〜1/2 VCC | 1/2 VCC〜VCC | 入力1扱い |
ブール代数では、0か1かで表しましたが、ディジタルICでは、物理的に電圧が低いか高いかでその値が扱われます。 そのため、ディジタルICそのものの特性を表すために、電圧が低い状態をL、電圧が高い状態をHと表示した真理値表も良く用いられます。以下では、混乱を避けるために、一般的な対応関係であるL=0、H=1でそのまま表記します。 ただし、ものによっては逆にLで1を、Hで0を表すことがありますので注意は必要です。
汎用に使えるディジタルICはいくつかのシリーズがあります。その中の代表的なものを以下にあげます。
基本要素
名称 | ANDゲート | ORゲート | インバータ | ||
記号 | |||||
論理式 | |||||
A | B | A AND B | A OR B | NOT A | |
0 | 0 | 0 | 0 | 1 | |
0 | 1 | 0 | 1 | 1 | |
1 | 0 | 0 | 1 | 0 | |
1 | 1 | 1 | 1 | 0 |
準基本要素
名称 | NANDゲート | NORゲート | バッファ | XORゲート | |
記号 | |||||
論理式 | |||||
A | B | A NAND B | A NOR B | A | A XOR B |
0 | 0 | 1 | 1 | 0 | 0 |
0 | 1 | 1 | 0 | 0 | 1 |
1 | 0 | 1 | 0 | 1 | 1 |
1 | 1 | 0 | 0 | 1 | 0 |
これらが、ディジタル回路での基本的な要素になります。
AND, OR (NAND, NOR)に関しては、3以上の多入力のものがあり、それらは単に入力の本数を増やして右図のように表現します。
まず、NANDの真理値表をあらためて。
A | B | A NAND B |
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
A | B | A NAND B |
0 | 0 | 1 |
1 | 1 | 0 |
真理値表を書くと、
A B /A /B (/A AND /B) /A NAND /B A OR B 0 0 1 1 1 0 0 0 1 1 0 0 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 1
となり、ORと等価になります。これは、論理式で書いても確認できます、
(1回目の等号はド・モルガン)
A B /A /B P Q P NAND Q A XOR B 0 0 1 1 1 1 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 1 0 0 1 1 0 0
※ P= NOT(A・/B), Q= NOT(/A・B)
また、XORの定義から、論理演算でも求められます。出力を"H"になる入力のORでつくります。
あとは、先ほどのORを活用する形で、回路にすると右図になります。
そのほかにも
※ A・/A=0, B・/B=0
と、いろいろに変形でき、それぞれで回路を実際に作ることができます。
それらの違いは、1:ゲート数、種類=コスト、手間 2:ゲートの遅延による動作速度 です。
入力信号が1本以上、出力信号が1本以上あって、その関係を規定して、回路を設計します。
ここでは、例を交えて、比較的簡単な組み合わせ回路見てみましょう。
どこが「ハーフ」かというと、複数桁の演算をするためには、繰上がりの処理もできなければなりません。
これに対して、フルアダーと呼ばれる回路は、入力はA、Bに加えて下からの繰上がり入力Ciの3本になり、
出力はS、繰上がり出力Coとなります。
デコーダは、数値を数ビットの2進数で表しているような状態(コードになった状態)の信号を、たとえば0〜n番の信号のどれかがHになるように分解します。
右図はもっとも単純な部類のデコーダで、通称2to4デコーダなどと呼ばれています(入力2本、出力4本)。
そのほか、デコーダには7segデコーダと呼ばれる品種もあります。これはディジタルの代名詞とも言うべき、「日」型の数値表示をするためのもので、2進数4ビットの信号をいれると、あのランプを駆動するのに適当な信号7本を出力します。
右図のように、デコーダのうしろに、ANDとORからなる回路がついています。
たとえば、A=0, B=0 の場合、先のデコーダ部分の動作としては、X0が1,のこりは0になります。
この逆で、デマルチプレクサと呼ばれる回路もありますが、あまり使われることはありません。
この式の簡単化は直感的には慣れても難儀します。これを図式で簡単にする手段に「カルノー図」という方法があります。
フルアダーの繰り上げ信号Cの真理値表
まず、真理値表から、表を作図します。
つぎに、「1だけからなるなるべく大きな長方形領域」をこの枠に書き入れ、すべての1が囲まれるようにします。
最後に、選んだすべての長方形に対応する論理式を書き並べ、ORします。
例:
このように、カルノー図は勘と経験が必用な論理式の圧縮作業をビジュアルに行うことができる便利な方法です。
ただ、手書きをするには4入力くらいが限度ではないかと思われます。
となります。Sは和、Cは繰上がりを意味します。A B S C 備考 0 0 0 0 0+0=00 0 1 1 0 0+1=01 1 0 1 0 1+0=01 1 1 0 1 1+1=10
これまで出てきた論理素子と照らし合わせると、丁度良く、S=A XOR B、C=A AND B です。
これを回路図で表すと右図のようになります。この回路をハーフアダーと呼びます。
見方を変えると、Sは「A,B,Ciで奇数本が1のとき1」、Coは「同、2本以上が1のとき1」と見ることもできます。Ci A B S Co 備考 0 0 0 0 0 0+0+0=00 0 0 1 1 0 0+0+1=01 0 1 0 1 0 0+1+0=01 0 1 1 0 1 0+1+1=10 1 0 0 1 0 1+0+0=01 1 0 1 0 1 1+0+1=10 1 1 0 0 1 1+1+0=10 1 1 1 1 1 1+1+1=11
これを先ほどのハーフアダーを使って構成した例を右に示します。
1段目:(C1,S1)=A+B
2段目:(C2,S)=S1+Ci
追加:Co=C1 OR C2
となっています。
真理値表で細部を確認します。
XORをこの回路のようにトーナメントのように接続すると、入力全体の「1の数が奇数か」を出力するようになるため、Sの出力に、また、どちらかの演算で繰上がりがでれば、繰上がりという構造になっています。Ci A B S1 C1 S C2 Co 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 1 0 1 1 0 1
という論理式を導き右図のような回路を構成する方法です。先の回路に比較した利点は、数学的に対称的ですっきりしていることに加え、演算速度の向上が期待できることです。複数桁の演算をする場合、回路にCi入力がされて、Coから抜けて、次の段の演算が行われるため、入力→Coが早い方が速度が上がります。前者はA,B入力からはXOR, AND, ORで3段、後者の回路ではANDとORの2段の経路になっているため、後者のほうが速くなると期待されます。
回路がごちゃごちゃしてきてわかりにくくなっていますが、論理式で書くと
となっています。真理値表は、
A B X0 X1 X2 X3 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0 1
(普通のICの説明書では1はH、0はLで記載されています。)
のようになります。つまり、入力A(上位),B(下位)の2桁の2進数と見なして、それに対応するX0〜X3のどれか1本だけが1になります。
たとえば、このあとで出てくる順序回路のカウンタと呼ばれる回路は、一般に2進数でカウントアップしていく回路です。
それを加工して、順序にランプを光らせたりしたいときには、また、順に回路を動かすためのタイミング信号を作りたいときなどは、カウンタにこのデコーダをつなぐことで、順に出力が1になるような信号群を得られます。
また、デコーダは、信号が「有効」のときにHになるもの、と「有効」のときにLになるものがあります。使い道に応じて選定します。
そのあとの4つのANDは、それぞれ、
X0 D0 X0・D0 0 0 0 0 1 0 1 0 0 1 1 1
の動作になりますが、この見方を変えると、
とも見ることができます。
さて、X0〜X3は、A,Bに応じて、1本だけ1になります。ということは、4個のANDの出力は、1本はD?、のこりは0です。
これをORすると、0は関係ないので、D?が出力にでてきます。
たとえば、A=0, B=1の場合、X1のみが1になり、D1が出力にでてきます。
以上をまとめると、
A B X 0 0 D0 0 1 D1 1 0 D2 1 1 D3
となり、いわば、XはD0〜D3をA,Bで選んだ出力になっています。
このような動作をするものを「マルチプレクサ」と呼びます。また、単純にセレクタと呼ぶこともあります。
一番簡単な方法は、デコーダのあとに、必要な信号のみを選んでORする方法です。入力→デコーダで、すべての場合を網羅した信号群が得られます(n入力の場合2のn乗本)。ここから、出力を1にするすべての場合を選ぶわけです。ところがこの方法は必用以上に冗長になる可能性が高く、その結果、複雑でコストがかさみ、動作の遅い回路になりかねません。
そこで、普通は目的の論理式の段階で式を簡単化し、これをもとに回路を設計します。
C A B X 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1
を例題に、カルノー図をつかってみます。
まず、上図左のように枠をつくります。真理値表に似ていますが、左端と上端に入力をならべ、かつ、左端のように二つの変数を並べる場合、一般的な真理値表とは場合の順番が異なります。
ここに、真理値表や、論理式で定義された論理を01で書き込んでいきます(上図右)。
重要な点は、「1だけの領域」「なるべく大きく」「長方形」「複数の長方形ですべてをカバー」、加えて「長方形同士は重なってもよし」です。さらに、この長方形にはルールがあります。
基本的に、
に示す2×2、4×1、1×2長方形、もしくは、1×1のみを使用します。
囲んだ領域はそれぞれ、AB, AC, BC の領域です。なので、今回の題材を式に表すと、
X=AB+AC+AB
になります。
RSFFは/S, /R, Q, /Q端子と名前がついていますが、見て分かるように対称です。
それぞれのNANDゲートに注目すると、NANDは2入力ともHなら出力はL、どちらかがLなら出力はHになります。
その性質を考慮すると、/SをLにするとQがHに、/RをLにすると/QがHになります。
(出力を「H」にするために、「L」にしなければならない入力なので「/」をつける)
さて、/S, /R両者ともにHの場合です。
仮にQがHだったとします。下のNANDはH-Hが入力されるため、出力はL、/QはLになります。これが上のNANDに入力されるため、上のNANDはH-Lが入力されるため、NAND出力であるQはHになります。これは最初の仮定と同じであるため、この状態を保つことがわかります。
同じようにすると、/S=/R=Hのときは、直前のQ, /Qを保存することがわかります。
基本的に、/Sもしくは/RをLにすると、QがHもしくはLに設定されます。そのため、「セットしたりリセットする」フリップフロップの基礎です。なお、両方同時にLにした場合、どちらを先にHに戻したかで決まります。
RS-FFの派生品はいろいろありますが、もっとも重要な物を次で触れます。
この図では右方向が時間が進む方向、上下にディジタル信号のH/L、1/0をとります。つまり、信号の時間変化をグラフにしたものです。
D-FFは、覚えるべき入力は一本ですが、CLKという端子の信号がLからHになった瞬間(「立ち上がり」といいます)のDの状態を次の立ち上がりまで覚え続けます。
D-FFはよく使うため、専用のシンボルが用意されています。それが右図です。「>」記号の端子はCLKであると決められているため、敢えてCLKと書くことはほとんどありません。CLK端子、D,Qの3本です。
このDFFは信号一本をCLKのタイミングで覚えるという特性のため、最近のディジタル回路でよく使われるようになってきました。
なお、実際のICなどの種類にもよりますが、ほぼ同時にCLKが立ち上がり、Dが変化した場合は、立ち上がり直前のDの値を取り込むことが一般的です。
縦線を引いたところは、CLKのち上がりです。
CLKとCLKの合間にはどれだけ変化しても、CLK立ち上がりの瞬間できまります。
カウンタはDFF群と、「+1」する回路で構成されます。ある時点で、全ビットで「n」を表していた場合、+1回路の出力は「n+1」になっています。ここで、CLKがくると、DFF群が「n+1」を覚えます。これを繰り返すとカウントアップしていきます。
実用的なIC、回路では、この他に値を0にするクリア、またある値に設定できるプリセット、などいろいろ機能が普通はついています。
なお、「+1」回路はちゃんとした加算機ではなく、より単純なロジック回路で構成可能です。
最近のパソコンまわりの通信手段はこのような信号の送り方が主流です。