DAC 3号機

はじめに

DACの3号機を製作しました。

3号機と言っても、FIFOを搭載したDACまたはCDプレーヤーの3番目という意味です。 前回の2号機は単体CDプレーヤーとしては満足のいく仕上がりでしたが、今回は汎用的に使えるDACとしてだけでなく、ボリューム調節とチャネルセレクタを備えたコントロールセンターを目指しました。

コンセプト

今回の製作では、以下の5項目を目標としました。

R=2Rラダー型DACの24bit化

シリパラ変換とラッチもこれまでと同様74HC164と74HC574でも良かったのですが、折角なので(?) CPLDを使用してみました。 また、CPLDだと回路的に余裕があるので、以下の2点も盛り込んでみました。

  1. LチャネルとRチャネルの出力の変化点の同期

    2号機まではDAIからのシリアルデータをパラレル変換する際にLチャネルとRチャネルの変化点がそれぞれ1/2 LRCK (44.1kHzの場合は11μ秒)ずつずれていたので、本機では同時に切り替わるようLチャネルの出力を後ろにずらしています。 実際は周波数に関係なく一律に遅れるだけなので問題ないはずですが、とりあえず気持ちが悪いので試してみました。

  2. ゼロクロス誤差調整用データパターンの生成

    本機で実装しているR=2Rラダー型DACでは、抵抗の誤差等で生じるゼロクロス誤差の調整をMSBに仕込んだ半固定抵抗で行う必要があるため、0x7fffffと0x800000を交互に出力して、LSBの重み分だけの差が交互に出力することで調整します (テスターやオシロでも測定不可能な微小レベルなので、実運用では完全に出力が同一値となるようオシロで目視調整)。 2号機までは調整用のデータをCD-Rに焼いて、再生させながら調整していたため面倒でしたが、本作ではジャンパSWの設定で0x7fffffと0x800000の調整パターンが出力できるようにしました。

96kHz 24bit、ワードシンク出力対応

DAIにCS8416を採用したので、DAIとしては32〜96kHz、16〜24bitに対応しています。 DAIの次段のFIFOバッファのビット幅は回路の簡略化のため24bit幅のみを実装していますが、DAIの出力を24bitモードにすることで、DAIへの入力が16〜24bitのいずれであっても対応可能となります。

また、33.8688MHz (44.1kHzの768倍)と36.864MHz (48kHzの768倍)の水晶発振器を搭載して、それらを分周した44.1kHz/48kHz/88,2kHz/96kHzのクロックをワードシンククロックとして出力します。

さらに、FIFOの読み出しクロックを44.1kHz/48kHz/88.2kHz/96kHz/DAIからのFSCKの5種類から選択することで、ワードシンクに同期したFIFO動作またはDAIでS/PDIFから抽出したクロックでのFIFO動作が可能です。 ちなみに、FIFOの書き込みクロックはDAIでS/PDIFから抽出したLRCKで行います。

FIFOバッファの大容量化

1号機は16bit幅で1Mbit SRAM、2号機は16bit幅でAVR AT90S8515内蔵SRAMのうち256byteを使用しましたが、本機では24bit幅で4Mbit SRAMを搭載します。 実際には回路の簡略化のため32bit幅でそのうち24bitを使用しますので実質は3Mbit分となります。

実際にバッファリングを行う時間は、3MbitをLchとRchで交互に使用することと時間軸の前後方向の揺らぎを吸収するために半分溜まった状態で使用することから、44.1kHz時には0.73秒、96kHz時には0.33秒となります。これは1号機の2倍、2号機の1024倍となります

デジタル制御ボリュームの搭載

PGA2310を使用したボリュームBOXを作成して使用していましたが、なかなかいい音なので、本機にも搭載することにしました。DACの次段 (本機の最終段) に搭載します。

デジタル入力の複数チャネル対応

CS8416はソフトウエアモードでは8系統の入力に対応しますので、本機ではデジタル入力を8系統搭載します。また、8系統それぞれで同軸入力と光入力を搭載し、切り替えて使用できるようにするとともに、前述のワードシンククロック出力も8系統それぞれに搭載します。

概観

前面

左が液晶表示部、中央がボリューム調整つまみ、右が入力チャネル切替つまみです。また、液晶表示部の下には押スイッチが2個あり、左がModeボタン、右がSelectボタンです。

なお、シャーシは、タカチのCU-5を使用しました。

後面

