[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