MHRD
Not enough ratings
日本語マニュアル、ブリーフィング、仕様書
By nautanonsum
ゲーム内のマニュアル、ブリーフィング、仕様書を勝手に日本語に訳したものです。正確性は一切保証しません。お気付きの点はご指摘頂ければ幸いです。

ブランドイメージ: https://commons.wikimedia.org/wiki/File:Japanese_icon_(for_user_box)_2.svg
   
Award
Favorite
Favorited
Unfavorite
ドキュメント/マニュアル/最初に (Documents/Manual/Introduction)
最初に
======

このマニュアルは、ハードウェア素子の作成を開始する上で知る必要のある事柄をすべて記述しています。本章はあなたの仕事の概要を説明します。他の章は特定のテーマに関する詳細な情報を説明します。また、本マニュアルにはチュートリアルが含まれているので、役立ててください。

ハードウェアエンジニアとしてのあなたの仕事は、ハードウェア素子のデザインを作成することです。設計しなければならないハードウェア素子の仕様と、自分のデザインが正しく動作することを証明するための検証試験が提供されます。

“Explorer” ウィンドウにある “Tasks” フォルダーには完成させなければならないデザインがすべて入っており、“Completed” フォルダーには自分自身で完成させたパーツまたはそのまま自分のデザインで使用できるパーツが入っています。

仕様書には、設計しなければならない素子のインターフェース仕様、図解、そして挙動説明が必ず含まれています。
- インターフェース仕様は入出力のリストで、それぞれ
異なる id で識別されます
- 図解は素子の外観を想像するのに役立ちますが、
追加の情報は一切含みません
- 挙動説明は、素子が達成すべき動作を言葉で説明したものです。
また、所与の入力に対して素子が生成しなければならない出力値からなる
完全または不完全なリストも掲載します。


デザイン作成後、Microhard Development Environment の内蔵シミュレーターで挙動の正しさを検証しなければなりません。検証過程は以下のステップから成ります:
- デザインがインターフェース仕様に準拠しているかのチェック
- デザインがシンタックス仕様に準拠しているかのチェック
- デザインがすべての検証試験に合格するかのチェック

検証試験が最初の 2 点で失敗した場合、その旨のエラーメッセージが表示されます。1 つまたは複数の試験に失敗した場合、全試験と各結果のリストが表示されます。

デザイン作成がうまくいかない場合、以下の方法を試してください:

1. 素子の仕様をよく読む。
1a.他の要素またはマニュアルへの参照を含んでいる場合、
対応する要素の仕様またはマニュアルの章を読む。
2. デザインを紙に描き出す。新規デザインには完成済みのハードウェア素子を
活用することができます。
3. デザインが正しいと思ったら、シンタックス使用に従って
ワークスペースの “Design” タブに書き出します。
4. CTRL+ENTER を押して検証試験を開始します
4a.エラーメッセージが表示された場合、エラーメッセージを詳しく調べ、
ステップ 3 に戻ってデザイン上の問題を修正します。
4b.1 つまたは複数の試験が失敗した場合、失敗したテストを 1 つ選び、その入力値を
デザインに適用したらどうなるか、なぜデザインの出力値がテストにおける所期の出力値と
異なるのか、理解に努めます。
ステップ 2 に戻ってこの問題を修正します。
5. このステップに辿り着いた場合: おめでとうございます! ハードウェアを構成する 1 部品の
デザインを作成することに成功しました。

本マニュアルに含まれているチュートリアルによって、最初のタスク群を完了する準備ができたはずです。
ドキュメント/マニュアル/チュートリアル/ (Documents/Manual/Tutorials/)
チュートリアル1 (TUTORIAL1)

チュートリアル 1 - 仕様
==========================

説明:
------------
本チュートリアルは、Microhard Development Environment への入門を意図するものです。本チュートリアルは通常のハードウェア素子のタスクと全く同じ構成ですが、基本的に動作する答えを提供する点で異なります。

今読んでいる内容は、TUT1 ハードウェア素子の仕様です。本チュートリアルでは、以下のように振る舞うデザインを作成します:

“TUT1 素子には入力が 2 つ、出力が 2 つあります。最初の出力からは 2 つめの入力値を出力し、2 つめの出力からは最初の入力値を出力します。”

この仕様の残りをしっかり読んでから “Design” タブに向かってください。

インターフェース仕様:
------------------------
Inputs: in1, in2; Outputs: out1, out2;


図解:
-------------------------
______ -in1--| |--out1- | TUT1 | -in2--|______|--out2-


例:
--------
in1 | in2 || out1 | out2 ------------------------- 0 | 0 || 0 | 0 0 | 1 || 1 | 0 1 | 0 || 0 | 1 1 | 1 || 1 | 1

チュートリアル2 (TUTORIAL2)

チュートリアル 2 - 仕様
==========================

説明:
------------
チュートリアル 1 では基本的なワイヤリング作業を説明しましたが、これだけでは多くのことはできません。面白いデザインを作成するには、他の素子を再利用しなければなりません。

本チュートリアルでは、NAND ゲートをベースにした NAND ゲートを作ります……。これは当然、教育目的以外では役に立ちません!

本来ならこの仕様で NAND ゲートの目的を説明するところですが、エクスプローラーの “Completed” デザインセクションに NAND ゲートの仕様があります。そこへ向かって仕様を読んでから本チュートリアルの “Design” タブに戻ってきてください!

本チュートリアルを終えた後、まだ NOT ゲートをデザインしていなければ、“Tasks/” フォルダーでデザインしてみてください!
ドキュメント/マニュアル/シンタックス (Documents/Manual/Syntax)
デザインシンタックス
=============

本章はデザインの作成で使用するシンタックスを説明します。まずいくつか例を示し、それからシンタックスの仕様を説明します。


ピン:
-----

入出力には、以下のような任意に選択された識別子があります:
Inputs: inPin1, inPin2, abc; Outputs: outPin1, outPin2, outPin3, outPin4, def;

パーツは、任意に選択された識別子と、すべて大文字のパーツタイプから成ります:
Parts: myNand NAND, myNot NOT, anotherNand NAND, andAnAnd AND;

ワイヤーで接続できます:
Wires: inPin1 -> outPin1, //入力から出力へ inPin1 -> myNot.in, //入力からパーツの入力へ myNot.out -> outPin2, //パーツの出力から出力へ myNot.out -> myNand.in1, //パーツの出力からパーツの入力へ 1 -> outPin3, //定数を出力へ 0 -> myNand.in2; //定数をパーツの入力へ

“1” または “0” のみ定数に使用できます。ワイヤーが接続されていない入力ピンがある場合、自動的に “0” が入力されます。

バス:
-------

以上の例はピンにのみ関係していました。デザインで多数のピンを使用する場合、代わりにバスを使用することができます。複数のピンを含んだバスを定義するには、このように書くことができます:
Inputs: inBus1[8], inBus2[8], inBusWide[16], inPin1; Outputs: outBus1[8], outBus2[8], outBusWide[16], outPin;
ここで inBus1 はバス幅が 8 (つまり 8 つの異なるピンを含んでいる) のバスで、inBusWide はバス幅が 16 です。

