XilinxのFPGAでDDSをつくろう
FPGAで遊ぶ。
*回路図はそのうちいれます。
ある人の依頼で3相のサイン波を位相変化、振幅変化、周波数変化できる装置を作ってほしいということだったので早速やってみました。これはこのときの制作記です。
1.FPGAのボードを作ろう
FPGAとかちょくちょく使っていろいろ作っているのですが、0.5[mm]ピッチのSOPの場合、ピッチ変換ボードとか使うとどうしてもサイズが巨大になってしまうのでいつものように基盤加工機で基板を作っていきます。
|
|
とりあえずできました。HDLのホームページ(http://www.hdl.co.jp/home.html)にある回路図を参考にして作りました。テストする場合では、FPGAに直接JTAGでつないで、ダウンロードします。ある程度仕上がってきたら、依頼者に渡すためにSROMに書き込んで行くという感じで開発を進めていきます。
はいバグみっけ。
久々にやってしまいました。Protelの回路図の段階で配線ミス・・いたいです。あ〜あこんなになってしまった、以外に0.5[mm]に線つけるのって簡単でした。でも、こういうところから壊れてデバッグに苦しむんだよな・・
・基板加工機による両面基板について
基板加工機の両面はスルーホールの関係でナーバスになります。初めはサンハヤトのスルピンキットを使っていましたが(http://www.sunhayato.co.jp/catalog/board/board5.html)基板の曲げなどによる剥離(断線)がしょっちゅうでこれのデバッグに死にそうになったことが何度もあるので、もう使いません。とくに、ICソケットの足、コネクタなどのスルーホールの接触不良がかなりの確率でおこります。さっきまで動いていたのに・・・というケースがデバッグでは一番たち悪いです。というわけで,おすすめなのがVIAの径を0.8[mm]にしてドリル径を0.5[mm]にする、そして0.4[mm]の錫めっき線で貧乏スルーホールするのが一番確実です。(後輩のFOX君に教えてもらいました)また、208PINの場合はICの底面が足より若干高いので,FPGAの下にも貧乏スルーホールを作ることができます。この場合はぎりぎり(0.2[mm]位)までヤスリで薄くしておけば問題ないです。基板加工機の場合は、レジストがないのでキットとかの基板と比べると半田ずけはちょっとだけ難しいかな。
2.アナログ回路(D/A)の作成
今度は、なんとか片面でいけそうなので楽チンです。基本的に3相分のDACとバンドパスフィルターだけです。手元にあったDACが○○だったのでほんとは12BITなんだけどそんなに必要ないみたいだったので下位4BIT使っていません(もったいなー)。
またバグ見っけ
このDACなぜか最終段に×2倍のアンプが入っているんですね〜ということは基準電源が5VではMAXで10Vになっちゃうことになります(実際にはDACの入力電圧を超えてしまっているので出せませんが)。あと、電源の変動にも強くしたかったので、基準電源用のICLM-??を使うことにしました。空中配線です(とほほ)。また、オフセット調整回路もつけましたがバンドパスフィルタを使っているので、はっきりいってなくても良かったです(むしろない方が・・・)。
3.マイコン回路
仕様なんですがPCのDSPボードにつなぐけどアナログ出力しかないから調整はアナログで・・・というなんだか不思議な仕様にするためにまぁめんどくさいからPICのADを使うことにしました。回路も手配線です。たぶん応答性能は10k[Hz]程度だと思います。これより早いのが必要になったら、ここをADCにすればいいだけですね。
4.制御ブロック
さて、たのしいハードができたから次は憂鬱なVHDLだーというわけでプログラミング作業です。基本的にはサイン波のテーブルを参照してDACに渡すいわゆるDDS回路なんですが、周波数は20.0k[Hz]〜22.5k[Hz]です。DACはセトリングが1u[s]ということで20k[Hz]のサイン波だったら1周期50刻み(つまりサンプリング周期1M[Hz])のテーブルになります。位相も1周期で50段階に調整できます。依頼者にこれでいい?と聞いたら「十分です」といわれたので今回はこれで行きます(もちろんハード設計の前に決めておいたことですが)。振幅も10段階ぐらいあればいいということだったのでテーブルを10種類作ることでカバーしました。割り算でもいいと思うけどどれくらいゲート使うかわかんなかったのでこれでいきました。周波数はテーブルを適当に間引くようにして変えられるようにしました。
5.依頼者から帰ってきて・・・
結局、周波数の変化をもっと細かくしてほしいということだったので、FPGAでなんとかすればいいやと思ったんだけど、メインのクロックが20MHzでサンプリング周期1MHzとすると1MHz近辺では50KHz程度の分解能しかもてません。もうちょっと分解能ほしいなぁといわれこうなるとPLLとか使うしかないんだけどめんどくさかったので、秋月のDDSキットを使いました。なんか初めからこれ使えばよかったような気がしますが、複数台のDDSキットによる位相差の調整はそれはそれで難しそうだったのでまあいいか・・・。
でもこのキットDDSなのにどうして1[Hz]単位で切り替えられるのだろう・・っとおもったらやっぱり内部にPLL回路を持っているようでした(なあんだ)。
で、もうほんとにめんどくさかったのでディップスイッチのところから直接周波数をいじることにしました。PICは10BitのADCを持っています。ということは分解能1024ということなのでこれが20.00k[Hz]〜22.50k[Hz]のフルスケールになれば理想的なわけです。
で、DDSキットと10Bitで結ぼうと思ったんですが、この周波数ってちょうど繰り上がりが3BITも起こってしまうんですね。結局FPGAとDDSを8[Bit]目から21[Bit]までの14[Bit]結線し、PICのからの10BITにオフセットをかけて14[Bit]出力することでサンプリング周波数を917k[Hz]〜1180k[Hz]、出力波形周波数を18.35k[Hz]〜23.59k[Hz]とすることができました。依頼者にこの試作を使ってもらって、いいようであれば、1枚の基板にして基板やさんに発注することになっています。