2019/04/06
Arty に Pmod VGA を繋げてみた
本当は HDMI か、DVI でディスプレイ直結してみたかったのだけど(一応そういう製品は存在するっぽい)、秋月で物色してたら Pmod VGA が売ってたので買ってきてみました。しかし、うちには VGA 入力のあるモニターがないので、VGA - HDMI コンバータを追加で買う羽目に。
この時点で Digilent に PmodVGA のチュートリアルがあるのでどうにかなるだろうと思っていたら、うまく行かないんですね。xdc のコンストレイントがうまくいっていないようなんだけど、ピンアサインの設定がいまいちわからないんだよなぁ。しかもコードは VHDL だし。
そこでググっていたら FPGAプログラミング大全 Xilinx編 のサンプルコードを見つけた。コードは Verilog なんで、さっと読めるし、とりあえず適当なプロジェクト作ってコードと xdc を読み込んだらあっという間にカラーパターン吐き出せました。
回路はシンプルで、Hsync, Vsync を生成して、タイミングに合わせてパターンを吐き出している感じ。色々調べながら作るのは大変なので楽させてもらいました。フレームバッファ用意して、それを表示させるのもアリですね。
本の方は古い Vivado 向けのようですが役に立ちそうなので注文しました。サンプルコードにお世話になったし、Pmod VGA の方はもう少し応用が載ってるっぽいんで。
とりあえず Pmod VGA が使えてよかった〜。
2019/03/31
Microblaze に豊四季タイニーBASIC を移植する
前回、Arty に Microblaze+カスタムペリフェラルを組み込んだ回路を作り上げました。
Microblaze に豊四季タイニーBASICを移植して、カスタムペリフェラルを動かしてみます。
BASIC のようなインタープリタ言語が入っているとカスタムペリフェラルの検証もお手軽ですね。
XSDK を直接立ち上げてプログラムを書くこともできるようですが、Vivado で前回作ったプロジェクト Arty_GSMB プロジェクトが立ち上がっているところから操作します。XSDK がインストールされていなかったら、しておきましょう。
Vivado のメニューの File から Launch SDK をクリックし、XSDK を立ち上げます。
このテンプレートのコードのトップは hello.c なので、main.c に名前変えました。なんとなく。変えなくてもいいですけど気持ち悪いので。
さ、下準備は整いました。あとは本当に移植するだけ。豊四季タイニーBASIC のソースコードを引っ張ってきます。いくつか種類があるのですが、移植が簡単だった Arduino 版がおすすめ。ところで上記のブログのコメント欄を見ないと気付かないのですが、確定版のソースは残念ながらバグがあります。これはパッチを当てて欲しかったです。詳細はコメントを見てください。
ソースは github の ココから落としてきました。展開すると basic.cpp と ttbasic.ino の二つのファイルがあり、普通の C での main.c に相当する ttbasic.ino ファイルから必要部分を main.c に移植し、basic.cpp をインポートして必要部分を追加修正します。
ちなみにこの basic.cpp、コメントが日本語なところが原因で、XSDK にインポートすると文字が化け化け。コンパイルすら通らなくなります。basic.c というファイル(中身は C なので cpp である必要はなしです) の空ファイルを作って、XSDK のエディタでこのファイルを開いているところに、別なエディタで開いた basic.cpp の中身をコピーしてペーストすると文字化けなどの問題がなくなります。
ttbasic.ino でやっていることは、乱数の初期化と basic() 関数の呼び出しです。basic() 関数は中で whle (1) の無限ループを回しているので呼び出すだけでいいです。従ってそのあとのコードは意味ないですが残しています。乱数の初期化はsrand() を呼び出しているのですが、ランダムなシードのソースが無いので(ADC の入力を使ってもいいとは思いますが)、仮に固定値 10 を与えています。main.c (hello.c) は以下のように書き換えます。
ポイントはシリアル部分の移植で、これができればほぼ移植はできたも同然です。
まずはインクルードを追加修正します。
ついでにエディションも変えておきます。起動時にメッセージで表示されます。
ではシリアル周りを Microblaze に合わせます。移植は比較的簡単で、以下の三つの関数を移植するだけです。標準入出力は UART にアサインされているので、putchar(), getchar() に置き換えるだけです。c_kbhit() は UART の受信バッファにデータがあるかどうかを調べたい関数なので、UART のレジスタを直接調べます。実装している IP UART lite の仕様書を見ると STAT_REG の bit0 を見ればデータがあるかどうかわかります。下記のコードのようにすればバッファに有効なデータがあるかどうか確認することができます。UART0 マクロはもともと定義されていないので自分で定義していますが、これに関しては後で説明します。
XSDK で用意されたマクロや関数があるのですが好きなスタイルではないので、改めてマクロを定義します。ついでにカスタムペリフェラル alu_double のマクロの定義も追加します。
Project Explorer で作ったプロジェクト名 + _bsp 以下の microblaze_0/include/xparameters.h を探します。ここには alu_double だけでなくペリフェラルを含むいろいろなマクロ定義が書かれています。お目当ては UART と alu_double のベースアドレスです。ベースアドレスの定義を見つけたら定義を構造体をこのベースアドレスに割り当てます。
以下がその構造体とマクロの割り当て。
構造体の変数は上記のような書き方をすると上から下に向かって変数がメモリに割り当てられます。構造体のポインタ定義をそれぞれのペリフェラルのベースアドレスに割り当てると構造体の変数への読み書きがそのまま、ペリフェラルのインターフェースへの読み書きになります。
あと忘れてはいけないのが乱数生成関数 getrnd() の移植。rand() 関数を使って対応しました。Linux 版がこの実装ですね。
あともうひと手間でとりあえずの移植は完了です。
basic.c の中に putnum() という関数が定義されているのですが、これがすでに存在する関数なので、別な名前にします。tiny_putnum() という名前で置換しておきます。
これで BASIC が走るようになっているはずです。Arty を USB で接続して、Bitstream ファイルを書き込んで、Microblaze のコードを転送しましょう。Program FPGA アイコンをクリックして、Program ボタンをクリックします。Hardware Platform に system_wrapper_hw_platform_1 が選択されていることを確認のこと。
これで Arty に回路が書き込まれました。
最後に BASIC のコードを転送する前に、ターミナルソフトを起動して、シリアル接続をしておきます。9600bps で 8bit パリティ無です。ターミナルソフトの準備が終わったら、Run System Debugger (緑の丸に白三角)から、Run As/Launch on Hardware を選択しましょう。
プログラムが転送されて、Microblaze edition の豊四季タイニーBASIC が立ち上がりましたか?
成功すれば上記のような画面が出るはずです。やったー!
ではいよいよカスタムペリフェラルを BASIC から呼び出せるようにします。DOUBLE() という関数を作成してみましょう。引数に数字が与えられるとその二倍の値を返すようにします。実装には同様に引数を与えて結果が返る RND() 関数を参考にします。
まずは DOUBLE() 関数の本体から。alu_double にアクセスして演算結果を返す関数を作ります。getX2() という32bitの値を受け取って結果を返す関数です。
slv_reg0 の書き込みアドレスには DIN という 32bit の変数をアサインしたので、ALU_DOUBLE->DIN に値を代入することで、slv_reg0 へのデータ書き込みが実行されます。また、slv_reg3 のアドレスには DOUT という変数をアサインしたので、ALU_DOUBLE->DOUT を読み出せば演算結果を得られます。簡単ですねー。
あとはこれを呼び出す DOUBLE() 関数の実装です。まずは定義。コマンド名を kwtbl に追加して、i-code を列挙型に追加、後ろに空白を入れない中間コード i_nsa[] にそれぞれ追加します。
最後に中間コードを実行する関数 ivalue() に DOUBLE() を実装すれば出来上がりです。I_RND の隣にでも加えておきましょうか。
さぁ、もう一度プログラムを転送しなおして実行してみましょう。
うまくいったようです!ちゃんと演算結果を返してくれていますね。
ここまで出来ると、いろいろ夢は膨らみますね。とりあえず次は割り込み付きのペリフェラルを実装してみたいところです。ディスプレイを駆動する回路やら、キーボード入力を受け付ける回路を書いてみるとそれもまたいいですよねー。他には SDK プロジェクトを SPI flash に書き込んで毎回電源を入れるだけでブート出来るようにもしてみたいです。
Microblaze に豊四季タイニーBASICを移植して、カスタムペリフェラルを動かしてみます。
BASIC のようなインタープリタ言語が入っているとカスタムペリフェラルの検証もお手軽ですね。
XSDK を直接立ち上げてプログラムを書くこともできるようですが、Vivado で前回作ったプロジェクト Arty_GSMB プロジェクトが立ち上がっているところから操作します。XSDK がインストールされていなかったら、しておきましょう。
Vivado のメニューの File から Launch SDK をクリックし、XSDK を立ち上げます。
場所はこのままで OK します。
XSDK の Project Explorer にはチュートリアルでエクスポートしたデータがあれば system_wrapper_hw_platform_0 と、今回新しく作った回路のデータ system_wrapper_hw_platform_1 が存在しています。なければ Vivado からエクスポートして、XSDK を立ち上げなおします。
system.hdf というファイルを開くと alu_double_0 がインスタンスされていることがわかります。無ければ‘Bitstream を更新していないとか、何か手順が抜けているはずです。見直してください。
ここまで出来ていればあとは移植するだけ。まずは Application Project を開いて、コードのひな型を作ります。豊四季タイニーBASIC を移植するにあたって UART は必須なので Hello World のテンプレートが役に立ちます。Hardware Platform を間違えないように。system_wrapper_hw_platform_1 ですよ。
ソースは github の ココから落としてきました。展開すると basic.cpp と ttbasic.ino の二つのファイルがあり、普通の C での main.c に相当する ttbasic.ino ファイルから必要部分を main.c に移植し、basic.cpp をインポートして必要部分を追加修正します。
ちなみにこの basic.cpp、コメントが日本語なところが原因で、XSDK にインポートすると文字が化け化け。コンパイルすら通らなくなります。basic.c というファイル(中身は C なので cpp である必要はなしです) の空ファイルを作って、XSDK のエディタでこのファイルを開いているところに、別なエディタで開いた basic.cpp の中身をコピーしてペーストすると文字化けなどの問題がなくなります。
ttbasic.ino でやっていることは、乱数の初期化と basic() 関数の呼び出しです。basic() 関数は中で whle (1) の無限ループを回しているので呼び出すだけでいいです。従ってそのあとのコードは意味ないですが残しています。乱数の初期化はsrand() を呼び出しているのですが、ランダムなシードのソースが無いので(ADC の入力を使ってもいいとは思いますが)、仮に固定値 10 を与えています。main.c (hello.c) は以下のように書き換えます。
#include <stdio.h>
#include <stdlib.h>
#include "platform.h"
void basic(void);
int main()
{
init_platform();
srand(10);
basic();
cleanup_platform();
return 0;
}
次に、basic.c を修正して豊四季タイニーBASIC が動作するようにしてみます。ポイントはシリアル部分の移植で、これができればほぼ移植はできたも同然です。
まずはインクルードを追加修正します。
#include <stdio.h> #include <stdlib.h> #include <xuartlite_i.h>
ついでにエディションも変えておきます。起動時にメッセージで表示されます。
// TO-DO Rewrite these functions to fit your machine #define STR_EDITION "MICROBLAZE"
ではシリアル周りを Microblaze に合わせます。移植は比較的簡単で、以下の三つの関数を移植するだけです。標準入出力は UART にアサインされているので、putchar(), getchar() に置き換えるだけです。c_kbhit() は UART の受信バッファにデータがあるかどうかを調べたい関数なので、UART のレジスタを直接調べます。実装している IP UART lite の仕様書を見ると STAT_REG の bit0 を見ればデータがあるかどうかわかります。下記のコードのようにすればバッファに有効なデータがあるかどうか確認することができます。UART0 マクロはもともと定義されていないので自分で定義していますが、これに関しては後で説明します。
void c_putch(char c){
putchar(c);
}
char c_getch(){
return getchar();
}
char c_kbhit(){
return UART0->STAT_REG & XUL_SR_RX_FIFO_VALID_DATA;
}
XSDK で用意されたマクロや関数があるのですが好きなスタイルではないので、改めてマクロを定義します。ついでにカスタムペリフェラル alu_double のマクロの定義も追加します。
Project Explorer で作ったプロジェクト名 + _bsp 以下の microblaze_0/include/xparameters.h を探します。ここには alu_double だけでなくペリフェラルを含むいろいろなマクロ定義が書かれています。お目当ては UART と alu_double のベースアドレスです。ベースアドレスの定義を見つけたら定義を構造体をこのベースアドレスに割り当てます。
以下がその構造体とマクロの割り当て。
typedef struct {
u32 RX_FIFO;
u32 TX_FIFO;
u32 STAT_REG;
u32 CTRL_REG;
} UART_Type;
typedef struct {
u32 DIN;
u32 dummy1;
u32 dummy2;
u32 DOUT;
} ALU_DOUBLE_Type;
#define UART0 ((UART_Type*) XPAR_UARTLITE_0_BASEADDR)
#define ALU_DOUBLE ((ALU_DOUBLE_Type*) XPAR_ALU_DOUBLE_0_S00_AXI_BASEADDR)
構造体の変数は上記のような書き方をすると上から下に向かって変数がメモリに割り当てられます。構造体のポインタ定義をそれぞれのペリフェラルのベースアドレスに割り当てると構造体の変数への読み書きがそのまま、ペリフェラルのインターフェースへの読み書きになります。
あと忘れてはいけないのが乱数生成関数 getrnd() の移植。rand() 関数を使って対応しました。Linux 版がこの実装ですね。
// Return random number
short getrnd(short value) {
return(rand() % value) + 1;
}
あともうひと手間でとりあえずの移植は完了です。
basic.c の中に putnum() という関数が定義されているのですが、これがすでに存在する関数なので、別な名前にします。tiny_putnum() という名前で置換しておきます。
これで BASIC が走るようになっているはずです。Arty を USB で接続して、Bitstream ファイルを書き込んで、Microblaze のコードを転送しましょう。Program FPGA アイコンをクリックして、Program ボタンをクリックします。Hardware Platform に system_wrapper_hw_platform_1 が選択されていることを確認のこと。
これで Arty に回路が書き込まれました。
最後に BASIC のコードを転送する前に、ターミナルソフトを起動して、シリアル接続をしておきます。9600bps で 8bit パリティ無です。ターミナルソフトの準備が終わったら、Run System Debugger (緑の丸に白三角)から、Run As/Launch on Hardware を選択しましょう。
プログラムが転送されて、Microblaze edition の豊四季タイニーBASIC が立ち上がりましたか?
成功すれば上記のような画面が出るはずです。やったー!
ではいよいよカスタムペリフェラルを BASIC から呼び出せるようにします。DOUBLE() という関数を作成してみましょう。引数に数字が与えられるとその二倍の値を返すようにします。実装には同様に引数を与えて結果が返る RND() 関数を参考にします。
まずは DOUBLE() 関数の本体から。alu_double にアクセスして演算結果を返す関数を作ります。getX2() という32bitの値を受け取って結果を返す関数です。
slv_reg0 の書き込みアドレスには DIN という 32bit の変数をアサインしたので、ALU_DOUBLE->DIN に値を代入することで、slv_reg0 へのデータ書き込みが実行されます。また、slv_reg3 のアドレスには DOUT という変数をアサインしたので、ALU_DOUBLE->DOUT を読み出せば演算結果を得られます。簡単ですねー。
short getX2(short value) {
ALU_DOUBLE->DIN = value;
return ALU_DOUBLE->DOUT;
}
あとはこれを呼び出す DOUBLE() 関数の実装です。まずは定義。コマンド名を kwtbl に追加して、i-code を列挙型に追加、後ろに空白を入れない中間コード i_nsa[] にそれぞれ追加します。
// Keyword table
const char *kwtbl[] = {
"GOTO", "GOSUB", "RETURN",
"FOR", "TO", "STEP", "NEXT",
"IF", "REM", "STOP",
"INPUT", "PRINT", "LET",
",", ";",
"-", "+", "*", "/", "(", ")",
">=", "#", ">", "=", "<=", "<",
"@", "RND", "DOUBLE", "ABS", "SIZE",
"LIST", "RUN", "NEW"
};
// Keyword count
#define SIZE_KWTBL (sizeof(kwtbl) / sizeof(const char*))
// i-code(Intermediate code) assignment
enum {
I_GOTO, I_GOSUB, I_RETURN,
I_FOR, I_TO, I_STEP, I_NEXT,
I_IF, I_REM, I_STOP,
I_INPUT, I_PRINT, I_LET,
I_COMMA, I_SEMI,
I_MINUS, I_PLUS, I_MUL, I_DIV, I_OPEN, I_CLOSE,
I_GTE, I_SHARP, I_GT, I_EQ, I_LTE, I_LT,
I_ARRAY, I_RND, I_DOUBLE, I_ABS, I_SIZE,
I_LIST, I_RUN, I_NEW,
I_NUM, I_VAR, I_STR,
I_EOL
};
// List formatting condition
// 後ろに空白を入れない中間コード
const unsigned char i_nsa[] = {
I_RETURN, I_STOP, I_COMMA,
I_MINUS, I_PLUS, I_MUL, I_DIV, I_OPEN, I_CLOSE,
I_GTE, I_SHARP, I_GT, I_EQ, I_LTE, I_LT,
I_ARRAY, I_RND, I_DOUBLE, I_ABS, I_SIZE
};
最後に中間コードを実行する関数 ivalue() に DOUBLE() を実装すれば出来上がりです。I_RND の隣にでも加えておきましょうか。
case I_DOUBLE: //関数DOUBLEの場合
cip++; //中間コードポインタを次へ進める
value = getparam(); //括弧の値を取得
if (err) //もしエラーが生じたら
break; //ここで打ち切る
value = getX2(value); // x2 の計算結果を取得
break; //ここで打ち切る
さぁ、もう一度プログラムを転送しなおして実行してみましょう。
うまくいったようです!ちゃんと演算結果を返してくれていますね。
ここまで出来ると、いろいろ夢は膨らみますね。とりあえず次は割り込み付きのペリフェラルを実装してみたいところです。ディスプレイを駆動する回路やら、キーボード入力を受け付ける回路を書いてみるとそれもまたいいですよねー。他には SDK プロジェクトを SPI flash に書き込んで毎回電源を入れるだけでブート出来るようにもしてみたいです。
カテゴリ
Artix,
Arty,
AXI,
BASIC,
MicroBlaze,
Vivado,
Xilinx,
XSDK,
豊四季タイニーBASIC
Arty に Microblaze を導入して、カスタムペリフェラルを組み込んでみる
FPGA などで RTL で作ったハードワイヤードの回路というのは全くもって融通が利かないし、かといってシビアなタイミングや本当の並列動作はプロセッサと組み込みのソフトでは厳しいですよね?
ところで Arty は Digilent の FPGA 評価ボード。いくつか種類があるんですが、入手性はどうなんだろう?特にこの安い無印 Arty。これは確か DigiKey で購入したような。。秋月でも取り扱いがあります(2019.3)。他には Avnet から直接購入することも出来るようです。
Microblaze は Arty 以外でも導入することが出来るので、Arty にこだわる必要はありません。ただ、Arty 安いし、小型なので Cafe でデバッグ出来ますよ(笑)
さて前置きはこれぐらいにして、Arty に Microblaze を導入して、AXI バスに適合するペリフェラルを作って、Microblaze にくっつけましょう。最後に Microblaze に豊四季タイニーBASICを移植して、カスタムペリフェラルを BASIC から動かせるようにしてみます。
それでは、
を順に追っていきたいと思います。
「だったら両方入ってればいいじゃん!」
はい、どっちも入れましょう。プロセッサ+カスタムペリフェラルという形で。仕事じゃないので好き放題できます(笑)
手元には二年半ほど前に買って、埃をかぶっている Arty が転がっているのでこれを使います。今回はプロセッサには流行りの RISC-V は今回は敬遠して、Arty に簡単に導入できる Microblaze を採用してみます。ちなみに Microblaze も RISC プロセッサです。RISC プロセッサに関してはこちらの有名な本をどうぞ。
手元には二年半ほど前に買って、埃をかぶっている 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を移植する
を順に追っていきたいと思います。
- 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 にしておきます。 - カスタムペリフェラルと作って 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
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/12/26
Mac + VirtualBox + CentOS + Vivado/SDK
Xilinx の SDK から MicroBlaze にアクセスできなくて困ってたら、知人に以下のリンクを教えてもらいどうにか Hello world までこぎつけました。ありがとー!Kノキ。
http://samurai375.hatenablog.jp/entry/2016/08/12/125107
このブログの前の記事も参照のこと(該当する記事は 1〜4 の4回に分かれてます)。
この際 Win マシンを買っちゃうかとも思ったけど〜。買わずに済んだと思います。
やれやれ。
とりあえず今まで構築してきた Ubuntu 環境でこのブログのように RXTXcomm.jar と librxtxSerial.so を入れ替えてみたつもりでしたがうまくいかず、あまり深追いするきもなかったので、参考にしたブログと同じ OS にしちゃえと CentOS も新規導入してみました。
では忘れないようメモ程度に軽く手順を書いておきます。
1. CentOS を VirtualBox にインストールする
だったはずなのですが。。年明けて '17/1/3 に再度お試しするも、うまくいかず。。一応記事は残しておきます↓
http://samurai375.hatenablog.jp/entry/2016/08/12/125107
このブログの前の記事も参照のこと(該当する記事は 1〜4 の4回に分かれてます)。
この際 Win マシンを買っちゃうかとも思ったけど〜。買わずに済んだと思います。
やれやれ。
とりあえず今まで構築してきた Ubuntu 環境でこのブログのように RXTXcomm.jar と librxtxSerial.so を入れ替えてみたつもりでしたがうまくいかず、あまり深追いするきもなかったので、参考にしたブログと同じ OS にしちゃえと CentOS も新規導入してみました。
では忘れないようメモ程度に軽く手順を書いておきます。
1. CentOS を VirtualBox にインストールする
ルートパーティションは Vivado (デフォルトで /opt/Xilinx 以下にインストールされる)を入れることを考えて 80GB ぐらいは確保しておいた方が無難 Vivado 結構大きくて 50G~60G ぐらい使うから。Vivado のライセンスファイル発行にホスト名が必要なので適当なホスト名に変えておく。
ちなみに VirtualBox の設定で CPU x1 のままでインストールしてたら劇遅でした。。x2 にしたらまともになってきた。
2. 足りない library などを入れる
% sudo yum update
% sudo yum install ld-linux.so.2
% sudo yum install libstdc++.so.6
% sudo yum install libz.so.1
% sudo yum install libstdc++.so.6
% sudo yum install libz.so.1
えーと、多分これだけで良いと思います。上記ブログより。
多分とは、自分は別なブログ参考にいくつかライブラリ入れた後に足りない分を入れましたので。
最後に今回インストールに使ったハードやらソフトやらのバージョンなどについて。
MacBook Pro (Retina 15-inch, Mid 2015) Core i7 2.2GHz, MEM 16GB
macOS Sierra 10.12.2
VirtualBox 5.0.30 (仮想マシンに CPUx2, MEM8GB 割り当て)
CentOS CentOS-7-x86_64-DVD-1611.iso
Vivado Xilinx_Vivado_SDK_2016.4_1215_1
RXTX rxtx-2.2pre2-bins
です。
この環境で MicroBlaze の getting started で bitstream を生成する時間は 20分ぐらいだったかな。。もう一度後で試してみるけど。プログラムのダウンロードから実行までは案外時間かかります。ようやく Hello world 出たと言った感じ。
ところでこの手のツールはそろそろ Mac にも対応して欲しいなぁ。
Linux 版があったり、Eclips 使ってたりと移植簡単じゃん?と思うんだけど。
メーカーの皆様、是非ともよろしくお願いします。
に従って足りないライブラリ調査してみた方がいいかも。
3. Vivado をインストール
以前ウェブインストーラーでもインストールしたことはあるのですが(Ubuntu で)、2016.4 リリース直後にウェブインストーラーを試したら遅すぎだったので全てのOSインストーラーを Mac 側に落としてきて共有フォルダに置いたデータからインストールしました。CentOS でダウンロードしても構わないのですが、自分の場合は色々な OS でお試ししてたこともあって Mac 側に落としてました。
共有フォルダにアクセスするには (% sudo gpasswd -a vboxsf が必要ですね)
% cd <共有フォルダ>/Xilinx_Vivado_SDK_2016.4_1215_1
% sudo sh xsetup
4. ライセンス
Vivado のインストール後でいいです。ホスト名と MAC アドレス(% ifconfig で確認できる)が必要。CentOS だと enp0s3 の ether: 。Vivado 起動後に Help -> Manage License からライセンスファイル Xilinx.lic をロードすれば OK です。ライセンスの種類は Arty には Design Edition が付属してくるのでそれを使っています。期限は一年間のようです。多分そのあとも使えないわけじゃなくて、新しいツールが入手できないだけだと思います。
5. ケーブルドライバをインストール
bitstream をダウンロードするのに必要です。
% cd /opt/Xilinx/Vivado/2016.4/data/xicom/cable_drivers/lin64/install_script/install_drivers
% sudo sh install_digilent.sh
% sudo sh install_drivers
シリアルポート(/dev/ttyUSB*) にユーザー権限でアクセスするために、
% sudo gpasswd -a dialout
で dialout グループに自分を追加。
6. RXTX をインストール
SDK を使うにはこれが必要です。使わないならいらないと思います。
手動でやっちゃったのですが、rxtx-2.2pre2-bins.zip を落としてきて、
RXTXcomm.jar を Java のインストールしてあるディレクトリ
/etc/alternative/lib/ext/jre_1.8.0 以下にコピー。
/opt/Xilinx/SDK/2016.4/eclipse/lnx64.o/plugins/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/os/linux/x86_64 以下の librxtxSerial.so, librxtxParallel.so を入れ替えます。
念のためオリジナルは mv して *.org とでも名前変えて残しておきます。
インストール作業はこれぐらいだったと思います。
あとは任意のディレクトリから Vivado を起動するのですが、
% source /opt/Xilinx/Vivado/2016.4/setting64.sh (sh, bash 系)
と設定をソースしてから vivado を起動することを忘れないように。
% vivado
Digilent の Arty などのボードは FPGA の bitstream, SDK からの MicroBlaze のプログラムのダウンロードとしての JTAG 用のUSBケーブルがシリアル通信用のケーブルと兼用できます(FTDI の FT2232 通して)。CentOS だと /dev/ttyUSB1 がシリアルポート(Virtual COM port VCP)として見えます。Arty で USB UART モジュールをインスタンスして自動配線すると、この UART が /dev/ttyUSB1 経由でアクセスすることができるようになります。
この UART に CentOS でターミナルソフトから /dev/ttyUSB1 をオープンしても良いし、簡単には SDK の SDK Terminal で + ボタンをクリックし、/dev/ttyUSB1 を選択することでも UART にアクセスすることが可能です。ターミナルソフトとしては minicom など。お好きなのを探してみてください。
最後に今回インストールに使ったハードやらソフトやらのバージョンなどについて。
MacBook Pro (Retina 15-inch, Mid 2015) Core i7 2.2GHz, MEM 16GB
macOS Sierra 10.12.2
VirtualBox 5.0.30 (仮想マシンに CPUx2, MEM8GB 割り当て)
CentOS CentOS-7-x86_64-DVD-1611.iso
Vivado Xilinx_Vivado_SDK_2016.4_1215_1
RXTX rxtx-2.2pre2-bins
です。
この環境で MicroBlaze の getting started で bitstream を生成する時間は 20分ぐらいだったかな。。もう一度後で試してみるけど。プログラムのダウンロードから実行までは案外時間かかります。ようやく Hello world 出たと言った感じ。
ところでこの手のツールはそろそろ Mac にも対応して欲しいなぁ。
Linux 版があったり、Eclips 使ってたりと移植簡単じゃん?と思うんだけど。
メーカーの皆様、是非ともよろしくお願いします。
2016/11/10
ARTY と Ubuntu と UART (Serial)
ARTY のチュートリアルに従って Microblaze を動かしてみたかったのだけど、Hello world をシリアル経由で見ることが出来ない。Bitstream のダウンロード及び、Microblaze 用にコンパイルした ELF はロード出来てるとのメッセージは出るのだけど。
ちなみに試してる環境は、Vivado 2016.3 を MacBook (macOS Sierra) の VirtualBox で動作させている Ubuntu16.04 で実行してる。
シリアルポートは Ubuntu 上では /dev/ttyUSB1 (たまに /dev/ttyUSB0 も見える) で認識されている。FTDI の USB - Serial 変換として。
ターミナルソフトは minicom を入れてみた。
minicom 自身も初めて使うので、どこが悪いのかさっぱり。
そもそも /dev/ttyUSB1 を minicom で開けばいいのかとか。
仕方ないので Digilent から提供されてる Sample のプロジェクトを使ってみた。I/O のチュートリアル。
出来ましたよ。LED が周期的に色は変わるし、ボタン押すと minicom で開いた /dev/ttyUSB1 経由でメッセージも出力されてる!

