マイクロプロセッサのバス
(復習)マイコンのプログラミング
実験第1の「パソコンによる計測インターフェース技術1」で扱った
マイコンを扱います。
プログラムの書き方、コンパイルの仕方、プログラムの転送と実行の方法などを、
手引書
を参考に、一通り復習しておきましょう。
演習3-1
マイコンボードのスイッチ、LED、7セグメントLEDなどを使った
プログラムを1つ以上記述し、動作を確認してみましょう。
マイクロプロセッサのバス
アドレスバス
プロセッサ(CPU)は、プログラムやデータを格納しているメモリや、
スイッチ、LEDなどの周辺機器(入出力装置: I/O)と、
必要なデータをやりとり(書き込みや読み出し:「アクセス」と呼ぶ)をして、
コンピュータとしての動作をします。
この際、CPUがデータをアクセスする「相手」を指定する必要が
あります。
この「相手」の指定には、大きく分けて、次の2段階があります。
- アクセスする「相手」(メモリ、I/O装置、などのデバイス)の指定
- アクセスする相手の中の「場所」(メモリ中のデータの格納位置、など)
CPUは、「アドレスバス (address bus)」を用いて、これらを指定します。
このアドレス信号線が示す「アドレス」の値に応じて、
実際にアクセスされるデバイスが決定されます。
(これを「メモリマップ」と呼ぶ)
この実験で用いるマイコンボードでは、次のようなメモリマップが
割り当てられています。
アドレスの値 | アクセスされるデバイス |
0x2000 - 0x3fff | 外付けRAM |
0x4000 - 0x4003 | 7セグメントLED |
0x4004 | スイッチ(8個) |
0x4005 | LED(8個) |
0x6000 - 0x6fff | 外付けI/O装置 |
つまりCPUは、たとえば「0x2000番地にあるデータを書き込む」という
動作をしようとすると、実際には外付けRAM(の0x2000番地)に
データが書き込まれるわけです。
逆に言うと、CPU(でプログラムを書く人)は、どのアドレス(番地)に
どんなデバイスが接続されているか、ということを、十分知っていなければ
なりません。
CPUがアクセスをしようとするアドレスの値によって、実際にアクセスされる
デバイスが決定される仕組みは、「アドレスデコーダ」と呼ばれる回路によって
実現されています。これについては、この実験の最後で、
詳しく見ていくことにしますが、今は、何らかの仕組みによって、
このようなメモリマップが実現されている、と理解しておいてください。
データバス
CPUが、アドレスバスによって、アクセスしようとする対象のデバイス(および
その中の場所)を指定するのにあわせて、実際にアクセスするデータを
書き込み、または読み出しする必要があります。
このデータをやり取りするための信号線を、「データバス (data bus)」と呼びます。
先ほどのアドレスバスは、基本的に、CPUから、各種デバイスへの
一方通行ですが、このデータバスは、CPUが行おうとするアクセスの
種類によって、データが流れる向きが変わります。
- 読み出し時: CPU ← 各種デバイス
- 書き込み時: CPU → 各種デバイス
なお一般にアクセスされるデータが1バイト(8ビット)単位であることから、
このデータバスを構成する信号線の数(バスの幅)は、
一般には8の倍数となります。
制御信号線とバスの動作
実際にCPUがアクセスを行うときには、アドレスバスとデータバスに加えて、
いくつかの制御信号線を用います。
この制御信号線は、どのようなアクセス(読み出しか書き込み、など)を行おうと
しているか、ということや、アクセスをするタイミング、を
指定するために用いられます。
この実験で用いるマイコンボード上のCPUでは、次の2つの制御信号線を
用います。
- RDn : 普段は「1」。CPUが各種デバイスから読み出しを行うときに「0」となる。
- WRn : 普段は「1」。CPUが各種デバイスに書き込みを行うときに「0」となる。
なおこれらの信号線の名称の最後に「n」がついていますが、
これは、これらの信号線が「負論理」であることを示しています。
つまり、「0」であることが意味がある、というわけです。
例えば「RDn」は、「0」のときに、「RD」(read: 読み出し)を行う、
ということをあらわします。
(ちなみに負論理である信号線をあらわすときに、語尾に「n」をつける代わりに、
信号名の上に横棒をつけて表記する方法もあります)
具体的には、CPUがあるデバイスに書き込みを行うときには、
次のような手順で各種信号線を制御します。
- アクセス対象を示すアドレスをアドレスバスに設定する
- アクセス対象に書き込もうとするデータをデータバスに設定する
- WRnを「0」にする
- (アクセス対象のデバイスは、アドレスバスに指定された場所に
データバスで指定されたデータを書き込む動作を行う)
逆に、CPUがあるデバイスから読み出しを行うときには、
次のような手順で各種信号線を制御します。
- アクセス対象を示すアドレスをアドレスバスに設定する
- RDnを「0」にする
- (アクセス対象のデバイスは、アドレスバスで指定された場所の
データを、データバスに設定する)
- CPUがデータバス上に現れたデータを読み込む
このように、アドレスバスで指定されたデバイスのみが、
データバスを用いてCPUとデータをやり取りする、というように、
データバスは、CPUと各種デバイスで共用されています。
いろいろなデバイスが共用で用いることから、「bus」と呼ばれるわけです。
バスの動作の観測
外部バスへのアクセスの記述方法
この実験で用いるマイコンボード上のCPUのためのプログラムでは、
ある特定のアドレスのデバイスへのアクセスのために、
例えば次のような記述方法を用います。
BYTE xdata hoge _at_ 0x4000;
この例では、0x4000番地へのアクセスを、「hoge」という1バイトの
変数を介して行う、という宣言をしています。
これにより、例えば0x4000番地へのアクセス(読み出しや書き込み)は、
次のように記述することができます。
hoge = 0x5a; // write to 0x4000
a = hoge; // read from 0x4000
また複数のアドレスで指定される領域をまとめて宣言することもできます。
例えば次の例では、0x6000番地から始まる256バイト(0x6000〜0x60ff)を
upi[]という配列を介して行う、という宣言をすることになります。
BYTE xdata upi[256] _at_ 0x6000;
これにより、例えば0x6000番地〜0x6003番地にまとめてデータ0x00を
書き込みたい時には、次のような記述をすればよいことになります。
for (i = 0; i < 4; i++) upi[i] = 0x00;
ちなみに実験第1の「パソコンによる計測インターフェース技術1」での
プログラムでは、サンプルプログラムの最初のほうに、おまじないのように
次のような記述をしていました。
BYTE xdata num1 _at_ 0x4001; // 1 digit of 7seg.LED
BYTE xdata num2 _at_ 0x4002; // 2 digit of 7seg.LED
BYTE xdata num3 _at_ 0x4003; // 3 digit of 7seg.LED
BYTE xdata sw _at_ 0x4004; // SWs
BYTE xdata led _at_ 0x4005; // LEDs
これは、先ほどのメモリマップに応じて、マイコンボード上の
スイッチ、LED、7セグメントへアクセスをするための「変数」を
宣言していたわけです。
ロジックアナライザを用いたバスの動作の観測
実際に、バスを介してCPUが各種デバイスにアクセスする様子を
観測することにしましょう。
バスの1本1本の信号線は、電圧の高低で、「0」「1」の値を
表現しています。
そのような電圧が、時間とともに変化する様子を観測すれば
よいわけですが、一般にバスは信号線の数が多いため、
オシロスコープを用いるのは困難です。
そこで、電圧の高低(0か1か)しかわからないのですが、
多くの信号線をまとめて観測できる、
ロジックアナライザ (logia analyzer)と呼ばれる計測器を用いるのが
便利です。
この実験では、ポケットロジアナPL-200というロジックアナライザを
用います。
こちらの
ロジックアナライザの使い方を参考に、使い方の概略を把握しましょう。
なおこのPL-200には、測定対象に接続する多くのケーブル(クリップつき)が
あります。
ケーブルの色と測定端子番号(チャンネル)との対応に注意しましょう。
こちらの写真の10本の信号線とチャンネル番号の対応は
次のとおりになっています。
Ch8 | Ch6 | Ch4 | Ch2 | GND |
GND | Ch7 | Ch5 | Ch3 | Ch1 |
右上と左下のGND(いずれも黒)は、電圧測定の基準として、
マイコンボード上のGND端子に接続します。
その他のCh1〜Ch8は、測定したい信号線の端子に接続します。
この実験で用いるマイコンボードのアドレスバス、データバス、制御信号線
(RDnとWRn)は、マイコンボードの端にある「CN-B」と示された
34本の端子(ヘッダピン)に現れています。
白い三角マーク(この写真のCN-Bの右上)のところが1番ピンで、
その下が2番ピン、上の段の次が3番ピン、という順で、
最後の左下端が34番ピンになっています。
それぞれのピンと現れている信号線の対応は次のとおりです。
ピン番号 | 信号名 | | ピン番号 | 信号名 |
1 | A0 | | 2 | A1 |
3 | A2 | | 4 | A3 |
5 | A4 | | 6 | A5 |
7 | A6 | | 8 | A7 |
9 | GND | | 10 | GND |
11 | A12 | | 12 | A13 |
13 | A14 | | 14 | A15 |
15 | GND | | 16 | GND |
17 | GND | | 18 | GND |
19 | GND | | 20 | GND |
21 | D0 | | 22 | D1 |
23 | D2 | | 24 | D3 |
25 | D4 | | 26 | D5 |
27 | D6 | | 28 | D7 |
29 | GND | | 30 | GND |
31 | WRn | | 32 | RDn |
33 | (VDD5) | | 34 | (VDD5) |
さきほどのPL-200のGNDケーブルは、いずれか1つを、
このコネクタCN-Bの「GND」のいずれか1つに接続しておきます。
そして、Ch1〜Ch8のケーブルは、測定をしたいピンに接続をします。
この実験で用いるマイコンボードの仕様では、
アドレスバスと2本の制御信号線は、常にコネクタCN-Bに
信号が現れますが、データバスは、
メモリマップ上で「外付けI/O装置」に割り当てられている
0x6000〜0x6fff番地をアクセス(書き込み)をするするときだけ、
コネクタCN-Bに信号が現れるようになっています。
演習3-2
「外付けI/O装置」に割り当てられているアドレスエリアのいずれかに
何らかのデータの書き込みを行うプログラムを記述し、
それを実行したときのバス、制御信号線の動作を、
ロジックアナライザで観測してみてください。
※次のような点に留意し、プログラムの記述や観測方法をよく考えること。
- 観測対象の信号の選択(PL-200は、最大で16本の信号しか観測できない)
- トリガの選択(観測したい信号をとらえるには、どの信号線をトリガにすればよいか)
- プログラムの記述内容(どのアドレスエリアをアクセスすればよいか)
※なおロジックアナライザでの観測結果は、ファイルに保存しておくとよい。
またこの結果(グラフ)は、レポートをまとめるときに必要になるので、
必要に応じてプリンタで印刷しておくこと。
演習3-3
また「外付けI/O装置」以外のアドレスエリア(例えばスイッチや7セグメントLED、
外付けRAMなど)にアクセスするプログラムを記述し、
それを実行したときのバス、制御信号線の動作を、
ロジックアナライザで観測してみてください。
戻る