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

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

FPGAの部屋

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

DPDMA の examples をやってみる

Ultra96 の DisplayPort を使えるようにしようとして奮闘しているが、”ZynqMP Standalone DisplayPort Driver”のドライバがXilinx\SDK\2018.2\data\embeddedsw\XilinxProcessorIPLib\drivers フォルダにあるということで、dpdma_v1_1/examples を確かめてみることにした。
Ultra96_DP_7_180814.jpg

Xilinx\SDK\2018.2\data\embeddedsw\XilinxProcessorIPLib\drivers フォルダをインクルード・パスに追加する必要があるが、それは”SDKでインクルード・パスを追加する方法”で解決済みだ。

Vivado 2018.2 の DP_test プロジェクトを示す。
Ultra96_DP_1_180814.jpg

DP_test ブロックデザインを示す。
Ultra96_DP_2_180814.jpg

インプリメンテーション結果を示す。
Ultra96_DP_3_180814.jpg
Ultra96_DP_4_180814.jpg

ハードウェアをエクスポートし、SDK を起動した。

空のアプリケーション・プロジェクトを作成し、dpdma_v1_1/examples のファイルを追加した。
ビルドが通ったので、FPGA をコンフィギュレーションし、elf ファイルを起動した。
Ultra96_DP_6_180814.jpg

Ultra96 のMini DisplayPort にMini DisplayPort - VGA変換器をかませて、ディスプレイに接続したところ、信号は出ているようだが、画面は真っ暗だった。ディスプレイの同期範囲から外れているのかな?
xdpdma_video_example.c の一部を引用する。

void InitRunConfig(Run_Config *RunCfgPtr)
{
    /* Initial configuration parameters. */
        RunCfgPtr->DpPsuPtr   = &DpPsu;
        RunCfgPtr->IntrPtr   = &Intr;
        RunCfgPtr->AVBufPtr  = &AVBuf;
        RunCfgPtr->DpDmaPtr  = &DpDma;
        RunCfgPtr->VideoMode = XVIDC_VM_1920x1080_60_P;
        RunCfgPtr->Bpc         = XVIDC_BPC_8;
        RunCfgPtr->ColorEncode            = XDPPSU_CENC_RGB;
        RunCfgPtr->UseMaxCfgCaps        = 1;
        RunCfgPtr->LaneCount            = LANE_COUNT_2;
        RunCfgPtr->LinkRate                = LINK_RATE_540GBPS;
        RunCfgPtr->EnSynchClkMode        = 0;
        RunCfgPtr->UseMaxLaneCount        = 1;
        RunCfgPtr->UseMaxLinkRate        = 1;
}


HD 解像度のはずなんだが、ストリームを送り込む必要があるのかな?
  1. 2018年08月14日 07:54 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96用PMOD拡張ボードの波形を確認

Ultra96用PMOD拡張ボードの波形を確認した。

まずは、Ultra96 から波形を出力してPMOD 端子で波形を確認した。最初に、360 Ωで +3.3V にプルアップした。
波形は、”Ultra96用PMOD拡張ボードのPMOD端子のテストのために8ビットカウンタのLチカを作る2”から出力している。検査したポートはHD_GPIO_8 とした。波形を示す。
Ultra96_ext_board_37_180806.jpg

波形のH 部分の電圧は 2.80 V だった。100 MHz のオシロスコープにパッシブプローブなので、立ち上がりは良く分からないかも?ある程度早く立ち上がっているみたいだ。

同じ、Ultra96 から波形を出力してPMOD 端子で波形を確認した。今度は、プルアップ抵抗を 1 kΩ とした。
Ultra96_ext_board_38_180806.jpg

立ち上がりはそれほど変化ないのだが(100 MHz のオシロスコープにパッシブプローブで分からないだけかも?)、H の電圧が 2.4 V になってしまっている。

次に、PMOD から Ultra96 への信号だが、こちらは 1.8 V LVCMOS 信号レベルだ。
下の様に、+3.3 V で古い 1 MHz のクロック発振器を動作させている。それをプルアップ抵抗が付いていないPMOD 端子に入れている。今回入力するポートは HD_GPIO_0 とした。やっている様子を示す。
Ultra96_ext_board_39_180806.jpg

波形を示す。
Ultra96_ext_board_40_180806.jpg

CH2 がPMOD 端子のところの波形で、CH1 が 2mm コネクタのところの 1.8 V の波形だ。きちんと 1.8 V の波形が出力されている。PMOD から Ultra96 への信号ではプルアップ抵抗は要らないみたいだ。

