雑誌付録で作る音源チップ[Chimera]
Attention: Sorry,this text is Japanese Only.
更新:2005.05.14
最後のネタか? FM音源?+ファミコン音源?+PCM?+アナログ?のへんなやつ
DesignWave誌2005年1月号の付録のFPGAで音源チップを作ってみました。
内蔵メモリと積算器付きの贅沢な付録、回路規模は余裕かと思いきや、そうでもないもんですね。
ただ単に無駄な部分が多いだけかもしれませんが、素人工作なんでご容赦ください。
1.音源チップChimera
思いつく機能を詰め込めるだけ詰め込みました。本当はMIDI制御部やVCFも入れたいけど回路規模的に無理なので、MIDI制御部は手持ちの
H8Tinyボードで、VCFは外部回路で補います。
MIDI制御は、モノフォニックなら回路でやるのも簡単そうですが、ポリフォニックになると格段に規模が大きくなるはずです。
FPGA内にCPUコアを組み込む手もありますが、現状H8Tinyで1VCOポリフォニックドライバを実装するのにROM5.6K,RAM1K(スタッ
ク除
く)を使用しているため、FPGA内部だけではメモリが全然足りません。
各機能の組み合わせ、ルーティングは自由度が高く、レジスタで設定できるようにしているため、特定の音源方式固定でなくH8側のMIDIドライバープログ
ラムしだいで、2OP FMにも4OP FMにも、アナログシンセっぽくも出来ます。ただしその分ドライバープログラムが複雑になります。
ちなみに名前は色々な音源方式の寄せあつめなのでキメラ[Chimera]と決めました。
1.1 基本機能
- FPGA Xilinx Spartan3 XC3S50
Synthesis Report
Selected Device : 3s50vq100-4
Number of
Slices:
588 out of 768 76%
Number of Slice Flip
Flops:
394 out of 1536 25%
Number of 4 input
LUTs:
931 out of 1536 60%
Number of bonded
IOBs:
12 out of 63 19%
Number of
BRAMs:
4 out of 4 100%
Number of
MULT18X18s:
2 out of 4
50%
Number of
GCLKs:
2 out of 8
25%
Number of
DCMs:
1 out of 2 50%
BRAMは、位相とEGの内部状態と、波形メモリ(Sin,Waveテーブル、擬似ノイズ)3本に使用。
たいしたことしてないはずなのにSliceの使用量が結構多いです。
- 32スロットのOSC
- スロット毎に独立のADSR型のEG
- 音源波形
- 矩形波(duty比
127/256,111/256,95/256,79/256,63/256,31/256,47/256,31/256,15/256の8タイプ)
- ノコギリ波
- 三角波
- Sin波(1K ROM)
- WAVEテーブル(1K RAM)
- ノイズ(18bit M系列)
- 擬似ノイズ(1K ROM)
- 前後するスロットとのリング変調、FM変調。トレモロは+1.0のオフセットした波形とリング変調で実装。
- 入力信号:2線式シリアル(H8/3664の2線クロック同期シリアル仕様にあわせたクロック同期シリアルフォーマット)
- 出力信号:3線式シリアル(入手できたDAC MAX541の仕様にあわせたクロック同期シリアルフォーマット)
- 出力波形:16bit サンプリングレート48.8KHz
- 外部VCF(スイッチトキャパシタフィルタ)用クロック出力
1.2 構成図

レジスタ以外のブロックは1スロット分の回路しかありません。25MHz16クロックで1スロット分の処理を行い、時分割でサンプリングレート
48.8KHzの周期間に32スロット分の処理を0番スロットから順に行いMOD_MIX内で加算ミキシングしています。そのため各レジスタや内部状態を
保存するRAMは32
スロット分の情報を保持しています。
位相や波形、エンベロープのバス幅は18bitで、波形とエンベロープはS1.16の符号付固定小数点で処理しています。
1.3 ソースコード
VHDLソース:SPARTAN3のプリミティブを積極的に使用してま
す。
- Chimera.vhd チップのトップエンティティ おもに各モジュール間の接続を記述
- EG.vhd EGのシーケンス回路
- OSC.vhd 位相生成回路(VCO)
- WAVE_GEN.vhd 位相より波形生成回路(VCO)
- MUL_MIX.vhd エンベロープ、ボリューム、波形を積算する回路(VCA)
- MOD_MIX.vhd 変調と信号のルーティング、各スロットのミックス回路
- Ctr.vhd ステート制御回路
- NOISE.vhd ノイズ生成回路
- shift_out.vhd DACインターフェース用クロック同期送信回路
- Shift_In.vhd CPUインターフェース用クロック同期受信回路
- SCF_OSC.vhd VCF用クロック生成回路
- RAM32xnD.vhd レジスタ用分散RAM、プリミティブは1bit*16なのでそれを使いやすいようにとりまとめてます
1.4 MOD_MIXの構造

