最終更新日:2017年10月03日
現在のコンピュータの中心部分はデジタル電子回路によって構成されており、そのデジタル電子回路の基本は論理回路である。
論理回路には、大きく分けて組み合わせ論理回路と順序論理回路がある。
組み合わせ論理回路とは、フィードバックを含まない論理回路のことであり、主に論理演算や算術演算などの演算回路、エンコーダ・デコーダ回路、マルチプレクサ・デマルチプレクサ回路などが挙げられる。
順序路理解路とはフィードバックを含んだ論理回路のことで、記憶を伴った回路、すなわちラッチやフリップフロップなどがある。
このテーマでは、上記の2種類の論理回路をマルチシムを使って構成し、シミュレーションを実行することで、その動作の仕組みを理解することを目的とする。
この実験は個人で行う。
電算機演習室のPCを使用してマルチシムを起動し、その上に回路を組んでシミュレーションを行うこと。
論理回路とはBOOL代数を電子的な回路で表現したものであり、一般には電圧が高い(H)状態を1、電圧が低い(L)状態を0として扱う。このような1に着目した論理を正論理と呼ぶ。逆に0に着目すると負論理と呼ばれるが、ここでは正論理で考えることにする。
論理回路を構成する基本的な論理素子は以下の4つである。Xは入力、Yは出力である。
論理否定(NOT)
X Y 0 1 1 0 論理積(AND)
X1 X2 Y 0 0 0 1 0 0 0 1 0 1 1 1 論理和(OR)
X1 X2 Y 0 0 0 1 0 1 0 1 1 1 1 1 排他的論理和(XOR)
X1 X2 Y 0 0 0 1 0 1 0 1 1 1 1 0
これらを組み合わせることで、さまざまな目的に沿った回路を作成することができる。
また、以下の論理素子も基本的である。
否定論理積(NAND)
X1 X2 Y 0 0 1 1 0 1 0 1 1 1 1 0 否定論理和(NOR)
X1 X2 Y 0 0 1 1 0 0 0 1 0 1 1 0
これらの素子はそれぞれ、論理積の否定、論理和の否定を取ったものであり、それだけで素演算系を構成する。つまり、NANDゲートだけあれば、残りのすべての論理を構成することが可能である。
CMOSなどのトランジスタを用いて論理素子を構成する場合、ANDやORよりもNANDやNORの方が構成しやすい。このため、実際の回路構成にはANDやORよりNANDやNORを使うことが多い。
順序論理回路の代表的な例として、加算器を取り上げる。
加算器とは足し算を行う論理回路である。論理回路においては、0と1だけを扱うため、数値は2進数として表現すると考えやすい。
まずは最も基本的な1ビットの2進数の足し算を考えてみる。これは次のようになる。
0 + 0 = 00
0 + 1 = 01
1 + 0 = 01
1 + 1 = 10
1+1は2であるが、2進数で表すと10である。
これを真理値表の形で表してみよう。2つの1ビットの2進数a0とb0があり、その和をs、桁上がりをcとすると、次のようになる。
a0 b0 s c 0 0 0 0 1 0 1 0 0 1 1 0 1 1 0 1
入力が a0 と b0 で、出力が s と c である。
この出力を前節の基本回路素子と見比べてみると、s は a0,b0 の XOR であり、c は AND であることがわかる。
したがって、この足し算を行う論理回路は次のようになる。
この回路は、前の桁からの桁上がりを考慮していないことから、半加算器(Half Adder)と呼ばれる。
実際の足し算は1桁どうしを足すのではなく、もっと多くの桁からなる数字を足し合わせる。このためには、1つ前の桁からの桁上がりを考慮した加算器が必要となる。
たとえば、2つの2進数、0111 と 0101 を足す場合、下位の桁から順番に、
1 + 1 = 10 → 1繰り上がって、
1 + 0 + 1 = 10 → 1繰り上がって、
1 + 1 + 1 = 11 → 1繰り上がって、
0 + 0 + 1 = 01
となり、答えは 1100 である。10進数を( )内に併記すると、
0111 (7) + 0101 (5) = 1100 (12)
ということである。
一般的に、2つの n ビットの2進数 A,B があり、それぞれ次のように表されているものとする。
A = an-1 an-2 ・・・ a3 a2 a1 a0
B = bn-1 bn-2 ・・・ b3 b2 b1 b0
第 i ビットの2つのビット ai と bi とを足し算するときは、その桁への桁上がり ci を考慮して、次のような真理値表で計算しなければならない。
ai bi ci si ci+1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 1 1 1
この真理値表を見ると、si は ci が0のときは ai と bi とのXORであり、ci が1のときは ai と bi のXORの否定である。1とXORを取ると論理が反転するということに着目すると、
si = ai ^ bi ^ ci
であることがわかる。( ^ はXORを表す)
また、ci+1は ai,bi,ci の3つのうちどれか2つが1のときに1になっているから、
ci+1 = aibi + bici + ciai
であることがわかる。
下の図は、半加算器の実験を行うための回路である。この回路はMultiSimで以下のようにして作成した。
- 論理素子はTTLグループの74LSファミリから、XORゲートとして 74LS86N を、ANDゲートとして 74LS08N を用いる。
- 電源はSourcesグループのPOWER_SOURCESファミリから、VCCとGROUNDを用いる。VCCの電圧は5Vとする。
- 入力はBasicグループのSWITCHファミリから、DIPSW1を2個用いる。右クリックして回転させ、ダブルクリックしてスイッチキーをAとBにする。
- スイッチのプルアップ抵抗はBasicグループのRESISTORファミリから、10kを2個用いる。右クリックして回転する。
- インジケータはIndicatorsグループのPROBEファミリから、PROBE_REDを4個用いる。2個はそのまま、残りの2個は右クリックして右回転する。さらに、各プローブのラベルをダブルクリックして変更する。
これを参考にして、以下の実験を行いなさい。
1ビットの全加算器を4つつなぎ合わせると、4ビットの加算器を作ることできる。
ここでは、1ビット全加算器を階層ブロックとして使用して、4ビットの全加算器を作成することにする。
MultiSimでは、回路に端子をつけて保存することで、その回路を1つのブロックとして別な回路の中で使用することができる。これを階層ブロックと呼ぶ。
たとえば、実験1で作成した半加算器を half-adder という階層ブロックとして使うには次のようにする。
以上で階層ブロックは出来上がりである。
このようにして保存した階層ブロックは、別な回路の中で使用することができる。
このように、階層ブロックを使用すれば、複雑な回路をまとめて1つの部品として扱うことができるので、大変便利である。
新しい回路を作成し、そこに1ビット全加算器を構成して階層ブロックとして保存せよ。
ただし、以下のことを守ること。
上記で作成した1ビット全加算器の階層ブロックを使用して、4ビットの全加算器を以下のように構成することができる。
2個目以降の階層ブロックの配置時に以下のようなメッセージが出るが、そのままOKを押す。
コンピュータが実行されているとき、さまざまなデータを記憶している。
実行中の多くのデータやプログラムはメモリと呼ばれる記憶装置に記憶されるが、さらに高速にアクセスする必要がある場合、レジスタという記憶装置が使われる。レジスタは論理回路で構成され、メモリよりもさらに高速なアクセスが可能な記憶装置である。
このレジスタを構成しているのが順序論理回路である。
記憶を伴う論理回路である順序論理回路の最も代表的な回路はRSラッチであろう。
次の回路はNANDゲート 74LS00N を2つ使用したRSラッチである。
このラッチは1ビットの情報を記憶しておくことができる。
実験で試してみよう。
RSラッチは情報を記憶しておくことができるが、Sキーが閉じられている間はずっと 1 を記憶し続けるため、ある瞬間のデータを記憶する、という目的には使いづらい。
クロックに同期してデータを記憶するための部品として、エッジトリガ型のFFやマスタースレーブ型のFFが多く用いられる。
ここでは、エッジトリガ型のD-FFについて説明する。
D-FFは次の図のような記号で表され、クロック入力 CLK の立ち上がりエッジでデータ入力 D の信号を出力 Q に記憶する。
プリセット入力 PR とクリア入力 CLR は Q を1または0に強制的に設定するための信号であり、両方とも 0 のときに働く。
D-FFの動作を確認するために以下の実験を行いなさい。
クロックパルスの立ち上がり(または立ち下がり)ごとに状態が反転するFFをT-FFと呼ぶ。
T-FFはD-FFの Q 出力を D 入力に戻すことで作成することができる。
この回路は、自分自身の反転出力を次の時刻入力としているので、クロックパルスが入るごとに状態が反転する。
クロックパルスとして加わったパルス数をカウントする回路をバイナリカウンタと呼ぶ。
バイナリカウンタは、T-FFを必要な数だけ直列に接続して構成することができる。
D-FFを直列に並べて接続するとシフトレジスタと呼ばれる回路になる。
ここでは、8ビットのシフトレジスタを用いて簡単な電子ルーレットを作成する。
なお、実験4はオプショナルである。余力と興味がある人は、取り組んでもらいたい。
1つのD-FFは1ビットの情報を記憶しておくことができる。
したがって、D-FFをいくつか使うと、複数ビットのデータを記憶できる。
たとえば、次のようにD-FFを並列に4つ並べると、4ビットの情報を記憶できる回路となる。
この回路は、CLK信号の立ち上がりで、In0〜In3の4ビットのデータを記憶し、Out0〜Out3に出力する。次のクロックの立ち上がりまでは、入力信号が変化しても出力は変化しない。
このような記憶回路は、コンピュータの内部で計算結果を一時的に記憶する目的で多く使われており、レジスタと呼ばれる。
レジスタは、メモリよりもさらに高速な記憶装置であるが、一般に容量は小さい。
8ビットCPUには8ビットレジスタが、16ビットCPUには16ビットレジスタが、そして32ビットCPUには32ビットレジスタが使われる。
いくつかのD-FFを直列に並べて、一つ前の出力 Q を次の入力 D に接続し、すべてのD-FFに同じクロックパルスを入れた回路をシフトレジスタと呼ぶ。
下の回路は、4ビットのシフトレジスタである。
入力信号 D として与えたデータが、クロックパルスが入るごとに右のD-FFへとシフトして伝わっていくことからこの名がある。
TTL-ICの74LS164は、内部に8ビットのシフトレジスタを持っている。
入力信号 A と B のANDを取ったデータが入力としてシフトレジスタに入る。
CLR信号が0のとき、すべての出力は0にリセットされる。
CLK信号の立ち上がりのタイミングで、出力 QA〜QH が順番にシフトしていく。
t A B CLR CLK QA QB QC QD QE QF QG QH 0 - - 0 - 0 0 0 0 0 0 0 0 1 1 1 1 ↑ 1 0 0 0 0 0 0 0 2 0 0 1 ↑ 0 1 0 0 0 0 0 0 3 0 0 1 ↑ 0 0 1 0 0 0 0 0 4 1 1 1 ↑ 1 0 0 1 0 0 0 0 5 1 1 1 ↑ 1 1 0 0 1 0 0 0 6 0 0 1 ↑ 0 1 1 0 0 1 0 0 7 1 1 1 ↑ 1 0 1 1 0 0 1 0 8 1 1 1 ↑ 1 1 0 1 1 0 0 1 9 0 0 1 ↑ 0 1 1 0 1 1 0 0
このように、クロックの立ち上がりのタイミングに合わせて、QA から順番にデータが1つずつずれていく。
シフトレジスタを用いてルーレットを作る場合、8つの出力のうちある時点で1はひとつだけである必要がある。
さらに、QHまで1が移動したら、次はQAに1が戻ってくる必要がある。
このような動作を行うためには、シフトレジスタに次のような回路を追加する。
NORゲートは、入力がすべて0の場合のみ1を出力し、それ以外のときは0を出力する。
したがって、上のように回路を構成すれば、QA〜QG の7つの出力が全部0であれば、入力 B に1が入る。入力 A は常に1になっているから、QA〜QGが全部0のとき、次のクロックの立ち上がりで QA に1が取り込まれる。
この結果、QH=1 の次は QA=1 となり、常に1がひとつだけ存在し、かつ、QHの次はQAにつながることになる。
以下の課題をレポートに解け。