XilinxのKR260というFPGAボードはTSNに対応しています。
更にTSN対応のRJ-45(LAN)コネクタが2つあります。
TSN スイッチとして、またエンドポイントとしても使えることを紹介します。
TSNスイッチとして使えるFPGAボードで遊んでみた
XilinxのKR260というFPGAボードはTSN(Time Sensitive Networking)に対応しています。
一番の特徴として、TSNに対応できるRJ-45(LAN)コネクタが2つあります。
※残り2つは普通のEthernet用のコネクタです。
内部のIPとしてもスイッチの機能も有りますので、TSNスイッチとしても使えます。
もちろんシンプルにエンドポイント(マスター・スレーブ)としても使用可能です。
実際にTSNの設定の確認、また通信テストを行っていきます。
TSN スイッチ(Switch)とは?
TSNスイッチはデータを送信・受信するだけではなく、データを受け渡しできます。
TSNの時刻同期したデータを、他のTSN機器にも中継することが可能です。
- TSN EndPoint…末端でマスター・スレーブとしてデータを送信・受信できます
- TSN Switch …スイッチとしてデータの中継もできます
複数のTSNスイッチを繋げることで、時刻同期が取れたシステムが構築できます。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TSN_EP===TSN_SW===TSN_SW===TSN_SW……
master > slave > slave > slave ……
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TSN EndPoint Switch(Bridged EndPoint)
今回のKR260のテストでは、TSNのエンドポイントとスイッチ両方対応しています。
IPのModeが「TSN EndPoint Switch(Bridged EndPoint)」が選択されていました。
今回テストしたKR260のFPGAの中身に関しては、個人でも確認することが可能です。
TSNスイッチにした設定を確認する
実際にTSNスイッチの通信テストが出来れば一番良いのですが、環境がありませんでした。
(筆者の環境では)KR260から先に繋げるTSNに対応したデバイスが無いためです。
KR260のLANコネクタ2つを使って、TSNのデータ中継が出来ません。
そのため、TSNスイッチとしてのセットアップした時の設定・ログを確認していきます。
通信は出来なくとも、セットアップの情報は確認できます。
TSN通信のテスト環境
TSNの通信テストと環境構築に関しては下記記事で実施・紹介しています。
TSN Ethernetの実装をFPGA(KR260)で試してみた
テストしたPTP通信がTSNに対応しているかの確認を下記記事で紹介しています。
TSNとPTPの違いは?通信テストの設定・ログから確認してみた
テスト環境は「PTP対応のLANカード(NIC)」と「TSNに対応のFPGAボード」です。
PTP対応のLANカード(NIC)の詳細については下記記事で紹介しています。
IEEE-1588/PTP対応のLANカード(NIC)を動かしてみた
またTSNに対応のFPGAボード(KR260)に関しては下記記事で紹介しています。
TSNスイッチとしてセットアップする
通信テストする際には、TSNスイッチのMACとIPアドレスをセットします。
公式の手順だとスクリプトで隠れていますが、下記箇所になります。
1 |
ubuntu@kria:~$ source /usr/bin/net_setup.sh -b2 |
TSNスイッチとしてのMAC・IPアドレス
ifconfigを行うとTSNスイッチとしてのMAC・IPアドレスの変化が良く分かります。
※またセットアップのスクリプトを実際に解析してみると、更に理解が進みます。
写真イメージとしては、下記のように設定されています。
アドレスに関しては、あくまでデモプログラム一例であることをご了承ください。
TSN_IP内部のMACアドレス、TSN_スレーブとしてのIPアドレスが下記になります。
- EP="00:0a:35:00:01:20" …TSN_IP内部のEPのMACアドレス
- EMAC0="00:0a:35:00:01:2e" …eth2のMACアドレス
- EMAC1="00:0a:35:00:01:2f" …eth3のMACアドレス
- SLV_IP_ADDR=111.222.0.20 …TSN_スレーブのIPアドレス
セットアップ前後のifconfig
実際の通信テストまでは出来ませんでしたが、TSNスイッチとしての設定を確認できました。
特にセットアップ後のIP・MAC箇所を注目してもらえれば良いかと思います。
inet 111.222.0.20 netmask 255.255.255.0 broadcast 111.222.0.255
ether 00:0a:35:00:01:20 txqueuelen 1000 (Ethernet)
ether 00:0a:35:00:01:2e txqueuelen 1000 (Ethernet)
ether 00:0a:35:00:01:2f txqueuelen 1000 (Ethernet)
確認したTSNスイッチのセットアップ前後のifconfigの一部が下記となります。
・セットアップの前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
ubuntu@kria:~$ ifconfig ep: flags=67<UP,BROADCAST,RUNNING> mtu 1500 inet6 fe80::a9b5:5f36:dd0a:fe94 prefixlen 64 scopeid 0x20<link> ether 00:0a:35:00:01:05 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 18 bytes 2698 (2.6 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether 00:0a:35:0f:2c:53 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 37 eth1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether 00:0a:35:0f:3f:16 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 38 eth2: flags=67<UP,BROADCAST,RUNNING> mtu 1500 inet6 fe80::6d96:98e9:7b44:1aab prefixlen 64 scopeid 0x20<link> ether 00:0a:35:00:01:0e txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth3: flags=3<UP,BROADCAST> mtu 1500 ether 00:0a:35:00:01:0f txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
・セットアップの後
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
ubuntu@kria:~$ ifconfig ep: flags=67<UP,BROADCAST,RUNNING> mtu 1500 inet6 fe80::a9b5:5f36:dd0a:fe94 prefixlen 64 scopeid 0x20<link> ether 00:0a:35:00:01:20 txqueuelen 1000 (Ethernet) RX packets 20 bytes 3274 (3.2 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 66 bytes 9594 (9.5 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ep.20: flags=67<UP,BROADCAST,RUNNING> mtu 1500 inet 111.222.0.20 netmask 255.255.255.0 broadcast 111.222.0.255 inet6 fe80::20a:35ff:fe00:120 prefixlen 64 scopeid 0x20<link> ether 00:0a:35:00:01:20 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 9 bytes 746 (746.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth2: flags=67<UP,BROADCAST,RUNNING> mtu 1500 inet6 fe80::6d96:98e9:7b44:1aab prefixlen 64 scopeid 0x20<link> ether 00:0a:35:00:01:2e txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth3: flags=3<UP,BROADCAST> mtu 1500 ether 00:0a:35:00:01:2f txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
TSNのエンドポイントとしての動作
KR260はTSNスイッチとしてだけでなく、エンドポイントとしても動作可能です。
(というかSwitchとして使える→EndPointとしても使える…にほぼなると思います)
エンドポイントとしての、スレーブとマスターの通信テストを確認してみました。
TSNのスレーブとしての通信テスト
KR260でのTSNのスレーブの通信テストは下記記事でまとめています。
TSN Ethernetの実装をFPGA(KR260)で試してみた
TSNのマスターとしての通信テスト
KR260でTSNのマスターとしての通信テストも同様に可能です。
途中まではスレーブで紹介した方法と同じです。下記手順から操作が変わります。
スクリプトの末尾を「-b2」→「-b1」にすることでマスターとしてセットアップできます。
IP・MACアドレスもスレーブとは違うものが割り振られます。
source /usr/bin/net_setup.sh -b1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
ubuntu@kria:~$ source /usr/bin/net_setup.sh -b1 Please enter the password for sudo access Cannot find device "ep.20" No previous config port-swp0 state-4 Successfully set the port state port-swp1 state-4 Successfully set the port state port-swp2 state-4 Successfully set the port state port-swp0 vlanid-20 Successfully added port-swp1 vlanid-20 Successfully added 12: ep.20@ep: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000 link/ether 00:0a:35:00:01:10 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 0 maxmtu 65535 vlan protocol 802.1Q id 20 <REORDER_HDR> egress-qos-map { 0:4 } numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 inet 111.222.0.10/24 brd 111.222.0.255 scope global ep.20 valid_lft forever preferred_lft forever inet6 fe80::20a:35ff:fe00:110/64 scope link tentative valid_lft forever preferred_lft forever *** Board setup for MASTER operations *** |
PTP通信のスクリプトを動かす時も、末尾を「-s」→「-m」に変更します。
source /usr/bin/start_ptp.sh -m
マスターとしてのconfigファイルを読み込んでptp通信を開始します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ubuntu@kria:~$ source /usr/bin/start_ptp.sh -m Please enter the password for sudo access ptp4l: no process found invoking ptp4l wait till complete .......... ptp4l[167.792]: selected /dev/ptp2 as PTP clock ptp4l[167.836]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE ptp4l[167.836]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE ptp4l[173.884]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES ptp4l[173.885]: selected local clock 000a35.fffe.00011e as best master ptp4l[173.885]: port 1: assuming the grand master role PTP started on master, PTP continues to run in background |
KR260(マスター)としてのステートも正常に遷移出来ていることが分かります。
「INITIALIZING→LISTENING → MASTER」
- INITIALIZING…初期化された状態
- LISTENING…ポートがPTPに参加できる状態になった最初の状態
- MASTER…マスターの状態
LANカード(NIC)側のスレーブの時刻同期を確認
LANカード(NIC)側でスレーブの設定ファイルを読み込み、PTP通信を開始します。
1 |
iotengineer@iotengineer-Inspiron-3650:~$ sudo ptp4l -P -2 -H -i enp4s0 -m -f ptp4l_slave.conf >& ptplog & |
出力されたログを確認すると、KR260側のマスタークロックを受け取れています。
最終的にはn(ナノ)s秒単位で時刻同期の精度が取れていることが分かります。
- ptp4l[193.662]: selected best master clock 000a35.fffe.00011e
- ptp4l[207.419]: rms 5 max 8 freq +4451 +/- 3 delay 186 +/- 0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
ptp4l[186.433]: selected /dev/ptp0 as PTP clock ptp4l[186.483]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE ptp4l[186.483]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE ptp4l[189.662]: port 1: new foreign master 000a35.fffe.00011e-1 ptp4l[193.662]: selected best master clock 000a35.fffe.00011e ptp4l[193.662]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE ptp4l[194.789]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED ptp4l[195.414]: rms 153442773471822 max 306885546943925 freq -713 +/- 2277 delay 186 +/- 0 ptp4l[196.415]: rms 760 max 1165 freq +2330 +/- 1035 delay 186 +/- 0 ptp4l[197.415]: rms 1271 max 1335 freq +4651 +/- 337 delay 186 +/- 0 ptp4l[198.415]: rms 813 max 1075 freq +5115 +/- 30 delay 186 +/- 0 ptp4l[199.416]: rms 262 max 431 freq +4866 +/- 91 delay 186 +/- 0 ptp4l[200.416]: rms 42 max 65 freq +4599 +/- 55 delay 186 +/- 0 ptp4l[201.417]: rms 75 max 82 freq +4467 +/- 22 delay 186 +/- 0 ptp4l[202.417]: rms 49 max 67 freq +4436 +/- 3 delay 186 +/- 0 ptp4l[203.418]: rms 16 max 25 freq +4451 +/- 4 delay 186 +/- 0 ptp4l[204.417]: rms 4 max 7 freq +4458 +/- 4 delay 186 +/- 0 ptp4l[205.418]: rms 2 max 4 freq +4460 +/- 3 delay 186 +/- 0 ptp4l[206.419]: rms 2 max 4 freq +4460 +/- 3 delay 186 +/- 0 ptp4l[207.419]: rms 5 max 8 freq +4451 +/- 3 delay 186 +/- 0 |
またLANカード(NIC)側でスレーブとしてのステートを正常に遷移出来ています。
「INITIALIZING→LISTENING → UNCALIBRATED→SLAVE」
- INITIALIZING…初期化された状態
- LISTENING…ポートがPTPに参加できる状態になった最初の状態
- UNCALIBRATED…マスタークロックを受信している状態。同期はまだ未。
- SLAVE…マスタークロックを受信している状態。同期まで済
使用したスレーブの設定ファイル(ptp4l_slave.conf)は下記です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[global] transportSpecific 1 priority1 250 priority2 251 ptp_dst_mac 01:80:C2:00:00:0E p2p_dst_mac 01:80:C2:00:00:0E logAnnounceInterval 1 logSyncInterval -3 follow_up_info 1 announceReceiptTimeout 3 syncReceiptTimeout 3 neighborPropDelayThresh 800 min_neighbor_prop_delay -20000000 network_transport L2 delay_mechanism P2P tx_timestamp_timeout 10 |
まとめ
KR260をTSNのスイッチとして設定、またマスター・スレーブとしてテストできました。
TSNテストできる評価ボードは少ないので、もし興味ある方は是非試してみて下さい。
下記記事でKR260を購入して、セットアップした内容をまとめています。
下記記事でKR260にてTSNの環境構築を構築した内容をまとめています。
TSN Ethernetの実装をFPGA(KR260)で試してみた
コメント