2014年3月15日土曜日

なんちゃってロジアナ

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%であった。




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

0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...