LoginSignup
5
8

More than 5 years have passed since last update.

ZYBO / Pmod > GPIOをPmodコネクタに出力してみた

Last updated at Posted at 2016-07-09
動作環境
DIGILENT ZYBO
Vivado 2015.4 on Windows 8.1 pro(64bit)

Using Standard Pmod in Zybo Zynq-7000 Development Board
http://hybridcores.com/?p=1
http://hybridcores.com/?p=78

上記を参考にGPIOをPmodコネクタに出力してみた。
ただし、上記の通り実施したら記載通りにならない「はまり」があったので、以下記載のように実施した。

関連資料

Pmodコネクタ http://www.marutsu.co.jp/contents/shop/marutsu/datasheet/595400.pdf

Vivado

プロジェクト作成

  • Project Name: 160709_pmodGPIO
  • RTL Project (Do not specify sources at this time はチェックしておく)
  • Zybo指定

プロジェクト設定を変更 (リンク元とdesign_1_wrapperファイルが同じ表示になるように)

  • [Tool] -> [Porject Settings] -> Generalタブ
    • Target languate: VHDL にする

Create Block Design

  • Design name: design_1
  • add IP: ZYNQ7 Processing System
  • Run Block Automation
  • add IP: AXI GPIO
  • Run Connection Automation (S_AXI選択)

GPIOのビット設定

  • axi_gpio_0をダブルクリックしてRe-customize IPを開く

qiita.png

  • Re-customize IPにてIP ConfigurationのところでGPIO widthをPmod コネクタの8出力に合わせて8とする

qiita.png

GPIOポート作成

  • GPIO+の上で右クリックして「Make External」とする
    • GPIOというポートが作成される

qiita.png

  • GPIOというポートをGPIO_Pmodにする (任意)

qiita.png

HDL Wrapper作成

  • Sourcesウィンドウにおいて、design_1上にて右クリックして「Create HDL Wrapper...」を選択する
    • Let Vivado manager wrapper and auto-update

制約ファイルの作成

XDCファイルを作っておく。
ZYBO用にDIGILENTからテンプレートファイルがあるが、ここでは新規作成する。

  • Sourcesウィンドウにおいて、Constraints > constrs_1上にて右クリック、「Add Source」選択
  • Add or create constraints選択して、Next
  • Create Fileをクリック
  • File name: pmodGPIO.xdc とした
  • FinishをクリックしてAdd Sourcesウィンドウを閉じる

Run Implementation実行

  • Generate Bistreamまで実行してもエラーとなるので、Run Implementationを実行する
  • Implementation Completedが表示されたらOpen Implementation Designを選択してOKをクリック
  • 画面下のI/O Portsタブを選択して以下のように展開表示する

qiita.png

GPIOの設定

上記のI/O Portsに関して以下の3つの設定が必要

  1. I/O StdをdefaultからLVCMOS33などの固定値にする
  2. SiteにPmodのコネクタのピンを指定する
  3. Fixedのチェックをつける

Siteの割り当ては以下のp25に記載の図を参考にする。
http://www.marutsu.co.jp/contents/shop/marutsu/datasheet/595400.pdf

今回はPmod ConnectorのJEを使うこととする。

qiita.png

  • 上記参考に以下のように設定する。

qiita.png

  • Ctrl+Sで保存する
  • Out of Date Designというウィンドウが出るのでOKをクリック
  • Save Constraintsというウィンドウが出るのでSelect an existing fileを選択してOK (新規作成したpmodGPIO.xdcに上書きすることになる)

XDCファイルの確認

上記によりpmodGPIO.xdcファイルが変更された。

  • Open Block Designをクリック
  • SourcesのConstraints > constrs_1 > pmodGPIO.xdcを開くと以下のように変更されている
pmodGPIO.xdc
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_pmod_tri_io[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_pmod_tri_io[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_pmod_tri_io[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_pmod_tri_io[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_pmod_tri_io[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_pmod_tri_io[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_pmod_tri_io[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_pmod_tri_io[0]}]
set_property PACKAGE_PIN V12 [get_ports {gpio_pmod_tri_io[7]}]
set_property PACKAGE_PIN W16 [get_ports {gpio_pmod_tri_io[6]}]
set_property PACKAGE_PIN J15 [get_ports {gpio_pmod_tri_io[5]}]
set_property PACKAGE_PIN H15 [get_ports {gpio_pmod_tri_io[4]}]
set_property PACKAGE_PIN V13 [get_ports {gpio_pmod_tri_io[3]}]
set_property PACKAGE_PIN U17 [get_ports {gpio_pmod_tri_io[2]}]
set_property PACKAGE_PIN T17 [get_ports {gpio_pmod_tri_io[1]}]
set_property PACKAGE_PIN Y17 [get_ports {gpio_pmod_tri_io[0]}]

Generate Bitstream

  • Generate Bitstreamを実行する

Export

  • File > Export > Export Hardware...
    • Include bitstreamチェックしてOKクリック
  • File > Launch SDK
    • OKクリック

XSDK

プロジェクト作成

  • File > New > Application Project
    • Project name: gpioPmod
    • Nextクリック
    • Hellow Worldを選択してFinish

ソース

gpioPmod > src > helloworld.cを以下のように書換える。

helloworld.c
#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"
#include "platform.h"

#define PMOD_DEVICE_ID  XPAR_AXI_GPIO_0_DEVICE_ID

XGpio PMODInst;

int main()
{
    init_platform();

    print("Hello World\n\r");

    int status;
    status = XGpio_Initialize(&PMODInst, PMOD_DEVICE_ID);
    if (status != XST_SUCCESS) {
        print("PMOD GPIO initialize failure\r\n");
        return -1;
    }
    XGpio_SetDataDirection(&PMODInst, 1, 0); // 2つ目の引数は1
    XGpio_DiscreteWrite(&PMODInst, 1, 0x0F); // 2つ目の引数は1. Pmod 下段だけON

    while(1) {

    }

    cleanup_platform();
    return 0;
}

実行

  • TeraTermなどを立ち上げて115200bpsにしておく
  • ZYBOの電源投入
  • メニュー Xilinx Tools > Program FPGA > Programをクリック
  • Project ExplorerのgpioPmod > Binaries > gpioPmod.elf上で右クリックして、Run As > 1. Launch on Hardware (System Debugger)で実行する
    • TeraTermにHello Wolrdが表示され、Pmod JEコネクタに電圧が立っている。

電圧の立つところ

http://www.marutsu.co.jp/contents/shop/marutsu/datasheet/595400.pdf
の以下の図参照。

qiita.png

    XGpio_DiscreteWrite(&PMODInst, 1, 0x0F);

の場合、2段のうち下段だけが3.3V立つ。上段は0Vになる。

両段を3.3V立たせるには以下のようにする。

    XGpio_DiscreteWrite(&PMODInst, 1, 0xFF);

あとは0xFFの値を変更することで、任意のビットを立たせたり落としたりできる。

XGpio_DiscreteWrite()の引数

XGpio_DiscreteWrite(&PMODInst, 1, 0x0F);
の2つめの引数は1にすること。

これが分からず「はまって」しまった。

なひたふさんの記事が参考になった。
http://nahitafu.cocolog-nifty.com/nahitafu/2013/07/zynqpspl4-gpio-.html

ようやくPmodで外界との接続ができるようになった。ファーストコンタクト成功!

5
8
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
5
8