“Wires” セクションでワイヤーを指定する際、同じサイズのバスを接続することができます:
inBus1 -> outBus1

バスではなく個々のピンを選択して接続することもできます:
inBus1[3] -> outPin
これは inBus1 の 3 番目のピンを outPin に接続します。ただし、inBus1[3] は “Wires” セクションでは単独のピンを表しますが、“Inputs” と “Outputs” セクションではサイズが 3 のバスを定義します。また、ピン番号は “1” から始まる (0 ベースのインデックスではない) 点に注意してください。

ピンだけでなく、バスのサブバス (部分バス) も選択できます:
inBus1 -> outBusWide[9:16] inBus1[1:8] -> outBusWide[9:16]
どちらの行も同じ意味です。これは inBus1[1] を outBusWide[9] に、inBus1[2] を outBusWide[10] に、……、inBus1[8] を outBusWide[16] に接続します。

単独のピンを (サブ) バスに接続することもできます (その逆はできません)。この場合、ピンは (サブ) バスのすべてのピンに接続されます。
inPin1 -> outBus1[2:4] //サブバス [2:4] に接続 inPin1 -> outBus2 //バス全体に接続

バスを扱う際、値の適切な表記法を理解することが大切です。“00001111” という値を持つ “Bus[8]” というバスがあるとします。これはピン “bus[1]” が値 “1” を持ち、ピン “bus[8]” が 値 “0” を持つということです。従って、2 進数として書かている場合、個々のピンを右から左へ読みます。


形式仕様:
---------------------

デザインは “Inputs”、“Outputs”、“Parts”、“Wires” の各セクションで構成されます:
[design] = [input_section] [output_section] [part_section] [wire_section]

各セクションは対応するセクション識別子で始まり、コロン、1 つまたは複数の対応する素子が続き、セミコロンで終わります:
[input_section] = "Inputs:" [input] (, [input])* ";" [output_section] = "Outputs:"[output] (, [output])* ";" [part_section] = "Parts:" [part] (, [part])* ";" [wire_section] = "Wires:" [wire] (, [wire])* ";"

入出力は個別のピン (この場合、単純な識別子で構成されます) またはバス (この場合、バス幅を指定しなければなりません) のいずれかです:
[input] = [input_pin_id] | ([input_bus_id][bus_size]) [output] = [output_pin_id] | ([output_bus_id][bus_size])

識別子は英字で始まり、任意の数の英数字が続かなければなりません:
[input_pin_id] = [id] [output_pin_id] = [id] [input_bus_id] = [id] [output_bus_id] = [id] [id] = [letter] ([letter | digit])* [letter] = "a"|...|"Z" [digit] = "0"|...|"9"

バスサイズは大括弧で括った数として示します。数は最低でも 1 桁あります。
[bus_size] = "[" [number] "]" [number] = [digit]+

パーツはパーツ識別子とパーツタイプの組として書きます。パーツタイプは必ず大文字です:
[part] = [part_id] [part_type] [part_id] = [id] [part_type] = [uppercase_letter] ([uppercase_letter | digit])* [uppercase_letter] = ("A"|...|"Z")

ワイヤーは始点と終点があります。始点と終点は設計中の素子または完成済みパーツの通常のピンまたはバスです:
[wire] = [start] "->" [end] [start] = [pin_value] | [input_pin] | [input_bus] | [part_id]"."[output_pin] | [part_id]"."[output_bus] [end] = [output_pin] | [output_bus] | [part_id]"."[input_pin] | [part_id]"."[input_bus]

ピンはピン id またはバス内部の特定のピンへの参照です:
[pin_value] = "0" | "1" [input_pin] = [input_pin_id] | [input_bus_id][pin_selection] [output_pin] = [output_pin_id] | [output_bus_id][pin_selection] [pin_selection] = "[" [number] "]"

バスはバス id またはバス内部のピンのグループへの参照です:
[input_bus] = [input_bus_id] | [input_bus_id][bus_selection] [output_bus] = [output_bus_id] | [output_bus_id][bus_selection] [bus_selection] = "[" [number] ":"[number] "]"
ドキュメント/マニュアル/順次論理 (Documents/Manual/Sequential Logic)
順次論理
================

本章は順次論理の重要な面を説明します。

NAND ゲートの入力値を変更しても、出力値はすぐには変わりません。再調整のために時間が少し必要です。これは NAND ゲートをベースにしたすべてのハードウェア素子に当てはまります。

検証を行う際、これはクロックを用いて考慮します。各クロックサイクルでテストが 1 つ実行されますが、クロックサイクルは互いに十分離れているため、ハードウェア素子全体には出力を安定化する時間があります。

各クロックサイクルすなわちテストは、非順次論理素子の場合、(NAND ゲート同様) 先行するテストから完全に独立していることは明らかです。

しかし、D 型フリップフロップ、つまり DFF 素子にはメモリー機能があります。DFF の出力値は、最後のクロックサイクルの入力値です。従って、出力値は現在のクロックサイクルの入力値から完全に独立ですが、最後のクロックサイクルの入力値によって変化します。これによってメモリー素子のデザインが可能になります。

ただし、これによってテストは単独のテストステップまたはクロックサイクルで完了できなくなり、全ステップをシーケンスと見なさなければならなくなることを意味します。従って、所期の出力値が “x” であるテストステップは、単に出力値を無視するという意味です。
ドキュメント/マニュアル/表記体系 (Documents/Manual/Notation Systems)
表記体系
==================

本章は Microhard Development Environment で使用する様々な記数体系を多面的に説明します。


2 進記数法:
----------------

数をハードウェア素子 (たとえば加算器) のコンテキストで書くときは、2 進記数法を使用します。これにより、2 進数の各桁がピンに対応します。ただし、数を書く際、LSB (最下位ビット) は必ず右に来るよう書きます。LSB はバスで “1” の表示があるピンです。


数の 2 進数から 10 進数への変換:
-------------------------------------------

数を 2 進記数法から 10 進記数法に変換するには、各桁の値を確認して加算していきます。各桁に割り当てる値は以下の通りです:
x * 2^i
ここで x は値 (1 または 0 のいずれか) であり、i は位置 (0 で始まり、右から左へ増加する) です。

たとえば、2 進数の “1010” は以下のように変換します:

i: 3210
x: 1010

結果: 0*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 10


数の 10 進数から 2 進数への変換:
-------------------------------------------

10 進記数法から 2 進記数法へ変換する際は、逆の手法を採用する必要があります。

1. 変換したい 10 進数 x より大きい 2^(n+1) について、
最小となる n を見つける必要があります。
2. ここで数が 2^n 以上かチェックします。
2a.そうであれば、x から 2^n を引き、2 進数の桁 “1” を書き出します。
2b.そうでなければ、x をそのままにし、2 進数の桁 “0” を書き出します。
3. n から 1 を引き、n>=0 であればステップ 2 に 戻ります。

