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



   
FF用の真空管 6SN7  
 


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


ENIACの主な真空管
 ・6SN7: アキュムレータのフリップフロップ回路に使用。
 ・ 6L7 / 6SJ7 / 6SA7 / 6AC7: 論理演算などの機能回路に使用。
 ・ 6L6 / 6V6: ラック間のラインドライバとして使用。


※真空管のヒーター、フィラメントは冷えた状態ではかなり低い抵抗値。
 火入れ後、定格電流の数倍の電流が流れ、徐々に抵抗値も増し安定します。
 










●サイクリング・ユニット
 全ての機器(ユニット)を同期させる為に、サイクリング・ユニットがあります。
主となる中央プログラミングパルス(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の状態に戻る







gate回路
gateは、2個以上の入力が有り、1個の出力のある回路
全ての入力が同時に合った時、1個のパルスを出力する。


通常は V1、V2、V3がONで、V4はOFFの状態。
入力 A、B、Cが それぞれ negative puluse受けて V1、V2、V3が全てOFFになったとき
V4のグリッド・バイアスが、カットオフ以上になれば
positive pulseを出力する。




 
buffer回路
bufferは、2個以上の入力が有り、1個の出力のある回路で
どれか1つ入力が有れば、1個のパルスを出力する。


V4のグリッド・バイアスがマイナスに保たれてOFFの状態にあるが、
入力 A、B、Cのどれか1個以上 positive pulseを受けると、
V4のグリッド・バイアスが、カットオフ以上になり。
V4がONになって、negative pulseを出力する。




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

アキュームレータの制御回路(簡易)  Arthur W. Burks
・Program Lineから、真空管5がプログラムを受信すると
 パルスは増幅され、真空管1からフリップ・フロップの真空管3、4を
 トリガし 真空管3はON、真空管4はOFFになる。

・真空管3がONになった信号は、真空管6で増幅され
 真空管7から切替SWを経由して各プログラム制御をおこなう。

・真空管4がOFFになった信号は、ゲートの真空管9の入力と
 真空管8のACCリセット回路と連結される。

・サイクリング・ユニットから、
 1加算時間毎にゲートの真空管9に入力パルスがあるので
 フリップ・フロップの真空管3、4を元に戻す。


※真空管 6SA7が、ゲートに使用されています。
本来は、スーパーヘテロダイン方式のラジオなどで局部発振と周波数変換用
グリッドが5つ有り、第1グリッドを入力A、第3グリッドを入力Bとして使用
 (第5グリッドは、内部でカソードに接続)

2個の入力にカットオフ電圧をかけた状態で、
2入力共にpositive pulseを受けるとプレートにnegative pulseが出力



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



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





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






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








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




PX-5-304: Accumulator Block Diagram  https://www.cs.drexel.edu/~bls96/eniac/drawings/px-5-304.pdf






送信

ACCの内容を送信するには、 10P による 10個のパルスでおこなわれ、出力チャンネル:A端子から出力されます。
10Pは、ACC内の10個の10進リングカウンターのそれぞれに同時に送られ、カウンターを1段階ずつ循環させます。

ACCの値が7の例
 ・通常A端子のゲートは閉じています。
 ・数値が 9から0に変わった時、出力チャンネル:A端子のゲートが開きパルスが1個出力されます。
 ・ゲートが開いているので、残りの6個が出力されます。 つまり 7個出力されます。      

 






加算





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

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

























減算

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


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



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



10の補数を取り出せるように、アキュームレータの出力チャンネルを 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を加算
 ( 「2回目のEAC:最上位キャリー」は起きない。 )
















減算で結果がマイナスの例   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のプログラミング
 ユニットの演算結果を次のユニットに渡し、終了パルスを送ります。(ケーブル配線)

①開始パルスをユニット1に入力します。
②ユニット1は設定されたプログラム制御(SWの設定)で演算します。
 演算結果をデータラインからユニット2の入力へ
 終了パルスをプログラムラインからユニット2のプログラム制御入力へ
③ユニット2は演算後、同様に次のユニット3に渡します。






下記のプログラム(配線)は、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の入力チャンネルβに配線(ケーブル接続)します。



④ケーブル接続

初期化ユニットの出力から送出されるスタートパルスを受信する為、
 ACC#4の「プログラム制御1」の入力端子、
 ACC#5の「プログラム制御5」の入力端子、
 ACC#6の「プログラム制御5」の入力端子に接続します。

ACC#5の数値を2回送信すると、ACC#5の「プログラム制御5」から出力パルスが出力します。



⑤ケーブル接続

ACC#5の「プログラム制御5」からの出力パルス(トリガー)を、
ACC#5の「プログラム制御6」の入力端子、および「定数送信機」のプログラム入力端子に接続します。





 ENIAC Accumulator

                       https://www.kondo3d.com/eniac/jp.html より




                    https://cse.engin.umich.edu/about/history/eniac-display/ より





 https://www.crimson-systems.com