タグ: VHDL

AD変換回路の製作2

前回のブログで製作したAD変換回路の動作不良の調査を行った。

まず、動作確認用のVHDLの不良の確認を行った。
このVHDLでは、AD9214に50MHzの正弦波を送信し、AD9214からの10bit信号を受信、そのままその信号をLEDに出力するというものだった。
この動作を確認するため、内部でAD9214用に生成していた50MHzクロックを分周し、別のピンからクロックの立ち上がりタイミングで出力し、その信号を観測する方法で確認を行った。動作の状況は以下の通りである。

VHDL動作状況

動画の通り、想定している動作が確認できたため、VHDL側の設計ミスはないことが分かった。

“AD変換回路の製作2” の続きを読む
広告

AD変換回路の製作

以前設計したAD9214を用いたAD変換の回路を製作した。

以前設計した時点では、基板サイズに互換性がない状態だったが、AD9851回路を100mm×50mmに統一したことから、今回の基板もサイズを統一することとした。100mm×50mmで設計すると余白が多くなりすぎることから、50mm×50mmで設計を行った。それ以外の設計データは前回設計した回路を流用した。またパターンではスターグラウンドとなるよう配置した。

回路図
パターン図
完成した回路(表面)
完成した回路(裏面)

この回路の実験を行うために、Papilio上でVHDLモジュールを作製した。このモジュールは、Papilioから50MHzの基準クロックを出力し、AD9214へ入力、AD9214からの10bit出力を再びPapilioに戻し、LEDを点灯させるものである。

動作実験を行ったが、AD9214への入力電圧を変化させてもLEDの変化が見られなかった。現状不具合の原因が多すぎるため、再度確認を行いつつ、実験を進める。

Papilio、PINE64を用いた通信実験

本報告までに作成してきたPINE64送信プログラム及びPapilio側での受信プログラムを用いて通信実験を行った。現時点で2度ほど実験を行っているので、順に結果を示す。

1回目の実験時は、Papilio側で通信がすぐに終了し、データがすべて1になるという状況になった。これは、Papilio側でデータの更新タイミングを「SERDESによって送信されてきた100MHzクロック」を用いて行っており、またこのクロック8回分で64bitデータを受信する設計であったことが原因である。PINE側からクロックが出力できず、通信のクロックがずれており、かつPINE側の送信に遅延を入れていたため、データを受け取りすぎたのだ。

この結果を踏まえ、PINE側からの送信開始時のフラグとともに、Papilio側でデータ受信が完了したことを示すフラグをPINE側に返す、ハンドシェイクを用いた方式にした。

修正後の2回目の実験でも、通信が成功しなかった。しかし、この原因はプログラムでなくハード側であると考えられる。実験直前に発覚したミスも含めて、原因は以下のものであると考える。

・先日作成したPINE用シールドのPapilio搭載側のA、Bラインの向きが180度逆であった。A0ピンの位置にA15ピン、B0ピンの位置にB15ピンが接続されていた。設計時に逆に配置してしまったようである。現状SERDESのクロック出力ピンにPINEからのデータ出力ピンがつながっている個所もあるので、修正か再作成を検討中である。
・ハンドシェイク方式に変更した際、データ更新を要求するPapilio側の送信ピンを、SERDESの受信側に接続されているピンから出力していた。実験時は有線であったためあまり問題ではないが、修正が必要である。
・Python側で遅延を一度も入れないプログラムにしていた。データ更新中に下がるはずのフラグを読み込んでいない可能性がある。
・統合実験を急いだため、個別の実験を行わずに実験を行っていた。そのため、現時点で通信失敗の原因がPINE側からの送信速度が速すぎるのか、Papilio側で受信ができていないのかが不明である。

問題点が複数同時に発覚したので、修正には少し時間を要すると考えられるが、ひとつづつ実験を行っていく予定である。

PapilioでのSERDES送信精度測定4

前回の送信精度測定モジュールをさらに修正した。

前回、SERDESの送信周波数に制限があると記述したが、これはシリアル通信側での特性の説明であったため、あまり関係がないようだ。

搬送クロックを100MHzに固定し、送信周波数をいくつか変更して実験をしてみたところ、

・100MHz:送信回数と受信回数が同じ
・32MHz:送信回数に対し、受信回数が±1回ずれるピンがある。周期的にずれるピンが変わる。
・16MHz:送信回数と受信回数が同じ

