当前位置:   article > 正文

在pzp203上运行ad9361 no-os工程_ad9361_noos

ad9361_noos

0. 环境

- pzp203
- ubuntu18 + vivado2018

pzp203是一款plutosdr的国产兼容版。出厂默认是基于linux系统的,用libiio调用。软硬件兼容adalm-pluto。开发板提供网盘资料,是添加了板卡适配的。

1. hdl

1.1 准备源码

hdl
https://github.com/analogdevicesinc/hdl/releases
切换分支到2019_r1,通过Download as zip下载
hdl-2019_r1.tar.gz

放到工作区,
~/work/pzp203/ad9361os/
解压

tar -zvxf hdl-2019_r1.tar.gz

1.2 生成 vivado 工程

设置vivado环境

source /tools/Xilinx/Vivado/2018.3/settings64.sh


开始编译

  1. cd /home/xxjianvm/work/pzp203/ad9361os/hdl-2019_r1
  2. make fmcomms2.zed
  3. # 如果用基于pluto的HDL,META-ADI未支持pluto,无法顺利加载ad9361,这里还是用fmcomms2的hdl



得到了vivado工程。

1.3 适配

vivado 打开工程

  1. source /tools/Xilinx/Vivado/2018.3/settings64.sh
  2. vivado &


Open Project -> /home/xxjianvm/work/pzp203/ad9361os/hdl-2019_r1/projects/fmcomms2/zed/fmcomms2_zed.xpr

1.3.1 修改芯片型号

PROJECT MANAGER -> Settings -> Project Settings -> General -> Project device: xc7z020clg400-1 -> OK -> Apply -> NO -> OK

更新IP

IP INTEGRATOR -> Open Block Design -> Report IP Status -> Upgrade Selected -> OK

1.3.2 适配ddr

  1. 双击 sys_ps7 -> 
  2.     -> DDR Configuration 
  3.         -> DDR Controller Configuration 
  4.             -> Memory Type: DDR3 
  5.             -> Memory Part: MT41K256M16 RE-125
  6.             -> Effective DRAM Bus Width:    32 Bit
  7. -> OK

1.3.3 适配ETH0,SD0,UART0,USB0

  1. 双击 sys_ps7 -> 
  2.     -> Peripheral I/O Pins
  3.         -> 点击位于 MIO12-MIO13 的 UART1
  4.         -> 展开 SD0
  5.             -> 取消勾选 Card Detect
  6.             -> 取消勾选 Write Protect
  7.     -> MIO Configuration
  8.         -> Bank 0 I/O Voltage:    LVCMOS 1.8V
  9.         -> Bank 1 I/O Voltage:    LVCMOS 1.8V
  10.         -> 展开 I/O Peripherals
  11.             -> 展开 GPIO
  12.                 -> 勾选 GPIO MIO
  13.                     -> 勾选 USB0 Reset
  14.                         -> 选择 MIO 48
  15. -> OK

1.3.4 适配 ad9361

双击 axi_ad9361 

  1.     -> Cmos Or Lvds N:        1
  2. -> OK


点击 rx_clk_in、rx_frame_in、rx_data_in[11:0]、tx_clk_in、tx_frame_in、tx_data_in[11:0] -> 右键 Make External -> 删除引出引脚中的_0

修改 system_wrapper.v

  1.     rx_clk_in_n,
  2.     rx_clk_in_p,
  3.     rx_data_in_n,
  4.     rx_data_in_p,
  5.     rx_frame_in_n,
  6.     rx_frame_in_p,
  7.   input rx_clk_in_n;
  8.   input rx_clk_in_p;
  9.   input [5:0]rx_data_in_n;
  10.   input [5:0]rx_data_in_p;
  11.   input rx_frame_in_n;
  12.   input rx_frame_in_p;
  13.   wire rx_clk_in_n;
  14.   wire rx_clk_in_p;
  15.   wire [5:0]rx_data_in_n;
  16.   wire [5:0]rx_data_in_p;
  17.   wire rx_frame_in_n;
  18.   wire rx_frame_in_p;
  19.         .rx_clk_in_n(rx_clk_in_n),
  20.         .rx_clk_in_p(rx_clk_in_p),
  21.         .rx_data_in_n(rx_data_in_n),
  22.         .rx_data_in_p(rx_data_in_p),
  23.         .rx_frame_in_n(rx_frame_in_n),
  24.         .rx_frame_in_p(rx_frame_in_p),


