CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

リンク入出力

ハードウェアの準備ができたのでトランスピュータ最大の特徴であるリンク動作の確認をしてみました。2枚のボードにロードするプログラムは以下のようなものです。

トランスピュータ1(上段)にはbuff領域(0x00001000)から16バイトのデータをLINK0ポートから送信、トランスピュータ2(下段)にはLINK0ポートから受信した16バイトのデータをbuff領域(0x00001000)にセットすることを連続実行します。くり返しカウントをパラレルLEDに表示するルーチンをはさんでいますが入出力の実体は赤枠で括った部分のみ。双方のプログラムの違いはout/in命令の所とそれぞれのポートアドレスだけです

送信時はLINKoutからデータ送出。相手側からACKをLINKinで受け取ることでハンドシェイクされます

トランスピュータ1側の通信中の波形 ch1:LINK0in、ch2:LINK0out

実測上1.85Mbyte/secのリンクスピードは出ているようです。(理論値19.66Mbit/sec

リンク信号にLEDのインジケータを付けていますが繰返し送信しているのと通信速度が速い、デューティも低いのでまたたきもせずボーッと点灯しているだけで面白味はありません

実行後2枚のボードをリセットしてそれぞれのモニタでメモリ内容をダンプしてみるとbuff領域の16バイトが完全一致しているのが確認できました

トランスピュータのマニュアルを読んでみるとこのリンク入出力はメッセージ通信とプロセス間の同期のために用いるとあり

After each byte, the receiving transputer sends an acknowledgement signal and stores the byte into its memory. If there is no receiving process listening for the transmitted bytes, the receiving transputer won’t acknowledge the byte transfer and the transputer process sending the byte will "hang" on sending the message.

つまり送信プロセス受信プロセスは必ず対で呼ばれなければならず、且つ双方で転送サイズを知ってなければならいということです。対応する受信プロセスがない送信や送信サイズ>受信サイズだと送信側でハングアップ、いつまで待ってもデータが来ない受信や受信サイズ>送信サイズだと受信側でハングアップするということです。

このようなスケジューリングされたプログラムを書くのはかなり難しそうです。もっともそのためのトランスピュータ用のOSやOCCAMのようなプログラミング言語があるのですが。

単に離れたボード間のメモリを共有する、ということであればデュアルポートRAMを半分に割ってびょ~んと引き延ばし間をシリアル通信にした(そういう広告イラストだった)というステップテクニカ社のMKY-28というおもしろいICを以前使ったことがあるのですが今見たら製造中止でした