ラベル FPGA の投稿を表示しています。 すべての投稿を表示
ラベル FPGA の投稿を表示しています。 すべての投稿を表示

2021/12/04

Tang Primer (EG4S20) の ADC を使ってみる

はじめに

RISC-V に興味があって Tang Primer を買ったのが 2020年5月頃。ADC をいじろうとするも、やりかけてお蔵入りに。記憶あいまいだけどある程度のところまで進んでました。安価な Tang Primer の ADC も使えるようになれればいいなということで、とりあえず今回は実際に動かすところまでやってみました (2021年11月末)。
そういえば当初は家にある激安電子ドラムのカスタマイズに使おうと思ったんだっけ。なんもしてない。。

Tang Primer

Anlogic の EG4S20 を搭載した Sipeed の FPGA 開発ボードです。
国内だと、スイッチサイエンスさんや、Shigezoneさんで入手できます。

使い方は Tang Primer の上記 URL の Getting Started を見ていただければ。あとはググれば試されている方の情報見つかります。本もあるようですね。

EG4S20  の ADC


EG4S20 の ADC は 8-channel 12-bit 1MSPS ですが、詳細はデータシートをみてみます。
データシートは以下からダウンロードできます。
以下、Eagle_DataSheet_V2.8_english.pdf から抜粋しました。

電気的特性


ADCモジュールの端子機能


タイミングチャート


以上です。

VREF は Tang Primer では 3.3V 固定です。従って 0-3.3V が 0-4095 に対応します。またADC のクロックは最大 16MHz。16 cycle で変換終了するので、ちょうど 1MSPSになります。

動作は SOC に 1パルス与えると動作開始で、EOC 1パルスでれば終了です。チャネルの選択は SOC より前に選択して EOC が立つまで保持ということかな。アナログのマルチプレクサの切り替えになると思うので早めに切り替えておくに越したことはないと思います。

Sampling Pulse と書かれている部分は多分、Sample/Hold 回路が開いている時間だと思うのですが、ここの長さは制御できないようです。まぁ、中の回路はクロック同期なんでしょうから、例えばこの期間のクロックを伸ばせば多分時間延ばせるのではないかと思います。なのでちょっとしたクロックゲーティング回路を足せば実現できるのでは?でもEG4S20に CG (Clock Gating)セルなんてあるんでしょうかね。Latch と AND または OR で作れなくはないけどタイミング合うかな。。

ADC IP Core の生成

RTL を書く前に IP core を生成します。とはいっても ADC のモジュール EG_PHY_ADC の有効にしたいチャネルを入れたラッパーをインスタンスするだけのようです。手置きしても大丈夫っぽいですが、Generator を使います。EG_PHY_ADC はパラメータで各チャネルのEnable, Disable を切り替えるようです。

EG4S20 _DataSheet_V1.5_english.pdf の 4.1 Special IP use にごく簡単に生成方法が書かれています。有効にしたいチャネルを選択するぐらいです。途中 File (ファイル名)と Component name (module 名)を指定するところがあります。adc など何でもいいとは思いますが、同じ名前にしておいてもいいでしょう。好みですが。あと Add to project ウィンドウでプロジェクトに入れる?と確認するところはチェックを入れてOKしておけばプロジェクトに取り込まれます。ファイルはデフォルトでプロジェクトのフォルダの下の al_ip フォルダ以下に置かれます。

選択したチャネルのピンアサインは固定で、IO Constraint で与えることはできません。また選択したチャネルにアサインされたピンは、IO Constraint から他の機能にアサインできなくなります。TD (Tang Dynasty) の HDLBit Flow で Optimize RTL まで実行すると IO Constraint で選択できるピンから消えます。

Tang Primer の端子アサインについては、sipeed-tang-primer-pins.pdf で確認できます。

SPI + ADC の仕様

ADCの動作を確認するため、SPI client?(今どきはなんとよべば) I/F をくっつけてみます。SPI は CPOL=0, CPHA=0 のモード0 で。ビット幅は 16bit とします。お手軽に SS が下がったら ADC を起動して、5bit 目から ADC 12bit の結果を MISO(いやこのネーミングもどうすれば。。)に出力します。ADC の結果は符号なしなので、とりあえず最初の上位 4bit は 0 出力で埋めておきます。ちなみに ADC 終了の eoc は見てません。SPI のクロックが早すぎると間に合いません。


