https://www.crimson-systems.com YouTube
  
ENIAC 10進リングカウンター        → ENIACシュミレーター  → ENIACプログラミング


https://americanhistory.si.edu/collections/object/nmah_334746


真空管による 10個のフリップフロップを環状に繋ぎ、1つのパルスで 0~9までの数字を表現します。
このリングカウンターを10個組み合わせて10桁の数値を記憶します。



Arthur W. Burks → https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-8-pdf/k-8-r5367-1-ENIAC-circuits.pdf







リングカウンター全体   https://funkygoods.com/schwarzschild/2010_11/2010_11_22.html



   
真空管 6SN7   FF回路図
 


6SN7は、3極管が2つ入った
8ピンオクタルベースの双三極真空管

   
















●サイクリング・ユニット
 全ての機器(ユニット)を同期させる為に、サイクリング・ユニットがあります。
主となる中央プログラミングパルス(CPPは、すべてのユニットの動作を管理する為パルスを生成(送信)します。

加算時間と呼ばれる基本サイクルは、100kHz 20サイクル(200マイクロ秒)です。
この20サイクルは、マシン全体に送信される一連の信号を生成するために使用されます。



サイクリング・ユニットは下図の10個のパルス列を生成します。
また、1P、1′ P、2P、2′ P、4P、9P、および10P信号はすべて、各ユニットから送信される数字を生成するために使用されます。
 


① 中央プログラミングパルス 17サイクル目に1パルス  
② 10パルス 最初の10サイクルで10パルス(位相を半サイクルずれ) ACCから数値データを転送・送信する際、10進リングカウンタを一回転させて元の状態に戻す
③ 9パルス 最初の9サイクルで9パルス               減算用に、9の補数を作成し、1'パルスと連携し、10の補数を作成する
④ 1パルス 最初のサイクルで1パルス 乗算器で1〜9の任意の「数字パルス」を作成する要素
⑤ 2パルス 2サイクル目と3サイクル目に2つのパルス 乗算器で1〜9の任意の「数字パルス」を作成する要素
⑥ 2'パルス 4サイクル目と5サイクル目に2つのパルス 乗算器で1〜9の任意の「数字パルス」を作成する要素
⑦ 4パルス 6、7、8、9サイクル目 乗算器で1〜9の任意の「数字パルス」を作成する要素
⑧ 1'パルス 10サイクル目に1パルス(補数作成用)            補数作成時、9Pと連携
⑨ キャリークリアパルス 11サイクル目から17サイクル目までの長いパルス      キャリーが10桁すべてに伝播する場合(たとえば、1 + 9,999,999,999)時間がかかるのを考慮
⑩ リセットパルス 13サイクル目と19サイクル目にそれぞれ1回ずつ、計2回のパルス




 フリップ・フロップ回路    
1918年、William Eccles とFrank Jordan が、トリガー回路を発表し後にフリップ・フロップと呼ばれるようなりました。
2本の真空管のON/OFFを保持(記憶)でき、現在の1ビットメモリの基礎になっています。



V1がON、 V2がOFFの状態時において
入力 I1がnegative pulseを受けるとtriggerしてV1がOFF、 V2がONになり
出力O1からpositive pulse、 出力 O2からnegative pulseが出力される。

この状態で、再度 入力I1にnegative putseを入力しても状態は変化しないが
入力 I2にnegative pulseを入力すると V1がON, V2がOFFの状態に戻る







リングカウンター回路図
ENIACは、内部の計算(パルスの加算)は、10進数で処理し、フリップ・フロップ 回路を利用し、1桁の数値 0~9まで表示できるようになっています。
 ・フリップフロップを10組用意し、入力パルス加算により ネオン管で0~9を表示
 ・パルス加算で、10になったら桁上げパルスの発生と0表示にする
 ・真空管の数を減らす為、1組のフリップフロップは双極管 6SN7 を使用
 ※10桁を表示するには、このリングカクンターが10個必要



リングカウンター ブロック・ダイアグラム



リングカウンター 0~9の模式図





アキュームレータの数値表示        各桁の数値をネオン管で表示





※1943年の提案では10個のアキュムレータを備えた計算機が求められ、1944年8月に、アキュムレータ2台のプロトタイプが完成しました。
 その結果、計算機が実現可能であることが判明すると、弾道研究所(BRL)は20個のアキュムレータを備えた計算機を要求しました。








●リングカウンターの基本動作
フリップフロップを 10個リング状に繋ぎ、そのうちどれか1だけONの状態が、その桁の数値を表します。
パルスが入力すると、 0、1、2、・・・ 8、 9 と変化し、さらにパルスが1個入力すると 0 に戻ります。
このような、リングカウンターを 10個繋ぐと10桁の数字が表現できます。



加算





数値5が ON の状態で、入力パルスを3個受信すると
リングは、6、7、8と遷移して停止します。
つまり 5+3=8を表しています。

さらにパルスを受信し、9を通過するとキャリーパルス(桁上げ)が送信され、0になります。

























減算

減算は専用回路を設けず、補数を加算することで値を求めます。


下記の例 7 - 4 は、 10の補数を加算し、繰り上がった最上位の「10」を無視します。



10の補数を作るには、サイクリング・ユニットの、9P と 1'Pを利用します。



補数を取り出せるように、アキュームレータの出力チャンネルを S (Subtract)に設定します。








①リングカウンターが、数字4になっている状態

②サイクリング・ユニットから 9Pを送ります。
 1パルス毎に、リングカウンターは 5,6、7・・・と変化し
 同時に S出力に1個のパルスに出力されます。
 (減算ゲートが開いている為)

③カウンターが9になった時、S出力は5個のパルス

④次の入力パルスで、9から0になったら、減算ゲートが閉じます。
 その結果これ以降は、S出力にパルスが送られません。
 (9の補数)

⑤最後に、サイクリング・ユニットの 1'Pから1個のパルス送信する。
  (End-Around Carry: EAC エンドアラウンドキャリー) → 10の補数












減算 3桁の例   582 - 123 = 459




①各桁 1, 2, 3 の9の補数を求めます。

②582 + 876の計算

③再上位の桁溢れを無視します。

④End-Around Carryを加算


















減算で結果がマイナスの例   123 - 582 = -459

 ①0000000582の の9の補数を求めます。

②0000000123 + 9999999417 = 9999999540

③桁上げ無しなので、1'Pの加算はありません。


最上位の桁が、9なので、ENIACはマイナスと認識します。

※マイナスの記号は持たず、内部的には 「9の補数のまま保持」 します。











●高速乗算器(High-Speed Multiplier)
乗算は、九九表を使い積を10位桁と1位桁に分け、10位(LHPP)と1位(RHPP)の部分積を集計して積を計算します。

被乗数:3の九九表の部分

※サイクリングユニットの 1P, 2P, 2'P, 4Pで、乗数の1~9を生成することができます。
※10Pのみ位相が違い、deline lineにより5μsずらす設計。



被乗数3の 積を求め、Left Hand Partial Product(10の位) と Rigth Hand Partial Product(1の位)の値から、
サイクリングユニットの 1P, 2P, 2'P, 4Pで数値が生成できるようにします。



上図の被乗数3の積の表から、
 ・マトリックス回路で、パルスが通過できないよう抵抗で抑制します。
 ・また数値の生成不要なパルスは省きます。







     Drawing  PX-6-54  →  https://www.cs.drexel.edu/~bls96/eniac/drawings/px-6-54.pdf


●乗算処理の概要
①被乗数をACC11、乗数をACC12へ
②乗算器は 10の位をACC13、1の位をACC14 or ACC15へ
③各々の部分積(LHPPとRHPP)を求める
④部分積は、シフター(桁処理)をおこない、L側・右側を加算する
⑤左側と右側の合計が乗算積(20桁)


  10の位: LHPP(Left Hand Partial Product)     1の位: RHPP(Right Hand Partial Product)




例) 3 x 6 = 18 ・・・ 計算結果 1(Left Hand Partial roduct) と 8(Right Hand Partial roduct)の信号が生成される
                 LとRの部分積を累計して結果のACCへ 