x=10 (10 進数) について:
1. n=3 なぜなら 2^3<10<2^4
2.10 >= 2^3、ゆえに最初の桁は "1" であり、x = 10 - 2^3 = 2 となる
3.2 < 2^2、ゆえに 2 桁めは "0"
4.2 >= 2^1、ゆえに 3 桁めは "1" であり、x = 2-2 = 0 となる
5.0 < 2^0、ゆえに最後の桁は "0"
6.最終的に 2 進数は “1010” となる


負の 2 進数の表記法:
------------------------------------

数値演算を行うハードウェア素子を作成する場合、素子には固定幅のバスを持たせます。従って、“1” という数は 1 ビットで表現できるにも関わらず、4 ビット加算器では 3 つの余分なビットが発生します (正確に “0001” という値になります)。

負数は、左端のビットを正負の指標として使用することで表現できます。しかし、より良い方法は 2 の補数という形式を使うことです。この形式では、数は左端ビットが “0” なら正またはゼロ、“1” なら負です。数を負にするには、正の形式の全ビットを反転した数に “1” を加えます。これには、数を加える際、正負を考慮する必要がないという重要な利点があります。次節で説明する加算は、必ず成功し、正しい結果を出します。

2 進数の加算:
----------------------
2 進数の加算は、10 進数の加算と同じくらい簡単です。2 つの数を上下に並べて足すことができます。結果が >1 の場合、キャリー (桁上げ) を使用しなければなりません (2 つの 10 進数を加算した結果が >=10 である時に桁を繰り上げるように)。

たとえば、“1010” という 2 進数 (10 進数の 10) と “11” という 2 進数 (10 進数の 3) は、このように足すことができます:

1010 + 0011 ====== 1101 (10 進数の 13) x

なお、“x” と書かれた列は 1+1=0 + キャリーであり、次の列で足されています。この方法は、負数に 2 の補数の形式を使った場合、正負いずれか、または両方のオペランドで機能します。


16 進記数法:
---------------------

16 進記数法は、16 ビットバスを使用する際に使用します。10 進記数法との相互変換は二進数体系と同様ですが、“2^?” ではなく “16^?” を使用します。また、16 進数体系では 16 種類の値を 1 桁で表現しますが、数は 10 種類しかない (0 から 9) ため、10、11、12、13、14、15 の値には A、B、C、D、E、F を使用します。さらに、16 進数を書く際、必ず 0x で書き始め、10 進数と間違えることがないようにします。16 進記数法には、2 進記数法に綺麗に分解できるという利点もあります。4 桁の 2 進数は、1 桁の 16 進数で正確に表現することができます。従って、10 進数体系との変換のときのような複雑な変換は必要ありません。
タスク/論理回路/Nand/ (Tasks/Logic Circuits/Nand/)
NAND

NAND 仕様
==================

説明:
------------
NAND ゲート (Not-And の短縮) には入力が 2 つ、出力が 1 つあります。入力が両方とも 1 の場合、出力は 0 です。それ以外の場合、出力は 1 です。
NAND ゲートは最も基本的な素子です。他の __すべての__ 素子を作成することができます。


インターフェース仕様:
------------------------
Inputs: in1, in2; Outputs: out;


図解:
-------------------------
______ -in1--| | | NAND |--out- -in2--|______|


真理値表:
------------
in1 | in2 || out ---------------- 0 | 0 || 1 0 | 1 || 1 1 | 0 || 1 1 | 1 || 0

NAND4B

4 ビット NAND 仕様
========================

説明:
------------
NAND4B 素子はバス版の NAND ゲートです。両方の入力からの各ビットのペアに NAND 演算を適用します。


インターフェース仕様:
------------------------
Inputs: in1[4], in2[4]; Outputs: out[4];

NAND16B

16 ビット NAND 仕様
=========================

説明:
------------
NAND16B 素子はバス版の NAND ゲートです。両方の入力からの各ビットのペアに NAND 演算を適用します。


インターフェース仕様:
------------------------
Inputs: in1[16], in2[16]; Outputs: out[16];
タスク/論理回路/Not/ (Tasks/Logic Cuircuits/Not/)
NOT

NOT 仕様
=================

説明:
------------
NOT ゲートには入力が 1 つ、出力が 1 つあります。入力が 1 の場合、出力は 0 です。入力が 0 の場合、出力は 1 です。従って、NOT ゲートは入力を単純に反転します。
他の素子と同様、NOT ゲートは NAND ゲートを仕様して作成することができます。NAND の仕様をチェックしてください。


インターフェース仕様:
------------------------
Inputs: in; Outputs: out;


図解:
-------------------------
_____ | | -in--| NOT |--out- |_____|


真理値表:
------------
in || out ---------- 0 || 1 1 || 0

NOT4B

4 ビット NOT 仕様
=======================

説明:
------------
NOT4B 素子はバス版の NOT ゲートです。バスの全ビットに NOT 演算を適用します。


インターフェース仕様:
------------------------
Inputs: in[4]; Outputs: out[4];


図解:
-------------------------
_______ | | -in[4]--| NOT4B |--out[4]- |_______|


例:
---------
in || out ------------ 0000 || 1111 1111 || 0000 0101 || 1010 1010 || 0101 0110 || 1001 1001 || 0110

NOT16B

16 ビット NOT 仕様
========================

説明:
------------
NOT16B 素子はバス版の NOT ゲートです。バスの全ビットに NOT 演算を適用します。


インターフェース仕様:
------------------------
Inputs: in[16]; Outputs: out[16];
タスク/論理回路/And/ (Tasks/Logic Cuircuits/And/)
AND

AND 仕様
=================

説明:
------------
AND ゲートには入力が 2 つ、出力が 1 つあります。入力が両方とも 1 の場合、出力は 1 です。それ以外の場合、出力は 0 です。
AND ゲートは NAND ゲートの反転版です。


インターフェース仕様:
------------------------
Inputs: in1, in2; Outputs: out;


図解:
-------------------------
_____ -in1--| | | AND |--out- -in2--|_____|


真理値表:
------------
in1 | in2 || out ---------------- 0 | 0 || 0 0 | 1 || 0 1 | 0 || 0 1 | 1 || 1

AND4B

4 ビット AND 仕様
=======================

説明:
------------
AND4B 素子はバス版の AND ゲートです。両方の入力からの各ビットのペアに AND 演算を適用します。


インターフェース仕様:
------------------------
Inputs: in1[4], in2[4]; Outputs: out[4];


図解:
-------------------------
_______ -in1[4]--| | | AND4B |--out[4]- -in2[4]--|_______|


例:
---------
in1 | in2 || out ------------------- 0000 | 0000 || 0000 0000 | 0101 || 0000 0000 | 1010 || 0000 0000 | 1111 || 0000 0101 | 0101 || 0101 0101 | 1010 || 0000 0101 | 1111 || 0101 1010 | 1010 || 1010 1010 | 1111 || 1010 1111 | 1111 || 1111

AND16B

16 ビット AND 仕様
========================

説明:
------------
AND16B 素子はバス版の AND ゲートです。両方の入力からの各ビットのペアに AND 演算を適用します。


インターフェース仕様:
------------------------
Inputs: in1[16], in2[16]; Outputs: out[16];
タスク/論理回路/Or/ (Tasks/Logic Cuircuits/Or/)
OR

OR 仕様
================

