14 |
BSVの設計トライアル (6) |
サウンドFSMの完成
ミキサーは4chある音源のミキシングを行います。ミキシングは符号無し8bit整数を16bitに符号拡張し、加算することで行います。サウンド平均化を試しましたが、かえって違和感が出るため、シンプルな加算としました。念のためにクリッピング処理を入れています。
完成したsound階層を図239.1に示します。
従来回路図234.2と比べてサウンドチャネルが4倍になっただけでなく、ミキサー回路を新設したため、かなり大きくなっています。表239.1に各モジュールの物量(LUT数)を示します。LUTは使用個数は4,216個であり、全容量70,560個中の5.98%でした。またBRAMは使用個数は39.5であり、全容量216中の18.3%でした。
ゲーム全体の各モジュールの物量を表239.1に示します。色付け部分が今回BSVで開発したモジュールです。
モジュール | 説明 | 物量 | BSV行数 | Verilog行数 | ||
---|---|---|---|---|---|---|
LUT数 | LUT割合[%] | BRAM数 | ||||
invader_move | 自機、インベーダ、UFO、自弾、敵弾、スコア等を処理するFSM | 3,239 | 76.7 | 0.0 | ー | 2,125 |
mkSoundFSM3 | UFO音を演奏するFSM | 197 | 4.7 | 0.0 | 448 | 939 |
mkSoundFSM2 | インベーダ歩行音を演奏するFSM | 192 | 4.6 | 0.0 | 950 | |
mkSoundFSM1 | インベーダ爆発音を演奏するFSM | 190 | 4.4 | 0.0 | 922 | |
mkSoundFSM0 | 自弾発射音、自機爆発音、自機増加音を演奏するFSM | 184 | 4.7 | 0.0 | 957 | |
mixer | 4チャネルのサウンドミキサー | 44 | 1.0 | 0.0 | ー | 30 |
graphic_control | VGA映像信号生成回路 | 38 | 0.9 | 0.0 | ー | 92 |
para_seri | サウンドパラシリ変換、タイミング生成回路 | 22 | 0.5 | 0.0 | ー | 101 |
sound_rom0 | 自弾発射音、自機爆発音、自機増加音を格納するROM | 20 | 0.5 | 7.0 | IP | |
sound_rom1 | インベーダ爆発音を格納するROM | 20 | 0.5 | 7.0 | IP | |
sound_rom2 | インベーダ歩行音を格納するROM | 20 | 0.5 | 7.0 | IP | |
sound_rom3 | UFO音を格納するROM | 20 | 0.5 | 7.0 | IP | |
pattern_rom | 自機、インベーダ、UFO、自弾、敵弾、スコア等の図形を格納するROM | 7 | 0.2 | 3.5 | IP | |
buttons | スイッチとボタンをORする回路 | 4 | 0.1 | 0.0 | ー | 21 |
display_out | ブランキング期間に表示を抑止する回路 | 3 | 0.1 | 0.0 | ー | 21 |
vram | ビデオRAM | 2 | 0.0 | 8.0 | IP | |
onestage | ゲームFSMとサウンドFSMの間のバッファ | 2 | 0.0 | 0.0 | ー | 43 |
clk_wiz | クロック制御回路 | 1 | 0.0 | 0.0 | IP |
図239.2に全体のセルの配置図を示します。
例外動作
基本的に、サウンドエンジンはサウンド番号を受け、ROMに示されるサウンド長だけサウンドを演奏し、サウンド中に割込みが入る場合にはその割込みサウンドを演奏しますが、例外が2つあります。
- UFO飛行音 --- UFO飛行音ONでサウンドを演奏し、終了してもUFO飛行音OFFが来るまでは演奏し続ける。
- 自機増加音 --- 自機増加音演奏中に割込みが入ると聞こえなくなる場合がある。このため、自機増加音は優先サウンドとして扱い、他の割込みを受け付けない。
自機増加音は自弾発射音、自機爆発音と独立であるため、別チャネルとするほうが良いのですが、頻度が低いのと別チャネルにするとハードウエアが無駄のため、このような仕様としました。実験の結果、優先サウンドとしてもゲーム上特に問題はありませんでした。