ということで ARTY のシリアルポートを Ubuntu で使うこと出来るということがわかったのでとりあえず安心。今度は Microblaze から UART (シリアル)叩いてみたいなー。というか Microblaze を動かさないと。
ちなみに試してる環境は、Vivado 2016.3 を MacBook (macOS Sierra) の VirtualBox で動作させている Ubuntu16.04 で実行してる。
シリアルポートは Ubuntu 上では /dev/ttyUSB1 (たまに /dev/ttyUSB0 も見える) で認識されている。FTDI の USB - Serial 変換として。
ターミナルソフトは minicom を入れてみた。
minicom 自身も初めて使うので、どこが悪いのかさっぱり。
そもそも /dev/ttyUSB1 を minicom で開けばいいのかとか。
仕方ないので Digilent から提供されてる Sample のプロジェクトを使ってみた。I/O のチュートリアル。
出来ましたよ。LED が周期的に色は変わるし、ボタン押すと minicom で開いた /dev/ttyUSB1 経由でメッセージも出力されてる!

ということで ARTY のシリアルポートを Ubuntu で使うこと出来るということがわかったのでとりあえず安心。今度は Microblaze から UART (シリアル)叩いてみたいなー。というか Microblaze を動かさないと。
2016/11/08
SDK から Project を作る
とりあえず SDK (xsdk) が起動したのはいいのですが、新しいプロジェクトを作ろうとすると SDK Log に
[Hsi 55-1545] Problem running tcl command
のようなエラーが出る。
ググるとどうやら症状は以下であるというところまでたどり着いた。
https://forums.xilinx.com/t5/Installation-and-Licensing/SDK-2014-4-path-problems/td-p/548958
それまでにパッケージのアップグレードやら、Xilinx のサイトにある .tcl コマンドの差し替えやらなんやらも試してみたりしたのだけど、最後に新規プロジェクトがうまく作れない理由は上記にあるように 32bit ライブラリ(i686) がないからだったようです。
困ったことに 64bit 版 Ubuntu に 32bit ライブラリを入れる方法はあちこちに散見されるのだけど、これといったのが見つからない。と、Xilinx のサイトを漁ったらまさにこれ、というのがありました。
https://japan.xilinx.com/support/answers/66184.html
** DocNav には 32ビットライブラリが必要です。
というくだり。Ubuntu へ導入するライブラリのリストと方法が書かれてます!
この手順に従ってライブラリをインストールすると。。
ようやく新規プロジェクトを作成するところまで漕ぎ着けました!!!
しかーし、Bitstream を Arty に流し込めたのはいいものの、Microblaze にソースをロード出来ない。。で最後の最後でまたハマってます。
やろうとしてるチュートリアルは以下。
https://reference.digilentinc.com/learn/programmable-logic/tutorials/arty-getting-started-with-microblaze/start
あ、なんか走ったっぽいけど、確認出来ない。
続きはまた後〜。
もう一つだけ。
シリアルポートは通常ユーザーではアクセスできないので、シリアルポートにアクセスできるグループに自分が所属しておくと便利。
http://qiita.com/chromabox/items/b3ceaab6efa6edde2bda
[Hsi 55-1545] Problem running tcl command
のようなエラーが出る。
ググるとどうやら症状は以下であるというところまでたどり着いた。
https://forums.xilinx.com/t5/Installation-and-Licensing/SDK-2014-4-path-problems/td-p/548958
それまでにパッケージのアップグレードやら、Xilinx のサイトにある .tcl コマンドの差し替えやらなんやらも試してみたりしたのだけど、最後に新規プロジェクトがうまく作れない理由は上記にあるように 32bit ライブラリ(i686) がないからだったようです。
困ったことに 64bit 版 Ubuntu に 32bit ライブラリを入れる方法はあちこちに散見されるのだけど、これといったのが見つからない。と、Xilinx のサイトを漁ったらまさにこれ、というのがありました。
https://japan.xilinx.com/support/answers/66184.html
** DocNav には 32ビットライブラリが必要です。
というくだり。Ubuntu へ導入するライブラリのリストと方法が書かれてます!
この手順に従ってライブラリをインストールすると。。
ようやく新規プロジェクトを作成するところまで漕ぎ着けました!!!
しかーし、Bitstream を Arty に流し込めたのはいいものの、Microblaze にソースをロード出来ない。。で最後の最後でまたハマってます。
やろうとしてるチュートリアルは以下。
https://reference.digilentinc.com/learn/programmable-logic/tutorials/arty-getting-started-with-microblaze/start
あ、なんか走ったっぽいけど、確認出来ない。
続きはまた後〜。
もう一つだけ。
シリアルポートは通常ユーザーではアクセスできないので、シリアルポートにアクセスできるグループに自分が所属しておくと便利。
http://qiita.com/chromabox/items/b3ceaab6efa6edde2bda
登録:
コメント (Atom)

