マイクロプロセッサの仕組み

このページを読むために使用しているコンピュータは、マイクロプロセッサを使用して動作します。マイクロプロセッサは、デスクトップ マシンサーバーラップトップなど、通常のコンピュータの心臓部です。マイクロプロセッサには多くの種類がありますが、それらはすべてほぼ同じことをほぼ同じ方法で実行します。

マイクロプロセッサ ( CPUまたは中央処理装置とも呼ばれます) は、単一チップ上に製造された完全な計算エンジンです。最初のマイクロプロセッサは、1971 年に発売された Intel 4004 でした。4004 はそれほど強力ではありませんでした。実行できるのは加算と減算だけであり、一度に実行できるのは 4ビットだけでした。しかし、すべてがワンチップ上にあるのは驚きでした。 4004 が登場する前は、エンジニアはチップの集合体または個別のコンポーネント (トランジスタを1 つずつ配線したもの) からコンピュータを構築していました。 4004 は、最初のポータブル電子計算機の 1 つに動力を供給しました。

コンピュータのマイクロプロセッサが何をしているのか疑問に思ったことがある場合、またはマイクロプロセッサの種類の違いについて疑問に思ったことがある場合は、読み続けてください。この記事では、非常に単純なデジタル ロジック技術を使用して、ゲームをプレイする場合でも文書のスペル チェックを行う場合でも、コンピューターがその仕事をどのように実行できるかを学びます。

マイクロプロセッサの進歩: インテル

インテル 8080

1974 年に発表された、家庭用コンピュータ (ワン チップ上の完全な 8 ビット コンピュータ) に組み込まれた最初のマイクロプロセッサです。市場で本格的な話題となった最初のマイクロプロセッサは、1979 年に発表され、IBM PC に組み込まれた Intel 8088 でした。 (1982年頃に初めて登場しました)。 PC 市場とその歴史に詳しい方は、PC 市場が 8088、80286、80386、80486、Pentium シリーズ、Core シリーズ、Xeon シリーズへと移行したことをご存知でしょう。これらのマイクロプロセッサはすべてインテル製であり、すべて 8088 の基本設計を改良したものです。

2004 年以来、インテルは複数のコアと数百万個以上のトランジスタを備えたマイクロプロセッサを導入してきました。しかし、これらのマイクロプロセッサでも、以前のチップと同じ一般規則に従っています。

Intel Core i9 プロセッサには最大 8 つのコアを搭載でき、各コアはオリジナルの 8088 で実行されていたあらゆるコードを実行できますが、その速度はわずか約 6,700 倍です。各コアは複数の命令スレッドを処理できるため、コンピューターはタスクをより効率的に管理できます。

インテルの製品範囲は 1970 年代から大幅に拡大しました。この記事の執筆時点で、同社は依然としてコンピューター用の Pentium および Core CPU を製造していますが、より高性能な PC やサーバーには Xeon チップが使用される可能性があります。さらに、Intel は Celeron および Atom プロセッサラインを提供しています。 Celeron は初心者レベルのコンピュータ ユーザーを対象としており、Atom プロセッサはモバイル デバイスやモノのインターネットの一部であるデバイスに適しています。

インテルは依然として市場の大部分を占めていますが、競合他社と比べて相当以上のシェアを持っています。 AMD は PC プロセッサ市場で Intel と競合していますが、PC ゲーマーに人気のグラフィックス プロセッサ チップでも大きなビジネスを行っています。グラフィックチップで有名なNvidiaはCPUも製造しています。 2020年、AppleはMシリーズチップを導入しました。これは、AppleがMacintoshコンピュータに使用していたIntelチップを置き換えるものです。サムスンは独自のプロセッサ設計を採用しています。さらに多くの企業が、自動車やスマートホーム製品など、他のエレクトロニクス用途向けのプロセッサを開発しています。市場の競争はますます激化しています。

チップとは何ですか?

チップは集積回路とも呼ばれます。一般に、これはマイクロプロセッサを構成するトランジスタがエッチングされた小さくて薄いシリコン片です。チップは一辺が 1 インチほどの大きさで、数千万個のトランジスタを含む場合があります。より単純なモデルは、わずか数ミリメートル四方のチップ上にエッチングされた数千個のトランジスタで構成される場合があります。あらゆる種類のデバイスに、それぞれがプロセッサーである複数のコアを備えたチップが搭載されているのが一般的になってきました。