左から、AC100V入力、電源SW、外部CDトランスポート用33.8688MHzクロック出力、デジタル入力(光、同軸 x8)、ワードシンククロック出力 (x8)、アナログ出力(L,R x1)です。

液晶パネルとモード設定

液晶パネルは4桁のもので、以下の情報を表示します。

なお、1桁目右、3桁目、4桁目の情報は、Modeボタンを押すことで括弧 ([ ])が順に表示され、括弧が表示されている箇所でSelectボタンを押すとその設定が変更できます。たとえば、Modeボタンを2回押すと3桁目に [ ] が表示され、そこでSelectボタンを押すと44.1kHz→48kHz→88.2kHz→96kHz→---→44.1kHzと切り替わります。また、4桁目に [ ] が表示されたときにさらにModeボタンを押すと [ ] は表示されなくなり、その時の設定が1チップマイコンの不揮発メモリに記憶されるため、電源をOFFしたあとONしてもその設定がそのまま使用できます。

ちなみに、3桁目の「---」はFIFOメモリの読み出しを書き込みと同じDAIからのLRCKで行うことを示します。これにより、ワードシンク非対応の機器からの信号でも音跳びせずに再生が可能です。

構成

DAI-FIFO基板

主要部品はDAI:CS8416、CPLD:Xilinx XC95288XL、4Mbit SRAM:、1チップマイコン:ATMEL ATtiny26L、水晶発振器:33.8688MHz、36.864MHzです。

DAI

CS8416はソフトウエアモードで動作させるため、1チップマイコンから制御します。

ソフトウエアモードでは入力が8チャネルあり、1チップマイコンの指示で1チャネルを選択します。

また、受信しているS/PDIF信号の周波数を識別するため、OCLKにCPLDから16.384MHzを入力して、32kHz〜96kHzまで識別可能としています。

電源電圧は3.3V単一です。

CPLD

XC95288XLは288マクロセルで144pinのCPLDです。

0000h〜0010hのレジスタを作り込んでおり、マイコンからの指示で8チャネルそれぞれでのワードクロック周波数、現在選択している出力モード(水晶発振器からの44.1kHz/48kHz/88.2kHz/96kHz、またはDAIからのクロック)、DAIのリセット、出力ミュートを設定します。

また、外部の水晶発振器からの33.8688MHz/36.864MHzを分周して44.1kHz/48kHz/88.2kHz/96kHzを生成し、レジスタ設定にしたがってワードシンク出力するとともにDACへの出力に使用します。

FIFO機能として、DAIからの出力データを内部でシリアル=パラレル変換してSRAMに書き込み、読み出してパラレル=シリアル変換を行いDACに送信します。 全エリアの半分だけ書き込まれた状態となるようにそれぞれのアドレスの初期値をずらして開始することで、FIFO動作を実現します。 なお、書き込みはDAIからのLRCKで行い、読み出しを現在選択している出力モードのクロックで行います。 アドレスのインクリメントはVHDLで+1するルーチンですが、片方がマクロ50セルくらいでロジック生成できています。 現在、コンパイルぎりぎりの規模となっていて、速度、最適化を容量優先にしても1〜2マクロセルの空きしか有りません。

電源電圧はコア、I/Oとも3.3Vです。

1チップマイコン

ATMEL ATtiny26Lを搭載しています。 性能、パッケージサイズ、入手性などを考慮して採用しました。

DAIとCPLDへの読み書きとリセット信号の送出、入力セレクタと設定ボタン2個のためのA/Dポートの読み込み、入力ポートのOptical/Coaxial切り替えのためのS/PDIF入力基板への信号送出、LCD表示のためのLCDパネルへの書き込みを行いますが、このICは20ピンで入出力に使用できるピンが限られているため、各機能のためのインタフェースは少し無理をして集約しています。

CPLDとDAIへのレジスタの読み書きは個別にすれば楽ですが、DAIをCPLD越しに接続して、CPLDへのレジスタの書き込みはDAIとの信号と集約します。 具体的には、DAIのインタフェースをSPI(クロックのCCLK、データのCDINとCDOUT、チップセレクトのCS)で使用し、CPLDへの書き込みはCPLD用のCSを設けてCCLK、CDOUTは共用します (CPLDからの読み込みは作り込んでいない)。

