Browsed by
Category: FPGA

[FPGA] ZedBoard で FPGA プログラミング大全をしたメモ

[FPGA] ZedBoard で FPGA プログラミング大全をしたメモ

ZedBoard で FPGA プログラミング大全を進めるための変更点。個人的なメモ用。間違っている可能性が大きいので注意。

Constrants (xdc)

set_property -dict { PACKAGE_PIN Y9   IOSTANDARD LVCMOS33 } [get_ports { CLK }];
create_clock -period 10.000 -name sys_clk_pin -waveform {0.000 5.000} -add [get_ports CLK]

set_property -dict { PACKAGE_PIN P16    IOSTANDARD LVCMOS18 } [get_ports { RST }];

set_property -dict { PACKAGE_PIN AA19   IOSTANDARD LVCMOS33 } [get_ports { VGA_HS }];
set_property -dict { PACKAGE_PIN Y19    IOSTANDARD LVCMOS33 } [get_ports { VGA_VS }];

set_property -dict { PACKAGE_PIN Y21    IOSTANDARD LVCMOS33 } [get_ports { VGA_B[0] }];
set_property -dict { PACKAGE_PIN Y20    IOSTANDARD LVCMOS33 } [get_ports { VGA_B[1] }];
set_property -dict { PACKAGE_PIN AB20   IOSTANDARD LVCMOS33 } [get_ports { VGA_B[2] }];
set_property -dict { PACKAGE_PIN AB19   IOSTANDARD LVCMOS33 } [get_ports { VGA_B[3] }];

set_property -dict { PACKAGE_PIN AB22   IOSTANDARD LVCMOS33 } [get_ports { VGA_G[0] }];
set_property -dict { PACKAGE_PIN AA22   IOSTANDARD LVCMOS33 } [get_ports { VGA_G[1] }];
set_property -dict { PACKAGE_PIN AB21   IOSTANDARD LVCMOS33 } [get_ports { VGA_G[2] }];
set_property -dict { PACKAGE_PIN AA21   IOSTANDARD LVCMOS33 } [get_ports { VGA_G[3] }];

set_property -dict { PACKAGE_PIN V20    IOSTANDARD LVCMOS33 } [get_ports { VGA_R[0] }];
set_property -dict { PACKAGE_PIN U20    IOSTANDARD LVCMOS33 } [get_ports { VGA_R[1] }];
set_property -dict { PACKAGE_PIN V19    IOSTANDARD LVCMOS33 } [get_ports { VGA_R[2] }];
set_property -dict { PACKAGE_PIN V18    IOSTANDARD LVCMOS33 } [get_ports { VGA_R[3] }];

MMCME2_BASE

   MMCME2_BASE #(
      .BANDWIDTH("OPTIMIZED"),  // Jitter programming (OPTIMIZED, HIGH, LOW)
      .CLKFBOUT_MULT_F(18.0),   // 乗数M(2.000-64.000)
      .CLKFBOUT_PHASE(0.0),     // 位相(-360.000-360.000)
      .CLKIN1_PERIOD(5.0),      // CLKINの周期
      // CLKOUT0_DIVIDE - CLKOUT6_DIVIDE: Divide amount for each CLKOUT (1-128)
      .CLKOUT1_DIVIDE(1),
      .CLKOUT2_DIVIDE(1),
      .CLKOUT3_DIVIDE(1),
      .CLKOUT4_DIVIDE(1),
      .CLKOUT5_DIVIDE(1),
      .CLKOUT6_DIVIDE(1),
      .CLKOUT0_DIVIDE_F(35.75),  // 除数Q(1.000-128.000)
      // CLKOUT0_DUTY_CYCLE - CLKOUT6_DUTY_CYCLE: Duty cycle for each CLKOUT (0.01-0.99).
      .CLKOUT0_DUTY_CYCLE(0.5), // デューティ比
      .CLKOUT1_DUTY_CYCLE(0.5),
      .CLKOUT2_DUTY_CYCLE(0.5),
      .CLKOUT3_DUTY_CYCLE(0.5),
      .CLKOUT4_DUTY_CYCLE(0.5),
      .CLKOUT5_DUTY_CYCLE(0.5),
      .CLKOUT6_DUTY_CYCLE(0.5),
      // CLKOUT0_PHASE - CLKOUT6_PHASE: Phase offset for each CLKOUT (-360.000-360.000).
      .CLKOUT0_PHASE(0.0),
      .CLKOUT1_PHASE(0.0),
      .CLKOUT2_PHASE(0.0),
      .CLKOUT3_PHASE(0.0),
      .CLKOUT4_PHASE(0.0),
      .CLKOUT5_PHASE(0.0),
      .CLKOUT6_PHASE(0.0),
      .CLKOUT4_CASCADE("FALSE"), // Cascade CLKOUT4 counter with CLKOUT6 (FALSE, TRUE)
      .DIVCLK_DIVIDE(2),         // 除数D(1-106)
      .REF_JITTER1(0.0),         // Reference input jitter in UI (0.000-0.999).
      .STARTUP_WAIT("FALSE")     // Delays DONE until MMCM is locked (FALSE, TRUE)
   )

