マイコンの構造と処理1

本ページでは,まずマイコンの内部構造について説明する.構造とは,アーキテクチャと呼ばれ,元々は建築系の業界で使われている用語のようである.

さて,マイコンの内部の構造について説明する前に,計算機の歴史2で説明したようにプログラム内蔵型のコンピュータを提唱した人の名を使い,プログラム内蔵型のコンピュータのことを「ノイマン型コンピュータ」と(慣例に従って)呼ぶ.従って,現在のコンピュータの全てがノイマン型コンピュータであると言っても過言ではない.

プログラムを内蔵できるコンピュータが登場する前は,物理的に配線を付け替えたてプログラミングを行うと言ったとんでもなく大変な作業が必要であったが,命令をメモリに記憶できる数値として表現し,メモリ内部に記憶することができれば,手作業で配線の付け替えを行う必要はなく,スイッチなどを使いプログラミングを行うことができるので,従来に比べプログラミングの作業効率は格段に向上する.

ノイマン型コンピュータは,図1のように「演算・制御装置」「主記憶装置」「入出力装置」で構成されており,入出力装置から入力されたデータを主記憶装置(メモリ)に格納されたプログラム(命令の羅列)に従って順次実行して,結果を入出力装置から出力するというものである.このとき,プログラム(命令の羅列)を格納する主記憶装置(メモリ)と演算対象となるデータや演算途中のデータなどは,プログラムと同じ主記憶装置(メモリ)内に格納する仕組みとなっている.

 図1:ノイマン型コンピュータのイメージ

 図1は,ノイマン型コンピュータのイメージである.次にアーキテクチャについて紹介する.アーキテクチャとは構造を意味する.マイコンの場合,内部の演算・制御装置(CPU)や主記憶装置(メモリ)などをどのように配置してどのように接続するかを意味すると考えればよい.美しいアーキテクチャ,シンプルなアーキテクチャがよいものとは限らないが,所詮回路なので,複雑なものよりシンプルなものの方が部品点数が減り,低価格での販売を実現できるのは間違いがない.


 プリンストンアーキテクチャとハーバードアーキテクチャ

アーキテクチャは2つに大別される.1つは,プリンストンアーキテクチャ.もう1つはハーバードアーキテクチャである.どちらも有名な大学の名前がついたアーキテクチャである.

プリンストンアーキテクチャは,ジョン・フォン・ノイマンが所属していたプリンストン大学にちなんでプリンストンアーキテクチャと呼ばれる.一般的かどうかは不明であるが,ノイマンアーキテクチャと呼ばれる方が多いかもしれないが,ノイマン型コンピュータと区別するために,本ページでは,プリンストンアーキテクチャと呼ぶこととする.プリンストンアーキテクチャは,図2のようなアーキテクチャとなっておりノイマンが提唱したプログラム内蔵方式のコンピュータにおいて,プログラム(命令の羅列)とデータが同一メモリに存在する.同一メモリ上にプログラムとデータが共存することになるが,あるところで分けられており,メモリの番地(アドレス)でプログラムの領域とデータの領域を使い分けている.

たとえ,物理的にプログラムメモリとデータメモリが別れていたとしても,それらの情報を伝達するバスが1種類で,論理的に同一メモリ上に存在するような仕組みを持っておりものはプリンストンアーキテクチャと同じであると言える.

図2:プリンストンアーキテクチャ

プリンストンアーキテクチャでは,同じメモリ上にプログラムとデータが共存している.そのため,図2のようにプログラムとデータのアクセスには,同じデータバスとアドレスバスを使用することになる.つまり,メモリ内の命令にアクセスしているとき,データにアクセスできないのが問題になる.

ここで,「**バス」という表現が使用されているがこれは,複数の配線の束で1つの役割を果たすようなとき,その配線の束を「**バス」と呼ぶ.今回の場合,「アドレスバス」とは,メモリのアドレスを示すための配線の束を意味し,メモリの縦方向の長さを示すと考えても良い.また,「データバス」とは,その名の通り,データをやり取りするための配線の束で,プリンストンアーキテクチャの場合,データのほかに命令もこのバスを使うことになる.このデータバスの配線の本数は,メモリの横方向の長さを示すと考えても良い.

