ZYBOでXillinux2.0(GPIO・Lチカ編)

はじめに

このページではXillinuxのGPIOを使ってLチカ(LED点灯制御)をしてます。ベースになる環境はXillinux2.0(導入編)で構築したものです。

セミナー情報<広告>

実習・1日でわかる!FPGAプロセッサNios II入門(基礎編)

2018年9月21日(金)、CQ出版社セミナルーム
ハードとソフトのいいとこ取り開発に挑戦

詳しくはこちらへ

1.GPIO番号の調査

1-1.トップ回路記述の確認

xillinuからGPIOを使ってLチカしようと思うのですがGPIO番号が分からない?
ドキュメントを斜め読みしてみますが、読むところが違うのか分からない?
そこで設計データのトップ回路記述(xillinux-eval-zybo-2.0c\verilog\srcxillydemo.v)を読んでみると
信号はPS_GPIO[54:0]が使われています。

xillydemo.vの抜粋

module xillydemo
  (
  input  clk_100,
  input  otg_oc,  
  inout [55:0] PS_GPIO,

~~途中省略~~
    // General signals
    .clk_100(clk_100),
    .otg_oc(otg_oc),
    .PS_GPIO(PS_GPIO),


1-2.PIN配置制の確認

次にPIN配置制約(xillinux-eval-zybo-2.0c\vivado-essentials\xillydemo.xdc)を読んでみると

LED(PINロケーション:D18,G14.M15,M14)はPS_GPIOではなくGPIO_LED[3:0]に繋がっている.

コメントには
PS_GPIO[10:7]はLEDに接続、でもxillybusでは使えない...

LEDはピン配置変更しないとGPIOからは使えなさそうです。

 

xillydemo.xdcの抜粋(LED回り)

set_property -dict "PACKAGE_PIN M14 IOSTANDARD LVCMOS33" [get_ports "GPIO_LED[0]"]
set_property -dict "PACKAGE_PIN M15 IOSTANDARD LVCMOS33" [get_ports "GPIO_LED[1]"]
set_property -dict "PACKAGE_PIN G14 IOSTANDARD LVCMOS33" [get_ports "GPIO_LED[2]"]
set_property -dict "PACKAGE_PIN D18 IOSTANDARD LVCMOS33" [get_ports "GPIO_LED[3]"]

~~途中省略~~

# PS_GPIO pins:
# GPIO pin 0 was USB OTG PHY reset on Zedboard, now going from MIO46 directly
# GPIO pins 6-1 were connected to OLED on Zedboard, now unused
# GPIO pins 10-7 were connected to the four LEDS not used by Xillybus.
#

 


1-3.スライドスイッチのGPIO接続

Lチカは後回しにして、先にGPIOからスライドスイッチの読み込みをしてみます。

xillydemo.xdcではスライドスイッチ(ロケーション:T16,W13,P15,G15)がPS_GPIO[14:11]に接続してます。

 

xillydemo.xdcの抜粋(スライドスイッチ)

# On-board Slide Switches

set_property -dict "PACKAGE_PIN G15 IOSTANDARD LVCMOS33" [get_ports "PS_GPIO[11]"]
set_property -dict "PACKAGE_PIN P15 IOSTANDARD LVCMOS33" [get_ports "PS_GPIO[12]"]
set_property -dict "PACKAGE_PIN W13 IOSTANDARD LVCMOS33" [get_ports "PS_GPIO[13]"]
set_property -dict "PACKAGE_PIN T16 IOSTANDARD LVCMOS33" [get_ports "PS_GPIO[14]"]


2.GPIO操作

2-1.とりあえずGPIOで読んでみる

PS_GPIO[14:11]がスライドスイッチに接続しているので

素直に、xillinuxのコンソールからGPIO11にアクセスしてます。

 

 

 

アクセスできてない...

 

root@localhost:~# echo 11 > /sys/class/gpio/export

root@localhost:~# echo in > /sys/class/gpio/gpio11/direction
root@localhost:~# cat /sys/class/gpio/gpio11/value
1

~~スライドスイッチ0を動かして
root@localhost:~# !!
cat /sys/class/gpio/gpio11/value
1

~~値が変わらない読めてない...


2-2.GPIO番号の情報を探す

PIO番号と信号の番号が一致してないことはいつものことなので、Webで調べます
http://zedboard.org/content/accessing-leds-and-switches-xillinux
にオフセットが54と情報があります。
54+11=65と言うことで、コンソールからGPIO65を操作します。
スライドスイッチの値の読み込み成功です。

 

root@localhost:~# echo 65 > /sys/class/gpio/export
root@localhost:~# echo in > /sys/class/gpio/gpio65/direction
root@localhost:~# cat /sys/class/gpio/gpio65/value
0
~~スライドスイッチ0を動かして
root@localhost:~# !!
cat /sys/class/gpio/gpio65/value
1
~~値が変わった!!


3.Lチカ(LED点灯制御)

3-1.Vivadoでトップ回路記述変更

GPIOからLチカをするためには外部PINへの接続の変更が必要です。xillydemo.xdcで配置を変更してもよいのですが、Vivadoでの回路変更も試してみたいので、トップ回路記述でPS_GPIO[10:7]をGPIO_LED[3:0]に接続するように変更してみます。

Vivadoを起動してxillinuxの設計プロジェクトを読み込みます。以下を操作します。

①sourceのxillydemo.vをダブルクリックすると右側のテキストウインドにxillydemo.vが開く

②オリジナルのGPIO_LEDの接続をコメントアウトしてGPIO_LEDの接続先を空白してオープンにする。

③GPIO_LEDにPS_GPIO[10:7]を接続接続するassign文を追加する

その後はセーブしてBITファイルを生成する


3-2.MicroSDカードの回路情報変更

Xillinuxをhaltコマンドで終了してZYBOの電源を切ります。MicroSDカードを取り出してPCへ接続します。新しく作ったBITファイルをMicroSDカードへ上書きコピーして差し替えます。MicroSDカードをZYBOに戻して電源をれます。Xillinuxが立ち上がるります。GPIOのデフォルト値は1のようでLEDがはじめから点灯しています。

 


3-3.LED制御

PS_GOIO[7]がLD0のLEDに接続されているので

54+7=61でGPIO64を操作します。

 

root@localhost:~# echo 61 > /sys/class/gpio/export
root@localhost:~# echo out > /sys/class/gpio/gpio61/direction


directionをoutにした時点でLD0が消灯します。

 



valueに1をセットすると点灯

valueに0をセットすると消灯します

 

 


root@localhost:~# echo 1 > /sys/class/gpio/gpio61/value
root@localhost:~# echo 0 > /sys/class/gpio/gpio61/value


最後にLEDを1個おきに点灯してみます。

右のコマンドで

LD0=ON,LD1=OFF,LD2=N,LD3=OFF

になります。

xillydemo.xdcを確認するPMODとの接続も分かるので同様の操作でPMODも制御可能です。

 

GPIO・Lチカ編はここまで

 

root@localhost:~# echo 62 > /sys/class/gpio/export
root@localhost:~# echo 63 > /sys/class/gpio/export
root@localhost:~# echo 64 > /sys/class/gpio/export
root@localhost:~# echo out > /sys/class/gpio/gpio62/direction
root@localhost:~# echo out > /sys/class/gpio/gpio63/direction
root@localhost:~# echo out > /sys/class/gpio/gpio64/direction
root@localhost:~# echo 1 > /sys/class/gpio/gpio61/value
root@localhost:~# echo 0 > /sys/class/gpio/gpio62/value
root@localhost:~# echo 1 > /sys/class/gpio/gpio63/value
root@localhost:~# echo 0 > /sys/class/gpio/gpio64/value