ZedBoard は 100MHz なので、書籍にのっていた数値をもとに、上のように変更した。

[FPGA] ZedBoard から VGA 出力

[FPGA] ZedBoard から VGA 出力

FPGA マガジンや、FPGA プログラミング大全に乗っていた、VGA 出力を ZedBoard で試してみる。

分周回路

reg [1:0] cnt;

always @( posedge clk, posedge reset ) begin
    if ( reset )
        cnt <= 2'h0;
    else
        cnt <= cnt + 2'h1;
end

assign pck = cnt[1];

Zedboard のクロックは 100MHz なので、これを4分周して 25MHz のクロックを作っている。cnt レジスタは 2bit で +1 でカウントアップをし続けることで、00 -> 01 -> 10 > 11 を繰り返す。この時、最上位 bit の cnt[1] が 1 になる立ち上がりを取得することで 1/4 のクロックが得られる?

ボードからの出力

FPGA からの出力はデジタル情報なので「ラダー抵抗」と呼ばれる仕組みを使って D-A 変換を行い、目的の電圧 (0.7V?) に変換してから VGA 端子で出力している。当たり前だが VGA はアナログなので、アナログに変換しないといけない。

参考

  • FPGA マガジン No.7
  • FPGA プログラミング大全 Xilinx編

Video Graphics Array
https://ja.wikipedia.org/wiki/Video_Graphics_Array
VGA端子
https://ja.wikipedia.org/wiki/VGA%E7%AB%AF%E5%AD%90
VGA Signal Timing
http://www.tinyvga.com/vga-timing
11 VGA Port
https://digilent.com/reference/programmable-logic/zybo/reference-manual
ちょっとTea Time!? VGAを調べてみる
http://www.easyaudiokit.com/bekkan2020/TeaTime8/vga.html
VGAモジュールの作成
http://www.arch.cs.kumamoto-u.ac.jp/~kuga/cad/exp/sys/2009/vga.html
分周器・CPUトップモジュール
https://sagara-works.jp/research-and-development/code-prescaler/

[FPGA] 個人的な勉強用のリンク (Zynq)

[FPGA] 個人的な勉強用のリンク (Zynq)

ZedBoard

ZedBoard Hardware User’s Guide
https://digilent.com/reference/_media/zedboard:zedboard_ug.pdf

ZedBoard
https://marsee101.web.fc2.com/zedboard.html
貴重な情報に感謝。(FPGAの部屋のまとめ サイト)

Zybo

Zybo Z7 Reference Manual
https://digilent.com/reference/programmable-logic/zybo-z7/reference-manual

Vitis HLSL

ユーザーガイド
https://www.xilinx.com/content/dam/xilinx/support/documents/sw_manuals_j/xilinx2021_1/ug1399-vitis-hls.pdf

Basic examples for Vitis HLS
https://github.com/Xilinx/Vitis-HLS-Introductory-Examples
Xilinx から Example が提供されていた。

HDMI 出力

ZYBO (Zynq) でHDMI出力をする
https://qiita.com/iwatake2222/items/b323e129f96426031f9f

ZyboのHDMI入出力デモをVitisから実行してみた
https://phys-higashi.com/1267/

ADV7511 HDMI トランスミッタ
https://www.analog.com/media/en/technical-documentation/user-guides/ADV7511_Hardware_Users_Guide.pdf

FPGAでHDMIから画像出力!フリーのIPを使ってみた
https://misoji-engineer.com/archives/fpga-hdmi.html

