Posts Tagged with "Design"

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

破裂音原因解析

シミュレーション波形を確認すると、アナログ波形がなんだか尖っています。アナログとデジタルの一致性が必要で、そのためにはサンプリング周波数の1/2以上の周波数をカットする必要があります(標本化定理)。

図77.1
図77.1 シミュレーション波形

周波数帯域を制限するには22.05KHz以上をカットするロウパスフィルターを入れる必要がありますが、まずDACチップのデータシートの参考回路図を確認します。

図77.2
図77.2 DACデータシート

図77.2のとおり、アナログ出力にRとCで構成されるロウパスフィルターが入っています。

次にそれがどのように実装されているかを、PMOD DACモジュールのデータシートで確認します。

図77.3
図77.3 PMOD DACモジュールデータシート

出力のロウパスフィルターが入っていないことがわかりました。 サンプリング周波数は44.1[KHz]であったので、ロウパスフィルターの時定数を決定します。 図77.2にCを求める式が書かれており、 $$ C=\frac{50+470}{4\pi\cdot 44.1\cdot 10^3\cdot 50\cdot 470}=40[nF]=0.04[\mu F] $$ となることから、アナログ出力に40nFのキャパシタ(0.04$\mu$Fのセラコン等)を挿入すれば良いことになります。


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

posted by sakurai on December 20, 2018 #76

データ変換

ROMに入れるデータをVivadoで読めるCOEフォーマットに変換します。以下はwaveの16進ダンプファイルをCOEのデータ部に変換するコマンドです。これにヘッダとトレーラを付ける修正を行いROMデータとします。

$ od -An -t x1 -v input.wav >output.coe

シミュレーション

詳細設計に基づきシミュレーションを実施し、波形を確認し、不具合を修正するというループに入ります。 Vivadoはアナログ波形も表示可能であり、シミュレーションでアナログ波形を確認します。

もちろん全体だけでなく、細かいクロック毎の動きを見ていきます。ステートマシンが期待通りのステート遷移をしているか、LRCLKとシリアルビットデータの並びはDAC仕様に合っているかなどを見ていきます。

図76.1
図76.1 シミュレーション波形

実験

FPGAにビットファイルをダウンロードし、実験します。STARTスイッチを押すと、それなりの音が出ますが、元のファイルをPCで再生した音と若干異なるようです。なにか破裂音が混ざっています。元の音はインベーダが破壊された時の音なので、破裂音が混ざっていても構いませんが、もし音楽だったら聴くに堪えないでしょう。


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

posted by sakurai on December 10, 2018 #75

設計指針

設計指針を記述していきます。

  • サウンドデータはwaveフォーマットでROMに8bit単位で格納する。フォーマットは非圧縮PCM、8bit、モノラル、11.025KHzサンプリング
  • FSMはFSMCLKで動作する。FSMCLK=176.4KHz(=1/8*SCK)。
  • 8bitサウンドデータの読み出しは、FSMからアドレスを与えることで行う。
  • FSMから並列直列変換(以降パラシリ)にROMデータを供給する。
  • パラシリでは8bitデータをDACの要求する16bitデータに伸長する。具体的にはROMデータを上部8bitに詰め、下部8bitはゼロを詰める。
  • パラシリのシフトはSCK(=BCLK)で行う。SCK=1.4112MHz。ただし、これを出力しなければ自動的にDACの内部クロックモードとなり、MCLKから適当にシフトクロックを生成するとのこと。
  • パラシリの1フレームはLRCLKの立下りで開始する。LRCLK=44.1KHz(=1/32*SCK)。
  • マスタークロックはMCLK=11.2896MHz
  • 変換されたシリアルデータは1SCK遅らせてDACに出力する。

アーキテクチャ設計

以上の指針からブロック図を書くと以下のようになります。

図75.1
図75.1 サウンドコントローラブロック図

詳細設計

上記ブロック図(アーキテクチャ設計)をもとに、ブロック内部をRTLで記述したものを下図に示します。 SCKはシリアルクロック(=ビットクロック)ですが、内部クロックモードを使用するために、コンスタント出力としています。基本的にZynqを除き、ブロック図と一致しています。

図75.1
図75.1 Vivadoのブロック図

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

posted by sakurai on November 30, 2018 #74

前回の続きです。

設計制約

