4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Synthesijerで作ったモジュールをMessagePack-RPCで制御する(リモートサーバー編)

Last updated at Posted at 2016-08-01

はじめに

少し間が空きましたが、『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 &

クライアントから制御する例

モジュール例

今回実装したモジュールは Java で次のように記述したものを、Synthesijer で論理合成しました。詳細は『Synthesijerで作ったモジュールをMessagePack-RPCで制御する(アーキテクチャ編)』を参照してください。

Accumulator.java
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ドライバ編)

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?