FPGAボード(Sipeed Lichee Tang Primer)を使って設計しているオリジナル16ビットCPUコアMoscoviumについて、粗方のI/Oユニットは揃えてきたつもりですが、アナログ出力可能なI/Oユニット、DA変換器が無かったな、と。
今回設計するのは、Moscovium用のDA変換器ユニットです。
過去、本HPではディスクリート部品を使って作ったことがあります。以下リンクからご確認ください。
「#7-6 DA変換器を作る」
上の記事では、単純に同じ値の抵抗を直列接続して、抵抗分圧によるアナログ電圧を下右図のアナログマルチプレクサで選択出力しました(抵抗アレイ型、下左図)。
抵抗をはしご型に組むタイプは抵抗ラダー型と呼びます。合成抵抗の抵抗分圧でアナログ電圧を出力する原理は同じです。
過去、本HPでは、ATtiny2313(DA変換器非搭載)を使って、アナログ電圧を出力(「#14-6 暗くなったら蝋燭を灯して」)したり、AD変換器非搭載のATtiny2313でAD変換するための参照電圧回路(DA変換器)として設計、応用してきました(「#14-8 ATtiny2313+容量+抵抗=AD変換器」)。
PWM型はその名の通り、タイマで出力したPWMのデューティでアナログ量を表す方式です。
PWMは0/1のデジタル信号なので、アナログ電圧に変換するためには、出力したPWMをアナログLPFへ通す必要があります。
簡単には、抵抗Rと容量Cの充放電回路でLPFを形成できます(上左図)。
時定数CRを使って、遮断周波数fc=1÷(2π×CR)を所望の値に設定して使います。fc以上の高い周波数を遮断することで低周波数成分を残すと、所望のアナログ出力となるのです。
この方式の難点は、PWM出力のHIGH期間に充電、LOW期間に放電を繰り返すことで、上右図の様に、出力したアナログ電圧(Vout、青色プロット)が脈動してしまう事でしょう。この脈動幅は、そのままDA変換精度を低下させます。
デジタル信号(PWM)がチップの外部に出力されることで、ノイズ(EMI)も大きくなります。
ΔΣ型DA変換器は、前節のPWM型をさらに進化させた方式と言うことができます。
ΔΣ型は1ビットのデジタル出力(0または1)で、1の単位時間密度がアナログ量を表します。この様な出力のことをPDM(Pulse Density Modulation)と呼びます。最近では、M5StickC Plus内蔵のPDMマイクの制御で登場しています。
「#23-10 PDMマイクを使って見る」
PDMは、ΔΣ型AD変換器の1ビットAD変換出力と同じです。
「#9-2 ΔΣ型AD変換器を作る」
ΔΣ型AD変換器では上図の様に、アナログ入力Ain(下段、緑プロット)から、PDM信号Do(上段、深緑プロット)を出力しましたが、ΔΣ型DA変換器は逆の動作となるので、PDM信号Doから、アナログ電圧Ainを生成(再現)することになります。
ΔΣ型もPWM型と同様、デジタル信号のPDM出力を、アナログLPFへ通すことでアナログ電圧に変換することができます。
FPGAボードにはDA変換器は搭載されていないので、全て1から設計しなくてはなりません。
DA変換器とは、デジタル信号をアナログ信号に変換する装置ですが、FPGAボードはアナログ信号の処理には適さないので、アナログバックエンドはディスクリートで外付けに作るしかありません。
抵抗アレイ型の原理は単純だけど、ディスクリートで作るには多数の抵抗を繋ぎ合わせて、アナログマルチプレクサを組み合わせなくてはなりません。
と、簡単に言っても、もし、N=8ビット解像度のDA変換器を作ろうと思ったら、実に2N=256個の抵抗が必要となるし、256 to 1のアナログマルチプレクサが必要となります。ディスクリートで作るのは非現実的です⛔。
PWM型は原理も単純だし、PWMさえ出力できれば、後は外付けのアナログバックエンド(LPF)で決着します。PWMを出力できさえすれば良いので、デジタルフロントエンドは汎用16ビットタイマTIM162で十分です。
例えば、8ビット解像度にしたい場合には、timprd=28=256に設定します。消費電力とノイズ(EMI)を無視して変換精度を重視するなら、timpsc=0で使います。この時のPWM周期は、(256+1)÷24MHz≒10.7μs(→93.8kHz)です。
この方式は現時点に於いて、TIM162ユニットからPWMを出力して、外部にアナログLPFを接続するだけで何時でも実現可能なので、今回のスコープからは外します。
今回採用するのは、ΔΣ型DA変換器です。
PDM出力は、オフセット(1LSB)付近とフルスケール(2N−1[LSB])付近で周期が最長となるのですが、中間の電圧出力(2N÷2[LSB])付近では、逆に周期が最短となります(出力値によって周期が変動する)。
PWM方式と同様、CR回路のLPFへ通す事でアナログ電圧を得るので、繰り返し周期が短くなる中間電圧付近では、PWM型よりも変換精度の向上が期待できます。中間電圧にバイアスを取って、そこから上下に振幅する音声信号などの出力に適しています。
また、既存のI/Oユニットだけで実現可能だった、抵抗アレイ型、PWM型とは異なり、追加のデジタル回路が必要となります。アナログバックエンドに加えて、デジタルフロントエンドとしてPCM→PDM変換回路が必要となるのです。
今回は、この回路を設計したいと思います。
本節では、PCMからPDMへ変換するアルゴリズムを考えて行きます。
まず、記号の定義からスタートします。
前節で考案したアルゴリズムを反映したブロック図は以下の通りです。
※薄黄色の箱はCPUからアクセス可能なI/Oレジスタです。
上図は、FPGAボードに構築できる、デジタルフロントエンド部分のみのブロック図です。便宜上「DA変換器ユニット」としていますが、実際には、ただのPCM→PDM変換回路です。FPGAボードの外付けにアナログバックエンドを接続して初めて、DA変換器として機能します。
出力信号dac_pdmoは、汎用I/Oポートとマルチプレクスされています。端子割り当て表はこちらです。
以下表にI/Oレジスタの一覧を示し、説明を続けます。
Addr | Name | R/W | Bit:15〜0 | Memo | |||||||||||||||
0xf140 | dacctl0 | RW | − | − | − | − | − | − | − | − |
DA CE |
BITW [2:0] |
CLKS [3:0] |
dac control | |||||
0xf142 | dacdat0 | RW | − | − | − | − | DAT[11:0] | dac output data | |||||||||||
0xf144 | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | reserved |
0xf146 | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | reserved |
0xf148 | dacctl1 | RW | − | − | − | − | − | − | − | − |
DA CE |
BITW [2:0] |
CLKS [3:0] |
dac control | |||||
0xf14a | dacdat1 | RW | − | − | − | − | DAT[11:0] | dac output data | |||||||||||
0xf14c | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | reserved |
0xf14e | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | − | reserved |
※1チャンネル出力可能なΔΣ型DA変換器DAC121を、2ユニットインスタンスしてあります。前半がチャンネル0、後半がチャンネル1のI/Oレジスタです。
BUSC出力のセレクト信号はbcs_dacu_nです。上表の範囲でアサートされるので、DAC121ユニット内では、アドレスbadr[3:0]を復号してレジスタを特定しています。このI/Oユニットはバイトアクセス禁止です。必ずワードアクセスしてください。
I/Oレジスタ仕様:
使い方は簡単で、DACEビット=1として、dacdatレジスタにPCMデータを書き込むだけで、対応する端子からPDM信号が出力されます。必要に応じて、PCMのビット幅や出力クロック周波数を設定してお使いください。
FPGAボードでアナログアプリケーションを開発可能な様に、今回設計したΔΣ型DA変換器DAC121ユニットと、AD変換器ADC124ユニットを搭載したマイコンMCOC115DA0408を作成しました。
以下リンクより、最新のデザインをダウンロードすることができます。
FPGAボード(Sipeed Lichee Tang Primer)への書き込み手順はこちらを参照してください。
以下に、TD IDEでのコンパイル(論理合成・配置配線)結果をまとめておきます。
こちら(「#19-6 FPGAボードのAD変換器を使う(2)」)の記事で評価した様に、FPGAボードのAD変換器マクロは、特性的には宜しくない(絶対精度AE≒40LSB)ので、まともなアナログアプリケーションが作成できるかどうか?は怪しいです。
が、プロトタイプ(試作)として、アナログ信号の入力(AD変換器)と出力(DA変換器)ができるようになったことで、応用の幅が広がるのではないでしょうか?
次回、アナログバックエンドを設計して、ΔΣ型DA変換器の評価まで完結したいと思います。