標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第121回]

●7segLED表示回路はダイナミックドライブです

前回の説明の続きです。
7segLEDの表示ドライブ回路は、信号の数が表示1桁あたり7本(dpも含めれば8本)も必要です。
これを8桁も表示しようとすると、大変なことになります。
当然のことながら、信号線の数だけではなくて、ドライバICやデータラッチICも桁の数だけ必要になります。

そのように表示桁数が多い場合には、ダイナミックドライブという表示方法がとられます。
これに対して、桁ごとにラッチやドライバを用意する表示方法をスタティックドライブといいます。

ダイナミックドライブは人間の目の残像を利用した表示方法です。
テレビや映画などと原理は同じです。
人間の目は高速(だいたい20〜30回/秒以上)で点滅する画像(光)は点灯しっぱなしのように認識します。

そこで8桁ある7segLEDを、常時全桁点灯させておく(スタティックドライブ)のではなくて、順番に桁ごとに短時間だけ点灯させることを高速で繰り返すと、人間の目には全部の桁が点灯しているように見えます。これがダイナミックドライブです。
7segLEDはダイナミックドライブに都合のよい構造になっています。

今回、「つくるCPU」の試作2号基板にのせる予定の7segLEDはカソード側が共通になった、カソードコモンタイプです。
8桁の7segLEDのa〜gセグメント(アノード側)を各桁共通につなぎます(1桁から8桁の各aはa同士を数珠つなぎにし、各bもb同士を数珠つなぎにし…という具合につなぎます)。
そのようにつないだアノード側に、たとえば第1桁目の表示データを流しながら、第1桁目のカソード端子をLにすると、その桁だけに電流が流れてLEDが光りますが、他の桁のカソードはHのままなので、他の桁にも同じデータ信号が与えられていても同時に他の桁が光ることはありません。
次に、今表示していたLEDのカソードをHにし、その隣の表示データをアノードに与えるとともに、その桁のカソードをLにすると、今度は隣のLEDが光ることになります。

これを繰り返すことで、スタティックドライブならば、dpも含めると8×8=64本も必要な信号線を、8+8=16本の信号線で、8桁の7segLEDを表示させることができます。

理屈はわかったとしても、ではそのように8桁の7segLEDに次々に表示データを送りながら、各桁のカソードのH、Lを切り換えるなどという大変な回路をどのようにして実現しているのでしょうか。

前回お見せした回路図をもう一度、7segLEDの表示回路部分のみ切り取ってお見せします。



図の左側の74HC374、74HC244がセグメントデータの出力回路で、下側の74LS145がカソードドライブ回路です。
でも、これだけでは、どうして8桁LEDのダイナミックドライブができるのか、よくわからないと思います。

●7seg表示回路はDMAを利用します

あるいは、7segLEDのダイナミックドライブはプログラムでやっているのではないか、と思われる方がみえるかも知れません。
勿論、表示だけをしていればよいというのでしたら、そういう方法もあります。
しかし今回の回路は、LEDを表示させることが目的ではなくて、LED表示をしながら、キーボードから、データの入力を受けつけながら…
ということをこなしていかなければなりません。
当然、ユーザーのプログラムが実行されているときも、LEDの表示はそれとは無関係に行わなければなりません。

そのような条件でも、プログラムを使って7segLEDのダイナミックドライブをする方法が無いわけではありません。
一定の周期で、割り込みを発生させて、そのときだけ7segLEDの表示プログラムを実行させてしまう、という方法です。

しかし今回の回路は、それとは全く別の方法で、7segLEDのダイナミックドライブを行います。
それがDMA(ダイレクトメモリアクセス)です。

7segLEDの各桁の表示データは、じつはRAMの中に書かれているのです。
勿論、そのデータは、キー入力をしたときや、プログラムでLEDに表示を行うときなどに、7segLEDの各桁に対応した特定のメモリアドレスに、システムプログラムによって、書き込まれる仕組みになっています(下図)。

