連載
» 2006年10月27日 00時00分 公開

組み込みギョーカイの常識・非常識(3):CPU・MPUはどうやって動く?

CPU(MPU)の基礎知識をおさらいする。重要なのは「どこから命令を持ってくるか」と「どこに実行結果を書き込むか」の2点だ

[中根 隆康 フリー・アーキテクト/(株)ネクスト・ディメンション,@IT MONOist]

 これまでは、組み込みシステムの概要(概論)について書いてきましたが、今回からは、組み込みシステムを制御しているCPU(MPU)とその周辺について書いていきます。

 そもそもCPU(MPU)とは何なのでしょう。ちょっと調べてみると、下記のような説明になっています。


※【CPU(Central Processing Unit):中央処理(演算)装置】
コンピュータの頭脳ともいわれ、多数のトランジスタやICを組み合わせ、メモリに記憶されたプログラム(命令)を実行する装置


※【MPU(Micro Processing Unit):マイクロプロセッサ】
それまで多数のトランジスタ、ICで構成されていたCPUを1つのICで実現したもの


 「メモリに記憶されたプログラム(命令)を実行する装置」という説明は、分かったような分からないような表現ですね。では、プログラム(命令)とは? という話になってしまいますが、これに関しては、私の友人でもある、ソフィアシステムズの山本さんが書いている連載記事「H8で学ぶマイコン開発入門」を参考にしてください。

CPU・MPUの歴史を振り返ってみよう

 少し歴史を振り返ってみると、MPUが生まれてきたのは、1960年代後半の「電卓戦争」と呼ばれた開発競争がきっかけといわれています。

 この電卓に使うために、1971年に「インテル4004」という4ビットのMPUが発表されました。これが世界最初のMPUという定説になっているようです。その後TI(Texas Instruments社)の「TMS1050」が発表され、電卓が格段に安くなりました。このTMS1050が組み込みMPUの先祖とよくいわれています。

 1972年に「インテル8008」、1973年にNational Semiconductor社の「IMP-16」(最初の16ビットMPUといわれている)、1974年に「インテル8080」「モトローラMC6800」、1975年に「MOS Technology 6502」(Apple IIで使われ、派生品が任天堂のファミコンに使われた)、1976年に「ザイログZ80」(インテル8080互換でシャープのMZシリーズ、NECのPC-8000シリーズなどに使われた)、その後は「インテル8086」「MC6809」「MC68000」などが続々と生まれ、またその派生品も数多く生まれMPUのスピード競争に突入しました。ベテランのエンジニアやPC経験の長い方には、懐かしい名前もあるのではないでしょうか。

 現在ではCPUとMPUは特に区別せず、メーカーによってCPUといったり、MPUといったりしているようです。日本のメーカーであるルネサス テクノロジ(日立製作所と三菱電機の半導体部門を事業統合して設立)ではMCU(Micro Control Unit)または、マイコン(Micro computer)と呼んでいます(MCUは「Memory Control Unit」を指す場合もあるので注意してください)。

CPU・MPUの構造を知る

 少々歴史が長くなり過ぎましたが、裸のCPUが周りの機能を取り込み続けて、高機能なMPUに発展してきたといえます。この発展がなければ現在のPCも組み込みシステムもなかったでしょう。

 さて、このMPU(以後は、特に区別する必要がなければMPUで統一します)はどんな構造になっているかですが、組み込みシステムで一般的に使われるMPUの構造は図1のようなものです。

一般的なMPUの構造 図1 一般的なMPUの構造

 プロセッサの中はさらに、図2のような構造になっているものが一般的です。

一般的なプロセッサの構造 図2 一般的なプロセッサの構造/PC:Program Counter、ALU:Arithmetic and Logic Unit(演算回路)

 ここでは省略していますが、実際には多数の配線があり、各機能が密接に関係しています。最近のMPUは信じられないほどたくさんの機能が入っていますし、プロセッサが複数実装されているものも増えています(インテルの「Core 2 Duo」、AMDの「クアッドコア」、ルネサス テクノロジの「SH-X3」、数社共同開発の「CELL」など)。興味のある方は各MPUメーカーのハードウェア・マニュアルをダウンロードして調べてみるとよいでしょう。ただし、使われている用語が各メーカーでまちまちですし、メーカー独自の用語も出てきますので気を付けてください。

プロセッサはどうやって動くのか?

 脱線が多くてなかなか先へ進みませんが、プロセッサはどうやって動くのかです。CPUの説明で「メモリに記憶されたプログラム(命令)を実行する」というのを思い出してください。

 ここでいうメモリとは図1のROM(Read Only Memory)、またはRAM(Random Access Memory)が一般的です(図には描いていませんが、外部のROMやRAMを接続して使う場合もあります)。仮にプログラムがROMに記憶されているものとして説明すると、図3のような動きになります。

プログラム実行の流れ 図3 プログラム実行の流れ

 この流れはコンピュータの基礎知識を勉強した人には常識ですが、意外と忘れていたり、覚えていなかったりするのが、ROMのどこから命令を持ってくるのか、実行結果をRAMに書き込むのにどこに書き込むのかです。

 ROMのどこから命令を持ってくるかを示しているのが、図2にあるPC(Program Counter)という特殊なレジスタで、MPUに電源が入ると(Power ON Resetなどともいいます)特定の値になり、そこがプログラムの先頭になります。このPCの値が命令アドレスというもので、この値を変化させることでプログラムが先に進んだり、前に戻ったりができるわけです。

 RAMのどこに実行結果を書き込むかを示しているのが、図2にある汎用レジスタというものです。これは特殊なメモリだと思ってもらえばよいでしょう。汎用レジスタに入る値は計算に使う値だったり、RAMやROMの位置を示す値(データアドレス)だったりするので、汎用といわれるのはそこからきているようです。

 MPUによって汎用レジスタがいくつあるかは違っていますが、少ないとレジスタとメモリの間でのやりとりが増えますし、多過ぎてもまったく使われないレジスタがあって不経済だったりで、いくつがよいかは何ともいえません。16個くらいのものが多いようですが、理由はプロセッサを設計した人に聞いてみないと分かりません。このレジスタの大きさ(ビット数)が「何ビットCPU」かを決めています。

 今回、簡単に「命令をフェッチして」「命令をデコードして」「命令を実行して」「実行結果をライトバックして」と書いてしまいましたが、概略の流れだけは理解していただけたと思います。実際は、ただMPUに電気を流せばプログラムが動くわけではありません。おのおのの動作のタイミングを作る仕掛けが必要になりますね。それの大本になっているのが、図1の「発振器」というものですが、このあたりの説明は次回にしましょう。


 これから組み込みソフトウェアのエンジニアを目指す方は、PCや汎用レジスタのことを忘れないでくださいね。実際にプログラムを作ってデバッグをするようになったら、見なければならなくなることがきっとありますので。

 ご意見、ご要望などがありましたらできる限り取り込んでいきたいと思いますので、下記までメールをお送りください。(次回に続く)


Copyright © ITmedia, Inc. All Rights Reserved.