FC2カウンター FPGAの部屋 Ultra96
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する7(信号が出なかった)

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する6(Vivado Analyzerでビデオ信号を確認)”の続き。

高速、低速コネクタ用PMOD 拡張基板のPMOD に接続する Pmod VGA を使用するためのディスプレイ・コントローラを作成して、高速、低速コネクタ用PMOD 拡張基板のPMOD のテストをしている。前回は、ビデオ信号が出ているかどうか?をVivado Analyzer で見たところ出力されていた。今回は、オシロスコープで信号が出ているか?を確認ししたところ信号は出力されていなかった。

久々にオシロスコープを引っ張り出して、HS(水平同期信号)(PMOD-D の 7番ピン)を見たが、 +3.3V に張り付いていて、信号が出ていなかった。

高速コネクタのパターンをよく見てみると、コネクタの信号配置が左右逆だった。orz

まずは、Pmod VGA の HS の Ultra96-V2 での信号名は CSI1_D1_P だった。
Ultra96expb_PMOD_VGA_200_200730.png

高速コネクタの CSI1_D1_P は切り欠きの無い方に出力されている。Ultra96-V2 の回路図から引用する。
Ultra96expb_PMOD_VGA_75_200807.png

基板の図面での CSI1_D1_P は高速コネクタの上側に来ている。
Ultra96expb_PMOD_VGA_76_200807.png

写真で見ると、高速コネクタの上側は切り欠きのある方だった。
Ultra96expb_PMOD_VGA_74_200807.jpg

ということで、高速コネクタの左右が入れ替わっているので、基板は作り直しとなった。
  1. 2020年08月07日 04:23 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する6(Vivado Analyzerでビデオ信号を確認)

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する5(Vitis 2019.2 だったら動いた)”の続き。

高速、低速コネクタ用PMOD 拡張基板のPMOD に接続する Pmod VGA を使用するためのディスプレイ・コントローラを作成して、高速、低速コネクタ用PMOD 拡張基板のPMOD のテストをしようとしている。 バージョン 2020.1 でやってみたところ、Vitis 2020.1 でプロセッサが起動しないようだった。前回は、 Vivado HLS 2019.2, Vivad 2019.2, Vitis 2019.2 で実行したが、VGA 画面は表示されなかったものの、Hello World は表示することができた。今回は、ビデオ信号が出ているかどうか?をVivado Analyzer で見てみよう。

まずは、Vivado 2019.2 でブロックデザインのビデオ信号ラインに Debug を設定して、自動配線した。
Ultra96expb_PMOD_VGA_57_200805.png

system_ila_0 が挿入された。
ブロックデザインをセーブしてから、論理合成、インプリメンテーション、ビットストリームの生成を行った。
結果を示す。タイミングも 40 MHz だから当たり前だが、メットしている。
Ultra96expb_PMOD_VGA_58_200805.png

Vitis 2019.2 で Hello World を動作させてから(そうでないとPS からクロックが出ない)、Open Hardware Manager を起動して、Vivado Analyzer で波形を確認した。
Ultra96expb_PMOD_VGA_59_200805.png

どの信号も良さそうだ。 vsyncx だけ見えないので、立ち上がりでトリガかけると、変化が見えた。
Ultra96expb_PMOD_VGA_60_200805.png

信号波形に問題は無いようだ。オシロスコープで波形を見てみよう。
  1. 2020年08月05日 20:54 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する5(Vitis 2019.2 だったら動いた)

”Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する4(Vitis 2020.1 で実機確認も動作せず)”の続き。

高速、低速コネクタ用PMOD 拡張基板のPMOD に接続する Pmod VGA を使用するためのディスプレイ・コントローラを作成して、高速、低速コネクタ用PMOD 拡張基板のPMOD のテストをしようとしている。しかし、前回は、Vivado 2020.1 から Vitis 2020.1 を立ち上げて、プラットフォームを作成、ビルドして、アプリケーション・ソフトウェアを作成、ビルドしてから実機確認したが、Hello World も出なかった。今回は同様の作業を Vivado HLS 2019.2, Vivad 2019.2, Vitis 2019.2 で実行したが、VGA 画面は表示されなかったものの、Hello World は表示することができた。

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する2(Vitis HLS 2020.1 でディスプレイ・コントローラを作成)”と同様に Vivado HLS 2019.2 で display_cont_sub IP を作成した。
Ultra96expb_PMOD_VGA_52_200804.png

