Vivadoの変更をVitisに取り込む

Vitisでプロジェクトを作りデバッグを開始した後に、Vivadoで回路を変更してその変更を反映したいことがある。 Vivadoからxsaを上書きしただけでは、その変更はVitisに取り込まれていない。

Explorerでplatformを右クリック、「Update Hadware Specification」をクリック。しばらく待つ。

正しくxsaファイルが指定されていれば「OK」をクリック。しばらく待つ。

これでxsaファイルの取り込みが完了した。

MiniZedでLチカ(3) Vitis

Avent社のFPGAボード MiniZedでLチカする手順です。前の記事でBitstreamを出力するところまで済ませました。この記事ではLチカまでを書きます。

開発環境

Vitisの起動

f:id:otto5:20210623162630p:plain

Tools -> Laungh Vitis IDE をクリック

f:id:otto5:20210623163729p:plain

プロジェクトルートを指定してLaunghをクリック

Platform Projectの作成

f:id:otto5:20210623163900p:plain

Create Platform Projectをクリック

f:id:otto5:20210623164008p:plain

Platform project nameを入力してNextをクリック

f:id:otto5:20210623164129p:plain

プロジェクトルートにVivadoから出力したxsaファイルがあるのでこれを指定してFinishをクリック

Application Projectの作成

f:id:otto5:20210623164304p:plain

File -> New -> Application Project をクリック

f:id:otto5:20210623165522p:plain

Nextをクリック

f:id:otto5:20210623165543p:plain

Nextをクリック

f:id:otto5:20210623165856p:plain

Application project name入力してNextをクリック

f:id:otto5:20210623165655p:plain

Nextをクリック

f:id:otto5:20210623170436p:plain

Finishをクリック

プログラム記述

f:id:otto5:20210623182301p:plain

helloworld.c内にLチカするプログラムを追加します。 Hardware User GuideのTable 13 – Allocation of MIO pinsを見ると、LEDは52番ピンと53番ピンにつながっていることが分かります。

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "sleep.h" // sleep()に必要
#include "xgpiops.h" // gpio操作に必要


int main()
{
    XGpioPs_Config *cfg;
    XGpioPs ins;

    init_platform();
    cfg = XGpioPs_LookupConfig(XPAR_XGPIOPS_0_DEVICE_ID);
    XGpioPs_CfgInitialize(&ins, cfg, cfg->BaseAddr); // gpioのconfigを初期化

    // ピンの入出力を指定 第3引数が0で入力, 1で出力
    XGpioPs_SetDirectionPin(&ins, 52, 1); 
    XGpioPs_SetDirectionPin(&ins, 53, 1);
    // ピンの出力を有効化
    XGpioPs_SetOutputEnablePin(&ins, 52, 1); 
    XGpioPs_SetOutputEnablePin(&ins, 53, 1);

    print("Hello World\n\r");
    print("Successfully ran Hello World application");

    while(1) {
        XGpioPs_WritePin(&ins, 53, 0);
        sleep(1);
        XGpioPs_WritePin(&ins, 52, 1);
        sleep(1);
        XGpioPs_WritePin(&ins, 53, 1);
        sleep(1);
        XGpioPs_WritePin(&ins, 52, 0);
        sleep(1);
    }

    cleanup_platform();
    return 0;
}

プログラムの書き込み

まず、ボードのディップスイッチを書き込みモードになっていることを確認します。 HW Users Guideの5章 Boot Modes をみると、JTAG Boot Modeを選択するにはMIO[5], MIO[4], MIO[3]をすべて0にすれば良いことが分かります。さらに、Table 15 – Boot Mode Switch Selectionsを見るとBoot Mode SwitchをJにすれば良いことが分かります。

f:id:otto5:20210624223550p:plain

続いて、USB JTAG UART のMicro USBポートとPCを接続して、プログラムをZynqに書き込みます。

f:id:otto5:20210624223651p:plain

Xilinx -> Program Device をクリック

f:id:otto5:20210624223801p:plain

Program をクリック ボードのDONE LED(青色)が点灯すれば完了です。

プログラムのビルド

f:id:otto5:20210624221834p:plain

LedBlink_system[System]を右クリック -> Buildをクリック

f:id:otto5:20210624222018p:plain

Console にエラーがなくビルドが終了していれば成功です。

プログラムの実行

f:id:otto5:20210624224954p:plain

Debugを右クリック -> Run -> Debugger_LedBlink-Default (Single Application Debug) をクリック

PS LEDが赤 -> 黄 -> 緑 -> 滅 と点滅します。

参考にさせていただいたサイト

ハードもソフトもZynqで開発3 | 株式会社コンピューテックス

MiniZedでLチカ(2) Vivado

Avent社のFPGAボード MiniZedでLチカする手順です。前の記事で環境構築を済ませました。この記事ではVivadoでプロジェクトを作成してBitstreamを出力するところまでを書きます。

開発環境

Vivadoプロジェクトの作成

f:id:otto5:20210622213959p:plain

Create projectをクリック

f:id:otto5:20210622214416p:plain

Next

f:id:otto5:20210622215225p:plain

プロジェクト名(今回はMiniZedLedBlinkにしました)とパスを入力してNextをクリック

f:id:otto5:20210622215936p:plain

Do not specify sources at this timeにチェックを付けてNextをクリック

f:id:otto5:20210622215614p:plain

BoardタブでMiniZedを選びNextをクリック

f:id:otto5:20210622220205p:plain

Finish

回路記述

記述と言ってもほとんどGUIでできてしまいます。すごい。

f:id:otto5:20210622220716p:plain

Create Block Designをクリック

f:id:otto5:20210622220742p:plain

OKをクリック

f:id:otto5:20210622221151p:plain

プラスボタンをクリック

f:id:otto5:20210622221238p:plain

ZYNQを検索して選択

f:id:otto5:20210622221419p:plain

Run Block Automationをクリック

f:id:otto5:20210622221843p:plain

OKをクリック

f:id:otto5:20210622222102p:plain

Source -> Design Sources -> Create HDL Wrapper OKをクリック

f:id:otto5:20210622222344p:plain

ビットストリームの生成

f:id:otto5:20210622222532p:plain

Generate Bitstreamをクリック

f:id:otto5:20210622222627p:plain

Yesをクリック

f:id:otto5:20210622222645p:plain

OKをクリック

f:id:otto5:20210622222946p:plain

Cancelをクリック

ビットストリームの出力

f:id:otto5:20210622223035p:plain

File->Export Hardware

f:id:otto5:20210622223122p:plain

Nextをクリック

f:id:otto5:20210622223249p:plain

Include bitstreamを選択してNextをクリック

f:id:otto5:20210622223336p:plain

Nextをクリック

f:id:otto5:20210622223404p:plain

Finishをクリック

参考にさせていただいたサイト

ハードもソフトもZynqで開発2 | 株式会社コンピューテックス

MiniZedでLチカ(1) 環境構築

Avent社のFPGAボード MiniZedでLチカするための環境を構築します。

開発環境

MiniZedの製品ページからマニュアルやBoard Definition Filesをダウンロードしておきます。

IDEのインストール

f:id:otto5:20210622164108p:plain

Next

f:id:otto5:20210622164152p:plain

2019.2 のリリースより、ザイリンクス SDK 開発環境は、Vitis 統合ソフトウェアプラットフォームに統合されました。ここでVivadoを選ぶとVitis(SDKの後継)がインストールされません。 Vitisを選びNext

f:id:otto5:20210622170227p:plain

ディスク使用量が多いので必要なものだけ選びNext

f:id:otto5:20210622170321p:plain

同意してNext

f:id:otto5:20210622170340p:plain

Next

f:id:otto5:20210622170401p:plain

Yes

f:id:otto5:20210622170418p:plain

Install 途中で何回かUAC等が出てくるので進めます。

f:id:otto5:20210622172035p:plain

OK

これでインストールは完了です。

Board Definition Filesの追加

MiniZedの製品ページからダウンロードしたBoard Definition Filesを解凍する(2つのZipが入れ子になっているので両方解凍)と、minizedフォルダがあります。これを”C:¥Xilinx¥Vivado¥2020.2¥data¥boards¥board_files”にコピーします。

Cyclone V GT FPGA Development KitでHello, world!

Cyclone V GT FPGA Development Kitにはキャラクタ液晶(LCD)が付いているので何かと便利に使えそうだ.

さぁ適当なIPをインポートしてサクッとHello, world!と思ったら,そのような便利なIPは(少なくとも無償では)無いらしい.えーI2C通信自分で書くの・・・.今までマイコン等でI2Cの何かを使うときはライブラリの上から適当に使ってきたので,信号の細かな動きは全く知らない.仕方ないので調べながら書いた.この界隈そんなに人少ないのか・・・.

資料

公式のユーザーガイドとリファレンスマニュアル.

https://www.intel.co.jp/content/dam/altera-www/global/ja_JP/pdfs/literature/ug/ug_cvgt_fpga_dev_kit.pdf

https://www.intel.co.jp/content/dam/altera-www/global/ja_JP/pdfs/literature/manual/rm_cvgt_fpga_dev_board.pdf

LCDのデータシート

http://www.newhavendisplay.com/specs/NHD-0216K3Z-NSW-BBW-V3.pdf

環境

プロジェクトファイル一式:https://github.com/SenriYoshikawa/CycloneVGTFPGADevelopmentKit/tree/master/LCD

仕様

  • PB0を押すとリセット
  • PB1を押すとLCDをクリア
  • PB2を押すとLCDに「Hello, world!」を表示

実装

コードすべての説明を書くとかなりの量になりそうなので,特に詰まったところだけメモがてら書き残す.

inoutピン

SCLとSDAは場合により入力にも出力にもなり得る.そんなものどうやってVerilogで書くのだと思い調べたところ,inout宣言した入出力ポート(wire)に対して,条件によりregか'z'(ハイインピーダンス)をassignすればよいらしい.

こんな感じ.

assign i2c_sda   = sda_valid ? sda_reg : 1'bz;

自分(FPGA)はマスターなので,出力したいときはsda_validをHighにしてsda_regに書き込み,スレーブの応答を見たいときはsda_validをLowにしてi2c_sdaを読めば良い.

SCLのためのクロック生成

I2Cの詳細については丁寧に解説しているサイトがたくさんあるのでそちらに譲る.FPGAで実装しようとしてまず困ったのは,I2Cのクロック信号(SCL)がせいぜい数百kHzまでしか対応しないらしく,PLLではそこまで遅いクロックを作ることができないことだ.

仕方がないので以下のような何とも言えないモジュールを書いた.50MHzクロックでカウンタを動かし,50KHzのクロックを生成している.一応動いているので良しとしているが,より良い方法ご存じの方教えてください・・・.

ちなみに,なぜリセットのエッヂ検出をしているかというと,リセット中にカウントが止まるとクロックも止まり,50Kで同期しているレジスタをリセットできないからだ.ここも少し嵌った.

module Clk50K(
    input clk_50M,
    input rstn,
    output reg clk_50K
);

reg [1:0] rstn_buf;
reg [9:0] count_50K;

// rstn_buf
always @(posedge clk_50M) begin
    rstn_buf <= {rstn_buf[0], rstn};
end

