仕事で役立つ人気ビジネスアプリおすすめ!
[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
コンピュータアーキテクチャの話 (50) 4004の設計を追体験する
次の図に、ALUのブロックダイヤグラムを示す。ALUはバイナリの加減算を行うだけでなく、10進の加減算のアシスト、シフトやJCN命令の条件の成立、不成立の判定などを行う。ALUはこれらの動作を行うサブユニットの集合であり、要求された処理を行うサブユニットの出力をマルチプレクサMX-Oで選択してALUの出力とする。また、加減算を行うADDERは、命令によってオペランドとなるレジスタや定数が異なるので、その選択を行うためにMX-Y、MX-A、MX-Tの3つのマルチプレクサを設けている。
ALUのブロックダイヤグラム
CC Genサブユニットは、JCN命令の条件の成立、不成立を判定する特殊なユニットであり、詳細は後述する。
NOTサブユニットは入力の論理否定値を出力するユニットであり、単純にインバータ 4個で構成することが出来る。Right Shift、Left ShiftはACCとYレジスタを繋いでリング状にシフトする処理を行うサブユニットであるが、単にビット位置を入れ替えて配線するだけで実現できる。
バイナリエンコードは4ビットのワンホット信号("1"が1個だけの信号)をバイナリに変換するサブユニットであり、カルノーマップを書くと、次の図のようになる。元々の入力がワンホットで、1が2個以上ある組み合わせは存在ないと想定する。従ってカルノーマップの1が2個以上あるエントリは*(Don’t Care:どちらの値が出力されても良い)として置く。そうすると、上位ビット(Bit2)のマップで"1"が出力されるのは、図において黄色で示した、ACCの下位2ビットが"00"のケースだけである。同様に緑で示した下位ビット(Bit1)の出力が"0"になるのは、ACCのビット3とビット1が"0"のケースだけである。従って、次のような簡単な回路で実現できる。
キーボード信号のエンコードサブユニット
ここではBit0出力は4個のいずれかのキーが押されているか否かを示すように、ACCの4ビットをANDしたものを出力する設計としている。このような仕様としたのは、複数のポートに分かれた多数のキーの押下をスキャンする場合には、ゼロでないポートがあれば、その中の一つのキーが押されたことを示し、押されたキーの番号はBit2、Bit1にバイナリエンコードされているので、右シフトすればバイナリ値が得られるという使い方を想定している。
一方、キーが押されていない状態は、同様にゼロとして、ポートの中で押されたキー番号+1のバイナリ値を出力するという仕様も可能であり、この場合はキーの押されたポートの識別は同じであるが、バイナリへの変換は、右シフトの替わりに-1を行えば良い。
4004のKBP命令がどのようなエンコードをするのかはデータシートには書かれていない。従って、どちらのエンコードが行われているか、あるいは全く異なる方式であるのかは不明であるが、ここに述べたエンコードは回路的に簡単であり、4004はこのようなエンコードを用いているのではなかろうか。