設計制約をリストアップします。

  • LRCLKの1周期に対し、L=16bit, R=16bitの32bitのシリアルデータが必要であり、シリアルデータはSCKでシフトされるので、SCK=LRCLK*32。ただしこのSCKは、DACに供給しなければDAC内部で発生されます。
  • データフォーマットより、サンプリングレートは16進数で16'h2b11=11025、すなわち11.025KHz。LRCLK=Fs(サンプリング周波数)とのことで、LRCLK=11.025KHzとしたいところですが、下図において、LRCLK=11.025KHzが存在しないので、データのほうを4倍のインターポレーションすることにし、LRCLK=44.1KHzとします。
  • 上記関係式よりSCK=1.4112MHz。
  • マスタークロック(MCLK)は下図のように、256, 384, 512, 768, 1024倍等の任意性がありますが、ここでは256倍のMCLK=11.2896MHzを使用します。

図74.1
図74.1クロック表

タイミングチャート

クロックに関する設計制約が解決したので、タイミングチャートを書いていきます。基本的にハードウェアベースのサウンド出力であるため、FSMによるフォーマット解析を行います。タイミングチャートは以下のとおりです。

図74.2
図74.2 タイミングチャート

ステートマシンのクロックFSMCLKは図74.2のように、ステートアドレス、ステートデータ、データアドレス、データデータの4クロックで1サウンドデータの読み出しになることから、$\text{CLK}^{-1}$をCLKの周期と表記すれば、4*$\text{FSMCLK}^{-1}$=2*16*$\text{SCK}^{-1}$、つまり、8*FSMCLK=SCK。これよりFSMCLK=176.4KHz。

DACが要求する16bitデータ×2ch(L, R)の32bitデータについては、データソースが8bitモノラルであるため、8bitデータをMSB側に詰め、残りは0詰めし、16bitとします。LとRには同じデータを供給します。

インタポレーションのやり方はゼロ詰めする方法と、同じデータを繰り返す方法があります。16bit@44.1KHz表現可能なDACに対して8bit@11.025KHzという荒い音質であることから、同じ32bitデータを4回繰り返すことにします。

以上で設計制約から来るクロック周波数とタイミングチャートが確定したので、これに基づいてFSMを設計します。


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

posted by sakurai on August 20, 2018 #54

次はサウンドです。音を出すには可聴周波数帯域の適当な振幅のアナログ信号を出力します。そのために前述したPMOD-I2SというDACが必要になります。

製品データシート: https://reference.digilentinc.com/_media/reference/pmod/pmodi2s/pmodi2s_rm.pdf

使用DACデータシート: https://www.mouser.com/ds/2/76/CS4344-45-48_F2-472818.pdf

このデータシートによればステレオの24ビットオーディオDACとのことで、ゲームサウンドには高級すぎますが、それほど高価ではないのでこれを使うことにします。インタフェースはI2Sというシリアルデータです。 マニュアルに掲載されているシリアルデータフォーマットを次の図に示します。

図%%.1
図54.1 シリアルデータフォーマット

16bitデータ2ch(L, R)の32bitデータをシリアルでDACに供給しますが、注意点は図のように1ビットズレていることです。

入力としては、waveファイルをデコードし、シリアルデータを出力するようなモジュールを作成します。以下に入力のwaveフォーマットを示します。 http://sky.geocities.jp/kmaedam/directx9/waveform.html

このwaveをデコードするFSMを設計します。以下にサンプルのwaveフォーマットを示します。

図%%.2
図54.2 waveフォーマット例

入手したwavファイルのサンプリング周波数とデータ精度がバラバラで、ハードで扱うには厳しいので、全て11.025KHz、8bit、Mono、メタデータ無しに変換しておきます。そのコマンドは以下のとおり。

$ ffmpeg -i input.wav -ac 1 -ar 11025 -acodec pcm_u8 -fflags +bitexact -flags:v +bitexact -flags:a +bitexact output.wav

次回に続きます。


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

posted by sakurai on August 7, 2018 #53

必要な機材を以下に示します。

図53.1

FPGA評価ボードのPMODコネクタに接続するVGAインタフェース及びオーディオインタフェースはdigilent社から購入したものです。以下にそれらのページを示します。

PMOD VGA Video Graphics Array:
https://store.digilentinc.com/pmod-vga-video-graphics-array/(魚拓) (RSコンポーネンツで¥1,425)

