論理回路2
第12章 ハードウェア記述言語(その3)
−簡単な電卓の設計−
井澤 裕司
2.1 回路構成
一般の電卓には、加減乗除やメモリ機能、関数計算など、高度で豊富な機能が実装されています。
この章の目的は、このような電卓を設計することではありません。
単純化した電卓を例に、これまで学習した知識を結集して、その機能を実現する具体的な回路を設計します。
電卓には、2進数の加算器やエンコーダ、デコーダ等の組み合せ回路と、
テンキー操作により、LED表示部等の制御を行う順序回路(シーケンサ)から構成されます。
そのような電卓のブロック図を、以下に示します。
以下、これらの要素部品について詳しく眺めてみましょう。
2.2 エンコーダ回路
テンキーを押すと、その10進数に対応する4bitの2進数を出力します。
この回路が
エンコーダ
です。
この回路の具体的な構成を以下の図に示します。
このエンコーダ回路は極めて単純ですが、この回路の前段に、スイッチのチャタリング動作の影響を除去する工夫が必要になることがあります。
2.3 加算回路
4bitの2進数の加算回路は、1個の半加算器と3個の全加算器で構成することができます。
その回路構成を以下に示します。
2.4 7セグメントLED駆動用デコーダ回路回路
4bitの正の2進数を足し合わせると、5bitの2進数になります。
4bitの2進数は、1桁の10進数を2進数に変換したBCD(Binary Decimal Code)符号です。
したがって、加算結果のとりうる範囲は、0〜18になります。
19〜31までの値をとりえないことを利用して、論理を簡略化することができます。
このようにして設計した7セグメントLEDのデコーダ回路は、以下のようになります。
このようにして、エンコーダ回路と加算回路、デコーダ回路を実現することができますが、電卓にはこれ以外に、レジスタ、マルチプレクサ、制御回路が必要です。
レジスタは、フリップフロップ(D-FF)を4個並列に並べて実現します。
マルチプレクサは、制御信号の値により、レジスタの出力か、加算回路の出力のいずれか一方を選択して出力します。
その機能は極めて単純で、簡単なゲートの組み合せで構成できることは明らかです。
最後に残るのが制御回路です。
制御回路は、この電卓の設計の中で最も複雑な回路です。
これから、その設計手順を説明しましょう。
2.5 電卓の制御回路の状態図
電卓の制御回路は、順序回路です。
テンキーの操作手順に従って、LEDの出力等を制御するのでシーケンサと呼ぶことがあります。
はじめに、その状態図を作成し、全体的な動作について整理しましょう。
この制御回路は、以下の6つのステージで構成されます。
・ステージ0 (000) : クリア状態
1番目の数字入力待ち
・ステージ1 (001) : 1番目の数字入力完了
+(プラス)入力待ち
・ステージ2 (010) : +(プラス)入力完了
2番目の数字入力待ち
・ステージ3 (011) : 2番目の数字入力完了
=(イコール)入力待ち
・ステージ4 (100) : =(イコール)入力完了
結果表示
・ステージ5 (111) : エラー状態
C(クリア)入力待ち
正しいキー操作の場合、ステージは 0→1→2→3→4 のように推移します。
逆に、誤ったキー操作をすると、エラー状態(ステージ5)に推移します。
なお、C(クリア)キーを押すと、どのステージであっても最初のステージ0 に移動します。
ステージ5 の状態が(111)という2進数のコードで表されている点に注意して下さい。
これは、通常の回路設計で回路の簡略化を図るためです。
なお、ハードウェア記述言語(VHDL)を用いた場合、簡略化の作業はコンパイラが行うので、他のコード(例えば101)でも特に問題はありません。
3 VHDLによる設計
本節では、
ハードウェア記述言語(VHDL)
を用いて、簡単な電卓を設計した事例について解説します。
なお、スペースの制約ですべてのソースコードをここで紹介することはできません。
各Componentの機能は比較的単純ですので、それらの名称からある程度想像できると思います。
詳細が必要な場合は、別途連絡して下さい。
3.1 エンコーダ回路
テンキーを入力し、これに対応する2進数を出力するエンコーダ回路の記述例を、以下に示します。
case 文で、押されたテンキーに対応する10進数をCNT信号として出力しています。
KEY_TEN信号は、テンキーの 0〜9 が押されたことを検出するもので、制御回路で使用します。
また、KEY_CLK信号は、テンキーのいずれか(クリアキー、プラスキー、イコールキーを含む)が押されたことを検出するものです。
3.2 加算回路
以下に、5bitの2進数の加算を行う加算回路の記述例を示します。
ここでは、半加算器や全加算器を使用せず、算術演算子(+)で加算の演算を表しています。
3.3 7セグメントLEDデコーダ回路
2桁の10進数の下位の桁を表示するための7セグメントLED用のデコーダ回路の記述例を、以下に示します。
case文を用いて、0〜18の入力値に応じ、対応するLEDのセグメントを表示しています。
なお、LEDのドライバの関係で、出力SEG7は負論理になっています。
電卓の操作エラーを表示するため、入力ERR = 1 のとき、7セグメントLEDに”E”を出力しています。
なお、上位の桁のデコーダ回路も、別途設計する必要があります。
この場合は、入力 CNT の値が、10〜18の場合にのみ、"1"が表示されるようにします。
3.4 制御回路
制御回路の記述例を、以下に示します。
前半の process 文では、状態図に相当する遷移を、case文を用いて記述しています。
ソースコードを読みやすくするため、6つの状態を、(SCL、SN1、SPS、SN2、SEQ、SER)で表現しています。
後半の process 文で、それぞれの状態に応じて変化する制御信号を出力しています。
3.5 電卓の回路
上で示した部分回路(Component)を組み合せた、簡単な電卓の記述例(部分)を、以下に示します。
これらのソースコードについて、簡単に解説します。
電卓本体のVHDLでは、
Component 文
で定義したエンコーダをはじめとする部品を呼び出し、これを結線する方法を記述しています。
簡単に、
各Component
の内容について補足します。
C1
は、テンキースイッチの
チャタリング
を防止するため、数十MHzのクロックを数十Hzの周波数にカウントダウンするための
カウンタ
であり、
C2
の
リサンプル回路
に、カウントダウンしたクロックを供給します。
C2
でリサンプルされたテンキーの信号は、
C3
の
エンコーダ回路
に送られ、4bitに2進数化された
10進数(BCD符号)
に変換されます。
そのBCD符号は、
C4
と
C5
の
レジスタ回路
に保存され、
C6
の
加算回路
でそれらの和が計算されます。
C7
と
C8
は
セレクタ
で、7セグメントLED回路で表示するデータを選択します。
C9
と
C10
は、5桁の2進数を2桁の10進数に変換して、7セグメントLEDに表示するための
デコーダ回路
です。
C9
は下位、
C10
は上位を表示します。
C11
は
制御回路
であり、リサンプルされたテンキーの信号に基づいて状態を遷移させ、各Component
に必要な制御信号を送ります。
本章では、
ハードウェア記述言語(VHDL)
を用いて簡単な電卓を設計する手法について解説しました。
VHDLのコンパイラは、
ALTERA
や
XILINKS
など、FPGAを製品化している企業のホームページから、
無償でダウンロード
することができます。
FPGAの
評価ボード
を入手すれば、実際の回路として動作させることも可能です。
さらに高度な回路設計を目指す人は、オリジナルの
プロセッサの設計
に挑戦してみてはいかがでしょうか?
以上で、
「論理回路2」
の授業は終了です。
ここで学んだ知識だけでは、
大規模な論理回路
を設計することはできません。
しかし、どのように優れた設計者であっても、出発点は簡単な
例題のトレース
です。
例題等で示した回路を自分なりに
リファイン
し、目標を設定して具体的な回路設計を積み重ねる努力が重要です。
エンジニアに要求される最も重要なことは、
常に学び、自らを伸ばそう
とする姿勢です。
自らの自由意志で、自らから率先して、自らを教育することができるエンジニアを目指して下さい。
皆さんの健闘を祈ります。