Verilogで2048を実装した話

 Verilogで2048を実装した話をポエム形式で話します。

 一応スライドとGitHub。display.vというファイルが全て。GitHubは自分のPCと大学のPCの通信用なのでディレクトリ構造とかは何の意味もない。*.vだけ見て。

www.slideshare.net

github.com

前置き

 大学の集中講義でVerilogでプログラムを書こうという授業を受講した。ハードウェアとか何もわからないけど楽しそうだったからなんとなく取ってみた。一応Verilogを予習しておけとメールには書いてあったけれど本を借りただけでつまらなそうだったので何もしてなかった。

初日

 本郷の電気電子情報科のキャンパスに行く。7人のメンバーのうち2人はサークルメイツで1人は知り合いで1人は部活の後輩だったので安心感を得る。Verilogの説明などの基礎的な説明を受ける。
 学食でうどんを食べる。高校生がたくさんいてまぶしかった。
 部屋を移動してCentOS上でVerilogのサンプルコードをいじって遊ばせてもらう。TAが丁寧で優しい。quartusというツールを使ってコンパイルしてFPGA上に回路を乗せてディスプレイに表示するという感じ。案外ソースコードは単純に見えたので安心する。去年の作品はシューティングゲームなどで簡単そうだったけどあまり面白そうではなかった。今年はなんか周りが強い人ばかりだったので皆オセロとか色々いっていて、僕もなんとなく少しハードルを上げて2048を実装することにした。

二日目

 2048の実装に取り掛かる。盤面を表示したり色を塗ったりしてVerilogのコードに慣れていく。なんか隣に既に文字を画面に表示し始めている人いて怖い*1。セルのマージ処理を書き始める。
 ナンのお店に連れて行ってもらう。美味しかった。
 セルのマージ処理を書き終わる。遊びはじめる。ボタンを押すたびに挙動が変わる。デバッグ。わからない。終わり。

三日目

 デバッグの続き。TAに教えを乞う。チャタリングの問題っぽい。チャタリングリムーバーというファイルがもともと存在していたんだけどなぜかリンクされていない(は?)。ちゃんとプログラム内に取り込む。ちゃんと動くようになる。ヤレヤレ。
 定食屋に連れて行ってもらう。エビフライ定食。
 セルに数字欲しいよねと言われたので数字をセルに書く。空きマスにランダムに数字を出現するようにする。クロックをカウントしていたんだけどディスプレイとの同期が云々でまた闇を垣間見る。なんとか誤魔化す。
 進捗が芳しくないので家で作業する。コンパイル環境などない。頑張る。セルが滑らかに動くようにしたい。頑張って実装する。数千行単位でaddとdeleteが繰り返され精神的に非常に良くない。なんせコンパイルさえできない。

四日目

 コンパイルする。まずは挨拶がてらのtypoによるエラー。直す。続いての初期化の場所のエラー。直す。コンパイルは通る。挙動がおかしい。闇のデバッグコンパイル一回につき数分かかる上に値の表示すら用意していなかったので最悪。コードをにらみ続ける。
 海鮮丼のお店。美味しい。駒場に欲しい。
 コードをにらむ。bitのサイズが合っていないところがある。直す。直る。勝利。タイトルとかを実装する。周りの人たちはAIとか作っててバグらせたりしてて辛そう。暇になる。空きスペースが気になったので飛行機を飛ばそうと思う。飛行機をペイントで書く。飛行機を飛ばす。ついでにミサイルも飛ばす。早めに切り上げる。

最終日

 やることがない。後ろむきにもミサイルを飛ぶようにする。発表練習。
 コンビニでご飯買う。
 全体発表。適当にしゃべる。飛行機がウケていた。人数が多いので聞き飽きる。懇親会。適当にサークルメイツとだらける。僕らのプログラムが展示されはじめる。トマボウが2048に挑戦し始めた。なぜか全員がその様子を見守ることに。惜しかったけど2048にはギリギリ届かず。残念。帰り道、大雨に巻き込まれる。つらい。
 挑戦風景。
f:id:gasin:20170807222006j:plain

*1:文字コードをどっかから引っ張ってきてpythonなどでVerilogコードを生成する必要がある