Begin Again

Begin Again

technology

Hardware Programming with Chisel #2 Hello, Chisel!

今回は前回のブログの続きとして、chiselでのFPGA開発環境の構築から実機での動作テストまで行いたいと思う。
前回のブログはこちら。 orihasam.hatenadiary.com FPGA評価ボードにはXilinx社のspartan-7が搭載された、ARTY-S7を使用した。

ザイリンクス Artix-7 35T Arty FPGA Evaluation Kit 【AES-A7MB-7A35T-G】

価格:18,392円
(2021/1/23 18:52時点)

まずは、FPGAの開発環境を構築する。

verilatorのインストール

chiselで設計した回路シミュレーションを行うC++コードを出力するために、 Verilatorをインストールする。
まず、依存パッケージをインストールする。

$ sudo apt install git make autoconf g++ flex bison

次にVerilatorのgitをクローンする。

$ git clone http://git.veripool.org/git/verilator
cd verilator
$ git pull
$ git checkout -b verilator_3_922 refsw/tags/verilator_3_922

verilatorをビルドする。

$ unset VERILATOR_ROOT
$ autoconf
$ ./configure
$ make
$ sudo make install

vivadoのインストール

chiselで開発した回路は、VerilogHDLファイルとして出力される。この回路をxilinx製のFPGAに書き込むためにvivadoというソフトウェアを用いる。
なおvivadoのインストーラの入手には、xilinx社のアカウント登録が必要である。
まず、ダウンロードしたファイルに実行権限を付与する。

$ sudo chmod +x Xilinx_Unified_2020.2_1118_1232_Lin64.bin

実行する。

$ sudo ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin

GUIのインストラクションどおりにVivado HL WebPACKをインストールする。

インストール完了後、vivadoを起動するにはターミナルで以下のコマンドを入力する。

vivado

ケーブルドライバをインストール

xillinx virtual cableのドライバをインストールする。ドライバをインストールしないとFPGAに書き込むことができない。

$ cd /tools/Xilinx/Vivado/2020.2/data/xicom/cable_drivers/lin64/install_script/install_drivers
$ sudo ./install_drivers

評価ボードのボードファイルをgithubリポジトリからクローンする。今回はDigilent社のArty S7-50を用いたため、Digilent社のgithubからクローンしている。

$ git clone https://github.com/Digilent/vivado-boards.git
$ sudo cp -r vivado-boards/new/board_files/* /tools/Xilinx/Vivado/2020.2/data/boards/board_files

ようやく準備が整ったので、chiselプログラミングしていく。FPGAボードとして、DIGILENT社のXilinx fpga評価ボードArty-s7-50を使用する。 まずは、評価ボードに搭載されているLEDを点灯することから始める。githubリポジトリをクローンしてchiselテンプレートを入手する。

$ git clone https://github.com/ucb-bar/chisel-template.git led_on
$ cd led_on
$ rm -r src/main/scala/* src/test/scala/*
$ rm -rf .git
$ git init
$ git add .gitignore *
$ vim build.sbt

build.sbtを以下のように編集する。

// See README.md for license details.

ThisBuild / scalaVersion     := "2.12.12"
ThisBuild / version          := "1.0.0"
ThisBuild / organization     := "Individual"

lazy val root = (project in file("."))
  .settings(
    name := "led_on",
    libraryDependencies ++= Seq(
      "edu.berkeley.cs" %% "chisel3" % "3.4.1",
      "edu.berkeley.cs" %% "chiseltest" % "0.3.1" % "test"
    ),
    scalacOptions ++= Seq(
      "-Xsource:2.11",
      "-language:reflectiveCalls",
      "-deprecation",
      "-feature",
      "-Xcheckinit"
    ),
    addCompilerPlugin("edu.berkeley.cs" % "chisel3-plugin" % "3.4.1" cross CrossVersio    n.full),
    addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full    )
  )

chiselプログラムの作成

verilogファイルを出力するためのchiselプログラムを作成する

$ vim ./src/main/scala/led_on.scala

以下のように記述する。

// chiselパッケージをインポート
import chisel3._

// LEDを点灯するクラス
class led_on extends Module {
 /** 入出力(input/output)ポートを定義
  * IOにledという出力ポートを代入 
  */
 val io = IO(new Bundle {
  //bool値を取る出力ポートを定義
  val led = Output(Bool())
 })

 //出力ポートをtrueにする(ポートに電位差を与える)
 io.led := true.B
}

