2014年3月30日日曜日

なんちゃってロジアナ 3

色々な電圧レベルの測定信号に対応するためにはレベル変換回路が必要になる。今日は+5V用のレベル変換基板を製作した。




レベル変換ICは、あまり考えないで部品を選んだ結果ピン間ピッチが0.5mmの物を購入してしまった。 .... orz   それに加えて今日は体調が優れず、ハンダ付けに偉く手こずってしまった。つまらないミスは繰り返すわで、イヤー参った。 (>_<)ゞ

何とか作業は終わったが、通電は明日以降になる。


2014年3月23日日曜日

なんちゃってロジアナ 2

レジスタレイアウトを若干修正した。


・ACQ_INT:割り込み関連レジスタ追加
  このロジックアナライザの実装では割り込み機能は必ずしも必要ではないが、将来CPUと組み合わせて使いたくなるかも知れない。それに、FIFOオーバライトの事象はキチンと捕獲してステータスとしてチェックできるようにしておく必要があるので、このレジスタを追加することにした。マスクとステータスはレジスタを別にしたい所ではあるのだが、今回はレジスタ数が多いので1レジスタに纏めることにした。



・BUFF_PARAM:バッファパラメータレジスタ
SDRAM上に確保するバッファの起点アドレスとサイズを設定する。以前は別個でワード単位で設定できるようにしていた。しかし、データFIFOは256深度で、メモリへは基本的に128バーストライトで書き込むようにしているので、それよりも細かい粒度でのアドレス設定は意味が無い。また、バッファサイズの設定も細かい粒度は意味がないので、これも以下のような粒度での設定とした。


・全体シミュレーション
上記インプリメンテーションでシュミレーション実行できるようになった。

バッファアドレスは0x0100、サイズは1MBでトリガモードはPRE_TRIGとしている。
入力信号は20ns周期(50MHz)でインクリメントさせている。トリガはCH11がHの時のCH0の立ち上がりで且つトリガカウントを16とした。


バッファリング開始部分
設定どおり、アドレスは0x100から始まっている


トリガ検出点(データ)のバッファ上の位置はTRG_ADDRレジスタに自動的に格納される。
以下はその様子であり、このシミュレーションでは0x8AEであった。


また、トリガモードがPRE_TRIGなのでトリガ点は格納データの左端(先頭)に位置することになる。つまり、バッファリングはトリガ検出点からバッファサイズ分行われて完了する。以下は、バッファリングの後端部で、バッファリングがトリガ検出点(0x8AE)の一つ前の0x8ADで終わっている。


FPGAのリソースに余裕があるので、トリガ機能をもっと追加したい気もする。例えば、ステートを定義し、そのステート遷移のパターンをトリガ条件にする等。 が、早く実機で動かしてみたい気もするので実機確認を優先しようと思う。



2014年3月15日土曜日

ZYBO

つ、遂にZynq搭載ボード ZYBOを買ってしまった。。。



まだLatticeのMachXO2でやりたいことがあり、今すぐZYBOを弄りたい訳ではないが、増税前に物だけは入手しておこうと思った。


なんちゃってロジアナ

MachXO2の評価基板でSDRAMが使えるようになったので、その応用として簡易ロジックアナライザ(なんちゃってロジアナ)の作成にとりかかった。

・System architectureとデータ形式
System architectureを以下に示す。


SDRAM I/Fの帯域は2 byte x 150MHz = 300Mbyte/secだが、ページの開け閉めがあるので実際はもっと狭くなり、私はいつも70%程度で考えるようにしている。  0.7x300M→210Mbyte/sec 一方、観測する方はch数としては16ch以上は欲しい。また、サンプリング周波数はなるべく高くしたいが切りの良い値にもしたいので、100MHzにしようと考えている。ch数を16ch以上とすると、メモリバス幅との関係から1サンプル32bit使うことになる。これを何の工夫も無にSDRAMに取り込もうとすると4byte x 100MHz で400Mbyte/secとなり想定しているSDRAMの帯域の約2倍となり破綻する。 そこで信号に変化があった場合にのみ、変化した信号の値(状態)と前の変化からの経過時間(サイクル数)を組にしてメモリに格納することにした。 これを以下に示す。 CH数は24CH(24bit)、経過時間(サイクル数)は8bitとした。信号の変化が256サイクル以内に起きなかった場合はカウンタ値が255になったタイミングでその時の信号値をSDRAMに吐き出し、カウンタは0からカウントを継続する。つまり、信号がずっと変化しない場合は256サイクル毎に同じ値がSDRAMへ書き込まれる事になるが、このように相対時間で表示することで理論上は無限長の信号に対応することができるという利点もある。 帯域の問題は観測する信号に依存することになるが、クロック等の常に高頻度で変化する信号を対象にしなければ使えるのではないかと思う。


・トリガ
上図の下部にトリガ系を示している。
最初のステージでは24CHそれぞれで個別に信号の変化(Rise, Fall, Any)若しくは状態(Low, High)を検出する。次のステージでは、この24bitの検出フラグをグループ化し、そのグループ内でANDやORや算術比較による検出を行う。具体的にはグループ0~3はAND/ORによる検出、グループ4は算術比較による検出を行う。最終ステージのグループ5では、グループ0~4の結果に対してAND/ORによる検出と計数、つまり、設定に合致した事象のn回目を検出する。この回数は最大1024回まで設定できる。 アクイジションをスタートすると、上述のやり方でデータは常にSDRAM上に設定したリングバッファに格納される。  トリガの働きは、このSDRAMへのデータ格納をどういう条件で停止させるかということになる。 トリガ条件を検出して発火する条件設定は上述の通りだが、この他に発火してからの動作を定義するトリガモードがある。具体的には、発火して直ちに停止する(POST トリガ)か、あるいは発火してからバッファサイズ分のデータの書込みを待ってから停止する(PRE トリガ)か、あるいはその中間でバッファサイズの半分までの書込みをまってから停止する(CENTER トリガ)かを定義する。

・レジスタ仕様




以下は単体シミュレーションの波形の一例
CH1をRise、CH8をHighのAND条件でトリガモードはPOSTトリガ且つトリガカウントを16にした。



RTLの作成は大体完了したので合成してみた。
タイミングはMetしており、リソースの使用率(SLICE使用率)は約50%であった。




合成は旨く行きそうなので安心した。
もう少しシミュレーションしてから、実機確認をしようと思う。

2014年3月2日日曜日

SDRAMCのMachXO2への実装 3

hi-hoで公開しているSDRAMC IPを今回のMachXO2対応版に更新した。

www.hi-ho.ne.jp/bravo-fpga/



TE0720 No.4 (BNN-PYNQを動かしてみる 2)

TE0720でBNN-PYNQを動かすことが出来た。 以下は前回に続いてBNN-PYNQが動くまでの記録。 gdb (GNU debugger)で例外が出る原因を調べてみた。 例外が発生しているのはシェアードライブラリ(python_hw-cnv-pynq.so)の中であ...