2022年12月号 別冊付録2500円ボードで始めるFPGA開発 サポート・ページ

Interface誌 2022年12月号の別冊付録は,FPGA開発初心者向けの70ページとなっています.

記事の内容は¥2,500程度で買えるFPGAボードで試せます(一部の記事は別途モータなどが必要).

 

これまで,個人でFPGA開発を試しやすい環境はあまりありませんでしたが,下記のボードとGOWINのソフトウェアによって,だれでもFPGAを体験しやすくなりました.

 

今回の別冊付録(Vol2)では,SystemVerilogの解説は割愛していますが,ソフトウェア開発者などにもFPGA開発を試しやすい内容になっています.FPGAで使う基礎的な回路についてはInterface誌2021年12月号の別冊付録も参照してください.

 

▲別冊付録向けデータ ダウンロード・ページ

▲応用編第3章&第4章用最新データ(GitHubリポジトリ)

Python編用データ(GitHubリポジトリ

▲おまけ 井田氏によるGowin FPGA LittleBeeシリーズ向けサンプル・デザイン

 

 

●ボードの入手先

ターゲット・ボードは,Gowin FPGAを搭載しているTang Nano 9K(Sipeed)です.秋月電子通商で約2500円で購入できます.

https://akizukidenshi.com/catalog/g/gM-17448/

裏面

表面

 

 

 

 

 

 

 

●PCがあれば開発可能

付属のUSBケーブルでPCと接続するだけで,ビットストリームの書き込みやデバッグが可能です.

誌面では,ブレッドボードを使ってLEDマトリクスなどを制御しています.

 

●開発環境Gowin EDAの入手先

統合開発環境はメーカ・ウェブ・サイトより無償でダウンロードできます.

(Education版は,アカウント登録のみでダウンロード可能.開発環境実行時にライセンス不要)

 

記事の紹介

■基礎編第1章~第4章

●第1章 ターゲット・ボードの紹介

国内でも¥2,500程度で購入できる,FPGAボードTang Nano 9K(Sipeed)を紹介します.

GOWINのFPGAについても紹介しています.

 

●第2章 開発環境構築(Windows,Linux,Intel Mac)

GOWINの提供する統合開発環境 Gowin EDA のインストール方法を紹介します.

 

●第3章 Lチカ

HDLを書いて,まずはLEDを点滅させてみます.

 

●第4章 LEDマトリクス制御

▲マトリクスLED(OSL641501-ARA)の接続について

CQ と表示している.

このLEDには16本の端子があります.これらの端子と行/列(ROWおよびCOL)との対応関係はデータシートに載っています.

物理的なピンの配置は,行/列の番号順ではないので注意してください.

 

 

 

 

 

 

 

■応用編第1章 温度センサの値をI2Cで取得

シングル・ボード・コンピュータ(Jetson Nano)と温度センサ(MCP9808),Tang Nano 9K という構成でI2C通信を試します.

記事では,FPGAを使ったI2C通信は,簡単のため簡易的な実装としていますが,FPGAへセンサ類を接続する参考になります.

 

■応用編 第2章 直動スライドをステッピング・モータで駆動

FPGAでバイポーラ・ステッピング・モータを制御します.

ドライバとして67S101ANG(TOSHIBA)を使っています.

●動画1(速度制御なし)

●動画2(ランプ関数による速度制御あり)

 

 

■応用編第3章 DVI

Tang Nano 9KのHDMI端子からDVI信号を出しています.

HDMI接続できるモニタがあれば,試せます.

HDMIやDVI信号で使われるTMDS信号をFPGAで生成する方法について詳解しています.

 

■応用編第4章 RISC-Vソフトコアから制御するマトリクスLED

●プロジェクトの詳細な設定について

▲Use SSIP as a regular IOにチェックを入れておく

メニューの「Project」ー「Configuration」ー「Dual-Purpose Pin」で設定画面を開く

▲ブレッドボードで動作確認1

 

▲ブレッドボードで動作確認2

 

■Python編 第1章~第4章

Pythonベースの高位合成Polyphonyを使ってHDLを生成し,Tang Nano 9Kの回路をデザインします.

マトリクスLED制御や,I2C通信,DVI信号生成を行います.

 

●<デバッグ(お詫びと訂正)>

・本文中の記述に誤りがありました.

誤:「AXI Lite のバスを採用しており」と

正:「今回はPicoRV32 の簡易バスを使っています」

・補足

Tang Nano 9K のサンプル・プロジェクトの RISC-V は, axi lite の I/F も持っています.しかし,今回のプロジェクトとしては PicoRV32 の簡易バスを使っています(マトリクスLEDのプロジェクトと同じ)

 

・P.66のリスト7のインデント

誤:

def main(self):
  from data import MSG_DATA

    self.init_uart()
    clksleep(10)

    while is_worker_running():
      for data in MSG_DATA:
        self.wait_tx_not_busy()
        self.write_data(data)

正:

def main(self):
  from data import MSG_DATA

  self.init_uart()
  clksleep(10)

  while is_worker_running():
    for data in MSG_DATA:
      self.wait_tx_not_busy()
      self.write_data(data)

 

 

・P.66のリスト8

誤:

    logic i_tx_en;
    logic  waddr;
    logic  wdata;
    logic  raddr;
    logic  i_rx_en;
    logic  rdata;

正:
    logic i_tx_en;
    logic [2:0] waddr;
    logic [7:0] wdata;

    logic i_rx_en;
    logic [2:0] raddr;
    logic [7:0] rdata;

●おまけ

Tang Nano 9Kより,回路規模の大きなTang Primer 20K(Sipeed)が秋月電子通商で販売されています.

https://akizukidenshi.com/catalog/g/gM-17540/

 

別冊付録(Vol.2)で紹介したデザインも動きます.

▲動作確認済みデザイン

・応用編 第3章 DVI

 

応用編 第4章 RISC-V

詳細はこちらを確認ください.

 

 

Pythonで回路設計 第1章 Lチカ

「Project」-「Configuration」で設定ウィンドウを表示させ,Dual-Purpose Pinの設定をします.

SSPI,READY,DONEにチェックを入れる.

「Project」-「Set Device」でGW2A-LV18PG256C8/I7を選びます(書き込むときもこのデバイスを設定する).

物理制約ファイル(top.cst)を次のように変更します.

IO_LOC "led_output[5]" L16;
IO_PORT "led_output[5]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "led_output[4]" L14;
IO_PORT "led_output[4]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "led_output[3]" N14;
IO_PORT "led_output[3]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "led_output[2]" N16;
IO_PORT "led_output[2]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "led_output[1]" A13;
IO_PORT "led_output[1]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "led_output[0]" C13;
IO_PORT "led_output[0]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "sw0" T10;
IO_PORT "sw0" PULL_MODE=UP;
IO_LOC "clk" H11;
IO_PORT "clk" IO_TYPE=LVCMOS33 PULL_MODE=UP;
IO_LOC "sw1" T3;
IO_PORT "sw1" PULL_MODE=UP;

 

・Pythonで回路設計 第3章 UART

①プロジェクトをダウンロードします.

https://github.com/ryos36/Gowin-Examples

②プロジェクトをGowin EDAで開きます.

③「Project」-「SetDevice」を開く

SeriesとしてGW2Aを選びます.

その後,GW2A-LV18PG256C8/I7を選んで「OK」をクリックします.

④「Project」-「Configulation」を開く

「Synthesize」-「General」でVerilog Language:としてSystem Verilog 2017を選びます.

「Place&Route」-「Dual-Purpose-Pin」でSSPI,MSPI,READYあたりをチェックします.

⑤物理制約ファイルを次のように書き替える

IO_LOC “clk” H11;
IO_PORT “clk” IO_TYPE=LVCMOS33 PULL_MODE=UP;

IO_LOC “uart_tx” T6;
IO_PORT “uart_tx” IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;

IO_LOC “uart_rx” P6;
IO_PORT “uart_rx” IO_TYPE=LVCMOS33 PULL_MODE=UP;

 

⑥ビルドする

⑦ボードへビットストリームを書き込む

ラズパイのUARTに繋ぎ,cuコマンドで動作を確認しているところ

 

 

・Pythonで回路設計 第4章 UART→DVI変換

最新のダウンロードデータはこちら

上記はTang Nano 9K用ですが,次の内容を編集することでTang Primer 20Kで実行できます.

・Tang Primer 20KのFPGA(GW2A)を設定

・IP GeneratorでGW2A用にモジュールを生成

・物理制約ファイルをTang Primer 20K用に変更