guruguru123’s diary

かなり雑な作業日記です。

A/Dコンバータからのデータ受信

SerDesでのデータ受信ブロックができたため、これを改造してA/Dコンバータからのパラレルデータを受信する機構にしてみた。

用いるA/DコンバータはAD9214で、これはアナログ値が10bitに変換され、パラレルで出力される。前回のSerDes受信ブロックとほとんど同じだが、今回は10bitのデータ一つ受信につき、SDRAMへ書き込みを行うものとした。そのため、VHDL中身の書き換えはSDRAMコントローラがメインとなった。

今まではバースト長4で動作させていたため、初期設定に使うモードレジスタの値を変更し、バースト動作無しに設定した。また、それに伴いアドレス指定の変更、書き込み、読み出しステートの変更を行った。

また、A/Dコンバータのエンコードクロックは100MHzにし、連続動作させ続けることにした。ADC受信ブロックは、受信リクエストがあったら、あらかじめ指定されたデータ個数分だけ受信することとする。

一通り書き終えたので、ADC受信ブロックと、書き換えたSDRAMコントローラが動作するかシミュレーション、実機での試験を行う。

そういえばと、今まで動作クロックが50MHzであったことを思い出したため、100MHzに上げてSerDes受信ブロックが動作するか試してみた。やはり配線がジャンパ線であるためかSerDesの受信データやAD9851の出力信号が安定しない。それでも上手くいくときはSerDes受信回路のデータが正しくSDRAMに書き込み、読み出しできたため、配線を整備すれば問題なく動作すると思われる。

SerDes受信ブロックの検討(3)

SerDes受信ブロックの検討(2) - guruguru123’s diaryで記述したVHDLで実機が上手く動かなかったため見直し。前回のものだと、イネーブルがアクティブになった瞬間にREQ_Wが立ち上がってしまっていたため、新たにカウンタを設け、イネーブルがLow,ストローブHighでカウントアップし、8回受信した時にREQ_Wを立ち上げるようにした。以下は64bitデータを3回受信するときのシミュレーション。

f:id:guruguru123:20171210165605p:plain

これをPapilioへ書き込み、動かしてみたところ問題なく64bitデータをSDRAMへ書き込みができるかと思いきや、読み出すデータがなぜかずれていた。

SerDes機構は問題ないはずであるため、念のためSDRAMコントローラを確認してみると、クロック周りだけ改善が反映されていた。そのため、読み出しが1ステップ足りておらず、読み出しデータのずれが起こっていた。

これを直すと問題なくデータが書き込み、読み出しが行えて、AD9851も駆動することができた。

Papilio Pro へのクロック入力

SerDesの受信ブロックで、SerDesからのクロックを入力するところでエラーが出て詰まった。エラーを見ると

ERROR:Place:1108 - A clock IOB / BUFGMUX clock component pair have been found
that are not placed at an optimal clock IOB / BUFGMUX site pair. The clock
IOB component <WING_C<5>> is placed at site <P119>. The corresponding BUFG
component <WING_C_5_BUFGP/BUFG> is placed at site <BUFGMUX_X2Y4>. There is
only a select set of IOBs that can use the fast path to the Clocker buffer,
and they are not being used. You may want to analyze why this problem exists
and correct it. If this sub optimal condition is acceptable for this design,

---------------------------------------------------------------------------------------------------------------
you may use the CLOCK_DEDICATED_ROUTE constraint in the .ucf file to demote
this message to a WARNING and allow your design to continue. However, the use
of this override is highly discouraged as it may lead to very poor timing
results. It is recommended that this error condition be corrected in the
design. A list of all the COMP.PINs used in this clock placement rule is
listed below. These examples can be used directly in the .ucf file to
override this clock rule.
< NET "WING_C<5>" CLOCK_DEDICATED_ROUTE = FALSE; >

となっている。PapilioのWING_C(5)からクロック入力をしようとしたのが悪かったらしい。理由は、WING_C(5)のピンP119はBUFGに直接入力できるピンではないとのこと。

点線より下は最後の行の呪文を書けば警告に移るよ、という内容。