TMDS(Transition Minimized Differential Signaling)
http://www.hdmi-navi.com/tmds/

HDMI
https://www.fpga4fun.com/HDMI.html

ADV7511 Xilinx Evaluation Boards Reference Design
https://wiki.analog.com/resources/fpga/xilinx/kc705/adv7511

その他

FPGA オリジナルボード設計 ~Xilinx FPGA の I/O ピンの使い方~
https://www.acri.c.titech.ac.jp/wordpress/archives/1244

Chiselでビットコインマイナーを設計してみる
https://msyksphinz.hatenablog.com/entry/2019/03/22/040000

AXI Basics Xilinx
https://support.xilinx.com/s/article/1137753?language=ja

Vitis HLS と Vivado で作った回路を PYNQ を使って FPGA 上で動かすまで
https://blog.n-hassy.info/2021/05/vitis-hls-to-fpga-1/

[FPGA] Vivado で ZedBoard 用のプロジェクトを作成

[FPGA] Vivado で ZedBoard 用のプロジェクトを作成

準備

電源と電源の隣に PROG と書かれた USB があるので、そこに接続する。FPGA にコンフィグ(書き込む)場合は、PROG への接続が必要。また、FPGA から出力をする場合は、UART と書かれた USB にも接続が必要。USB ケーブルは2本使う。

プロジェクト作成

Vivado 起動後の画面で、Create Project からプロジェクトを作成。

Project name に任意のプロジェクト名を指定し、次の画面では「RTL Project」を選択して、この時「Do not specity sources at this time」にチェックをいれておく。

ターゲットとなるボードを選択できるので、Search に ZedBoard と入力して、表示された「ZedBoard Zynq Evaluation and Development Kit」を選択。もし、表示されなければ「Refresh」を押せば更新されるかも。

この後に「Finish」を押せばプロジェクトが作られる。

ファイルの追加

Flow Navigator の Add Sources を選択すると追加用のダイアログが開くので、「constraints」と「design sources」をそれぞれ選択して追加していく。

「Add Files」から、それぞれ .xdc (constraints) や .v (design sources) などを追加していく。この時「Copy Sources into project」のチェックは off。「Scan and add RTL include files into project」のチェックは on にしておく。

Bitstream の生成

Design Sources と Constraints を追加したら Bitstream を生成する。左側のパネルの「PROGRAM AND DEBUG」から「Generate Bitstrea」を押す。

FPGA に書き込む

FPGA を PC に接続して電源を入れる。「PROGRAM AND DEBUG」の Open Hardware Manager -> Auto Connect を選択する。上部に「Program Device」が出てくるので、選択すると書き込める。

Reference

FPGA プログラミング大全 Xilinx 編

[FPGA] Verilog の覚書

[FPGA] Verilog の覚書

定数定義

//12bitの2進数定義
12’b000011110000;

//4bitの10進数定義
4’d15;

分岐

always @( posedge pck ) begin
    if ( reset )
        {vga_r, vga_g, vga_b} <= 12'b000000000000;
    else if ( disp_enable ) begin        
        vga_r = 4'hA;
        vga_g = 4'd0;
        vga_b = 4'd0;
    end
    else
        {vga_r, vga_g, vga_b} <= 12'b000000000000;
end

Reference

http://www.icrus.org/machida/product/verilog.pdf
https://isle3hw.kuis.kyoto-u.ac.jp/

[FPGA] Zedboard (Zynq) の開発環境 Vivado の導入

[FPGA] Zedboard (Zynq) の開発環境 Vivado の導入

ダウンロード

Zynq の開発には Vivado と Vitis を導入する。

ハードウェア開発には Vivado を使用し、ソフトウェア開発には Vitis が使用できる。どちらも Xlinx 統合インストーラからインストールが可能になっている。なお、ダウンロードにはユーザー登録が必要。

Xlinx のダウンロードページ
https://japan.xilinx.com/support/download/index.html/content/xilinx/ja/downloadNav/vivado-design-tools.html

インストール

インストール時に Vitis を選択すれば、Vivado と Vitis の両方がインストールされる。(Vivado を選択した場合は Vitis が入らないので注意)他の項目は全てデフォルトのチェックのままにした。

ドキュメント

Constrains

