2012年5月27日日曜日

FPGA FMトランスミッタ: 入力部分の実機テスト

ISEの関連ドキュメントからISimチュートリアルを見つけ、お勉強してました。やはり自己流では限度がありますね。日本語で書かれてますし大変参考になりました。
主要ハードウェアは製作以来放置状態だったので初めての実機テストです。とりあえず光入力をコーデックでD/Aできることを確認します。


マスタクロック周波数の変更
設計変更に合わせ77.824MHzを出力できるようSi570の設定を変えました。
以前の記事を見ながら HSDIV=11, N1=6, RFREQ=02CF192732 として、制御用AVRに書き込みました。オシロで所定の信号が出ていることを確認します。


早速出たエラー
HDLで指定したポート名と実デバイスのピン番号を指定する関連付けるUCFファイルを作成しようとするも、ISEでConstraints Editorを起動 時に早速エラーが。
ERROR:Xst:2035 - Port <clk_i> has illegal connections. This port is connected to an input buffer and other components.

どうやらクロック入力ポートclk_iに、複数ユニットを並列接続していたためのようです。バッファ・プリミティブを追加したらエラーが出なくなりました。
この結果、Constraints Editorを無事起動できたものの設定内容が高度すぎて良くわかりません。
とりあえず最低限の情報のみをテキストエディタで追記作成しました。
UCFファイルの書式は、制約ガイドに記載があります。

作成したUCFファイルの内容は次の通りです。codec_ifのループバックテストをするためだけの最低限の内容です。上の3行以外は、ポート名・FPGAピン番号・信号規格を書いているだけです。


#Created by Constraints Editor (xc3s250e-vq100-4) - 2012/05/27
NET "clk_i" TNM_NET = clk_i;
TIMESPEC TS_clk_i = PERIOD "clk_i" 12.85 ns HIGH 50%;

NET "asrc_mclk_o"         LOC =  "P95" |IOSTANDARD = LVCMOS33 ;
NET "asrc_bck_o"         LOC =  "P92" |IOSTANDARD = LVCMOS33 ;
NET "asrc_lrck_o"         LOC =  "P91" |IOSTANDARD = LVCMOS33 ;
NET "asrc_data_i"         LOC =  "P90" |IOSTANDARD = LVCMOS33 ;
NET "spdif_nonaudio_i"   LOC =  "P85" |IOSTANDARD = LVCMOS33 ;
NET "spdif_error_i"      LOC =  "P79" |IOSTANDARD = LVCMOS33 ;
NET "codec_datar_i"      LOC =  "P11" |IOSTANDARD = LVCMOS33 ;
NET "codec_sck_o"         LOC =  "P3" |IOSTANDARD = LVCMOS33 ;
NET "codec_mck_o"         LOC =  "P9" |IOSTANDARD = LVCMOS33 ;
NET "codec_lrck_o"      LOC =  "P4" |IOSTANDARD = LVCMOS33 ;
NET "codec_datas_o"      LOC =  "P2" |IOSTANDARD = LVCMOS33 ;
NET "clk_i"               LOC =  "P38" |IOSTANDARD = LVCMOS33 ;
NET "resetsw_i"         LOC =  "P89" |IOSTANDARD = LVCMOS33 ;
NET "n_reset_o"         LOC =  "P86" |IOSTANDARD = LVCMOS33 ;
NET "n_sw_i[3]"         LOC =  "P57" |IOSTANDARD = LVCMOS33 ;
NET "n_sw_i[2]"         LOC =  "P58" |IOSTANDARD = LVCMOS33 ;
NET "n_sw_i[1]"         LOC =  "P53" |IOSTANDARD = LVCMOS33 ;
NET "n_sw_i[0]"         LOC =  "P54" |IOSTANDARD = LVCMOS33 ;



最上位HDLソース
code_if と colock_gen モジュールを結びつけるためのHDLです。

module top(

   asrc_mclk_o, asrc_bck_o, asrc_lrck_o, asrc_data_i,
   spdif_nonaudio_i, spdif_error_i,
   codec_datar_i, codec_sck_o, codec_mck_o, codec_lrck_o, codec_datas_o,
   clk_i, resetsw_i, n_reset_o, n_sw_i
   );

   output asrc_mclk_o;
   output asrc_bck_o;
   output asrc_lrck_o;
   input asrc_data_i;
   input spdif_nonaudio_i;
   input spdif_error_i;
   input codec_datar_i;
   output codec_sck_o;
   output codec_mck_o;
   output codec_lrck_o;
   output codec_datas_o;
   input clk_i;
   input resetsw_i;
   output n_reset_o;
   input [3:0] n_sw_i;

   wire [23:0] if_l_o;
   wire [23:0] if_r_o;
   wire en;
   wire clk;
   wire reset;
   wire if_sel;
   
   // ASRC/CODEC Interface
   codec_if codec_if(
      .asrc_mclk_o(asrc_mclk_o),
      .asrc_bck_o(asrc_bck_o),
      .asrc_lrck_o(asrc_lrck_o),
      .asrc_data_i(asrc_data_i),
      .spdif_nonaudio_i(spdif_nonaudio_i),
      .spdif_error_i(spdif_error_i),
      .codec_datar_i(codec_datar_i),
      .codec_sck_o(codec_sck_o),
      .codec_mck_o(codec_mck_o),
      .codec_lrck_o(codec_lrck_o),
      .codec_datas_o(codec_datas_o),
      .if_l_o(if_l_o),
      .if_r_o(if_r_o),
      .if_mon0_i(if_l_o),
      .if_mon1_i(if_r_o),
      .en(en),
      .clk(clk),
      .reset(reset),
      .if_sel(n_sw_i[3])
      );

   // Clock Generator
   clock_gen clock_gen(
      .clk_i(clk_i),
      .resetsw_i(resetsw_i),
      .clk(clk),
      .reset(reset),
      .n_reset_o(n_reset_o)
      );

endmodule



実機ループバックテスト
一応動いたものの、31.6kHz付近にナゾのスペクトルが生えています。アナログ系の問題と思っていますが電源のスイッチングノイズか?コンポジット信号を扱うには使えないです。モニタ用に設けた端子ですけど、ノイズ問題は難しい!
この試験中に、光入力で音が出ないトラブルが発生しました。原因は、DIR9001がサンプリング周波数192kHzに非対応であったためです。ちなみにオーディオ的な音質はかなり残念な感じでしたがエージングすれば少しは変わるんですかね。

光入力(1kHz)→CODECアナログ出力

光入力(無音)→CODECアナログ出力

CODECアナログ入力(1kHz)→CODECアナログ出力

CODECアナログ入力(無音)→CODECアナログ出力

0 件のコメント:

コメントを投稿