●ENIACのプログラミング

下記のプログラム(配線)は、ENIACに於ける並列計算の仕方・及び問題の分解・テクニック等の重要な要素があります。
The ENIAC: History, Operation and Reconstruction in VLSI (Jan Van der Spiegel et al.) から引用したもの。




3つのアキュムレータに於いて
 ACC#4 に aの値
 ACC#5 に bの値
 ACC#6 に cの値

プログラムを起動すると、結果は

  a - b     → ACC#4

  b + 359  → ACC#5

  c + 2b + 359 → ACC#6

  ※359の値は、カードリーダーから定数送信機(Constant Transmitter)を介して ACC#5 および ACC#6に送られます。




アキュームレータの模式図

  アキュームレータのプログラム制御は 12個あります。

上段の4個(1~4)は、レシーバー(Receiver)
  ・入力のみ
  ・プログラムパルスの入力端子のみ


下段の8個(5~12)は、トランシーバー(Transceiver)
  ・入出力
  ・リピート(繰り返し)の設定
  ・プログラムパルスの入力端子と出力端子




 




① a - b

ACC#5は、保持している値を2通りの方法で送出する必要があります。
プログラム5で、リピート回数を2にセットし、出力チャンネルをASにセットします。

出力チャンネルS(10の補数出力)を、ACC#4の入力チャンネルαに配線(ケーブル接続)します。
ACC#4のプログラム1で入力チャンネルαにセット


② c + 2b = c + b +b

c + 2b は、 c + b + b  つまり、2回加算を繰り返します。

ACC#6は、ACC#5から 数値bを2回受け取るようにします。
つまり、ACC#6のプログラム5は、入力チャンネルαからの受け取り回数を2にセットします。

ACC#5のAチャンネル(通常)から、ACC#6の入力チャンネルαに配線(ケーブル接続)します。



③ c + 359、 b + 359

数値359は、カードリーダーから定数送信機(Constant Transmitter)を介して、ACC#5 と ACC#6に送ります。

ACC#5のプログラム6で入力チャンネルαにセット、リピート数は1にセット
定数送信機から、ACC#5の入力チャンネルαに配線(ケーブル接続)します。

ACC#6のプログラム1で入力チャンネルβにセット
定数送信機から、ACC#6の入力チャンネルβに配線(ケーブル接続)します。



④ケーブル接続




⑤ケーブル接続







 https://www.crimson-systems.com