2014年4月28日月曜日

なんちゃってロジアナ 8

今日はゴールデンウィークに絡めて取った休暇日。

なんちゃってロジアナの基板をケースに収納したいと考え、100円ショップ等で探したりしたのだが中々イメージに合うものが無い。 そこで、使わなくなった無線LAN付きルーターを分解してその筐体を再利用することにした。



わざわざ色を塗り直したり、レタリングで文字入れするのは面倒なので、お絵描きソフトで皮の画像を作成してプリンタで印刷し透明シートを貼ってコーティング、それを両面シールで筐体に貼り付けた。



それなりに雰囲気出てる?


16MHzの水晶発信器の出力を観測してみた。


CH19とCH24で観測してみた。 CH1はロジアナから出ている1KHzである。(上記写真の黄色い端子)



水晶発信器の周波数が16MHz、即ち62.5nsであるが、ロジアナのサンプリング周波数は100MHz(10ns)なので、収集した信号のタイミングは10ns単位で量子化されてしまう。
そのため、パルス周期は60ns若しくは70nsとなる。



原理上、これは仕方ない。


2014年4月26日土曜日

なんちゃってロジアナ 7

・ snapshot版の公開
ロジックアナライザのsnapshot版を公開した。
 
   www.hi-ho.ne.jp/bravo-fpga/

・ GUIプログラム
前回までに作成していたGUIプログラムは glade というGTK+用GUIビルダで作成したものだが、今ひとつ気に入らないのでwxWidget版に作り直している。今回公開したsnapshotには含まれていない。





2014年4月20日日曜日

なんちゃってロジアナ 6

GUIソフトが動くようになった。

左側のCHANNELグループのチェックボックスで使用するCHを選択する。また、その横のテキストボックスで信号名を設定できる。ここに設定されている信号名がVCDファイルに出力される。


右側のTRIGGERグループでトリガ条件の設定を行う。コンボボックス内の選択肢は以下の通り


各設定をした後に右下のSTARTボタンをクリックすると、ロジックアナライザが動作状態になる。
動作中はボタンの文字表記がSTOPに変わる。(ここをクリックすれば止められますよという意味)


トリガ条件が検出されるか、または、STOPボタンがクリックされるとボタンの文字は WAIT → DUMP と変化する。 WAITはロジックアナライザの後処理完了を待っている状態であることを表している。この後処理というのは、トリガ一がPREやCENTの場合にトリガ検出後に一定長のデータを取りこむ処理のことである。また、DUMPはDRAMからデータを読み出してVCDダンプファイルに変換している状態であることを表している。


これが完了すると再び START に戻る。 VCDダンプファイルのファイル名は現状、dump.vcdで固定としている。 GTKWaveはファイルを介さずにunix パイプ機能をつかって、VCDデータ生成プログラムと直接繋ぐことが出来るが、現状はファイルを介する方法を採用している。その方がプログラムが異常終了したりしてもデータが残るからである。

以下は、上図の設定で押しボタンスイッチの信号と1KHzの信号を測定した結果をGTKWaveで表示している。 信号名部の最下部のTRIGはトリガ検出部を示している。トリガ位置をCENTERとし測定したので画面中央部が検出点になっている。


そのトリガ検出部の拡大
トリガ条件はCH3 (PUSH_SWITCH)の立ち上がりエッジで、トリガカウントは4に設定した。
波形をみると4発目を検出しているっぽいが、パルス幅が細くてこの倍率では本当に4発目を検出しているのか判らない。


さらに拡大してみると、グリッジ上のパルスが2つ連続あり、その左側がトリガ検出点になっているので、4発目で検出できている。








2014年4月13日日曜日

なんちゃってロジアナ 5

前回のブログに書いたように波形は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化することにした。 現在、鋭意作成中。顔はこんな感じ。



2014年4月6日日曜日

なんちゃってロジアナ 4

レベル変換基板にプローブ(クリップ)も装着した。クリップには、秋月電子で売っている「グラバークリップ 10色セット」を使った。 24CH分ともなると、それなりに迫力がある。というかかさばる。


そして、漸く実機での動作確認を開始した。
今回のセットでは動作確認用の信号源として1KHzの矩形波も出すようにしている。(上記写真の変換基板上に黄色いチェック端子) この信号と押しボタンスイッチを使って、ボタン押下時の信号の変化が取り込めるかを見てみることにした。


SDRAMに取り込んだ信号はソフトウェアでVCD(Value Change Dump)形式のファイルに変換してファイルに落としGTKWaveで確認する。   VCDはVerilog規格標準の波形ダンプファイルのフォーマットである。 以下のような感じでプログラムを書いた。


生成されたvcdファイルの例


押しボタンスイッチ押下時の信号のオシロによる観測波形。チャタリングが発生しているのが判る。
写真のピントがボケてしまっていて見辛いが、Time/Divは20.0us/Divである。


ロジアナの方は、CH1で矩形波信号、CH3でスイッチ信号を観測しており、トリガ条件はCH3信号の立下がり・PREトリガ・トリガカウント1回とした。
GTKWaveでの波形は以下の通り
 

画面の左端がトリガ部である。ここを拡大してみると以下の様になっており、上記オシロの波形と比べるとほぼ同じ波形が見れている。


以下は矩形波信号の周期を確認したところ、1ms = 1KHzなのでちゃんと測れている。







GTX1050Ti と Tesla m2050 No.2 (BNN-PYNQのtrainingをやってみた)

BNN-PYNQのtraining(学習)をやってみた。  手順は https://github.com/Xilinx/BNN-PYNQ/tree/master/bnn/src/training に記載されており、特に判りづらい点はなかった。 ・ mnist.py 実行...