← ブログに戻るリレーでコンピュータを作る · 18/18

1ビットメモリ:RAMの原子 — そしてリレーでコンピュータを作る最終回

1ビットのリレーメモリセルを作ります。Write をハイにして記憶し、ローにして保持します。リレーから RAM への道筋に加え、ツーゼの Z3、エイケンの Mark I、グレース・ホッパーの最初のコンピュータバグをたどります。

Matthias KellerMatthias Keller
読了まで約15分
Chalkboard feature illustration for “1ビットメモリ:RAMの原子 — そしてリレーでコンピュータを作る最終回”

前回の記事では、D ラッチを作りました。これは Data 入力と Write イネーブル線を受け取り、Write がアサートされた瞬間に Data で見た値を忠実に記憶する回路です。リレーの世界における制御可能なメモリスロットであり、ほぼ完成した再利用可能なメモリセルでした。ただし、あと少しだけ仕上げが残っていました。

これはリレーでコンピュータを作るの第18回、最終回です。このメモリセルを完成させ、その正体にふさわしい名前を付けます。そして、このシリーズが17回にわたって目指してきたことを行います。カチッと鳴る1つのスイッチから記憶された1ビットまで、私たちが一緒に登ってきたはしごの全段をたどるのです。

RAM の原子へ、ようこそ。

1ビットメモリセルをパッケージ化する

D ラッチはすでに難しい仕事をこなしています。Write イネーブル線(EN や WE と呼ばれることが多い)と Data 線(D)を持ち、Write がハイの間に見た D の最後の値を保持します。しかし、生のラッチは交差結合されたリレーのフィードバックや直接の出力ピンといった内部トポロジーを露出しており、問題を起こす配線をユーザーがしてしまう余地があります。

1ビットメモリセルは、明快なインターフェース契約で包んだ D ラッチです。

  • Write — 1本の制御線です。書き込むにはハイ(1)へアサートし、読み出しまたは単に保持するにはロー(0)にします。
  • Data — 記憶したいビットで、0 または 1 です。
  • Q — 記憶された出力です。Write が 1 の間は Data を反映し、Write が 0 に戻ると最後の値を保持します。

それ以外、すなわち交差結合フィードバックや禁止状態を防ぐインバータは、すべて内部に封じ込められています。ユーザーがそれらを見る必要はありません。このセルの状態表は驚くほど簡潔です。

WriteDataQ(次状態)
0—Q(保持)
100
111

Write が 0 のときの Data 列のダッシュにこそ、すべての意味があります。Write がローのとき、Data は関係ありません。セルは聞いていないのです。最後に聞いた値を保持し、電源が供給される限り保持し続けます。

状態表に書けないことにも注目してください。最後に何を書き込んだかを知らなければ、現在の Q が何かはわかりません。メモリには状態があります。メモリは現在の入力だけの純粋な関数ではなく、入力と履歴の関数です。これが、組み合わせ回路(AND、OR、XOR、加算器)と順序回路(ラッチ、フリップフロップ、レジスタ、RAM)の決定的な違いです。組み合わせ回路は状態を持ちません。入力を与え、出力を読み取れば終わりです。順序回路は過去を現在へ持ち越します。ラッチは記憶するのです。

1ビットから1台のコンピュータへ拡張する

ここで、この抽象化がその価値を発揮します。

このセルを8個同時に書き込めば、1バイト、すなわちプロセッサが1回の操作でロード、変更、保存できる0から255までの数を記憶できます。1,000バイトでキロバイト、100万バイトでメガバイト、10億バイトでギガバイトになります。現代のコンピュータは、郵便切手ほどの大きさのチップ上に数百億個のこのセルを載せ、毎秒何百万回も Write と Hold を切り替えています。

すべてのセルは、上にある同じ2行の状態表に従います。リレーをトランジスタまで小さくし、シリコン1平方センチメートルに40億個を詰め込んでも、表の内容は何も変わりません。小さくなったのはスイッチです。論理は変わりません。

自分で試してみよう

以下は、D ラッチを明快な1ビットメモリセルとしてパッケージ化した memory-bit セルです。ブラウザ上で本物のリレーシミュレーションとして動作します。アニメーションではありません。リレー接点が物理的に切り替わり、電流が流れ、Q が実際の状態を保持します。