説明:
------------
OR ゲートには入力が 2 つ、出力が 1 つあります。少なくとも入力の片方が 1 の場合、出力は 1 です。それ以外の場合、出力は 0 です。


インターフェース仕様:
------------------------
Inputs: in1, in2; Outputs: out;


図解:
-------------------------
____ -in1--| | | OR |--out- -in2--|____|


真理値表:
------------
in1 | in2 || out ---------------- 0 | 0 || 0 0 | 1 || 1 1 | 0 || 1 1 | 1 || 1

OR4B

4 ビット OR 仕様
======================

説明:
------------
OR4B 素子はバス版の OR ゲートです。両方の入力からの各ビットのペアに OR 演算を適用します。


インターフェース仕様:
------------------------
Inputs: in1[4], in2[4]; Outputs: out[4];


図解:
-------------------------
______ -in1[4]--| | | OR4B |--out[4]- -in2[4]--|______|


例:
---------
in1 | in2 || out ------------------- 0000 | 0000 || 0000 0000 | 0101 || 0101 0000 | 1010 || 1010 0000 | 1111 || 1111 0101 | 0101 || 0101 0101 | 1010 || 1111 0101 | 1111 || 1111 1010 | 1010 || 1010 1010 | 1111 || 1111 1111 | 1111 || 1111

OR16B

16 ビット OR 仕様
=======================

説明:
------------
OR16B 素子はバス版の OR ゲートです。両方の入力からの各ビットのペアに OR 演算を適用します。


インターフェース仕様:
------------------------
Inputs: in1[16], in2[16]; Outputs: out[16];

OR4W

4 方向 OR 仕様
======================

説明:
------------
OR4W 素子はバス版の OR ゲートです。少なくともバス内のビットの 1 つが 1 の場合、出力は 1 です。それ以外の場合、出力は 0 です。


インターフェース仕様:
------------------------
Inputs: in[4]; Outputs: out;


図解:
-------------------------
______ | | -in[4]--| OR4W |--out- |______|


例:
---------
in || out ------------ 0000 || 0 1111 || 1 0101 || 1 1010 || 1 0110 || 1 1001 || 1

OR16W

16 方向 OR 仕様
=======================

説明:
------------
OR16W 素子はバス版の OR ゲートです。少なくともバス内のビットの 1 つが 1 の場合、出力は 1 です。それ以外の場合、出力は 0 です。


インターフェース仕様:
------------------------
Inputs: in[16]; Outputs: out;
タスク/論理回路/Xor/ (Tasks/Logic Cuircuits/Xor/)
XOR

XOR 仕様
==================

説明:
------------
XOR ゲート (Exclusive-Or の短縮) には入力が 2 つ、出力が 1 つあります。どちらか一方 __だけ__ 入力が 1 の場合、出力は 1 です。それ以外の場合、出力は 0 です。


インターフェース仕様:
------------------------
Inputs: in1, in2; Outputs: out;


図解:
-------------------------
_____ -in1--| | | XOR |--out- -in2--|_____|


真理値表:
------------
in1 | in2 || out ---------------- 0 | 0 || 0 0 | 1 || 1 1 | 0 || 1 1 | 1 || 0

XOR4B

4 ビット XOR 仕様
========================

説明:
------------
XOR4B 素子はバス版の XOR ゲートです。両方の入力からの各ビットのペアに XOR 演算を適用します。


インターフェース仕様:
------------------------
Inputs: in1[4], in2[4]; Outputs: out[4];


図解:
-------------------------
_______ -in1[4]--| | | XOR4B |--out[4]- -in2[4]--|_______|


例:
---------
in1 | in2 || out ------------------- 0000 | 0000 || 0000 0000 | 0101 || 0101 0000 | 1010 || 1010 0000 | 1111 || 1111 0101 | 0101 || 1111 0101 | 1010 || 0000 0101 | 1111 || 1010 1010 | 1010 || 0000 1010 | 1111 || 0101 1111 | 1111 || 0000

XOR16B

16 ビット XOR 仕様
=========================

説明:
------------
XOR16B 素子はバス版の XOR ゲートです。両方の入力からの各ビットのペアに XOR 演算を適用します。


インターフェース仕様:
------------------------
Inputs: in1[16], in2[16]; Outputs: out[16];
タスク/高度な回路/Mux/ (Tasks/Advanced Circuits/Mux/)
MUX

マルチプレクサー仕様
=========================

説明:
------------
MUX 素子にはデータ入力が 2つ、選択入力が 1 つ、データ出力が 1 つあります。選択入力が 0 の場合、1 つめの入力からのデータが出力に転送されます。それ以外の場合、2 つめの入力からのデータが出力に転送されます。


インターフェース仕様:
------------------------
Inputs: in1, in2, sel; Outputs: out;


図解:
-------------------------
____ -in1--| \ | MUX |--out- -in2--|____/ | -sel----/


真理値表:
------------
sel | in1 | in2 || out ----------------------- 0 | 0 | 0 || 0 0 | 0 | 1 || 0 0 | 1 | 0 || 1 0 | 1 | 1 || 1 1 | 0 | 0 || 0 1 | 0 | 1 || 1 1 | 1 | 0 || 0 1 | 1 | 1 || 1

MUX4B

4 ビットマルチプレクサー仕様
===============================

説明:
------------
MUX4B 素子はバス版の MUX ゲートです。入力バスのいずれか 1 つのデータをすべて出力バスに転送しますが、それ以外の挙動は同じです。


インターフェース仕様:
------------------------
Inputs: in1[4], in2[4], sel; Outputs: out[4];


図解:
-------------------------
____ -in1[4]--| \ | MUX |--out[4]- -in2[4]--|____/ | -sel-------/


例:
---------
sel | in1 | in2 || out ------------------------- 0 | 1010 | 0101 || 1010 1 | 1010 | 0101 || 0101

MUX16B

4 方向 16 ビットマルチプレクサー仕様
======================================

説明:
------------
MUX4W16B 素子はバス版の MUX ゲートです。4 つの入力バスのいずれか 1 つのデータをすべて出力バスに転送しますが、それ以外の挙動は同じです。


インターフェース仕様:
------------------------
Inputs: in1[16], in2[16], in3[16], in4[16], sel[2]; Outputs: out[16];

MUX4W16B

16 ビットマルチプレクサー仕様
================================

説明:
------------
MUX16B 素子はバス版の MUX ゲートです。入力バスのデータをすべて出力バスに転送しますが、それ以外の挙動は同じです。


インターフェース仕様:
------------------------
Inputs: in1[16], in2[16], sel; Outputs: out[16];
タスク/高度な回路/Demux/ (Tasks/Advanced Circuits/Demux/)
DEMUX

デマルチプレクサー仕様
===========================

説明:
------------
DEMUX 素子にはデータ入力が 1つ、選択入力が 1 つ、データ出力が 2 つあります。選択入力が 0 の場合、データは 1 つめの出力に転送されます。それ以外の場合、データは 2 つめの出力に転送されます。データビットの値を取らない出力の値は常に 0 です。


インターフェース仕様:
------------------------
Inputs: in, sel; Outputs: out1, out2;