修改为:

  1.     rx_clk_in,
  2.     rx_data_in,
  3.     rx_frame_in,
  4.   input rx_clk_in;
  5.   input [11:0]rx_data_in;
  6.   input rx_frame_in;
  7.   wire rx_clk_in;
  8.   wire [11:0]rx_data_in;
  9.   wire rx_frame_in;
  10.         .rx_clk_in(rx_clk_in),
  11.         .rx_data_in(rx_data_in),
  12.         .rx_frame_in(rx_frame_in),

把 

  1.     tx_clk_out_n,
  2.     tx_clk_out_p,
  3.     tx_data_out_n,
  4.     tx_data_out_p,
  5.     tx_frame_out_n,
  6.     tx_frame_out_p,
  7.   output tx_clk_out_n;
  8.   output tx_clk_out_p;
  9.   output [5:0]tx_data_out_n;
  10.   output [5:0]tx_data_out_p;
  11.   output tx_frame_out_n;
  12.   output tx_frame_out_p;
  13.   wire tx_clk_out_n;
  14.   wire tx_clk_out_p;
  15.   wire [5:0]tx_data_out_n;
  16.   wire [5:0]tx_data_out_p;
  17.   wire tx_frame_out_n;
  18.   wire tx_frame_out_p;
  19.         .tx_clk_out_n(tx_clk_out_n),
  20.         .tx_clk_out_p(tx_clk_out_p),
  21.         .tx_data_out_n(tx_data_out_n),
  22.         .tx_data_out_p(tx_data_out_p),
  23.         .tx_frame_out_n(tx_frame_out_n),
  24.         .tx_frame_out_p(tx_frame_out_p),


修改为:

  1.     tx_clk_out,
  2.     tx_data_out,
  3.     tx_frame_out,
  4.   output tx_clk_out;
  5.   output [11:0]tx_data_out;
  6.   output tx_frame_out;
  7.   wire tx_clk_out;
  8.   wire [11:0]tx_data_out;
  9.   wire tx_frame_out;
  10.         .tx_clk_out(tx_clk_out),
  11.         .tx_data_out(tx_data_out),
  12.         .tx_frame_out(tx_frame_out),

修改 systm_top.v

  1.   input                   rx_clk_in_p,
  2.   input                   rx_clk_in_n,
  3.   input                   rx_frame_in_p,
  4.   input                   rx_frame_in_n,
  5.   input       [ 5:0]      rx_data_in_p,
  6.   input       [ 5:0]      rx_data_in_n,
  7.   output                  tx_clk_out_p,
  8.   output                  tx_clk_out_n,
  9.   output                  tx_frame_out_p,
  10.   output                  tx_frame_out_n,
  11.   output      [ 5:0]      tx_data_out_p,
  12.   output      [ 5:0]      tx_data_out_n,
  13. 修改为:
  14.   input                   rx_clk_in,
  15.   input                   rx_frame_in,
  16.   input       [ 11:0]      rx_data_in,
  17.   output                  tx_clk_out,
  18.   output                  tx_frame_out,
  19.   output      [ 11:0]      tx_data_out_p,


把 

  1.     .rx_clk_in_n (rx_clk_in_n),
  2.     .rx_clk_in_p (rx_clk_in_p),
  3.     .rx_data_in_n (rx_data_in_n),
  4.     .rx_data_in_p (rx_data_in_p),
  5.     .rx_frame_in_n (rx_frame_in_n),
  6.     .rx_frame_in_p (rx_frame_in_p),
  7.     .tx_clk_out_n (tx_clk_out_n),
  8.     .tx_clk_out_p (tx_clk_out_p),
  9.     .tx_data_out_n (tx_data_out_n),
  10.     .tx_data_out_p (tx_data_out_p),
  11.     .tx_frame_out_n (tx_frame_out_n),
  12.     .tx_frame_out_p (tx_frame_out_p),


