[1chipMSX]

1chipMSX の音声出力

※情報の正確さは保証できません。

音源としては、PSG, 1bitサウンドポート, SCC, OPLL が搭載されています。
それらの出力は、EMSX_TOP.VHD の Sound output と書かれている場所でミックスされてます。

PSG出力は 8bit, SCCも 8bit, OPLLは 10bit です。
合成結果は DACin という 12bit の信号にまとめられ、esepwm という回路に入力されます。
esepwm 回路の中の入り口部分には、esefil5 という FIR ローパスフィルタ回路が埋め込まれており、
不要な高周波成分をカットしています。
FIR 後に、12bit → 1bit の PWM回路を通して、1bit 信号に変換されます。
FPGA の外には、この 1bit 信号が 6bit に拡張されて出力されています。
つまり、FPGA から 6bit のデジタル信号が出て、それをラダー抵抗でアナログ化しているわけではなく、
ラダー抵抗に入力される 6bit の信号は、000000 か 111111 の2通りになっています。
ラダー抵抗を通しているものの、事実上 0 か 1 のデジタル信号で、不要な高周波を大量に含むわけですが、
それをカットするためのローパスフィルタとしてコンデンサが取り付けてあります。

■FIR フィルタについて
esefil5 は 5tap のフィルタで、3.58MHz で動作しています。
tap係数は、[9:61:114:61:9]/256 ですので、ローパスフィルタです。
tap係数の合計値は 254で、分母は 256なので、ローパス効果以外にも若干振幅が落ちる効果もあるフィルタです。
矩形波のエッジや、合成によって発生する急峻なエッジを滑らかにする(エッジに含まれる高周波をカットする)
のが目的ではないかと思います。

■回路について
各音源のミックス演算は、21MHz で駆動していますが、この 1cycle 内に全ての演算が押し込まれています。
21MHz で数サイクル遅延したとしても人間にはわからないので、ここはパイプライン化した方が小さくなりそうな
気がします。

esefil5 は、5tap@3.58MHz のフィルタを 21MHz で処理しています。
H(Z) = 9 * Z^(-4) + 61 * Z^(-3) + 114 * Z^(-2) + 61 * Z^(-1) + 9 * Z^0
= 9 * (Z^(-4) + Z^0) + 61 * (Z^(-3) + Z^(-1)) + 114 * Z^(-2)
こんなフィルタなので、3個の乗算器と3個の加算器が必要になりますが、乗算器はやや高価な演算器。
esefil5 では、6ステートで一巡するステートマシンで動作しており、1つの乗算器と加算器を使い回しながら
5サイクルかけて1サンプルを処理することでフィルタを実現しています。
定数のかけ算の方が安価なので、変位のかけ算を使っているこの方法が、どの程度有効なのかは微妙なところ
ですが、どうやらサンプル値の遅延素子として FF ではなく RAM を使っているので、同時に 5サンプル読み出せない
ことから、ステートマシンによる時分割処理にしているという理由の方が高そうです。

デジタルフィルタの教科書に載ってるような回路では、Z^(-n) を FF で処理しているのが普通で、
FF で作って、6cycle に1度だけ FF の Load を実施すれば、もっとシンプルに目的を達成できるわけですが、
LogicCell を消費する FF よりも、あまってる RAM を使いたいという考えもあったのかもしれませんね。

[▲上へ]