図解:
-------------------------
______ / |--out1- -in--| DEMUX | \______|--out2- | -sel-----/

真理値表:
------------
sel | in || out1 | out2 ----------------------- 0 | 0 || 0 | 0 0 | 1 || 1 | 0 1 | 0 || 0 | 0 1 | 1 || 0 | 1

DEMUX4W

4 方向デマルチプレクサー仕様
=================================

説明:
------------
DEMUX4W 素子にはデータ入力が 1つ、2 ビット幅の選択入力バスが 1 つ、出力が 4 つあります。選択入力バスの値により、どの出力が入力データの転送先となるか決定されます。他の出力の値はすべて 0 です。
例: 選択バスが値 “10” を持つ場合、データは 3 つめの出力に転送されます。2 進記数法についてはマニュアルの補遺を参照してください。


インターフェース仕様:
------------------------
Inputs: in, sel[2]; Outputs: out1, out2, out3, out4;


図解:
-------------------------
_______ / |--out1- / |--out2- -in--| DEMUX4W | \ |--out3- \_______|--out4- | --sel[2]---/

真理値表:
------------
sel | in || out1 | out2 | out3 | out4 ------------------------------------- 00 | 0 || 0 | 0 | 0 | 0 00 | 1 || 1 | 0 | 0 | 0 01 | 0 || 0 | 0 | 0 | 0 01 | 1 || 0 | 1 | 0 | 0 10 | 0 || 0 | 0 | 0 | 0 10 | 1 || 0 | 0 | 1 | 0 11 | 0 || 0 | 0 | 0 | 0 11 | 1 || 0 | 0 | 0 | 1
タスク/高度な回路/Adder/ (Tasks/Advanced Circuits/Adder/)
HALFADDER

半加算器仕様
========================

説明:
------------
HALFADDER は入力として 2 ビット受信して加算します。合計は出力とキャリービットとして与えられます。
2 進記数法と 2 進数の算術演算についてはマニュアルの補遺を参照してください。


インターフェース仕様:
------------------------
Inputs: in1, in2; Outputs: out, carry;


図解:
-------------------------
____ -in1--| | | HA |--out- -in2--|____| | \--carry-


真理値表:
------------
in1 | in2 || out | carry ------------------------ 0 | 0 || 0 | 0 0 | 1 || 1 | 0 1 | 0 || 1 | 0 1 | 1 || 0 | 1

FULLADDER

加算器仕様
========================

説明:
------------
FULLADDER は、HALFADDER と比べると “carry in” という追加の入力があるという点だけが異なります。合計結果は 3 つの入力ビットをすべて合計したものです。HALFADDER とは対照的に、多数の FULLADDERS を連鎖させることで、1 ビットより多きい数を足し合わせることができます。
2 進記数法と 2 進数の算術演算についてはマニュアルの補遺を参照してください。


インターフェース仕様:
------------------------
Inputs: carryIn, in1, in2; Outputs: out, carryOut;


図解:
-------------------------
-carryIn--\ _|__ ---in1--| | | FA |--out---- ---in2--|____| | \--carryOut-


真理値表:
------------
carryIn | in1 | in2 || out | carryOut ------------------------------------- 0 | 0 | 0 || 0 | 0 0 | 0 | 1 || 1 | 0 0 | 1 | 0 || 1 | 0 0 | 1 | 1 || 0 | 1 1 | 0 | 0 || 1 | 0 1 | 0 | 1 || 0 | 1 1 | 1 | 0 || 0 | 1 1 | 1 | 1 || 1 | 1

ADDER4B

4 ビット加算器仕様
=========================

説明:
------------
ADDER4B は 4 ビットバス版の FULLADDER です。従って 4 ビットの入力バスが 2 つ、4 ビットの出力バスが 1 つあり、一方キャリーインとキャリーアウトはそのままです。
2 進記数法と 2 進数の算術演算についてはマニュアルの補遺を参照してください。


インターフェース仕様:
------------------------
Inputs: carryIn, in1[4], in2[4]; Outputs: out[4], carryOut;


図解:
-------------------------
-carryIn----\ __|____ -in1[4]--| | | ADD4B |--out[4]- -in2[4]--|_______| | \--carryOut--

例:
---------
carryIn | in1 | in2 || out | carryOut ---------------------------------------- 0 | 0000 | 0000 || 0000 | 0 0 | 0101 | 0101 || 1010 | 0 0 | 1010 | 1010 || 0100 | 1 0 | 1111 | 1111 || 1110 | 1 1 | 0000 | 0000 || 0001 | 0 1 | 0101 | 0101 || 1011 | 0 1 | 1010 | 1010 || 0101 | 1 1 | 1111 | 1111 || 1111 | 1

ADDER16B

16 ビット加算器仕様
==========================

説明:
------------
ADDER4B は 16 ビットバス版の FULLADDER です。従って 4 ビットの入力バスが 2 つ、4 ビットの出力バスが 1 つあり、一方キャリーインとキャリーアウトはそのままです。
2 進記数法と 2 進数の算術演算についてはマニュアルの補遺を参照してください。


インターフェース仕様:
------------------------
Inputs: carryIn, in1[16], in2[16]; Outputs: out[16], carryOut;
タスク/高度な回路/Alu/ (Tasks/Advanced Circuits/ALU/)
ALU4B

マイクロハード 4 ビット算術論理演算装置仕様
====================================================

説明:
------------
ALU4B 素子には入力データバスが 2 つ、オペコード入力バスが 1 つあります。素子はデータ入力に対して 16 種類の演算を実行可能で、結果を出力データバスに書き出します。実行する演算はオペコードバスの値で決定されます。加えて、ALU には最終結果がゼロか負かを示すフラグがあります。
オペコードバスの各ビットにはそれぞれ機能が割り当てられています:
opCode[4] -> 1 の場合、in1 をビット単位で否定
opCode[3] -> 1 の場合、in2 をビット単位で否定
opCode[2] -> 0 の場合、out = (in1 ADD in2); 1 の場合、out = (in1 NAND in2);
opCode[1] -> 1 の場合、出力をビット単位で否定
add 機能および nand 機能の適用と合わせて入出力を否定することで、例に見られるように様々な結果を得ることができます。


インターフェース仕様:
------------------------
Inputs: in1[4], in2[4], opCode[4]; Outputs: out[4], negative, zero;


図解:
-------------------------
_____ -in1[4]--| |--out[4]--- | ALU |--zero----- -in2[4]--|_____|--negative- | -opCode[4]--/


例:
---------
opCode | in1 | in2 || out | zero | negative ---------------------------------------------- 0000 | 0011 | 0101 || 1000 | 0 | 1 // in1 + in2 0000 | 0001 | 1111 || 0000 | 1 | 0 // オーバーフロー 0101 | 0011 | 0101 || 0010 | 0 | 0 // in2 + in1 1001 | 0011 | 0101 || 1110 | 0 | 1 // in1 - in2 0010 | 0011 | 0101 || 1110 | 0 | 1 // in1 nand in2 0011 | 0011 | 0101 || 0001 | 0 | 0 // in1 and in2 1110 | 0011 | 0101 || 0111 | 0 | 0 // in1 or in2 0101 | 0011 | 0000 || 1101 | 0 | 1 // -in1 0001 | 1100 | 0000 || 0011 | 0 | 0 // not in1