WING_C(5)がだめならどこなら良いのかということで、Spaltan-6 FPGAパッケージおよびピン配置という資料を読んでみた。(https://japan.xilinx.com/support/documentation/user_guides/j_ug385.pdf)

まず、Papilio Proに乗っているSpaltan-6(XC65LX9)にはGCLKというピンがある。GCLKピンは入力で、これらのクロックピンはグローバルクロックバッファに接続される。また、クロックに使用される必要がないときは通常のユーザーI/Oになるというもの。GCLKピンは、バンク0,1,2,3にそれぞれ8つあり、合計で32ピンがクロック入力として使用される。バンクは図1.1参照

f:id:guruguru123:20171207152445p:plain

この32ピンのうち、どれがPapilioのI/Oピンと対応しているのか見てみた。以下の図がPapilioのI/Oが対応しているあたりのGCLKピン。

f:id:guruguru123:20171207152924p:plain

これを元にUCFファイルを見てみるとWING_Aは1,2,13、WING_Bは2,3,4,9,13,14、WING_Cは8,9,10,11,12,13,14,15が見落としがあるかもしれないがGCLK対応である。クロック入力を行うときはこのピンから行えばよい。

Papilio Pro基板上SPI Flashへのbitファイル書き込み不良

11/24に書いた二台のAD9851をドライブするプログラムを、独立させて動作させるためにPapilio Pro上のSPI FlashにbitファイルをPapilio Loaderを用いて書き込みしようとした。

すると、FPGAに直接書き込みしたときには動作していたものが、SPI Flashに書き込んだ途端に動かなくなってしまった。

原因がわからずあれこれ悩んでいると、「ZAP IDEに入っているPapilio Loaderで書き込みすると上手くいくらしい」、ということを教えてもらったため試してみた。

サイトからダウンロードしてきたものはVer2.7だが、ZAP IDEに入っているものはVer2.6である。半信半疑で書き込みしてみると正しく動作した。

動作したためAD9851二台駆動のテストを改めて行ったところ、出力周波数、位相が正しく出力されていることが確認できた。

SerDes受信ブロックの検討(2)

SerDesの受信ブロックが記述し終わったため、シミュレーションを行った。64bitデータの個数をあらかじめ指定して、その個数受信したら終了というものも考えたが煩わしいため、SerDes_ENというイネーブルを1ピン追加した。SerDes_ENはアクティブLowで、Lowの間データ取得を行う。それに加えて、8回分の指示信号としてSTROBEをつけてある。今回は8個の8bitデータがシフトレジスタを通して正しく64bitデータとして出力されているかのチェック。図を見るとDATA_INがクロックの立ち上がりエッジで変わっていき、立下りエッジで読み込みを行っていることがわかる。STROBEの立下りでSDRAMへの書き込みリクエストであるREQ_Wが立ち上がっている。

f:id:guruguru123:20171201144358p:plain

SDRAMコントローラが立ち上がりエッジでデータを読み込むため、問題なくデータの受け渡しを行えると思う。

シミュレーションで動作確認ができたため、実機でのテストを行う。

SerDes受信ブロックの検討

SDRAMコントローラができたため、SerDesからデータを受信して次々SDRAMへ書き込んでいく機構を検討する。64bitをひとまとまりのデータとして扱うため、8bitパラレル×8でSDRAMへバースト長4の書き込みを一回行う。

今回用いるSerDes基板のSN75LVDT1422は14bitパラレル入力可能であるため、使用する8bitのほかに1bitをストローブとして使用することにした。ストローブがアサートされている間のデータがひとまとまりの64bitデータで、ネゲートされたときにシフトレジスタに蓄えられている64bitをSDRAMに書き込むこととする。

動作クロックはとりあえず50MHzでやってみることにする。

とりあえず受信部の大枠は書き終わったので、統合して、コマンド等も変えていく。コマンドは今までのreqwをSerDes受信リクエストコマンドとする予定。

2台のAD9851をドライブ

以前dds1,out1をコマンドとしたAD9851ドライブ機構を作成した。今回はこれを拡張して2台のAD9851をドライブできるものにした。

componentでDDS駆動用モジュールのAD9851_ctrlを宣言してある。並列に2台駆動するために、これを二回呼び出して使用する。

また、以前のものはリセット機能がなかったため、新たにシステムリセットのコマンドを追加した。

コマンドは以下の通りである。

dds1,dds2:このコマンドの後の40bitをAD9851駆動用データとしてそれぞれのレジスタに蓄える。

out1,out2:現在レジスタに蓄えられている40bitデータをAD9851にドライブする。

srst:システムリセット