Vivado 2019.2 で exbhl_display_cont_192 プロジェクトを作って、ブロックデザインを生成した。
Ultra96expb_PMOD_VGA_54_200804.png

Ultra96expb_PMOD_VGA_53_200804.png

Vitis 2019.2 でプラットフォームとアプリケーション・プロジェクトを作成して、Hello World アプリを起動した。
Ultra96expb_PMOD_VGA_55_200804.png

2 回実行したが、 2 回とも Hello World が表示されている。
Ultra96expb_PMOD_VGA_56_200804.png

ただし、Vivado 2019.2 のブロックデザインで Zynq MPSoC の IRQ は除いてある。Vivado 2020.1 で同様に IRQ を除いて、もう一度やってみたが、やはり実行できなかった。
とりあえず、 2019.2 でやったほうが良さそうだ。

結果を書くのを忘れたが VGA 信号が出力されていなかったので、デバックする。
  1. 2020年08月04日 05:16 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する4(Vitis 2020.1 で実機確認も動作せず)

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する3(Vivado 2020.1 でディスプレイ・コントローラを作成)”の続き。

前回は、高速、低速コネクタ用PMOD 拡張基板のPMOD に接続する Pmod VGA を使用するためのディスプレイ・コントローラを Vitis HLS 2020.1 で作成したディスプレイ・コントローラ IP を Vivado 2020.1 で実装し成功した。今回は、Vivado 2020.1 から Vitis 2020.1 を立ち上げて、プラットフォームを作成、ビルドして、アプリケーション・ソフトウェアを作成、ビルドしてから実機確認する。

Tools メニューから Launch Vitis IDE を選択して、Vitis 2020.1 を立ち上げる。
Select a directory as workspace ダイアログが表示される。Workspace をBrows... ボタンで選択して、 Launch ボタンをクリックする。
Ultra96expb_PMOD_VGA_36_200730.png

Vitis 2020.1 が立ち上げる。
File メニューから New -> Platform Project... を選択する。

Create new platform project ダイアログが表示された。 Next > ボタンをクリックする。
Ultra96expb_PMOD_VGA_37_200803.png

Plagform で XSA File を Brows... ボタンをクリックして、exbhl_displaty_cont_wrapper.xsa を選択した。
Ultra96expb_PMOD_VGA_38_200803.png

display_cont_platform が生成された。
stdin, stdout のポートをシリアル 0 からシリアル 1 に変更する。
Borad Support Package を選択して、Modify BSP Settings... ボタンをクリックした。
Ultra96expb_PMOD_VGA_39_200803.png

stdin, stdout を psu_uart_1 に変更した。
Ultra96expb_PMOD_VGA_40_200803.png

ビルド・ボタンをクリックして、ビルドし成功した。
Ultra96expb_PMOD_VGA_41_200803.png

次にアプリケーション・プロジェクトを生成する。
File メニューから New -> Application Project... を選択した。

Create a New Application Project ダイアログが表示された。
Ultra96expb_PMOD_VGA_42_200803.png

Platform では、先ほど作成した display_cont_platform を選択した。
Ultra96expb_PMOD_VGA_43_200803.png

Application Project Details では、Application project name に dispaly_cont と入力した。
Ultra96expb_PMOD_VGA_44_200803.png

Domain はそのままとした。
Ultra96expb_PMOD_VGA_45_200803.png

Template では、 Hello World を選択した。
Ultra96expb_PMOD_VGA_46_200803.png

アプリケーション・プロジェクトが作成された。
下の Assistant ウインドウで display_cont を選択し、ビルド・ボタンをクリックしてビルドを行う。
Ultra96expb_PMOD_VGA_47_200803.png

