読者諸兄の皆々様、おはこんばんちわ。
ところで皆様はMinecraft*1してますか?
マイクラをしたことのある皆様もしたことのない皆様も、恐らくマイクラで電卓*2を実装する動画くらいは見たことがあると思います。見ているだけでクソ威圧感があると思いますが、あれの威圧感の大体の根源はワイヤードロジック*3で回路が実装されているところからくるものだと思うわけです。
それはそう。ワイヤードロジックで実装されたENIAC*4とかいう現代からすればラズパイ*5以下のクソザコナメクジが部屋一つを占拠していたわけです。ワイヤードロジックにはどう頑張っても限界があるのです。
プログラム内蔵方式を実装して、カウンタやフラグレジスタでデータをあれこれするほうが絶対良いに決まっている。そう考えたわけです。しかし、そうなると数Bit長の信号を連続的に流す必要が出てくる。
そこでシリアル通信*6回路が必要になってくるわけです。
まあ、実際のところの動機は遠距離で複数の命令を送るにはワイヤードロジックでは流石に厳しい*7という事情から来るわけですが*8、似たようなものなので大丈夫でしょう。
というわけで、早速完成したシリアル通信回路の様子を御覧いただきたいと思います。
最初に出てくる二段式のコンソール*9で、右下から順に0、1、1、1の4Bitと、右上から順に0、1、0、1の4Bit、併せて8Bit分の命令を入力しています。送信ボタンを押すとこれが1チック(リピータ1遅延分)の長さで出力され、受信回路で受け取り結果を表示します。
ね?簡単でしょ?
だけだとわからんので、そこそこ詳しい説明をします。
洞窟内で制作したので非常に暗いですが、送信用回路はこんな感じです。
www.nicovideo.jp
基本的には二段式なだけでこの動画のパクリです。唯一違うのはリピータの遅延を最短の1にしていること。
余談ですが、受信回路をピストン式にすると1チックでBitを表現しようとするとどこかで詰むのでこれをそのまま遅延削減とかはしないほうが良いです。筆者はやろうとしてサクッと詰みました。結果、受信回路の改良に乗り出したわけです。
相対する受信回路はこちら。信号分のリピータをタイミングよく止めることでうまいこと信号を取り出しています。
リセット用回路なんかがあって見づらいので、原理だけ実装した初期の回路を見てもらったほうが理解が早いと思います。
原理としては、まず信号を入り口で分岐させて、それぞれを遅延線*10とラッチ回路*11に流します。遅延線側は、リピータで1チック分の遅延を作る以外はただただ普通にリピータで実装した遅延線に信号を送ります。ラッチ回路側は、最大遅延のリピータ2つで8チック分信号を遅らせた上でラッチ回路の2チック分の遅延を経由し、停止用のリピータを介して遅延線のリピータを停止させます。こうすることで、信号線用のリピータに8Bit分の信号が入力された時(1遅延+起動用パルス+8Bit長データ=>10チック経過後)、ラッチ回路を経由した起動用パルスが停止用のリピータに到達し、情報を保持します。
情報を保持しているだけだと読み出せないので、いい感じに回路を伸ばしたのがディスプレイ付きの改良型回路になるわけです。遅延線メモリから直接8Bit分出せるんじゃないかと思ったけどクロック回路とカウンターを付帯させないといけないのでちょっとめんどいので安直に実装しました。
とまあ、こんな感じで8Bitのシリアル通信を1チック長で送ることに成功したわけです。
通信速度にして10bps程度。ピストン式より明らかに早いとはいえ……レベルではありつつも、電卓などで応用すれば小型化で省けるリピータと相殺出来て高速化出来るんじゃないかなと思うものです。
というわけで、皆様も是非レッドストーン回路でシリアル通信を実践し、小型で汎用的なマイクロプログラムをマイクラで実装しましょう!!
その時筆者にこっそり教えて頂けると喜んで見に行くのでよろしくオナシャス!