リレーから作った1ビットメモリセルです。Write をアサートして Data を設定しビットを記憶した後、Write を解除すると、リレーはあなたからの入力なしにその値を保持します。。
Open in the Relay Lab

次の手順を、意識して順に試してください。

  1. 1を記憶する。 Data = 1 に設定してから、Write = 1 をアサートします。セルがラッチされ、Q は 1 になります。次に Write を 0 へ戻します。Data はもう関係ありません。動かしても、0 へ切り替えても、想像の中で外しても構いません。Q は 1 のままです。あなたはいま、1ビットを記憶しました。

  2. 0で上書きする。 Data = 0 に設定してから、Write をもう一度短くハイへパルスさせます。Q は 0 に下がります。Write を解除すると、Q は 0 を保持します。いま、ビットを上書きしました。

  3. 入力がなくても保持することを確認する。 Write と Data の両方を 0 のままにします。Q は 0 のままです。セルは入力に反応しているのではなく、最後に指示された値を記憶しているだけです。

あなたはいま、手作業で1ビットを記憶しました。では、同じセルが100万個あるところを想像してください。どれも同一で、それぞれが根気よく自分の0または1を保持し、Write 線がアサートされるまで外界の声を聞きません。そのイメージこそが RAM です。

あなたが登ってきたはしご

このシリーズには、第1回の最初のクリックから計画がありました。これらの回路で動いたリレーコンピュータを見る前に、そのすべてを一緒にたどり直しましょう。全体を一度に見ると、その軌跡は目を見張るものだからです。

第1回 — リレーそのもの。 電気が制御するスイッチです。コイルが電機子を引き、電機子が接点を動かし、1つの回路が別の回路内のスイッチを切り替えます。通常開ならバッファ、通常閉ならインバータになります。あのクリック音は単なる心地よい音ではなく、あらゆるものの種でした。

第2〜3回 — 直列と並列。 2つのスイッチを直列につなぐと、両方が閉じたときだけ電流が流れます。これは AND です。2つのスイッチを並列につなぐと、どちらかが閉じれば電流が流れます。これは OR です。まだゲート記号はなく、あるのは配線と観測できる電流の振る舞いだけでした。論理はすでに銅線に書かれていたのです。

第4〜7回 — 名前を得たゲート。 AND、OR、NOT は、ジョージ・ブールの代数と、リレーネットワークとブール代数が同じものであることを示したクロード・シャノンの1937年の証明により、名前と記号を得ました。バッファ、インバータ、3つのゲートはすべて、リレーハードウェアでの第一原理からの構成です。

第8〜9回 — ユニバーサルゲート。 NAND と NOR は、それぞれが存在する任意の論理関数を実装できます。その単純さには目がくらみます。1種類のゲートを創造的に配線するだけで、ほかのすべてを得られます。続いて、NOR ゲートに大きく依存したアポロ誘導コンピュータを見ました。月面ミッションは、あなたが今なら自作できる回路で飛んだのです。

第10〜11回 — XOR と XNOR。 違いを検出する回路です。XOR は入力が異なるときに1を出力します。これはエラー検出、暗号化、そして決定的に重要な算術に現れる、驚くほど強力な考え方です。

第12〜13回 — 加算器。 XOR が和のビットを生み、AND が桁上がりを生みます。2つのスイッチ、2つの出力、2進加算です。次に半加算器は、キャリー入力を備えた全加算器へと発展しました。合成でき、連鎖でき、今日のすべてのプロセッサが中核で使うリップルキャリーアーキテクチャです。ジョージ・スティビッツは1937年、台所のテーブル上で、リレーと接点に使ったたばこ缶により、これが機能することを証明しました。

第14〜16回 — フィードバックとクロック。 シリーズで初めて登場する純粋な順序的な考え方です。インバータの出力を自分自身の入力へ戻すように配線すると、回路は発振します。その発振を規則的な矩形波へ整えれば、クロック、すなわち順序回路を足並みをそろえて更新させる心拍が得られます。クロックがなければ、コンピュータは一度計算して停止する組み合わせネットワークです。クロックがあれば、プログラムに従って段階を追い、繰り返し計算します。

第17回 — D ラッチ。 フィードバックが建設的に使われます。指示されるまで状態を保持する交差結合リレーと、禁止状態(両方のリレーがオンの状態)を防ぐ Write イネーブル線です。リレー回路における制御可能なメモリです。

