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 2008-03-29