入力セレクタは8chありますが、平凡につなぐとマイコンのピンを8ピン消費してしまいます。 本機では1回路8接点のロータリースイッチの接点同士を順に抵抗で接続し、両端を5VとGNDに接続して、セレクトしたチャネルによってロータリースイッチの電圧が0Vから5Vまで段階的に見えるようにしています。これをマイコンのA/Dコンバータに接続してアナログ値を読み取ることで、マイコンのピン消費を1ピンに押さえています。

同じように、設定用の押しボタンスイッチ2個の読み取りも、スイッチ2個を抵抗でシリーズに接続して、A/Dコンバータでアナログ値を読み取ることでピン消費を1ピンに押さえています。

電源

+5Vを外部から供給し、1チップマイコンとLCDパネルに供給します。 また、3.3Vの三端子レギュレータで3.3Vを生成し、DAI、CPLD、SRAMに供給します。 水晶発振器には個別に電源端子を設けて、外部からの専用の電源供給による水晶発振器の出力クロックのノイズ低減と水晶発振器の部品変更を可能にします。

プリント基板

15cm×10cmの2層基板です。 CADツールはEAGLEを使用し、OLIMEXで製造してもらいました。 XC95288XLは0.5mmピッチQFPなのでパターンに苦労しましたが、なるべく信号は部品面、グランドと電源はハンダ面としています。 CPLDと1チップッマイコンはピン配置が有る程度自由に設定できるため、時間をかけて作り込めばパターンを交差させることなく実現できます。

基板画像

部品面 はんだ面

マイコン

プログラムソース

CPLD

FIFO24_CS8416.vhd : トップ
FIFO24_clk.vhd : クロック生成
FIFO24_spconv.vhd : シリアル=パラレル変換
FIFO24_psconv.vhd : パラレル=シリアル変換
FIFO24_adrct.vhd : FIFOバッファアドレス生成
fifo24_cs8416.ucf : ピン配置
test.vhd : テストベンチ

回路図

回路図 1ページ目 回路図 2ページ目 回路図 3ページ目 回路図 4ページ目 回路図 5ページ目 回路図 6ページ目 基板イメージ

DAC

DAIからのビットクロック(BCK)、フレームクロック(LRCK)、後詰め24bitのシリアルデータ(LRCkに対してBCKは64fs)をD/A変換します。 本基板は1ch分のD/Aしか行いませんので、本機では2枚使用します。

まず、デジタルアイソレータのADuM1300で、DAIとのアイソレーションを行い、その後CPLDでシリアル=パラレル変換、R=2Rラダー型DACでD/A変換を行います。 アナログ出力はカップリングコンデンサでDCカットします。 なお、本機ではオーバーサンプリングは行いません。また、ローパスフィルタも搭載しません。

CPLD

Xilinx XC9572XLを採用しました。 CDプレーヤー2号機ではFIFO機能のためにXC9572を使用しましたが、5V品のため消費電力が大きく発熱もあったため、本機では3.3V品を使用しました。 XC9572XLでは発熱はほとんどしていません。

このCPLDでは、24bitのシリアル=パラレル変換とラッチを行います。 これだけでは72マクロセルも使用しませんので、以下の機能を搭載しました。

  1. Lchの場合は32クロック遅らせて、LchとRchの出力の変化点を同期化します。 スピーカーで再生する場合はスピーカー設置の前後位置が左右で4mm程度ずれることに該当し問題になりませんが、ヘッドホンで使用した場合に問題になるかもしれませんので対応してみました。
  2. ゼロクロス歪の調整パターン生成回路を盛り込みました。 R=2Rラダー型DACに、0x7fffffと0x800000のパターンを交互に出力します。 これまで私が作成したR=2Rラダー型DACでは、上記パターンを収録したCDを再生して調整していましたが、本機では単体で調整可能となります。

Lch/Rchの選択、テストパターン出力のモード設定は、それぞれショートジャンパの設定で可能です。

R=2Rラダー型DAC

CPLDからのパラレル出力を、バッファで受けて、抵抗を並べて作ったR=2Rラダー型DACでD/A変換します。 バッファは、CPLDの出力が3.3VTTLなので、HCTファミリを採用してCMOSレベルで出力し、アナログ出力のゲインを稼ぎます。 74HCT541を採用したかったのですが、秋葉原の鈴商と千石電子通商で見当たらなかったため、74HCT245を採用しました。

抵抗は、10kΩと20kΩの組み合わせとしました。 また、10kΩは20kオームの抵抗をパラレルにして、誤差が小さくなることを期待してみましたが、あまり意味が無いとは思います。

