DIGILENT社のSpatan6 評価ボードであるAtlysに実装されているAC'97 odec (LM4550)を制御してみている。 LM4550とFPGA間のI/FはAC LinkというシリアルI/Fであり、256bitからなるフレームは、16bitまたは20bit長の全部で13固のスロットで構成される。これは、前回のブログに書いた。 FPGA側は素直に256bit長のparallel to serial変換回路を実装するのが安直であるが、13個のスロットには仕様上予約となっている項目や今回の実装では使用しない項目等があり、これらは全て0が設定するので、256bitのparallel to serial回路では無駄が多い気がして、以下のような回路にした。
送信部
受信部
この送受信部はCodecから出力されるクロック(12.288MHz)で動作するが、その上位の回路(送信データの供給元や受信データを格納先)は100MHzと50MHzとかの別のクロックで動作させたい。したがって、これら領域は異種クロックで動作することになるため、やりとりするデータのクロックの乗替えが必要になる。これは非同期FIFOを使うことにした。
送信用
受信用
回路としては大体こんな感じだが、例えば音を出すためには音源データが必要であり、以前作成したFunction Generator用のRTLを若干変更して組み込んだ。また、LM4550は初期状態では全てのボリュームがMute状態になっているため、必要なボリュームレジスタのMuteを解除する必要がある。Codec内部レジスタは本AC97コントローラのレジスタ経由でソフトウェアからアクセスできるようにしているので、Function Generator用のソフトウェアにその処理を追加した。
wavファイルデータをDRAMに展開しFunction GeneratorのLBUFの機能を使って再生させてみた。
(注意:曲が流れます。)
また、DDSで単一周波数信号(例えば1KHz)を出力させても音はでるが、オシロスコープで波形をみると輝線が太く波形的には汚い。どうも水晶発振器出力の24.576MHzが重畳しているようだ。
これは実装(基板設計)の問題と思われるのでRTLではどうしようもない。