修改为:

  1.     .rx_clk_in (rx_clk_in),
  2.     .rx_data_in (rx_data_in),
  3.     .rx_frame_in (rx_frame_in),
  4.     .tx_clk_out (tx_clk_out),
  5.     .tx_data_out (tx_data_out),
  6.     .tx_frame_out (tx_frame_out),

并添加

  1.   wire      [31:0]      gpio_bd;
  2.   wire                   gpio_muxout_tx;
  3.   wire                   gpio_muxout_rx;


不加怕影响到GPIO引脚号。
  
vivado2018还需要打开 axi_ad9361的ip,ADC_IODELAY_ENABLE 设置为0
ad_data_in.v中

  parameter   IODELAY_ENABLE = 1,


修改为:

  parameter   IODELAY_ENABLE = 0


并把 axi_ad9361_cmos_if.v中的 ad_data_in 都设置 .IODELAY_CTRL (0),
参考:AD-FMCOMMS3-EBZ 调试 Tuning TX/RX FAILED!,https://blog.csdn.net/Claud_Ma/article/details/120837057


 
1.3.5 适配引脚


修改引脚约束文件为以下内容,(编辑文件 Sources -> Constrants -> constrs_1 -> system_constr.xdc):

  1. # constraints
  2. # ad9361
  3. set_property  -dict {PACKAGE_PIN  P18  IOSTANDARD LVCMOS18} [get_ports gpio_en_agc]                       ; 
  4. set_property  -dict {PACKAGE_PIN  W19  IOSTANDARD LVCMOS18} [get_ports gpio_resetb]                       ; 
  5. set_property -dict {PACKAGE_PIN P15     IOSTANDARD LVCMOS18} [get_ports gpio_sync]                        ;
  6. set_property  -dict {PACKAGE_PIN  V8  IOSTANDARD LVCMOS18} [get_ports gpio_ctl[0]]                       ; 
  7. set_property  -dict {PACKAGE_PIN  W8  IOSTANDARD LVCMOS18} [get_ports gpio_ctl[1]]                       ; 
  8. set_property  -dict {PACKAGE_PIN  W10 IOSTANDARD LVCMOS18} [get_ports gpio_ctl[2]]                       ; 
  9. set_property  -dict {PACKAGE_PIN  W9  IOSTANDARD LVCMOS18} [get_ports gpio_ctl[3]]                       ; 
  10. set_property  -dict {PACKAGE_PIN  U7  IOSTANDARD LVCMOS18} [get_ports gpio_status[0]]                    ; 
  11. set_property  -dict {PACKAGE_PIN  V7  IOSTANDARD LVCMOS18} [get_ports gpio_status[1]]                    ; 
  12. set_property  -dict {PACKAGE_PIN  T9  IOSTANDARD LVCMOS18} [get_ports gpio_status[2]]                    ; 
  13. set_property  -dict {PACKAGE_PIN  U10 IOSTANDARD LVCMOS18} [get_ports gpio_status[3]]                    ; 
  14. set_property  -dict {PACKAGE_PIN  Y7  IOSTANDARD LVCMOS18} [get_ports gpio_status[4]]                    ; 
  15. set_property  -dict {PACKAGE_PIN  Y6  IOSTANDARD LVCMOS18} [get_ports gpio_status[5]]                    ; 
  16. set_property  -dict {PACKAGE_PIN  Y9  IOSTANDARD LVCMOS18} [get_ports gpio_status[6]]                    ; 
  17. set_property  -dict {PACKAGE_PIN  Y8  IOSTANDARD LVCMOS18} [get_ports gpio_status[7]]                    ; 
  18. set_property  -dict {PACKAGE_PIN  N18  IOSTANDARD LVCMOS18} [get_ports rx_clk_in]       ; 
  19. set_property  -dict {PACKAGE_PIN  R16  IOSTANDARD LVCMOS18} [get_ports rx_frame_in]     ; 
  20. set_property  -dict {PACKAGE_PIN  V17  IOSTANDARD LVCMOS18} [get_ports rx_data_in[1]]   ; 
  21. set_property  -dict {PACKAGE_PIN  V18  IOSTANDARD LVCMOS18} [get_ports rx_data_in[0]]   ; 
  22. set_property  -dict {PACKAGE_PIN  Y18  IOSTANDARD LVCMOS18} [get_ports rx_data_in[3]]   ; 
  23. set_property  -dict {PACKAGE_PIN  Y19  IOSTANDARD LVCMOS18} [get_ports rx_data_in[2]]   ; 
  24. set_property  -dict {PACKAGE_PIN  T17  IOSTANDARD LVCMOS18} [get_ports rx_data_in[5]]   ; 
  25. set_property  -dict {PACKAGE_PIN  R18  IOSTANDARD LVCMOS18} [get_ports rx_data_in[4]]   ; 
  26. set_property  -dict {PACKAGE_PIN  V20  IOSTANDARD LVCMOS18} [get_ports rx_data_in[7]]   ; 
  27. set_property  -dict {PACKAGE_PIN  W20  IOSTANDARD LVCMOS18} [get_ports rx_data_in[6]]   ; 
  28. set_property  -dict {PACKAGE_PIN  T20  IOSTANDARD LVCMOS18} [get_ports rx_data_in[9]]   ; 
  29. set_property  -dict {PACKAGE_PIN  U20  IOSTANDARD LVCMOS18} [get_ports rx_data_in[8]]   ; 
  30. set_property  -dict {PACKAGE_PIN  V16  IOSTANDARD LVCMOS18} [get_ports rx_data_in[11]]   ; 
  31. set_property  -dict {PACKAGE_PIN  W16  IOSTANDARD LVCMOS18} [get_ports rx_data_in[10]]   ; 
  32. set_property  -dict {PACKAGE_PIN  U14  IOSTANDARD LVCMOS18}  [get_ports tx_clk_out]                      ; 
  33. set_property  -dict {PACKAGE_PIN  V15  IOSTANDARD LVCMOS18}  [get_ports tx_frame_out]                    ; 
  34. set_property  -dict {PACKAGE_PIN  P14  IOSTANDARD LVCMOS18}  [get_ports tx_data_out[1]]                  ; 
  35. set_property  -dict {PACKAGE_PIN  R14  IOSTANDARD LVCMOS18}  [get_ports tx_data_out[0]]                  ; 
  36. set_property  -dict {PACKAGE_PIN  V12  IOSTANDARD LVCMOS18}  [get_ports tx_data_out[3]]                  ; 
  37. set_property  -dict {PACKAGE_PIN  W13  IOSTANDARD LVCMOS18}  [get_ports tx_data_out[2]]                  ; 
  38. set_property  -dict {PACKAGE_PIN  W14  IOSTANDARD LVCMOS18}  [get_ports tx_data_out[5]]                  ; 
  39. set_property  -dict {PACKAGE_PIN  Y14  IOSTANDARD LVCMOS18}  [get_ports tx_data_out[4]]                  ; 
  40. set_property  -dict {PACKAGE_PIN  T14  IOSTANDARD LVCMOS18}  [get_ports tx_data_out[7]]                  ; 
  41. set_property  -dict {PACKAGE_PIN  T15  IOSTANDARD LVCMOS18}  [get_ports tx_data_out[6]]                  ; 
  42. set_property  -dict {PACKAGE_PIN  Y16  IOSTANDARD LVCMOS18}  [get_ports tx_data_out[9]]                  ; 
  43. set_property  -dict {PACKAGE_PIN  Y17  IOSTANDARD LVCMOS18}  [get_ports tx_data_out[8]]                  ; 
  44. set_property  -dict {PACKAGE_PIN  T16  IOSTANDARD LVCMOS18}  [get_ports tx_data_out[11]]                  ; 
  45. set_property  -dict {PACKAGE_PIN  U17  IOSTANDARD LVCMOS18}  [get_ports tx_data_out[10]]                  ; 
  46. set_property  -dict {PACKAGE_PIN  P16  IOSTANDARD LVCMOS18} [get_ports txnrx]                             ; 
  47. set_property  -dict {PACKAGE_PIN  N17  IOSTANDARD LVCMOS18} [get_ports enable]                            ; 
  48. set_property  -dict {PACKAGE_PIN  T10  IOSTANDARD LVCMOS18  PULLTYPE PULLUP} [get_ports spi_csn]          ; 
  49. set_property  -dict {PACKAGE_PIN  T11  IOSTANDARD LVCMOS18} [get_ports spi_clk]                           ; 
  50. set_property  -dict {PACKAGE_PIN  T12  IOSTANDARD LVCMOS18} [get_ports spi_mosi]                          ; 
  51. set_property  -dict {PACKAGE_PIN  U12  IOSTANDARD LVCMOS18} [get_ports spi_miso]                          ; 
  52. # spi pmod JA1
  53. set_property  -dict {PACKAGE_PIN W11 IOSTANDARD LVCMOS18} [get_ports pl_spi_clk_o]                        ; 
  54. set_property  -dict {PACKAGE_PIN U9  IOSTANDARD LVCMOS18} [get_ports pl_spi_miso]                         ; 
  55. set_property  -dict {PACKAGE_PIN U8  IOSTANDARD LVCMOS18} [get_ports pl_spi_mosi]                         ; 
  56. set_property  -dict {PACKAGE_PIN T5  IOSTANDARD LVCMOS18} [get_ports iic_scl]                             ; 
  57. set_property  -dict {PACKAGE_PIN U5  IOSTANDARD LVCMOS18} [get_ports iic_sda]                             ; 
  58. # clocks
  59. create_clock -name rx_clk -period  16.27 [get_ports rx_clk_in]

