前回のブログに書いたように波形はGtkWaveで確認しようと考えている。したがって、採取したデータをFPGAからPCに取りこむ必要があるが、現状のFPGAとPC間のI/FはFT2232HLを介したUART接続であり、ボーレートは921600[bps] (約92K Byte/sec)にしている。
データ取得は通常のレジスタリードと同じやり方で行っており、PCからFPGAにDRAM_DATAレジスタのリードコマンドを送信し、FPGAがそれへの応答としてDRAMからリードしたデータを返信する。つまり、1データを読むのに必ず送/受信動作が発生するので転送効率が悪い。 そこで、転送レートの引き上げとブロックリード機能を追加することにした。
・ブロックリード機能の追加
上記ブロック図のUI部は、実際はuif_v2モジュールとuif_miscモジュールから成っている。
uif_v2ではuart_coreで受信したパケットをアドレスとデータに分解してuif_miscに出力したり、uif_miscから入ってくるデータ(リードデータ)をuart_coreに送信したりする。 PCからのDRAMアクセス要求はuif_miscが実行する。 uif_miscのレジスタ構成は以下の様になっている。
これまでは、PC側のプログラムはindexレジスタにDRAMのアドレスをセットし、次にdataレジスタをリード若しくはライトすることでDRAMアクセスを行っていた。 indexレジスタはdataレジスタのアクセスで自動的にインクリメントされるので連続してリードする場合はdataレジスタのみを連続してアクセスすれば良い。しかしながら、dataレジスタのリード動作はPCからdataレジスタのリードコマンドを受信して実行されるので、PC-FPGA間では必ず送/受信動作が発生してしまう。 今回追加するブロックリードの場合、PC側プログラムはindexレジスタに起点アドレスを、lengthレジスタにデータ数をセットする。次にdataレジスタを一回リードするとブロックリード動作が起動され、以降設定されたデータ数分DRAMをリードしリードデータをPC側に送信する。
・転送レートの引き上げ
MachXO2のボードのUSB I/FにはFT2232HLが使われている。
従来のプログラムは、read()やwrite()等の標準関数を使って/dev/ttyUSBxを介して行っていて、ボーレートの設定はtermiosのcfsetspeed()で設定していた。現在使っているLinuxシステムのtermios.hを見ると設定可能なボーレートの上限は4Mとなっている。 一方、FT2232HLのデータシートによるとUART I/Fの最大ボーレートは12Mbaudとなっている。そこで、少しでも転送レートを上げたいため、今回は標準関数ではなくftdiのライブラリ libftd2xx を使うことにした。 で、実際どのレートまでイケるのか実験してみた結果8Mbpsが上限だった。
・GUIプログラム
これまでのテキストベースのプログラムだとロジアナを操作しづらいのでGUI化することにした。 現在、鋭意作成中。顔はこんな感じ。
0 件のコメント:
コメントを投稿