Vivado Design Suite ユーザー ガイ ド 制約の使用
https://www.xilinx.com/content/dam/xilinx/support/documents/sw_manuals_j/xilinx2021_2/ug903-vivado-using-constraints.pdf

set_property PACKAGE_PIN L16 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
create_clock -period 8.000 -name sys_clk_pin -waveform {0.000 4.000} -add [get_ports clk]

-period 8.0 -waveform {0.000 4.000}
周期の長さが 8ns で 4ns ごとの繰り返し。(125MHz)

set_property PACKAGE_PIN Y9 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
create_clock -period 10.000 -name sys_clk_pin -waveform {0.000 5.000} -add [get_ports clk]

-period 10.000 -waveform {0.000 5.000}
周期の長さが 10ns で 5ns ごとの繰り返し。(100MHz)

-period, -wveform の定義については、上記ドキュメントを参考。-name sys_clik_pin はクロック名を定義。

Zedboard のピン

Zedboard の Constrains は Digilent の Github に上がっているファイルを参考。
https://github.com/Digilent/digilent-xdc/blob/master/Zedboard-Master.xdc

例えば、クロックは Y9 だった。

set_property -dict { PACKAGE_PIN Y9   IOSTANDARD LVCMOS33 } [get_ports { clk }];
create_clock -period 10.000 -name sys_clk_pin -waveform {0.000 5.000} -add [get_ports clk]

set_property -dict { PACKAGE_PIN P16    IOSTANDARD LVCMOS18 } [get_ports { reset }];

set_property -dict { PACKAGE_PIN AA19   IOSTANDARD LVCMOS33 } [get_ports { vga_hs }];
set_property -dict { PACKAGE_PIN Y19    IOSTANDARD LVCMOS33 } [get_ports { vga_vs }];

set_property -dict { PACKAGE_PIN Y21    IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }];
set_property -dict { PACKAGE_PIN Y20    IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }];
set_property -dict { PACKAGE_PIN AB20   IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }];
set_property -dict { PACKAGE_PIN AB19   IOSTANDARD LVCMOS33 } [get_ports { vga_b[4] }];

set_property -dict { PACKAGE_PIN AB22   IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }];
set_property -dict { PACKAGE_PIN AA22   IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }];
set_property -dict { PACKAGE_PIN AB21   IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }];
set_property -dict { PACKAGE_PIN AA21   IOSTANDARD LVCMOS33 } [get_ports { vga_g[4] }];

set_property -dict { PACKAGE_PIN V20    IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }];
set_property -dict { PACKAGE_PIN U20    IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }];
set_property -dict { PACKAGE_PIN V19    IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }];
set_property -dict { PACKAGE_PIN V18    IOSTANDARD LVCMOS33 } [get_ports { vga_r[4] }];

定義メモ

参考

FPGA マガジン No.7

[FPGA] Tang Nano 9k を試す

[FPGA] Tang Nano 9k を試す

Tang Nano 9k

Tang Nano 9k は Sipeed 社の製品で、FPGA は Gowin 社のチップを使用している(Gowin GW1NR-9)。開発ツールは Gowin から提供されている Gowin EDA を使用する。

ドキュメント

Tang Nano 9k のドキュメントは下記にまとまっている
https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-9K/Nano-9K.html

Gowin EDA

Tang Nano 9k の場合は、Gowin Standard と Gowin Education の両方に対応しているみたい。Standard はライセンス申請が必要だが、Education は非商用・非製品向けであればそのまま使用できる(ユーザー登録は必要)。私は勉強目的でしか使用しないので、Version 1.9.8.09 Education 版を導入した。 

大した話ではないが、Sipeed 社のサイトでは Gowin IDE と表記されているが、Gowin 社のダウンロードサイトでは Gowin EDA という表記になっている。そして実際のソフトウェアは Gowin FPGA Designer という名称になっているので、若干の注意が必要。

L チカチュートリアル

L チカを行うチュートリアルは下記にまとまっている。
https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-9K/examples/led.html

詳しい内容は別にして、ひとまずこのチュートリアル通り進めていけば、Lチカは行う事が出来た。

openFPGALoader で検出できない

手元の環境では、Tang Nano 9k を接続して openFPGALoader.exe –detect を行っても検出が出来なかった。