ALU16B

マイクロハード 16 ビット算術論理演算装置仕様
=====================================================

説明:
------------
ALU16B 素子には入力データバスが 2 つ、オペコード入力バスが 1 つあります。素子はデータ入力に対して 16 種類の演算を実行可能で、結果を出力データバスに書き出します。実行する演算はオペコードバスの値で決定されます。加えて、ALU には最終結果がゼロか負かを示すフラグがあります。
オペコードバスの各ビットにはそれぞれ機能が割り当てられています:
opCode[4] -> 1 の場合、in1 をビット単位で否定
opCode[3] -> 1 の場合、in2 をビット単位で否定
opCode[2] -> 0 の場合、out = (in1 ADD in2); 1 の場合、out = (in1 NAND in2);
opCode[1] -> 1 の場合、出力をビット単位で否定
add 機能および nand 機能の適用と合わせて入出力を否定することで、例に見られるように様々な結果を得ることができます。


インターフェース仕様:
------------------------
Inputs: in1[16], in2[16], opCode[4]; Outputs: out[16], negative, zero;
タスク/メモリー/DFF (Tasks/Memory/DFF)
D 型フリップフロップ仕様
=========================

説明:
------------
DFF 素子は、入力で受信した値を保存し、1 クロックサイクル後にその値を出力します。その振る舞いは out(t)=in(t-1) のように記述することができます。
クロックサイクルを越えて状態を保持する特性があるため、DFF 素子はあらゆるメモリー素子のベースとなっています。
マニュアルの順次論理に関する章を参照してください。

インターフェース仕様:
------------------------
Inputs: in; Outputs: out;


図解:
-------------------------
_____ | | -in--| DFF |--out- |_____|


例:
--------
in || out ---------- 0 || 0 1 || 0 1 || 1 0 || 1 0 || 0 1 || 0 1 || 1
タスク/メモリー/レジスター/ (Tasks/Memory/Register/)
REGISTER

1 レジスター仕様
============================

説明:
------------
DFF 素子同様、REGISTER 素子には内部状態、入力、出力が 1 つずつあります。ただし、REGISTER の内部状態は、ロードフラグ入力が 1 の場合にのみ入力値がセットされます。
DFF 仕様書と、順次論理に関してマニュアルを参照してください。

インターフェース仕様:
------------------------
Inputs: in, load; Outputs: out;


図解:
-------------------------
_____ | | -in--| REG |--out- |_____| | --load--/


例:
--------
in | load || out ----------------- 0 | 0 || 0 1 | 0 || 0 1 | 1 || 0 0 | 0 || 1 0 | 1 || 1 0 | 0 || 0

REGISTER4B

4 レジスター仕様
============================

説明:
------------
REGISTER4B はバス版の REGISTER 素子です。

インターフェース仕様:
------------------------
Inputs: in[4], load; Outputs: out[4];


図解:
-------------------------
_______ | | -in[4]--| REG4B |--out[4]- |_______| | -----load---/


例:
--------
in | load || out ------------------- 0101 | 0 || 0000 1010 | 0 || 0000 0101 | 1 || 0000 1010 | 0 || 0101 1111 | 1 || 0101 0000 | 0 || 1111

REGISTER16B

16 レジスター仕様
=============================

説明:
------------
REG16B はバス版の REG 素子です。

インターフェース仕様:
------------------------
Inputs: in[16], load; Outputs: out[16];
タスク/メモリー/RAM/ (Tasks/Memory/Register/Ram)
RAM4W16B

4 レジスター 16 ビット RAM 仕様
===================================

説明:
------------
RAM4W16B は、4 つのアドレッシング可能なレジスターと 16 ビット幅のバスを持つランダムアクセスメモリーです。通常のレジスターと比べると、RAM4W16B は 4 つの異なる値を保存でき、それぞれアドレス入力バスを介してアドレッシングすることができます。

インターフェース仕様:
------------------------
Inputs: in[16], load, address[2]; Outputs: out[16];


図解:
-------------------------
__________ | | -in[16]--| RAM4W16B |--out[16]- |__________| | | -----load---/ | -address[2]---/

例:
--------
in | address | load || out ------------------------------------- 0x5555 | 00 | 1 || 0x0000 0x0000 | 00 | 0 || 0x5555 0x0000 | 01 | 0 || 0x0000 0xFFFF | 01 | 1 || 0x0000 0x0000 | 01 | 0 || 0xFFFF 0xAAAA | 10 | 1 || 0x0000 0x0FF0 | 11 | 1 || 0x0000 0x0000 | 00 | 0 || 0x5555 0x0000 | 01 | 0 || 0xFFFF 0x0000 | 10 | 0 || 0xAAAA 0x0000 | 11 | 0 || 0x0FF0

RAM64KW16B

64k レジスター 16 ビット RAM 仕様
=====================================

説明:
------------
RAM64KW16B は、65536 個のアドレッシング可能なレジスターと 16 ビット幅のバスを持つランダムアクセスメモリーです。通常のレジスターと比べると、RAM64KW16B は 65536 個の異なる値を保存でき、それぞれアドレス入力バスを介してアドレッシングすることができます。

インターフェース仕様:
------------------------
Inputs: in[16], load, address[16]; Outputs: out[16];
タスク/メモリー/カウンター/ (Tasks/Memory/Register/Counter/)
COUNTER4B

4 ビットカウンター仕様
===========================

説明:
------------
COUNTER4B 素子は REGISTER4B と似ていますが、2 つの違いがあります。
1 つめ: load フラグが 0 であるクロックサイクルでは、内部値が 1 増加します。
2 つめ: reset 入力フラグが追加されています。1 の場合、内部値を “0000” にセットしなければなりません。

インターフェース仕様:
------------------------
Inputs: in[4], load, reset; Outputs: out[4];


図解:
-------------------------
___________ | | -in[4]--| COUNTER4B |--out[4]- |___________| | | -----load----/ | -----reset-----/

例:
--------
in | load | reset || out --------------------------- 0101 | 0 | 0 || 0000 1010 | 0 | 1 || 0001 0101 | 1 | 0 || 0000 1010 | 0 | 0 || 0101 0110 | 1 | 1 || 0110 1110 | 1 | 0 || 0000 0000 | 0 | 0 || 1110 0000 | 0 | 0 || 1111 0000 | 0 | 0 || 0000 0000 | 0 | 0 || 0001

COUNTER16B

16 ビットカウンター仕様
============================

説明:
------------
COUNTER16B は REG16B と似ていますが、2 つの違いがあります。
1 つめ: load フラグが 0 であるクロックサイクルでは、内部値が 1 増加します。
2 つめ: reset 入力フラグが追加されています。1 の場合、内部値を “0x0000” にセットしなければなりません。

インターフェース仕様:
------------------------
Inputs: in[16], load, reset; Outputs: out[16];
タスク/デコーダー (Tasks/DECODER)
命令デコーダー仕様
=================================