拡大してみよう。
Ultra96_ext_board_41_180806.jpg

立ち上がりも、良く分からないが、大丈夫ではないだろうか?

と言う訳で、STANBY と SCL , SCA , XCLK のところに、プルアップ抵抗 1 kΩ を付けてテストすることにした。これで、行けるのではないか?と思う。XCLK は 72 MHz で心配だが、回路ができたら波形を観察してみよう。ダメだったら、360 Ωに交換する。
Ultra96_ext_board_43_180807.jpg
Ultra96_ext_board_44_180807.jpg

これでうまく行ったら基板を改版する。

なお、@ciniml さんに頂いたJTAG の変換基板を使用してJTAG を使っている。@ciniml さん、ありがとうございました。
Ultra96_ext_board_42_180806.jpg
  1. 2018年08月07日 04:25 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96用PMOD拡張ボードのPMOD端子のテストのために8ビットカウンタのLチカを作る2

Ultra96用PMOD拡張ボードのPMOD端子のテストのために8ビットカウンタのLチカを作る”の続き。

前回は、Lチカ IP をVivado HLS で作成した。今回はそのLチカ IP をVivado で実装した。

Vivado で ex_board_test プロジェクトを作成した。
ex_board_test.bd のブロック・デザインを作成した。
Ultra96_ext_board_32_180806.png

Ultra96_ext_board_33_180806.png

Lチカ IPの ex_board_test IP を 2 個入れてある。2 個のPMODコネクタに対応するためだ。

論理合成、インプリメンテーション、ビットストリームの生成を行った。
結果を示す。1 MHz の動作なので余裕がある。
Ultra96_ext_board_34_180806.png
Ultra96_ext_board_35_180806.png

ハードウェアをエクスポートし、SDK を起動した。
Hello World プロジェクトを作成した。こうしないとARMプロセッサがコンフィグレーションされない。
Ultra96_ext_board_36_180806.png

Hello World を起動した。Lチカが始まったがLEDが暗くて良く見えないが点滅している。電圧を測ると1.6 V 程度だった。
マニュアルを改めてよく読むと、プルアップ抵抗が必要のようだ。orz...
今の拡張基板に抵抗をハンダ付けして動作するかどうか?試してみよう。基板の改版はそれからだ。
  1. 2018年08月06日 05:22 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96用PMOD拡張ボード7(部品を実装した)

Ultra96用PMOD拡張ボード6(基板が届いた)”の続き。

前回は、Ultra96用PMOD拡張ボードが届いたので、今回は、部品を実装して、Ultra96ボードに挿入した。
Ultra96_ext_board_29_180805.jpg

部品を実装したUltra96用PMOD拡張ボードの表。
Ultra96_ext_board_30_180805.jpg

部品を実装したUltra96用PMOD拡張ボードの裏。
Ultra96_ext_board_31_180805.jpg

写真撮るの難しい。昼間に取れば良いのかな?
  1. 2018年08月05日 04:19 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96用PMOD拡張ボードのPMOD端子のテストのために8ビットカウンタのLチカを作る

Ultra96拡張ボードのPMOD端子のテストのために8ビットカウンタを作って2つのPMOD端子の 8 ビットに出力して出力できるかを見たい。

やはり、Vivado HLS 2018.2 で作ってみようと思う。8 ビットカウンタの最下位ビットは 4 HzでLチカして、最上位ビットは32秒間隔でLチカするようにしてみよう。そうすれば隣のピンとの接触も分かるに違いない。

Vivado HLS 2018.2 を使用して、ex_board_test プロジェクトを作成した。
Ultra96_ext_board_20_180804.png

ex_board_test.cpp を貼っておく。

// ex_board_test.cpp
// 2018/08/04 by marsee
// 1MHzのクロックを分周してoutcに上8ビットを割り当て
// 一番下は4Hz、一番上は1/32Hz

#include <ap_int.h>

void ex_board_test(ap_uint<8> &outc){
//#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS INTERFACE ap_none port=outc
    unsigned int i;

    for(i=0; i<33554432; i++){
        outc = i>>17;
    }
}


どうしてこの値になったか?というと、1MHz は 1000000 Hz なので、それを超えて一番近い 16 進数でぴったりの数は 0x100000 = 1,048,576(10進数)である。なので、ここを基準として、3 ビット分は 4 Hz , 2 Hz , 1 Hz なので 0x20 を掛けて、0x2000000 = 33,554,432(10進数)とした。(1 Hz は 0 → 1 で 1 セット)
Ultra96_ext_board_25_180804.png