タイミングチャートは Google のスプレッドシートでw

クロックは Tang Primer のボードには 24MHz の Xtal が載ってます。これから 16MHz 以下の ADC clock を作ればいいので 1/2 分周して 12MHz のクロックを ADC に与えることにします。この条件で SPI は 2MHz 程度で動作します。

端子アサインは以下の通りにしました。
N11: ADC0 (ADC 入力)
K14: CLK_IN (24MHz Xtal)
C15: MISO
C16: MOSI (使いません)
B16: SCLK
B15: SS
K16: XRES_IN (Tang Primer の USER スイッチ。プルアップされてます)

Simulation

回路が出来たので検証します。ADC モジュールのビヘイビアがあるのでそれを利用します。
ビヘイビアは以下の場所にあります(Windows の場合)。

C:\Anlogic\TD4.6.4\sim

TD でテストベンチのトップとか、Model Sim 用の do ファイルとか作ってくれるのですが、自前でテストベンチ用意して、Icarus verilog (iverilog) で検証してみました。

ところで ADC モジュールのビヘイビア、eg_phy_adc.v の中身を見ると、Channel select signal s に与えた値を dout に出す仕様のようです。s のチェックにはなるのですが、SPI 含めてデータがちゃんと通るかどうかを見るために、テストベンチでは ADC の出力データを決めている sample_B を外からフォースしてシミュレーションしてみます。1bit だけ立てて SPI で読み込み、を 12bit 繰り返します。

GtkWave

うまくいってるようです。よしよし。

論理合成と書き込み

端子アサインは FPGA Flow の User Constraints -> IO Constraint から指定して、適当な名前で保存しておきます。



タイミング制約は FPGA Flow の User Constraints -> SDC Constraint で作成。途中経過出すと長くなるので、作成した制約の中身は以下のような感じ。create_clock だけやっときました。


合成は緑の丸に三角のボタンで。あっという間です。特にバイオレーションとかもないので、下矢印のアイコンをクリックして書き込みです。イレースして、Flash に書き込みます。

動かしてみる

合成結果を書き込んだ Tang Primer を実際に動かしてみます。
ADC の入力はパルジェネとか安定化電源持っていないので、M5Stack の DAC を使って生成しました。12bit の ADC に対して 8bit の DAC では役不足だし、正確な出力も作れず、校正された計測機器は持ち合わせていないので、ファンクション確認程度になります。
また Tang Primer に実装した ADC は SPI I/F を持っているのでもう一つ用意した M5Stack で SPI をポーリングで動かして ADC のデータを取り込んでみました。
DAC の出力は Faces に付けたエンコーダーパネルでグリグリすると変わるのがわかると思います。だいたい。。同じ値ということで。

 

今回お試ししたデータ

Git に上げておきます。


RTL 検証・合成環境


RTL

src, al_ip フォルダに入っています。
adc_top.v
トップレベル階層です。adc_core と spi がインスタンスされています。
spi.v
SPI I/F 部分です。
adc_core.v
EG_PHY_ADC をインスタンスしています。

テストベンチ

simulation フォルダに入っています。
tb_spi_test.v
テストベンチのトップです。adc_top.v をインスタンスしています。
run_spi.bat
テストベンチ実行用バッチファイルです。実行すると iverilog でシミュレーションを走らせて検証を行います。tb_spi_test.vcd が生成されますので、GtkWave などで波形を確認できます。

実行環境

Windows10 で実行しました。
TD 4.6.4 64-Bit
Verilog simulation iverilog 11.0 (devel)
VCD 波形表示 v3.3.100

M5Stack プログラミング環境