修改引脚约束文件(编辑文件 Sources -> Constrants -> constrs_1 -> zed_system_constr.xdc):
#只留下以下内容:

  1. # Define SPI clock
  2. #create_clock -name spi0_clk      -period 40   [get_pins -hier */EMIOSPI0SCLKO]
  3. #create_clock -name spi1_clk      -period 40   [get_pins -hier */EMIOSPI1SCLKO]


修改 system_top.v。
注释掉端口: 

  1. //  inout       [31:0]      gpio_bd,
  2. //  output                  hdmi_out_clk,
  3. //  output                  hdmi_vsync,
  4. //  output                  hdmi_hsync,
  5. //  output                  hdmi_data_e,
  6. //  output      [15:0]      hdmi_data,
  7. //  output                  i2s_mclk,
  8. //  output                  i2s_bclk,
  9. //  output                  i2s_lrclk,
  10. //  output                  i2s_sdata_out,
  11. //  input                   i2s_sdata_in,
  12. //  output                  spdif,
  13. //  inout                   iic_scl,
  14. //  inout                   iic_sda,
  15. //  inout       [ 1:0]      iic_mux_scl,
  16. //  inout       [ 1:0]      iic_mux_sda,
  17. //  input                   otg_vbusoc,
  18. //  inout                   gpio_muxout_tx,
  19. //  inout                   gpio_muxout_rx,
  20. //  output                  spi_udc_csn_tx,
  21. //  output                  spi_udc_csn_rx,
  22. //  output                  spi_udc_sclk,
  23. //  output                  spi_udc_data
  24. //   ad_iobuf #(.DATA_WIDTH(2)) i_iobuf_iic_scl (
  25. //    .dio_t ({iic_mux_scl_t_s,iic_mux_scl_t_s}),
  26. //    .dio_i (iic_mux_scl_o_s),
  27. //    .dio_o (iic_mux_scl_i_s),
  28. //    .dio_p (iic_mux_scl));
  29. //   ad_iobuf #(.DATA_WIDTH(2)) i_iobuf_iic_sda (
  30. //    .dio_t ({iic_mux_sda_t_s,iic_mux_sda_t_s}),
  31. //    .dio_i (iic_mux_sda_o_s),
  32. //    .dio_o (iic_mux_sda_i_s),
  33. //    .dio_p (iic_mux_sda));


