この記事は、Minecraft における レッドストーン コンピューター の設計と実装を調べることを目的としています。この記事は、オタクにとって非常に複雑です。
Minecraft でコンピューターを構築するための詳細なチュートリアルと、例を拡張および改善する方法については、第 1 章「コンピューターの構築に関するチュートリアル」を参照してください。コンピュータ サイエンスの広範な知識は必要ありません。終了していません。
Minecraft でのレッドストーン コンピューターの設計と理解に関する基本的なコンピューターの概念については、第 2 章「レッドストーン コンピューターの計画」を参照してください。コンピュータ サイエンスの広範な知識は必要ありません。
概要[]
コンピュータは、プログラミングを通じて人間から伝えられたアイデアの実装を容易にします。
この記事では、読者がレッドストーンとコンピューターに基本的なレベルまで精通していることを前提として、Minecraft でのコンピューターの設計と構築の基本について説明します。
コンピューターの仕組みを知らずにコンピューターを構築する方法はありません。このチュートリアルでは、知っておく必要があるすべてのことを説明しようとしていますが、各タブの前提条件セクションに記載されているコンピューター サイエンスのあちこちを少し理解する必要があります。カバーする最も深い部分は、IGCSE CS までです。
すべてのコンピュータ システムには、少なくとも 1 つの処理装置があります。動作中、処理ユニットはコンピュータのメモリに格納された命令を実行します。Minecraft コンピューターを使い始めるには、コンピューター サイエンスを学ぶ必要があります。コンピューター サイエンスを学ぶための情報源やチュートリアルは数多くありますが、基本的なスタートとして、コンピューター サイエンスのクラッシュ コース、特にエピソード 1 ~ 8 を視聴することをお勧めします。完全に網羅しているわけではありませんが、コンピュータを理解するための基礎として役立ちます。
Minecraft のほとんどのコンピューターは、レッドストーンダスト、レッドストーントーチ、および リピーター で構成されており、粘着ピストン または レッドストーンランプ を使用して制御されます。 ボタン、レバー、感圧板 などの複数の種類があるスイッチを使用する。他の提案されたアイデア (カバーされていません) は、ホッパー、トロッコ、またはレッドストーン付きのボートを使用することです。
Minecraft でのコンピューターの構築に関する詳細なチュートリアルと、与えられた例を拡張および改善する方法については、第 1 章「コンピューターの構築に関するチュートリアル」を参照してください。説明されるため、コンピューターサイエンスの広範な知識は必要ありませんが、非常に深く掘り下げます。
Minecraft でのレッドストーン コンピューターの設計と理解に関する基本的なコンピューターの概念については、第 2 章「レッドストーン コンピューターの計画」を参照してください。コンピュータ サイエンスの広範な知識は必要ありませんが、かなり深く掘り下げます。
実装[]
コンピューターは、スマート ハウスの作成からアドベンチャー マップの実行まで、さまざまな方法で使用できます。ただし、以下で説明する Minecraft のコンピューターの制限により、コンピューターは抽象的な概念のままであり、CPU アーキテクチャと組み込みシステムの下位レベルの概念を理解するための優れたツールとして機能します。
コンピュータと電卓を際立たせているのは、電卓はユーザー入力なしでは複数の命令を連続して実行できないことです。コンピューターは、フロー内の命令を比較および評価して、タスクを実行できます。
しかし、Minecraft では非常に遅く、サイズが大きいため、レッドストーン コンピューターの実用的なアプリケーションを見つけるのは困難です。最速のレッドストーン コンピューターでさえ、1 つの計算を完了するのに数秒かかり、数千ブロックのスペースを占有します。コマンド ブロックは、その速度と読みやすい高レベルのコマンドにより、Minecraft のコンピューターよりもはるかに優れています。
TickrateChanger は、ゲームのティック レートを変更します。
第 1 章: コンピュータの構築に関するチュートリアル[]
導入と前提条件[]
レッドストーン ロジックは単純なバイナリ ロジックを厳密に反映しています。レッドストーンはオンまたはオフのいずれかであり、したがって 1 または 0 として解釈される可能性があります。このチュートリアルでは、基本的なバイナリ ロジックとさまざまな単純なコンピューター サイエンス用語を参照します。バイナリとバイナリへの変換を解説した秀逸な記事があります。「コンピューターを構築するアーキテクチャ」セクションを読んで、コンピューターを計画するためにそれに従います。これはこの記事にあります。ありがとうございます。
この章では、単純な 8 ビット コンピューターを作成するためのレッドストーンの知識と操作の適用に焦点を当て、 作成方法とその動作について説明します。
すべての科目は (THEORY) と (PRACTICE) に分割され、THEORY では何が行われるかを正確に詳しく説明します。PRACTICE では、Minecraft でのビルド方法、外観、世界でのダウンロードについて説明します。」
The computer we will be building (MASIC Computer)
Step 1: Memory and Address Decoders (THEORY) (NOT FINISHED)
Step 1: Memory and Address Decoders (PRACTICE)
Step 2: Building an Arithmetic Logic Unit (THEORY)
Step 2: Building an Arithmetic Logic Unit (PRACTICE) (NOT FINISHED)
Step 3: Instruction set and machine architecture (THEORY)
Step 3: Instruction set and machine architecture (PRACTICE) (NOT FINISHED)
Minecraft のコンピューターには、目前のタスクに最も適したコンピューターを作成するための 3 つの主な設計目標があります。考慮すべきトレードオフがあります。たとえば、コンピューターが大きくなるほど、レッドストーン リピーターの数が距離によって増加するため、速度が遅くなります。メモリが多いほど、速度が遅くなり、サイズが大きくなります。
- コンパクトさ
コンピューターはどれくらい小さいですか?Minecraft でサバイバル コンピューターを設計すると、この点が強調される可能性が高くなります。サイズが大きくなるにつれて、必要な繰り返し回数が増えます。
- メモリー
どのくらいのメモリを保持できますか? 何ビットまで数えることができますか?これは、大規模なコンピューター、たとえば、より複雑なアルゴリズムを実行でき、より大きな命令セットを必要とするコンピューター (平方根や三角法を実行するなど) にとって重要です。メモリ サイズまたはビット アーキテクチャが大きくなるほど、コンピュータはより複雑になります。
- 速度/パフォーマンス
どのくらいの速度で操作を実行できますか? タスクを実行するように最適化されていますか? コンピューターをカスタム設計および構築すると、より冗長な配線とコードを専用のハードウェアとソフトウェアに切り替えることができるため、その速度が大幅に向上します。これは、1 つのタスクを非常に効率的に実行するようにプログラムされた実際のスーパーコンピューターで明らかです。Minecraft のコンピューターの速度は非常に遅いため、クライアントに mod をインストールして、ゲームの速度、つまりコンピューターの速度を大幅に向上させることができます。
MASICコンピュータ[]
チュートリアルで作成する進行中のコンピューター。 8 ビット、16 バイトの RAM。I/Oは7セグ表示器(16進数、10進数)とコントロールパネルを自作します。
MASIC コンピュータは万能型のコンピュータを目指しており、1 つのタスクに特化していないため、独自のメモリを読み取ることで完全にプログラム可能です (セクション 2: 命令セットで説明)。シンプルな I/O は多目的に使用でき、メモリも十分なサイズです。かなり高速で実行されます (サイズが小さいため)。
ステップ 1: メモリとアドレス デコーダー (THEORY)[]
デコーダーは、2 進数を 10 進数に変換します。たとえば、8 ビットのデコーダを見ると、00 は 0 を表す最初のランプをオンにします。01 は 2 番目のランプ (1) をオンにします。10 は 3 番目のランプ (2) をオンにします。 .
ステップ 1: メモリとアドレス デコーダ (練習)[]
アドレスデコーダ[]
0000 0000 (notice output 1 is lit)
0000 0001 (notice 2nd output is lit)
0000 0010
0000 0011
これは、これから作成するアドレス デコーダの設計です。
上記は単純な 2 ビットの状態なので、リピーターを介して 2 つの入力 (左と右) があります。出力は、状態が満たされたときにオフになる上のレッドストーン ラインです。状態は、レッドストーン入力が上のレッドストーン ラインをオフにするかどうかです。その場合、状態はレッドストーン入力です。上記の場合、上部のレッドストーン ラインをオフにするために、左 (青) をオフ (0) にし、右 (青) をオン (1) にする必要があります。そのため、OFF ON (バイナリの場合は別名 01) の状態が想定されます。
上部のレッドストーン ラインへの電力供給を停止するために ON (1) にする必要があるビットは青色で表示されます。すべてのビットがレッドストーンラインへの電力供給を停止すると、電源がオフになります。
これらは基本的に、1 つまたは 2 つの NOT ゲートが OR ゲートに供給され、次に出力されません。
ファイル:Screenshot 2019-07-15 at 10.19.28 am.png
ファイル:Big not.png
上記は 8 ビットの状態で、正確に 0000 1101 の順序で 8 つの入力を想定しています。つまり、想定している状態は 0000 1101 です。したがって、レッドストーン トーチが入力に電力を供給し、上部のレッドストーン ラインがオフになっていることがわかります (正確に 3 つのレッドストーン トーチが 0000 1101 の正確な順序で配置されている場合)。
これらを複数組み合わせると、青のビットを使用して 2 進数でカウントアップし、8 ビットの 255 の状態すべてを取得できます。以下は 8 ビットで、4 つの状態期待値があります。実際の動作を確認するには、右の画像をご覧ください。これで、それぞれの緑色の出力がメモリ セルになり、2 進数で数え続けると 255 に達します。
ファイル:Screenshot 2019-07-15 at 10.30.13 am.png
入力は 0000 0011 (入力についてはレッドストーン トーチを参照) で、青のビットが現在の状態と一致する場合、緑の出力がオンになります。
- 0000 0000 - 最初の信号出力 (右側の画像)
- 0000 0001 - 2 番目の信号出力
- 0000 0010 - 3 番目の信号出力
- 0000 0011 - 4 番目の信号出力
そのため、バイナリでカウントアップを続けて 0000 1111 まで到達し、そこで停止します。これで、24 (16) 個の状態期待値が必要になります。これで、アドレス デコーダが完成しました。セクション 3: 命令セットで説明されている命令セットの制限のため、1111 1111 までカウントし続けません。
ステップ 2: 算術論理ユニット (THEORY) の構築[]
ALU と呼ばれる算術論理ユニットは、2 進数を使用して数学的演算を比較および実行し、その結果をコンピューターの中央コンポーネントであるコントロール ユニット (および中央処理ユニットですが、コンピューター自体と同じくらいの大きさになります) と通信します。 )。多くのチュートリアルでは、読者が最初に ALU を構築することを望んでいるため、このトピックはインターネット上で非常に広く取り上げられています。
これから構築する ALU は、2 つの入力に対して 4 つの重要な演算を実行し、正しい出力を返すことができます。A、B、両方とも 8 ビット入力
- A + B (A を B に加算)
- A >> (ビットシフト A 右 (2 による 2 除算と同じ))
- << A (A を左にビットシフト (バイナリで 2 を乗算するのと同じ))
- NOT A (A の反対)
一部のプログラムは、実行するために多くの操作を必要とするため、コンピューター内に複数の ALU が存在する場合もあります。これらの操作は、前の操作に依存しません (したがって、スレッド化できます)。 そのため、それらを異なる ALU に委任すると、プログラムが大幅に高速化される可能性があります。
バイナリ加算器
2つの数字の足し算[]
加算ユニットでは、ビットごとに (このコンピューターでは 4 つ必要なので 4 ビット)、全加算器があります。全加算器は 3 つの入力を取り、各入力は 1 または 0 のいずれかです。最初の 2 つはユーザーの入力で、3 番目は「キャリー」入力です。carry 入力は前の全加算器の出力です。これについては後で説明します。加算器は 2 つのステートメントを出力します。最初に出力、次に carry 出力が次の全加算器への入力として送信され、値が上になります。 たとえば、数値 0101 を 1011 に加算したいとします。最初の全加算器は、1 位の値 1 と 1 を 2 つの入力と見なします (右から左に読み取ります)。前の全加算器がないため、「キャリー」入力はありません。全加算器は 1 と 1 を加算します。これは 0 で、次の桁の値に 1 を運びます。次の全加算器は 0 と 1 を加算し、キャリー入力は前の全加算器が述べた 1 になります。0 と 1 の出力は 1 になりますが、1 の桁上げ入力があるため、0 と 1 と 1 を加算します。これは 0 であり、1 を次の桁の値に運びます。バイナリで追加を確認すると、混乱が解消されます。
すべての ALU は、加算操作を実行するために、複数の加算器が必要です。2 ビットごとに加算器に供給され、他の加算器と結合すると、2 バイトが加算された合計である出力が生成されます。加算器には、9 + 1 または 01 + 01 の加算を行うときに人が運ぶように、入力、出力、および 2 つのキャリー入力/出力があります。加算器は、バイナリの命名法によって可能になる論理ゲートで構成されています。 Tutorials/Arithmetic logic では、全加算器と半加算器について非常に詳細に説明しています。今のところ、1 つを構築する方法の概略図があります。4 つの入力/出力を提供し、他の加算器と接続してユニットを作成する必要があります。この例では、4 ビットのコンピューターで 4 つの加算器を接続して、4 ビットすべてを取り込んで出力を作成できるようにします。最初の加算器から欠落している入力キャリーがあります。これは、その前のビットからキャリーするものが何もないためです。これは最初のビットです。入力キャリーはゼロのままです。また、4 番目の加算器から出力キャリーが失われます。4 ビットしかサポートできないため、この出力は無視されます。追加の 4 番目のキャリー出力はオーバーフロー フラグに配線され、操作を実行できなかったことを示します。これは、バイナリ オーバーフローと呼ばれます。
基本的には、Minecraft にアクセスして、完全なバイナリ加算器 (写真) を作成し、それらを接続します。8 つの入力と出力が必要です。レバーとレッドストーン ランプをそれぞれの端に配置して、作成をテストしてみてください。したがって、0010 + 0011 は 0101 になるはずです (2 + 3 = 5、左ではなく右を読んでいます)。
分数[]
コンピューターは、浮動小数点演算の形式で 1 未満の数値を処理します。これは、より大きなビットのコンピューター (16 ~ 64 ビット) と、1 未満の数値を使用する必要があるコンピューターでのみ役立ちます。浮動小数点演算 または 任意精度演算 は、これを実現する 2 つの方法です。もう 1 つの単純だが効率の悪い方法は、すべての数値に 2 の累乗を割り当てて、選択した 2 の累乗で「押し上げ」ます。プレーヤーはこれをすべての数字に対して行い、1 を選択した 2 のべき乗の 1 倍と見なす必要があります。たとえば、5 = 1012 なので、5 × 23 = 1010002; 5 が 3 に増えました。したがって、新しいシステムの 1 は 1 × 23 = 10002 になります。0.1、0.01、または 0.001 の余地が残ります。0.01 * 23 = 102. これにより、コンピューターのセットアップがより複雑になります。
2 つの数の減算[]
すべてのラベル付きの加算器。
数の引き算は驚くほど簡単です。ALU は最初に 2 番目の数値 (減算する値) を変更し、それを正の数値から負の数値に変換する必要があります。2 の補数とは、2 進数を反転し (すべての 0 が 1 で 1 が 0 になるように)、それに 1 を加えたものです。
例: 10 引く 9
1. 0000 1001 | (9 in binary, we want -9, not 9) |
2. 1111 0110 | (Invert 9, so that all 0s are 1s and 1s are 0s) |
3. 1111 0111 | add one (this the two's complement of 9) |
4. | |
0000 1010 | (10 in binary) |
+1111 0111 | add two's complement of 9 (aka -9) |
---- | |
0000 0001 | result (10 + (-9) = 1) (there is an overflow, this just means that the result is not a negative number) |
これは、符号付き数値の複雑さをもたらします。[1] これは、2 進数を正または負の数値として割り当てるための重みです。結果が負数か正数かは、オーバーフロー フラグによって決まります。オーバーフローがある場合、これは数値が正であることを意味し、それ以外の場合は負であることを意味します。
これを実装するには、ALU に 3 つの操作を実行するように依頼できます。A 減算 B を実行するには、操作は次のとおりです。
操作:A SUB B
- NOT B
- (set B to) B ADD 1
- (set A to) A ADD B
- RETURN A
2 つの数の掛け算[]
乗算は足し算の繰り返しなので、最も簡単な (非効率的) 方法は、A を変数 B に何度も足すことです。
これがそのための疑似マシンコードです
操作: A * B
- C = 0
- (set C to) C ADD A
- (set B to) B SUB 1
- JUMP IF (B > 0) TO LINE 2
- RETURN C
ただし、より効率的な乗算方法があります。 良い方法は、最初の数値を 2 番目の数値の各 1 の位置に繰り返しビットシフトし、合計することです。
0 のパディングは直感的ではないため、インデントを示すアンダースコアがあります。下付き文字 2 は 2 進数を意味し、10 進数も太字で表示されます
__ __11 | 3 (notice that there are 2 1s) |
x_ 1011 | 11 |
---- | |
__ __11 | We shift 112 by 010 since the 1st bit of 10112 is 12 |
+_ _110 | We shift 112 by 110 since the 2nd bit of 10112 is a 12 |
+1 1000 | We shift 112 by 310 since the 4th bit of 10112 is a 12 |
---- | the 3rd bit of 10112 is 02 so we do not add a 112 there |
10 0001 | 33 (result) |
したがって、これはより大きな数に対してより効率的です。
操作: A * B
- C = 0
- D = 0
- (Set A to) << A (bitshift A to the left)
- JUMP IF (BIT (D) OF B == 0) TO LINE 6
- (Set C to) C ADD A
- (Set D to) D ADD 1
- JUMP IF (D < LENGTH OF B) TO LINE 3
- RETURN C
Don't forget that
<< A (左へのビットシフト) は事実上、A * 2
と
>> A (右へのビットシフト) は事実上、A / 2
数値が予測可能であるか、CPU が類似の数値を大量に処理する必要がある場合は、ルックアップ テーブルを使用して、頻繁に呼び出される乗算の結果をすばやく取得することを検討してください。これは、回答をハードコーディングする方法であり、極端な場合に使用されます。
ステップ 2: 算術論理ユニットの構築 (実践)[]
ステップ 3: 命令セットとマシン アーキテクチャ (THEORY)[]
面白いですよね、この部分。
第 2 章: 命令セットについて詳しく説明し、自分用に作成します。
私たちが構築している MASIC Computer の場合、8 ビット システムであるため、スタック メモリの各スロットの各命令は 8 ビットになります。スタックメモリは、あらゆる情報を格納できるメモリであり、RAM 上にあります。プログラムカウンターと呼ばれるカウンターがあり、サイクルごとに1ずつ増加します。サイクルとは、CPU が命令をフェッチし、命令をデコードし (命令で何をすべきかを調べる)、命令を実行する (指示されたことを実行する) ことです。次に、プログラム カウンターをインクリメントし、スタック メモリ内のその場所にある情報を読み取ることによって、次のプログラムに進みます。
したがって、スタック メモリ内の各バイトには、作業するための 8 ビットがあります。
0000 0000
また、一部の命令にはアドレスが必要です。たとえば、メモリーをレジスターにロードして、その上で演算 (加算など) を実行できるようにするなどです。各命令は、それぞれ 4 ビットの 2 つの部分に分割されます。まずはTYPEです。TYPE はコンピュータが何をしなければならないかを指定し、ADDRESS は操作を実行する値が置かれる場所になります。
オペコードオペランド
TYPE の 4 ビットで、2^4 の型を持つことができるので、16 の異なる型になります。このコンピュータには 2 つのレジスタがあるため、1 ビットは操作を実行するレジスタを指定するためのもので、「x」で示されます。
命令はメモリと同じ場所に配置され、命令の ADDRESS 部分は 4 ビットしかないため、メモリを参照できるのは 1 ~ 16 行のみであり、より大きなプログラムに適合させるには巧妙なプログラミングが必要です。メモリもプログラムごとに 16 バイトに制限されています。値と命令は本質的に同じものであるため、以前に命令を格納した行に値を格納する命令を書き込むと、命令が値で効果的に上書きされます。誤って値を実行すると問題になる可能性があるため、STOP コマンドを使用してエラーを防止する必要があります。これは理解すべきことがたくさんあるので、良い情報源は https://www.computerscience.gcse.guru/theory/high-low-level-languages と https://scratch.mit.edu/projects/881462/ <- - 本当に役に立ちました。また、IGCSE に CS と ICT の両方を取り入れることも忘れないでください。
前提条件[]
このセクションでは、コンピュータで一般的に見られる簡単なトピックとコンポーネントについて説明するため、ALU、RAM、レジスタ、バイナリ操作など、第 2 章の情報が使用されます。
MASIC命令セット[]
パソコン以来 以下は、必須事項のみを含む、命令セットの最初のドラフトです。これは他のアセンブリ言語に基づいていますが、私たちのアーキテクチャに適応するように変更されています。2 つのレジスタがあるため、両方のレジスタで操作を実行する命令が必要です。
BINARY | OPCODE | COMMENT |
---|---|---|
0000 | LOAD R1 | Load the ADDRESS into register 1 |
0001 | STORE R1 | Store contents of register 1 into ADDRESS |
0010 | JUMP R1 IF | Jump to line ADDRESS if register 1 is equal to 0 |
0011 | ADD R1 | Add contents at ADDRESS to register 1 |
0100 | <<R1 | Bitshift register 1 left |
0101 | NOT R1 | Bitwise NOT register 1 |
0110 | JUMP | Jump to line OPERAND |
0111 | STOP | Terminate the program. |
1000 | LOAD R2 | Load the ADDRESS into register 2 |
1001 | STORE R2 | Store contents of register 2 into ADDRESS |
1010 | JUMP R2 IF | Jump to line ADDRESS if register 2 is equal to 0 |
1011 | ADD R2 | Add ADDRESS to register 2 |
1100 | <<R2 | Bitshift register 2 left |
1101 | NOT R2 | Bitwise NOT register 2 |
1110 | OUT R1 | Outputs register 1 |
1111 |
翻訳すること:
1000 0011 は、LOADR2 が 1000 で 0011 が 3 であるため、LOAD R2 3 を意味します。
これらは、機能を実行できるようにプロセス内にある場合があります。
プログラムを書く[]
これはフィボナッチ数列を実行します: (0,1,1,2,3,5,8... など)
FIBONACCI | |||
---|---|---|---|
LINE | BINARY | INSTRUCTION | COMMENT |
1 | 0000 1110 | LOAD R1 14 | set register 1 to 0 (the value at line 14) |
2 | 0011 1111 | ADD R1 16 | add the value at line 16 |
3 | 1110 0000 | OUT R1 | output the register |
4 | 0001 1111 | STORE R1 16 | put that in line 16 |
5 | 0011 1110 | ADD R1 15 | add the value at line 15 |
6 | 1110 0000 | OUT R1 | output the register again |
7 | 0001 1110 | STORE R1 15 | now put the output back |
8 | 0110 0010 | JUMP 2 | we don't have to reset the register so we loop back to line 2. |
... | |||
14 | 0000 0000 | 0 | |
15 | 0000 0001 | 1 | |
16 | 0000 0001 | 1 |
前のものは、低レベルのアセンブリ言語の例です。C++ などの高級言語で記述されている場合は、次のようになります。
#include <iostream> using namespace std; int main() { int n, t1 = 0, t2 = 1, nextTerm = 0; cout << "Enter the number of terms: "; cin >> n; cout << "Fibonacci Series: "; for (int i = 1; i <= n; ++i) { // Prints the first two terms. if(i == 1) { cout << " " << t1; continue; } if(i == 2) { cout << t2 << " "; continue; } nextTerm = t1 + t2; t1 = t2; t2 = nextTerm; cout << nextTerm << " "; } return 0; }
命令サイクル[]
角丸四角はコンポーネント、四角はレジスタ。緑の矢印はバスです
命令セットは下位アセンブリ言語なので、ハードウェア側にもっと統合したいと考えています。これは、フェッチ - デコード - 実行サイクル (上記で説明) を中心に展開します。 CPUには、4つの重要なレジスタがあり、
プログラム カウンター (PC)、 コンピューターが現在使用しているプログラムを追跡します
メモリ アドレス レジスタ (MAR)、 次のメモリ位置がどこにあるかを追跡します
メモリ データ レジスタ (MDR)、 その場所のメモリATが何であるかを追跡します
現在の命令レジスタ (CIR)、 現在取り組んでいる命令を追跡します
および ALU アキュムレータ (ACC) ALUからの入力と出力を追跡します
アドレス デコーダー、メモリ、命令デコーダー、ALU の 4 つのコンポーネントも覚えておく必要があります。
フェッチ
プログラムは次の命令を受け取ります。
- PC は命令番号を MAR に送信します
- 次の命令に備えて、PC を 1 増やします
- Address Decoder はアドレスをデコードし、メモリからそのアドレスの情報を要求します
- MDR が要求された情報を受け取る (写真の場合、MAR が 0001 の場合、'LOADR1 1' を受け取ります)
デコード プログラムは、命令が何であるかを識別します
- CIR は、情報フローを通じて MDR から情報を受け取ります
- 命令デコーダーは、命令と何をすべきかをデコードします
実行する プログラムは命令を実行します
- 図の場合、プログラムは「LOADR1 1」を命令として受け取り、命令デコーダは命令をオペコードとオペランドに分割します。
オペコードは「LOADR1」で、オペランドは「1」です。
- オペランドが MAR に送信され、そのアドレスの情報が取得されます
- MDR はそのアドレスで情報を受け取ります (例では同じ行です)
ここで、命令の内容に応じて 4 つのことが起こります。
命令が ADD 命令である場合、ACC は情報フローから情報を受け取るように指示され、ALU はその情報に対して演算を実行し、再度 ACC に出力します。
命令が LOAD 命令の場合、CU はその命令をレジスタにロードします。
命令が STORE 命令である場合、CU は代わりにメモリ内の MAR によって指定された位置にデータを設定します。
命令が OUT 命令の場合、CU はその命令を出力ペリフェラルに送信します。
繰り返す 命令サイクルは、STOP 命令に到達するかメモリがなくなるまで繰り返されます。
ステップ 3: 命令セットとマシン アーキテクチャ (実践)[]
第 2 章: Redstone コンピューターの計画[]
レッドストーン コンピューターは、コンピューターの設計とハードウェア アーキテクチャで使用される原則に従って、実際のコンピューターと同じように計画できます。組織に影響を与える重要な設計上の決定事項がいくつかあります。特定のコンポーネントを構築する前に、将来のコンピュータのサイズとパフォーマンスを具体的に決定する必要があります。
レッドストーン コンピューターを構築するには、これら 5 つの概念を理解し、コンピューターにとって最も実用的な最適なアプローチを検討する必要があります。
- Machine-Architecture (コンピューターのコンポーネント、それらが何であり、何をするか)
- 実行モデル (コンポーネントの編成、効率化)
- Word Size (システムが使用する ビット の数。通常、Minecraft では 2 の累乗、約 4、8、16 ビットが標準です)
- 命令セット (CPU によって実行される命令)
この知識を適用して、最後のセクションで CPU のアーキテクチャを計画します。この CPU は、次の章で作成します。
コンピュータの基礎[]
コンピュータは、次の機能を備えた機械です。
- アドレス指定可能なメモリからの読み取りと書き込み
・メモリの状態を比較し、その結果として演算を行う。これらの操作には、メモリの書き換えが含まれます。
- メモリに書き込まれた内容に基づいて関数を起動します。その内容を「プログラム+データ」と呼び、それを書く行為をプログラミングと呼んでいます。
これの非常に注目すべき例は、コンピューティングの最も基本的な概念である チューリング マシン です。マシンは、機能を完了するためにコードと命令セットの 1 つの無限行から読み取ります。
Minecraft でチューリング マシンを設計および構築することは可能です。ただし、より基本的なものを設計するため、これについては説明しません。
マシンアーキテクチャ[]
基本的な最新のコンピューターには、5 つの基本コンポーネントがあります。これらは、機能するコンピューターを作成し、計算を実行してデータを操作するために不可欠です。
コンピュータの 5 つのコンポーネント
算術論理ユニット (ALU) (オプションですが、通常は存在します)
- 足し算と引き算を行う
- 論理ゲートを使用してブール値を比較する
コントロールユニット (CU)
- それに送信された指示を実行/実行します
- すべてのコンポーネントと通信する
データメモリ
- メモリからデータを保存して返す
命令メモリ
- 返却指示、CU に送信
- 設定可能ですが、データ メモリほど頻繁である必要はありません
入出力デバイス (I/O)
- コンピュータが世界やプレイヤーと通信できるようにします。
- コンピュータに情報を入力できます (ボタン プッシュ、日照センサー)。
- コンピューターからの情報を出力可能 (レッドストーンランプ、メモブロック)
コンピュータのデータストレージ[]
Minecraft や実生活で、データを保存する方法はたくさんあります。メモリの状態は通常、オンまたはオフのバイナリであり、ブール論理で計算できます。
コンピュータには、3 種類のストレージがあります。デバイスの容量を増やすとサイズが大きくなることに注意してください。各タイプには適切な速度と容量があります。
プライマリ ストレージ[]
これらは、メモリと呼ばれる CPU に直接アクセスできるストレージであり、アクセスが最も高速ですが、通常は容量が小さいため、より迅速にアドレス指定できます。
レジスタとフラグ[]
最速は、CPU 内に格納されているメモリです。これらはレジスタとフラグであり、ほぼ瞬時に設定でき、各レジスタには 1 バイトしか格納されていないため、アドレスを送信する必要はありません。 切り替え可能なレッドストーン ビットは非常に大きいですが、2 ティック以内で切り替えることができます。これには非常に大きなスペースが必要ですが、キャッシュとレジスターには最適です。レッドストーンは、論理ゲート (図示せず) がビットを設定するためにも必要です。画像のように、入力を送信するとビットが反転します。ゲートはより多くのスペースを占有します。レジスターは、レッドストーン リピーターのロックとそれらの正確なタイミングを利用することもできます。これについては、RAM で以下に説明します)。コンピューターの時計を使用すると、レジスターを構築する必要がない場合があります。レジスタは、CU または ALU がデータを処理する準備が整う前にデータがラインを通過する場合に役立ちます。それをレジスタに保存し、CU または ALU がその機能を実行できるようになるまで待ちます。
Sticky Pistons で作られたビット A Byte made with Sticky Pistons
キャッシュ[]
2 番目はキャッシュで、情報をプロセッサに送ります。実際には、それらはレベルに分けられています それぞれに速度と容量が異なります。レジスタと同じ理由で便利です。
ランダム アクセス メモリ (RAM)[]
3 番目はランダム アクセス メモリ (RAM) です。これは、アドレス システムがあるため、キャッシュやレジスタよりもはるかに低速です。これらは、データバス、コントロールバス、アドレスバスの 3 つのバスに接続されています。データはデータ バスを介して送信され、RAM を設定するか、RAM から値を取得します。制御バスは、それが get であるか set であるかを通知します。アドレス バスは、バイトがどこにあるかを RAM に伝えます。これをより深く理解するには、コンピュータのアーキテクチャを参照してください。RAM は非常に便利で、Minecraft では非揮発性であるため、3 次メモリ (以下で説明) を完全に置き換えることができます。揮発性とは、電力が失われると情報が失われることを意味します。RAM は、実際の生活とは異なり、情報を失うことはありません。したがって、情報を保存する優れた方法です。
最初のケースの RAM は、ロッキング レッドストーン リピーターを正しいタイミングで利用しています。これには少し計画が必要ですが、非常にスペース効率が良いです。レッドストーン リピーターをロックするためにバスをラインに変換するには、タイミングの設定も必要です。これはレジスタよりもはるかに時間がかかりますが、非常にコンパクトで効率的です。アドレス バス (緑) はバイナリに変わり、特定のバイトを「ロック解除」して、制御バスによって読み取られるか、設定されます (左側の 2 行目)。
ほとんどの場合、揮発性にすることは Minecraft では役に立たないため、最も簡単な作成方法は、d フリップフロップを使用し、読み書き機能を追加することです。下の画像は、リピーターをロックする代わりに、スペース効率がはるかに悪いが構築が簡単な d フリップフロップを使用していることを示しています。D フリップフロップは多かれ少なかれロックされたリピーターのように機能します。1 つの入力がオンの場合、入力がオフになるまでロックが解除され、ロックが解除されるともう 1 つの入力が設定されます。出力はビットとして読み取ることができ、NAND ゲートを使用して無視するか、バスに出力することができます。これについては、第 2 章「コンピュータの構築に関するチュートリアル」で詳しく説明します。テクスチャパックですみません。
RAM としても知られる ランダム アクセス メモリ は、プログラムによって使用される一種のメモリであり、揮発性です。揮発性とは、電力が失われると情報が失われることを意味します。ほとんどの場合、揮発性にすることは Minecraft では役に立たないため、最も簡単な作成方法は、d フリップフロップを使用し、読み書き機能を追加することです。
二次ストレージ[]
これらは HDD と SSD に相当します。非常にコンパクトなストレージ技術があります、最大 1KB まで保存できるレッドストーン コンパレーターを含み、実用的なサイズです。
三次ストレージ[]
3 番目と最後の 3 番目のメモリは、読み取り/書き込みに多くの時間を必要としますが、速度を犠牲にして大量の情報を保持できます。実際の 3 次ストレージでは、ドライブごとに約 1 分かかるメモリのマウント メカニズムが使用されます。これは、アーカイブの目的と、めったに使用されないメモリに使用されます。Minecraft では、シュルカー ボックスが使用され、シュルカー ボックス内のブロックが使用されるシステムは、データの形式を表すために、並べ替えシステムによって並べ替えられる必要があります。これは、リムーバブル ストレージの作成にも使用できます。大量のコンパレータがあるため、読み取り/書き込み速度はかなり遅く、多くの時間が必要です。ただし、前述の改造により、ティックレートが高速化され、この問題が解消される可能性があります。これは、プログラムの開始時にロードする必要がある長期データを保存するために使用されます。これは、実際のコンピュータのハード ディスクまたはソリッド ステート ドライブに相当します。
実行モデル[]
プログラムと呼ばれる命令のブロックをメモリ内に格納する技術により、コンピュータはさまざまなタスクを実行できます。
これらのプログラムを格納および検索するためにコンピュータによって使用される装置が、コンピュータの実行モデルです。
世界で最も成功している 2 つの実行モデル、ハーバードとフォン ノイマンは、現在利用可能なコンピューターのほぼ 100% で実行されています。
これはより高度で、好奇心旺盛な読者向けです
ハーバード[]
ハーバード アーキテクチャ は、アクティブなプログラムを構成する命令を取得するための装置と、プログラムが実行中にアクセスするデータ アクセス装置の装置を物理的に分離します。
ハーバード アーキテクチャを採用するコンピューター用に作成されたプログラムは、メイン メモリ バスにアクセスするタスクを最大 100% 高速に実行できます。ただし、特定のメモリ回路は、ハーバード アーキテクチャを選択する人にとって必然的に大きくなることに注意してください。ハーバードのアーキテクチャは非常に重要です。
フォン・ノイマン[]
von Neumann アーキテクチャ では、2 段階のプロセスを使用して命令を実行します。最初に、次の命令を含むメモリがロードされます。次に、ロードされたばかりの新しい命令が、実行中にこの同じメモリにアクセスできるようになります。プログラムとデータの両方に単一のメモリを使用することで、コンパイラや自己修正コードなどのメタプログラミング技術が容易になります。
フォン ノイマン アーキテクチャは最初に提案された計算モデルであり、現実世界のほとんどすべてのコンピューターは本来フォン ノイマンです。
ワードサイズ[]
ワード サイズは、コンピューターの物理サイズの主要な要素です。
Minecraft では、1 ビットから 32 ビットまでのマシンが正常に構築されています。
一般的な単語サイズの組み合わせ:
データ | 命令 |
---|---|
4 | 8 |
8 | 8 |
8 | 16 |
16 | 16 |
データワード[]
コンピュータが特定の時間に操作できる情報の量は、コンピュータのデータ ワード サイズを表します。
デジタル バイナリでは、コンピューターのデータ ワード サイズ (ビット単位で測定) は、コンピューターのメイン バスの幅またはチャネル数に等しくなります。
データワードは一般に、2 進数のパターンとしてエンコードされた整数または整数を表します。
Binary エンコードされた整数で表現できる最大サイズの数値は、次の式で与えられます。 2ビット単位のデータワード幅 - 1。
たとえば、データ ワード サイズが 8 ビットのコンピュータのバスには 8 つのチャネル (ワイヤのセット、接続コンポーネント) があるため、最大で (28 - 1 )。255. 8 ビットでは 255 を超える数を数えることはできません。これは、255 + 1 の演算で 1 が繰り越され、9 番目のビットが必要になるか、いわゆる「バイナリ オーバーフロー」が発生し、答えとして 0 が返されるためです。間違っています。
これは単純に視覚化されています。
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 255 | |
+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
= | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
一般的な整数データ サイズは次のとおりです。
最大代表数 | 必要なビット数 |
---|---|
1 = (21 - 1) | 1 |
7 = (23 - 1) | 3 |
15 = (24 - 1) | 4 |
255 = (28 - 1) | 8 |
65535 = (216 - 1) | 16 |
4294967295 = (232 - 1) | 32 |
データワードのサイズは、コンピュータの ALU (算術論理演算装置) で処理できる数値の最大サイズも決定します。
命令語[]
1 つの命令を完了するためにコンピュータが必要とするデータの量は、コンピュータの命令ワード サイズを表します。
コンピュータの命令語のサイズは、通常、データ語のサイズの倍数です。これにより、プログラムの実行中に命令を取得する際のメモリのミスアライメントを最小限に抑えることができます。
命令セット[]
これは、制御ユニット (CU) がデコードして実行できる命令の集合です。
命令は、基本的にコンピュータによって実行される機能であり、命令の例は次のとおりです。
- 足し算、引き算、掛け算、割り算
- RAM/ROM/第 3 メモリからの読み取り/書き込み
- RAMへのデータのロードとアンロード
- コードの他の部分への分岐
- レジスタの比較
- ロジック 機能の選択 (NAND、NOR、NOT など)
命令は、RAM にプログラムしたり、ROM からロードしたり、レバー または ボタン を使用して直接起動したりできます。各命令には固有のバイナリ文字列が割り当てられ (例: 0000=レジスタからデータをロードする 0001=A と B を追加する 1011=RAM を 3 次メモリに保存するなど)、おそらく独自のバイナリを 10 進数に、またはバイナリを BCD に変換する必要があります。 10 進エンコーダとバスを ALU/レジスタに接続します。
コンピュータのアーキテクチャ[]
コンピュータの内部には、中央処理装置 (CPU 内のコンポーネントであるコントロール ユニット (CU) と混同しないでください) があります。コンピューターの頭脳。 Minecraft では、実生活で見られる縮尺に合わせて圧縮することは難しいため、「間違っている」ように見えても心配する必要はありません。
次の章では、最初に 4 ビットの中央処理装置を設計します。これは、実行モデル (通信の方法と CPU の構成) を念頭に置いて、コンピューターで最も重要なものであるためです。ページの前の「実行モデル」セクション) で、コンピューターの構造を詳しく説明できます。
ハーバード実行モードに基づくCPUのマップ
CPU は、フェッチ、デコード、実行、および (場合によっては) ストアの 4 つのステップのサイクルに従って、命令を実行します。CPU はまず RAM から命令をフェッチし、それが何を意味するかをデコードし (命令はおそらく数字であり、CPU はそれが何であるかを見つけなければなりません)、命令が何であるかを理解すると、そのアクションを実行します。これにより、データをストレージに戻す必要がある場合があるため、データが保存されます。その後、このサイクルが繰り返されます。」
バス[]
CPU には 5 つのバスがあり、それぞれが 1 つのコンポーネントから次のコンポーネントに情報を運びます。バスは、各コンポーネントを接続するレッドストーンのチャンネルです。4 ビットのコンピューターを構築しているので、バスには 4 つのチャネルしか必要ありません。これらは、CPU 内のコンポーネントを接続する赤と青の線です。青いバスのラインが 4 本未満であることに注意してください。これは、データを伝送しないためです。バスは一方向にしかデータを運ぶことができないため (Minecraft では、リピーターが一方向にしか機能しないため)、CPU を外側のコンピューターに接続する 2 つのバスがあります。
最初のバスはデータバスです。これは、ストレージまたは I/O デバイスから CU に情報を転送するためのものです。命令もこのラインを介して送信されます。CU は、このバスを使用してデータを ALU に転送することもできます。バスは一方向にしか機能せず、情報が ALU によって取得されると、バスは ALU を超えて遮断されるため、ALU はこのバスにデータを転送できません。ALU からの情報は、バス 2 を介して渡されます。
2 番目のバスはデータ バスですが、ALU から CU にデータを返します。バスは左から右に進み、一方向のみに動作するため、CU はこのバスを介して ALU にデータを送信できません。ただし、CU はストレージ ユニットに情報を送り返すことができ、ストレージ デバイスの値を設定するために使用されます。
3番目のバスはアドレスバスで、CUがストレージのアドレスを送ることができます。これは、情報が存在する場所です。たとえば、CU は 0001 にあるバイトのアドレスを要求します。CU はアドレス バスを介してアドレス (0001) を送信し、RAM は最初のバスを介してバイトの値を返します。0001 はバイトの「位置」であり、値ではありません。
4 番目のバスは制御バスで、CU が RAM と通信する際に使用します。たとえば、1 つのワイヤは、CU によって送信されたデータの値にバイトを設定するように RAM に指示できます。別のワイヤは、CU によって送信されたアドレスからバイトを取得するように RAM に指示できます。
5 番目のバスは別の制御バスで、ALU とリンクしており、ALU からフラグを送信します。フラグは、エラー メッセージの可能性があるメモです。たとえば、CU は ALU に 15 と 1 を 4 ビット システムで加算するように要求できます。4 ビットで 15 と 1 を加算すると 0 になり (上記で説明)、これは「バイナリ オーバーフロー」と呼ばれます。これはエラーであり、ALU は 5 番目のバスを介してこれをフラグとして CU に通知します。CPU は ALU にデータを送信し、そのデータでアクションを実行するように要求することもできます。
コンポーネント[]
コントロール ユニット (CU) は、命令 ROM から命令をフェッチします (他のコンピューターの場合、命令は変更できるため、RAM です。この場合、固定プログラムを実行しており、命令を変更する必要はありません。これによりプロセスが完全に簡素化され、命令は読み取り専用メモリ (ROM) になります。次に、CU 内で命令 (通常は数値) を適切なアクションにデコードします。次に、そのアクションを実行し、命令が必要な場合は、結果を RAM に保存します。制御バスを介して RAM と通信し、ALU からフラグを受け取ります。また、ALU に送信するデータに対してアクション (加算など) を実行するよう ALU に要求することもできます。たとえば、RAM と通信するには、1 つのワイヤで RAM にバイトを設定するように指示できます (バイトの場所は、3 番目の
算術論理ユニット (ALU) は、CU から送信された命令を実行し、2 進数を比較して、コントロール ユニットと通信します。単純な加算と減算を実行して、乗算と整数除算を繰り返すことができ、整数を出力します (次に除算)。ブール値用の論理ゲートもあり、「NOT」ゲートや「NAND」ゲートなどの基本的な 論理ゲート が必要です。
これで、さまざまなバスのデザインから選択できるようになり、それぞれが前述の Minecraft コンピューターの 3 つの重要な設計目標に貢献します。
ヒント[]
- プレーヤーは、Mod や WorldEdit などのデータ パックを使用する場合があります。
- コンピュータを色分けします (RAM には青色のウールまたはコンクリート、ALU には黄色を使用するなど)。
- 小さなコンピューターから始めて、より複雑なコンピューターを試す前に、小さなコンピューターのコツをつかんでください。
- 構造ブロック は、コンポーネントを移動したり、複数のコンポーネントを組み合わせたりするのに非常に役立ちます。ただし、これらはコマンドを使用しないと取得できないことに注意してください。
こちらもご覧ください[]
- レッドストーン (曖昧さ回避)
- レッドストーン回路
- レッドストーン回路/レッドストーンの構成部品
- 論理回路
- メモリ回路
- パルス回路
- 送信回路
- チュートリアル/高度なレッドストーン回路
- チュートリアル/電卓
- チュートリアル/印刷
- チュートリアル/テレグラフ
参考文献[]
新人向け |
| ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
全般 | |||||||||||||
チャレンジ |
| ||||||||||||
建築 | |||||||||||||
生産 |
| ||||||||||||
エンチャントと製錬 | |||||||||||||
ブロック破壊 |
| ||||||||||||
メカニズム |
| ||||||||||||
サーバー |
| ||||||||||||
技術的なチュートリアル |
| ||||||||||||
古いチュートリアル |
|