秋月電子で突如発売された384kHz/16bit対応R-2R DAコンバータICのPT8211Sですが、
なんとこの子、入力データがI2SではなくLSBが最後に来る右詰めです。
昔はこの方式が主流だったのでしょうか・・・?
したがって、I2Sが主流となった今日においてはAmanero Combo384やXMOS、S/PDIFレシーバなどからやってくるI2Sデータを右詰めにしてこのPT8211Sに送ってあげる必要があります。
と、いうことでAUDIYお得意のVerilog HDLで論理回路設計します。
入力信号の仕様
今回PT8211Sに入力する信号の仕様は以下の通りです。
- 16bit右詰め
- 最大サンプリング周波数は384kHz
- 最大ビットクロック周波数は18.432MHz(!!)
さて、ここで普段からI2Sなどのシリアルオーディオデータを扱っている方ならピンと来たかもしれませんが
なんとこの子、サンプリング周波数の最大48倍のビットクロックでないと動作しません・・・・・
つまり、I2Sのビットクロックをそのまま入れても動作しないということです。
また、ビットクロックの周波数から逆算すれば24bitのデータも入力することはできますが、その際は下位16bitがデコードされます。
ここを少し考えてあげる必要があります。
対応策
上記の入力信号の仕様を踏まえ、AUDIYは以下のように論理設計することにします。
- I2SのBCKを2分周し、サンプリング周波数の32倍のBCKを生成する。
- I2Sのデータの上位16bitを分周したBCKの立ち下がりエッジに合わせてシリアル出力する。
- 右詰めフォーマットに合うように、ワードクロックの開始点とデータの開始点を揃える。
さすがに24bitに合わせてビットクロックをつくるとなるとAmanero Combo384のマスタークロックから再生するサンプリング周波数に合わせて分周するか、PLLを使ってI2SのBCKを3/4倍する必要があり少々面倒くさいので、上記のようにします。
これにより最大のビットクロック周波数は12.288MHzとなります。データシートには「必ず48倍のビットクロックを入れる必要がある」との記載も見当たりませんのでおそらく大丈夫でしょう。
いざ、記述!
でまぁ、記述していくわけです。
最初はクロックにグリッチを入れるとデータがズレたりとバグもあったんですが、なんとかシミュレータ上ではバグが確認できないくらいに作り込むことができ、
バグ修正完了!
— AUDIY (@AUDIY14) January 23, 2022
わざとクロックにグリッチを入れてもちゃんと復帰する! pic.twitter.com/yyh0tLBv6L
いざ、Quartus上で論理合成したら
ですよねー
— AUDIY (@AUDIY14) January 23, 2022
(訳:テメー異なるクロックで同じレジスタ操作してるやんけコノヤロー!) pic.twitter.com/Q3mhQH3lmv
これはQuartusのみの仕様なのか、XilinxのVivadoなども該当するのかはわかりませんが、「同一のレジスタを異なるクロックで操作してはならない」というルールが存在します。
どうやらここがマズそうですね pic.twitter.com/xv8wrCbScl
— AUDIY (@AUDIY14) January 23, 2022
今回はDATAO_Bufというレジスタをワードクロックとビットクロックの両方で操作しようとしていたのが原因でした。
個人的にはビットシフトを使って先頭ビットを読むということができれば確保するレジスタを削減できて嬉しいのですが・・・・
仕方ありません。今回はカウンタを使って一致するインデックスのデータを読むことにします。(異なるクロックでの読むのは全然問題ありません。)
合成する
結局ビットシフトじゃなくてカウンターを使ったよ・・・ pic.twitter.com/EhpLbq4GO1
— AUDIY (@AUDIY14) January 23, 2022
合成できたあとの論理回路のブロック図を見るの好きなんですけどわかる方います? pic.twitter.com/oZYpnuUg8u
— AUDIY (@AUDIY14) January 23, 2022
タイミング制約も通ったし、あとは基板を起こせば動かせそうですねPT8211S pic.twitter.com/NPHn21EQtW
— AUDIY (@AUDIY14) January 24, 2022
タイミング制約までできましたのであとはFPGAに焼けばOKです!
まだ実機動作確認できていませんので、そこが確認できればコードも公開できればと思います。