情報生体システム工学実験II

ディジタル電子回路・論理回路のマルチシム

最終更新日:2017年10月03日

目次

  1. 目的
  2. 実験方法
  3. 論理回路について
  4. 実験1  〜1ビット全加算器〜
  5. 実験2  〜4ビット全加算器〜
  6. 実験3  〜記憶を伴う回路〜
  7. 実験4  〜電子ルーレット(optional)〜
  8. レポート課題

レポート提出先(学科Moodle)

情報生体システム工学実験IIのページへ


目的

現在のコンピュータの中心部分はデジタル電子回路によって構成されており、そのデジタル電子回路の基本は論理回路である。

論理回路には、大きく分けて組み合わせ論理回路と順序論理回路がある。

組み合わせ論理回路とは、フィードバックを含まない論理回路のことであり、主に論理演算や算術演算などの演算回路、エンコーダ・デコーダ回路、マルチプレクサ・デマルチプレクサ回路などが挙げられる。

順序路理解路とはフィードバックを含んだ論理回路のことで、記憶を伴った回路、すなわちラッチやフリップフロップなどがある。

このテーマでは、上記の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を使うことが多い。

実験1  〜1ビット全加算器〜

順序論理回路の代表的な例として、加算器を取り上げる。

加算器とは足し算を行う論理回路である。論理回路においては、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

であることがわかる。

実験1

下の図は、半加算器の実験を行うための回路である。この回路はMultiSimで以下のようにして作成した。

  1. 論理素子はTTLグループの74LSファミリから、XORゲートとして 74LS86N を、ANDゲートとして 74LS08N を用いる。
  2. 電源はSourcesグループのPOWER_SOURCESファミリから、VCCとGROUNDを用いる。VCCの電圧は5Vとする。
  3. 入力はBasicグループのSWITCHファミリから、DIPSW1を2個用いる。右クリックして回転させ、ダブルクリックしてスイッチキーをAとBにする。
  4. スイッチのプルアップ抵抗はBasicグループのRESISTORファミリから、10kを2個用いる。右クリックして回転する。
  5. インジケータはIndicatorsグループのPROBEファミリから、PROBE_REDを4個用いる。2個はそのまま、残りの2個は右クリックして右回転する。さらに、各プローブのラベルをダブルクリックして変更する。

これを参考にして、以下の実験を行いなさい。

  1. 全加算器の回路図を上の論理式を用いて、手書きで作成せよ。レポートを作成する場合、撮った写真のイメージかスキャンして回路図をWordに貼り付けること。
  2. 全加算器の回路をMultiSimで組み、上に示した真理値表の8通りの出力が正しく出ることを確認せよ。 ただし、3入力のORゲートはないので、3入力のNOR(74LS27N)とNOT(74LS04N)を組み合わせて使用せよ。
  3. 8つの組み合わせのすべてについてレポートに画像を貼り付けて示すこと。

実験2  〜4ビット全加算器〜

1ビットの全加算器を4つつなぎ合わせると、4ビットの加算器を作ることできる。

ここでは、1ビット全加算器を階層ブロックとして使用して、4ビットの全加算器を作成することにする。

回路の階層ブロック化

MultiSimでは、回路に端子をつけて保存することで、その回路を1つのブロックとして別な回路の中で使用することができる。これを階層ブロックと呼ぶ。

たとえば、実験1で作成した半加算器を half-adder という階層ブロックとして使うには次のようにする。

  1. 新しい回路を開き、半加算器を構成する。配線を途中で切るにはダブルクリックする。
  2. 左右の空いた配線の端に、「配置」→「コネクタ」→「HB/SCコネクタ」を接続する。右側の端子は右クリックして「左右反転」してから接続する。
  3. 端子をダブルクリックし、名前を "a0" , "b0" , "s" , "c" に変更する。
  4. 「ファイル」→「別名で保存」を選び、"half-adder.ms12" というファイル名で保存する。保存場所はZ:ドライブの適当な場所を準備すること。

以上で階層ブロックは出来上がりである。

階層ブロックの利用