次にテストベンチを示す。

// ex_board_test_tb.cpp
// 2018/08/04 by marsee
//

#include <ap_int.h>

void ex_board_test(ap_uint<8> &outc);

int main(){
    ap_uint<8> outc;

    ex_board_test(outc);

    printf("outc = %x\n", (unsigned int)outc);

    return(0);
}


C シミュレーションを行った。
Ultra96_ext_board_21_180804.png

outc = ff でこれで良いはず。

C コードの合成を行った。
Ultra96_ext_board_22_180804.png

Timing のTarget は 1000 ns だったが、Estimated は 1.133 ns で全く問題ない。
Latency は 33,554,433 で 1 クロック多いだけだった。
リソース使用量は FF が 28 個、LUT が 77 個だった。

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

Latency は 33,554,433 だった。

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

0x90 と 0x91 の間隔は 262 ms 程度で 4 Hz になっている。これで予定通りだ。

次に、

#pragma HLS INTERFACE ap_ctrl_none port=return

のコメントを外した。これは、この回路をフリーランさせたいためだ。
Ultra96_ext_board_26_180804.png

C コードの合成を行った。
Ultra96_ext_board_27_180804.png

コメントを外す前と同じだった。
合成されたVHDL ファイルを示す。

entity ex_board_test is
port (
    ap_clk : IN STD_LOGIC;
    ap_rst : IN STD_LOGIC;
    outc_V : OUT STD_LOGIC_VECTOR (7 downto 0) );
end;


ap_clk と ap_rst、そして出力 8 ビットの outc があるのが分かる。

Export RTLを行った。なお、Vivado synthesis, place and route にチェックを入れてある。
Ultra96_ext_board_28_180804.png

LUT が 12 個、FF が 28 個だった。CP achieved post-implementation が 1.753 ns で全く問題ない。
  1. 2018年08月04日 20:42 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96用PMOD拡張ボード6(基板が届いた)

Ultra96用PMOD拡張ボード5”の続き。

前回は、ガーバー・ファイルを出力してSeeedStudio で発注した。昨日、DHL で基板が届いた。

Ultra96_ext_board_17_180802.jpg

基板の色は赤にした。板厚は通常の 1.6 mm にした。

表面。
Ultra96_ext_board_18_180802.jpg

裏面。
Ultra96_ext_board_19_180802.jpg

部品はすべて来ているので、実装して確かめてみよう。
  1. 2018年08月02日 04:15 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96用PMOD拡張ボード5

Ultra96用PMOD拡張ボード4”の続き。

前回は、フットプリントを基板上に置いて配線を行った。今回は、ガーバー・ファイルを出力してSeeedStudio で発注した。

前回、ビアを開けすぎたので、ビアを少なくして、ボード名のシルクを追加した。
なお、ビアをたくさん開ける方法は、「KiCadでベタGNDにたくさんviaを打つ」を参考にさせて頂いた。
Ultra96_ext_board_10_180724.png

さて、「KiCADからガーバーファイルを出力する方法」を参考に、ガーバー・ファイルを出力する。
ファイルからプロットを選択して、製造ファイル出力ダイアログを開いた。「KiCADからガーバーファイルを出力する方法」を参考に設定し、製造ファイル出力ボタンをクリックして、ガーバー・ファイルを出力した。
Ultra96_ext_board_11_180724.png

ドリルファイルの生成ボタンをクリックすると、ドリルファイルの生成ダイアログが表示された。
Ultra96_ext_board_12_180724.png

ドリルファイルボタンをクリックして、ドリルファイルを生成した。
Ultra96_ext_board_13_180724.png

生成されたファイルをZIP圧縮した。
Ultra96_ext_board_16_180724.png

Kicad のガーバー・ファイル・ビューアーで見てみよう。
Ultra96_ext_board_15_180724.png

大丈夫そうだ。

SeeedStudio のPCB製作ページに行って、ガーバー・ファイルをアップロードした。赤の基板にした。
Ultra96_ext_board_14_180724.png

Shipping はDHL で頼んだ。これが、$15.8 で、PCB 製造費が $4.9 で合計 $20.7 だった。
支払いはPayPal で 2,392 円だった。ドル円レートは、115.6 円だった。ちなみに現在のレートは 111.42 円 なので、4 円程度多くなっている計算だ。
  1. 2018年07月24日 05:03 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0
»