m5stack フォルダに入っています。
ADC_SPI_IF.ino
Tang Primer と SPI 接続する側です。ポーリングした結果をディスプレイに表示します。
SCLK(G5), MISO(G17), MOSI(G16), SS(G22)
MOSI は使っていません。
DAC_Controller.ino
Tang Primer の ADC の入力信号を DAC で作ります。Faces のエンコーダーパネルを使う前提のコードです。出力中のデータを画面に表示します。
DAC1(G26)

Arduino IDE 1.8.13 で確認しています (なぜかこちらは Mac で。Windows でもきっと問題ないです)。M5Stack ディレクトリに .ino ファイルを置いています。
SPI master (MOSI はいらない) と DAC がそれぞれひとつずつ使えればいいので、M5Stack シリーズならほぼなんでもいいと思います。多少書き換えは必要とは思いますが。エンコーダーパネルを使いましたが、ボタンで値の上下でもいいですね。

2019/07/31

Cyslonell EP2C5T144 を買ったよー!


Amazon で古い FPGA が安かったので、ついつい買ってしまった。Altera (Intel) の Cyslone ll EP2C5T144。1999円なんで、ほとんど部品代じゃないの?

上記、リンク先の Amazon のコメント欄が役に立ちます。

  • 意味不明の 0ohm pull-up,down の R1,R2,R9,R10 の取り外し
  • FPGA 経由で EPCQ デバイスへプログラミング(JIC プログラミング)を検索する
  • Quartus II は 13.1 より前、13.0sp1 (64-bit) Web Edition が使える
    http://fpgasoftware.intel.com/13.0sp1/


が参考になります。EPCQ デバイスプログラミングはまだ試していませんが。

またこのボードについてはCyclone II EP2C5 Mini Dev Board に情報がまとまっています。

FPGA 買ってみた というブログの記事も参考になります。

ちなみに YouTube ではボードの解説から、Quartus II の使い方も一通り説明がある以下の動画が参考になるかと。英語ですが。


追加の情報としては、

古いツールである Quartus II のライセンスは、以下のリンクから発行してもらえる。
インテル® FPGA ライセンス・サポートセンター
2. ライセンスのリクエスト、Quartus II ウェブ・エディションのリンク先からメールベースで発行されます。
Quartus II の Tool -> License Setup -> License file で添付のライセンスファイルを設定すれば OK。

USB Blaster は、怪しい激安物 659円送料無料でとりあえず問題なく書き込めました。
Windows 10 64bit 環境ですが、デバイスマネージャーからドライバーを認識させる必要はありました。ドライバーは、以下のディレクトリのものを入れればいいです。
C:\altera\13.0sp1\quartus\drivers

とりあえず簡単な Verilog の 50MHz の分周回路を書いて、L チカさせて、動いたレベルです。



さて、なにしますかね?

2019/03/31

Arty に Microblaze を導入して、カスタムペリフェラルを組み込んでみる

FPGA などで RTL で作ったハードワイヤードの回路というのは全くもって融通が利かないし、かといってシビアなタイミングや本当の並列動作はプロセッサと組み込みのソフトでは厳しいですよね?

「だったら両方入ってればいいじゃん!」

はい、どっちも入れましょう。プロセッサ+カスタムペリフェラルという形で。仕事じゃないので好き放題できます(笑)

手元には二年半ほど前に買って、埃をかぶっている Arty が転がっているのでこれを使います。今回はプロセッサには流行りの RISC-V は今回は敬遠して、Arty に簡単に導入できる Microblaze を採用してみます。ちなみに Microblaze も RISC プロセッサです。RISC プロセッサに関してはこちらの有名な本をどうぞ。

Arty

ところで Arty は Digilent の FPGA 評価ボード。いくつか種類があるんですが、入手性はどうなんだろう?特にこの安い無印 Arty。これは確か DigiKey で購入したような。。秋月でも取り扱いがあります(2019.3)。他には Avnet から直接購入することも出来るようです。

Microblaze は Arty 以外でも導入することが出来るので、Arty にこだわる必要はありません。ただ、Arty 安いし、小型なので Cafe でデバッグ出来ますよ(笑)