マイクロプロセッサロジック

インテル Pentium 4 プロセッサー。

マイクロプロセッサがどのように動作するかを理解するには、内部を調べてマイクロプロセッサを作成するために使用されるロジックについて学ぶことが役立ちます。その過程で、マイクロプロセッサのネイティブ言語であるアセンブリ言語や、プロセッサの速度を上げるためにエンジニアができることの多くについても学ぶことができます。

マイクロプロセッサは、プロセッサに何をすべきかを指示する一連の機械命令を実行します。命令に基づいて、マイクロプロセッサは 3 つの基本的なことを実行します。

  • マイクロプロセッサは、ALU (算術論理演算ユニット) を使用して、加算、減算、乗算、除算などの数学演算を実行できます。最新のマイクロプロセッサには、大きな浮動小数点数に対して非常に高度な演算を実行できる完全な浮動小数点プロセッサが組み込まれています。
  • マイクロプロセッサは、あるメモリ位置から別のメモリ位置にデータを移動できます。
  • マイクロプロセッサは決定を下し、その決定に基づいて新しい命令セットにジャンプできます。

マイクロプロセッサが行うことは非常に高度なものかもしれませんが、これらは 3 つの基本的な動作です。次の図は、これら 3 つのことを実行できる非常に単純なマイクロプロセッサを示しています。

マイクロプロセッサ

これはマイクロプロセッサとしては非常に簡単です。このマイクロプロセッサには次の機能があります。

  • アドレスをメモリに送信するアドレス バス(8、16、32、または 64 ビット幅)
  • メモリにデータを送信したり、メモリからデータを受信したりできるデータ バス(8、16、32、または 64 ビット幅)
  • アドレス指定された位置を設定するか取得するかをメモリに伝えるためのRD (読み取り) およびWR (書き込み) ライン
  • プロセッサーにクロックパルスをシーケンスさせるクロックライン
  • プログラム カウンタをゼロ (またはその他) にリセットし、実行を再開するリセット行

この例では、アドレス バスとデータ バスの幅が両方とも 8 ビットであると仮定します。

この単純なマイクロプロセッサのコンポーネントは次のとおりです。

  • レジスタ A、B、および C は、フリップフロップで作られた単純なラッチです。 (詳細については、 「ブール ロジックの仕組み」の「エッジ トリガー ラッチ」のセクションを参照してください。)
  • アドレス ラッチはレジスタ A、B、C と同じです。
  • プログラム カウンタは、指示されたときに 1 ずつインクリメントし、指示されたときに 0 にリセットする追加機能を備えたラッチです。
  • ALU は 8 ビット加算器と同じくらい単純なものにすることもできます (詳細については、 「ブール論理の動作方法」の加算器に関するセクションを参照してください)。あるいは、8 ビット値の加算、減算、乗算、除算ができる場合もあります。ここでは後者を仮定しましょう。
  • テスト レジスタは、ALU で実行される比較からの値を保持できる特殊なラッチです。 ALU は通常、2 つの数値を比較して、それらが等しいかどうか、一方が他方より大きいかどうかなどを判断します。また、テスト レジスタは通常、加算器の最終ステージからのキャリー ビットを保持することもできます。これらの値をフリップフロップに保存すると、命令デコーダはその値を使用して決定を下すことができます。
  • 図には「3-State」とマークされたボックスが 6 つあります。これらはトライステート バッファです。トライステート バッファは 1、0 を渡すことも、本質的にその出力を切断することもできます (出力が向かうワイヤから出力ラインを完全に切断するスイッチを想像してください)。トライステート バッファを使用すると、複数の出力をワイヤに接続できますが、実際にラインに 1 または 0 を駆動できるのはそのうちの 1 つだけです。
  • 命令レジスタと命令デコーダは、他のすべてのコンポーネントの制御を担当します。

