Article #239

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.

BSVの設計トライアル (6)

posted by sakurai on April 14, 2020 #239

サウンドFSMの完成

ミキサーは4chある音源のミキシングを行います。ミキシングは符号無し8bit整数を16bitに符号拡張し、加算することで行います。サウンド平均化を試しましたが、かえって違和感が出るため、シンプルな加算としました。念のためにクリッピング処理を入れています。

完成したsound階層を図239.1に示します。

図%%.1
図239.1 Vivado sound階層ブロック図

従来回路図234.2と比べてサウンドチャネルが4倍になっただけでなく、ミキサー回路を新設したため、かなり大きくなっています。表239.1に各モジュールの物量(LUT数)を示します。LUTは使用個数は4,216個であり、全容量70,560個中の5.98%でした。またBRAMは使用個数は39.5であり、全容量216中の18.3%でした。

ゲーム全体の各モジュールの物量を表239.1に示します。色付け部分が今回BSVで開発したモジュールです。

表239.1 各モジュールの物量
モジュール 説明 物量 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に全体のセルの配置図を示します。

図%%.2
図239.2 Vivadoセル配置図

例外動作

基本的に、サウンドエンジンはサウンド番号を受け、ROMに示されるサウンド長だけサウンドを演奏し、サウンド中に割込みが入る場合にはその割込みサウンドを演奏しますが、例外が2つあります。

  • UFO飛行音 --- UFO飛行音ONでサウンドを演奏し、終了してもUFO飛行音OFFが来るまでは演奏し続ける。
  • 自機増加音 --- 自機増加音演奏中に割込みが入ると聞こえなくなる場合がある。このため、自機増加音は優先サウンドとして扱い、他の割込みを受け付けない。

自機増加音は自弾発射音、自機爆発音と独立であるため、別チャネルとするほうが良いのですが、頻度が低いのと別チャネルにするとハードウエアが無駄のため、このような仕様としました。実験の結果、優先サウンドとしてもゲーム上特に問題はありませんでした。


左矢前のブログ 次のブログ右矢

Leave a Comment

Your email address will not be published.

You may use Markdown syntax. If you include an ad such as http://, it will be invalidated by our AI system.

Please enter the numbers as they are shown in the image above.