このモジュールのルーティングにより、リングモジュレーションやFM、LFOを実現します。
ラッチ0からラッチ1への転送は、入力が確定するサイクルの後になります。それまではラッチ0に前のスロットのデータが入っていることになるため、ゲート
が開いていれば、前のスロットの値がカレントのスロットの位相速度に加算されます。
またこのモジュールの最終段のミキシングラッチは、サンプリングレート毎にクリアされ、各スロットの総和を計算することで各スロットのミキシングの動作を
しています。
各アルゴリズムの実現方法
- リングモジュレーション:
OFFSETをOFF(0.0)にし、ラッチ1とラッチ0をそのまま掛け算します。
- トレモロ効果:
OFFSETをON(+1.0)にしラッチ0*(ラッチ1+1.0)を出力します。このときラッチ1がLFO発振の値となるようにします。
- FM(縦続接続):
カスケード選択をONにします。前のスロットがモジュレータ、カレントのスロットがキャリアとなります。4OP
FMを作りたい場合は3つのスロットを連続でカスケード選択ONとすることで実現できます。
- FM(並列接続):
単純に連続するスロットをそのまま出力すれば、ミキサーで加算されるのでFM音源の並列接続と等価になります。
複数の連続するスロットをドライバーソフトでうまく組み合わせれば、リングモジュレーション付きFMやトレモロ付きの4OP
FM等も構成可能となります。
1.5 制御レジスタ
制御レジスタへは、アドレス8bit、データ16bitの順で2線式クロック同期シリアルにて書き込みます。
発音スロットのパラメータレジスタは00h-9Fhまでで、00h-7Fhまでは2h毎に、制御レジスタの80h-9Fhは1h毎に1発音スロットのレジ
スタが割り当ててあります。
レジスタマップ
アドレス(HEX)
|
奇数アドレス
|
偶数アドレス
|
上位8bit
|
下位8bit
|
上位8bit
|
下位8bit
|
FF
C0
|
WaveTable
|
B0
|
|
|
|
WaveTableBank
|
A0
|
フィルタ周波数1
|
フィルタ周波数0
|
80
|
制御レジスタ
|
60
|
音量レベル
|
発音周波数
|
40
|
20
|
アタックレート
|
ディケイレート
|
サスティンレベル
|
リリースレート
|
00
|
- アタックレベル(AR)
8bit(0-FFh)で設定し、5.37/AR 秒でアタック最大音量に立ち上がる。
- ディケイレート(DR)
8bit(0-FFh)で設定し、((255-SL)/255*5.37/DR) 秒でサスティンに移行する。
- サスティンレベル(SL)
8bit(0-FFh)で設定し、アタック最大音量時のSL/255 倍の電圧をサスティン時に出力する。
- リリースレート(RR)
8bit(0-FFh)で設定し、SL*5.37/RR 秒で音量0になる。
- 音量レベル(V)
16bit(0000-FFFFh)で設定 電圧レベルなのでドライバーソフト側で音量レベル(dB)との変換が必要。
- 発音周波数(W)
16bit(0000-FFFFh)で設定 発振周波数Fは F=fs/(65536*4/W) Hz
ここでfsはサンプリングレートでfs=25MHz/(16*32)=48.8KHz
- 制御レジスタ
Key-OnOffとMOD_MIX内部のルーティングを制御するレジスタです。
15(MSB)
|
14
|
13
|
12
|
11
|
10
|
9
|
8
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0(LSB)
|
SOUND ON/OFF
|
KEY ON/OFF
|
NC
|
NC
|
波形選択
|
モジュレー
ション選択
|
カスケードON/OFF
|
OFFSET ON/OFF
|
次段選択
|
NC
|
NC
|
NC
|
- SOUND ON/OFF:
音声出力のON(1),OFF(0) OFFのときはKEYをONにしても発音はしない。
- KEY ON/OFF:
鍵盤のON(1),OFF(0) OFFからONになるとEGがアタックの状態を開始する。
- 波形選択:
発音波形を選択する。
値
|
波形
|
値
|
波形
|
0000
|
Duty比 127/256の矩形波
|
1000
|
ノコギリ波
|
0001
|
Duty比 111/256の矩形波
|
1001
|
三角波
|
0010
|
Duty比 95/256の矩形波 |
1010
|
Sin波(ROM)
|
0011
|
Duty比 79/256の矩形波 |
1011
|
18bitノイズ(M系列)
|
0100
|
Duty比 63/256の矩形波 |
1100
|
波形テーブル(RAM,初期値 Sin波)
|
0101
|
Duty比 47/256の矩形波 |
1101
|
1024ステップ擬似ノイズ(ROM)
|
0110
|
Duty比 31/256の矩形波 |
1110
|
定数 +1.0
|
0111
|
Duty比 15/256の矩形波 |
1111
|
定数 -1.0
|
- モジュレーション選択:
ミキサーに送る出力をモジュレーション/スルー/無出力から選択する。
値
|
出力
|
00
|
スルー:カレントのスロット出力値をそのまま出力
|
01
|
リング変調:前のスロット出力値との掛け算を出力
|
10
|
0.0(無出力)
|
11
|
0.0(無出力)
|
- カスケードOn(1)/Off(0):
前のスロットの出力値を、カレントのスロット値の位相スピードに加算するか、つまりFM変調するかを決定する。
- OFFSET On(1)/Off(0):
リング変調の際、前のスロットの出力値に+1.0をオフセットするかを決定する。前のスロットの周波数が低ければ、Onにしてリング変調するとトレモロの
効
果が得られる。
- 次段選択:
次のスロットに影響させる値は、スルー(0)かリング変調後(1)かを決定する。
- フィルタ周波数(FC)
外部のスイッチトキャパシタフィルタに与える周波数を決定するレジスタ
16bit(0000-FFFFh)で設定 カットオフ周波数 fc=25MHz*4/FC/100 Hz
フィルタ0は通常のLPF、フィルタ1はフィードバックHPF。詳細は2.2参照
- WaveTable
任意の波形を音源波形として波形RAMに設定します。
波形1Kワードですが、レジスタ空間が64ワードしか空きが無いので、バンク方式でアクセスします。
C0h-FFhが00h-3Fhとして波形RAM書き込みアドレスの下位6bit
となります。
- WaveTableBank
下位4bitがそのまま波形RAM書き込みアドレスの上位4bitとなります。
2.ボード
通常アナログシンセは、発音毎にVCAの前にVCFをかけるようですが、リソース不足でFPGA内にデジタルフィルタが実装できない都合上、DACの後段
にアナログ回路でVCFをいれました。なの
で、全発音がミックスされたものにVCFをかけるので、VCFというよりはエフェクタの一つと思ってください。
2.1 回路図
準備中
2.2 フィルタ
MF10はスイッチトキャパシタ型の2次フィルターが2つ入ったICです。スイッチトキャパシタ型フィルタは、入力するクロック周波数でカットオフ周波数
(fc)が制御できるので、FPGAやマイコンなどのデジタル回路で制御するのに便利です。
フィルター部はこのICを用いて、AL=1.0,QL=1.0のLPF(フィルタ0)出力をAH=0.99,QH=1.0
のHPF(フィルタ1)で帰還させる回路を構成しています。
理論上トータルゲインはA=AL/(1-ALAH)となりfcLと
fcHが近いときに、フィードバックゲインが支配的になりレゾナンスのよう
な効果が得られるはずです。
検証しました。結論、レゾナンスは無理っぽい。フィードバックさせるとAHを下げても、位相補償コンデンサをいれても発振が止まり
ませんでした。またMF10を実装したとたんクロックのノイズ混入し、ノイズが酷くなりました。
結局、フィードバックはあきらめ2次ローパスのみで使用することにしました。
3.ドライバー
H8/3664のMIDIドライバープログラムです。開発環境はCygwinのGccです。
3.1 シンプル 1VCO型
32音同時発音、ポリフォニック マルチティンバ:ソースコード
演奏サンプル:Chimera 1VCO FC風:Ave
Maria by Schubert[458K mp3]
3.2 2VCO型
16音同時発音、ポリフォニック マルチティンバ:ソースコード
発音サンプル:FM2OP 縦続接続
発音サンプル:FM2OP 並列接続
発音サンプル:リングモジュレーション
発音サンプル:1VCO+トレモロ
This page's Copyright (c) 2005 Sam
sam_kb@yahoo.co.jp