説明:
------------
DECODER は、マイクロハード CPU で命令をデコードするために使用します。2 種類の異なる命令があります。

まず、instr[16] が “1” に等しい場合、instr[1:15] は定数として解釈してメモリーレジスターにロードしなければなりません。この場合、“cToM” と “loadM” 出力は “1” にセットしなければなりませんが、“loadD”、“loadA”、“jmpIfZ” 出力は “0” でなければなりません。さらに、命令の下位 15 ビットは “constant” に書き出さなければなりません。

2 つめに、instr[16] が “0” に等しい場合、デコーダーは残りの命令に対してさらに複雑な解釈を施さなければなりません:

bit: 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 instr[1:16]: 0 d d a b b o o o o j c c c c c \__/ | \__/ \________/ | \___________/ instr[14:15] destination ------/ | | | | | instr[13] operand1 -----------/ | | | | instr[11:12] operand2 ---------------/ | | | instr[7:10] operation code ------------------------/ | | instr[6] jump if zero --------------------------------/ | instr[1:5] constant -----------------------------------------/

この場合、CPU は “operation code” で指定されたオペレーションを、“operand1” と “operand2” でデコードされたオペランドに対して実行しなければなりません。

命令のうち “operation code”、“operand1”、“operand2”、“jump if zero” の各ビットは、順にデコーダーの “opCode”、“op1”、“op2”、“jmpIfZ” 出力に直接転送することができます。

この場合も、命令の下位 15 ビットは “constant” に書き出さなければなりません。ただし、“constant” をオペランドとして使う場合、CPU はその下位 5 ビットだけを ALU に入力しなければなりません。

“operand1” が “0” の場合、アドレスレジスターの値を ALU にオペランドとして入力します。それ以外の場合、instr[1:5] のビット列に相当する “constant” を第 1 引数として入力します。

destination は ALU の演算結果の保存先を指定します。“op1” と “op2” は CPU がデコードしますが、命令の “destination” ビット列は、以下のデコード規則に従って DECODER がデコードしなければなりません:

destination = 00 -> loadA をセット、loadM と loadD は 0
destination = 01 -> loadA は 1 ; loadM と loadD は 0
destination = 10 -> loadM は 1 ; loadA と loadD は 0
destination = 11 -> loadD は 1 ; loadA と loadM は 0

インターフェース仕様:
------------------------
Inputs: instr[16]; Outputs: cToM, loadA, loadD, loadM, op1, op2[2], opCode[4], jmpIfZ, constant[15];


図解:
-------------------------
_________ | |--cToM--------- | |--loadA---------- | |--loadD---------- | |--loadM---------- -instr[16]--| Decoder |--op1---------- | |--op2[2]------- | |--opCode[4]---- | |--jmpIfZ------- |_________|--constant[15]-


例:
---------
instr || cToM | jmpIfZ | loadA | loadD | loadM | op1 | constant | op2 | opCode ------------------------------------------------------------------------------- 0x0000 || 0 | 0 | 0 | 0 | 0 | 0 | 0x0000 | 00 | 0000 0x8000 || 1 | 0 | 0 | 0 | 1 | 0 | 0x0000 | 00 | 0000 0xFFFF || 1 | 0 | 0 | 0 | 1 | 1 | 0x7FFF | 11 | 1111 0x7FFF || 0 | 1 | 0 | 1 | 0 | 1 | 0x7FFF | 11 | 1111 0x7C1F || 0 | 0 | 0 | 1 | 0 | 1 | 0x7C1F | 11 | 0000 0x7C0F || 0 | 0 | 0 | 1 | 0 | 1 | 0x7C0F | 11 | 0000
タスク/CPU (Tasks/CPU)
マイクロハード中央処理装置仕様
===============================================

説明:
------------
マイクロハード CPU は、マイクロハード ALU に類似した多様な命令を高水準で実行できます。ただし、ALU は単一の算術命令しか実行できませんが、一方 CPU はプログラム実行フローを管理することで多数の命令で構成される複雑なプログラムを実行することができます。


インターフェース仕様:
------------------------
Inputs: instr[16], data[16], reset; Outputs: write, dataAddr[16], instrAddr[16], result[16];


図解:
-------------------------
_____ -instr[16]--| |--instrAddr[16]- | | --data[16]--| CPU |--dataAddr[16]-- | |--result[16]---- |_____|--write--------- | -------reset---/


ユーザー命令:
------------------
プログラムを実行するには、プログラムの命令を含んだ RAM 素子と、処理する必要のあるデータをすべて含んだ 2 つめの RAM 素子を CPU に接続する必要があります。

プログラム用 RAM 素子は、CPU の “instr” バスと “instrAddr” バスに接続しなければなりません。この RAM の “in” バスと “load” 入力には何も接続しません。

データ用 RAM 素子は、CPU の “data” バスと “dataAddr” バスに接続しなければなりません。この RAM の “in” バスは CPU の “result” 出力に、RAM の “load” 入力を CPU の “write” 出力に接続しなければなりません。

プログラムを開始するには、1 クロックサイクルの間 reset ピンに値 “1” を供給し、確実にプログラムが先頭から実行されるようにします。


実装詳細:
-----------------------
CPU には (様々な素子のうち特に) レジスターが 2 つ、カウンターが 1 つ、ALU が 1 つ含まれています:
- 算術レジスター (AR) は計算結果を一時的に保存するのに使用します
- メモリーレジスター (MR) は接続されたデータ RAM のアドレスを参照するのに使用します

- プログラムカウンター (PC) は接続された命令 RAM のアドレスを参照するのに使用します

- ALU は算術演算を行うのに使用します

本仕様書では、これらの素子を AR、MR、PC、ALU と呼びます。


挙動仕様:
-------------------------
命令が DECODER によってデコードされた (詳細は DECODER の仕様書を参照) 後、CPU は DECODER の出力を使用して以下のように動作します:

- デコーダーの “cToM” と “loadM” 出力が “1” の場合、“constant” 出力は
MR にロードしなければなりません。
- “loadM” が “1” で “cToM” が “0” の場合、ALU の演算結果は
MR にロードしなければなりません。
- “loadA” が “1” の場合、ALU の演算結果は AR にロードしなければ
なりません。
- CPU の “write” 出力は DECODER の “loadD” 出力と同じ値でなければ
なりません。
- DECODER の “opCode” 出力は ALU に直接入力しなければなりません。
- DECODER の “op1” 出力が “1” の場合、“constant” はALU に
第 1 オペランドとして入力しなければなりません。それ以外の場合、AR を ALU に入力しなければなりません。
- DECODER の “op2” 出力については:
“00” -> “constant” を ALU に第 2 オペランドとして入力
“01” -> AR を ALU に第 2 オペランドとして入力
“10” -> MR を ALU に第 2 オペランドとして入力
“11” -> データバスを ALU に第 2 オペランドとして入力
- “constant” を ALU にオペランドとして入力する場合、“constant” の下位 5 ビットだけが使用されます。この 5 ビットの値は、符号に一致するように 16 ビットにパディングされます。
- ALU の “jmpIfZ” と “zero” フラグが “1” の場合、MR の値を PC に
ロードします。
- ALU の出力を “result” バスに書き出します。
- MR の出力を “dataAddr” バスに書き出します。
- PC の出力を “instrAddr” バスに書き出します。
- “reset” 入力がセットの場合、PC を “0” にします。


