Zynqと組み込みLinuxによるフロントエンドエレクトロ
ニクス制御
東大素セ, 高エ研A, Open-It
坂本宏, 佐々木修A, 池野正弘A
東大素セ

坂本宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

1

目次• フロントエンドエレクトロニクスへの要請• ディジタルエレクトロニクス技術動向• SoC(System on Chip)デバイスの紹介• ソフトウエア-ハードウエア-コデザイン• Zynq7000シリーズの技術評価• 組み込みシステムとしてのパフォーマンス
• ベアメタルソフトウエアによる評価• Linuxアプリケーションによる評価• 今後の開発課題
東大素セ

坂本宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

2

Level-0 TGC tracking, Kouta Onogi (Nagoya University (JP)), ATLAS TDAQ Week 2015 May

東大素セ

坂本宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

3

The rapid increase in FPGA complexity
Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御
東大素セ 坂本 宏
http://www.techdesignforums.com/practice/technique/device-native-debug-and-verification-for-fpga/

4Three Ages of FPGAs: A Retrospective on the First Thirty Years of FPGA Technology
Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御
東大素セ 坂本 宏
Stephen M. (Steve) Trimberger, Proceedings of the IEEE | Vol. 103, No. 3, March 2015

5

System on Chip (SoC) Device• 大規模化するFPGA• デザインの開発にかかるコスト• 複雑大規模なデザインのデバッグの困難• 診断や制御機構の組み込みのオーバーヘッド• これらの問題を解決するSoCデバイス• 通常のProgrammable Logic (PL)
• 標準的なCPUコア(ARMなど)によるProcessing System(PS)• 規格化された周辺装置インターフェースとそのIntellectual Property (IP)
• 統合された開発環境
東大素セ坂本宏Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

6

Software-Hardware Co-design• Start algorithm design using C/C++ on conventionalPC• Port the C/C++ algorithm to Zynq
• Convert the algorithm into HDL(Manually/Automatic)• Validate the hardware implementation

Simulated
Input
Pattern
Linux File System

ConventionalIntel
東大素セ 坂本
宏 PC

Algorithm written in C/C++
X86_64 ArchitectureLinux OSZynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

Calculated
OutputPattern
Linux File System
7

Zynq-7000 Platform

Simulated
Input
Pattern
Linux File System

Algorithm written in C/C++
ARM Architecture

PortingCopy via Network
Simulated
Input
Pattern
Linux File System

ConventionalIntel
東大素セ 坂本宏 PC

Linux OSComparison

Algorithm written in C/C++
X86_64 Architecture

Calculated
OutputPattern
Linux File System

Linux OSZynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

Calculated
OutputPattern
Linux File System
8Zynq-7000 Platform

7 Series FPGA Resources

OnlineDetector
Signals
Peripheral Device

HardwareOutputPattern
Peripheral Device
Copy by BIOS

Copy by BIOS
OnlineSignalPattern
Linux File System

Algorithm written in C/C++
ARM Architecture

Comparison

Copy via Network
OnlineSignalPattern
Linux File System

ConventionalIntel東大素セ 坂本
宏 PC

Linux OSCalculated
OutputPattern
Linux File System

Algorithm written in C/C++
X86_64 ArchitectureLinux OSZynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

Calculated
OutputPattern
Linux File System
9Zynq-7000 Platform

7 Series FPGA Resources

OnlineSignalPattern
Peripheral Device

Algorithm written in C/C++
Synthesized by HLS Tools
Hardware Logic
Automatic Translation

OnlineSignalPattern
Linux File System

OnlineSignalPattern
Linux File System

ConventionalIntel
東大素セ 坂本
宏 PC

Comparison

Algorithm written in C/C++
Compiled by ARM Native CC
ARM ArchitectureLinux OSPorting

Copy via Network

Calculated
OutputPattern
Linux File System

Comparison

Algorithm written in C/C++
Compiled by X86_64 Native CC
X86_64 Architecture

HardwareOutputPattern
Peripheral Device

Linux OSZynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

Calculated
OutputPattern
Linux File System
10Zynq-7000 Platform

7 Series FPGA Resources

Simulated
Input
Pattern

Algorithm written in C/C++
Synthesized by HLS Tools
Hardware Logic

Peripheral Device

Copy by BIOS

Automatic Translation

Simulated
Input
Pattern
Linux File System

Simulated
Input
Pattern
Linux File System
ConventionalIntel東大素セ 坂本
宏 PC

