概要
あなたには本当にたくさんの選択肢があります。命令がどのように翻訳されるかについての私の見解を要約しますが、翻訳を始めたときに私が持っていたいくつかのオプションも提供します。
私のテイク
まず、バイナリ入力の観点から考えるのが最も簡単です。16 ビットのマイクロプロセッサがあるとします。(つまり、命令は 16 バイナリ ビットでエンコードされます。) 数値をレジスタに配置するアセンブリ操作 SET を考えてみましょう。例えば:
SET(R1, 12) // Stores 12 into register 1
任意に (標準的なアーキテクチャであっても、選択は本当に任意であるため)、SET 命令が次の 16 ビット バイナリ値 I に変換されるように選択します。
0001 0001 0000 1100
基本的に、私はちょうどコンベンションを作り上げました。しかし、これが私がそれを分解する方法です。ビットI [15:12] (ビッグ エンディアン表記で表される) が特定の命令を表すようにすることにしました。整数 1を命令SETに対応させることにしました。ここで、その規則を決定しました。SET 命令がある場合、ビット I[11:8] をレジスタに対応させると言えます。(明らかに、これは 16 個のレジスタしかないことを意味します: 4^2=16)。最後に、ビット I[7:0] を、特定のレジスタに格納するデータに対応させます。SET(R1, 12) をバイナリでもう一度見てみましょう (わかりやすくするために、4 つの各グループを改行で区切ります)。
if I = 0001 0001 0000 1100
I[15:12] = 0001 (binary) = 1 (decimal) = SET instruction
I[11:8] = 0001 (binary) = 1 (decimal) = R1 since I[15:12] correspond to SET.
I[7:0] = 0000 1100 (8-bit binary) = 12 (decimal) = value to store in R1.
ご覧のとおり、マイクロプロセッサ内の他のすべては非常に単純になります。RAMに4行の命令を保存するとしましょう。時計にカウンターが取り付けられています。カウンターは、RAM 内の行をカウントします。時計が「時を刻む」と、ラムから新しい命令が出てきます。(つまり、次の命令が RAM から出てきます。ただし、JUMP ステートメントを挿入すると、多少恣意的になる可能性があります。) RAM の出力は、複数のビット セレクターを通過します。ビット I[15:12] を選択し、それらをコントロール ユニット (CLU) に送信します。CLUは、伝達しようとしている命令を通知します。つまり、SET、JUMP などです。次に、見つかった命令に応じて、レジスタの書き込みを許可するか、レジスタの追加を許可するか、アーキテクチャに含めるものを選択できます。
ありがたいことに、マシン命令のバイナリ値の任意の規則が既に選択されています (それらに従う場合)。これは、まさに命令セット アーキテクチャ (ISA) によって定義されているものです。たとえば、MIPS、HERAなどです。明確にするために、回路などを設計するときに作成する実際の実装をマイクロアーキテクチャと呼びます。
学習リソース
テキスト
Harris と Harris の本は、学部のコンピューター アーキテクチャ コース向けの最も有名なテキストの 1 つです。とてもシンプルで使いやすいテキストです。全体は、ランダムな学校によって無料で PDF で入手できます。(すぐにダウンロードしてください!) とても役に立ちました。基本的な回路、離散数学のトピックについて説明し、第 7 章に到達するまでに、マイクロプロセッサの構築は簡単です。その本を読んでから、16 ビット マイクロプロセッサを完成させるのに 3 日ほどかかりました。(確かに、私は離散数学のバックグラウンドを持っていますが、それはそれほど重要ではありません。)
別の非常に役立つ非常に標準的な本は、ヘネシーとパターソンの本で、ランダムな学校から PDF 形式でも入手できます。(すぐにダウンロードしてください!)ハリスとハリスの本は、この本に基づいて簡略化されたものです。この本はもっと詳しく書かれています。
オープン ソース マイクロプロセッサ
そこにはオープンソースのマイクロプロセッサがたくさんあります。最初のマイクロプロセッサを構築するときに、それらを参照できることは非常に役に立ちました。Logisim ファイルを含むものは、それらをグラフィカルに表示し、クリックしてそのようにいじることができるため、特に楽しくプレイできます。以下に、私のお気に入りのサイトと特定の mp をいくつか示します。
4 ビット:
16 ビット:
Open Cores - このサイトはよくわかりません。私はアカウントを申請しましたが、彼らは実際には戻ってきていません... 大ファンではありませんが、あなたがアカウントを持っているなら、それは素晴らしいに違いないと思います.
ツール
ロジシム
前述したように、Logisimは優れたリソースです。レイアウトは完全にグラフィカルであり、ワイヤを選択することで、いつでもビット単位で何が起こっているかを非常に簡単に確認できます。それは Java で書かれているので、どんなマシンでも動作すると確信しています。また、グラフィカル コンピューター プログラミング言語の興味深い歴史的展望でもあります。
シミュレーション
Logisim では、実行中の実際のソフトウェアをシミュレートできます。ターゲットとする ISA にバイナリをコンパイルするコンパイラがある場合は、バイナリ ファイルまたは hex ファイルを Logisim RAM にロードしてプログラムを実行するだけです。(コンパイラがない場合でも、4 行のアセンブリ プログラムを作成し、それを自分で翻訳することは可能であり、すばらしい練習になります。) シミュレーションは、プロセス全体の中で最もクールで最も満足のいく部分です! :D Logisim は、これをよりプログラム的に行うためのCLIも提供します。
HDL
マイクロ アーキテクチャを生成/設計する最新の形式は、ハードウェア記述言語 (HDL) を使用することです。最も有名な例には、Verilog と VHDL が含まれます。これらは多くの場合 (紛らわしいことに!)、Ada や C/C++ などの逐次言語をモデルにしています。ただし、モデル/設計の検証がより適切に定義されるため、これははるかに好ましい設計方法です。私の意見では、グラフィックで調べるよりも、テキスト表現について推論する方がはるかに簡単です。プログラマーがコードをうまく整理できないのと同じように、ハードウェア開発者は、マイクロアーキテクチャのグラフィック デザインのグラフィック レイアウトをうまく整理できません。(ただし、この議論は確かに HDL に適用できます。) グラフィックよりもテキストで文書化する方が簡単であり、一般的に HDL を使用してよりモジュール的に設計する方が簡単です。
これを学ぶことに興味がある場合は、HDL を使用して回路とマイクロアーキテクチャを記述する方法について議論し、学習する、オープン カリキュラムと実習を伴う学部ハードウェア コースがたくさんあります。これらはグーグルで簡単に見つけることができます。または、次のステップ (C/C++ コードを HDL に変換するツール) を通じて HDL の学習を試みることもできます。興味があれば、Icarus Verilogは、Verilog 用の優れたオープン ソース コンパイラおよびシミュレータです。
シミュレーション
Icarus Verilog などのツールを使用すると、バイナリから実行される実際のプログラムを簡単にシミュレートすることもできます。バスを介してファイルまたは文字列を RAM にロードする別の Verilog スクリプトでマイクロプロセッサをラップするだけです。簡単です!:D
HLS
近年、高位合成 (HLS) も市場で大きな足場を築いています。これは、C/C++ コードを実際の回路に変換することです。既存の C/C++ は (常にではありませんが) ハードウェアに変換できるため、これは非常に驚くべきことです。
(すべての C/C++ コードが合成可能であるとは限らないため、必ずしもそうとは言えません。回路では、ビット ストリームはどこにでも一度に存在します。ソフトウェアでは、コードはシーケンシャルであると考えられます。ハードウェアを設計する!!)
しかし、ご想像のとおり、この機能は、行列演算や一般的な数学など、ハードウェア上のコードの特定の側面を最適化するのに非常に優れています。ただし、HLS ツールを使用して、内積の C 実装 (たとえば) がどのように HDL に変換されるかを確認できるため、これはあなたにとって重要です。個人的には、これは素晴らしい学習方法だと感じています。
シミュレーション
HLS シミュレーションは、高レベル コードが HDL に変換されるだけなので、HDL のシミュレーションと同じくらい簡単です。次に、上で説明したとおりにシミュレートしてテストを実行できます。