このようにして保存した階層ブロックは、別な回路の中で使用することができる。

  1. 新しい回路を開き、「配置」→「ファイルの保存済みの階層ブロック」を選ぶ。
  2. 保存した階層ブロックのファイルを選択し、「開く」をクリックする。
  3. 下のように、マウスカーソルにくっついて回路ブロックが現れる。
  4. 適当な場所でクリックすると、階層ブロックが配置される。
  5. 端子に必要な回路を付加する。

このように、階層ブロックを使用すれば、複雑な回路をまとめて1つの部品として扱うことができるので、大変便利である。

実験2-1

新しい回路を作成し、そこに1ビット全加算器を構成して階層ブロックとして保存せよ。

ただし、以下のことを守ること。

  1. 入力端子は "a" , "b" , "ci" の3つとすること。
  2. 出力端子は和が "s" で桁上がりが "co" とすること。
  3. ファイル名は "full-adder.ms12" とすること。

4ビット全加算器の構成

上記で作成した1ビット全加算器の階層ブロックを使用して、4ビットの全加算器を以下のように構成することができる。

2個目以降の階層ブロックの配置時に以下のようなメッセージが出るが、そのままOKを押す。

実験2-2

  1. 1ビット全加算器の階層ブロックを用いて次のような回路を組みなさい。
    1. プルアップ抵抗は、BasicグループのRPACKファミリの4Line_Bussedを2個用いる。抵抗値は10kに変更すること。
    2. スイッチは、BasicグループのSWITCHファミリのDSWPK_4を2個用いる。
  2. 10通りの4ビット数値の足し算を行い、それが正しく行われていることを確認せよ。そのうち3通りについて、レポートに画像を貼り付けて結果を示せ。

実験3  〜記憶を伴う回路〜

コンピュータが実行されているとき、さまざまなデータを記憶している。

実行中の多くのデータやプログラムはメモリと呼ばれる記憶装置に記憶されるが、さらに高速にアクセスする必要がある場合、レジスタという記憶装置が使われる。レジスタは論理回路で構成され、メモリよりもさらに高速なアクセスが可能な記憶装置である。

このレジスタを構成しているのが順序論理回路である。

RSラッチ

記憶を伴う論理回路である順序論理回路の最も代表的な回路はRSラッチであろう。

次の回路はNANDゲート 74LS00N を2つ使用したRSラッチである。

このラッチは1ビットの情報を記憶しておくことができる。

実験で試してみよう。

実験3-1

  1. 以下回路を組みなさい。
    1. シミュレーションを開始すると、出力のインジケータが点滅を繰り返すが、どちらかのスイッチをオンにすると止まる。
    2. セットボタン(Sキー)を閉じて開くと Q が点灯する。これは 1 を記憶した、ということ。
    3. リセットボタン(Rキー)を閉じて開くと Q が消灯する。これは 0 を記憶した、ということ。
    4. 両方のスイッチが開いているときは記憶状態であり、前の操作の結果を覚えている。
    5. 両方のスイッチが閉じている状態は禁止状態。RSラッチでは、このような状態で使ってはいけない。
  2. 回路の動作が上記のようになることを確認せよ。
  3. 1を記憶した状態、0を記憶した状態、禁止状態の3つの状態の回路を、レポートに添付せよ。

D-FF (Dフリップフロップ)

RSラッチは情報を記憶しておくことができるが、Sキーが閉じられている間はずっと 1 を記憶し続けるため、ある瞬間のデータを記憶する、という目的には使いづらい。

クロックに同期してデータを記憶するための部品として、エッジトリガ型のFFやマスタースレーブ型のFFが多く用いられる。

ここでは、エッジトリガ型のD-FFについて説明する。

D-FFは次の図のような記号で表され、クロック入力 CLK の立ち上がりエッジでデータ入力 D の信号を出力 Q に記憶する。

プリセット入力 PR とクリア入力 CLR は Q を1または0に強制的に設定するための信号であり、両方とも 0 のときに働く。

実験3-2

