PSG_on_TTL」カテゴリーアーカイブ

USB-to-PSG インタフェース基板 rev.2

前回は AVR の VUSB で USB-PSG インタフェースを製作しましたが、速度的に問題がありました。
VUSB は USB Low Speed のみ対応していますが、規格上 LS のビットレートは最大 1.5Mbps なので、MIDI (31.25 kbps)程度の速度なら十分のように思っていました。
しかしながら、USB LS は バルク転送やアイソクロナス転送に対応しておらず、インタラプト転送で信号を送らなければいけません。
私の使用している Windows だとインタラプト転送のインターバルは最短 8ms、転送は最大 8 バイト(VUSB の仕様)なので、6バイト (2 MIDI メッセージ) / 8ms と考えると、実効ビットレートはわずか 6kbps しかありません。

Dscf0832

そういうわけで、USB2.0 に対応した PIC18F14K50 を使って、USB-PSG インタフェースを作り直しました。
(秋月ではいつの間にか 170 円から 210 円に値上がりしていますね…)
外観は前回とほとんど変わりませんが、ピン数の関係で SIPO SREG の 74HC164 を追加しています。

usb-to-psg_schematics_2
USB-PSG rev.2 回路図

ファームウェア

PIC の場合、Microchip Library for Applications (MLA) に含まれる USB サンプルをもとに USB デバイスを実装するのが便利です。
今回は「audio_midi」サンプルをベースに 仮想 USB デバイスを実装しています。
VID/PID とかデバイスディスクリプタは適宜書き換える必要があります。
今回はあくまで TTL-PSG のテスト用ということで、サンプルのままにしています。

USB2.0 のバルク転送だけあって、転送は USB LS のものよりはるかに高速になります。
これで、PC から PSG 音源のまともな演奏ができるようになりました。

USB-to-PSG インタフェース基板

Dscf0808

写真は TTL-PSG のテスト用に製作したインタフェース基板です。
AVR マイコンを USB デバイスとして動かす V-USB をベースにして、USB オーディオクラス(MIDI Out のみ)を実装しています。
Martin さんの V-USB-MIDI プロジェクトを実装のベースにしています。

usb-to-psg_schematics
回路図

ファームウェア(ベータ版)

TTL-PSG のために作ったものですが、もちろん本物の AY-3-8910 に繋いでも動くはずです。一応両方の接続図を回路図に入れています。
回路図左下はディジタルディレイで、本基板とは直接関係ありません。

実装している機能は以下の通り:
・矩形波 3ch: MIDI Port 0-2 に対応
・ノイズ ch: MIDI Port 9 (矩形波 C に mix)
・音量: 矩形波 ch はエクスプレッション、ノイズ ch はベロシティ
・ピッチベンド (±24 半音)
・エンベロープ: プログラムチェンジ、モジュレーション、リバーブで設定

sequenser

上図のように、Class-complient なので一般的な MIDI シーケンサを使って PSG 音源を動かすことができます。
一通り実装したのですが、今のところエクスプレッション変化などデータ量が多いと破綻してしまいます。
すこし改良が必要です。

TTL で PSG 音源を作る その4

さて重要なのは DAC の設計です。

AY-3-8910 は各 ch 内部 4bit の表現を持ちますが、その出力 DAC は対数出力となっています。
dac_output

対数出力ということは、ストレートに R-2R ラダーは使えません。
簡単に思いつく構成は以下の3 つ:

(1) 対数型 DAC を組む
(2) 74154 + 抵抗 16 個
(3) ディジタルで linear-log 変換をした後バイナリ DAC

独立 3ch 分の DAC を組まなければならないため、今回は一番構成部品の少ない (1) の構成で設計します。

ただし、(1) は「TTLで作る…」と銘打っておきながら CMOS IC を使うことになるので、TTL 縛りが重要なら (2) を採用することになります。オリジナルの IC は MOS によりますが・・・。

dac

設計した DAC の回路図を示します。CMOS のアナログスイッチ 4053B は都合良く 3 回路入りなので、3ch の 4 bit DAC が わずか 4 個の IC で構成できます。

対数の底については、データシートの図表から LSB が -3dB (sqrt(1/2) 倍) になるように回路定数を設定しています。この定数が妥当かどうかはわかりません。出力インピーダンスは 47k となりますが、これは手持ちの抵抗値によって定数を適当に設定した結果です。

TTL で PSG 音源を作る その3

すこし間が空いてしまいました。
設計と同時に実装を進めていますが、果たして基板2枚で収まるでしょうか。

Dscf0793

今回はノイズジェネレータ部分の設計です。
AY-3-8910 は1 系統のノイズジェネレータを搭載しており、前段のプログラマブルプリスケーラで周波数を調整できるようになっています。
ノイズ音の ON/OFF は、後段のミキサで 3ch 矩形波の任意の ch に合成することでコントロールされます。
音量は矩形波 ch で設定された音量と共通のようです。

noisegen_1