この図には示されていませんが、命令デコーダからの制御ラインは次のとおりです。

  • 現在データバス上の値をラッチするように A レジスタに指示します。
  • 現在データバス上の値をラッチするように B レジスタに指示します。
  • ALU が現在出力している値をラッチするように C レジスタに指示します。
  • プログラム カウンタ レジスタに、現在データ バス上の値をラッチするように指示します。
  • 現在データバス上の値をラッチするようにアドレスレジスタに指示します。
  • 現在データバス上の値をラッチするように命令レジスタに指示します。
  • プログラムカウンタにインクリメントするように指示します
  • プログラムカウンタにゼロにリセットするように指示します
  • 6 つのトライステート バッファのいずれかをアクティブ化します (6 つの個別の行)
  • ALU に実行する操作を指示します
  • ALUのテストビットをラッチするようにテストレジスタに指示します。
  • RDラインをアクティブにする
  • WRラインをアクティブにする

命令デコーダには、命令レジスタからのビットだけでなく、テスト レジスタとクロック ラインからのビットも入ります。

マイクロプロセッサメモリ

前のセクションでは、アドレス バスとデータ バス、および RD ラインと WR ラインについて説明しました。これらのバスとラインは、RAM または ROM のいずれか (通常は両方) に接続します。私たちのサンプル マイクロプロセッサには、8 ビット幅のアドレス バスと 8 ビット幅のデータ バスがあります。これは、マイクロプロセッサが 256 バイトのメモリをアドレス指定でき、一度に 8 ビットのメモリを読み書きできることを意味します。この単純なマイクロプロセッサには、アドレス 0 から始まる 128 バイトの ROM と、アドレス 128 から始まる 128 バイトの RAM があると仮定します。

ROM は読み取り専用メモリの略です。 ROM チップは、事前に設定されたバイトの永続的なコレクションでプログラムされています。アドレス バスは、どのバイトを取得してデータ バスに配置するかを ROM チップに指示します。 RD ラインの状態が変化すると、ROM チップは選択されたバイトをデータ バス上に表示します。

RAMはランダムアクセスメモリの略です。 RAM には情報バイトが含まれており、マイクロプロセッサは、RD ラインまたは WR ラインに信号が送られているかどうかに応じて、それらのバイトを読み書きできます。現在の RAM チップの問題の 1 つは、電源が切れるとすべてを忘れてしまうということです。そのため、コンピュータにはROMが必要です。

ちなみに、ほぼすべてのコンピュータにはある程度の ROM が含まれています (RAM を含まない単純なコンピュータを作成することは可能です。多くのマイクロコントローラは、プロセッサ チップ自体に数バイトの RAM を配置することでこれを実現しています)。しかし、一般に、RAM を含まない単純なコンピュータを作成することは不可能です。 ROMは含まれていません)。 PCでは、ROM はBIOS (Basic Input/Output System) と呼ばれます。マイクロプロセッサが起動すると、BIOS で見つかった命令の実行を開始します。 BIOS 命令は、マシン内のハードウェアのテストなどを実行し、ハード ディスクに移動してブート セクターをフェッチします (詳細については、 「ハード ディスクの仕組み」を参照してください)。このブート セクターも小さなプログラムであり、BIOS はディスクから読み取った後、RAM に保存します。次に、マイクロプロセッサは RAM からブート セクタの命令の実行を開始します。ブート セクター プログラムは、ハードディスクから何か他のものを RAM にフェッチするようにマイクロプロセッサに指示し、マイクロプロセッサはそれを実行します。これは、マイクロプロセッサがオペレーティング システム全体をロードして実行する方法です。

マイクロプロセッサの命令

前の例で示した信じられないほど単純なマイクロプロセッサであっても、実行できるかなり大規模な命令セットがあります。命令のコレクションはビット パターンとして実装されており、それぞれが命令レジスタにロードされるときに異なる意味を持ちます。人間はビット パターンを記憶するのがあまり得意ではないため、さまざまなビット パターンを表すために一連の短い単語が定義されます。この単語の集合はプロセッサのアセンブリ言語と呼ばれます。アセンブラはワードをそのビット パターンに非常に簡単に変換でき、アセンブラの出力はマイクロプロセッサが実行できるようにメモリに配置されます。