さて前置きはこれぐらいにして、Arty に Microblaze を導入して、AXI バスに適合するペリフェラルを作って、Microblaze にくっつけましょう。最後に Microblaze に豊四季タイニーBASICを移植して、カスタムペリフェラルを BASIC から動かせるようにしてみます。
それでは、

  • Microblaze を組み込む
  • カスタムペリフェラルを作って Microblaze にくっつける
  • 豊四季タイニーBASICを移植する

を順に追っていきたいと思います。

  1. Microblaze を組み込む
    Arty に関しては沢山のドキュメントが揃っています。これを参考にします。豊四季タイニーBASICを動かすことを目標にしているので、Getting Started with Microblaze がぴったりです。Microblaze と UART (シリアル) が入っているだけですが、豊四季タイニーBASIC はシリアル端末で動作させる仕様なので十分です。とりあえずこのチュートリアルに従って Microblaze を入れてみましょう。
    ここで注意点が1つ。Xilinx の FPGA のツール Vivado の最新版 2018.3 (2019.3 時点)がこのチュートリアルに沿って Microblaze を導入しようとすると途中でコケます。あまり深く追求したく無いので、とりあえず 2016.4 を導入してみたらこのチュートリアル通りにはできましたのでこのバージョンで試した結果を書いておきます。そのうち新しいバージョンでも再度挑戦してみようとは思いますが、めんどくさいのでいつになるやら。あと高位合成などしないので、フリーのライセンスで OK。あと、Microblaze のプログラムをコンパイルするために Vivado のインストール時に XSDK もインストールすることをお忘れなく。
    とりあえず適当なターミナルソフト(チュートリアルでは Tera Term 使ってる)で Hello World が出ればよしです。ここで作るプロジェクト名はチュートリアルと同じ Arty_GSMB にしておきます。
  2. カスタムペリフェラルと作って Microblaze にくっつける
    AXI バスに適合したインターフェースを持つ回路を用意できればいいのですが、Vivado では AXI スレーブ・マスターのひな型を作ることができて、ライブラリに登録されるので、他のプロジェクトから簡単に導入できるんですね。AXI バスとひな型の作り方はこちらのブログで紹介されているので、こちらを参考にしました。

    とりあえず、電子工作をまったく行わずに独自のペリフェラルを作ってみます。
    題して
    「2倍演算機!」
    です。

    32bit のデータを与えるとそのデータを二倍にして返すというとてもシンプルな回路です。ペリフェラルにデータを与えて結果を受け取るという基本中の基本ができればあとは応用ですから。

    Microblaze において AXI バスのペリフェラルはメモリマップドI/Oと言って、そのインターフェースはメモリー上に位置しています。プログラムから見れば特定のアドレスにデータを読み書きすることでペリフェラルにアクセスすることができます。

    こんな感じ。

    ではさっそくカスタムペリフェラルを作ってみます。ここからは先ほどのブログと被るところが多々ありますが、一応書いておきます。
    最初に上記のチュートリアルで作成したプロジェクト Arty_GSMB を開いているならば、Vivado のメニューの Tools から、Create and Package New IP をクリックします。



    Create a new AIX4 peripheral を選択して Next。



    IP の Name を適当につけてあげます。alu_double にしました。



    AXI バスのインターフェースを決めます。割り込みの信号もここで用意できるみたいですが、今回はいらないので有効にしません(今度試してみよう)。Lite, Slave でバス幅を 32、レジスターの数も最小の 4 にしておきます。



    ひな型ができたらすぐ編集するので、Edit IP を選択して Finish。



    続いて Project Manager の Hierarchy の Design Sources の下にある alu_double_v1_0_S00_AXI をダブルクリックするとひな型のコードが右側に現れます。



    このコードには以下の4つのレジスタ slv_reg0,1,2,3 を AXI バスから読み書きするという簡単なコードが書かれています。ここに値を二倍する回路を組んでいきます。



    二倍演算といっても、C などのプログラミング言語で左に1ビットシフトすればよいだけですよね。RTL でも一緒です。そこで、slv_reg0 に書かれた値を二倍して、本来 slv_reg3 を読み出す代わりに、二倍された値を読み出せるようにします。ちなみに slv_reg0 を読み出す代わりに演算した結果でもいいんですけど、ここではあえてそうしてみました。以下の always 文は、指定されたアドレスの値を読み出し用のデータバスに出力するマルチプレクサのコードです。マークしたところが書き換えた部分。簡単ですね。実際合成される回路ではビットシフトは LSB には GND が接続され、他は単なる配線の付け替えという論理回路の消費ゼロなお手軽な演算回路が出来上がります。これでも立派な演算回路ですよね(笑)



    ではここで、最初に作ったプロジェクト Arty_GSMB に戻ります。Project Manager の Design Sources から system_wrapper の下の system_i をダブルクリックするとブロックダイアグラムが開きます。





    ダイアグラムエディタの左にある Add IP アイコンをクリックして、Search で alu とタイプしてみると、先ほど作成した alu_double がみつかります。ENTER して追加すると、ブロックエディタにこの IP がインスタンスされます。



    Run Connection Automation をクリックすると



    以下のようなウィンドウが現れるので、そのまま OK すると AXI バスに自作 IP を自動的に接続してくれます。アドレスのアサインも適宜おこなってくれています。回路作成はこれでおしまい。簡単ですね。素晴らしい!



    新しく作成した回路の Bitstream を生成して、XSDK にエクスポートしておきます。これは最初に Microblaze を組み込んだ時と一緒です。エクスポートする際には Include bitstream にチェックすることを忘れないように。




    以上で HW の作成はおしまいです。豊四季タイニーBASICの移植は分けてアップします。

    それにしても、AXI スレーブのひな形がかんたんに作れて、接続できてしまうのはいいなぁ。仕事ではこういったのは全て手で書き起こしていたのでとても便利に感じます。