基本的に、ホワイトノイズを生成する回路は、シフトレジスタカウンタ(文献によっては線形カウンタと称する)により構成すると簡単です。
SIPO シフトレジスタの 74LS164 と XOR 74LS86 で作った回路が上図、出力波形が下図です。

noise_wave_1

オリジナルの modulo はデータシートに載っていないので、
回路の簡単な modulo 2^15-1 としています。
あとで調整が必要になるかもしれません。

TTL で PSG 音源を作る その2

今回は矩形波生成ブロックを設計します。

AY-3-8910 の矩形波生成ブロックは、12bit の分周比 N によって クロックを分周させ、さらに 1/16 のプリスケーラと組み合わせることで、fck/16/N の周波数を生成します。
・・・とデータシートに書かれているのですが、出力のデューティー比は 50% にするため、回路上は 1/8 のプリスケーラと 1/2 のポストスケーラによって構成されているものと思います。

PSG 音源にはデューティー比を可変する機能はないので、これは単なる 1/N 分周器(プログラマブル分周器)によって構成できます。

プログラマブル分周器はいろいろな回路が考えられますが、
TTL IC を組み合わせて作るので、部品点数、在庫、価格など
いろいろ考えて設計しなければいけません。

divider_1

上図は 74LS161 を使用した完全同期式のプログラマブル分周器で、プリセットに N の論理反転を入力することで、1/(N+1) 分周器として働きます。
(上図ではデューティー 50% にするため、さらに 1/2 していますが。)
161 は 4bit カウンタなので、8bit や 12bit で動作させる場合、複数個組み合わせて使用します。
上図のように CO 端子から出力を取ろうとすると、複数個組み合わせた場合ひげが出てしまうので、一度元のクロックで同期してやる必要があります。

divider_2

74LS197 のような、安価な非同期式のカウンタで構成した例が上図です。74LS197 にはキャリー出力がないので、MSB の立下りエッジでカウンタをロードしています。ロードは非同期なので、出力周波数はひとつ上の回路と同様になります。

今回は 1/(N+1) ではなく 1/N の分周器を作る必要があります。上記回路では、論理反転のほかに算術 -1 する回路を追加せねばならず、不適です。

divider_3

1/N カウンタの実現方法のひとつは、ダウンカウンタを使用することです。74LS191 を使用した 1/N 分周器を上図に示します。74LS193 でも同様です。この回路でも動くと思いますが、MSB のCO 出力はマルチバイブレータ等でパルス拡張した方がベターでしょう。

divider_4

もう一つの構成として、ディジタルコンパレータを使用する回路が考えられます。上記は 74HC4040 によるリプルカウンタの出力を 74LS688 によるコンパレータで比較して、一致でカウンタにリセットをかけています。リセットは非同期なので、結果として出力周波数は 1/N となります。
コンパレータが比較的高価で、配線数も多くなるのでこの方式はあまり採用されませんが、今回は手持ち部品の都合上、この回路をベースに設計します。

square_1

そういうわけで、矩形波生成ブロックは上図のような回路になりました。AY-3-8910 には 3 系統の矩形波ブロックが存在するので、上記回路を3つ作ることになります。

TTL で PSG 音源を作る その1

AY-3-8910_ds

今回からしばらく、74 シリーズの TTL 汎用ロジック IC を使って PSG 音源を作ってみようと思います。
動作や仕様はオリジナルの PSG 音源、つまり GI 社 AY-3-8910  と同等に動くことを目標とします。
もちろんデータシートをもとにして、回路は新規に設計することになります。
全体で TTL IC 100 個くらいあれば構成可能と予想しています。

bus_if_1

まずは、バスインタフェース部分から設計します。
AY-3-8910 は 16 個のレジスタを持ち、8bit IO によるパラレルインタフェースを使用してアクセスします。
アドレスは IO にマルチプレクスされており、レジスタライト、リード、アドレスラッチは 3 本の信号線により行います。

bus_if_2

信号線はすこし特殊で、GI の CP1610 マイコンのインタフェースになっています。
すなわち、BDIR、BC2、BC1 の 3 本の信号線の組み合わせにより、上表のようにレジスタライト、リード、アドレスラッチが選択されます。
内部的に必要な WR, RD, ALE 信号は、74LS138  と 74LS10 により取り出すことにします。

AY-3-8910 は 16 個のレジスタを持つので、4bit のアドレスを占有します。
アドレスの上位 bit (ラッチされる 8bit の他に、外部から上位 2bit を与えることができる) に 0 をセットすると、IC へのレジスタアクセスが有効になります。
この仕様は複数個の IC をバスに接続する場合やや不便ですが、データシートによると、アドレス上位 bit は IC の注文時に書き換えることができたようです。

というわけで、バスインタフェースは以下のような回路になります。

bus_if_3 bus_if_4

また、8bit のレジスタは以下のような回路でよいでしょう。
(場合によって 244 は 373 にすべき)
ただし、いまどきの IC でコントロールするならレジスタの Read しないでしょうから、製作では配線を減らすために IO レジスタ以外の Read を省くことにします。

bus_if_5