Comparison

Algorithm written in C/C++
Compiled by ARM Native CC
ARM ArchitectureLinux OSPorting

Copy via Network

Calculated
OutputPattern
Linux File System

Comparison

Algorithm written in C/C++
Compiled by X86_64 Native CC
X86_64 Architecture

HardwareOutputPattern
Peripheral Device

Linux OSZynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

Calculated
OutputPattern
Linux File System
11Zynq-7000 All Programmable SoC Overview, DS190 (v1.8) May 27, 2015, Xilinx Inc.

Zed Board

東大素セ

坂本宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

Zynq-7000 All Programmable SoC Overview, DS190 (v1.8) May 27, 2015, Xilinx

ZC706

12

Zed Board

ZC706
東大素セ

坂本宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御
13Zynq-7000 All Programmable SoC Overview, DS190 (v1.8) May 27, 2015, Xilinx Inc.

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御東大素セ 坂本 宏
Zynq-7000 All Programmable SoC Overview, DS190 (v1.8) May 27, 2015, Xilinx Inc.

14

東大素セ

坂本

宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御 ZedBoard Hardware User’s Guide,
15

Version 2.2 27 January 2014, AVNET

東大素セ

坂本宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

16

東大素セ

坂本

宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

17

東大素セ

坂本宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

18

東大素セ

坂本

宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

19

東大素セ

坂本宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

20計数の方法• 32ビットバイナリー
カウンター• システムクロックでの駆動(100MHz)• 10ns分解能• GPIOで読み書き

東大素セ

坂本

宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

21

ベアメタルプログラム～GPIO
変数代入235ns
ポインター代入241ns• 方法1

XGpio_DiscreteWrite(&CounterControlOutput,COUNTER_CONTROL_CHANNEL, COUNTER_ENABLE_BIT );cvalue = XGpio_DiscreteRead(&CounterDataInput,COUNTER_DATA_CHANNEL);• 方法2
unsigned char * timer_control = 0x41240000;* timer_control = 0x02;
unsigned long * timer_value = 0x41230000;
Unsigned long lap = * timer_value;
ポインター代入226ns

東大素セ

坂本宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

22

m_virtual_address = (unsigned int*) m_virtual_base + ( m_physical_address - m_address_offset );Linuxプログラム～GPIOunsigned int m_physical_address;::off_t m_address_offset;

ポインター代入250ns

unsigned int * m_virtual_base;unsigned int * m_virtual_address;
int m_file_descriptor;
m_physical_address = 0x41200000;

m_file_descriptor = open( "/dev/mem", O_RDWR | O_SYNC );m_address_offset = m_physical_address & ~(getpagesize()-1);

m_virtual_base = (unsigned int*)mmap(NULL, 1, PROT_READ | PROT_WRITE,
MAP_SHARED, m_file_descriptor, m_address_offset );m_virtual_address = (unsigned int*) m_virtual_base +( m_physical_address - m_address_offset );Int cvalue = * m_virtual_address;
東大素セ

坂本宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

23

BRAM
ベアメタルの場合
unsigned int * uiDataArray = (unsigned int *)XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR;

Write: 158ns
Read: 190ns

Int uiLoop, uiData;*(unsigned int *)(uiDataArray + uiLoop) = uiLoop;uiData = *(unsigned int *)(uiDataArray + uiLoop);

Linuxの場合
enum { BRAM_PHYSICAL_ADDRESS = 0x40000000,
BRAM_MEMORY_SIZE = 0x2000};

Write: 112ns
Read: 207ns(Cf. DDR: 21ns)

m_file_descriptor = open( "/dev/mem", O_RDWR | O_SYNC );m_virtual_base = (unsigned int*)mmap(NULL, 1, PROT_READ | PROT_WRITE,

MAP_SHARED, m_file_descriptor, BRAM_PHYSICAL_ADDRESS);

東大素セ

坂本宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

24Measured Access Speed for GPIO and BRAM
Platform

Operation

Implementation

Board

Speed

Bare Metal

GPIO Read*DDRPointer = XGpio_DiscreteRead();

ZedBoard

241ns

GPIO Read*DDRPointer = XGpio_DiscreteRead();

ZC706*

420ns

GPIO Read

DDRData = XGpio_DiscreteRead();ZedBoard

235ns

GPIO Read*DDRPointer = * DirectPointer;

ZedBoard

226ns

BRAM Write * DirectPointer = * DDRPointer;

ZedBoard

