Zedboard ADCでアナログ値を読んでみた -1-
SPIはちょっと休憩して気晴らしにZynqが内蔵してる
XADCの値を読んでUART経由で表示してみた。
今回はSDKでプログラムを実行するとADCにて抵抗にかかる電圧を測定し
プログラムを終了するという流れを作成しました。
プログラム自体はサンプルをほとんどそのまま使用しました。
いつも通りCTTのサンプルを変更して作成しました。
以下変更した点
1.XADCの追加
XPS上でADCを追加します。
IP一覧の中にAXI XADCというIPがあるのでそれを選択
追加しますか?と聞かれるのでYesを選択
設定画面が表示されるが特に変更する箇所はないのでそのままOK
「Instantiate and Connect IP」のウィンドウが出たらOKを押す。
上のボタンを選択していると自動的にCPUまで接続してくれます。
自分で接続したい場合は下のボタンを選択するとIPの設置のみしてくれます。
では、接続できているか確認します。
まずはBus Interfacesタブ
CPU側(processing_system7_0)とaxi_xadc_0が
axi_interconnect_1経由で接続されています。
Graphical Design Viewタブで各ブロックの接続図が見れます。
それからADCのアドレスを確認します。
Addressesタブで割り振られているアドレス範囲を確認できます。
ちなみにクロックはFCLK_CLK0が接続されます。
クロックの設定はZynqタブ内のClock Wizardで確認できます。
デフォルトで100MHzの様です。
2.ADCの信号を外部に出す
ここで「Ports」タブでAXI以外の配線の確認をします。
図中の赤枠が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」を選択します。
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へ続きます。