日曜技術者のメモ

趣味でやった事のメモ書きです。

Zedboard ADCでアナログ値を読んでみた -1-

SPIはちょっと休憩して気晴らしにZynqが内蔵してる
XADCの値を読んでUART経由で表示してみた。

今回はSDKでプログラムを実行するとADCにて抵抗にかかる電圧を測定し
プログラムを終了するという流れを作成しました。
プログラム自体はサンプルをほとんどそのまま使用しました。

いつも通りCTTのサンプルを変更して作成しました。

以下変更した点

1.XADCの追加

XPS上でADCを追加します。
IP一覧の中にAXI XADCというIPがあるのでそれを選択

f:id:ginnyu-tei:20121022201546g:plain

追加しますか?と聞かれるのでYesを選択
設定画面が表示されるが特に変更する箇所はないのでそのままOK
「Instantiate and Connect IP」のウィンドウが出たらOKを押す。
f:id:ginnyu-tei:20121022202300j:plain
上のボタンを選択していると自動的にCPUまで接続してくれます。
自分で接続したい場合は下のボタンを選択するとIPの設置のみしてくれます。

では、接続できているか確認します。
まずはBus Interfacesタブ
f:id:ginnyu-tei:20121022202838j:plain
CPU側(processing_system7_0)とaxi_xadc_0が
axi_interconnect_1経由で接続されています。

Graphical Design Viewタブで各ブロックの接続図が見れます。
f:id:ginnyu-tei:20121022203411j:plain

それからADCのアドレスを確認します。
Addressesタブで割り振られているアドレス範囲を確認できます。
f:id:ginnyu-tei:20121022205035j:plain

ちなみにクロックはFCLK_CLK0が接続されます。
クロックの設定はZynqタブ内のClock Wizardで確認できます。
デフォルトで100MHzの様です。

2.ADCの信号を外部に出す
ここで「Ports」タブでAXI以外の配線の確認をします。
f:id:ginnyu-tei:20121022204113j:plain
図中の赤枠がADCの外部へ接続されるポートです。
詳細はドキュメントを参照してもらうとして
今回はVAUXNとVAUXPの一部ビットのみ使用します。

2.TOPを作成する。
XPSを閉じてPlanAheadに戻ります。

CTTではsystemを右クリック->Create Top HDLで作成しましたが、今回はTOPを自作します。
上にも書いた通りVAUXNとVAUXPのビットの一部のみで良いので
そのまますべてトップに出したままにするとBitstream生成中にエラーになりました。

ですので、TOPを自作し未使用のビット処理も中にいれます。
(Create Top HLDで生成したHDLはそのまま編集出来ないようです。
編集後、Schematicで回路図を見るとTOPのポートが見接続になっていましました。)


ではTOPを作成します。
Systemを右クリック->「View Instantiation Template」を選択します。
f:id:ginnyu-tei:20121022210109j:plain

system.vというファイルができます。
ファイルを見るとsystemモジュールのインスタンスのみ記載されています。
これにポートの設定を追加します。

/*******************************************************************************
*     This file is owned and controlled by Xilinx and must be used             *
*     solely for design, simulation, implementation and creation of            *
*     design files limited to Xilinx devices or technologies. Use              *
*     with non-Xilinx devices or technologies is expressly prohibited          *
*     and immediately terminates your license.                                 *
*                                                                              *
*     XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"            *
*     SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR                  *
*     XILINX DEVICES.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION          *
*     AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION              *
*     OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS                *
*     IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT,                  *
*     AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE         *
*     FOR YOUR IMPLEMENTATION.  XILINX EXPRESSLY DISCLAIMS ANY                 *
*     WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE                  *
*     IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR           *
*     REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF          *
*     INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS          *
*     FOR A PARTICULAR PURPOSE.                                                *
*                                                                              *
*     Xilinx products are not intended for use in life support                 *
*     appliances, devices, or systems. Use in such applications are            *
*     expressly prohibited.                                                    *
*                                                                              *
*     Copyright (c) 1995-2012 Xilinx, Inc.  All rights reserved.               *
*******************************************************************************/