ビルドが成功した。実機で動作させてみよう。
Ultra96-V2 の電源をON した。USB ケーブルをパソコンに接続済み。
Explorer ウインドウで display_cont を選択して、Run ボタンをクリックする。
Ultra96expb_PMOD_VGA_48_200803.png

Run As ダイアログが表示された。
Launch on Hardware (Single Application Debug) を選択して、OK ボタンをクリックする。
Ultra96expb_PMOD_VGA_49_200803.png

Ultra96-V2 のビットファイルをコンフィグしていたが、Warning ダイアログが表示されあt.
Ultra96expb_PMOD_VGA_50_200803.png

失敗してしまった。
Ultra96expb_PMOD_VGA_51_200803.png

プロセッサが起動していないようだ。
  1. 2020年08月03日 05:10 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する3(基板のバグ)

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板がバグってた。CSI0_MCLK と CSI1_MCLK が 1.8V バンクの信号だった。それを1.2V の信号に入れてしまった。他の似たような信号名の信号はすべて 1.2V だったので、間違ってしまった。パターンをカットする必要がある。

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する1(準備編)”を修正する。

Ultra96expb_PMOD_VGA_200_200730.png

Ultra96expb_PMOD_VGA_201_200730.png

インターフェース用IC U7 の 3 、 4 番ピンをパターンカットする。(ピンクの線でパターンカットする)
Ultra96expb_PMOD_VGA_202_200730.png

パターンカットしようとしたが、電圧出てないから、この出力をイネーブルしなければむしろ接続済みのほうが良いか?ということで、そのままとした。
  1. 2020年07月31日 05:03 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する2(Vitis HLS 2020.1 でディスプレイ・コントローラを作成)

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する1(準備編)”の続き。

前回は、高速、低速コネクタ用PMOD 拡張基板の FPGA のピン・アサインを調べた。今回は、高速、低速コネクタ用PMOD 拡張基板のPMOD に接続する Pmod VGA を使用するためのディスプレイ・コントローラを Vitis HLS 2020.1 を使用して作成しよう。

このディスプレイ・コントローラは Vivado HLS セミナに使用しているソースコードを流用している。
入力は無く、出力だけとなる。出力の画像は、画面を4分割し、第1象限は赤、第2象限は緑、第3象限は青、第4象限は白を表示する。
ソースコードとテストベンチのコードを示す。
ソースコードの display_cont.cpp を示す。

// display_cont.cpp
// 2015/06/03 by marsee
//
// 画面を4分割した第1象限は赤、第2象限は緑、第3象限は青、第4象限は白を表示する
//

#include <stdio.h>
#include <string.h>
#include <ap_int.h>

// SVGA 解像度
#define H_ACTIVE_VIDEO    800
#define H_FRONT_PORCH    40
#define H_SYNC_PULSE    128
#define H_BACK_PORCH    88
#define H_SUM            (H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH)

#define V_ACTIVE_VIDEO    600
#define V_FRONT_PORCH    1
#define V_SYNC_PULSE    4
#define V_BACK_PORCH    23
#define V_SUM            (V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH)