PMOD I2S Stereo Audio Output:
https://store.digilentinc.com/pmod-i2s-stereo-audio-output/(魚拓) (RSコンポーネンツで¥1,927)

計2個の送料は¥450で、税込み合計¥4,106でした。


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

posted by sakurai on August 3, 2018 #52

通常はデュアルポートメモリのA側はCPUを用いてプログラムから読み書きすることになります。言うまでもなくソフトウェアにより、複雑なシーケンスを制御しやすいためです。ところがFPGAはハードウェアといえどもプログラム可能なハードウェアであり、ましてHDLにより設計することから、フルハードウェアで描画マスタを構成することにトライしようと思います。

テーマは今年40周年を迎えた「スペースインベーダー」です。フルハードウェア(ソフトウェアを一切使用しない)でこれが動けば、たいていのものはハードウェアでできるのではないでしょうか。

Vivadoによりグラッフィックコントローラに描画マスタをハードウェアで構成したものを以下の図に示します。

図52.1

これが動作しているところを、以下の図に示します。

図52.2

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

posted by sakurai on July 30, 2018 #51

前回までで、VRAMの内容を定常的に表示するグラフィックディスプレイコントローラの設計が完了しました。割愛していますが、シミュレーションを駆使し、動作の確認を行っています。

このままでは描画マスタを設計していないため、静止画を表示することしかできませんが、Bitstream中に初期VRAMデータを埋め込むことが可能です。ブロック図でデュアルポートメモリをダブルクリックすると、以下の画面が現れ、"Other Options"の"Memory Initialization"にファイル名を入力します。

図51.1

ここでは、dual port memoryの初期データファイルとして、スペースインベーダーの画像を取り込むことにします。データは以下のようなフォーマットで構成します。Vivadoにはデータがフォーマットに沿っているかの確認を行うコマンドがあり、validateを実行し、正しいデータかどうか確認した後にwrite bitstreamを行います。

図51.2

以下にGDCを起動したところの図を示します。残念ながら、描画マスタを設計しておらず、表示マスタのみが動作しているため、画像は静止しています。

図51.3

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

posted by sakurai on July 22, 2018 #50

さて、デュアルポートメモリのB側をGDCの読み出し側として、どのようなタイミング設計をするかといえば、FIFOのスループットのつり合いが制約条件となります。

FIFOからみてGDCへの読み出し側は、40MHzクロックで、一ラインは1056クロックでした。この期間で800個のデータを読み出すことになるため、釣り合うためには、同じ期間で800個のデータを書き込めば良いことになります。従って、

40.0 x 800 / 1056 = 19.3939[MHz]

のクロックでVRAMから読み出し、FIFOに書き込めば良いことになります。

デュアルポートメモリのB側のみのブロック図を以下に示します。ブルーは任意のクロック周波数のクロックドメイン、オレンジは上記19.3939MHzのクロックドメイン、グリーンはドットクロックである40.0MHzのクロックドメインとなります。

図%%.1
図50.1 クロックドメイン図

これをVivadoブロックエディタにより作成したものを以下の図に示します。

図%%.2
図50.2 Vivado IP Integratorによるブロック図

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

posted by sakurai on July 16, 2018 #49

先にご紹介したサイトから得た、SVGAのタイミング表を以下に示します。

図49.1
図49.1 SVGAタイミング表
まず、ピクセルクロック(ドットクロックとも呼ばれる)はこの表より40.0MHzとします。これがタイミングの最小単位で、水平ラインの800dotはこのクロックが800クロック分となります。さらに水平期間はこれだけではなく、表示期間以外に3つの期間があり、それぞれフロントポーチ(FP)、同期パルス(SP)、バックポーチ(BP)に分かれます。

水平タイミングを例にとれば、それぞれHFP, HSP, HBPとなります。トータルでは表示期間であるHDPをすべて加えて、HFP+HSP+HBP+HDP=40+128+88+800=1056が水平期間(26.4us)となり、これをラインと呼びます。水平周波数は37.878787KHzとなります。

垂直タイミングはこのラインがひとつの単位となります。表示期間はVDP=600、その他非表示期間はVFP=1、VSP=4、VBP=23となり、トータルでは628ラインとなります。ラインが集まり一つのフレームを構成し、その周期は16.5792msec、垂直周波数は60.3165412083Hzとなります。

図%%.2
図49.2 SVGAタイミングタイミング設計図

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


ページ: