Posts Tagged with "Vivado HLx"

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.
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タイミングタイミング設計図

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

posted by sakurai on July 1, 2018 #48

高機能なFPGAボードを使って、Lチカではあまりにつまらないため、次にグラフィックディスプレイコントローラの設計を行います。

グラフィックディスプレイの解像度は様々なものがあり、タイミング設計の際に参考になるサイトをご紹介します。
http://tinyvga.com/vga-timing

今回はSVGAのグラフィックディスプレイの設計を行います。
http://tinyvga.com/vga-timing/800x600@60Hz

基本的には、横800dotかける縦600dotかける色深度、例えば8色であれば3bitの情報を記憶するメモリが中心となります。これを通常VRAM (Video RAM)と呼びます。

少々問題になるのは、VRAMは2つのバスマスタによりアクセスされることです。第1にグラフィックディスプレイコントローラ(GDC)、第2に描画マスタであるCPU。ただし、描画マスタはCPUとは限らず、ハードウェアでも構いません。問題は、両者が同時に同じポートにアクセスすると、VRAMのポートがひとつしかない場合には待たされることになります。GDCはディスプレイのタイミングに合わせて画像を読み出す必要があるため、待たすことができません。従ってCPUを待たすことになります。

一方、VRAMのポートを増やして2つにすれば、この問題は解決することができます。これをデュアルポートメモリと呼びます。以下の図は非同期のデュアルポートメモリを用いたディスプレイ表示装置の例で、ブルーのクロックドメインとグリーンのクロックドメインの周波数は特に関係がありません。グリーンは前記のようにSVGAのタイミングで動作します。

図48.1
図48.1 クロックドメイン図

シングルポートメモリを2つ並列に実装し、書き込みは同じデータを両方のメモリに書くことでデュアルポートメモリと見せることができます。これは2つのマスタのうち、GDCは読み出しのみを行い、書き込みを行わないことから可能です。

デュアルポートメモリからの読み出しが安定して継続できるようにラインバッファを持つことを考えます。 これはFIFOにより実装します。具体的には2ラインのラインバッファを持ち、1ライン詰めたところで、書き込みと読み出しの平均スループットが同じになるように釣り合わせれば、FIFOオーバランもアンダーランも起きないと考えられます。


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

Lチカの実装 (8)

posted by sakurai on June 25, 2018 #47

Vivadoの操作

  1. 制約ファイル設定
    デザインの準備ができたので合成制約をかけます。制約の内容はLED端子に対するパッケージ端子の位置の決定と、LED端子のドライブ強度です。以下に制約ファイルの内容を示します。

set_property IOSTANDARD LVCMOS18 [get_ports [list {LED[*]}]]
set_property PACKAGE_PIN R7 [get_ports [list {LED[0]}]]
set_property PACKAGE_PIN T5 [get_ports [list {LED[1]}]]
set_property PACKAGE_PIN T7 [get_ports [list {LED[2]}]]
set_property PACKAGE_PIN T4 [get_ports [list {LED[3]}]]
set_property PACKAGE_PIN T3 [get_ports [list {LED[4]}]]
set_property PACKAGE_PIN U2 [get_ports [list {LED[5]}]]
set_property PACKAGE_PIN U6 [get_ports [list {LED[6]}]]
set_property PACKAGE_PIN U5 [get_ports [list {LED[7]}]]

Add Sourcesをクリックして下図のメニューを表示させ、Add or create contraintsのラジオボタンを選択。

図47.1
以下のように、blinkフォルダの下に用意してあったxdcファイルを選択し、OKをクリック。
図47.2
Add or Create Constraints画面がでるため、Finishをクリック。
図47.3
  1. RTLアナリシス
    合成、配置配線をかける前に、RTLが正しく読めているかどうかを回路図的に確認します。Flow NavigatorからRTL ANALYSISを選択し、Schematicをクリック。階層化されているブロックを適宜展開し、解析を行うと以下の図のようになります。
    図47.4
  2. RTL合成
    Run Synthesisをクリックし、論理合成を実施します。
  3. 実装
    Run Implementationをクリックし、配置配線を実施します。
  4. ビットストリームの作成
    Generate Bitstreamをクリックし、コンフィグファイルの作成を実施します。
  5. FPGAのコンフィギュレーション
    Open Targetをクリックし、Auto Connectを行います。以下の図のメニューが出てビットストリームファイルの選択となるため、そのままProgramを行います。
    図47.5
    FPGAのプログラムを行うことにより回路が自動的に起動します。以下の動画はLチカが動作しているところです。
    図47.6

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


ページ: