LoginSignup
7
5

More than 1 year has passed since last update.

2016-07-09 ZYBO | Pmod | XADC > PmodからAD取込みしてみた

Last updated at Posted at 2016-07-09
動作環境
DIGILENT ZYBO
Vivado 2015.4 on Windows 8.1 pro(64bit)
Analog Discovery 2 (以下AD2) : Wave generatorでsin curveを生成する

PmodコネクタからAD取込みをしたい。

https://forums.xilinx.com/t5/Zynq-All-Programmable-SoC/XADC-on-ZyBo-PMOD/td-p/516935
https://support.xilinx.com/s/question/0D52E00006hpTdxSAE/xadc-on-zybo-pmod?language=ja (2021-10-24リンク更新)
を見ると以下をXADC Wizardにて追加すればよいようだ。

  • vauxn14
  • vauxp14

作業の主な流れは以下と大半がかぶる
http://qiita.com/7of9/items/2e714e66d4a6c78c4a02

関連資料

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

Vivado

プロジェクト作成

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

Create Block Design

  • Design name: design_1
  • add IP: ZYNQ7 Processing System
  • Run Block Automation
  • add IP: XADC Wizard
  • Run Connection Automation

XADCの設定

Pmod XADC (Pmod JA)をXADC取込みするように設定をする。

  • xadc_wiz_0をダブルクリックしてRe-customize IPウィンドウを開く

qiita.png

  • ADC Setupタブを開く
  • External Multiplexerのチェックをつける
  • VAUXP14 VAUXN14を選択する

以下のようになる。

qiita.png

  • Re-customize IPウィンドウにてOKをクリックしてウィンドウを閉じる

xadc_wiz_0にVaux14が追加されている。

qiita.png

  • +Vaux14の「+」をクリックして展開表示する
    • vauxn14とvauxp14が表示される

qiita.png

  • vauxn14上にて右クリックして「Make External」を選択して外部ポートを追加する
  • vauxp14上にて右クリックして「Make External」を選択して外部ポートを追加する

以下の2つのポートが追加される。

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: pmodXADC.xdc とした
  • FinishをクリックしてAdd Sourcesウィンドウを閉じる

Run Implementation実行

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

qiita.png

vauxn14 / vauxp14の設定

vauxn14 / vauxp14に関して以下の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

XADCの場合はPmod JA(XADC)コネクタを使う。その中でもJA1:N15とJA7:N16を使うようだ。

qiita.png

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

qiita.png

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

XDCファイルの確認

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

  • Open Block Designをクリック
  • SourcesのConstraints > constrs_1 > pmodXADC.xdcを開くと以下のように変更されている
pmodXADC.xdc
set_property IOSTANDARD LVCMOS33 [get_ports vauxn14]
set_property IOSTANDARD LVCMOS33 [get_ports vauxp14]
set_property PACKAGE_PIN N16 [get_ports vauxn14]

set_property PACKAGE_PINのN15に対応する行がないが以降の処理では一応取込みはできている。

Generate Bitstream

  • Generate Bitstreamを実行する

Export

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

XSDK

プロジェクト作成

  • File > New > Application Project

    • Project name: pmodXADC
    • Nextクリック
    • Hellow Worldを選択してFinish
  • Project ExplorerのpmodXADC > src > helloworld.cを以下のソースに書換える。

helloworld.c
#include <stdio.h>
#include "platform.h"
#include "xadcps.h"

#define XPAR_AXI_XADC_0_DEVICE_ID ( XPAR_XADC_WIZ_0_DEVICE_ID )

static XAdcPs  XADCInst; //XADC

static void adc_config(XAdcPs *XADCInstPtr, u16 XAdcDeviceId);

int main()
{
    init_platform();

    adc_config(&XADCInst,XPAR_AXI_XADC_0_DEVICE_ID );

    return 0;
}

static void adc_config(XAdcPs *XADCInstPtr, u16 XAdcDeviceId)
{
    XAdcPs_Config *ConfigPtr;
    u32 rawData;
    float voltage;

    ConfigPtr = XAdcPs_LookupConfig(XPAR_AXI_XADC_0_DEVICE_ID);
    XAdcPs_CfgInitialize(XADCInstPtr,ConfigPtr,ConfigPtr->BaseAddress);
    XAdcPs_SetSequencerMode(XADCInstPtr,XADCPS_SEQ_MODE_SINGCHAN);

    //  XAdcPs_SetSeqInputMode(XADCInstPtr, XADCPS_SEQ_MODE_ONEPASS);
    XAdcPs_SetSeqInputMode(XADCInstPtr, XADCPS_SEQ_MODE_SAFE);

    XAdcPs_SetSeqChEnables(XADCInstPtr, (XADCPS_CH_AUX_MIN+14) );

    while(1){
        rawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_AUX_MIN+14);
//      voltage = XAdcPs_RawToVoltage(rawData);
        voltage = (float)rawData / 65536.0;
        printf("%lu %.2f\n\r", rawData, voltage);
        sleep(1); // sec
    }
}

XADCPS_CH_AUX_MIN+14というのはvaux*14に対応するようだ。

AD出力の準備

PmodからのXADC取込みの試験のため、AD2のWave Generator機能を使った。
AD2がない場合は、0-1V範囲の電圧を出力するものを用意すること。

AD2では以下のような設定を行い0-1Vの間のsin curveを周期10秒で出すようにした。

qiita.png

AD2とZYBOの接続は以下とした。

  • AD2: W1 <--> ZYBO: Pmod JA Pin1
  • AD2: GND <--> ZYBO: Pmod JA Pin7

実行

  • TeraTermなどを立ち上げて115200bpsにしておく
  • ZYBOの電源投入
  • メニュー Xilinx Tools > Program FPGA > Programをクリック
  • Project ExplorerのpmodXADC > Binaries > pmodXADC.elf上で右クリックして、Run As > 1. Launch on Hardware (System Debugger)で実行する

TeraTermの画面にAD取込み値が表示された。右側の値が0-1Vの間を行き来している。

48614 0.74
62194 0.95
64399 0.98
54410 0.83
36064 0.55
16388 0.25
2952 0.05
708 0.01
10759 0.16
28858 0.44
48863 0.75
62170 0.95
64241 0.98
54460 0.83
36021 0.55
16426 0.25
2697 0.04

はまった点

  • 差動入力なのに、ZYBOのGNDピンにAD2:GNDを接続していた
    • 値が5秒間くらい表示され、残り5秒は0となった
7
5
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
7
5