//verilogファイルを作成する
object led_on extends App {
 chisel3.Driver.execute(args, () => new led_on())
}

簡単にスクリプトの解説をすると、class led_on extends Module {...}で、クラスを宣言している。
val io = IO(...)では、入出力ポートを宣言している。
new Bundle {...}には、入出力信号を含むハードウェア構成を記述している。
val led = Output(Bool())は、ledと名付けられたポートがアウトプットポートであり、boolean型の信号を持つことを記述している。
:=演算子は、演算子の右側の信号によって、左側の信号が駆動されることを示している。
true.Bはtrue値をとるBooleanを意味している。
scalaプログラムを実行する。

$ sbt run

以下のようなverilogファイルが生成される。

module led_on(
  input   clock,
  input   reset,
  output  io_led
);
  assign io_led = 1'h1; // @[led_on.scala 12:9]
endmodule

FPGAへの書き込み

先程作成したverilogファイルをvivadoで読み込み、評価ボードの制約ファイルを編集することでFPGAに書き込むことができる。制約ファイルは評価ボードメーカからダウンロードできる。
今回使用したArty-s7 50の場合は、次のgithubで提供されている。

github.com

  1. vivadoを起動し、create projectをクリック。 f:id:Orihasam810:20210123183658p:plain
  2. project nameとproject locationを設定する。 f:id:Orihasam810:20210123183702p:plain
  3. RTL projectを選択してNext f:id:Orihasam810:20210123183706p:plain
  4. Add Filesで先程作成したverilogファイル"led_on.v"を選択する。Target LanguageはVerilogにしておく。 f:id:Orihasam810:20210123183712p:plain
  5. 制約ファイルを追加する。制約ファイルは、verilogファイルに合わせて編集するため、copy constraints files into projectにチェックをつけておき、元ファイルを残しておく。 f:id:Orihasam810:20210123183716p:plain
  6. 評価ボードを選択する。 f:id:Orihasam810:20210123183720p:plain
  7. 制約ファイルの以下の部分を編集して、led[0]をio_ledにする。 f:id:Orihasam810:20210123183725p:plain
## LEDs
set_property -dict { PACKAGE_PIN E18   IOSTANDARD LVCMOS33 } [get_ports { io_led }]; #IO_L16N_T2_A27_15 Sch=led[2]
#set_property -dict { PACKAGE_PIN F13   IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L17P_T2_A26_15 Sch=led[3]
#set_property -dict { PACKAGE_PIN E13   IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[4]
#set_property -dict { PACKAGE_PIN H15   IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L18P_T2_A24_15 Sch=led[5]
  1. 評価ボードをPCとUSB接続する f:id:Orihasam810:20210123183818j:plain
  2. 左タブのprogram and debugからopen targetを選択し、Auto connectする。 f:id:Orihasam810:20210123183730p:plain
  3. 左タブのRun synthesisを選択し、合成を実行する。 f:id:Orihasam810:20210123183735p:plain
  4. 合成が完了したら、そのままRun implementationにチェックを入れて実行する。
    f:id:Orihasam810:20210123183740p:plain
  5. Implementation completedダイアログが表示されたら、generate bitstreamにチェックを入れて実行する。

f:id:Orihasam810:20210123183748p:plain

  1. bitstream generation completedダイアログが表示されたらcancelをクリック。 f:id:Orihasam810:20210123183757p:plain

  2. 左タブのprogram deviceをクリックし表示される"xc7s50_0"をクリックする。

  3. bitstream fileに先程作成したbitstream fileのパスが最初から入っているのでそのままprgramボタンをクリックしてFPGAに書き込む。 f:id:Orihasam810:20210123183802p:plain

  4. FPGA評価ボードに搭載されているLEDが点灯する。 f:id:Orihasam810:20210123183826j:plain

※Open Implemented Designをクリックし、Netlistタブのled_onを右クリックしてschematicを選択すると回路図が表示される。 f:id:Orihasam810:20210123183807p:plain f:id:Orihasam810:20210123183812p:plain

おわりに

今回は単純にLEDを点灯するだけの回路を作成した。次回以降はより実用的な回路作成について書いていきたいと思う。

【送料無料】 Scalaスケーラブルプログラミング 第3版 / マーティン・オダースキー 【本】

価格:5,060円
(2021/1/23 14:38時点)

【POD】Chiselを始めたい人に読んで欲しい本 (技術の泉シリーズ(NextPublishing)) [ 七夕 雅俊 ]

価格:2,750円
(2021/1/23 14:38時点)