D-FFの動作を確認するために以下の実験を行いなさい。

  1. 次の回路を組みなさい。
    1. XWG1はワードジェネレータ。置いてから右クリックし、左右反転する。(XWG1のT,R の向きを確認すること)
    2. XLA1は論理アナライザ。
    3. いずれも、「計測器」ツールバーにある。
  2. この回路に、次のような入力を与えてみよう。

    このために、MultiSimのワードジェネレータを使用する。ワードジェネレータは任意の波形を出力するための装置であり、あらかじめ書き込まれているデータどおりの波形を生成する。
  3. 上記の波形を、Dが第0ビット、CLKが第1ビットと見て、ひと目盛りごとに2進数に変換すると次のようになる。
    01,01,11,10,00,00,00,10,10,10,00,01,11,11,11,11,01,01
  4. それを16進数に直してワードジェネレータに入力する。
  5. 実行結果は以下のようになる。

    ここでは、クロック/区分を50とし、クロックの50倍の範囲を見ている。
  6. レポートに、この実験の回路図と、クロックの30倍の範囲を表示した論理アナライザの図を載せよ。

T-FF(トリガFFまたはトグルFF)

クロックパルスの立ち上がり(または立ち下がり)ごとに状態が反転するFFをT-FFと呼ぶ。

T-FFはD-FFの Q 出力を D 入力に戻すことで作成することができる。

この回路は、自分自身の反転出力を次の時刻入力としているので、クロックパルスが入るごとに状態が反転する。

実験3-3

  1. D-FFを使って上記のT-FFを構成せよ。
  2. "T-FF.ms12" というファイル名で保存せよ。

バイナリカウンタ

クロックパルスとして加わったパルス数をカウントする回路をバイナリカウンタと呼ぶ。

バイナリカウンタは、T-FFを必要な数だけ直列に接続して構成することができる。

実験3-4

  1. 実験3-3で作成したT-FFを階層ブロックとして使用し、4ビットの16進バイナリカウンタを構成せよ。
  2. 入力クロックとして波形発生器を使用して単純なクロックパルスを入力せよ。周波数は1[kHz]に設定せよ。
  3. 論理アナライザを使って出力波形を観測し、4ビット16進バイナリカウンタとして動作していることを確認せよ。
  4. レポートに、この実験の回路図と、クロックの50倍の範囲を表示した論理アナライザの画像を載せよ。

実験4  〜電子ルーレット(optional)〜

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へとシフトして伝わっていくことからこの名がある。

74LS164

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
  1. t=0 でCLR信号が0なので、すべての出力は0になる。
  2. t=1 で A=1,B=1 なので、CLKの立ち上がりのタイミングで QA=1 となる。
  3. t=2 で A=0,B=0 なので、CLKの立ち上がりのタイミングで、QB=1 となり、QA=0 となる。
  4. t=3 で、・・・(以下同様)

このように、クロックの立ち上がりのタイミングに合わせて、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につながることになる。

実験4

  1. 電子ルーレットの回路を、下図を参考にして構成せよ。
    1. 7入力NORゲートはないので、3入力NORと2入力NOR2個を3入力NANDでまとめて、NOTで反転することで同じ機能を実現している。左右を反転してある。
    2. クロックは関数発生器XFG1を用いる。以下のように設定すること。
    3. ルーレットの表示は、赤色インジケータを円状に8個並べて行うこと。
  2. シミュレーションを実行させ、ルーレットが回転することを確かめよ。
  3. 作成した回路図をレポートに添付すること。

レポート課題

以下の課題をレポートに解け。

  1. 半加算器を2つ使って全加算器を構成することができる。この回路図を示せ。
  2. 実験3-2の結果から、D-FFはエッジトリガ動作をしていることを説明せよ。
  3. RSラッチを複数個並べてシフトレジスタを作っても正常な動作が保証されない。これはレーシングと呼ばれる現象が起こることが原因である。レーシングについて説明し、それを避けるためにマスタースレーブ型FFが行っている対策について説明せよ。

情報生体システム工学科情報生体システム工学実験II