いろいろなものを作っているうちに簡単に安価にFPGAが使える基板(環境)の必要性を感じるようになりました。
ルビジウム発振器で周波数カウンターをつくったときはAVRマイコンで20MHzのクロックでレシプロカル方式にしましたが、FPGAを使えば200MHz程度のクロックを使えますので分解能を10倍にできるなぁと思っていました。
基板には、FPGA(XC3S200A)、マイコン(MC9S08JS16)、SPIフラッシュがのっています。
最初にマイコン(MC9S08JS16)に USB 経由でモニタープログラムを書き込みます。 モニタープログラムは FPGA のコンフィグや FPGA と PC 間の通信、SPIフラッシュの読み書きをします。 PC からターミナルソフトで簡単にFPGAを制御できます。 またFPGA のコンフィグはSPIフラッシュ経由でも行なえるのでスタンドアローン動作にもできます。
基板ができてきたのでまずは
FPGAをつかったラジオをつくってみました。
■閑話休題
- 100MHz のクロックでΔΣ方式のDAを実験していましたが、歪が大きくなかなか改善できませんでした。 クロックが100MHzともなると出力ポートのスルーレートやH/Lでのドライブ能力の差が大きく効いてくるようです。 偶数次の歪はスルーレートが、奇数次の歪はドライブ能力が影響しているようです。 歪レベルを見ながらFPGAのポート設定を ucf でいろいろ変えて最適な設定を探し、slew="FAST"、drive=8 にし、高調波が -60dB ぐらいになりました。 もっと簡単にはクロック周波数を必要最低限まで下げればいいですね。
- 使っているマイコン( MC9S08JS16 )の実行速度が思っていたより遅かったです。
CPUクロックが48MHzで命令実行サイクル数が平均4程度とすると12MIPSぐらいになるはずと思っていました。 じつは命令実行サイクル数はバスクロックに対してで、バスクロックは24MHzなので実際の実行速度は想定の半分でした。 普通は CPUクロックで実行サイクルを規定していますのでバスクロックに対してだとの記述を見つけたときはびっくりしました。 トラ技2009/8 p.222 にもCPUクロックと誤解している記述がありました。
- MC9S08JS16 → PC 方向への転送バイト数がパケットサイズと一致したときに PC のターミナルソフトにデータが届かないという現象がおきました。
パケットサイズより小さいパケットを送ればターミナルソフトにデータが送られるのですがパケットと同一サイズだと PC 側の CDC ドライバーで転送終了になるのを待っているようです。 本来は ZLP (Zero Length Packet) を送って転送終了を PC 側に知らせればいいのでしょうが、USB CDC プログラム側では転送終了のタイミングがわからないので対処のしようがありません。 とりあえず常にパケットサイズより小さいサイズのパケットを送るようにしました。
そういえば昔 FTDI の FT8U232 を使ったときも同じような現象に悩まされたことを思い出しました。 そのときはどうしても解決できず FT8U245 に変更しました。 いまの FT8U232 のドライバーはパケットサイズと一致したときにも大丈夫なようになっているのでしょうか。
前に作った基板では入力バッファやJTAG端子、マイコンのデバッグ端子などをつけていましたが、これらはまず使わないことがわかったので、不要な部分を削り基板を小型化(50x50mm)しました。 前につくった基板は60x80mmだったので面積はほぼ半分になりました。
■小型化した基板(50x50mm)
マイコン(MC9S08JS16)の12MHzをバッファをとおして FPGA につないであるのでちょっとした実験にはこれをクロックとして使えます。 また別の周波数を使いたいときのために水晶発振器のパターンが用意してあります。
JTAG 関連の端子は必要になったときのためテストランドに引き出してあります。
入力専用端子もコネクターには引き出さずテストランドにしました。
左下のCN4は液晶表示器をつなぐのに便利なようなピン配列になっています。 今後キャラクター液晶やグラフィック液晶をここにつなぐ予定です。
■閑話休題
- 多めに基板を作ったのでキット化(4500円ぐらいにできるかな)予定です。 欲しい人はいますか?
- 作ろうとおもっているもの(あくまで予定です)。
- FM 復調回路、FM受信機
- 信号純度測定器(FM性ノイズ)
- 周波数変動測定(PLLの応答特性とかを見る)
- グラフィック液晶コントローラー
- CPUコア
- 新しい FPGA(今回使った Spartan3A とか Spartan6)はホットスワップ対応でポートに保護ダイオードが入っていないようです。 そのわりに耐電圧がそれほど高くないのでマイコンとのインターフェースに苦労します。 とりあえずマイコンの動作電圧を4.4Vと低くし、オープンドレイン接続としました。 FPGA の世界では 5V 系ロジックは全く無視されていますよね。
- マイコン(MC9S08JS16)はいわゆる 68 系の CPU で、最近は ARM とか AVR とかをいじってきたためかすごくプログラムしづらく感じました。 演算はアキュムレータでしかできないので、インデックスレジスターで変数を指定してアキュムレータに持ってきて、演算処理をし、結果を変数領域に書き戻す、という形にならざるを得ません。 最近の CPU は汎用レジスタを多く持っていて、いちいち変数領域に書き戻さなくてもよいので楽です。 昔の CPU はアキュムレータ1個というものが多かったように思いますが、そのほうがハードウェアが簡単になるからでしょうか。