Vivadoを使ってChiselで作ったシリアル受信器をFPGA上で動作確認しました

先日、Uart受信器を作ったので、試しにFPGAで動かしてみることにしました。

FPGAは、大昔に購入しずっと眠っていてホコリをかぶっていた、Digilent Zybo Zynq-7000を使ってみることにしました。 以下ボードなんですが、数万ゲートは対応できそうなので、RISCVも動かせそうな気がします。

Vivadoは以前にインストールした19.2を使用しました。 UVMで検証してからにしようとしましたが、失敗してもいいから書き込みまでのフローを通したかったので、 ひとまず書いてみることにしました。

WindowsにVivado19.2を入れて、UVMを動かしてみた - moamoa diary

Vivadoを起動すると、したり、ピン設定にしたり、 クロック周波数を125MHzに合わせたり、Pin設定を追加しました。 Chiselが吐き出したverilogコードがVivadoでコンパイル可能か心配でしたが、特に問題なくBitstreamが吐き出されました。 あとはAutoconnectして書き込むだけでした。(基板ほこりだらけだったのに、動いてホッとしました笑)

  • バイス設定
    • xc7z010clg400-3を選択
  • ピン設定
    • Pin Plannerで設定((uart.xdcに書き込まれてました)
    • 前入出力ピンを設定しないとエラーになりました。(出力くらい浮いてていいとは思いました)
    • 各ピンのIOセルを選択しないとエラーになりました。(IOSTANDARD LVCMOS33を選択しました)
  • その他
    • 外部CLKが125MHzだったので、受信器の設定クロックを修正
      --> 本当はPLLで設定すべなのでしょうが今回は避けました。

mod Uart for FPGA(125MHz) · moamoai/chisel_uart@216b618 · GitHub

シリアル接続

PC(iMac)からは、以前にRaspiと接続するために購入していた 4本信号がのUsb Serialケーブル(PL2303が入っている物)を使うことにしました。 久しぶりで、資料もなかったので各信号が何か判読難しかったですが、調べたり、ループバックテストすることで、以下とわかりました。 今回の動作確認させたいものは受信器なので、緑色(PC側からはTx)の線をFPGAに引けばよかったです。 (注意: 同じ製品でも色が異なる場合もあるみたいなので、最悪オシロで確認すると良いかもしれません)

ちなみに、ケーブルしかなかったので、なんのチップ入っているかわからなかったのですが、 以下の方法で調べることができました。

brew install lsusb
lsusb
-> Bus 020 Device 001: ID 067b:2303 Prolific Technology, Inc. USB-Serial Controller 

さて、お膳立てはそろったので、いざ接続してみることにしました。 シリアル接続はscreenコマンドで確認しました。 接続し、適当に送り込んでみました。

すると、LEDが光りました。 送ったデータに対して光るのですが、ZyboにはLEDが4つしかなかったので、 データの期待値確認まではしませんでしたが、動いていることはわかりました!!

screen /dev/tty.usbserial-14310 9600     # 115200
終了方法: cntr+a -> cntr+k

あとがき

まさか一発書き込みで動作するとは思いませんが、しっかり動いてくれました!! 久しぶりに物に触った気がしますがおもしろいですね。

ただ、FPGAで動作させるのにChiselで論理書くより、 端子表調べたり、ドライバインストールするので、時間かかった面があるので、やっぱりハードは手間だなと思いました笑

普段からそういったことやっておけば環境が整備されているはずですが、ハード触ったのはもう何年も前の話だったりするので、環境が一新されてしまってたんですよね。 これから、また整備し続けていこうと思いました。

今回は運良く動きましたが、動かないことが生じてくるのは間違いないので、 なんらかのデバッガを仕込んだり、オシロやロジアナを使いたい物です。持ってないですが笑