この例では、設計者が単純なマイクロプロセッサ用に作成するアセンブリ言語命令のセットを次に示します。

  • LOADA mem – メモリ アドレスからレジスタ A をロードします
  • LOADB mem – メモリ アドレスからレジスタ B をロードします
  • CONB con – 定数値をレジスタ B にロードします
  • SAVEB mem – レジスタ B をメモリ アドレスに保存します
  • SAVEC mem – レジスタ C をメモリ アドレスに保存します
  • ADD – AとBを加算し、結果をCに格納します。
  • SUB – A と B を減算し、結果を C に保存します
  • MUL – A と B を乗算し、結果を C に格納します
  • DIV – A と B を除算し、結果を C に格納します
  • COM – A と B を比較し、結果をテストに保存します
  • JUMP addr – アドレスにジャンプします
  • JEQ addr – 等しい場合、アドレスにジャンプします
  • JNEQ addr – 等しくない場合はアドレスにジャンプします
  • JG addr – アドレスより大きい場合は、そのアドレスにジャンプします
  • JGE addr – アドレス以上の場合、アドレスにジャンプします
  • JL addr – アドレスより小さい場合は、そのアドレスにジャンプします
  • JLE addr – 以下の場合、アドレスにジャンプします
  • STOP – 実行を停止します

「How C Programming Works」を読んだことがあれば、この単純な C コードが 5 の階乗を計算することをご存知でしょう (5 の階乗 = 5! = 5 * 4 * 3 * 2 * 1 = 120)。

a=1;f=1;while (a <= 5){ f = f * a; a = a + 1;}

プログラムの実行が終了すると、変数fには 5 の階乗が含まれます。

アセンブリ言語

C コンパイラは、この C コードをアセンブリ言語に変換します。このプロセッサの RAM がアドレス 128 から始まり、ROM (アセンブリ言語プログラムを含む) がアドレス 0 から始まると仮定すると、単純なマイクロプロセッサの場合、アセンブリ言語は次のようになります。

// a がアドレス 128 にあると仮定します。// F がアドレス 1290 にあると仮定します。 CONB 1 // a=1;1 SAVEB 1282 CONB 1 // f=1;3 SAVEB 1294 LOADA 128 // a > 5 の場合、175 にジャンプしますCONB 56 COM7 JG 178 LOADA 129 // f=f*a;9 LOADB 12810 MUL11 SAVEC 12912 LOADA 128 // a=a+1;13 CONB 114 ADD15 SAVEC 12816 JUMP 4 // if17 STOP にループバック

ロム

ここで問題となるのは、「これらすべての命令は ROM 内でどのように見えるのか?」ということです。これらのアセンブリ言語命令はそれぞれ 2 進数で表す必要があります。わかりやすくするために、次のように、各アセンブリ言語命令に一意の番号が与えられていると仮定します。

  • ローダ – 1
  • ロードブ – 2
  • コンブ – 3
  • セーブ – 4
  • SAVEC メモリ – 5
  • 追加 – 6
  • サブ-7
  • MUL-8
  • DIV-9
  • COM-10
  • ジャンプアドレス – 11
  • JEQ アドレス – 12
  • JNEQ アドレス – 13
  • JGアドレス – 14
  • JGE アドレス – 15
  • JLアドレス – 16
  • JLE アドレス – 17
  • ストップ – 18

この番号はオペコードとして知られています。 ROM では、この小さなプログラムは次のようになります。

// a がアドレス 128 にあると仮定します。// F がアドレス 129 にあると仮定します。Addr opcode/value0 3 // CONB 11 12 4 // SAVEB 1283 1284 3 // CONB 15 16 4 // SAVEB 1297 1298 1 // LOADA 1289 12810 3 // CONB 511 512 10 // COM13 14 // JG 1714 3115 1 // LOADA 12916 12917 2 // LOADB 12818 12819 8 // MUL20 5 // SAVEC 12921 12922 1 // LOADA 12823 12824 // コンブ 125 126 6 // ADD27 5 // SAVEC 12828 12829 11 // ジャンプ 430 831 18 // 停止

7 行の C コードが 18 行のアセンブリ言語になり、ROM では 32 バイトになったことがわかります。

デコード