第18回 — 1ビットメモリセル。 D ラッチを明快なインターフェースの内側にパッケージ化します。Write をハイにして記憶し、Write をローにして保持します。8個積めば1バイト、数百万個積めば1メガバイトです。

そして今、成果を受け取るときです。

コンピュータは、突き詰めれば4つのものから成っています。

  1. クロック — 時を刻み、ほかのすべての回路にいつ動作するかを伝える規則的な発振器。
  2. ALU — 演算論理装置。加算器、比較器、ブール演算です。
  3. メモリ — クロックの刻みの間、プログラムの実行中、電源サイクルをまたいで状態を保持する記憶装置。
  4. 制御と選択 — 正しいデータを正しい場所へ正しい時刻に送る、マルチプレクサ、デコーダ、命令論理です。

あなたは今、これらすべてをリレーから、手で、第一原理から組み立てました。クロックは第14〜16回。ALU は第12〜14回。メモリは第16〜18回。制御と選択は第7回と第12回(マルチプレクサ、デコーダ)です。残るのは規模と組織化、すなわちプログラムの指示のもとで何千もの構成要素を配線することだけです。しかし物理法則はすべてここにあります。基本的な考え方で欠けているものはありません。必要なのは、もっと多くの配線だけです。

まさにこれを行った機械たち

1940年代の実在のリレーコンピュータは、あなたがしてきたこととまさに同じことをしていました。ただし、部屋を埋め尽くし、数百万米ドルの費用がかかる規模で行っていたのです。

コンラート・ツーゼの Z3(1941年)は、完全にプログラム可能で自動制御される最初の計算機と広く認められています。ドイツ人土木技師で、ベルリンにある両親の居間で最初のコンピュータを作ったツーゼは、約2,000個のリレーを組み立て、パンチフィルムのストリップに格納されたプログラムを実行できる機械を作りました。Z3 は浮動小数点演算を使い、配線し直さずに再プログラムできました。1943年の連合軍による爆撃で破壊されました。ツーゼは算術を扱った回でこのシリーズに短く登場しましたが、ここで Z3 を十分に取り上げる価値があります。これは、私たちが作ってきたアーキテクチャに合致した最初の機械でした。クロック、ALU、メモリ、制御が、同じカチカチ鳴るスイッチから組み立てられていたのです。

米国では、ハーバード大学のハワード・エイケンが IBM と協力してMark Iを作りました。正式名称は IBM Automatic Sequence Controlled Calculator で、1944年に公開されました。全長51フィート(約15.5メートル)、高さ8フィート(約2.4メートル)、重量約5トンの Mark I には、機械式カウンタ、クラッチ、カムシャフトが林立する中に、約3,300個のリレーが含まれていました。2つの数を掛けるのに3〜5秒かかりました。パンチ紙テープから命令を受け取り、弾道表、対数表、後にはマンハッタン計画の数学的作業を計算しながら何年も連続して動作しました。ハーバード大学への来訪者は建物の外からもその音を聞けました。3,300個のリレーを持つコンピュータが働くリズミカルな音は、控えめなものではありませんでした。

Mark I の後には、1947年に同じくハーバードでMark IIが続きました。これも似た電気機械式の機械でした。そして Mark II は、コンピューティングにまつわる最も長く語り継がれる逸話の1つを私たちに残しました。

1947年9月9日、若い海軍士官で数学者でもあったグレース・ホッパーを含むオペレータのチームは、Mark II の動作が不安定であることに気付きました。故障箇所をパネル F のリレー #70 まで追跡しました。リレーを取り外すと、接点の間に挟まり、接点が適切に閉じるのを妨げていた蛾、つまり本物の生きた蛾が見つかりました。蛾はピンセットで慎重に取り除かれ、作業ログブックに貼り付けられ、次のメモが添えられました。「バグが見つかった最初の実例」

そのログブックのページは今も残っています。スミソニアン国立アメリカ歴史博物館に展示され、蛾もテープの下に今なお残っています。

技術的な故障を表す “bug” という語は、それ以前から何十年も非公式に存在していました。トーマス・エジソンは、装置の不調を説明するために1878年にはすでに使っていました。それでもあの貼り付けられた蛾の事件を誰もが覚えているのは、あまりに文字どおりだったからです。本物の昆虫が、本物のリレーの中で、本物のコンピュータの中にいたのです。比喩が肉体を得た瞬間でした。そしてそれはリレーコンピュータで起こりました。リレーコンピュータは、蛾が内部に入れるほど大きく、開放的だったからです。トランジスタは密封されています。蛾に入り込む余地はありません。