修改 system_wrapper.v

  1. //  IOBUF iic_fmc_scl_iobuf
  2. //       (.I(iic_fmc_scl_o),
  3. //        .IO(iic_fmc_scl_io),
  4. //        .O(iic_fmc_scl_i),
  5. //        .T(iic_fmc_scl_t));
  6. //  IOBUF iic_fmc_sda_iobuf
  7. //       (.I(iic_fmc_sda_o),
  8. //        .IO(iic_fmc_sda_io),
  9. //        .O(iic_fmc_sda_i),
  10. //        .T(iic_fmc_sda_t));
  11.     


1.3.6 xadc(ad9363的noos工程,和ad9361的区别是需要取消注释:#define AXI_ADC_NOT_PRESENT)

创建一个 xadc
Diagram -> + -> XADC Wizard -> 

  1. 双击 xadc_wiz_0 -> 
  2.     -> Basic 
  3.         -> Interface Options -> AXI4Lite
  4.         -> Startup Channel Selection -> Channel Sequencer
  5.         -> Timing Mode: Continuous Mode
  6.         -> DRP Timing Options 
  7.             -> DCLK 100M
  8.     -> ADC Setup
  9.         -> Sequencer Mode: Continuous
  10.     -> Alarms 
  11.         -> 全部取消勾选
  12.     -> Channel Sequencer
  13.         -> 勾选 TEMPERATURE
  14.         -> 勾选 VCCINT
  15.         -> 勾选 VCCAUX
  16.         -> 勾选 VCCBRAM
  17.         -> 勾选 VCCPINT
  18.         -> 勾选 VCCPAUX
  19.         -> 勾选 VCCDDRO
  20.         -> 勾选 VP/VN
  21. -> OK

连线
Run Connection Automation -> OK
       

 
1.4 编译


Run Synthesis
Run Implementation
Generate Bitstream

1.5 导出 hdf

  1. Vivado -> File -> Export -> Export Hardware -> 
  2. -> Include bitstream -> OK
  3. Vivado -> File -> Launch SDK -> OK 


得到 
/home/xxjianvm/work/pzp203/ad9361os/hdl-2019_r1/projects/pluto/pluto.sdk/system_top_hw_platform_0/system.hdf

2. no-os sdk

2.1 hello

  1. File -> New -> Application Project
  2.     -> Project name:    ad9361_test
  3.     -> Finish

编译

调试

  1. Debug As -> Launch on Hardware (system debugger)
  2.     Debug Configuration -> Target Setup
  3.         -> 勾选 Reset entire system
  4.         -> 勾选 Program FPGA

板子记得调到JTAG模式。

串口权限

  1. ls /dev/ttyUSB*
  2. sudo chmod 666 /dev/ttyUSB0

永久修改 

whoami


该用户添加至dialout用户组,因为tty设备是属于dialout用户组

sudo usermod -aG dialout xxjianvm

看到SDK Terminal打印
hello world

2.2 添加 ad9361 驱动


拷贝源码

  1. ~/work/zynq_dev/ad9361noos/no-OS-2019_R1/ad9361/sw
  2. ~/work/zynq_dev/ad9361noos/no-OS-2019_R1/ad9361/sw/console_commands
  3. ~/work/zynq_dev/ad9361noos/no-OS-2019_R1/ad9361/sw/platform_xilinx


内的源文件(*.c,*.h)拷贝到

~/work/pzp203/ad9361os/hdl-2019_r1/projects/fmcomms2/zed/fmcomms2_zed.sdk/ad9361noos/src


至于platform.c和platform.h,不覆盖源文件,把源码添加到各自的文件内。

删除 hello_world.c

2.3 修改源码

打开 command.c

#include "../ad9361_api.h"


修改为

#include "ad9361_api.h"

打开 config.h
取消注释:

  1. #define CONSOLE_COMMANDS
  2. #define XILINX_PLATFORM
  3. #define AXI_ADC_NOT_PRESENT


编译调试下载。

2.4 用串口命令发送

help?

参考:
 

  1. [1]windows 下AD9361的 no-os master 工程搭建,https://blog.csdn.net/weixin_37728585/article/details/104835364
  2. [2]https://wiki.analog.com/resources/fpga/docs/hdl
  3. [3]https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/software/no-os-setup
  4. [4]https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/software/baremetal
  5. [5]https://ez.analog.com/rf/wide-band-rf-transceivers/tes-gui-and-api-software-ad9371-ad9375/f/q-a/80764/how-to-use-ad9361-no-os-setup

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
  

闽ICP备14008679号