命令デコーダは、各オペコードを、マイクロプロセッサ内のさまざまなコンポーネントを駆動する一連の信号に変換する必要があります。 ADD 命令を例として、その命令が何を行う必要があるかを見てみましょう。

  1. 最初のクロック サイクル中に、命令をロードする必要があります。したがって、命令デコーダは次のことを行う必要があります。
  2. プログラムカウンターのトライステートバッファーをアクティブにする
  3. RDラインをアクティブにする
  4. データイントライステートバッファをアクティブにする
  5. 命令を命令レジスタにラッチする
  6. 2 番目のクロック サイクル中に、ADD 命令がデコードされます。必要なことはほとんどありません。
  7. ALUの演算を加算に設定します
  8. ALUの出力をCレジスタにラッチします。
  9. 3 番目のクロック サイクル中に、プログラム カウンタがインクリメントされます (理論的には、これを 2 番目のクロック サイクルに重ねることができます)。

すべての命令は、マイクロプロセッサのコンポーネントを適切な順序で操作する、このような一連の一連の操作として分解できます。この ADD 命令のような一部の命令は、2 クロック サイクルまたは 3 クロック サイクルかかる場合があります。他のものは 5 または 6 クロック サイクルかかる場合があります。

マイクロプロセッサのパフォーマンスと傾向

利用可能なトランジスタの数は、プロセッサのパフォーマンスに大きな影響を与えます。前に示したように、8088 などのプロセッサの一般的な命令の実行には 15 クロック サイクルかかりました。乗算器の設計により、8088 で 1 回の 16 ビット乗算を実行するだけで約 80 サイクルかかりました。トランジスタの数が増えると、シングル サイクル速度が可能なさらに強力な乗算器が可能になります。

トランジスタを増やすと、 と呼ばれる技術も可能になります。パイプライン アーキテクチャでは、命令の実行が重複します。したがって、各命令の実行に 5 クロック サイクルかかるとしても、実行のさまざまな段階で 5 つの命令が同時に存在する可能性があります。こうすることで、1 つの命令が各クロック サイクルで完了するように見えます。

最新のプロセッサの多くには複数の命令デコーダがあり、それぞれに独自のパイプラインがあります。これにより、複数の命令ストリームが可能になり、各クロック サイクル中に複数の命令を完了できることになります。この手法は実装が非常に複雑になる可能性があるため、多くのトランジスタが必要になります。

トレンド

最近ではプロセッサがどこにでも普及しているように見えますが、その傾向は衰えていないようです。研究者たちは、 などのアイテムを有効にする方法を発見しました。研究者たちは、プロセッサを操作するために を使用する方法に取り組んできました。おそらく、今後の最大の変化は、問題解決に 1 と 0 の使用に限定されない量子コンピューターの開発です。これらのコンピューターはより効率的に機能しますが、デスクトップに量子コンピューターがすぐに登場する可能性は低いでしょう。

64ビットマイクロプロセッサ

マイクロプロセッサ

64 ビット プロセッサは 1992 年から使用されており、21 世紀には主流になりました。これらのプロセッサには、64 ビット ALU、64 ビット レジスタ、64 ビット バスなどが備わっています。

世界が 64 ビット プロセッサを必要とする理由の 1 つは、アドレス空間が拡大しているためです。 32 ビット チップは、多くの場合、最大 2 GB または 4 GB のRAM アクセスに制限されます。ほとんどの家庭用コンピュータが 256 MB ~ 512 MB の RAM しか使用していなかった時代には、これは大変な量のように思えました。しかし、21 世紀の家庭用コンピューターは、データ (非常に複雑なデータには多くの実数が含まれる) をより速く処理できるようになりました。ビデオ編集を行う人や、非常に大きな画像の写真編集を行う人は、この種のコンピューティング能力の恩恵を受けます。ハイエンドのゲーマーも、より詳細な高解像度のゲームから恩恵を受けることができます。

64 ビット RAM アドレス空間は当面は本質的に無限であるため、64 ビット チップによりさらに多くの選択肢が広がります。2^64 バイトの RAM は 10 億ギガバイトのオーダーに相当します。マザーボード上の 64 ビット アドレス バスと幅広の高速データ バスにより、64 ビット マシンはハードディスク ドライブビデオ カードなどへの I/O (入出力) 速度も高速になります。これらの機能により、システムのパフォーマンスが大幅に向上します。