unable to open ftdi device: -4 (usb_open() failed)
[31mJTAG init failed with: unable to open ftdi device[0m

原因は分からなかったが、Gowin EDA からそのまま書き込みは行えたので、大きな問題にはならなかった。

[FPGA] ATOM DISPLAY Lite を試す

[FPGA] ATOM DISPLAY Lite を試す

公式のドキュメントはここにある。
https://docs.m5stack.com/en/core/atom_lite

セットアップ

ATOM LITE を USB で接続する。ドキュメントには FTDI ドライバーをインストールして下さいとあったが、私の Windwos10 環境だと何もしなくても認識していた。ただ、念のため書かれている手順で手動でドライバーを導入。

Arduino IDE をインストール

Arduino IDE の導入は別にドキュメントがある。
http://docs.m5stack.com/en/quick_start/atom/arduino
この導入手順で進めていき、ページ最後に記述されているコードが正しく Upload できれば ATOM LITE の LED が点灯する。

M5AtomDisplay を利用して HDMI 出力

Arduino IDE をセットアップして ATOM LITE への書き込みが成功すれば、あとは下記ページの手順で ATOM Display を利用できる。
https://docs.m5stack.com/en/atom/atom_display_lite

ただ、私の環境だと

Leaving...
Hard resetting via RTS pin...

と、表示されても画面が黒いままだったが、一度、電源とHDMIの抜き差しを試したら、正しく表示された。

M5GFX を動かす

Github でコードが公開されている。
https://github.com/m5stack/M5GFX

examples フォルダの中にサンプルがあるので、これを Arduino IDE でビルドして転送すればよい。ATOM LITE Display で実行する場合は、コメントアウトされているインクルードヘッダ部分を修正する必要があるので注意。

ATOM Display FPGA Design

下記 Github にまとまっていた。貴重な情報に感謝。
https://github.com/ciniml/atom_display_fpga

[FPGA] Zedboard (Zynq) を試す

[FPGA] Zedboard (Zynq) を試す

FPGA を勉強しようと思い Zedborad を購入したが、インターネット上の情報は古いものが多く、リンク切れも起きていたりして中々必要な情報にたどり着けずに苦労した。

基本スペック

  • Zynq-7000 SoC XC7Z020-CLG484-1
  • 512 MB DDR3

https://www.xilinx.com/products/boards-and-kits/1-8dyf-11.html

Getting Started Guild

Zedboard のドキュメントにアクセスするには下記ページに行き、評価ボードのリストから「Zedboard」を見つける。
https://www.avnet.com/wps/portal/us/products/avnet-boards/

「Technical Documents」のタブの中に「ZedBoard Getting Started Guide」と書かれた pdf を開く。この Getting  Started Guild が購入後の最初の取っ掛かりになる。

スペックやドキュメントは、Digi-key のサイトにもまとまっている。
https://www.digikey.jp/ja/product-highlight/d/digilent/zedboard-zynq-7000-development-board
https://www.digikey.jp/ja/products/detail/digilent-inc/240-122/9841710

ここからデータシートへもアクセス出来る。

SD カードから起動

付属のSDカードから起動する場合、JP10 と JP9 の2つのジャンパーの設定位置を上にする。(それ以外はSIG-GND)。JTAG から書き込む場合?は、全て下に設定しておく。

USB UART Driver のインストール

下記のページにアクセスする。
https://www.infineon.com/cms/en/design-support/

Development Tools から「USB Software」を選択。「USB-Serial Software Development Kit」のリンクから「USB-Serial Windows Driver Installer」を見つける。ダウンロードするためにはユーザー登録が必要

TeraTerm で通信する

最新の TeraTerm を落としてきて導入する。インストール時の設定は全てデフォルトのままで大丈夫だった。
https://ja.osdn.net/projects/ttssh2/releases/

USB は UART に繋ぎ、ZedBoard の電源を入れて TeraTerm を立ち上げる。最初の「Tera Term:New connection」ダイアログはキャンセルして閉じる。

Setup -> Serial Port から下記のように「Speed」を115200、「Transmit delay」にそれぞれ 10 msec/char と 100 msec/line と入力して「New open」を選択する。

キーボードの Enter キーを押して「zynq」と表示されたら通信が成功している。Linux が起動しているみたいなので、適当なコマンドを入力すれば結果が返ってくる。

後は Getting Started Guide に書かれている順番通りに実行していけば、動作確認などが行える。