ALUとして使えるTTLを洗い出し、SN74LS382に決める
ALU(Arithmetic Logic Unit)の直訳は算術論理装置です。しかしこの言葉は「算術計算を行う論理 回路」という意味にもとれます。ここでは"/"を補って、Arithmetic/Logic Unitとした上で、「算術/論理」演算を行う回路という意味でALUという言葉を使います。
尚、しばしば誤解されることですが、コンピュータには算術演算(加減乗除など)と論理演算(ANDやOR、あるいはシフトなど)の両方が必須という訳ではありません。 演算が加算しか実行できなくても、プログラムに従い、判断や分岐を行うのであれば立派なコンピュータです。 事実1940年代のコンピュータには部品数削減のために、加算のみ、あるいは減算のみ(注)の物も珍しくありませんでした。
また算術演算のみのコンピュータがあるならば、逆に論理演算のみが可能なコンピュータも在り得ることになります。しかし、黎明期のコンピュータは「計算」を目的としていたためか、論理演算のみのコンピュータは歴史には存在しなかったようです。(現代のパソコンにおけるグラフィックボードの様に、黎明期のコンピュータの目的が画像処理であったのならば、論理演算のみのコンピュータも存在したかもしれません)
本機においても論理演算のみではは円周率の計算が困難であるのは明白です。ですから、ここでは加算機能は必須とし、加算ができるTTLを74シリーズの中から洗い出すことから始めました。
ALUの入手に関しては本ページの末尾で詳しく述べますが、私は74181、74LS381、 74LS382をそれぞれ数個ずつ入手できました。 74181は演算の種類が多く、その一部だけを使うには別途外付回路が必要なのに対し、74LS381、74LS382は演算の種類が8種類でそれを選択する信号線も3本のみというシンプルな構成です。
また、74LS381よりも74LS382の方がキャリー信号の扱いが簡単になっています。回路はできるだけ単純にしたいので今回は74LS382を使うことにしました。
型番 | 可能な演算 | ビット数 | 備考 |
---|---|---|---|
7480 | 加算のみ | 1bit | |
7482 | 加算のみ | 2bit | |
7483 | 加算のみ | 4bit | |
74183 | 加算のみ | 2bit | 1bitの加算器を2つ実装 |
74283 | 加算のみ | 4bit | 7483のピン配置を変えたもの |
74181 | 加減算、AND/OR/EXOR、その他計32種 | 4bit | 32種の全てが有意義な演算とは限らない |
74281 | 加減算、AND/OR/EXOR、その他計15種 | 4bit | ALU出力にシフトレジスタ付 |
74381 | 加減算、AND/OR/EXOR、その他計8種 | 4bit | 8種類にはセットとリセット含む |
74382 | 加減算、AND/OR/EXOR、その他計8種 | 4bit | 74382のキャリーの扱いを改良したもの |
74681 | 加減算、AND/OR/EXOR、その他計16種 | 4bit | シフトレジスタ付、レジスタ付 |
74881 | 加減算、AND/OR/EXOR、その他計32種 | 4bit | 74181の外形をスリム24pinにしたもの |
加算回路と減算回路はほぼ同じ部品数で実現できますが、どちらかのみを作るなら「減算のみ」の方が遥かに有利です。 理由はA+Bという加算は-(0-A-B)という形に変形することにより、減算回路でも実現できるのに対し、A-Bという演算は加算回路のみでは実現できないからです。
詳細は下記参照
(注)【加算命令よりも減算命令の方が有利な理由】2011-7-18、上記注釈に対し補足を追記 (SPECIAL THANKS kouaisshin)
例えば 5+7を減算のみで行うには任意の値(たまたまその時ACCの値などを利用)をZとすると、
(Z-Z)-(Z-Z-5-7)という順で減算のみの繰り返しで13を求めることができます。しかし5-7を加算のみで行うためには、ビット反転命令(補数化命令)などを別途用意しない限り不可能です。
この差異は2項加算命令は、第1項と第2項が対称(交換可能)であるのに対し、2項減算命令は、第1項と第2項が非対称であり、項の交換により結果の異なる2種類の演算が実行可能であるという性質に由来します。情報処理上は加算と減算は全く性質の異なる命令なのです。
ALUと命令レジスタの関係
上記は、前回に決定したメモリ周辺の回路概略図です(右上は74LS382のピン配置と演算機能表)。命令レジスタの下位12ビットがアドレス指定用で、上位4ビットが命令指定用です。上図では命令レジスタの上位4bitの接続先が未定ですが、このうち3ビットを74LS382に直結し演算指定に用いることにしました。上図を簡略化し、ALUとなる74LS382を加筆したのが下図です。
まだ、何と何を演算するのか、演算結果をどこに格納するのかは不明ですが、コンピュータらしい回路概略図になってきました。
74LS382の入出力の接続先を決める
74LS382は2個並べて8bitのALUとして使用しますが、問題はその入出力の接続先です。演算に必要な2つの入力をメモリから取り出し、 その演算結果もメモリに保存することを前提とすると、下記のA案が最も無難なアーキテクチャになります。しかしA案はメモリから読み出した値やメモリに書き込む値を一時的に保存する8bitのレジスタが3本必要になります。
A案に対し、出力レジスタを省略したのがB案です。メモリに書込むデータが常にALUの演算結果のみならばこの省略案は有望です。しかしALUの出力以外にメモリに書込む回路がある場合、メモリへの書込み線の競合(奪い合い)が生じるため★の位置に3Sバッファが必要になり、部品数や配線数はそれほど削減削減されません。
図では便宜上、メモリのアドレス線は省略し、データ入出力信号線を入力線(D-in)と出力線(D-out)に分けて記述しましたが、今回使用するメモリ(55257)は入力線と出力線は共通です。
C案はALUの一方の入力レジスタと、出力レジスタを兼用させる案です。レジスタZに3ステート出力のD-FFを使用すれば確実に部品数や配線数が削減できます。
更にレジスタXも命令レジスタの下位8bitと兼用できそうです。まずはこのC案を前提としてALU周辺回路とメモリ周辺回路を一体化してみました。
下図が全体の回路概略図(ブロック図)です。命令レジスタの最上位ビットと演算時に発生するキャリー信号の扱いが未定ですが、ほぼ全体像に近い図です。命令レジスタは演算値レジスタと兼用となりますので、命令レジスタと言うよりも汎用レジスタに近いイメージになります。
また、図の演算出力レジスタはアキュムレータと呼ばれるのが一般的ですので、こちらの方は本サイトでも以降はアキュムレータと記述します。TTLとして必要な機能は命令レジスタと同じであるため、ここにも比較的入手しやすいSN74LS173を使いました。ここにシフト機能付きのレジスタ(シフトレジスタ)を用いると、シフト命令やローテート命令の実装も可能になります。しかし、今回は極力シンプルな設計に押さえて無事完成させることが最優先ですので、この案も見送る事としました。
ALUの入手と、入手不可であった場合の代替策
私は幸運にも74181、74LS381、 74LS382を入手することができましたが、関東一円を走りまわりましたし、在庫確認の電話も何度もかけています。Web上では在庫アリでも実際には在庫ナシである店も多く、在庫がある店でも残り十数個という店も多々ありました。Web購入にせよ店頭購入にせよ、は電話/メイルで事前に在庫を確認したほうが良いかと思います。
382が入手できなくても、181か381、あるいは881が入手できれば、多少部品数が増えますが本機とほぼ同じ物を製作可能です。 なお、殆ど不可能に近いとは思いますが、SN74LS281やSN74LS681が入手できるのであれば、これらはLS382にシフトレジスタを内蔵したタイプですので上記の回路より更に部品数を削減することが可能です。
代替策
今回使用した部品の中で最も入手困難な部品は、プログラムカウンタに用いた3S出力のバイナリカウンタとこのALUです。プログラムカウンタの方は通常出力の物に3Sバッファを別途接続することにより容易に代替可能ですが、ALUが入手不可能であった場合の代替策もあります。
どうしてもALUを入手できない場合、ALUの代わりにROMを使うという代替策があります。 40年前なら想像すら出来なかった方法ですが、あらじかめROMに、ありとあらゆる演算の答を書き込んでおくという方法です。 8bit同士の演算で、演算の種類が8種類(3bit)ならば、アドレス線19(8+8+3)本でデータ線8bit(キャリー出力も必要なら9bit)あるROMがあれば、それ一個で74LS382二個分と全く同じ働きをさせることができます。この方法は計算に要する時間はメモリのアクセスと等しくなり、ALUを使うより遥かに高速です。最新のパソコン用CPUにおいても、この方法と似た方法で演算の高速化を図っているものが数多くあります。ROMに書き込むためにはROMライタが必要になりますが、ALUが手に入らなかった場合の代替策としては最も有望かつ、最もシンプルな方法です。