系譜:リレー → 真空管 → トランジスタ → チップ

リレーコンピュータは1930年代後半から1950年代初頭まで使われました。その後、真空管コンピュータに急速かつ完全に置き換えられました。真空管には可動部品がありません。機械的な電機子の代わりに、真空にしたガラス管の内部にあるグリッド電極が電子の流れを制御し、同じスイッチング機能をミリ秒ではなくマイクロ秒で実行しました。論理は同じでした。アーキテクチャも同じでした。変わったのはスイッチだけです。

次に真空管は、1947年にベル研究所で実証され、1950年代を通じて商用化されたトランジスタに置き換えられました。トランジスタは半導体スイッチです。ベース端子に加えた小さな電圧が、コレクタとエミッタの間を流れるより大きな電流を制御します。可動部品も、ガラス管も、切れるフィラメントもありません。毎秒何百万回もの動作が可能です。論理は同じでした。アーキテクチャも同じでした。変わったのはスイッチだけです。

その後トランジスタは、シリコンウェハ上に何十億個も集積されました。1958年に誕生し、現在もあなたが所有するあらゆる計算装置の基盤技術である集積回路です。論理は同じです。アーキテクチャも同じです。スイッチだけが微小になりました。

第1回で出会った、ばね付き電機子の下で音を立てて切り替わるリレーと、あなたのスマートフォン内で毎秒500兆回静かに切り替わるトランジスタは、同じことをしています。どちらも制御されたスイッチ、すなわち一方の回路を使う電気が別の回路を制御するものです。シャノンの1937年の代数は、同じ記号を使い、同じ真理値表を導きながら、その両方を記述します。

計算ハードウェアの歴史は、ある見方をすればリレーの歴史です。その後に来たすべては、同じ考え方をより高速に、より静かに、より小さくしたバージョンなのです。

この先へ進むには

シリーズを最後まで読み終えた方へ、率直に3つのおすすめがあります。

第一に:もっと大きなものを作る。 このシリーズの回路はブログ記事向けの大きさでした。全加算器を8個連鎖させ、結果を保持するレジスタを配線し、クロックを加え、8ビット演算が実際に実行されるのを見ると何が起きるでしょうか。DigiSim Relay Lab には、まさにその進み方があります。8段すべてに桁上がりが伝播する様子を見られる8ビット加算機、2進数を順に数えながらカチカチ動く3ビットのリップルカウンタ、立ち上がりクロックエッジでのみデータを取り込むエッジトリガ D フリップフロップ、1個のフリップフロップでクロックを半分の周波数にする分周器です。これらは驚きを生む構成です。本物のプログラムがリレー論理上で動き、すべてのクリックを見て聞くことができます。ブログ記事には埋め込まれていません。ブログ記事はそれらには小さすぎるからです。これらには広いキャンバスがふさわしいのです。

第二に:チャールズ・ペッツォルドの CODE を読む。 このシリーズはこの本から深い着想を得ました。ペッツォルドの本はモールス符号と懐中電灯から始まり、第一原理から段階的に作る実用的な CPU へ至ります。その道筋は厳密であると同時に人間味があります。本書は、このシリーズで扱った同じ領域を取り上げ、さらに機械語、アセンブリ、オペレーティングシステムへ進みます。読むことにおいて DigiSim がシミュレーションで提供するものに相当する本を求めるなら、CODE がそれです。

第三に:自分自身のものを作る。 DigiSim のキャンバスを開き、リレーを置いて、このシリーズを読みながら思い付いたものを配線してください。「誰かの回路をなぞる」ことから「自分の回路を設計する」ことへの飛躍こそ、本当の卒業です。新たな知識は必要ありません。必要なものはすべて手にしています。自分のやり方でリレーをカチッと鳴らしましょう。

17回前、あなたは電気によって切り替えられるスイッチに出会いました。今日、あなたは沈黙の中でもビットを保持するメモリセルを作り、そのクリックからこれまでに作られたあらゆるコンピュータまで続く線をたどりました。その線は途切れていません。

リレーで作られたコンピュータが実際に動く様子を見に行きましょう。DigiSim Relay Lab。

アイデアを実際に動く回路にしましょう。