Browsed by
Month: 2022年11月

[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 編

[Linux] Ubuntu22.04 が起動しない

[Linux] Ubuntu22.04 が起動しない

gave up waiting for root file system device. common problmes:

というメッセージが表示されて、新規インストールした Ubuntu が起動出来ないことがあった。この場合、一度 HDD をフォーマットして、再度インストールし直したら上手く行った。以下、自己責任で行ってください。

HDD をフォーマット

HDD に問題がありそうだったのでフォーマットする。もちろん HDD が初期化されるので、実行する場合は要注意。該当の HDD を接続している状態で、PC を Windows から起動するように変更する。まずは diskpart.exe から clean した。

list disk
select disk 1 ※1部分は、list disk の結果をもとに、ディスク番号を指定
clean

その後、スタートボタンを右クリックして「ディスクの管理」を立ち上げる。該当のボリュームを選択して、右クリックから「新しいシンプルボリューム」でフォーマットを実行した。

再度インストール

HDD を初期化した後に、再度 Ubuntu をインストールしたら、今度は正常に起動できた。

[Linux] Ubuntu 22.04 のインストール

[Linux] Ubuntu 22.04 のインストール

個人的なメモ。詳細は公式サイトを参照。
安易に実行すると、普段使用している PC の HDD の内容が消えるので実行には注意。

準備

手順

Ubuntu の Image ファイルをダウンロードして、balenaEtcher を使用して USB に書き込む。

Flash from file からダウンロードした iso ファイルを選択。Select target で書き込み先の USB を選択して、後は Flash! を押せば完了する。私の環境だと2分ぐらいで終了した。

インストール1

インストール作業は導入するマシンによってやり方が異なる。

Mac Mini へのインストール

古くなった Mac Mini へインストールを行う。USB を挿入して、キーボードの Option(Alt)キーを押しながら Mac Mini の電源を入れる。 そうすると、Boot するストレージを選べる画面に入るので、USB を選択して次へ進める。なお、Mac Mini を接続しているディスプレイが 4K だと正しく画面が表示されないことがあったので注意。

Windows PC へのインストール

書き込み先の PC を起動して、すぐに F2 キー(環境によってキーは異なる)を連打して UEFI (BIOS) に入り、Boot Mode から 1st Boot Device を USB Storage Device に変更する。その後、作成した USB フラッシュメモリーを指して再起動する。

インストール2

黒い画面が出るから「Try or Install Ubuntu」を選択して、インストールを進めていく。インストール言語とキーボードは自分の環境に合わせて選択。後は、デフォルトのままインストールを進めて完了。インストールが完了すると USB を抜いてくださいというメッセージが出るので、抜いて Enter を押すと、HDD にインストールした Ubuntu が立ち上がる。

使用したUSBのフォーマット

Ubuntu を書き込んだ USB フラッシュメモリが Windows では認識できなくなる。フォーマットするには diskpart.exe を管理者で立ち上げて、下記コマンドを順に入力していく。

list disk
select disk 3 ※3部分は、list disk の結果をもとに、ディスク番号を指定
clean
create partition primary
format fs=fat32 quick

select disk するときに、選択するディスクを間違わないように注意する。

Reference

https://ubuntu.com/tutorials/install-ubuntu-desktop#1-overview

[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 に書かれている順番通りに実行していけば、動作確認などが行える。

[DXGI] DirectX グラフィックス インフラストラクチャ

[DXGI] DirectX グラフィックス インフラストラクチャ

レンダリングを行う機能と、レンダリング結果(フレームバッファの内容)を画面に表示する機能は別に分かれている。前者は DirectX と呼ばれ、後者は DXGI (DirectX Graphic Infrastructure) と呼ばれる仕組みが担ってる。

このような機能の分割は、他のグラフィックス API でも同様で、例えば OpenGL であれば、ネイティブの描画部分は EGL という仕組みで独立しており、Vulkan であれば WSI という仕組みが提供されている。

DXGIの呼び出し方

DXGI は DirectX よりも前に初期化が必要。DXGI の生成順序としては、まず Factory を生成し、Factory から PC の Adapter (GPU) を取得。ここで取得した GPU を初期化して、表示用のフレームバッファ (SwapChain) の領域を確保。このフレームバッファに描画したものを Present することによって、SwapChain が画面表示の管理を行ってくれる。

Factory と Adapter の生成

Microsoft::WRL::ComPtr<IDXGIFactory6> dxgiFactory;
CreateDXGIFactory2(dxgiFactoryFlags, MY_IID_PPV_ARGS(&dxgiFactory));

IDXGIFactory を CreateDXGIFactory に渡すことで Factory が作られる。インターフェースや関数名に数字がついているが、これは過去に拡張された事を表している。現在のバージョン番号である。

Factory が作られれば Factory が持つ EnumAdapter などを呼び出して、IDXGIAdapter が取得できる。

取得した IDXGIAdapter を D3D12CreateDevice に渡せば、ここで初めて DirectX が初期化できる。ちなみに Adapter は無くても D3D12CreateDevice は初期化できるが、GPU の情報にアクセス出来るので作っておいた方が無難。

Swapchain

Factory から作られる、もう一つ重要なインターフェースが IDXGISwapChain である。これが無いと、レンダリング結果の表示が行えない。

ComPtr<IDXGISwapChain1> swapChain;
factory->CreateSwapChainForHwnd(
        m_commandQueue.Get(),        // Swap chain needs the queue so that it can force a flush on it.
        Win32Application::GetHwnd(),
        &swapChainDesc,
        nullptr,
        nullptr,
        &swapChain
);

CreateSwapChain の引数には SwapChain Desc を渡す。この内容でフレームバッファが作られる。

DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};
swapChainDesc.BufferCount = FrameCount;
swapChainDesc.Width = m_width;
swapChainDesc.Height = m_height;
swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
pChainDesc.SampleDesc.Count = 1;

CreateSwapChain を行ったときに VRAM 上にフレームバッファの領域が確保され、ここで確保したバッファを Render Target として使用することによってピクセルを更新する。

最後に SwapChain の Present メソッドを呼び出すことによって、バッファの内容がモニター等に出力される。

全画面モードや描画サイズの変更

ゲームの全画面表示や、描画解像度の変更などは DXGI を経由して行われる。例えば IDXGIFactory::MakeWindowAssociation を呼び出すことによって、Alt + Enter で全画面表示に移行できる。全画面遷移など、ウインドウが変更された場合 WndProc で WM_SIZE メッセージが来る。このメッセージによって、SwapChain->ResizeBuffers を呼び出せばフレームバッファのサイズ変更が行える。

フレームバッファが変わったら、他の RenderTarget の再生成も行う必要があるので、同じように WM_SIZE メッセージで処理することになる。

その他重要なインターフェース

IDXGIOutput

IDXGISwapChain から取得できる。GetDesc() を呼ぶ出すことによってディスプレイの表示解像度などの情報を取得することが出来る。

ComPtr<IDXGIOutput> pOutput;
ThrowIfFailed(pSwapChain->GetContainingOutput(&pOutput));
DXGI_OUTPUT_DESC Desc;
ThrowIfFailed(pOutput->GetDesc(&Desc));

2022年11月現在、IDXGIOutput6 が最新のインターフェースになっていて、GetDesc1() を呼び出すことで、ディスプレイのカラースペースや表示輝度などの情報をとることが出来る。

ComPtr<IDXGIOutput6> output6;
ThrowIfFailed(pOutput.As(&output6));

DXGI_OUTPUT_DESC1 desc1;
ThrowIfFailed(output6->GetDesc1(&desc1));

HDR に関してはこちらのドキュメントを参考。

過去の DirectX

昔の DirectX では、IDirect3DDevice が Present メソッドを持っていたみたい。DirectX9 までは DirectX API と低レベルの描画機能が一緒になっていたが、DirectX10 から DXGI として分離された。

Reference

https://learn.microsoft.com/ja-jp/windows/win32/direct3ddxgi/dx-graphics-dxgi
https://learn.microsoft.com/ja-jp/windows/uwp/gaming/moving-from-egl-to-dxgi