はじめに
少し間が空きましたが、『Synthesijerで作ったモジュールをMessagePack-RPCで制御する(アーキテクチャ編)』の続編です。
今回は
- socat を使って Zynq/DE0-Nano-SoC 上に MessagePack-RPC サーバーを作って
- Java で記述して Synthesijer で合成して FPGA 上に作ったモジュールを
- ネットワーク経由で
- python で作ったスクリプトで制御
します。
socat
socat とは
socat は、簡単にソケット通信をサーバー側としてもクライアント側としても 使える便利なコマンドです。
Linux のユーザー空間アプリケーションと FPGA 上のモジュールとは TTY ドライバを経由して通信しています。詳細は『Synthesijerで作ったモジュールをMessagePack-RPCで制御する(TTYドライバ編)』を参照してください。
socat は、この TTY ドライバとネットワークの仲立ちをします。
インストール
Debian 系のLinux が載っている Zynq や DE0-Nano-Soc などでは、apt-get を使って簡単にインストールすることが出来ます。
shell% sudo apt-get install socat
サーバーとして起動
次のように起動することにより、サーバーとして起動します。
shell% sudo socat -d -d tcp-listen:54321,fork /dev/zptty0,raw,nonblock,echo=0 &
-
tcp-listen:<port>
でサーバーとして待つポートを指定します。上の例では<port>
に54321を指定しています。 -
/dev/zptty0,raw,nonblock,echo=0
で 『Synthesijerで作ったモジュールをMessagePack-RPCで制御する(TTYドライバ編)』で説明した TTY ドライバを指定します。
クライアントから制御する例
モジュール例
今回実装したモジュールは Java で次のように記述したものを、Synthesijer で論理合成しました。詳細は『Synthesijerで作ったモジュールをMessagePack-RPCで制御する(アーキテクチャ編)』を参照してください。
public class Accumulator {
public int reg;
public int add(int x) {
reg = reg + x;
return reg;
}
}
クライアントからの制御
msgpack-rpc-python を使って、別のコンピューターから Zynq/DE0-Nano-SoC 上の MessagePack-RPC サーバーにアクセスします。
"???.???.???.???" には Zynq/DE0-Nano-SoC の IPアドレスを、54321 は socat を起動したときのポート番号を指定します。
shell% python
Python 2.7.10 (default, Oct 14 2015, 16:09:02)
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import msgpackrpc
>>> cli = msgpackrpc.Client(msgpackrpc.Address("???.???.???.???", 54321))
>>> result = cli.call('$SET', {"reg":1})
>>> result = cli.call('$GET', {"reg":None})
>>> print result
[{'reg': 1}]
>>> print cli.call('add', 10)
11
>>> result = cli.call('$GET', {"reg":1})
>>> print result
[{'reg': 11}]
>>> exit()
$SET
で "reg" 変数に 1 をセットします。引数には{変数名:値}
の辞書を指定します。
$GET
で "reg" 変数の値を確認します。引数には{変数名:None}
の辞書を指定します。戻り値は{変数名:値}
です。
add
で "reg" 変数の値に引数の値を加算します。引数には整数を指定します。戻り値は加算した値です。
##参照
MessagePack for VHDL (https://github.com/ikwzm/msgpack-vhdl)
MessagePack for VHDL Examples (https://github.com/ikwzm/msgpack-vhdl-examples)
MessagePack-RPCを使ってFPGAを制御
Synthesijerで作ったモジュールをMessagePack-RPCで制御する(アーキテクチャ編)
Synthesijerで作ったモジュールをMessagePack-RPCで制御する(IP-Package編)
Synthesijerで作ったモジュールをMessagePack-RPCで制御する(ZYNQ論理合成編)
Synthesijerで作ったモジュールをMessagePack-RPCで制御する(TTYドライバ編)