next up previous contents index
Next: 蓄積プログラム方式 Up: 制御部 Previous: フラグに依存する制御部   Contents   Index

電卓

電卓(electronic desktop calculator)とは正式には電子卓上計算機の略であったが, 現在は電卓という言葉が定着しているので,以下こう呼ぼう。 電卓は蓄積プログラム方式ではないが, ほとんどパソコンと同じような機能を持っているので, 勉強のために,具体的構成を述べよう。 なお,ここでは,教育的効果を考慮し, コンピュータとの連続性を意識した電卓を示しているが, 本当の電卓は,ここで述べるものよりずっと簡素化されている。 しかし,動作としての本質はあまり変わらない。

電卓の入出力と言えば,十数個のキーからなるキーボードと, 10桁程度の数字を表示するディスプレーだけである。 キーボードは全体として一つの周辺装置を構成するが, ここでは説明の都合上, 周辺装置のアドレス一つ一つにキーが結び付けられているものとしよう。 これらキーボードに割り付けるアドレスは,数字キーに対しては0x0000から0x0009, 演算キーについては余裕をもって0x000Aから0x001Fとしておこう。

例えば,キーボードの数字キー「7」が押されているかどうかを知るには, CPUより0x0007番地のアドレスを指定しReq(Request)信号を与える。 キーボードが押されていれば,データバスに0x0007を載せてEnable信号を返す。 押されていない場合には0xFFFFを返すものとする。

Figure 10.3: キーボード回路(組合せ論理回路の前にある$ \phi _1$などの線はスイッチ群を意味する)
\begin{figure}\centering
%
\unitlength 1pt
\begin{picture}(298,132)
\put(0,0){\...
...127.3){\makebox(0,0)[b]{{\footnotesize\rm$\phi_2$}}}
\end{picture}
\end{figure}

キーボタンについては次のような扱いをする。 ボタンを押した場合,押す時間によらず, 同じ結果が得られるように配慮する必要がある。 また,ボタンのような機械的接点には, いったん接触した後, 振動のために何回か離れたりついたりするチャタリング(chattering)という現象が発生する。 この影響を除去する必要もある。 このため,ボタンの後に図 10.3のような回路を用意し, いったん接触した後には,$ V_h$が配線に充電され, その後,抵抗により徐々に電位が下がるようにする。 この結果,接点が開になっても,この電位がおよそ$ V_h/2$を切るまでは, $ K$は1のままであり,閉になっていると理解される。

Figure 10.4: キーボード回路のシークエンス回路用の状態遷移図
\begin{figure}\centering
%
\unitlength 1pt
\begin{picture}(233,64)
\put(0,0){\s...
...2.9,2.9){\makebox(0,0)[b]{{\footnotesize\rm$R$=0/}}}
\end{picture}
\end{figure}

この回路に接続されているシークエンス回路は, 図 10.4に示すような状態遷移図を持ち, 次のように動作する。

まず,内部状態は基本的には0で待機している。 $ Req$が来ても$ K=0$の場合には,$ Out=$0xFFFFとして$ Enable$で返事をする。 $ K=1$$ Req$が来ると,$ Out=$キー番号として$ Enable$により返事を返す。 この後すぐに$ Req$が来ても重複返事を返さないよう, 内部状態を1にして$ K$が再び0に戻るまで,待機する。 $ K$が再び0に戻れば,内部状態0の待機状態に復帰する。

出力側の数字ディスプレーはもっと単純である。 まず,ディスプレーは出力用周辺装置として1アドレスが与えられているものとする。 数字1文字を表示するには7エレメントぐらいが必要であるので, 10個の数字としても全部で70個ぐらいである。 さらに,小数点やエラー表示などを入れても7bitのデータ幅の情報で, エレメントの指定は十分可能である。 また,指定されたエレメントを明るくするか暗くするかの指定に1bitを割り当て, 計8bitのデータをCPUから送り, その下位7bitをデコードして必要なエレメントに必要な情報を送ればよい。

残るはCPUであるが,蓄積プログラム方式ではないので, 図 10.2に示したものでよい。 ただし,レジスタはXとYとZの三つとする。 また,演算は逆ポーランド算法と呼ばれる順で行う。 これは,置数,置数,演算のようにキーを押す。 例えば12+31は,1,2,ENTER,3,1,+と押す。

CPU内のシークエンス回路の概要は次のようである。 ただし,数値入力の初期状態であるかを示す $ Init$なる内部変数を用意し,スタート時に$ Init=1$とする。

  1. キーボードチェック。 具体的にはアドレスを順番に増加していき,$ Req=1$にしてキーのチェックに行く。 キーが押されていれば$ Enable$とともに有為なデータが戻ってくる。 押されていなければ,0xFFFFが戻ってくるので,これを繰り返す。
  2. 数字キーでかつ$ Init=1$であれば, 数字キーからのデータを直接Xレジスタに入れ,$ Init=0$とする。 $ Init=0$であれば,Xレジスタの内容を10倍し, このデータを加える。 Xレジスタの内容が負の場合は,このデータを引く。
  3. ENTERキーであれば,$ Init=1$とし, Yレジスタ→Zレジスタ,Xレジスタ→Yレジスタなる移動を行う。
  4. 四則演算キーであれば,$ Init=1$とし, Yレジスタに対してXレジスタの内容で四則演算を行う。 例えばY$ \div$Xの順の計算を行う。 結果をXレジスタに入れ,Zレジスタ→Yレジスタなる移動を行う。
  5. 負符号($ -$)キーであれば,$ Init=1$とし, Xレジスタの内容を補数にする。
  6. AC(All Clear)であれば,$ Init=1$とし, すべてのレジスタの内容を0にする。
  7. Cであれば,$ Init=1$とし,Xレジスタの内容を0にする。
  8. Xレジスタの内容をディスプレーに表示する。
  9. 第1項へ無条件ジャンプする。
これで,例えば $ (2+3)\times(4+5)$のような計算も可能である。 まず,4+5を計算し,それをレジスタにプッシュしてから,2+3を計算し, ポップしたものを掛ければよいので, 4,ENTER,5,+,2,ENTER,3,+,$ \times$と押せばよい。 上記の作業を実行する制御部の持つべき状態遷移図の作成は, 諸君の演習として残しておこう。


next up previous contents index
Next: 蓄積プログラム方式 Up: 制御部 Previous: フラグに依存する制御部   Contents   Index
Yoichi OKABE 2010-04-20