// The following must be inserted into your Verilog file for this
// core to be instantiated. Change the instance name and port connections
// (in parentheses) to your own signal names.
module system_stub
  (
    processing_system7_0_MIO,
    processing_system7_0_PS_SRSTB,
    processing_system7_0_PS_CLK,
    processing_system7_0_PS_PORB,
    processing_system7_0_DDR_Clk,
    processing_system7_0_DDR_Clk_n,
    processing_system7_0_DDR_CKE,
    processing_system7_0_DDR_CS_n,
    processing_system7_0_DDR_RAS_n,
    processing_system7_0_DDR_CAS_n,
    processing_system7_0_DDR_WEB_pin,
    processing_system7_0_DDR_BankAddr,
    processing_system7_0_DDR_Addr,
    processing_system7_0_DDR_ODT,
    processing_system7_0_DDR_DRSTB,
    processing_system7_0_DDR_DQ,
    processing_system7_0_DDR_DM,
    processing_system7_0_DDR_DQS,
    processing_system7_0_DDR_DQS_n,
    processing_system7_0_DDR_VRN,
    processing_system7_0_DDR_VRP,
    axi_xadc_0_VAUXN0_pin,
    axi_xadc_0_VAUXP0_pin,
    axi_xadc_0_VAUXN8_pin,
    axi_xadc_0_VAUXP8_pin
  );
  inout [53:0] processing_system7_0_MIO;
  input processing_system7_0_PS_SRSTB;
  input processing_system7_0_PS_CLK;
  input processing_system7_0_PS_PORB;
  inout processing_system7_0_DDR_Clk;
  inout processing_system7_0_DDR_Clk_n;
  inout processing_system7_0_DDR_CKE;
  inout processing_system7_0_DDR_CS_n;
  inout processing_system7_0_DDR_RAS_n;
  inout processing_system7_0_DDR_CAS_n;
  output processing_system7_0_DDR_WEB_pin;
  inout [2:0] processing_system7_0_DDR_BankAddr;
  inout [14:0] processing_system7_0_DDR_Addr;
  inout processing_system7_0_DDR_ODT;
  inout processing_system7_0_DDR_DRSTB;
  inout [31:0] processing_system7_0_DDR_DQ;
  inout [3:0] processing_system7_0_DDR_DM;
  inout [3:0] processing_system7_0_DDR_DQS;
  inout [3:0] processing_system7_0_DDR_DQS_n;
  inout processing_system7_0_DDR_VRN;
  inout processing_system7_0_DDR_VRP;
  input axi_xadc_0_VAUXN0_pin;
  input axi_xadc_0_VAUXP0_pin;
  input axi_xadc_0_VAUXN8_pin;
  input axi_xadc_0_VAUXP8_pin;
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG

  (* BOX_TYPE = "user_black_box" *)
  system
    system_i (
      .processing_system7_0_MIO ( processing_system7_0_MIO ),     // inout [53:0] processing_system7_0_MIO;
      .processing_system7_0_PS_SRSTB ( processing_system7_0_PS_SRSTB ),     // input processing_system7_0_PS_SRSTB;
      .processing_system7_0_PS_CLK ( processing_system7_0_PS_CLK ),     // input processing_system7_0_PS_CLK;
      .processing_system7_0_PS_PORB ( processing_system7_0_PS_PORB ),     // input processing_system7_0_PS_PORB;
      .processing_system7_0_DDR_Clk ( processing_system7_0_DDR_Clk ),     // inout processing_system7_0_DDR_Clk;
      .processing_system7_0_DDR_Clk_n ( processing_system7_0_DDR_Clk_n ),     // inout processing_system7_0_DDR_Clk_n;
      .processing_system7_0_DDR_CKE ( processing_system7_0_DDR_CKE ),     // inout processing_system7_0_DDR_CKE;
      .processing_system7_0_DDR_CS_n ( processing_system7_0_DDR_CS_n ),     // inout processing_system7_0_DDR_CS_n;
      .processing_system7_0_DDR_RAS_n ( processing_system7_0_DDR_RAS_n ),     // inout processing_system7_0_DDR_RAS_n;
      .processing_system7_0_DDR_CAS_n ( processing_system7_0_DDR_CAS_n ),     // inout processing_system7_0_DDR_CAS_n;
      .processing_system7_0_DDR_WEB_pin ( processing_system7_0_DDR_WEB_pin ),     // output processing_system7_0_DDR_WEB_pin;
      .processing_system7_0_DDR_BankAddr ( processing_system7_0_DDR_BankAddr ),     // inout [2:0] processing_system7_0_DDR_BankAddr;
      .processing_system7_0_DDR_Addr ( processing_system7_0_DDR_Addr ),     // inout [14:0] processing_system7_0_DDR_Addr;
      .processing_system7_0_DDR_ODT ( processing_system7_0_DDR_ODT ),     // inout processing_system7_0_DDR_ODT;
      .processing_system7_0_DDR_DRSTB ( processing_system7_0_DDR_DRSTB ),     // inout processing_system7_0_DDR_DRSTB;
      .processing_system7_0_DDR_DQ ( processing_system7_0_DDR_DQ ),     // inout [31:0] processing_system7_0_DDR_DQ;
      .processing_system7_0_DDR_DM ( processing_system7_0_DDR_DM ),     // inout [3:0] processing_system7_0_DDR_DM;
      .processing_system7_0_DDR_DQS ( processing_system7_0_DDR_DQS ),     // inout [3:0] processing_system7_0_DDR_DQS;
      .processing_system7_0_DDR_DQS_n ( processing_system7_0_DDR_DQS_n ),     // inout [3:0] processing_system7_0_DDR_DQS_n;
      .processing_system7_0_DDR_VRN ( processing_system7_0_DDR_VRN ),     // inout processing_system7_0_DDR_VRN;
      .processing_system7_0_DDR_VRP ( processing_system7_0_DDR_VRP ),     // inout processing_system7_0_DDR_VRP;
      .axi_xadc_0_VAUXP_pin ( {7'd0,axi_xadc_0_VAUXP8_pin , 7'd0 ,axi_xadc_0_VAUXP0_pin } ),     // input [15:0] axi_xadc_0_VAUXP_pin;
      .axi_xadc_0_VAUXN_pin ( {7'd0,axi_xadc_0_VAUXN8_pin , 7'd0 ,axi_xadc_0_VAUXN0_pin }  ),     // input [15:0] axi_xadc_0_VAUXN_pin;
      .axi_xadc_0_CONVST_pin ( 1'b0  ),     // input axi_xadc_0_CONVST_pin;
      .axi_xadc_0_ALARM_pin (  ),     // output [7:0] axi_xadc_0_ALARM_pin;
      .axi_xadc_0_MUXADDR_pin (  )     // output [4:0] axi_xadc_0_MUXADDR_pin;
    );

// INST_TAG_END ------ End INSTANTIATION Template ---------


endmodule

ADC以外の配線はMIOを使用したSPIの時と同じなので、そこからコピーしてきました。
書き換えたら保存します。

ADCのポートはZedboardのXADC HEADERに接続します。
XADC HEADER上のアナログ入力部は以下ピンになっています。

  • Vp 1pin
  • Vn 2pin
  • Vaux0P 6pin
  • Vaux0N 3pin
  • Vaux8P 7pin
  • Vaux8N 8pin

で、ADC内のVAUXPとVAUXNの0bitと8bitをそれぞれ接続します。
Vp、Vnは今回未接続です。
このポートについてはちょっと謎があるので改めてメモします。

未使用bitは0固定でADCの出力は使わないのでインスタンス時見接続にします。

長くなったので2へ続きます。