例えば,データバスが8ビット(8本の配線)で,アドレスバスが16ビット(16本の配線)のとき,横方向が8ビットなので,1つのアドレスに対して1バイトのデータが格納できると考えられる.そして,アドレスバスが16本あるので,216のアドレスが選択可能である.216は,210でキロ(k)となるので,26キロとなる.従って,64キロ分のアドレスがあり,アドレス1つに1バイトのデータなので,このメモリの容量は64kバイトであることが計算により求められる.逆に,メモリの容量がわかっており,データバスのサイズがわかればアドレスバスのサイズを計算により求めることも可能となる.

ハーバードアーキテクチャは,ハワード・エイケン(Howard Hathaway Aiken, 1900年3月8日 – 1973年3月14日)が1944年に完成させたHarvard Mark I に使っていたアーキテクチャである.ハワードは,図3のようにプログラムを格納する領域とデータを格納する領域をそれぞれ別の役割があるという思想から物理的に分けた.これがハーバードアーキテクチャである.

図3:ハーバードアーキテクチャ

ハーバードアーキテクチャは,プログラムメモリとデータメモリを物理的に分離させたことで,命令を読み出し中にデータにアクセスできることを可能とした.しかし,アドレスバスやデータバスの他にプログラムバス(命令バス)が必要であり,回路としては圧倒的にプリンストンアーキテクチャより複雑となる.

しかし,後で説明するが,命令とデータを同時に扱えることにより処理としてはかなり高速になる.

近年のマイコンには,ハーバードアーキテクチャを採用したものも少なくないが,プリンストンアーキテクチャを採用しているものも多く存在している.どちらのアーキテクチャがどれだけの割合を占めているかは不明であるが,旧来はプリンストンアーキテクチャが多かったように思われるが,最近がハーバードアーキテクチャも非常に多く登場しているように感じている.

一般ユーザがあまり気にして使うことは無いと考えられるが,計算機科学を学んでいる人や実際にマイコンを設計する人などはこの違いをきちんと知っておくべきである.


命令セットアーキテクチャ

ここで説明するアーキテクチャとは,命令セットアーキテクチャと呼ばれるもので,マイコンで実行される命令の構造のことである.ここでは,RISC(Reduced Instruction Set Computer)とCISC(Complex Instruction Set Computer)の違いについて説明する.命令の構造は,RISCとCISCの他にも存在するがそれについてはここでは説明しない.

歴史的には,CISCの方が早く登場している.そもそもプログラムを内蔵するという考え方が登場したのが,1940年代で,商用のコンピュータが登場したのが,その10年後なのである.そして,本格的にコンピュータを販売して商売を始めたのが,1970年代なのである.その間,コンピュータは確実に進化し続けている.その進化の過程で,RISCが登場したのである.

まずは,コンピュータを動かす命令とはどのような形態をしているのかについて説明する.コンピュータを動かす命令は,図4のように命令(オペコード)とその命令の入力値(オペランド)から構成されている.

図4:命令セットアーキテクチャ

例えば,4+5を考えたとき,+(プラス)を ADDというオペコードを使ったとすると,図5のようにオペコードをADDとして,2つのオペランドとして4と5を持って表現される.このようにオペコードは命令,オペランドはその命令に入力される値を示している.これが命令の基本的な構造(アーキテクチャ)である.

図5:命令セットの例

それでは,CISCについて説明する.CISCを日本語にすると「複合命令セットコンピュータ」と呼ばれる.つまり,広域な幅広い命令の集合を持ったコンピュータであると解釈できる.複雑な命令をいくつも作り,1命令で複雑な処理をさせてしまうという考えである.

例えば,3+5+6を計算するのに,先ほどの ADD 命令を2回行えばよいのだが,それをわざわざ ADDW などの命令を用意して,ADDW 3,5,6 と書く.このように,複雑な処理を行うときにそのための命令を新規に作っていた.

このように複雑な処理が1命令でできるのは確かに効率的かもしれない.しかし,命令が複雑になればなるほど,オペコード部分の長さが長くなる.オペランドも命令によって個数が異なり,命令全体としては可変長となる.

可変長が悪い訳ではないが,図6のようにプログラムメモリの使用効率を考えると無駄遣いをしていることとなる.プログラムメモリはアドレスがついている先頭ビットから順に命令を読み出す.つまり,a番地のmビット目からのように番地を指定してさらに任意ビットを指定してそこから命令を読み出すことはできない.つまり,命令が可変長であるということは,プログラムメモリの所々に空きができてしまい,効率的にプログラムメモりを使用していないことになる.

 

