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

```txt:動作環境
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](https://qiita-image-store.s3.amazonaws.com/0/32870/81b1f082-5214-a89e-8ad3-c7a22bcdd179.png)

- ADC Setupタブを開く
- External Multiplexerのチェックをつける
- VAUXP14 VAUXN14を選択する
  
以下のようになる。

  ![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1efdfef5-57e7-ba92-4a70-6defc5b03280.png)

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

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

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/83cf3cd9-91fc-3578-ee95-069601f0a3a8.png)

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

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/603c3f26-550b-23ed-9885-9dd0be68061e.png)

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

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

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/db2416fa-6633-9d24-fa09-2b0cc3f3d3b6.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](https://qiita-image-store.s3.amazonaws.com/0/32870/58cb941e-6366-f614-a247-e679a14693ef.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](https://qiita-image-store.s3.amazonaws.com/0/32870/c43b530e-0cdf-bce5-8a27-0bcde6edee22.png)

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

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2948aa09-ef77-91d8-d1a4-f011a87f6551.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]
```

<font color=red>set_property PACKAGE_PINのN15に対応する行がないが以降の処理では一応取込みはできている。</font>。

### 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](https://qiita-image-store.s3.amazonaws.com/0/32870/2670e4ea-7ba1-2532-3191-57d96584ef41.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となった