例:
---------
instr | data | reset || instrAddr | dataAddr | result | write ----------------------------------------------------------------- // result = const + AR = ? (レジスター状態が不明): 0x0000 | 0x0000 | 0 || x | x | x | 0 // プログラムカウンターをリセットする 0x0000 | 0x0000 | 1 || x | x | x | 0 // 0x00FF を MR にロードする: 0x80FF | 0x0000 | 0 || 0x0000 | x | x | 0 // AR = const + data = 1 + 0 = 1: 0x3C01 | 0x0000 | 0 || 0x0001 | 0x00FF | 0x0001 | 0 // result = AR + const = 1: 0x0000 | 0x0000 | 0 || 0x0002 | 0x00FF | 0x0001 | 0 // MR = AR + const = 1: 0x4000 | 0x0000 | 0 || 0x0003 | 0x00FF | 0x0001 | 0 // data = const + MR = 1: 0x7800 | 0x0000 | 0 || 0x0004 | 0x0001 | 0x0001 | 1 // MR を PC にロードする: 0x1020 | 0x0001 | 0 || 0x0005 | 0x0001 | 0x0000 | 0 // ノーオペ: 0x1000 | 0x0001 | 0 || 0x0001 | 0x0001 | 0x0000 | 0 // ノーオペ: 0x1000 | 0x0001 | 0 || 0x0002 | 0x0001 | 0x0000 | 0
ドキュメント/ブリーフィング/ (Documents/Briefings/)
ようこそ (Welcome)

マイクロハードにようこそ!

ある人はこう言いました: 巨人たちは私たちが考えているようなものではない。巨人たちに力を与えているように見える性質は、むしろ弱さの源泉になっていることがよくある。

市場で入手可能なモダンな CPU は度をはるかに越して複雑であると、私たちマイクロハード社員一同は考えています。複雑な命令セットと後方互換性を持つことで、技術産業の巨人たちは、過去の遺産と効率性を引き換えにしています。私たちマイクロハードにとってこうした状況は、廉価で高効率な代替 CPU を供給して技術産業に変化を起こす好機です。あなたがハードウェアエンジニアとして私たちの取り組みに参加してくれることをうれしく思います。

あなたの仕事は、マイクロハード独自の CPU を作るために必要な、様々なハードウェア素子を設計することです。設計する素子の仕様と検証試験を渡します。もし「分からない」、「手に負えない」と思ったら、まずは落ち着いてこの 3 つの豆知識を思い出してください:

1.何をしたらいいのか分からないとき: マニュアルと仕様を読んでください!
2.デザインを作っているとき: 紙に描き出してください! 画面を見るだけで
すごいものを作り出せるなんて人はいません……。
3.自分のデザインがどこか間違っているとき: エラーメッセージと失敗したテストを詳しく調べて
どこが問題なのかを見つけ出してください。

以上のことはしっかり覚えておいてください……。すぐに役立ちますよ!

あなたの最初のタスクは NOT ゲートを開発することです。このタスクは、左のエクスプローラーの “Tasks/” フォルダーに入っています。ですが、よければ最初にマニュアルをチェックしてください……。

一緒に働くことを楽しみにしています。
ウィル

ピンがもっと必要です (We need more pins)

コツをつかんだようですね。素晴らしい!

これまでに作ってくれた素子はうまく機能しますが、バス版も開発する必要があります。バス版を設計するタスクは、これまでに開発した素子を再利用できるので、簡単なはずです……。ですが、まずはデザインエディターのバスシンタックスをしっかり理解することです!

マニュアルのバスシンタックスに関する部分をチェックしてください。

この調子で頑張ってください。
ウィル

テッドには会いましたか? (Have you met Ted?)

今日は素晴らしい知らせがあります!

バス版の最終デザインを 1 つ 1 つ作っていくのは面倒ですし、あなたの頭脳を単純作業で浪費したくはありません……。幸い、この手伝いをしてくれるインターンを雇うことができました!

テッドは初心者なので、独創的なデザインを思い付いてくれるなんて期待はしないでください。でも、作成済みの素子のバス版を作るのを手伝ってくれますよ。

テッドは働いて、あなたは楽しむわけです!
ウィル

素敵な DFF (Sweet DFFs)

世界最高の CPU でも、駆動に必要なプログラムや生成した結果を保存できなければ、てんで価値がありません。

今まで設計してくれたすべてのハードウェア素子に共通しているのは、メモリーがないということです。それを変える必要があります。そういうわけで、素敵な D 型フリップフロップを仕入れました!

順次素子を設計する際は、タイミング面をしっかり考慮してください……。マニュアルの順次論理の章をチェックして、“Completed/” フォルダーにある D 型フリップフロップの仕様書を見てください。

ウィル

エイ・エル・ユー! (Ey Al you!)

これは素晴らしい! 私たちは一歩ずつ、一設計ごとに CPU 市場を吹き飛ばす目標に近付いています。

知っているかもしれませんが、CPU が行う計算は、実は ALU (算術論理演算装置) の仕事です。そしてうれしいことに、独自の ALU を作るのに必要なものは、基本的にすべて手にしています。ワイヤリングしさえすれば良いわけです。

繰り返しになりますが: まず紙にデザインを描き出してください!

ウィル

素晴らしいものが待っている (Great things await)

ずいぶん遠くへ来たものです!

ついに、私たちのマイクロハード CPU を作るのに必要な素子がすべて揃いました! 私たちの CPU は、(大雑把に言うと) ALU といくつかのレジスターで構成されます。残る作業はこれらの素子をワイヤリングすることだけですが、そこは言うは易く行うは難し。

CPU の作成過程は 2 つのステップから成ります……。1 つめはデコーダーの設計、2 つめは CPU 自体の設計です。ただし、これらの素子単体を理解するには、2 つがどのように連係するのか、2 つとも理解しないといけません。まずは渡した仕様書を両方とも精読してください。

これが、市場で行動を起こすために完了する必要のある最後のステップです! 成否はすべて設計にかかっています! 私たちは、夢も希望もすべてあなたの手に委ねます! これが世界を変えるかもしれません!

できればでいいですよ。
ウィル

ジ・エンド? (The End?)

すごい!

あなたが頼りになることは最初から分かっていました! あなたがいなければここまで来られませんでした。でも、また終わりではありません。あなたが素晴らしい製品を作ったことは間違いありませんが、人々はまだ知らないのです。製造とマーケティングを直ちに開始できるよう準備しました。営業部はてんてこまいです。

マイクロハード CPU を市場に送り出すにはしばらくかかりますが、今は特にしてもらうことはありません。

休暇でも取って、2、3ヶ月後にチェックしに戻って来てはどうでしょう。あなたはそれくらいしてもバチは当たりませんよ! その間、私は新しいアイディアをひねり出すようにしておきます。

また話すのを楽しみにしています。
ウィル

(追伸: 次回お楽しみに……。)