スピーカアレイ駆動システム 動作確認(1) FPGA内のFIFOを使わない場合

FPGA

FPGAのハードウェアARRAY_DRIVER_DIRECT.vhdにより合成しました。このハードウェア構成は,FPGA内部にはFIFOバッファを持ちません。このとき,PC → USB → FT232H → FPGAという経路でのデータを転送し,出力波形がどうなるかを確認をしました。3MHzのオーディオサンプリングクロックに同期して0, 1の反転を繰り返す波形が出力することを期待しています。

設定と条件

  • 送信データ
    FWriteToFT232H_Test.cppを使用し,8192バイトのデータを送信
    送信データは,全てのチャンネルがオーディオ信号のサンプリングクロック毎に反転するパターンになっている。
	 case 1: // 全チャンネルが同じ位相で反転を繰り返す信号
		 for (int i = 0;i < N_CH * N_BYTE; i++) {
			 data[i] = 0xFF; // 全てのチャンネルのデータの全ビットを1に
			 data[N_CH * N_BYTE + i] = ~data[i]; // 半周期経過したら反転
		 }
		 break;
  • FPGAの設定
    ハードウェア記述:ARRAY_DRIVER_DIRECT.vhd
     FIFOバッファはFT232H内蔵のものだけを使用している。
     ピン配置は,以下の図のとおり
MachXO2_BB基板のヘッダピンへの信号割り当て
J2,J4ヘッダピン
J1,J3ヘッダピン
  • 波形の観測
    スピーカ駆動信号のチャンネル0のビット0であるdrive[0][0],FT232Hへの制御信号RD,フラグ信号RXFの波形を観測する。
    波形の観測にはUSB接続計測モジュールADALM2000とオシロスコープソフトScopyを使用した。

測定

1)CH1:drive[0][0] ,CH2:RD

Scopyのオシロスコープモードによる観測波形,CH1:drive[0][0], CH2:RD

観測波形は図のようになりました。これからわかることは

  • 出力drive[0][0]の周期は安定していない
    0 → 1,1 → 0の遷移のタイミングが一定ではなく,ばらつき(ジッタ)があります。
  • RDは等間隔で出力されている
    FT232HのFIFOバッファ出力を読み出すための制御信号RDは,FPGA内部で60MHzのクロックに同期して生成されます。クロック8周期分0を続け,その後,いったん1にし,FIFOバッファに残りデータがあることを示すRXF=0を確認してから再び0に戻します。
    波形を拡大したいのですが,Scopyの設定で,これ以上は拡大できないようです。(調査中)

2)CH1:drive[0][0] ,CH2:RXF

次に,ScopyオシロスコープのCH2をFT232Hの出力するフラグ信号RXFに切り替えて波形を観測します。

Scopyのオシロスコープモードによる観測波形,CH1:drive[0][0], CH2:RXF

上の図のような波形が観測されました。

  • RXFは,連続して0になっている
    この観測波形が正しいとすると,観測した時間区間に限って言えば,FT232HのFIFOバッファには十分なデータが蓄積されていて,FPGAは連続してデータを読み出していることになります。

しかし,RXFが正しく観測されているかどうかが問題です。計測モジュールADALM2000のオシロスコープはサンプリング周波数の最大値が100MHzです。このため,60MHzのクロックに同期している電圧変化をとりこぼしている可能性があります。

(実際,RDのパルス波形の変化が表示されないことがありました。なぜこのようなことが起こるのかの原因は現時点では不明です。)

 また,ScopyでMemory Depth(波形をサンプルするメモリの寸法)を1600に設定しないと,RXFやRDをキャプチャできないようです。(現在,Memory Depthを任意の値に設定する方法がわかっていないので,調査中。)

結論

出力波形にジッタが見られる。これが,単にサンプリングのタイミングのジッタだけであれば,その影響はオーディオ信号のノイズとして現れると考えられます。テスト信号として周波数一定の正弦波(をΔΣ変調したもの)を使い,雑音の影響を評価さればよいでしょう。

しかし,ジッタの原因が送信データの欠落だとすると,発生する雑音の評価だけでは不十分かもしれません。

また,ジッタの原因をまだつかめていないことが一番の問題です。この原因を調べるためには,Scopyのオシロスコープ機能だけでは不十分で,ロジックアナライザ機能も使う必要があるようです。(LatticeDiamondには,FPGA内部の信号をロジックアナライザのように読み出して表示するIP生成機能があるのですが,そこは勉強中です。)

そこで,もう1つの解決策として,FPGA内部にFIFOを構築することを考えました。十分な容量のFIFOを使えば,非同期に送られてくるデータのタイミングばらつきを吸収し,出力タイミングが一定になるようにできそうです。

MachXO2は内部にメモリモジュールを持っていて,これを使ってFIFOを構成するためのIP(Interectual Property)が無料で(!)提供されています。IPを使うと,VHDLコードを別のメーカのFPGAで使いまわすことができない,という問題はあります。でも,楽だし,トップレベルのVHDLコードは,ずっと簡単になりそうです。さらに,このFIFO-IPを使うと,一旦書き込んだデータを何度も使うこともできるので,オーディオ以外の用途,例えば超音波信号の発生などにも使えそうです。

というわけで,新しいVHDLコードを作ってみることにしました。

コメント