Posts Issued in June, 2018

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

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

Lチカの実装 (7)

posted by sakurai on June 20, 2018 #46

Vivadoの操作

  1. シミュレーション シミュレーションにより、動作が正しく行われるかを確認します。左のFlow NavigatorからSIMULATIONの下のRun Simulationをクリックし、Run Behavioral Simulationを実行します。
    図46.1

図46.2

図46.3
図46.4

しばらく待つと以下のようにシミュレーションが動作するが、リセットがうまく入っていないため、カウンタ値が不定となっています。PSからのリセットはソフトで指示しないとかからないのかもしれません。従って、シミュレーションで動作するようにワークアラウンドを行います。

図46.5
まず、ソースを以下のように開きます。
図46.6
design_1の階層でGoto Sourceをクリック。
図46.7
25行目の、blinkモジュールのXRST端子をPSからのリセットを削除し、~glbl.GSRをつなぎます。glblモジュールのGSRは100nsのみtrueとなる信号であるため、反転してXRST端子に入力します。
図46.8
以下の図のようにリセットが正常に入り、回路が動作しました。
図46.9
このままクロックを入れ続けても動作しますが、シミュレーション時間が非常にかかるため、短縮を行います。25bitカウンタを単純にカウントするのではなく、MAX値に近い値をロードした後にカウントを進めます。具体的にはTEST信号をtrueにし25bitカウンタにMAX値に近い値(例えば0x1ffff8)をロードします。この前提としてRTLの25bitカウンタを、TEST信号のtrueにより任意の値をロードできるように修正する必要があります。テスト回路を用いない方法としては、カウント値に強引に上記値をforceするやり方もあります。テスト回路は本番では不要であるため、こちらのほうが良いかもしれません。

tclウインドウから入力するコマンドを示します。

add_force {/design_1_wrapper/design_1_i/blink_0/inst/count25/LD} -radix hex {1fffff8 0ns}
add_force {/design_1_wrapper/design_1_i/blink_0/inst/count25/TEST} -radix hex {1 0ns}
run 10 ns
add_force {/design_1_wrapper/design_1_i/blink_0/inst/count25/TEST} -radix hex {0 0ns}
run 200ns

図46.10
このように動作したので、14進カウンタがすべてカウントするまでこのコマンドを入力します。
図46.11
正しく14進カウンタが動作し、かつLEDパターンが要件に従ったふるまいのとおりデコードされているのがわかります。

テスト回路自体は本来のパス(機能安全用語では主要機能)ではありませんが、このような長いカウンタのテスト容易化設計として常識の回路です。


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

Lチカの実装 (6)

posted by sakurai on June 13, 2018 #45

Vivadoの操作

  1. 最上位HDLラッパーの作成
    blinkモジュールが最上位となっているため、Zynqとblinkの両方を含む最上位モジュールを作成します。 PROJECT MANAGERをクリック。design_1で右クリックし、メニューを表示させる。ここからCreate HDL Wrapperをクリック。
    図45.1
    以下のようなメニューが出るため、OKをクリック。
    図45.2
    design_1_wrapperという階層が作成されました。
    図45.3
    ラッパーを作成しただけではまだblinkが最上位となっているため、右クリックしメニューを表示します。
    図45.4
    この中からSet as Topをクリック。
    図45.5
    正しくdesign_1_wrapperの下にZynqとblinkのモジュールが配置されました。

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

Lチカの実装 (5)

posted by sakurai on June 5, 2018 #44

Vivadoの操作

実際の操作方法を記述して行きます。

  1. Zynqブロック作成
    左端のFlow NavigatorよりIP INTEGRATORのCreate Block Designをクリック。以下のメニューでそのままOK。
    図44.1
    以下の画面で+をクリックしてIPを追加します。これによりZynq UltraScale+のPS領域を追加します。基本的にはハードのみで動作させ、ソフトは使用しないのでPSは不要ですが、今回はクロックとリセットのみを使用します。
    図44.2
    IPの選択画面が出るため、Search窓にzyと入力し、Zynq UltraScale+ MPSoCというIPをダブルクリック。
    図44.3
    下図のように、ブロック図にZynq UltraScale+のPS領域がインスタンスされます。
    図44.4
    空き端子があると正常に動作しないため、pl_clk0出力をmaxihpm0_lpd_ack入力に接続します。
    図44.5
  2. blinkモジュール作成
    下図のように、Flow NavigatorのPROJECT MANAGERメニューからAdd Sourcesをクリックし、Add or create design sourcesラジオボタンを選択し、Nextをクリック。
    図44.6
    blinkのフォルダの下にあらかじめverilog moduleとxdcを置いておきます。Add filesを選択し、次にverilogファイルを選択し、OKをクリック。
    図44.7
    下図のような画面となるため、Finishをクリック。
    図44.8
  3. blinkモジュールをモジュールとして追加
    blinkモジュールが読み込めたので、blinkモジュールをブロック図にモジュールとして追加します。 何もないところで右クリックし、Add Moduleをクリック。
    図44.9
    下図のように、モジュール選択画面が出るので、ここでblinkを選択し、OKをクリック。
    図44.10
    下図のように、blinkモジュールがblink_0としてインスタンスされます。
    図44.11
    blinkモジュールのCLK入力をZynqのpl_clk0出力に接続します。またXRST入力をpl_resetn0出力に接続します。
    図44.12
    LED出力ピンを右クリックし、メニューを表示します。ここでCreate Portとしてこの端子をポートに接続します。
    図44.13
    さらに何もないところで右クリックし、Regenerate Layoutをクリック。
    図44.14
    下図のようにblinkが正しく接続されました。
    図44.15

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