Renesas Synergy™

FAQ 1006590 : マイコンとメモリ

【はじめに】
通常、メモリにはプログラムやデータが記憶されており、マイコンが動作する上では必ずメモリをアクセスする必要があります。
マイコンは必要なときに記憶された内容を読み出したり、新たな内容を書き込んだりします。ところが、メモリには大量のプログラムやデータが記憶されているので、どのメモリの内容か、対象を正しく指定できないと必要なデータを得ることができません。このためにメモリには番地(アドレス)が割り当てられています。このため、アドレスを指定することで、対象のメモリを明確に指定することができるようになります。
これは電話機に1台ごとに電話番号が付いていて、ある番号をダイヤルすると必ず特定の電話機に接続されるのと同じと考えることができます。

78K0シリーズのような8ビットのマイコンではレジスタは8ビットで、通常扱うデータの大きさは8ビットになります。8ビットで区別(指定)できるメモリは256番地分です。通常は1番地あたりのメモリの大きさは8ビット(1バイト)ですから、メモリの大きさ(容量)を表すときの単位としてはバイトを使用します。256番地つまり256バイトのメモリではプログラムを格納するには不足します。そこで、8ビットのマイコンでは2つのレジスタを組み合わせて16ビットでメモリを指定することで65536バイトのメモリを使うことができます。このため、8ビットのマイコンでは指定できるメモリは65536バイトまでが普通でした。(65536では数字の桁数が大きくなりすぎるので、10ビットで指定できる1024バイトを補助単位のk(キロ)で表し、
216バイト=26×210バイト=64×1kバイト=64kバイト
と表します。)

 

同様に、その他の主なビット数に対しては
12ビットでは212バイト=22×210バイト=4×1kバイト=4kバイト、
14ビットでは214バイト=24×210バイト=16×1kバイト=16kバイト、
15ビットでは215バイト=25×210バイト=32×1kバイト=32Kバイト
20ビットでは220バイト=210×210バイト=1024×1kバイト=1Mバイト
24ビットでは224バイト=24×220バイト=16×1Mバイト=16Mバイト
30ビットでは230バイト=210×220バイト=1024×1Mバイト=1Gバイト
32ビットでは232バイト=22×230バイト=4×1Gバイト=4Gバイト
となります。


殆どの8ビットマイコンの応用では64Kバイトのメモリを扱うことができれば問題ありませんでした。実際、殆どの78K0や78K0Sでは数Kバイト~32Kバイト程度で、60Kバイト以上のメモリを内蔵している製品は限られます。ただし、一部の8ビットマイコンでは、フォントデータのような大量のデータを扱うためにプログラムは64Kバイトでもデータは1Mバイトまで指定できるものもありました。これも78K2と呼ばれていたマイコンでしたが、マイコンに64Kバイト以上のメモリを内蔵しているのではなく、外部メモリとして1Mバイトのメモリを扱えるだけでした。最近の、64Kバイト以上のメモリを扱える8ビットマイコン(78K0/Kx2)ではメモリそのものを内蔵しています。

 

初期の8ビットマイコンである8080の時代には、8KバイトのRAMを搭載したシステムでセルフによるアセンブラが動作していました。ちなみに、あのTK-80ではROMもRAMも各々1Kバイトもありませんでした。
また、初期の8ビット・シングルチップ・マイコンの8048ではROMが1KバイトにRAMが64バイトでした(最大でもROMを4KバイトとRAMを256バイトしか使えませんでした)。
これらの時代には64Kバイトははるか遠くの国境みたいなものです。最近は8ビットのマイコンでもこの境界を越えてしまっています。


【メモリのアクセス】
マイコンがメモリを使うために、メモリの番地を指定するときに、2つのことを考慮する必要があります。一つはプログラムでメモリを指定する方法です(これは論理的なメモリの指定方法です)。プログラムでメモリを指定するときにはレジスタを用います。実行するためのプログラムを読み出すためにはPC(プログラムカウンタ)と呼ばれる専用のレジスタを使用します。また、データを書き込んだり読み出したりする場合には、2つの8ビットのレジスタを組み合わせて16ビットのレジスタとして使います。
もう一つはハードウェアでの物理的なメモリの指定です。メモリの特定の番地を指定するには、指定するための信号線を使います。つまり、16ビットのレジスタを使い、16本のアドレス信号線を使って、64kバイトの中から目的のメモリを指定することができるようになります。その上で、制御信号によりデータを書き込んだり、読み出したりします。
マイコンでメモリを指定するときに16ビットで指定しますが、全ての場合に16ビットを使うとは限りません。メモリはいくつかの領域に分けられています。それにより、より簡単にメモリを指定することができるようになります。78K0や78K0Sと言った8ビットマイコンでSFR(周辺I/O機能が割り当てられた特殊機能レジスタ)領域やsaddr領域注と呼ばれるものです。これらの領域は専用の命令コードが割り当てられており、8ビットのアドレスのみでその領域中の目的の周辺機能やメモリを指定することができます。これは、電話では市内にかける場合には市外局番は指定する必要がないのと似ています。もちろん16ビットをフルに使って(市外局番からダイアルして)、指定することも可能です。

 

【雑談】
殆どの電話(プッシュフォン)にはワンタッチダイアルや短縮ダイアル機能がありますが、8ビットマイコンにも似たような機能があります。通常、サブルーチン・コールはアドレス指定に16ビット必要なので、命令は3バイトになります。しかし、1バイトでサブルーチンコールを行える(1プッシュで電話をかけられる)機能があります。それはCALLT命令と呼ばれる命令です。この命令ではサブルーチンのアドレスをある決まったテーブル(電話帳のようなものです)に前もって登録しておきます。専用の命令で、そのテーブルの番号を指定すると対応したアドレスをサブルーチン・コールできるのもです。また、CALLF命令と呼ばれる2バイトのサブルーチン・コール命令もあります。これはサブルーチンのアドレスを特定の領域に限定したものです。


以上のように、メモリが64kバイトに収まっている場合には、特に問題はないのですが、8ビットマイコンで64kバイト以上のメモリを指定させたい場合には問題があります(そのままでは指定ができません)。このときにアドレスを拡張する機能としては、比較的簡単なバンクスイッチング方式やより高機能のアドレス・リロケーション方式があります。バンクスイッチング方式は78K0/Kx2で使用されており、アドレス・リロケーション方式は16ビットのV53で使用されていました。
(メモリ・バンクのFAQも参照してください。)

注)saddr領域は78K0や78K0Sの0FE20H~0FF1FHに配置された領域です。他の領域に比べて、より高速にアクセスできたり、アクセスに使用できる命令が豊富であるといった特徴があります。この領域はレジスタが不足しているような場合に拡張されたレジスタとしての使い方ができます。

 

他にご質問がございましたら、リクエストを送信してください