Interface編集部
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リポジトリ)
▲おまけ 井田氏による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)の接続について
この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;
⑥ビルドする
⑦ボードへビットストリームを書き込む
・Pythonで回路設計 第4章 UART→DVI変換
最新のダウンロードデータはこちら
上記はTang Nano 9K用ですが,次の内容を編集することでTang Primer 20Kで実行できます.
・Tang Primer 20KのFPGA(GW2A)を設定
・IP GeneratorでGW2A用にモジュールを生成
・物理制約ファイルをTang Primer 20K用に変更