ディジタルというと思い浮かべるものはなんでしょうか。
よく、アナログとディジタルは比較されます。
だいたい、これまでは身の回りで「ディジタル」と名前につくものは、数字、しかも「日」な数字が表示される物と相場が決まっていましたが、最近はもうすこし本来のディジタルの意味が見えるようになってきて、DVDの一個がディジタルだというのも知られていると思います。
(DVD=Digital Versatile Disk , versatile=多芸、Digital Video Disk ではありません<多分最初はそういう発想だったんじゃないかと)
昔は、音を記録するのも映像を記録するのもアナログでしたが、いまどきはディジタルです。音声や映像信号そのものはいまでもアナログなことが多いのですが、徐々に再生に関しては完全にディジタル処理だけというシステムが出始めています。
では、なぜ、ディジタルがどんどん増えてきているのでしょう。アナログに対して優位性があるからとは思えます。
以下、思い当たる比較をします。
比較対象 | アナログ | ディジタル |
値の扱い | 電圧や電流の連続的な大小をそのまま信号の値として考える。 | 電圧や電流をオン/オフ、十分大きい/十分小さいと極端に違う状態でつかい、信号は2種類しか考えない。値の種類を多くする場合は信号線を複数本にする。 |
信号の扱いやすさ | 線一本で値が伝わるため、配線は少ない。しかし、途中の部品の精度、信号へのノイズなどの影響を直接受け、精度の低下要因がいろいろある。 | 値の種類に応じて、線が多くなる。たとえば、0〜5万程度の整数値を扱う場合は最低16本必要。しかし、信号の電圧が極端であるため、多少の回路の誤差の影響は受けず、またノイズなどの影響も受けにくい。そのため、値の精度は原則として低下しない。 |
回路の作りやすさ | 配線本数はすくない。しかし、設計や作り手の腕で回路の性能が変わる。 | 配線本数は非常に多くなりやすい。しかし、普通は正しく配線すれば「だれがつくっても動く」回路ができる。 |
※ディジタルで、線一本で、時間方向に送る信号を高速で切り替えて、線一本で多くの情報をおくる「シリアル」という方式があります。線をたくさん使う方法は「パラレル」。パソコンでは、通信端子の多くはシリアル方式、プリンタ接続用のコネクタ、内部に増設するボード、ハードディスク、メモリなどはパラレル(最近シリアル化が進みつつある)。
ディジタル回路は配線こそ多くなりますが、なれれば単純な物で、失敗もしにくいため、それほど難しくありません。また、いまどきは電気製品でコンピュータを積まない物は少なくなってきていますが、コンピュータはディジタル回路の固まりです。そんなわけで、ここではディジタル回路について学びます。
ちなみに、針が回る時計、よく見ると、秒針は1秒ごとか、4分の1秒ごととかで進んでいます。あれ、アナログ時計と称しますけど、中は普通はディジタル回路でできています。
なお、Digital の表記として、よく使われるのは「デジタル」ですが、専門的には普通な原音に近い「ディジタル」をここでは使用します。
ディジタル回路は線一本について、オンかオフか、電圧が高いか低いか、といった2種類の値のみをつかいます。
この値をこれから1と0で表します。ちなみに、オン=1とは決まっていません。どちらが1でどちらが0かは、回路を設計するときに、最初に決めます。
なお、ディジタル回路を構成するディジタルICの特性は、電圧の高低である、HとLで表します。
この1と0を取り扱うとき、ブール代数というものを使います。日常的に数学では四則演算が定義され、それに基づいて様々な演算が行われますが、ブール代数は「0と1しかない」ことを前提とした数学です。逆に、このブール代数(論理数学)を満たすようにディジタル回路の構成要素が組み立てられるため、「ロジック回路」と呼ばれることもあります。
この数学は「0と1」しかないのですごく簡単です。以下、見てみましょう。
四則演算に加減乗除があるように、ブール代数にも基本となる演算があります。 ともに成立すると成立する「かつ」にあたる論理積AND、一方が成立すれば成立となる「もしくは」にあたる論理和OR、成立と不成立をひっくりかえず「ではない」にあたるNOTが基本になります。
それぞれ、以下のように定義されています。
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つの状態しか表せないため、場合の数が多いとき、また数値を表すときには、そのままでは使えません。そこで、線を束にして使います。たとえば、線を4本用意すると2×2×2×2=16通りの状態を表すことができます。
これを数値として使う場合には、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ときたらもう桁上がりするというだけで、特に変なルールはありません。単に順番にならんでいるだけです。
別の見方をすると、
で計算されるとも言えます。
負の数も使いたいときは、0〜7までは同じで、8〜15の部分は正数のときから「16」引きます。別の見方をすると、2進数で最上位のb3が、「負」を表す値になって、ここが「1」のときに、b2〜b0の数値から8を引くようになっています。こう表記すると便利な理由はあとで説明します。
最後の16進数というのは、プログラムをつくったりするときに扱いやすくするための数字です。見ての通り、2進数と10進数は桁が多くなってくると直感的には変換できません。一方で、数値を2進数で表記するとなると(機械をいじるソフトをかくとそういうことがあります)、0と1をひたすら羅列するとほぼ間違いなく、数え間違いなどのトラブルがおきます。そこで、2進数と直接変換でき、ある程度人間が見てもわかりやすいものとして16進数が使われています。具体的には、2進数を4桁ごとに区切り、0〜9、A〜Fの16の数と置き換えます。四則演算は頭のなかでやるには困難を極めますが(99ならぬFF?)、表記という点では10進数よりもディジタルよりです。
さて、次に、2進数の演算です。
掛け算例(3×5):
基本的に、1を乗じなければ0になるので、積の2行目4行目はなくてもかまいません。また、乗算回路は加算回路(と0と差し換える回路)を並べただけで作れます。
ディジタルICは、ディジタル回路を作るために使用するICの総称です。その種類は無数にあり、CPUなどもディジタルICの一種です。 その中でも、ここではごく小規模で汎用のものを扱います。
ディジタル回路では、上述のように、電圧信号をはっきり区別して使用します。ディジタル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はいくつかのシリーズがあります。その中の代表的なものを以下にあげます。
汎用ディジタル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以上の多入力のものがあり、それらは単に入力の本数を増やして右図のように表現します。
ブール代数のところでは、AND, OR, NOT ですべてが表現できるといい、上では、AND, OR, NOTに加えて、NAND, NOR, NOT, XORのゲートを追加しました。実は、この中で、NAND(NOR, XORもですが)だけがあれば、すべてがつくれます。
まず、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 |
次に右図のように NANDゲート三個をつなぎます。左2個はいまのNOT相当です。
真理値表を書くと、
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 |
最後にXORをつくってみます。まずは天下り式に右図。
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 |
何本かある入力を決めたら、一意に出力がきまる回路を組合わせ回路といいます。
それに対して、直前までの動作の履歴が影響するものを順序回路といいます。
ここでは先に順序回路の代表例をみて、その後組合わせ回路をみます。
入力信号が1本以上、出力信号が1本以上あって、その関係を規定して、回路を設計します。 ここでは、例を交えて、比較的簡単な組み合わせ回路見てみましょう。
2進数の加算回路を考えます。
一桁分の加算回路をつくって、これをつないで複数桁の回路を構成してみます。
まず、2進数の一桁通し、AとBの計算を考えると、
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 |
どこが「ハーフ」かというと、複数桁の演算をするためには、繰上がりの処理もできなければなりません。 これに対して、フルアダーと呼ばれる回路は、入力はA、Bに加えて下からの繰上がり入力Ciの3本になり、 出力はS、繰上がり出力Coとなります。
真理値表は次のようになります。
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 |
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段の経路になっているため、後者のほうが速くなると期待されます。
汎用のTTLやCMOSロジックICの類は、基本的なロジックゲート、組み合わせ回路、順序回路のいろいろな物がシリーズになっています。上記の加算回路は算術演算系のもので、加算回路の他に小規模ですが乗算回路もあります。
そのほかに、一致検出回路や大小比較回路(8ビットと8ビットの一致、大小など)などもあります。
こういった組み合わせ回路のなかでラインナップが多いものに、デコーダとよばれるグループがあります。
デコーダは、数値を数ビットの2進数で表しているような状態(コードになった状態)の信号を、たとえば0〜n番の信号のどれかがHになるように分解します。
右図はもっとも単純な部類のデコーダで、通称2to4デコーダなどと呼ばれています(入力2本、出力4本)。
回路がごちゃごちゃしてきてわかりにくくなっていますが、論理式で書くと
となっています。真理値表は、
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 |
そのほか、デコーダには7segデコーダと呼ばれる品種もあります。これはディジタルの代名詞とも言うべき、「日」型の数値表示をするためのもので、2進数4ビットの信号をいれると、あのランプを駆動するのに適当な信号7本を出力します。
また、デコーダは、信号が「有効」のときにHになるもの、と「有効」のときにLになるものがあります。使い道に応じて選定します。
このデコーダを応用した回路に、マルチプレクサ(セレクタ)と呼ばれる回路があります。
右図のように、デコーダのうしろに、ANDとORからなる回路がついています。
たとえば、A=0, B=0 の場合、先のデコーダ部分の動作としては、X0が1,のこりは0になります。
そのあとの4つのANDは、それぞれ、
X0 | D0 | X0・D0 | |
0 | 0 | 0 | |
0 | 1 | 0 | |
1 | 0 | 0 | |
1 | 1 | 1 |
A | B | X | |
0 | 0 | D0 | |
0 | 1 | D1 | |
1 | 0 | D2 | |
1 | 1 | D3 |
この逆で、デマルチプレクサと呼ばれる回路もありますが、あまり使われることはありません。
特殊なデコーダを作る場合など、組み合わせ回路を設計する際に、複雑な論理式から回路を起こすことは容易ではありません。
一番簡単な方法は、デコーダのあとに、必要な信号のみを選んでORする方法です。入力→デコーダで、すべての場合を網羅した信号群が得られます(n入力の場合2のn乗本)。ここから、出力を1にするすべての場合を選ぶわけです。ところがこの方法は必用以上に冗長になる可能性が高く、その結果、複雑でコストがかさみ、動作の遅い回路になりかねません。
そこで、普通は目的の論理式の段階で式を簡単化し、これをもとに回路を設計します。
この式の簡単化は直感的には慣れても難儀します。これを図式で簡単にする手段に「カルノー図」という方法があります。
フルアダーの繰り上げ信号Cの真理値表
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だけからなるなるべく大きな長方形領域」をこの枠に書き入れ、すべての1が囲まれるようにします。
重要な点は、「1だけの領域」「なるべく大きく」「長方形」「複数の長方形ですべてをカバー」、加えて「長方形同士は重なってもよし」です。さらに、この長方形にはルールがあります。
基本的に、
に示す2×2、4×1、1×2長方形、もしくは、1×1のみを使用します。
最後に、選んだすべての長方形に対応する論理式を書き並べ、ORします。
例:
囲んだ領域はそれぞれ、AB, AC, BC の領域です。なので、今回の題材を式に表すと、
X=AB+AC+AB
になります。
このように、カルノー図は勘と経験が必用な論理式の圧縮作業をビジュアルに行うことができる便利な方法です。
ただ、手書きをするには4入力くらいが限度ではないかと思われます。
組み合わせ回路は入力が決定すれば、出力はその場で決まりますが、回路によっては、直前の影響をうけたり、最後の操作を覚える物があります。こういった回路を順序回路と呼び、「フリップフロップ」(FF)と呼ばれる回路がその代表です。
もっとも単純な順序回路の一つが、右図に示すRSFFです。「リセットセットフリップフロップ」の略です。
この回路は、入力の最後の操作を記憶します。
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を保存することがわかります。
組み合わせ回路は入力だけできまるため、真理値表だけでその動作が記述できましたが、順序回路はそれまでの動作の履歴も関係するため、タイミングチャート(タイミングダイアグラム、タイムチャート)と呼ばれる図も使用します。
この図では右方向が時間が進む方向、上下にディジタル信号のH/L、1/0をとります。つまり、信号の時間変化をグラフにしたものです。
基本的に、/Sもしくは/RをLにすると、QがHもしくはLに設定されます。そのため、「セットしたりリセットする」フリップフロップの基礎です。なお、両方同時にLにした場合、どちらを先にHに戻したかで決まります。
RS-FFの派生品はいろいろありますが、もっとも重要な物を次で触れます。
RS-FFにいろいろと手を加えて作られる物にDフリップフロップがあります。
D-FFは、覚えるべき入力は一本ですが、CLKという端子の信号がLからHになった瞬間(「立ち上がり」といいます)のDの状態を次の立ち上がりまで覚え続けます。
D-FFはよく使うため、専用のシンボルが用意されています。それが右図です。「>」記号の端子はCLKであると決められているため、敢えてCLKと書くことはほとんどありません。CLK端子、D,Qの3本です。
タイミングチャートは右図のようになります。
縦線を引いたところは、CLKのち上がりです。
CLKとCLKの合間にはどれだけ変化しても、CLK立ち上がりの瞬間できまります。
このDFFは信号一本をCLKのタイミングで覚えるという特性のため、最近のディジタル回路でよく使われるようになってきました。
なお、実際のICなどの種類にもよりますが、ほぼ同時にCLKが立ち上がり、Dが変化した場合は、立ち上がり直前のDの値を取り込むことが一般的です。
さきほどのDFFを並べると、並べたビット数の記憶回路になります。
これに演算回路を組み合わせると、いろいろな回路が作れます。その代表例がカウンタです。
カウンタはDFF群と、「+1」する回路で構成されます。ある時点で、全ビットで「n」を表していた場合、+1回路の出力は「n+1」になっています。ここで、CLKがくると、DFF群が「n+1」を覚えます。これを繰り返すとカウントアップしていきます。
タイミングチャートはシンプルで、CLKの立ち上がり毎に値が増えます。
実用的なIC、回路では、この他に値を0にするクリア、またある値に設定できるプリセット、などいろいろ機能が普通はついています。
なお、「+1」回路はちゃんとした加算機ではなく、より単純なロジック回路で構成可能です。
同じく、DFFの応用回路で有名な物にシフトレジスタがあります。右図に示すようにDFFを直列につなぎます。
このとき、タイミングチャートに示すように、Q0〜Q3は初段の入力SIを順次送っていくような動作がになります。
多くの情報を送る場合、一つの方法は線をたくさん並べることですが、時間方向に詰める方法もあり、このシフトレジスタで、時間毎に送られてきた情報をばらばらにすることもできます。
逆に、複数の入力の信号を、直列にするためのシフトレジスタもあります。LD端子がHの場合に、DFFは外部からの入力を取り込みます。LD=Lならば、直前のDFFの出力を送ります。
最近のパソコンまわりの通信手段はこのような信号の送り方が主流です。