// count_50K
always @(posedge clk_50M) begin
    if(rstn_buf == 2'b10) begin
        count_50K <= 0;
    end else if(count_50K >= 499) begin
        count_50K <= 0;
    end else begin
        count_50K <= count_50K + 10'd1;
    end
end

// clk_50K
always @(posedge clk_50M) begin
    if(rstn_buf == 2'b10) begin
        clk_50K <= 1'b0;
    end else if(count_50K >= 499) begin
        clk_50K <= ~clk_50K;
    end else begin
        clk_50K <= clk_50K;
    end
end

endmodule

SCLとSDAの同期

SCLはSDAに対するクロックで,通常のデータ転送においてはSCLがLowの間にSDAを書き換える同期回路でよく見る動作なのだが,スタートシーケンスではSCLがHighの間にSDAをLowに,ストップシーケンスではSCLがHighの間にSDAをHighにしなければならない.

この動作を実現するために,2ビットのひたすらインクリメントするレジスタを設け,この上位ビットをSCLに繋いだ.

reg[1:0]scl_reg scl
2'b01 0
2'b10 1
2'b11 1
2'b00 0

これによりSCLがHighとLowのそれぞれで2クロックあるので,SCLがHighの間にSDAを操作したければ,scl_regが2'b10の時に代入すればよい.通常のデータ代入はscl_regが2'b00か2'b01の時に行えばよい. しかし後で見たら自分でも首を傾げそうな実装だ.みんなどうしてるんだろう.

その他

あとは初めに思ったほどややこしいことはなく,愚直に書いたら動いた.

ピン配置

LCDのピンがどこにつながっているかはリファレンスマニュアルのP2-25に書いてある.

LEDはデバッグ用に3つ繋いでいるがなくても動く.

f:id:otto5:20200317172933p:plain

書き込み・動作確認

例によってデバイスチェーンに気を付けて書き込んで動作確認.

f:id:otto5:20200317161225j:plain

動いた.うれしい.

Cyclone V GT FPGA Development KitでLチカする

ボードを手に入れたらとりあえずLチカしたい.適当にググってその通りにすれば30分で終わるでしょ,と思っていたら全然情報がなくて普通に時間かかったのでメモ. 基本的に頼りになるのは公式のユーザーガイドとリファレンスマニュアル.

https://www.intel.co.jp/content/dam/altera-www/global/ja_JP/pdfs/literature/ug/ug_cvgt_fpga_dev_kit.pdf

https://www.intel.co.jp/content/dam/altera-www/global/ja_JP/pdfs/literature/manual/rm_cvgt_fpga_dev_board.pdf

環境

  • Windows 10 1903
  • Quartus Prime 18.1 Standard Eiditon

プロジェクトファイル一式:https://github.com/SenriYoshikawa/CycloneVGTFPGADevelopmentKit/tree/master/PushButtonLED

Verilogを書く

PB(Push Button)1とPB2の状態をラッチするレジスタを用意し,これをLEDへの出力とする.あまり意味はないが,PB0をリセット信号として使い,レジスタを初期化するようにした.PB1を押すとLED0が,PB2を押すとLED1が点灯する.

module PushSwitchLED(
    input clk,
    input rstn,
    input [1:0] button,
    output reg [1:0] led
);

// led
always @(posedge clk_50M) begin
    if(~rstn) begin
        led <= 2'b11;
    end else begin
        led <= button;
    end
end

PushSwitchLED.vとしてプロジェクトフォルダ直下に保存しておく.

プロジェクトを作る

File -> New Project Wizard

Next

プロジェクトフォルダの場所とプロジェクト名を入力してNext

Next

Add Allで先に保存したPushSwitchLED.vがリストに入る -> Next

Board -> Cyclone V GT FPGA Development Kit -> Next

Simulationは好きなのを選べばいいともう.Finish

ピンアサイ

先にAnalysis & Synthesis をしておく.

Pin Plannerを起動.

Assignment -> Pin Planner

何をどこにつなげばいいのかはリファレンスマニュアルを見ればわかる. clkは何でもよいが50MHzのPIN_V28を繋いだ.リファレンスマニュアルP2-20を参照. プッシュボタンとLEDはリファレンスマニュアルP2-23とP2-24を参照.

Pin Plannerを閉じる.

書き込み

先にStart Compilationしておく.

その間にFPGAボードにACアダプタとUSBケーブルを接続する.ディップスイッチがデフォルトになっていることを確認(詳細はユーザーズガイドを参照)し,電源を入れる.

Programmerを起動する. Tools -> Programmer

Hardware Setup

USB-BlasterIIを選択してClose.

ここで意気揚々とStartを押すと失敗する.このボードにはCyclone Vの他にMax Vが載っていて,書き込む対象がCyclone Vだけでも両方のFPGAを含むJTAGチェーンを構成しないと書き込めないらしい.そんなの言われなきゃ分からないって・・・.

Auto Detect

一番近いものを選びOK.

これが正常なフローなのか自信を無くしながらYes.

Cyclone VのFileにoutput_files/PushButtonLED.sofが入り,Program/Configureにチェックが入っていればOK.こうなっていなければ,左側のChange Fileから手動でファイルを差し替えてこの状態にする.Startで書き込みを開始する.

動作確認

Programmer右上の進捗バーが100%になれば書き込みは終わっているはず.

ボード上のプッシュボタンを押すとLEDが光る.これだけでも動くとうれしい.

Cannot launch the ModelSim-Altera software because you did not specify the path to the executables of the ModelSim-Altera software.

f:id:otto5:20190410105252p:plain

ModelSimのパスが分からないよと. インストーラが同時にインストールしているのだか自動で設定してくれても良さそうなものだが・・・.

Tools->Options->General->EDA Tool Optionsでパスを設定すれば良い. f:id:otto5:20190410105527p:plain