たとえば7segLEDの一番左の桁のセグメント情報は、RAMのFFF8番地に格納されています。
このメモリアドレスのデータを桁ごとに読み出して、7segLEDに表示するために、さきほどの回路の74HC374にラッチする方法として使われているのが、DMAなのです。

DMAはCPUの力を借りることなく、CPU外の回路によって、メモリに直接アクセスする方法です。
メモリからI/Oにデータを移すときや、その逆にI/Oからメモリにデータを書き込むときに利用される方法で、CPUがプログラムでそれを実行するよりも、数倍から数十倍高速で実行できるという特徴があります。

さて、今回「つくるCPU」の試作2号基板に実装する予定の7segLED回路は、DMAではありますが、ただのDMAではなくて、サイクルスチールによるDMAを行います。
マイクロコンピュータのDMAは普通は、BUSRQ(バスリクエスト)信号によって、CPUを一時停止させておいて、その間にまとめてメモリアクセスをする、という使い方をします。

それに対して、今回の回路はCPUを止めることなく、CPUのプログラム実行の隙間を突いて、メモリからデータを読み出してしまおう、という方法です。

じつは、そのためにOPコードフェッチ回路のタイミングを一部変更しました。
OPコードフェッチのタイミングチャートは、[第39回]にありますが、参考までにもう一度、下に示します。

OPコードはT1の終わりに、OPコードレジスタにラッチされます(注)が、その命令が解読されて、実行されるのは、T4になってからです。つまりT2とT3は、空いていることになります。
注。OPコードがCPU回路内部に取り込まれるのはT1の立ち上がりからですが、OPコードレジスタにラッチされるのは、T1の下がりエッジです。

そこで回路を少し変更して、下のようにT2とT3(M1)は、CPUがメモリにアクセスしないようにしました。



アドレスバスA0−A15もデータバスD0−D7も実際には抵抗でプルアップしていますから、T2、T3の期間にCPUがアクセスしなくても、図のようにハイインピーダンスではないのですが、わかりやすいように、そのように図で示しました。

なお、上の(注)に書きましたように、OPコードはT1の「終わり」にラッチされますから、この変更後のタイミングではデータをラッチするタイミングがぎりぎりで余裕が0になってしまいます(タイミングチャートではそう見えます)。
しかし実際にはメモリにアドレス信号が入力されてからデータが出力されるまでのディレイがあるはずなので、大丈夫(だと思います)。

さて、もう一度今回のページの上の方でお見せした7segLEDの回路図を見てみましょう。
回路図の下の方、M1のタイミングでMEMRDとアドレスバスの下位3ビット(A0〜A2)がアクティブになっています。
このA0〜A2はバイナリカウンタ74HC191の出力がそのまま出力されます。
74HC191のCKにはT3が入力されています。

CPUはHALT命令が実行されない限りは、少なくともT0〜T4は毎回必ず繰り返し実行を続けます。
そして毎回T3が入力されるごとに74HC191からは000〜111が順に繰り返し出力されることになります。
すると、T3の入力ごとにA0〜A2は、M1の期間だけ強制的に000〜111になります。
このときA3〜A15には何も出力されませんから、抵抗でプルアップされているので、すべてが”1”になります。
M1の期間中はMEMRDも強制的にLになりますから、結果、M1の期間だけメモリアドレスFFF8〜FFFFのデータが順にデータバスに出力されることになります。
そのデータはT3のタイミングで74HC374にラッチされ、74LS145出力と同期して、7segLEDのアノードに供給されます。

7segLEDのダイナミックドライブを含めたタイミングチャートを下に示します。



なお、この回路でひとつだけ心配していることがあります。
それは命令によって実行クロック数が異なるということです。
CPUが読み込む命令によって、実行クロック数が異なるため、T3から次のT3までの間隔は一定にはなりません。
ということは桁ごとに表示されている時間が異なることになりますから、ひょっとすると表示がちらつくかもしれません。
まあ、それは実際にできあがってからの、「お楽しみ」ということにしておきましょう。
2008.12.3upload
2008.12.4一部追記、訂正

前へ
次へ
ホームページトップへ戻る