2019/03/26

MacBook Pro Mid 2015 の外付け SSD に Windows10 をインストール出来たー

macOS に対応していないツール (Xilinx Vivado) を動かすために 2016/11 ごろに外付け SSD に VirtualBox の仮想マシンを入れてそこで Windows やら Ubuntu をインストールし、ツールを動作させようとしばらく頑張っていましたが挫折していました。

VirtualBox 上でもツールはどうにかインストール出来て Bitstream を吐き出すところまではうまく行くものの、XSDK というツールから USB 経由で FPGA ボード (Arty) に Bitstream を書き込んで MicroBlaze (Xilinx のソフトマクロのプロセッサです)のプログラムを書き込むというところが安定して動作せずに諦めていました。しかもツールの動作遅いし。

MacBook Pro 本体の SSD に Bootcamp で Windows をインストールすればいいんだろうとは思っていましたが、256GB しかない容量に macOS と Windows の共存は無理で、どうしても外付けの SSD か HDD にインストールしたかったのです。しかし数年前は外付けの SSD に Bootcamp で Windows が入れられるとは思っていなかったので(そもそも正式対応しているインストール方法では無いので)、しばらくブランクがあったわけです。



しかし、以下の URL の情報を頼りに MacBook Pro に Windows10 をインストールすることに成功しました (2019/3)。ありがとうございます!

https://ameblo.jp/dai-vocalist/entry-12423490407.html

私の試した環境は以下。

MacBook Pro Mid 2015 (Core i7, 2.2GHz, Memory 16GB)
SSD: Elecom ESD-EC0240GRD
USB memory: Toshiba 16GB TOUSB16GWH USB2.0
Windows10: 1803 Japanese x64 ISO (ググって探しました)
Rufus: v2.18
WindowsSupport: macOS Mojaive 10.14.3 付属の Boot Campアシスタント 6.1.0 からダウンロード

まず上記 Windows と Rufus のバージョンを 2019/3 時点で最新のものを用意し、
https://blue1st.hateblo.jp/entry/2018/02/18/061620
を参考に DiskPart で Windows をインストールすることを試したのですが、最初はマウスやキーボードも認識するし、どうにか起動したものの、WindowsSupport を適用後から起動が怪しくなりました。先走って購入した Windows のライセンスが要らなくなるかもしれないとブルーになりました。。