カップリングコンデンサは、日米商事で安売りしている10V 100uFの普通の電解コンデンサを使用しています。 特に変な音はしていません。

電源

外部から+5Vを供給してもらい、74HCT245にはそのまま供給します。 XC9572XLには、3.3V用の三端子レギュレータで3.3Vを生成して供給します。

プリント基板

紙フェノールの片面基板にエッチングして作成しました。 サイズは150mm×100mmです。 CPLDのピン配置を調整して、なるべくジャンパ線が少なくなるようにしています。

基板画像

概観 部品面 はんだ面

CPLD

DAC_24.vhd : ソース
DAC_24.ucf : ピン配置
test.vhd : テストベンチ

回路図

回路図 1ページ目 回路図 2ページ目 基板イメージ

S/PDIF_SEL

DAI=FIFO基板からの指示に従って、光入力と同軸入力を選択します。 一枚の基板で4系統の入力を備えており、本機では2枚搭載して8系統の入力を持ちます。

光入力は受光モジュールにTORX-179、同軸入力は74HCU04の2段バッファでTTL入力レベルを満たして、Xilinx XC9572で構成したセレクタに入力します。

基板画像

概観

CPLD

spdif_sel.vhd : ソース
spdif_sel.ucf : ピン配置

回路図

回路図 1ページ目 回路図 2ページ目 回路図 3ページ目 基板イメージ

デジタル制御ボリューム

PGA2310と1チップマイコン ATMEL ATtiny26Lでデジタル制御ボリュームを構成しています。 構成はこれと同じですが、リレーを搭載して電源OFF時のノイズをミュートしています。

基板画像

デジタル制御ボリューム基板 概観 電源基板 概観

回路図

回路図 1ページ目 基板イメージ

電源

スイッチング電源を1個とトランスを5個使用しています。

DAI=FIFO基板のデジタル部分とS/PDIF基板へは、5V3Aのスイッチング電源モジュールから供給しています。画像右側中段の黒いものです。

33.8688MHzと36.864MHzの水晶発振器へは、100V=9Vトランスの出力を整流して、それぞれ個別の三端子レギュレータから供給しています。

DAC基板へは、LchとRchでそれぞれ個別の100V=9Vトランスの出力を整流して供給しています。

デジタル制御ボリュームには、100V=9Vトランスの出力を整流したデジタル用の5Vと、100V=15V-0-15Vトランスを整流したアナログ用の±15Vを供給しています。

問題点

現状、以下の問題点があります。

  1. 入力セレクタを切り替えた場合や、S/PDIF信号の送信元の装置の出力が途切れて再開した場合などに、FIFOバッファの書き込みが停止して正常に再生できなくなることがあります。 現在の構成では、FIFOバッファの書き込みクロックはDAIからのビットクロッククロックですので、これが途切れるとCPLDの回路が異常動作となるためと考えています。 とりあえず、入力セレクタでチャネルを切り替える毎にCPLDにリセットをかける暫定対処をしているので、異常時には入力セレクタでいったん別チャネルに切り替えて戻すことで実用上あまり不便ではありません。ただし、現在使用しているHDDレコーダー 東芝RD-X3で操作をすると本現象が結構な確率で発生してしまいます。
  2. 接続する機器によっては、同軸での入力が正常に受信できません。 その場合には光ケーブルで接続すれば問題ないため、これも実用上問題はありません。
  3. それなりに発熱が大きいようで、動作中にケースの蓋を開けると、熱がこもっているのがわかります。 ただし、常時通電していても一夏越せたので、許容範囲かな、と思っています。

さいごに

現在、CDプレーヤー、HDDレコーダー、LDプレーヤー、PlayStation2、M-audio FireWire1814(PC接続)の5装置を接続しており、チャネルセレクタとボリューム調整を本機で行ってパワーアンプに接続してますので、シンプルな構成となりました。

音質は、これまで作成したノンオーバーサンプリングのR=2Rラダー型DACと同じ傾向で、余計な色付けの無い素直な、悪く言うと味も素っ気も無い音ですが、電源の強化、FIFOバッファを深くしたこと、DACをLchとRchでセパレートにしたことからか、刺激的な成分の少ない落ち着いた音がしています。

回路規模も大きく複雑ですので、あまりお勧めできる装置ではありませんが、当初の目標はすべて達成できたので満足しています。

2007/7/1追記

いろいろ変更しました。この変更で、常用機に復活しています。


2005/9/7