という結果になった。また、23Hz程度の低周波で送信した場合、送信回数と受信回数が等しいが、実際に送受信回数が一定に落ち着くまでに少し時間がかかる。

これらの実験結果から、搬送クロックとの兼ね合いで特定の周波数を除いて、伝送エラーは極めて低いことが分かった。しかし、一部周波数で送信した場合、データが±1回分ずれることが分かった。これがテストモジュールの影響なのか、SERDES側の問題なのかは不明である。可能性として、搬送クロックの立ち上がりの直前または直後にデータが変更され、それによって送信時のデータに誤差を生み出している、または送信側でのカウント終了時に受信側でデータが書き換わる直前またはオーバーした直後となっていることが考えられる。搬送100MHzで送信32MHzの場合、搬送クロック3.125回に1回変化するので、クロックの立ち上がりタイミングと重なっているのではないか。

ただ、それ以外での送信に不備がないので、今後はSERDES及びシールドを用いてデータ転送実験を行っていく。

PapilioでのSERDES送信精度測定3

前回修正したVHDLにさらに修正を加えた。

前回以降の実験で判明した問題は、

・データ送信中にFIFOメモリがオーバーフロー気味で、データが乱れている可能性がある。

・データを最初に計測してから再び計測フェーズに戻ってこない

の2点である。この問題を修正するため、

・FIFOメモリを従来の10個から30個へ増設

・計測フェーズ、送信フェーズの切り替えを計測、送信モジュール単体での切り替えから受信モジュールとのハンドシェイクに切り替え

を行った。ハンドシェイクに切り替えた際、クロックの同期タイミングを送信と受信でずらす必要があったため、受信側のリセット完了フラグを送信側で受信した際、カウンタを1にセットする仕様とした。(0にセットすると、受信回数が送信回数より1回多くなってしまう。)

また、実験時に視認性を重視し送信クロックを100Hz程度で行っていたが、データが乱れる症状が確認された。

データシートを確認したところ、データ送信クロックの周期に上限が設定されていた。遅すぎる周期で送信をすると、データが乱れるようだ。

100MHzクロックで信号を送信したところ、実際に動作を確認した。下の図が動作の様子である。

出力文字列20180131
出力文字列

これにより、5番ピンの接触不良以外での動作を確認することができた。

今後送信周波数を少しずつ落とし、データが正常に送信できる下限を探る。

また今回から、練習用プログラムを除き、作成したプログラムをgitにて管理することにした。gitは、プログラムの更新履歴を残しつつデータ管理が可能となるシステムである。今回のプログラム改修中、修正を加えすぎてもとに戻せなくなる事態が発生したため、更新前に戻すことが可能となるgitを導入することにした。git管理を行うリポジトリはGitLab(https://gitlab.com/)を使用、データの同期はgitのCUIクライアントを使用した。最新版はPC上にも保存されているため、今後別の研究者にデータを渡す際はそのままデータをコピーすれば配布可能である。

PapilioでのSERDES送信精度測定2

以前作成したSERDESの送信精度測定モジュールに改良を加えた。

以前の仕様では、受信側の動作タイミングをSERDESの搬送クロックの受信と合わせていたが、その仕様の場合、搬送クロックが来たタイミングで受信しないとうまくカウントされなかった。

そこで、受信側を非同期式に変更し、各ピンで受信した回数をカウントする方式にした。また、受信数が送信数より少なく、送信から受信までにラグがあることが確認できたため、送信周期を遅くすべく、新たに分周機能を追加し、DCMで生成できる周波数以下まで測定を可能にした。

諸事情により本格的な測定は次回行う。

SERDES評価ボードの改良3

以前切削した改良版の評価ボードを製作した。

前回ピンヘッダを用いたシールド接続部は、ピンヘッダの長さ調節の影響でピンが破損しやすかったため、足長ピンソケットを用いた。それ以外の変更点は特になし。

完成品の写真を以下に示す。

OLYMPUS DIGITAL CAMERA
表から見た図。実験のためにジャンパを接続した。

OLYMPUS DIGITAL CAMERA
裏面

現状、ビットテスト用VHDLの設計に時間がかかっている状況である。また、評価ボードやSERDESを交換しつつ以前のテストモジュールを動作させると、点滅不良の箇所が変動することから、回路製作の過程における精度が接触不良に影響している可能性が高いと考える。その為、一度ビットテストを保留とし、この評価ボードを基にした実用基板の設計を行う。