そこでものは試しと
https://ameblo.jp/dai-vocalist/entry-12423490407.html
を参考に再度挑戦したところ、インストールは成功し、安定して動作するようになりました!Windows Update もかかるのですが、その後も特に問題なさそうです。
バージョンの問題だったのか、インストールの仕方だったのか。
とにかくまともに動いてるからよしと。

一点だけ再確認はちゃんとできていないのですが、Windows を触らずにほっておくとしばらくすると OS がスリープしてしまうのですが、そのタイミングで再起動がかかってしまったらしい事象に2度ほど会ったような気がします。気がつくと macOS が起動してしまっていたので。これを避けるために電源を繋いでいるときはスリープに入ることを禁止しました。とりあえず今の所問題なさそうです。


2016/11/05

Vivado インストール


Digilent の ARTY (Xilinx Artix-7) 買ってみました。DigiKey で(秋月でも買えますが、こっちの方が若干安かったので)。ということで、早速 Vivado をインストールしてみました。

我が家の PC は MacBook Pro (mid 2015) のみ。残念ながら Vivado は Mac に対応してないので、仮想マシン上の Windows か Linux にインストールするしかありません。また Mac (10.12.1 Sierra) に入れてる VirtualBox (5.0.23) の Windows は Win10 32bit 版。残念ながら Windows 版 Vivado は 32bit には対応してません。このために Win10 64bit 版を買うのも勿体無いので、Ubuntu に入れてみることにしました。

実は ISE を入れるために Ubuntu 14.x を導入してはいたのだけど、Vivado は Ubuntu 16.x 対応と書かれているので、ディスクスペースの都合もあって新たに Ubuntu 16.04 を入れました。

Vivado は Xilinx のhttps://japan.xilinx.com/support/download.html から Linux 用自己解凍型ウェブインストーラーを選びました。.bin ファイルがダウンロードできるのですが、これの実行方法が分からない!と思ったら単なるシェルスクリプトなんですね。

% sudo sh Xilinx_Vivado_SDK_2016.3_1011_1_Lin64.bin

でいいんじゃん。。悩みましたよ。Linux 用のインストーラーかと思ってましたが、全然違いました。

ARTY には Design Edition のライセンスが一年間ついてくるので、Design Edition を選んでインストール。ダウンロードには 2.5h ほどと出てたので、夜通しほっといたら朝には終わってました。

Vivado をインストールする過程で、License Manager から Web browser を開くタイミングがあるのですが、デフォルトでインストールされている Firefox ではうまくひらけなかったです。そこで、あらかじめ Google Chrome を導入しておけば問題なくライセンスの取得ができます。Chrome をインストールするとデフォルトのブラウザにするか?と聞かれるので、忘れずにデフォルトにしておくといいかも。

ところで、Chrome のインストールはハマる。以下を参考にすると良い。
http://robotics4society.com/2016/06/16/ubuntu-chrome/

ライセンスは Certificate Based License で、Virtual マシーンに付けたホスト名と ifconfig で調べた MAC アドレスを指定して Generate しました。

次に Digilent のドライバのインストールですが、インストールされていなかったので、手動で行いました。詳細は以下。

また root でインストールしちゃうと、~/.Xilinx が root で作られてしまって vivado 起動時に怒られてしまうので、~/.Xilinx は、

% sudo chown -R your_account ~/.Xilinx

とでもして自分のアカウントにオーナーを変えておきましょう。

あとは ARTY のボードの登録ですが、Digilent から board files をダウンロードしてきて、所定の場所に展開しておけば OK です。

ただ、Vivado_HLS に ARTY の設定をするには手動で行うしかないようです。
VivadoHls_boards.xml を落としてきて、ARTY の行だけ加えてあげれば良さそうです。
オリジナルのファイルは、

% find /opt/Xilinx/Vivado_HLS -name 'VivadoHls_boards.xml' -print

などで探してみて下さい。このファイルに ARTY のコンフィグを一行だけ挿入します。フォーラムにアップされてるファイルに置き換えてもいいのかもしれませんが、内容が古いと嫌なので、必要な部分のみの導入です。

ARTY を USB に挿して Vivado から Hardware Manager を起動すると認識したのでオッケーです。


とりあえずインストールはこんなところかなー。