void display_cont_sub(ap_uint<8> *red, ap_uint<8> *green, ap_uint<8> *blue, ap_uint<1> *display_enable, ap_uint<1> *hsyncx, ap_uint<1> *vsyncx){
#pragma HLS INTERFACE ap_none register port=red
#pragma HLS INTERFACE ap_none register port=green
#pragma HLS INTERFACE ap_none register port=blue
#pragma HLS INTERFACE ap_none register port=display_enable
#pragma HLS INTERFACE ap_none register port=hsyncx
#pragma HLS INTERFACE ap_none register port=vsyncx
#pragma HLS INTERFACE ap_ctrl_hs port=return

    ap_uint<16> h_count, v_count;

    for (v_count=0; v_count<V_SUM; v_count++){
        for (h_count=0; h_count<H_SUM; h_count++){
#pragma HLS PIPELINE II=1 rewind
            if (h_count >= (H_ACTIVE_VIDEO +H_FRONT_PORCH) && h_count < (H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE))
                *hsyncx = 0;
            else
                *hsyncx = 1;

            if (v_count >= (V_ACTIVE_VIDEO + V_FRONT_PORCH) && v_count < (V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE))
                *vsyncx = 0;
            else
                *vsyncx = 1;

            if (h_count < H_ACTIVE_VIDEO && v_count < V_ACTIVE_VIDEO)
                *display_enable = 1;
            else
                *display_enable = 0;

            if (v_count < V_ACTIVE_VIDEO/2){
                if (h_count < H_ACTIVE_VIDEO/2){
                    *red=0xff; *green=0; *blue=0;
                } else if (h_count < H_ACTIVE_VIDEO){
                    *red=0; *green=0xff; *blue=0;
                } else {
                    *red=0; *green=0; *blue=0;
                }
            } else if (v_count < V_ACTIVE_VIDEO){
                if (h_count < H_ACTIVE_VIDEO/2){
                    *red=0; *green=0; *blue=0xff;
                } else if (h_count < H_ACTIVE_VIDEO){
                    *red=0xff; *green=0xff; *blue=0xff;
                } else {
                    *red=0; *green=0; *blue=0;
                }
            } else {
                *red=0; *green=0; *blue=0;
            }
        }
    }
}


テストベンチの display_cont_tb.cpp を示す。

//
// display_cont_tb.cpp
// 2015/06/03 by marsee
//

#include <stdio.h>
#include <string.h>
#include <ap_int.h>

void display_cont_sub(ap_uint<8> *red, ap_uint<8> *green, ap_uint<8> *blue, ap_uint<1> *display_enable, ap_uint<1> *hsyncx, ap_uint<1> *vsyncx);
int main(){
    ap_uint<8> redb, *red;
    ap_uint<8> greenb, *green;
    ap_uint<8> blueb, *blue;
    ap_uint<1> deb, *display_enable;
    ap_uint<1> hb, *hsyncx;
    ap_uint<1> vb, *vsyncx;

    red = &redb;
    green = &greenb;
    blue = &blueb;
    display_enable = &deb;
    hsyncx = &hb;
    vsyncx = &vb;

    display_cont_sub(red, green, blue, display_enable, hsyncx, vsyncx);
    display_cont_sub(red, green, blue, display_enable, hsyncx, vsyncx);

    return 0;
}


Vitis HLS 2020.1 を起動して、プロジェクトを作成する。
Ultra96expb_PMOD_VGA_6_200729.png

display_cont_201 プロジェクトを作成する。
Ultra96expb_PMOD_VGA_7_200729.png

SVGA 出力なので、 Clock Period を 25 ns に設定し、 xczu3eg-sbva484-1-e に設定した。
Ultra96expb_PMOD_VGA_8_200729.png

display_cont_201 プロジェクトが作成され、ソースコードとテストベンチを追加した。
Ultra96expb_PMOD_VGA_9_200729.png

Top Function を display_cont_sub に設定した。
Ultra96expb_PMOD_VGA_10_200729.png

C コードの合成を行った。結果を示す。
Ultra96expb_PMOD_VGA_11_200729.png

C コードの合成のレポートを示す。
Ultra96expb_PMOD_VGA_12_200729.png

66168 クロックは、(800+40+128+88)×(600+1+4+23) で画像フレームの総クロック数をとなっている。

C/RTL 協調シミュレーションを行った。
Ultra96expb_PMOD_VGA_13_200729.png

C/RTL 協調シミュレーションの波形を示す。
Ultra96expb_PMOD_VGA_14_200729.png

1 回目と 2 回目のつなぎの部分を拡大してみた。その部分で余計なクロックは無いようだ。
Ultra96expb_PMOD_VGA_15_200730.png

(800+40+128+88)×25 ns = 26400 ns = 26.4 us となる。

合成された VHDL コードの entity 部分を見てみると ap_ctrl_hs の制御信号が追加されている。 ap_start などだ。