図6:CISC命令でのメモリの利用

コンピュータの進化の過程で,1964年にIBMが発売したSystem 360(IBM360)というコンピュータの命令がRISCの原点であると言われている.このコンピュータには,複雑な命令を排除して,極基本的な命令のみを実装した.この命令セットをRISCと名付けたために,それまでの命令セットをCISCと名付けたのである.

RISCの利点は,メモリを効率よく利用できる.つまり,RISCの命令セットでは,命令は全て固定長なのである.オペランドやオペコードの長さに違いはあるものの,命令全体の長さは固定なので,図7のように全ての命令がプロうグラムメモリに空なくきちんと収まるのである.

 

図7:RISC命令でのメモリの利用

しかし,RISCの利点はこれだけでは無かった.後で説明するが,パイプライン処理と呼ばれる処理に非常に適した命令セットアーキテクチャであった.


 リトルエンディアンとビッグエンディアン

データメモリに格納されるデータは,基本的にはバイト単位である.1バイトからnバイトまで様々ではあるが,マイコンのCPUの処理能力にあわせて,ほとんどの場合が1バイト,2バイト,4バイトと2 バイト単位で扱われ,データメモリに格納される.1バイトのデータについてはエンディアンは気にする必要はないが,2バイト以上になったとき,エンディアンを気にする必要がある.

エンディアンの説明の前に,基本的な用語について説明しておく,慣例的に図8のように左側が上位ビット,右側が下位ビットの順にビットを並べる.また,ビットの名称としては,ビット0 からビット7 と呼ぶ.「5ビット目」と言った呼び方をすると,ビット4なのかビット5なのか明確ではないので,本ページでは,「ビットn」と,そのビットの名称で呼ぶこととする.そして,最上位ビットと最下位ビットには,特別な名前がつけられている.最上位ビットをMSB(Most Significant Bit) と呼び,最下位ビットをLSB(Least Significant Bit)と呼ぶ.

 

 図8:MSBとLSB

次にエンディアンの説明を行う.まず,直感的に分かりやすいようにビッグエンディアンから説明する.図9がビッグエンディアンの並びである.ここでは例として4バイトのデータ(16進数で0x12345678)の並びを示している.図9を見てわかるように,ビッグエンディアンでは,データメモリのアドレスの小さい方から,データの上位バイトが配置される.

図9:ビッグエンディアン

補足:1バイトは,8ビットで表現される.8ビットは2進数で8桁を意味する.これを16進数で表すと2桁で表現されるのである.

図10:リトルエンディアン

図10がリトルエンディアンである.バイト単位でのビットの並びは変化せず,バイト単位で並び順が逆になっている.16進数で0x12345678 を考えるとリトルエンディアンでは,図10のように 0x78,0x56,0x34,0x12 の順にメモリのアドレスの小さい順に格納される.ここで,勘違いしてはならないのは,入れ替わるのはバイト単位であり,ビットの並びが逆順になる訳ではない.

リトルエンディアンの利点は,加算を考えるとよくわかる.まず,データメモリへのアクセスはアドレスの小さい順でアクセスされる.それを利用いて,データメモリからデータを1バイト取り出し,加算すると,最下位桁からの桁上がりがあるかないかがわかる.そして,次の1バイトを取り出し,桁上がりを考慮して加算することが可能である.

ビッグエンディアンでは,データ全てを取り出してから加算をしなければ各桁の桁上りを知ることはできないがリトルエンディアンでは1バイトを取り出すたびに加算回路にデータを送れば短時間で演算できる.

上述したようなエンディアンの違いはマイコンに限らずさまざまなデータフォーマットで見受けられる.画像のファイルフォーマットやファイルシステムにはリトルエンディアンが採用されている.しかし,ネットワークのデータがビッグエンディアンを採用したため,リトルエンディアンのマイコンはユーザプログラムによるデータの入れ替えが必要になる.


 

Copyright © 2012-2020 ミームス(MEMEs)のサポートページ All rights reserved.
This site is using the Desk Mess Mirrored theme, v2.5, from BuyNowShop.com.