158ns

BRAM Read* DDRPointer = * DirectPointer;

ZedBoard

190ns

GPIO Read* DDRPointer = * MmapPointer;

ZedBoard

250ns

BRAM Write* MMapPointer = * DDRPointer;

ZedBoard

112ns

BRAM Read* DDRPointer = * MMapPointer;

ZedBoard

207ns

DDR Read* DstDDRPointer = * SrcDDRPointer;

ZedBoard

21ns

Linux*) PL clock frequency of ZC706 was 50MHz which is the half of ZedBoard (100MHz)
Dhrystone benchmark: 1,108,060 ( = 630 DMIPS, 0.95 DMIPS/MHz ) for both boards.
東大素セ

坂本

宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

25

ベアメタルプログラム～割り込みstatus = XScuGic_Connect(&INTCInst, INTC_GPIO_INTERRUPT_ID,(Xil_ExceptionHandler)BTN_Intr_Handler, (void *)GpioInstancePtr);
XGpio_InterruptEnable(GpioInstancePtr, 1);
XGpio_InterruptGlobalEnable(GpioInstancePtr);

XScuGic_Enable(&INTCInst, INTC_GPIO_INTERRUPT_ID);

東大素セ

坂本宏

割り込み事象が発生してからハンドラーに飛ぶまでの時間
初回 730ns 次回以降 220ns

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

26Linuxプログラム～割り込み• 基本的にカーネルモジュールで操作する。

• uio(User Space IO)を用いてユーザスペースから操作が可能だが新しいリリースではサポートされていない。
• インタラプトハンドラーをカーネルモジュールとして作成• カーネルバージョン4.4• Device Treeによるハードウエア記述• GPIO consumerとしてデザインする

比較的大きなレスポンス
タイム(スイッチが押されてからハンドラーが呼ばれるまでの時間)
3.5μsと7.0μsにピーク

Interrupt response timein 10ns ticks
300
250
200
150
100

5000

東大素セ

坂本宏

50 100 150 200 250 300 350 400 450 500 550 600 650 700 750 800 850 900 950

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

27

Linuxプログラム～/sys/class/gpio
fd_export = open("/sys/class/gpio/export", O_WRONLY);
write( fd_export, “901”, 3);close( fd_export );fd_switch_value= open("/sys/class/gpio/gpio901/value", O_RDONLY);
char switch_value[2];read( fd_switch_value, &switch_value, 1 );close( fd_switch_value );fd_unexport = open("/sys/class/gpio/unexport", O_WRONLY );write( fd_unexport, “901”, 3);close( fd_unexport );

東大素セ

坂本宏

オーバーヘッドが極めて大きく、1ビットのアクセスに4,510nsかかっている。実用的ではない。
/sys/classはユーザスペースからデバッグ等で利用するもの。

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

28Dhrystone Benchmark• 得られた結果はZedBoardの場合937,448。
Wikipediaによるとこの数字を1757(VAX11/780のDhrystone値)で割ったものをDMIPSというらしいが、この場合534になる。ZedBoardでは666.7MHzでARMが動いている。この結果0.800DMIPS/MHz。
• ARMの公称値はCortex-A9 2.5 DMIPS/MHzだそうだ(伝聞)半分も出ていないがいいのか？
• Linuxで動かしてみた値は943,396.2。これだと0.805DMIPS/MHz。
東大素セ

坂本

宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

29

開発計画
• 2016年度• 評価ボードによる技術検証• 割り込み・DMA• GTX等のソフトウエア制御• Partial Reconfiguration• HLS (Higher Level Synthesis)• Linuxによる制御技術の確立• カーネルハッキング• デバイスドライバー• サポートライブラリ• 2017年度• PTZ仕様決定• PTZデザイン及び試作• 2018年度• PTZ量産• フロントエンドエレクトロニクス開発デモ

東大素セ

坂本

宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御30

まとめに代えて• SoCデバイスの有効性• 大規模アプリケーションで特に有効• 開発サイクルの大幅短縮• 高度な診断・モニターが可能• 広範囲にわたる開発課題• ハードウエア• IPベースの開発・IPパッケージ化• HLSの採用・最適化技術• ソフトウエア• カーネルモジュール開発とOSの構築• サポートツール開発• 共同開発の必要性• IPやソフトウエアなど産物の共有• OpenItプロジェクト

東大素セ

坂本

宏

Zynqと組み込みLinuxによるフロントエンドエレクトロニクス制御

31