entity display_cont_sub is
port (
    ap_clk : IN STD_LOGIC;
    ap_rst : IN STD_LOGIC;
    ap_start : IN STD_LOGIC;
    ap_done : OUT STD_LOGIC;
    ap_idle : OUT STD_LOGIC;
    ap_ready : OUT STD_LOGIC;
    red : OUT STD_LOGIC_VECTOR (7 downto 0);
    green : OUT STD_LOGIC_VECTOR (7 downto 0);
    blue : OUT STD_LOGIC_VECTOR (7 downto 0);
    display_enable : OUT STD_LOGIC_VECTOR (0 downto 0);
    hsyncx : OUT STD_LOGIC_VECTOR (0 downto 0);
    vsyncx : OUT STD_LOGIC_VECTOR (0 downto 0) );
end;


ap_start などの余計な制御信号を削除するために、Vitis HLS の INTERFACE 指示子の ap_ctrl_hs を ap_ctrl_none に変更した。
Ultra96expb_PMOD_VGA_16_200730.png

これで C コードの合成を行った。
Ultra96expb_PMOD_VGA_17_200730.png

合成された VHDL コードの entity 部分を再度確認すると、制御信号が削除されていた。

entity display_cont_sub is
port (
    ap_clk : IN STD_LOGIC;
    ap_rst : IN STD_LOGIC;
    red : OUT STD_LOGIC_VECTOR (7 downto 0);
    green : OUT STD_LOGIC_VECTOR (7 downto 0);
    blue : OUT STD_LOGIC_VECTOR (7 downto 0);
    display_enable : OUT STD_LOGIC_VECTOR (0 downto 0);
    hsyncx : OUT STD_LOGIC_VECTOR (0 downto 0);
    vsyncx : OUT STD_LOGIC_VECTOR (0 downto 0) );
end;


これで問題ないので、Export RTL を行って、IP を作成する。
Ultra96expb_PMOD_VGA_18_200730.png

IP が生成された。
  1. 2020年07月30日 04:05 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する1(準備編)

Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板10(部品を実装)”で Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に部品を実装した。
”電源プラグと干渉して、低速コネクタが全て挿入されていない”という問題があったが、ポスト長が 7 mm の 2 mm ヘッダに交換したところうまく勘合して、Ultra96-V2 に干渉しなくなった。
この高速、低速コネクタ用PMOD 拡張基板をテストしたことがなかったので、テストしてみたいと思う。どうやってテストするか?
テストのために Digilent 社の Pmod VGA ボードを購入したので、それを PMOD に接続して画像を出してみたい。

(2020/07/31 :追記) CSI0_MCLK と CSI1_MCLK が 1.8V バンクの信号だったので、パターンカットすることになった。詳しくは”Ultra96-V2 の高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続する3(基板のバグ)”を参照のこと。

高速、低速コネクタ用PMOD 拡張基板の低速拡張コネクタ用のポスト長 7 mm の 2 mm ピッチヘッダを実装した状態を写真で示す。なお、PMOD VGA がすでに接続されている。
Ultra96expb_PMOD_VGA_1_200728.jpg

高速、低速コネクタ用PMOD 拡張基板に Pmod VGA を接続した様子を示す。
Ultra96expb_PMOD_VGA_2_200728.jpg

Ultra96expb_PMOD_VGA_3_200728.jpg

高速、低速コネクタ用PMOD 拡張基板の PMOD-C に Pmod VGA の J1 が PMOD-D に Pmod VGA の J2 が接続されている。

Ultra96-V2 Development Board ページの Ultra96-V2 Constraints Rev 1 を見ながら、FPGA のピン番号を調べて、高速、低速コネクタ用PMOD 拡張基板の PMOD の入出力ピンを表にした。なお、Pmod VGA を PMOD-C, PMOD-D に接続した時のピン名も表にした。
Ultra96expb_PMOD_VGA_4_200728.png

Ultra96expb_PMOD_VGA_5_200728.png
  1. 2020年07月28日 04:20 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0
»