Whitney Knitter
Published © GPL3+

Getting Started with BLDCs on Kria KD240 + Motor Kit Part 2

This project continues with driving BLDC motors on the Kria KD240 with Motor Accessory Kit using back EMF data via an accelerated kernel.

AdvancedWork in progress2 hours1,100
Getting Started with BLDCs on Kria KD240 + Motor Kit Part 2

Things used in this project

Story

Read more

Code

kd240_pinout.xdc

Plain text
####################################################################################################
##################################### Motor Phase Gate Drivers #####################################
#################################################################################################### 
## HDA05 - Bank  26 VCCO - VCCO_HDA - IO_L2N_AD10N_26
set_property PACKAGE_PIN G9       [get_ports motor_en];
set_property IOSTANDARD  LVCMOS33 [get_ports motor_en];

## HDA04 - Bank  26 VCCO - VCCO_HDA - IO_L2P_AD10P_26
set_property PACKAGE_PIN G10      [get_ports phaseC];
set_property IOSTANDARD  LVCMOS33 [get_ports phaseC];

## HDA03 - Bank  26 VCCO - VCCO_HDA - IO_L1N_AD11N_26
set_property PACKAGE_PIN H9       [get_ports phaseB];
set_property IOSTANDARD  LVCMOS33 [get_ports phaseB];

## HDA02 - Bank  26 VCCO - VCCO_HDA - IO_L1P_AD11P_26
set_property PACKAGE_PIN H10      [get_ports phaseA];
set_property IOSTANDARD  LVCMOS33 [get_ports phaseA];

####################################################################################################
####################################### Hall Sensor Inputs #########################################
####################################################################################################
## HDA11 - Bank  26 VCCO - VCCO_HDA - IO_L4N_AD8N_26
set_property PACKAGE_PIN E9       [get_ports hallA];
set_property IOSTANDARD  LVCMOS33 [get_ports hallA];

## HDA12 - Bank  26 VCCO - VCCO_HDA - IO_L7P_HDGC_AD5P_26
set_property PACKAGE_PIN F13      [get_ports hallB];
set_property IOSTANDARD  LVCMOS33 [get_ports hallB];

## HDA13 - Bank  26 VCCO - VCCO_HDA - IO_L7N_HDGC_AD5N_26
set_property PACKAGE_PIN E12      [get_ports hallC];
set_property IOSTANDARD  LVCMOS33 [get_ports hallC];

####################################################################################################
########################################### AD7352 ADCs ############################################
####################################################################################################

set_property PACKAGE_PIN N6 [get_ports ad7352_sclk]
set_property IOSTANDARD  LVCMOS18 [get_ports ad7352_sclk]

set_property PACKAGE_PIN U5 [get_ports ad7352_cs]
set_property IOSTANDARD  LVCMOS18 [get_ports ad7352_cs]

set_property PACKAGE_PIN P6 [get_ports adcA_data_volt]
set_property IOSTANDARD  LVCMOS18 [get_ports adcA_data_volt]

set_property PACKAGE_PIN N4 [get_ports adcA_data_curr]
set_property IOSTANDARD  LVCMOS18 [get_ports adcA_data_curr]

set_property PACKAGE_PIN P4 [get_ports adcB_data_volt]
set_property IOSTANDARD  LVCMOS18 [get_ports adcB_data_volt]

set_property PACKAGE_PIN M7 [get_ports adcB_data_curr]
set_property IOSTANDARD  LVCMOS18 [get_ports adcB_data_curr]

set_property PACKAGE_PIN N7 [get_ports adcC_data_volt]
set_property IOSTANDARD  LVCMOS18 [get_ports adcC_data_volt]

set_property PACKAGE_PIN T6 [get_ports adcC_data_curr]
set_property IOSTANDARD  LVCMOS18 [get_ports adcC_data_curr]

####################################################################################################
# ASYNC registers
####################################################################################################
#create_clock -name pl_clk0 -period 10.000 [get_ports k24_kd240_design_i/zynq_ultra_ps_e_0/pl_clk0]
#create_clock -name pl_clk1 -period 10.000 [get_ports k24_kd240_design_i/zynq_ultra_ps_e_0/pl_clk1]
#set_clock_groups -name async_pl_clk0_clk1 -asynchronous -group [get_clocks -include_generated_clocks k24_kd240_design_i/zynq_ultra_ps_e_0/pl_clk0] -group [get_clocks -include_generated_clocks k24_kd240_design_i/zynq_ultra_ps_e_0/pl_clk1]
#set_false_path -from [get_clocks k24_kd240_design_i/zynq_ultra_ps_e_0/pl_clk0] -to [get_clocks k24_kd240_design_i/zynq_ultra_ps_e_0/pl_clk1]

#create_clock -name clk_pl_0 -period 10.000 [get_ports k24_kd240_design_i/zynq_ultra_ps_e_0/pl_clk0]
#create_clock -name clk_pl_1 -period 10.000 [get_ports k24_kd240_design_i/zynq_ultra_ps_e_0/pl_clk1]
#set_clock_groups -name async_clk0_clk1 -asynchronous -group {clk_pl_0} -group {clk_pl_1}

set_false_path -from [get_clocks clk_pl_0] -to [get_clocks clk_pl_1]

set_property ASYNC_REG TRUE [get_cells k24_kd240_design_i/ad7352_spi_0/inst/sync_0_reg]
set_property ASYNC_REG TRUE [get_cells k24_kd240_design_i/ad7352_spi_0/inst/start_cnv_sync_reg]

k24_kd240_design.tcl

Tcl
TCL script to generate the block design in Vivado from this project.
################################################################
# This is a generated script based on design: k24_kd240_design
#
# Though there are limitations about the generated script,
# the main purpose of this utility is to make learning
# IP Integrator Tcl commands easier.
################################################################

namespace eval _tcl {
proc get_script_folder {} {
   set script_path [file normalize [info script]]
   set script_folder [file dirname $script_path]
   return $script_folder
}
}
variable script_folder
set script_folder [_tcl::get_script_folder]

################################################################
# Check if script is running in correct Vivado version.
################################################################
set scripts_vivado_version 2024.1
set current_vivado_version [version -short]

if { [string first $scripts_vivado_version $current_vivado_version] == -1 } {
   puts ""
   if { [string compare $scripts_vivado_version $current_vivado_version] > 0 } {
      catch {common::send_gid_msg -ssname BD::TCL -id 2042 -severity "ERROR" " This script was generated using Vivado <$scripts_vivado_version> and is being run in <$current_vivado_version> of Vivado. Sourcing the script failed since it was created with a future version of Vivado."}

   } else {
     catch {common::send_gid_msg -ssname BD::TCL -id 2041 -severity "ERROR" "This script was generated using Vivado <$scripts_vivado_version> and is being run in <$current_vivado_version> of Vivado. Please run the script in Vivado <$scripts_vivado_version> then open the design in Vivado <$current_vivado_version>. Upgrade the design by running \"Tools => Report => Report IP Status...\", then run write_bd_tcl to create an updated script."}

   }

   return 1
}

################################################################
# START
################################################################

# To test this script, run the following commands from Vivado Tcl console:
# source k24_kd240_design_script.tcl


# The design that will be created by this Tcl script contains the following 
# module references:
# motor_controller_hs, ad7352_spi

# Please add the sources of those modules before sourcing this Tcl script.

# If there is no project opened, this script will create a
# project, but make sure you do not have an existing project
# <./myproj/project_1.xpr> in the current working folder.

set list_projs [get_projects -quiet]
if { $list_projs eq "" } {
   create_project project_1 myproj -part xck24-ubva530-2LV-c
   set_property BOARD_PART xilinx.com:kd240_som_som240_1_connector_kd240_carrier_som240_1_connector_som40_2_connector_kd240_carrier_som40_2_connector:part0:1.0 [current_project]
}


# CHANGE DESIGN NAME HERE
variable design_name
set design_name k24_kd240_design

# If you do not already have an existing IP Integrator design open,
# you can create a design using the following command:
#    create_bd_design $design_name

# Creating design if needed
set errMsg ""
set nRet 0

set cur_design [current_bd_design -quiet]
set list_cells [get_bd_cells -quiet]

if { ${design_name} eq "" } {
   # USE CASES:
   #    1) Design_name not set

   set errMsg "Please set the variable <design_name> to a non-empty value."
   set nRet 1

} elseif { ${cur_design} ne "" && ${list_cells} eq "" } {
   # USE CASES:
   #    2): Current design opened AND is empty AND names same.
   #    3): Current design opened AND is empty AND names diff; design_name NOT in project.
   #    4): Current design opened AND is empty AND names diff; design_name exists in project.

   if { $cur_design ne $design_name } {
      common::send_gid_msg -ssname BD::TCL -id 2001 -severity "INFO" "Changing value of <design_name> from <$design_name> to <$cur_design> since current design is empty."
      set design_name [get_property NAME $cur_design]
   }
   common::send_gid_msg -ssname BD::TCL -id 2002 -severity "INFO" "Constructing design in IPI design <$cur_design>..."

} elseif { ${cur_design} ne "" && $list_cells ne "" && $cur_design eq $design_name } {
   # USE CASES:
   #    5) Current design opened AND has components AND same names.

   set errMsg "Design <$design_name> already exists in your project, please set the variable <design_name> to another value."
   set nRet 1
} elseif { [get_files -quiet ${design_name}.bd] ne "" } {
   # USE CASES: 
   #    6) Current opened design, has components, but diff names, design_name exists in project.
   #    7) No opened design, design_name exists in project.

   set errMsg "Design <$design_name> already exists in your project, please set the variable <design_name> to another value."
   set nRet 2

} else {
   # USE CASES:
   #    8) No opened design, design_name not in project.
   #    9) Current opened design, has components, but diff names, design_name not in project.

   common::send_gid_msg -ssname BD::TCL -id 2003 -severity "INFO" "Currently there is no design <$design_name> in project, so creating one..."

   create_bd_design $design_name

   common::send_gid_msg -ssname BD::TCL -id 2004 -severity "INFO" "Making design <$design_name> as current_bd_design."
   current_bd_design $design_name

}

common::send_gid_msg -ssname BD::TCL -id 2005 -severity "INFO" "Currently the variable <design_name> is equal to \"$design_name\"."

if { $nRet != 0 } {
   catch {common::send_gid_msg -ssname BD::TCL -id 2006 -severity "ERROR" $errMsg}
   return $nRet
}

set bCheckIPsPassed 1
##################################################################
# CHECK IPs
##################################################################
set bCheckIPs 1
if { $bCheckIPs == 1 } {
   set list_check_ips "\ 
xilinx.com:ip:zynq_ultra_ps_e:3.5\
xilinx.com:ip:axi_gpio:2.0\
xilinx.com:ip:proc_sys_reset:5.0\
xilinx.com:ip:axi_intc:4.1\
xilinx.com:ip:axis_data_fifo:2.0\
"

   set list_ips_missing ""
   common::send_gid_msg -ssname BD::TCL -id 2011 -severity "INFO" "Checking if the following IPs exist in the project's IP catalog: $list_check_ips ."

   foreach ip_vlnv $list_check_ips {
      set ip_obj [get_ipdefs -all $ip_vlnv]
      if { $ip_obj eq "" } {
         lappend list_ips_missing $ip_vlnv
      }
   }

   if { $list_ips_missing ne "" } {
      catch {common::send_gid_msg -ssname BD::TCL -id 2012 -severity "ERROR" "The following IPs are not found in the IP Catalog:\n  $list_ips_missing\n\nResolution: Please add the repository containing the IP(s) to the project." }
      set bCheckIPsPassed 0
   }

}

##################################################################
# CHECK Modules
##################################################################
set bCheckModules 1
if { $bCheckModules == 1 } {
   set list_check_mods "\ 
motor_controller_hs\
ad7352_spi\
"

   set list_mods_missing ""
   common::send_gid_msg -ssname BD::TCL -id 2020 -severity "INFO" "Checking if the following modules exist in the project's sources: $list_check_mods ."

   foreach mod_vlnv $list_check_mods {
      if { [can_resolve_reference $mod_vlnv] == 0 } {
         lappend list_mods_missing $mod_vlnv
      }
   }

   if { $list_mods_missing ne "" } {
      catch {common::send_gid_msg -ssname BD::TCL -id 2021 -severity "ERROR" "The following module(s) are not found in the project: $list_mods_missing" }
      common::send_gid_msg -ssname BD::TCL -id 2022 -severity "INFO" "Please add source files for the missing module(s) above."
      set bCheckIPsPassed 0
   }
}

if { $bCheckIPsPassed != 1 } {
  common::send_gid_msg -ssname BD::TCL -id 2023 -severity "WARNING" "Will not continue with creation of design due to the error(s) above."
  return 3
}

##################################################################
# DESIGN PROCs
##################################################################



# Procedure to create entire design; Provide argument to make
# procedure reusable. If parentCell is "", will use root.
proc create_root_design { parentCell } {

  variable script_folder
  variable design_name

  if { $parentCell eq "" } {
     set parentCell [get_bd_cells /]
  }

  # Get object for parentCell
  set parentObj [get_bd_cells $parentCell]
  if { $parentObj == "" } {
     catch {common::send_gid_msg -ssname BD::TCL -id 2090 -severity "ERROR" "Unable to find parent cell <$parentCell>!"}
     return
  }

  # Make sure parentObj is hier blk
  set parentType [get_property TYPE $parentObj]
  if { $parentType ne "hier" } {
     catch {common::send_gid_msg -ssname BD::TCL -id 2091 -severity "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be <hier>."}
     return
  }

  # Save current instance; Restore later
  set oldCurInst [current_bd_instance .]

  # Set parent object as current
  current_bd_instance $parentObj


  # Create interface ports

  # Create ports
  set motor_en [ create_bd_port -dir O -from 0 -to 0 motor_en ]
  set hallA [ create_bd_port -dir I hallA ]
  set hallB [ create_bd_port -dir I hallB ]
  set hallC [ create_bd_port -dir I hallC ]
  set phaseA [ create_bd_port -dir O phaseA ]
  set phaseB [ create_bd_port -dir O phaseB ]
  set phaseC [ create_bd_port -dir O phaseC ]
  set ad7352_sclk [ create_bd_port -dir O ad7352_sclk ]
  set ad7352_cs [ create_bd_port -dir O ad7352_cs ]
  set adcA_data_volt [ create_bd_port -dir I adcA_data_volt ]
  set adcA_data_curr [ create_bd_port -dir I adcA_data_curr ]
  set adcB_data_volt [ create_bd_port -dir I adcB_data_volt ]
  set adcB_data_curr [ create_bd_port -dir I adcB_data_curr ]
  set adcC_data_volt [ create_bd_port -dir I adcC_data_volt ]
  set adcC_data_curr [ create_bd_port -dir I adcC_data_curr ]

  # Create instance: zynq_ultra_ps_e_0, and set properties
  set zynq_ultra_ps_e_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e:3.5 zynq_ultra_ps_e_0 ]
  set_property -dict [list \
    CONFIG.PSU_BANK_0_IO_STANDARD {LVCMOS18} \
    CONFIG.PSU_BANK_1_IO_STANDARD {LVCMOS18} \
    CONFIG.PSU_BANK_2_IO_STANDARD {LVCMOS18} \
    CONFIG.PSU_BANK_3_IO_STANDARD {LVCMOS18} \
    CONFIG.PSU_DDR_RAM_HIGHADDR {0x7FFFFFFF} \
    CONFIG.PSU_DDR_RAM_HIGHADDR_OFFSET {0x00000002} \
    CONFIG.PSU_DDR_RAM_LOWADDR_OFFSET {0x80000000} \
    CONFIG.PSU_MIO_0_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_0_SLEW {slow} \
    CONFIG.PSU_MIO_10_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_10_SLEW {slow} \
    CONFIG.PSU_MIO_11_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_11_SLEW {slow} \
    CONFIG.PSU_MIO_12_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_12_POLARITY {Default} \
    CONFIG.PSU_MIO_12_SLEW {slow} \
    CONFIG.PSU_MIO_13_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_13_POLARITY {Default} \
    CONFIG.PSU_MIO_13_SLEW {slow} \
    CONFIG.PSU_MIO_14_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_14_POLARITY {Default} \
    CONFIG.PSU_MIO_14_SLEW {slow} \
    CONFIG.PSU_MIO_15_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_15_POLARITY {Default} \
    CONFIG.PSU_MIO_15_SLEW {slow} \
    CONFIG.PSU_MIO_16_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_16_POLARITY {Default} \
    CONFIG.PSU_MIO_16_SLEW {slow} \
    CONFIG.PSU_MIO_17_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_17_POLARITY {Default} \
    CONFIG.PSU_MIO_17_SLEW {slow} \
    CONFIG.PSU_MIO_18_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_18_POLARITY {Default} \
    CONFIG.PSU_MIO_18_SLEW {slow} \
    CONFIG.PSU_MIO_19_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_19_POLARITY {Default} \
    CONFIG.PSU_MIO_19_SLEW {slow} \
    CONFIG.PSU_MIO_1_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_1_SLEW {slow} \
    CONFIG.PSU_MIO_20_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_20_POLARITY {Default} \
    CONFIG.PSU_MIO_20_SLEW {slow} \
    CONFIG.PSU_MIO_21_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_21_POLARITY {Default} \
    CONFIG.PSU_MIO_21_SLEW {slow} \
    CONFIG.PSU_MIO_22_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_22_POLARITY {Default} \
    CONFIG.PSU_MIO_22_SLEW {slow} \
    CONFIG.PSU_MIO_23_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_23_POLARITY {Default} \
    CONFIG.PSU_MIO_23_SLEW {slow} \
    CONFIG.PSU_MIO_24_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_24_SLEW {slow} \
    CONFIG.PSU_MIO_25_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_25_SLEW {slow} \
    CONFIG.PSU_MIO_26_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_26_POLARITY {Default} \
    CONFIG.PSU_MIO_26_SLEW {slow} \
    CONFIG.PSU_MIO_27_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_27_SLEW {slow} \
    CONFIG.PSU_MIO_29_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_29_SLEW {slow} \
    CONFIG.PSU_MIO_2_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_2_SLEW {slow} \
    CONFIG.PSU_MIO_31_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_31_POLARITY {Default} \
    CONFIG.PSU_MIO_31_SLEW {slow} \
    CONFIG.PSU_MIO_32_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_32_SLEW {slow} \
    CONFIG.PSU_MIO_33_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_33_SLEW {slow} \
    CONFIG.PSU_MIO_34_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_34_POLARITY {Default} \
    CONFIG.PSU_MIO_34_SLEW {slow} \
    CONFIG.PSU_MIO_35_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_35_POLARITY {Default} \
    CONFIG.PSU_MIO_35_SLEW {slow} \
    CONFIG.PSU_MIO_36_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_36_SLEW {slow} \
    CONFIG.PSU_MIO_38_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_38_SLEW {slow} \
    CONFIG.PSU_MIO_39_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_39_SLEW {slow} \
    CONFIG.PSU_MIO_3_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_3_SLEW {slow} \
    CONFIG.PSU_MIO_40_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_40_SLEW {slow} \
    CONFIG.PSU_MIO_41_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_41_SLEW {slow} \
    CONFIG.PSU_MIO_42_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_42_SLEW {slow} \
    CONFIG.PSU_MIO_43_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_43_SLEW {slow} \
    CONFIG.PSU_MIO_45_PULLUPDOWN {disable} \
    CONFIG.PSU_MIO_46_PULLUPDOWN {disable} \
    CONFIG.PSU_MIO_47_PULLUPDOWN {disable} \
    CONFIG.PSU_MIO_48_PULLUPDOWN {disable} \
    CONFIG.PSU_MIO_4_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_4_SLEW {slow} \
    CONFIG.PSU_MIO_50_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_50_SLEW {slow} \
    CONFIG.PSU_MIO_51_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_51_SLEW {slow} \
    CONFIG.PSU_MIO_54_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_54_SLEW {slow} \
    CONFIG.PSU_MIO_56_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_56_SLEW {slow} \
    CONFIG.PSU_MIO_57_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_57_SLEW {slow} \
    CONFIG.PSU_MIO_58_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_58_SLEW {slow} \
    CONFIG.PSU_MIO_59_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_59_SLEW {slow} \
    CONFIG.PSU_MIO_5_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_5_SLEW {slow} \
    CONFIG.PSU_MIO_60_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_60_SLEW {slow} \
    CONFIG.PSU_MIO_61_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_61_SLEW {slow} \
    CONFIG.PSU_MIO_62_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_62_SLEW {slow} \
    CONFIG.PSU_MIO_63_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_63_SLEW {slow} \
    CONFIG.PSU_MIO_64_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_64_POLARITY {Default} \
    CONFIG.PSU_MIO_64_SLEW {slow} \
    CONFIG.PSU_MIO_65_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_65_POLARITY {Default} \
    CONFIG.PSU_MIO_65_SLEW {slow} \
    CONFIG.PSU_MIO_67_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_67_SLEW {slow} \
    CONFIG.PSU_MIO_68_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_68_POLARITY {Default} \
    CONFIG.PSU_MIO_68_SLEW {slow} \
    CONFIG.PSU_MIO_69_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_69_POLARITY {Default} \
    CONFIG.PSU_MIO_69_SLEW {slow} \
    CONFIG.PSU_MIO_6_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_6_SLEW {slow} \
    CONFIG.PSU_MIO_71_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_71_SLEW {slow} \
    CONFIG.PSU_MIO_72_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_72_POLARITY {Default} \
    CONFIG.PSU_MIO_72_SLEW {slow} \
    CONFIG.PSU_MIO_73_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_73_POLARITY {Default} \
    CONFIG.PSU_MIO_73_SLEW {slow} \
    CONFIG.PSU_MIO_74_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_74_POLARITY {Default} \
    CONFIG.PSU_MIO_74_SLEW {slow} \
    CONFIG.PSU_MIO_75_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_75_POLARITY {Default} \
    CONFIG.PSU_MIO_75_SLEW {slow} \
    CONFIG.PSU_MIO_76_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_76_SLEW {slow} \
    CONFIG.PSU_MIO_77_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_77_POLARITY {Default} \
    CONFIG.PSU_MIO_77_SLEW {slow} \
    CONFIG.PSU_MIO_7_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_7_POLARITY {Default} \
    CONFIG.PSU_MIO_7_SLEW {slow} \
    CONFIG.PSU_MIO_8_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_8_POLARITY {Default} \
    CONFIG.PSU_MIO_8_SLEW {slow} \
    CONFIG.PSU_MIO_9_DRIVE_STRENGTH {4} \
    CONFIG.PSU_MIO_9_SLEW {slow} \
    CONFIG.PSU_MIO_TREE_PERIPHERALS {Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#SPI 1#GPIO0 MIO#GPIO0 MIO#SPI 1#SPI 1#SPI 1#GPIO0 MIO#GPIO0 MIO#GPIO0 MIO#GPIO0\
MIO#GPIO0 MIO#GPIO0 MIO#GPIO0 MIO#GPIO0 MIO#GPIO0 MIO#GPIO0 MIO#GPIO0 MIO#GPIO0 MIO#I2C 1#I2C 1#GPIO1 MIO#DPAUX#DPAUX#DPAUX#DPAUX#GPIO1 MIO#PMU GPO 0#PMU GPO 1#GPIO1 MIO#GPIO1 MIO#UART 1#UART 1#Gem 1#Gem\
1#Gem 1#Gem 1#Gem 1#Gem 1#Gem 1#Gem 1#Gem 1#Gem 1#Gem 1#Gem 1#MDIO 1#MDIO 1#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#GPIO2 MIO#GPIO2 MIO#CAN 0#CAN 0#GPIO2 MIO#GPIO2 MIO#UART\
0#UART 0#GPIO2 MIO#GPIO2 MIO#GPIO2 MIO#GPIO2 MIO#USB0 Reset#GPIO2 MIO} \
    CONFIG.PSU_MIO_TREE_SIGNALS {sclk_out#miso_mo1#mo2#mo3#mosi_mi0#n_ss_out#sclk_out#gpio0[7]#gpio0[8]#n_ss_out[0]#miso#mosi#gpio0[12]#gpio0[13]#gpio0[14]#gpio0[15]#gpio0[16]#gpio0[17]#gpio0[18]#gpio0[19]#gpio0[20]#gpio0[21]#gpio0[22]#gpio0[23]#scl_out#sda_out#gpio1[26]#dp_aux_data_out#dp_hot_plug_detect#dp_aux_data_oe#dp_aux_data_in#gpio1[31]#gpo[0]#gpo[1]#gpio1[34]#gpio1[35]#txd#rxd#rgmii_tx_clk#rgmii_txd[0]#rgmii_txd[1]#rgmii_txd[2]#rgmii_txd[3]#rgmii_tx_ctl#rgmii_rx_clk#rgmii_rxd[0]#rgmii_rxd[1]#rgmii_rxd[2]#rgmii_rxd[3]#rgmii_rx_ctl#gem1_mdc#gem1_mdio_out#ulpi_clk_in#ulpi_dir#ulpi_tx_data[2]#ulpi_nxt#ulpi_tx_data[0]#ulpi_tx_data[1]#ulpi_stp#ulpi_tx_data[3]#ulpi_tx_data[4]#ulpi_tx_data[5]#ulpi_tx_data[6]#ulpi_tx_data[7]#gpio2[64]#gpio2[65]#phy_rx#phy_tx#gpio2[68]#gpio2[69]#rxd#txd#gpio2[72]#gpio2[73]#gpio2[74]#gpio2[75]#reset#gpio2[77]}\
\
    CONFIG.PSU_USB3__DUAL_CLOCK_ENABLE {1} \
    CONFIG.PSU__ACT_DDR_FREQ_MHZ {524.994751} \
    CONFIG.PSU__CAN0__GRP_CLK__ENABLE {0} \
    CONFIG.PSU__CAN0__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__CAN0__PERIPHERAL__IO {MIO 66 .. 67} \
    CONFIG.PSU__CRF_APB__ACPU_CTRL__ACT_FREQMHZ {1333.000000} \
    CONFIG.PSU__CRF_APB__ACPU_CTRL__FREQMHZ {1333} \
    CONFIG.PSU__CRF_APB__ACPU_CTRL__SRCSEL {APLL} \
    CONFIG.PSU__CRF_APB__ACPU__FRAC_ENABLED {1} \
    CONFIG.PSU__CRF_APB__APLL_CTRL__FRACFREQ {1333} \
    CONFIG.PSU__CRF_APB__APLL_CTRL__SRCSEL {PSS_REF_CLK} \
    CONFIG.PSU__CRF_APB__APLL_FRAC_CFG__ENABLED {1} \
    CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__ACT_FREQMHZ {249.997498} \
    CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__FREQMHZ {250} \
    CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRF_APB__DBG_TRACE_CTRL__FREQMHZ {250} \
    CONFIG.PSU__CRF_APB__DBG_TRACE_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__ACT_FREQMHZ {249.997498} \
    CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__FREQMHZ {250} \
    CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRF_APB__DDR_CTRL__ACT_FREQMHZ {262.497375} \
    CONFIG.PSU__CRF_APB__DDR_CTRL__FREQMHZ {533} \
    CONFIG.PSU__CRF_APB__DDR_CTRL__SRCSEL {DPLL} \
    CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__ACT_FREQMHZ {444.333344} \
    CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__FREQMHZ {600} \
    CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__SRCSEL {APLL} \
    CONFIG.PSU__CRF_APB__DPLL_CTRL__SRCSEL {PSS_REF_CLK} \
    CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__ACT_FREQMHZ {24.242182} \
    CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__FREQMHZ {25} \
    CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__SRCSEL {RPLL} \
    CONFIG.PSU__CRF_APB__DP_AUDIO__FRAC_ENABLED {0} \
    CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__ACT_FREQMHZ {26.666401} \
    CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__FREQMHZ {27} \
    CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__SRCSEL {RPLL} \
    CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__ACT_FREQMHZ {299.997009} \
    CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__FREQMHZ {300} \
    CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__SRCSEL {VPLL} \
    CONFIG.PSU__CRF_APB__DP_VIDEO__FRAC_ENABLED {0} \
    CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__ACT_FREQMHZ {524.994751} \
    CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__FREQMHZ {600} \
    CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__SRCSEL {DPLL} \
    CONFIG.PSU__CRF_APB__GPU_REF_CTRL__ACT_FREQMHZ {524.994751} \
    CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__ACT_FREQMHZ {99.999001} \
    CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__FREQMHZ {100} \
    CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__ACT_FREQMHZ {524.994751} \
    CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__FREQMHZ {533.33} \
    CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__SRCSEL {DPLL} \
    CONFIG.PSU__CRF_APB__VPLL_CTRL__SRCSEL {PSS_REF_CLK} \
    CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__ACT_FREQMHZ {499.994995} \
    CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__FREQMHZ {500} \
    CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__AMS_REF_CTRL__ACT_FREQMHZ {49.999500} \
    CONFIG.PSU__CRL_APB__CAN0_REF_CTRL__ACT_FREQMHZ {99.999001} \
    CONFIG.PSU__CRL_APB__CPU_R5_CTRL__ACT_FREQMHZ {533.328003} \
    CONFIG.PSU__CRL_APB__CPU_R5_CTRL__FREQMHZ {533.333} \
    CONFIG.PSU__CRL_APB__CPU_R5_CTRL__SRCSEL {RPLL} \
    CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__ACT_FREQMHZ {249.997498} \
    CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__FREQMHZ {250} \
    CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__DLL_REF_CTRL__ACT_FREQMHZ {999.989990} \
    CONFIG.PSU__CRL_APB__GEM1_REF_CTRL__ACT_FREQMHZ {124.998749} \
    CONFIG.PSU__CRL_APB__GEM1_REF_CTRL__FREQMHZ {125} \
    CONFIG.PSU__CRL_APB__GEM1_REF_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__GEM_TSU_REF_CTRL__ACT_FREQMHZ {249.997498} \
    CONFIG.PSU__CRL_APB__GEM_TSU_REF_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__ACT_FREQMHZ {99.999001} \
    CONFIG.PSU__CRL_APB__IOPLL_CTRL__SRCSEL {PSS_REF_CLK} \
    CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__ACT_FREQMHZ {249.997498} \
    CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__FREQMHZ {250} \
    CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__ACT_FREQMHZ {99.999001} \
    CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__FREQMHZ {100} \
    CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__ACT_FREQMHZ {499.994995} \
    CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__FREQMHZ {500} \
    CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__PCAP_CTRL__ACT_FREQMHZ {199.998001} \
    CONFIG.PSU__CRL_APB__PCAP_CTRL__FREQMHZ {200} \
    CONFIG.PSU__CRL_APB__PCAP_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__PL0_REF_CTRL__ACT_FREQMHZ {99.999001} \
    CONFIG.PSU__CRL_APB__PL0_REF_CTRL__FREQMHZ {100} \
    CONFIG.PSU__CRL_APB__PL0_REF_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__PL1_REF_CTRL__ACT_FREQMHZ {99.999001} \
    CONFIG.PSU__CRL_APB__PL1_REF_CTRL__FREQMHZ {100} \
    CONFIG.PSU__CRL_APB__PL1_REF_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__ACT_FREQMHZ {124.998749} \
    CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__FREQMHZ {125} \
    CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__RPLL_CTRL__SRCSEL {PSS_REF_CLK} \
    CONFIG.PSU__CRL_APB__SPI1_REF_CTRL__ACT_FREQMHZ {199.998001} \
    CONFIG.PSU__CRL_APB__SPI1_REF_CTRL__FREQMHZ {200} \
    CONFIG.PSU__CRL_APB__SPI1_REF_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__ACT_FREQMHZ {99.999001} \
    CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__FREQMHZ {100} \
    CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__UART0_REF_CTRL__ACT_FREQMHZ {99.999001} \
    CONFIG.PSU__CRL_APB__UART0_REF_CTRL__FREQMHZ {100} \
    CONFIG.PSU__CRL_APB__UART0_REF_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__UART1_REF_CTRL__ACT_FREQMHZ {99.999001} \
    CONFIG.PSU__CRL_APB__UART1_REF_CTRL__FREQMHZ {100} \
    CONFIG.PSU__CRL_APB__UART1_REF_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__ACT_FREQMHZ {249.997498} \
    CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__FREQMHZ {250} \
    CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__SRCSEL {IOPLL} \
    CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__ACT_FREQMHZ {19.999800} \
    CONFIG.PSU__CRL_APB__USB3__ENABLE {1} \
    CONFIG.PSU__CSUPMU__PERIPHERAL__VALID {1} \
    CONFIG.PSU__DDRC__ADDR_MIRROR {1} \
    CONFIG.PSU__DDRC__BRC_MAPPING {ROW_BANK_COL} \
    CONFIG.PSU__DDRC__BUS_WIDTH {32 Bit} \
    CONFIG.PSU__DDRC__CLOCK_STOP_EN {0} \
    CONFIG.PSU__DDRC__DEVICE_CAPACITY {16384 MBits} \
    CONFIG.PSU__DDRC__DM_DBI {DM_NO_DBI} \
    CONFIG.PSU__DDRC__DQMAP_0_3 {0} \
    CONFIG.PSU__DDRC__DQMAP_12_15 {0} \
    CONFIG.PSU__DDRC__DQMAP_16_19 {0} \
    CONFIG.PSU__DDRC__DQMAP_20_23 {0} \
    CONFIG.PSU__DDRC__DQMAP_24_27 {0} \
    CONFIG.PSU__DDRC__DQMAP_28_31 {0} \
    CONFIG.PSU__DDRC__DQMAP_32_35 {0} \
    CONFIG.PSU__DDRC__DQMAP_36_39 {0} \
    CONFIG.PSU__DDRC__DQMAP_40_43 {0} \
    CONFIG.PSU__DDRC__DQMAP_44_47 {0} \
    CONFIG.PSU__DDRC__DQMAP_48_51 {0} \
    CONFIG.PSU__DDRC__DQMAP_4_7 {0} \
    CONFIG.PSU__DDRC__DQMAP_52_55 {0} \
    CONFIG.PSU__DDRC__DQMAP_56_59 {0} \
    CONFIG.PSU__DDRC__DQMAP_60_63 {0} \
    CONFIG.PSU__DDRC__DQMAP_64_67 {0} \
    CONFIG.PSU__DDRC__DQMAP_68_71 {0} \
    CONFIG.PSU__DDRC__DQMAP_8_11 {0} \
    CONFIG.PSU__DDRC__DRAM_WIDTH {32 Bits} \
    CONFIG.PSU__DDRC__ECC {Disabled} \
    CONFIG.PSU__DDRC__ENABLE_LP4_HAS_ECC_COMP {0} \
    CONFIG.PSU__DDRC__LPDDR4_T_REF_RANGE {Normal (0-85)} \
    CONFIG.PSU__DDRC__MEMORY_TYPE {LPDDR 4} \
    CONFIG.PSU__DDRC__PER_BANK_REFRESH {0} \
    CONFIG.PSU__DDRC__PHY_DBI_MODE {0} \
    CONFIG.PSU__DDRC__RANK_ADDR_COUNT {0} \
    CONFIG.PSU__DDRC__ROW_ADDR_COUNT {16} \
    CONFIG.PSU__DDRC__SPEED_BIN {LPDDR4_1066} \
    CONFIG.PSU__DDRC__STATIC_RD_MODE {0} \
    CONFIG.PSU__DDRC__TRAIN_DATA_EYE {1} \
    CONFIG.PSU__DDRC__TRAIN_READ_GATE {1} \
    CONFIG.PSU__DDRC__TRAIN_WRITE_LEVEL {1} \
    CONFIG.PSU__DDRC__T_FAW {40.0} \
    CONFIG.PSU__DDRC__T_RAS_MIN {42} \
    CONFIG.PSU__DDRC__T_RC {63} \
    CONFIG.PSU__DDRC__T_RCD {10} \
    CONFIG.PSU__DDRC__T_RP {12} \
    CONFIG.PSU__DDRC__VENDOR_PART {OTHERS} \
    CONFIG.PSU__DDRC__VREF {1} \
    CONFIG.PSU__DDR_HIGH_ADDRESS_GUI_ENABLE {0} \
    CONFIG.PSU__DDR__INTERFACE__FREQMHZ {266.500} \
    CONFIG.PSU__DISPLAYPORT__LANE0__ENABLE {0} \
    CONFIG.PSU__DISPLAYPORT__LANE1__ENABLE {0} \
    CONFIG.PSU__DISPLAYPORT__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__DPAUX__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__DPAUX__PERIPHERAL__IO {MIO 27 .. 30} \
    CONFIG.PSU__DP__LANE_SEL {None} \
    CONFIG.PSU__ENET1__FIFO__ENABLE {0} \
    CONFIG.PSU__ENET1__GRP_MDIO__ENABLE {1} \
    CONFIG.PSU__ENET1__GRP_MDIO__IO {MIO 50 .. 51} \
    CONFIG.PSU__ENET1__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__ENET1__PERIPHERAL__IO {MIO 38 .. 49} \
    CONFIG.PSU__ENET1__PTP__ENABLE {0} \
    CONFIG.PSU__ENET1__TSU__ENABLE {0} \
    CONFIG.PSU__FPD_SLCR__WDT1__ACT_FREQMHZ {99.999001} \
    CONFIG.PSU__FPGA_PL0_ENABLE {1} \
    CONFIG.PSU__FPGA_PL1_ENABLE {1} \
    CONFIG.PSU__GEM1_COHERENCY {0} \
    CONFIG.PSU__GEM1_ROUTE_THROUGH_FPD {0} \
    CONFIG.PSU__GEM__TSU__ENABLE {0} \
    CONFIG.PSU__GPIO0_MIO__IO {MIO 0 .. 25} \
    CONFIG.PSU__GPIO0_MIO__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__GPIO1_MIO__IO {MIO 26 .. 51} \
    CONFIG.PSU__GPIO1_MIO__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__GPIO2_MIO__IO {MIO 52 .. 77} \
    CONFIG.PSU__GPIO2_MIO__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__GT__LINK_SPEED {HBR} \
    CONFIG.PSU__GT__PRE_EMPH_LVL_4 {0} \
    CONFIG.PSU__GT__VLT_SWNG_LVL_4 {0} \
    CONFIG.PSU__I2C1__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__I2C1__PERIPHERAL__IO {MIO 24 .. 25} \
    CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC0_SEL {APB} \
    CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC1_SEL {APB} \
    CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC2_SEL {APB} \
    CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC3_SEL {APB} \
    CONFIG.PSU__IOU_SLCR__TTC0__ACT_FREQMHZ {100.000000} \
    CONFIG.PSU__IOU_SLCR__TTC1__ACT_FREQMHZ {100.000000} \
    CONFIG.PSU__IOU_SLCR__TTC2__ACT_FREQMHZ {100.000000} \
    CONFIG.PSU__IOU_SLCR__TTC3__ACT_FREQMHZ {100.000000} \
    CONFIG.PSU__IOU_SLCR__WDT0__ACT_FREQMHZ {99.999001} \
    CONFIG.PSU__LPD_SLCR__CSUPMU__ACT_FREQMHZ {100.000000} \
    CONFIG.PSU__MAXIGP0__DATA_WIDTH {128} \
    CONFIG.PSU__MAXIGP1__DATA_WIDTH {128} \
    CONFIG.PSU__MAXIGP2__DATA_WIDTH {32} \
    CONFIG.PSU__OVERRIDE__BASIC_CLOCK {0} \
    CONFIG.PSU__PL_CLK0_BUF {TRUE} \
    CONFIG.PSU__PL_CLK1_BUF {TRUE} \
    CONFIG.PSU__PMU_COHERENCY {0} \
    CONFIG.PSU__PMU__AIBACK__ENABLE {0} \
    CONFIG.PSU__PMU__EMIO_GPI__ENABLE {0} \
    CONFIG.PSU__PMU__EMIO_GPO__ENABLE {0} \
    CONFIG.PSU__PMU__GPI0__ENABLE {0} \
    CONFIG.PSU__PMU__GPI1__ENABLE {0} \
    CONFIG.PSU__PMU__GPI2__ENABLE {0} \
    CONFIG.PSU__PMU__GPI3__ENABLE {0} \
    CONFIG.PSU__PMU__GPI4__ENABLE {0} \
    CONFIG.PSU__PMU__GPI5__ENABLE {0} \
    CONFIG.PSU__PMU__GPO0__ENABLE {1} \
    CONFIG.PSU__PMU__GPO0__IO {MIO 32} \
    CONFIG.PSU__PMU__GPO1__ENABLE {1} \
    CONFIG.PSU__PMU__GPO1__IO {MIO 33} \
    CONFIG.PSU__PMU__GPO2__ENABLE {0} \
    CONFIG.PSU__PMU__GPO3__ENABLE {0} \
    CONFIG.PSU__PMU__GPO4__ENABLE {0} \
    CONFIG.PSU__PMU__GPO5__ENABLE {0} \
    CONFIG.PSU__PMU__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__PMU__PLERROR__ENABLE {0} \
    CONFIG.PSU__PRESET_APPLIED {1} \
    CONFIG.PSU__PROTECTION__MASTERS {USB1:NonSecure;0|USB0:NonSecure;1|S_AXI_LPD:NA;0|S_AXI_HPC1_FPD:NA;0|S_AXI_HPC0_FPD:NA;0|S_AXI_HP3_FPD:NA;0|S_AXI_HP2_FPD:NA;0|S_AXI_HP1_FPD:NA;0|S_AXI_HP0_FPD:NA;0|S_AXI_ACP:NA;0|S_AXI_ACE:NA;0|SD1:NonSecure;0|SD0:NonSecure;0|SATA1:NonSecure;0|SATA0:NonSecure;0|RPU1:Secure;1|RPU0:Secure;1|QSPI:NonSecure;1|PMU:NA;1|PCIe:NonSecure;0|NAND:NonSecure;0|LDMA:NonSecure;1|GPU:NonSecure;1|GEM3:NonSecure;0|GEM2:NonSecure;0|GEM1:NonSecure;1|GEM0:NonSecure;0|FDMA:NonSecure;1|DP:NonSecure;1|DAP:NA;1|Coresight:NA;1|CSU:NA;1|APU:NA;1}\
\
    CONFIG.PSU__PROTECTION__SLAVES {LPD;USB3_1_XHCI;FE300000;FE3FFFFF;0|LPD;USB3_1;FF9E0000;FF9EFFFF;0|LPD;USB3_0_XHCI;FE200000;FE2FFFFF;1|LPD;USB3_0;FF9D0000;FF9DFFFF;1|LPD;UART1;FF010000;FF01FFFF;1|LPD;UART0;FF000000;FF00FFFF;1|LPD;TTC3;FF140000;FF14FFFF;1|LPD;TTC2;FF130000;FF13FFFF;1|LPD;TTC1;FF120000;FF12FFFF;1|LPD;TTC0;FF110000;FF11FFFF;1|FPD;SWDT1;FD4D0000;FD4DFFFF;1|LPD;SWDT0;FF150000;FF15FFFF;1|LPD;SPI1;FF050000;FF05FFFF;1|LPD;SPI0;FF040000;FF04FFFF;0|FPD;SMMU_REG;FD5F0000;FD5FFFFF;1|FPD;SMMU;FD800000;FDFFFFFF;1|FPD;SIOU;FD3D0000;FD3DFFFF;1|FPD;SERDES;FD400000;FD47FFFF;1|LPD;SD1;FF170000;FF17FFFF;0|LPD;SD0;FF160000;FF16FFFF;0|FPD;SATA;FD0C0000;FD0CFFFF;0|LPD;RTC;FFA60000;FFA6FFFF;1|LPD;RSA_CORE;FFCE0000;FFCEFFFF;1|LPD;RPU;FF9A0000;FF9AFFFF;1|LPD;R5_TCM_RAM_GLOBAL;FFE00000;FFE3FFFF;1|LPD;R5_1_Instruction_Cache;FFEC0000;FFECFFFF;1|LPD;R5_1_Data_Cache;FFED0000;FFEDFFFF;1|LPD;R5_1_BTCM_GLOBAL;FFEB0000;FFEBFFFF;1|LPD;R5_1_ATCM_GLOBAL;FFE90000;FFE9FFFF;1|LPD;R5_0_Instruction_Cache;FFE40000;FFE4FFFF;1|LPD;R5_0_Data_Cache;FFE50000;FFE5FFFF;1|LPD;R5_0_BTCM_GLOBAL;FFE20000;FFE2FFFF;1|LPD;R5_0_ATCM_GLOBAL;FFE00000;FFE0FFFF;1|LPD;QSPI_Linear_Address;C0000000;DFFFFFFF;1|LPD;QSPI;FF0F0000;FF0FFFFF;1|LPD;PMU_RAM;FFDC0000;FFDDFFFF;1|LPD;PMU_GLOBAL;FFD80000;FFDBFFFF;1|FPD;PCIE_MAIN;FD0E0000;FD0EFFFF;0|FPD;PCIE_LOW;E0000000;EFFFFFFF;0|FPD;PCIE_HIGH2;8000000000;BFFFFFFFFF;0|FPD;PCIE_HIGH1;600000000;7FFFFFFFF;0|FPD;PCIE_DMA;FD0F0000;FD0FFFFF;0|FPD;PCIE_ATTRIB;FD480000;FD48FFFF;0|LPD;OCM_XMPU_CFG;FFA70000;FFA7FFFF;1|LPD;OCM_SLCR;FF960000;FF96FFFF;1|OCM;OCM;FFFC0000;FFFFFFFF;1|LPD;NAND;FF100000;FF10FFFF;0|LPD;MBISTJTAG;FFCF0000;FFCFFFFF;1|LPD;LPD_XPPU_SINK;FF9C0000;FF9CFFFF;1|LPD;LPD_XPPU;FF980000;FF98FFFF;1|LPD;LPD_SLCR_SECURE;FF4B0000;FF4DFFFF;1|LPD;LPD_SLCR;FF410000;FF4AFFFF;1|LPD;LPD_GPV;FE100000;FE1FFFFF;1|LPD;LPD_DMA_7;FFAF0000;FFAFFFFF;1|LPD;LPD_DMA_6;FFAE0000;FFAEFFFF;1|LPD;LPD_DMA_5;FFAD0000;FFADFFFF;1|LPD;LPD_DMA_4;FFAC0000;FFACFFFF;1|LPD;LPD_DMA_3;FFAB0000;FFABFFFF;1|LPD;LPD_DMA_2;FFAA0000;FFAAFFFF;1|LPD;LPD_DMA_1;FFA90000;FFA9FFFF;1|LPD;LPD_DMA_0;FFA80000;FFA8FFFF;1|LPD;IPI_CTRL;FF380000;FF3FFFFF;1|LPD;IOU_SLCR;FF180000;FF23FFFF;1|LPD;IOU_SECURE_SLCR;FF240000;FF24FFFF;1|LPD;IOU_SCNTRS;FF260000;FF26FFFF;1|LPD;IOU_SCNTR;FF250000;FF25FFFF;1|LPD;IOU_GPV;FE000000;FE0FFFFF;1|LPD;I2C1;FF030000;FF03FFFF;1|LPD;I2C0;FF020000;FF02FFFF;0|FPD;GPU;FD4B0000;FD4BFFFF;1|LPD;GPIO;FF0A0000;FF0AFFFF;1|LPD;GEM3;FF0E0000;FF0EFFFF;0|LPD;GEM2;FF0D0000;FF0DFFFF;0|LPD;GEM1;FF0C0000;FF0CFFFF;1|LPD;GEM0;FF0B0000;FF0BFFFF;0|FPD;FPD_XMPU_SINK;FD4F0000;FD4FFFFF;1|FPD;FPD_XMPU_CFG;FD5D0000;FD5DFFFF;1|FPD;FPD_SLCR_SECURE;FD690000;FD6CFFFF;1|FPD;FPD_SLCR;FD610000;FD68FFFF;1|FPD;FPD_DMA_CH7;FD570000;FD57FFFF;1|FPD;FPD_DMA_CH6;FD560000;FD56FFFF;1|FPD;FPD_DMA_CH5;FD550000;FD55FFFF;1|FPD;FPD_DMA_CH4;FD540000;FD54FFFF;1|FPD;FPD_DMA_CH3;FD530000;FD53FFFF;1|FPD;FPD_DMA_CH2;FD520000;FD52FFFF;1|FPD;FPD_DMA_CH1;FD510000;FD51FFFF;1|FPD;FPD_DMA_CH0;FD500000;FD50FFFF;1|LPD;EFUSE;FFCC0000;FFCCFFFF;1|FPD;Display\
Port;FD4A0000;FD4AFFFF;1|FPD;DPDMA;FD4C0000;FD4CFFFF;1|FPD;DDR_XMPU5_CFG;FD050000;FD05FFFF;1|FPD;DDR_XMPU4_CFG;FD040000;FD04FFFF;1|FPD;DDR_XMPU3_CFG;FD030000;FD03FFFF;1|FPD;DDR_XMPU2_CFG;FD020000;FD02FFFF;1|FPD;DDR_XMPU1_CFG;FD010000;FD01FFFF;1|FPD;DDR_XMPU0_CFG;FD000000;FD00FFFF;1|FPD;DDR_QOS_CTRL;FD090000;FD09FFFF;1|FPD;DDR_PHY;FD080000;FD08FFFF;1|DDR;DDR_LOW;0;7FFFFFFF;1|DDR;DDR_HIGH;800000000;800000000;0|FPD;DDDR_CTRL;FD070000;FD070FFF;1|LPD;Coresight;FE800000;FEFFFFFF;1|LPD;CSU_DMA;FFC80000;FFC9FFFF;1|LPD;CSU;FFCA0000;FFCAFFFF;1|LPD;CRL_APB;FF5E0000;FF85FFFF;1|FPD;CRF_APB;FD1A0000;FD2DFFFF;1|FPD;CCI_REG;FD5E0000;FD5EFFFF;1|LPD;CAN1;FF070000;FF07FFFF;0|LPD;CAN0;FF060000;FF06FFFF;1|FPD;APU;FD5C0000;FD5CFFFF;1|LPD;APM_INTC_IOU;FFA20000;FFA2FFFF;1|LPD;APM_FPD_LPD;FFA30000;FFA3FFFF;1|FPD;APM_5;FD490000;FD49FFFF;1|FPD;APM_0;FD0B0000;FD0BFFFF;1|LPD;APM2;FFA10000;FFA1FFFF;1|LPD;APM1;FFA00000;FFA0FFFF;1|LPD;AMS;FFA50000;FFA5FFFF;1|FPD;AFI_5;FD3B0000;FD3BFFFF;1|FPD;AFI_4;FD3A0000;FD3AFFFF;1|FPD;AFI_3;FD390000;FD39FFFF;1|FPD;AFI_2;FD380000;FD38FFFF;1|FPD;AFI_1;FD370000;FD37FFFF;1|FPD;AFI_0;FD360000;FD36FFFF;1|LPD;AFIFM6;FF9B0000;FF9BFFFF;1|FPD;ACPU_GIC;F9010000;F907FFFF;1}\
\
    CONFIG.PSU__PSS_REF_CLK__FREQMHZ {33.333} \
    CONFIG.PSU__QSPI_COHERENCY {0} \
    CONFIG.PSU__QSPI_ROUTE_THROUGH_FPD {0} \
    CONFIG.PSU__QSPI__GRP_FBCLK__ENABLE {0} \
    CONFIG.PSU__QSPI__PERIPHERAL__DATA_MODE {x4} \
    CONFIG.PSU__QSPI__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__QSPI__PERIPHERAL__IO {MIO 0 .. 5} \
    CONFIG.PSU__QSPI__PERIPHERAL__MODE {Single} \
    CONFIG.PSU__SPI1__GRP_SS0__IO {MIO 9} \
    CONFIG.PSU__SPI1__GRP_SS1__ENABLE {0} \
    CONFIG.PSU__SPI1__GRP_SS2__ENABLE {0} \
    CONFIG.PSU__SPI1__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__SPI1__PERIPHERAL__IO {MIO 6 .. 11} \
    CONFIG.PSU__SWDT0__CLOCK__ENABLE {0} \
    CONFIG.PSU__SWDT0__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__SWDT0__RESET__ENABLE {0} \
    CONFIG.PSU__SWDT1__CLOCK__ENABLE {0} \
    CONFIG.PSU__SWDT1__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__SWDT1__RESET__ENABLE {0} \
    CONFIG.PSU__TSU__BUFG_PORT_PAIR {0} \
    CONFIG.PSU__TTC0__CLOCK__ENABLE {0} \
    CONFIG.PSU__TTC0__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__TTC0__WAVEOUT__ENABLE {0} \
    CONFIG.PSU__TTC1__CLOCK__ENABLE {0} \
    CONFIG.PSU__TTC1__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__TTC1__WAVEOUT__ENABLE {0} \
    CONFIG.PSU__TTC2__CLOCK__ENABLE {0} \
    CONFIG.PSU__TTC2__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__TTC2__WAVEOUT__ENABLE {0} \
    CONFIG.PSU__TTC3__CLOCK__ENABLE {0} \
    CONFIG.PSU__TTC3__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__TTC3__WAVEOUT__ENABLE {0} \
    CONFIG.PSU__UART0__BAUD_RATE {115200} \
    CONFIG.PSU__UART0__MODEM__ENABLE {0} \
    CONFIG.PSU__UART0__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__UART0__PERIPHERAL__IO {MIO 70 .. 71} \
    CONFIG.PSU__UART1__BAUD_RATE {115200} \
    CONFIG.PSU__UART1__MODEM__ENABLE {0} \
    CONFIG.PSU__UART1__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__UART1__PERIPHERAL__IO {MIO 36 .. 37} \
    CONFIG.PSU__USB0_COHERENCY {0} \
    CONFIG.PSU__USB0__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__USB0__PERIPHERAL__IO {MIO 52 .. 63} \
    CONFIG.PSU__USB0__REF_CLK_FREQ {26} \
    CONFIG.PSU__USB0__REF_CLK_SEL {Ref Clk2} \
    CONFIG.PSU__USB0__RESET__ENABLE {1} \
    CONFIG.PSU__USB0__RESET__IO {MIO 76} \
    CONFIG.PSU__USB1__RESET__ENABLE {0} \
    CONFIG.PSU__USB2_0__EMIO__ENABLE {0} \
    CONFIG.PSU__USB3_0__EMIO__ENABLE {0} \
    CONFIG.PSU__USB3_0__PERIPHERAL__ENABLE {1} \
    CONFIG.PSU__USB3_0__PERIPHERAL__IO {GT Lane2} \
    CONFIG.PSU__USB__RESET__MODE {Separate MIO Pin} \
    CONFIG.PSU__USB__RESET__POLARITY {Active Low} \
    CONFIG.PSU__USE__IRQ0 {1} \
    CONFIG.PSU__USE__M_AXI_GP0 {1} \
    CONFIG.PSU__USE__M_AXI_GP1 {1} \
    CONFIG.PSU__USE__M_AXI_GP2 {1} \
  ] $zynq_ultra_ps_e_0


  # Create instance: motor_ena, and set properties
  set motor_ena [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 motor_ena ]
  set_property -dict [list \
    CONFIG.C_ALL_OUTPUTS {1} \
    CONFIG.C_GPIO_WIDTH {1} \
  ] $motor_ena


  # Create instance: ps8_0_axi_periph, and set properties
  set ps8_0_axi_periph [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect:2.1 ps8_0_axi_periph ]
  set_property -dict [list \
    CONFIG.NUM_MI {2} \
    CONFIG.NUM_SI {3} \
  ] $ps8_0_axi_periph


  # Create instance: rst_ps8_0_99M, and set properties
  set rst_ps8_0_99M [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 rst_ps8_0_99M ]

  # Create instance: motor_controller_hs_0, and set properties
  set block_name motor_controller_hs
  set block_cell_name motor_controller_hs_0
  if { [catch {set motor_controller_hs_0 [create_bd_cell -type module -reference $block_name $block_cell_name] } errmsg] } {
     catch {common::send_gid_msg -ssname BD::TCL -id 2095 -severity "ERROR" "Unable to add referenced block <$block_name>. Please add the files for ${block_name}'s definition into the project."}
     return 1
   } elseif { $motor_controller_hs_0 eq "" } {
     catch {common::send_gid_msg -ssname BD::TCL -id 2096 -severity "ERROR" "Unable to referenced block <$block_name>. Please add the files for ${block_name}'s definition into the project."}
     return 1
   }
  
  # Create instance: proc_sys_reset_0, and set properties
  set proc_sys_reset_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 proc_sys_reset_0 ]

  # Create instance: axi_intc_0, and set properties
  set axi_intc_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_intc:4.1 axi_intc_0 ]
  set_property CONFIG.C_IRQ_CONNECTION {1} $axi_intc_0


  # Create instance: axis_data_fifo_voltA, and set properties
  set axis_data_fifo_voltA [ create_bd_cell -type ip -vlnv xilinx.com:ip:axis_data_fifo:2.0 axis_data_fifo_voltA ]
  set_property -dict [list \
    CONFIG.FIFO_DEPTH {4096} \
    CONFIG.HAS_TLAST {1} \
    CONFIG.TDATA_NUM_BYTES {2} \
  ] $axis_data_fifo_voltA


  # Create instance: ad7352_spi_0, and set properties
  set block_name ad7352_spi
  set block_cell_name ad7352_spi_0
  if { [catch {set ad7352_spi_0 [create_bd_cell -type module -reference $block_name $block_cell_name] } errmsg] } {
     catch {common::send_gid_msg -ssname BD::TCL -id 2095 -severity "ERROR" "Unable to add referenced block <$block_name>. Please add the files for ${block_name}'s definition into the project."}
     return 1
   } elseif { $ad7352_spi_0 eq "" } {
     catch {common::send_gid_msg -ssname BD::TCL -id 2096 -severity "ERROR" "Unable to referenced block <$block_name>. Please add the files for ${block_name}'s definition into the project."}
     return 1
   }
  
  # Create instance: axis_data_fifo_currA, and set properties
  set axis_data_fifo_currA [ create_bd_cell -type ip -vlnv xilinx.com:ip:axis_data_fifo:2.0 axis_data_fifo_currA ]
  set_property -dict [list \
    CONFIG.FIFO_DEPTH {4096} \
    CONFIG.HAS_TLAST {1} \
    CONFIG.TDATA_NUM_BYTES {2} \
  ] $axis_data_fifo_currA


  # Create instance: axis_data_fifo_voltB, and set properties
  set axis_data_fifo_voltB [ create_bd_cell -type ip -vlnv xilinx.com:ip:axis_data_fifo:2.0 axis_data_fifo_voltB ]
  set_property -dict [list \
    CONFIG.FIFO_DEPTH {4096} \
    CONFIG.HAS_TLAST {1} \
    CONFIG.TDATA_NUM_BYTES {2} \
  ] $axis_data_fifo_voltB


  # Create instance: axis_data_fifo_currB, and set properties
  set axis_data_fifo_currB [ create_bd_cell -type ip -vlnv xilinx.com:ip:axis_data_fifo:2.0 axis_data_fifo_currB ]
  set_property -dict [list \
    CONFIG.FIFO_DEPTH {4096} \
    CONFIG.HAS_TLAST {1} \
    CONFIG.TDATA_NUM_BYTES {2} \
  ] $axis_data_fifo_currB


  # Create instance: axis_data_fifo_voltC, and set properties
  set axis_data_fifo_voltC [ create_bd_cell -type ip -vlnv xilinx.com:ip:axis_data_fifo:2.0 axis_data_fifo_voltC ]
  set_property -dict [list \
    CONFIG.FIFO_DEPTH {4096} \
    CONFIG.HAS_TLAST {1} \
    CONFIG.TDATA_NUM_BYTES {2} \
  ] $axis_data_fifo_voltC


  # Create instance: axis_data_fifo_currC, and set properties
  set axis_data_fifo_currC [ create_bd_cell -type ip -vlnv xilinx.com:ip:axis_data_fifo:2.0 axis_data_fifo_currC ]
  set_property -dict [list \
    CONFIG.FIFO_DEPTH {4096} \
    CONFIG.HAS_TLAST {1} \
    CONFIG.TDATA_NUM_BYTES {2} \
  ] $axis_data_fifo_currC


  # Create interface connections
  connect_bd_intf_net -intf_net ad7352_spi_0_m_axis_currA [get_bd_intf_pins ad7352_spi_0/m_axis_currA] [get_bd_intf_pins axis_data_fifo_currA/S_AXIS]
  connect_bd_intf_net -intf_net ad7352_spi_0_m_axis_currB [get_bd_intf_pins ad7352_spi_0/m_axis_currB] [get_bd_intf_pins axis_data_fifo_currB/S_AXIS]
  connect_bd_intf_net -intf_net ad7352_spi_0_m_axis_currC [get_bd_intf_pins ad7352_spi_0/m_axis_currC] [get_bd_intf_pins axis_data_fifo_currC/S_AXIS]
  connect_bd_intf_net -intf_net ad7352_spi_0_m_axis_voltA [get_bd_intf_pins ad7352_spi_0/m_axis_voltA] [get_bd_intf_pins axis_data_fifo_voltA/S_AXIS]
  connect_bd_intf_net -intf_net ad7352_spi_0_m_axis_voltB [get_bd_intf_pins ad7352_spi_0/m_axis_voltB] [get_bd_intf_pins axis_data_fifo_voltB/S_AXIS]
  connect_bd_intf_net -intf_net ad7352_spi_0_m_axis_voltC [get_bd_intf_pins ad7352_spi_0/m_axis_voltC] [get_bd_intf_pins axis_data_fifo_voltC/S_AXIS]
  connect_bd_intf_net -intf_net ps8_0_axi_periph_M00_AXI [get_bd_intf_pins ps8_0_axi_periph/M00_AXI] [get_bd_intf_pins motor_ena/S_AXI]
  connect_bd_intf_net -intf_net ps8_0_axi_periph_M01_AXI [get_bd_intf_pins ps8_0_axi_periph/M01_AXI] [get_bd_intf_pins axi_intc_0/s_axi]
  connect_bd_intf_net -intf_net zynq_ultra_ps_e_0_M_AXI_HPM0_FPD [get_bd_intf_pins zynq_ultra_ps_e_0/M_AXI_HPM0_FPD] [get_bd_intf_pins ps8_0_axi_periph/S00_AXI]
  connect_bd_intf_net -intf_net zynq_ultra_ps_e_0_M_AXI_HPM0_LPD [get_bd_intf_pins zynq_ultra_ps_e_0/M_AXI_HPM0_LPD] [get_bd_intf_pins ps8_0_axi_periph/S02_AXI]
  connect_bd_intf_net -intf_net zynq_ultra_ps_e_0_M_AXI_HPM1_FPD [get_bd_intf_pins zynq_ultra_ps_e_0/M_AXI_HPM1_FPD] [get_bd_intf_pins ps8_0_axi_periph/S01_AXI]

  # Create port connections
  connect_bd_net -net ad7352_spi_0_ad7352_cs [get_bd_pins ad7352_spi_0/ad7352_cs] [get_bd_ports ad7352_cs]
  connect_bd_net -net ad7352_spi_0_ad7352_sclk [get_bd_pins ad7352_spi_0/ad7352_sclk] [get_bd_ports ad7352_sclk]
  connect_bd_net -net adcA_data_curr_0_1 [get_bd_ports adcA_data_curr] [get_bd_pins ad7352_spi_0/adcA_data_curr]
  connect_bd_net -net adcA_data_volt_0_1 [get_bd_ports adcA_data_volt] [get_bd_pins ad7352_spi_0/adcA_data_volt]
  connect_bd_net -net adcB_data_curr_0_1 [get_bd_ports adcB_data_curr] [get_bd_pins ad7352_spi_0/adcB_data_curr]
  connect_bd_net -net adcB_data_volt_0_1 [get_bd_ports adcB_data_volt] [get_bd_pins ad7352_spi_0/adcB_data_volt]
  connect_bd_net -net adcC_data_curr_0_1 [get_bd_ports adcC_data_curr] [get_bd_pins ad7352_spi_0/adcC_data_curr]
  connect_bd_net -net adcC_data_volt_0_1 [get_bd_ports adcC_data_volt] [get_bd_pins ad7352_spi_0/adcC_data_volt]
  connect_bd_net -net hallA_0_1 [get_bd_ports hallA] [get_bd_pins motor_controller_hs_0/hallA]
  connect_bd_net -net hallB_0_1 [get_bd_ports hallB] [get_bd_pins motor_controller_hs_0/hallB]
  connect_bd_net -net hallC_0_1 [get_bd_ports hallC] [get_bd_pins motor_controller_hs_0/hallC]
  connect_bd_net -net motor_controller_hs_0_phaseA [get_bd_pins motor_controller_hs_0/phaseA] [get_bd_ports phaseA]
  connect_bd_net -net motor_controller_hs_0_phaseB [get_bd_pins motor_controller_hs_0/phaseB] [get_bd_ports phaseB]
  connect_bd_net -net motor_controller_hs_0_phaseC [get_bd_pins motor_controller_hs_0/phaseC] [get_bd_ports phaseC]
  connect_bd_net -net motor_ena_gpio_io_o [get_bd_pins motor_ena/gpio_io_o] [get_bd_ports motor_en] [get_bd_pins ad7352_spi_0/start_cnv]
  connect_bd_net -net proc_sys_reset_0_peripheral_aresetn [get_bd_pins proc_sys_reset_0/peripheral_aresetn] [get_bd_pins axis_data_fifo_voltA/s_axis_aresetn] [get_bd_pins axis_data_fifo_currA/s_axis_aresetn] [get_bd_pins axis_data_fifo_voltB/s_axis_aresetn] [get_bd_pins axis_data_fifo_currB/s_axis_aresetn] [get_bd_pins axis_data_fifo_voltC/s_axis_aresetn] [get_bd_pins axis_data_fifo_currC/s_axis_aresetn] [get_bd_pins ad7352_spi_0/rst_n]
  connect_bd_net -net rst_ps8_0_99M_peripheral_aresetn [get_bd_pins rst_ps8_0_99M/peripheral_aresetn] [get_bd_pins ps8_0_axi_periph/S00_ARESETN] [get_bd_pins motor_ena/s_axi_aresetn] [get_bd_pins ps8_0_axi_periph/M00_ARESETN] [get_bd_pins ps8_0_axi_periph/ARESETN] [get_bd_pins ps8_0_axi_periph/S01_ARESETN] [get_bd_pins motor_controller_hs_0/rst_n] [get_bd_pins axi_intc_0/s_axi_aresetn] [get_bd_pins ps8_0_axi_periph/M01_ARESETN] [get_bd_pins ps8_0_axi_periph/S02_ARESETN]
  connect_bd_net -net zynq_ultra_ps_e_0_pl_clk0 [get_bd_pins zynq_ultra_ps_e_0/pl_clk0] [get_bd_pins zynq_ultra_ps_e_0/maxihpm0_fpd_aclk] [get_bd_pins ps8_0_axi_periph/S00_ACLK] [get_bd_pins rst_ps8_0_99M/slowest_sync_clk] [get_bd_pins motor_ena/s_axi_aclk] [get_bd_pins ps8_0_axi_periph/M00_ACLK] [get_bd_pins ps8_0_axi_periph/ACLK] [get_bd_pins zynq_ultra_ps_e_0/maxihpm1_fpd_aclk] [get_bd_pins ps8_0_axi_periph/S01_ACLK] [get_bd_pins motor_controller_hs_0/clk] [get_bd_pins axi_intc_0/s_axi_aclk] [get_bd_pins ps8_0_axi_periph/M01_ACLK] [get_bd_pins zynq_ultra_ps_e_0/maxihpm0_lpd_aclk] [get_bd_pins ps8_0_axi_periph/S02_ACLK]
  connect_bd_net -net zynq_ultra_ps_e_0_pl_clk1 [get_bd_pins zynq_ultra_ps_e_0/pl_clk1] [get_bd_pins proc_sys_reset_0/slowest_sync_clk] [get_bd_pins axis_data_fifo_voltA/s_axis_aclk] [get_bd_pins axis_data_fifo_currA/s_axis_aclk] [get_bd_pins axis_data_fifo_voltB/s_axis_aclk] [get_bd_pins axis_data_fifo_currB/s_axis_aclk] [get_bd_pins axis_data_fifo_voltC/s_axis_aclk] [get_bd_pins axis_data_fifo_currC/s_axis_aclk] [get_bd_pins ad7352_spi_0/clk]
  connect_bd_net -net zynq_ultra_ps_e_0_pl_resetn0 [get_bd_pins zynq_ultra_ps_e_0/pl_resetn0] [get_bd_pins rst_ps8_0_99M/ext_reset_in] [get_bd_pins proc_sys_reset_0/ext_reset_in]

  # Create address segments
  assign_bd_address -offset 0xA0010000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e_0/Data] [get_bd_addr_segs axi_intc_0/S_AXI/Reg] -force
  assign_bd_address -offset 0xA0000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e_0/Data] [get_bd_addr_segs motor_ena/S_AXI/Reg] -force


  # Restore current instance
  current_bd_instance $oldCurInst

  # Create PFM attributes
  set_property PFM.AXI_PORT {S_AXI_HP0_FPD { memport "S_AXI_HP" sptag "HP0" memory "" is_range "false" } S_AXI_HP1_FPD { memport "S_AXI_HP" sptag "HP1" memory "" is_range "false" } S_AXI_HP2_FPD { memport "S_AXI_HP" sptag "HP2" memory "" is_range "false" } S_AXI_HP3_FPD { memport "S_AXI_HP" sptag "HP3" memory "" is_range "false" } S_AXI_HPC0_FPD { memport "S_AXI_HPC" sptag "HPC0" memory "" is_range "false" } S_AXI_HPC1_FPD { memport "S_AXI_HPC" sptag "HPC1" memory "" is_range "false" } } [get_bd_cells /zynq_ultra_ps_e_0]
  set_property PFM.CLOCK {pl_clk1 {id "1" is_default "true" proc_sys_reset "/proc_sys_reset_0" status "fixed" freq_hz "99999001"}} [get_bd_cells /zynq_ultra_ps_e_0]
  set_property PFM.AXI_PORT {M02_AXI {memport "M_AXI_GP" sptag "GP0" memory "" is_range "false"}} [get_bd_cells /ps8_0_axi_periph]
  set_property PFM.IRQ {intr { id 0 range 32 }} [get_bd_cells /axi_intc_0]
  set_property PFM.AXIS_PORT {M_AXIS {type "M_AXIS" sptag "M_AXIS_VOLT_A" is_range "false"}} [get_bd_cells /axis_data_fifo_voltA]
  set_property PFM.AXIS_PORT {M_AXIS {type "M_AXIS" sptag "M_AXIS_CURR_A" is_range "false"}} [get_bd_cells /axis_data_fifo_currA]
  set_property PFM.AXIS_PORT {M_AXIS {type "M_AXIS" sptag "M_AXIS_VOLT_B" is_range "false"}} [get_bd_cells /axis_data_fifo_voltB]
  set_property PFM.AXIS_PORT {M_AXIS {type "M_AXIS" sptag "M_AXIS_CURR_B" is_range "false"}} [get_bd_cells /axis_data_fifo_currB]
  set_property PFM.AXIS_PORT {M_AXIS {type "M_AXIS" sptag "M_AXIS_VOLT_C" is_range "false"}} [get_bd_cells /axis_data_fifo_voltC]
  set_property PFM.AXIS_PORT {M_AXIS {type "M_AXIS" sptag "M_AXIS_CURR_C" is_range "false"}} [get_bd_cells /axis_data_fifo_currC]


  validate_bd_design
  save_bd_design
}
# End of create_root_design()


##################################################################
# MAIN FLOW
##################################################################

create_root_design ""

krnl_vadd.cpp

C/C++
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <ap_int.h>
#include <ap_axi_sdata.h>
#include <hls_stream.h>


#define DATA_SIZE 4096
#define WAVE_SIZE 4096

// TRIPCOUNT identifier
const int c_size = DATA_SIZE;
typedef ap_axis<16, 0, 0, 0> data_pkt;

static void read_stream(int32_t *wave_out, int size, hls::stream<data_pkt> &data_in) {
    for (int i = 0; i < size; i++) {
        #pragma HLS PIPELINE II = 1
        #pragma HLS LOOP_TRIPCOUNT min = c_size max = c_size
            // wave_out[i] = data_in.read();

    	    data_pkt val;
            val = data_in.read();
    	    wave_out[i] = val.data;
    }
}

extern "C" {

void krnl_vadd(int32_t *voltageA_wave_out, int32_t *voltageB_wave_out, int32_t *voltageC_wave_out, 
               int32_t *currentA_wave_out, int32_t *currentB_wave_out, int32_t *currentC_wave_out, int size,
               hls::stream<data_pkt> &voltageA_in, hls::stream<data_pkt> &voltageB_in, hls::stream<data_pkt> &voltageC_in, 
               hls::stream<data_pkt> &currentA_in, hls::stream<data_pkt> &currentB_in, hls::stream<data_pkt> &currentC_in) {

#pragma HLS INTERFACE mode=m_axi port=voltageA_wave_out depth=WAVE_SIZE bundle=HP0
#pragma HLS INTERFACE mode=m_axi port=voltageB_wave_out depth=WAVE_SIZE bundle=HP0
#pragma HLS INTERFACE mode=m_axi port=voltageC_wave_out depth=WAVE_SIZE bundle=HP0

#pragma HLS INTERFACE mode=m_axi port=currentA_wave_out depth=WAVE_SIZE bundle=HP1
#pragma HLS INTERFACE mode=m_axi port=currentB_wave_out depth=WAVE_SIZE bundle=HP1
#pragma HLS INTERFACE mode=m_axi port=currentC_wave_out depth=WAVE_SIZE bundle=HP1

    read_stream(voltageA_wave_out, size, voltageA_in);
    read_stream(voltageB_wave_out, size, voltageB_in);
    read_stream(voltageC_wave_out, size, voltageC_in); 
    read_stream(currentA_wave_out, size, currentA_in);
    read_stream(currentB_wave_out, size, currentB_in);
    read_stream(currentC_wave_out, size, currentC_in);
        
	}
}

vadd.cpp

C/C++
#define OCL_CHECK(error, call)                                                                   \
    call;                                                                                        \
    if (error != CL_SUCCESS) {                                                                   \
        printf("%s:%d Error calling " #call ", error code is: %d\n", __FILE__, __LINE__, error); \
        exit(EXIT_FAILURE);                                                                      \
    }

#include <vadd.h>
#include <fstream>
#include <iostream>
#include <stdlib.h>

static const int DATA_SIZE = 4096;
static const std::string error_message =
    "Error: Result mismatch:\n"
    "i = %d CPU result = %d Device result = %d\n";

int main(int argc, char* argv[]) {
    // TARGET_DEVICE macro needs to be passed from gcc command line
    if (argc != 2) {
        std::cout << "Usage: " << argv[0] << " <xclbin>" << std::endl;
        return EXIT_FAILURE;
    }

    std::string xclbinFilename = argv[1];

    // Compute the size of array in bytes
    size_t size_in_bytes = DATA_SIZE * sizeof(int32_t);

    std::vector<cl::Device> devices;
    cl_int err;
    cl::Context context;
    cl::CommandQueue q;
    cl::Kernel krnl_vector_add;
    cl::Program program;
    std::vector<cl::Platform> platforms;
    bool found_device = false;

    cl::Platform::get(&platforms);
    for (size_t i = 0; (i < platforms.size()) & (found_device == false); i++) {
        cl::Platform platform = platforms[i];
        std::string platformName = platform.getInfo<CL_PLATFORM_NAME>();
        if (platformName == "Xilinx") {
            devices.clear();
            platform.getDevices(CL_DEVICE_TYPE_ACCELERATOR, &devices);
            if (devices.size()) {
                found_device = true;
                break;
            }
        }
    }
    if (found_device == false) {
        std::cout << "Error: Unable to find Target Device " << std::endl;
        return EXIT_FAILURE;
    }

    std::cout << "INFO: Reading " << xclbinFilename << std::endl;
    FILE* fp;
    if ((fp = fopen(xclbinFilename.c_str(), "r")) == nullptr) {
        printf("ERROR: %s xclbin not available please build\n", xclbinFilename.c_str());
        exit(EXIT_FAILURE);
    }
    
    std::cout << "Loading: '" << xclbinFilename << "'\n";
    std::ifstream bin_file(xclbinFilename, std::ifstream::binary);
    bin_file.seekg(0, bin_file.end);
    unsigned nb = bin_file.tellg();
    bin_file.seekg(0, bin_file.beg);
    char* buf = new char[nb];
    bin_file.read(buf, nb);

    cl::Program::Binaries bins;
    bins.push_back({buf, nb});
    bool valid_device = false;
    for (unsigned int i = 0; i < devices.size(); i++) {
        auto device = devices[i];
        OCL_CHECK(err, context = cl::Context(device, nullptr, nullptr, nullptr, &err));
        OCL_CHECK(err, q = cl::CommandQueue(context, device, CL_QUEUE_PROFILING_ENABLE, &err));
        std::cout << "Trying to program device[" << i << "]: " << device.getInfo<CL_DEVICE_NAME>() << std::endl;
        cl::Program program(context, {device}, bins, nullptr, &err);
        if (err != CL_SUCCESS) {
            std::cout << "Failed to program device[" << i << "] with xclbin file!\n";
        } else {
            std::cout << "Device[" << i << "]: program successful!\n";
            OCL_CHECK(err, krnl_vector_add = cl::Kernel(program, "krnl_vadd", &err));
            valid_device = true;
            break;
        }
    }
    if (!valid_device) {
        std::cout << "Failed to program any device found, exit!\n";
        exit(EXIT_FAILURE);
    }

    std::cout << "Creating buffer objects for each variable..." << std::endl;
    OCL_CHECK(err, cl::Buffer buffer_voltageA_wave(context, CL_MEM_WRITE_ONLY, size_in_bytes, NULL, &err));
    OCL_CHECK(err, cl::Buffer buffer_voltageB_wave(context, CL_MEM_WRITE_ONLY, size_in_bytes, NULL, &err));
    OCL_CHECK(err, cl::Buffer buffer_voltageC_wave(context, CL_MEM_WRITE_ONLY, size_in_bytes, NULL, &err));
    OCL_CHECK(err, cl::Buffer buffer_currentA_wave(context, CL_MEM_WRITE_ONLY, size_in_bytes, NULL, &err));
    OCL_CHECK(err, cl::Buffer buffer_currentB_wave(context, CL_MEM_WRITE_ONLY, size_in_bytes, NULL, &err));
    OCL_CHECK(err, cl::Buffer buffer_currentC_wave(context, CL_MEM_WRITE_ONLY, size_in_bytes, NULL, &err));

    std::cout << "Setting kernel arguments..." << std::endl;
    int narg = 0;
    OCL_CHECK(err, err = krnl_vector_add.setArg(narg++,buffer_voltageA_wave));
    OCL_CHECK(err, err = krnl_vector_add.setArg(narg++,buffer_voltageB_wave));
    OCL_CHECK(err, err = krnl_vector_add.setArg(narg++,buffer_voltageC_wave));
    OCL_CHECK(err, err = krnl_vector_add.setArg(narg++,buffer_currentA_wave));
    OCL_CHECK(err, err = krnl_vector_add.setArg(narg++,buffer_currentB_wave));
    OCL_CHECK(err, err = krnl_vector_add.setArg(narg++,buffer_currentC_wave));
    OCL_CHECK(err, err = krnl_vector_add.setArg(narg++, DATA_SIZE));

    std::cout << "Mapping buffers to pointers..." << std::endl;
    int32_t* prt_voltA;
    int32_t* prt_voltB;
    int32_t* prt_voltC;
    int32_t* prt_currA;
    int32_t* prt_currB;
    int32_t* prt_currC;
    OCL_CHECK(err, prt_voltA = (int32_t*)q.enqueueMapBuffer(buffer_voltageA_wave, CL_TRUE, CL_MAP_READ, 0, size_in_bytes, NULL, NULL, &err));
    OCL_CHECK(err, prt_voltB = (int32_t*)q.enqueueMapBuffer(buffer_voltageB_wave, CL_TRUE, CL_MAP_READ, 0, size_in_bytes, NULL, NULL, &err));
    OCL_CHECK(err, prt_voltC = (int32_t*)q.enqueueMapBuffer(buffer_voltageC_wave, CL_TRUE, CL_MAP_READ, 0, size_in_bytes, NULL, NULL, &err));
    OCL_CHECK(err, prt_currA = (int32_t*)q.enqueueMapBuffer(buffer_currentA_wave, CL_TRUE, CL_MAP_READ, 0, size_in_bytes, NULL, NULL, &err));
    OCL_CHECK(err, prt_currB = (int32_t*)q.enqueueMapBuffer(buffer_currentB_wave, CL_TRUE, CL_MAP_READ, 0, size_in_bytes, NULL, NULL, &err));
    OCL_CHECK(err, prt_currC = (int32_t*)q.enqueueMapBuffer(buffer_currentC_wave, CL_TRUE, CL_MAP_READ, 0, size_in_bytes, NULL, NULL, &err));

    std::cout << "Launch the kernel." << std::endl;
    OCL_CHECK(err, err = q.enqueueTask(krnl_vector_add));

    std::cout << "Transfer the data from kernel to source results vector for voltage A." << std::endl;
    OCL_CHECK(err, q.enqueueMigrateMemObjects({buffer_voltageA_wave}, CL_MIGRATE_MEM_OBJECT_HOST));
    std::cout << "Transfer the data from kernel to source results vector for voltage B." << std::endl;
    OCL_CHECK(err, q.enqueueMigrateMemObjects({buffer_voltageB_wave}, CL_MIGRATE_MEM_OBJECT_HOST));
    std::cout << "Transfer the data from kernel to source results vector for voltage C." << std::endl;
    OCL_CHECK(err, q.enqueueMigrateMemObjects({buffer_voltageC_wave}, CL_MIGRATE_MEM_OBJECT_HOST));
    std::cout << "Transfer the data from kernel to source results vector for current A." << std::endl;
    OCL_CHECK(err, q.enqueueMigrateMemObjects({buffer_currentA_wave}, CL_MIGRATE_MEM_OBJECT_HOST));
    std::cout << "Transfer the data from kernel to source results vector for current B." << std::endl;
    OCL_CHECK(err, q.enqueueMigrateMemObjects({buffer_currentB_wave}, CL_MIGRATE_MEM_OBJECT_HOST));
    std::cout << "Transfer the data from kernel to source results vector for current C." << std::endl;
    OCL_CHECK(err, q.enqueueMigrateMemObjects({buffer_currentC_wave}, CL_MIGRATE_MEM_OBJECT_HOST));

    std::cout << "Turn on the motor..." << std::endl;
    std::ofstream fd_export;
    fd_export.open ("/sys/class/gpio/export");
    fd_export << "524";
    fd_export.close(); 

    std::ofstream fd_direction;
    fd_direction.open ("/sys/class/gpio/gpio524/direction");
    fd_direction << "out";
    fd_direction.close();

    std::ofstream fd_set_high;
    fd_set_high.open ("/sys/class/gpio/gpio524/value");
    fd_set_high << "1";
    fd_set_high.close();

    std::cout << "Wait for kernel to finish their operations..." << std::endl;
    OCL_CHECK(err, q.finish());

    std::cout << "Turn off the motor..." << std::endl;
    std::ofstream fd_set_low;
    fd_set_low.open ("/sys/class/gpio/gpio524/value");
    fd_set_low << "0";
    fd_set_low.close();

    std::ofstream fd_unexport;
    fd_unexport.open ("/sys/class/gpio/unexport");
    fd_unexport << "524";
    fd_unexport.close();

    std::cout << "Opening text file to write voltage A output waveform to..." << std::endl;
    FILE *fp_wave_voltageA;
    fp_wave_voltageA=fopen("voltageA_wave_out.txt","w");

    std::cout << "Writing the output waveform from the results buffer to the text file..." << std::endl;
    for (int i = 0; i < DATA_SIZE; i++) {
    	fprintf(fp_wave_voltageA,"%i\n",prt_voltA[i]);
    }

    std::cout << "Closing text file..." << std::endl;
    fclose(fp_wave_voltageA);

    std::cout << "Opening text file to write voltage B output waveform to..." << std::endl;
    FILE *fp_wave_voltageB;
    fp_wave_voltageB=fopen("voltageB_wave_out.txt","w");

    std::cout << "Writing the output waveform from the results buffer to the text file..." << std::endl;
    for (int i = 0; i < DATA_SIZE; i++) {
    	fprintf(fp_wave_voltageB,"%i\n",prt_voltB[i]);
    }

    std::cout << "Closing text file..." << std::endl;
    fclose(fp_wave_voltageB);

    std::cout << "Opening text file to write voltage C output waveform to..." << std::endl;
    FILE *fp_wave_voltageC;
    fp_wave_voltageC=fopen("voltageC_wave_out.txt","w");

    std::cout << "Writing the output waveform from the results buffer to the text file..." << std::endl;
    for (int i = 0; i < DATA_SIZE; i++) {
    	fprintf(fp_wave_voltageC,"%i\n",prt_voltC[i]);
    }

    std::cout << "Closing text file..." << std::endl;
    fclose(fp_wave_voltageC);

    std::cout << "Opening text file to write current A output waveform to..." << std::endl;
    FILE *fp_wave_currentA;
    fp_wave_currentA=fopen("currentA_wave_out.txt","w");

    std::cout << "Writing the output waveform from the results buffer to the text file..." << std::endl;
    for (int i = 0; i < DATA_SIZE; i++) {
    	fprintf(fp_wave_currentA,"%i\n",prt_currA[i]);
    }

    std::cout << "Closing text file..." << std::endl;
    fclose(fp_wave_currentA);

    std::cout << "Opening text file to write current B output waveform to..." << std::endl;
    FILE *fp_wave_currentB;
    fp_wave_currentB=fopen("currentB_wave_out.txt","w");

    std::cout << "Writing the output waveform from the results buffer to the text file..." << std::endl;
    for (int i = 0; i < DATA_SIZE; i++) {
    	fprintf(fp_wave_currentB,"%i\n",prt_currB[i]);
    }

    std::cout << "Closing text file..." << std::endl;
    fclose(fp_wave_currentB);

    std::cout << "Opening text file to write current C output waveform to..." << std::endl;
    FILE *fp_wave_currentC;
    fp_wave_currentC=fopen("currentC_wave_out.txt","w");

    std::cout << "Writing the output waveform from the results buffer to the text file..." << std::endl;
    for (int i = 0; i < DATA_SIZE; i++) {
    	fprintf(fp_wave_currentC,"%i\n",prt_currC[i]);
    }

    std::cout << "Closing text file..." << std::endl;
    fclose(fp_wave_currentC);

    OCL_CHECK(err, err = q.enqueueUnmapMemObject(buffer_voltageA_wave, prt_voltA));
    OCL_CHECK(err, err = q.enqueueUnmapMemObject(buffer_voltageB_wave, prt_voltB));
    OCL_CHECK(err, err = q.enqueueUnmapMemObject(buffer_voltageC_wave, prt_voltC));
    OCL_CHECK(err, err = q.enqueueUnmapMemObject(buffer_currentA_wave, prt_currA));
    OCL_CHECK(err, err = q.enqueueUnmapMemObject(buffer_currentB_wave, prt_currB));
    OCL_CHECK(err, err = q.enqueueUnmapMemObject(buffer_currentC_wave, prt_currC));
    OCL_CHECK(err, err = q.finish());

    return (EXIT_SUCCESS);
}

ad7352_spi.v

Verilog
`timescale 1ns / 1ps

module ad7352_spi(
    input  clk,
    input  rst_n, 
    input  start_cnv,
    output reg ad7352_sclk,
    output reg ad7352_cs,
    input  adcA_data_volt,
    input  adcA_data_curr,
    input  adcB_data_volt,
    input  adcB_data_curr,
    input  adcC_data_volt,
    input  adcC_data_curr,
    output [15:0] m_axis_voltA_tdata,
    output m_axis_voltA_tlast,
    input m_axis_voltA_tready,
    output m_axis_voltA_tvalid,
    output [15:0] m_axis_currA_tdata,
    output m_axis_currA_tlast,
    input m_axis_currA_tready,
    output m_axis_currA_tvalid,
    output [15:0] m_axis_voltB_tdata,
    output m_axis_voltB_tlast,
    input m_axis_voltB_tready,
    output m_axis_voltB_tvalid,
    output [15:0] m_axis_currB_tdata,
    output m_axis_currB_tlast,
    input m_axis_currB_tready,
    output m_axis_currB_tvalid,
    output [15:0] m_axis_voltC_tdata,
    output m_axis_voltC_tlast,
    input m_axis_voltC_tready,
    output m_axis_voltC_tvalid,
    output [15:0] m_axis_currC_tdata,
    output m_axis_currC_tlast,
    input m_axis_currC_tready,
    output m_axis_currC_tvalid 
    );
    
    reg [11:0] phaseA_voltage, phaseA_current;
    reg [11:0] phaseB_voltage, phaseB_current;
    reg [11:0] phaseC_voltage, phaseC_current;
    
    reg [3:0] state_reg;
    parameter init                   = 4'd00;
    parameter WaitForStart           = 4'd01;
    parameter ChipSelectLow          = 4'd02;
    parameter SclkSetup              = 4'd03;
    parameter FirstFallingEdge       = 4'd04;
    parameter SclkHigh               = 4'd05;
    parameter SclkLow                = 4'd06; 
    parameter ChipSelectHigh         = 4'd07;
    parameter WaitOneState           = 4'd08;
    parameter SclkHighDone           = 4'd09;

    reg [1:0] sclk_period_counter;   
    parameter sclk_half_period       = 2'd01; //2 counts = 50MHz SCLK

    reg [3:0] sclk_counter; 
    parameter complete_conversion    = 4'd13;
    
    // sync reg for start_cnv from motor_en
    (* ASYNC_REG = "TRUE" *) reg sync_0, start_cnv_sync;
    always @ (posedge clk) begin
        start_cnv_sync <= sync_0;
        sync_0 <= start_cnv;
    end 

    always @ (posedge clk or negedge rst_n) begin
        if (rst_n == 1'b0) 
            begin
                ad7352_cs <= 1'b1;
                ad7352_sclk <= 1'b1;
                sclk_counter <= complete_conversion;
                sclk_period_counter <= 2'd00;
                phaseA_voltage <= 12'd00;
                phaseA_current <= 12'd00;
                phaseB_voltage <= 12'd00;
                phaseB_current <= 12'd00;
                phaseC_voltage <= 12'd00;
                phaseC_current <= 12'd00;
                state_reg <= init;
            end
        else
            begin
                case(state_reg)
                    init :
                        begin
                            ad7352_cs <= 1'b1;
                            ad7352_sclk <= 1'b1;
                            sclk_counter <= complete_conversion;
                            sclk_period_counter <= 2'd00;
                            phaseA_voltage <= 12'd00;
                            phaseA_current <= 12'd00;
                            phaseB_voltage <= 12'd00;
                            phaseB_current <= 12'd00;
                            phaseC_voltage <= 12'd00;
                            phaseC_current <= 12'd00;
                            state_reg <= WaitForStart;
                        end

                    WaitForStart : 
                        begin
                            ad7352_cs <= 1'b1;

                            if (start_cnv_sync == 1'b1)
                                begin
                                    state_reg <= ChipSelectLow;
                                end
                            else
                                begin
                                    state_reg <= WaitForStart;
                                end
                        end

                    ChipSelectLow : 
                        begin
                            ad7352_cs <= 1'b0;
                            state_reg <= SclkSetup;
                        end

                    SclkSetup : 
                        begin
                            state_reg <= FirstFallingEdge;
                        end

                    FirstFallingEdge : 
                        begin
                            ad7352_sclk <= 1'b0;

                            if (sclk_period_counter == sclk_half_period)
                                begin
                                    sclk_period_counter <= 2'd00;
                                    state_reg <= SclkHigh;
                                end
                            else
                                begin 
                                    sclk_period_counter <= sclk_period_counter + 1;
                                    state_reg <= FirstFallingEdge;
                                end 
                        end

                    SclkHigh :
                        begin
                            ad7352_sclk <= 1'b1;

                            if (sclk_period_counter == sclk_half_period)
                                begin
                                    sclk_period_counter <= 2'd00;
                                    state_reg <= SclkLow;
    
                                    if (sclk_counter < complete_conversion) // account for 2 leading zeros
                                        begin 
                                            phaseA_voltage[sclk_counter] <= adcA_data_volt;
                                            phaseA_current[sclk_counter] <= adcA_data_curr;
                                            phaseB_voltage[sclk_counter] <= adcB_data_volt;
                                            phaseB_current[sclk_counter] <= adcB_data_curr;
                                            phaseC_voltage[sclk_counter] <= adcC_data_volt;
                                            phaseC_current[sclk_counter] <= adcC_data_curr;
                                        end 
                                    else
                                        begin
                                            phaseA_voltage <= phaseA_voltage;
                                            phaseA_current <= phaseA_current;
                                            phaseB_voltage <= phaseB_voltage;
                                            phaseB_current <= phaseB_current;
                                            phaseC_voltage <= phaseC_voltage;
                                            phaseC_current <= phaseC_current;
                                        end 
                                end 
                            else
                                begin 
                                    sclk_period_counter <= sclk_period_counter + 1;
                                    state_reg <= SclkHigh;
                                end 
                        end

                    SclkLow : 
                        begin 
                            ad7352_sclk <= 1'b0;

                            if (sclk_period_counter == sclk_half_period && sclk_counter == 4'd00)
                                begin 
                                    sclk_period_counter <= 2'd00;
                                    sclk_counter <= complete_conversion;
                                    state_reg <= ChipSelectHigh;
                                end 
                            else if (sclk_period_counter == sclk_half_period)
                                begin 
                                    sclk_period_counter <= 2'd00;
                                    sclk_counter <= sclk_counter - 1;
                                    state_reg <= SclkHigh;
                                end 
                            else
                                begin 
                                    sclk_period_counter <= sclk_period_counter + 1;
                                    sclk_counter <= sclk_counter;
                                    state_reg <= SclkLow;
                                end 
                        end 

                    ChipSelectHigh : 
                        begin 
                            ad7352_cs <= 1'b1;
                            state_reg <= WaitOneState;
                        end 

                    WaitOneState : 
                        begin 
                            state_reg <= SclkHighDone;
                        end 

                    SclkHighDone : 
                        begin
                            ad7352_sclk <= 1'b1;
                            state_reg <= WaitForStart;
                        end 
                endcase 
            end 
    end 
    
    m_axis_sm m_axis_voltA(
        .clk(clk),
        .rst_n(rst_n), 
        .tdata_available(start_cnv_sync), //map to start_cnv - which is tied to motor_ena
        .adc_data(phaseA_voltage),
        .m_axis_tdata(m_axis_voltA_tdata),
        .m_axis_tlast(m_axis_voltA_tlast),
        .m_axis_tready(m_axis_voltA_tready),
        .m_axis_tvalid(m_axis_voltA_tvalid)
    );
    
    m_axis_sm m_axis_currA(
        .clk(clk),
        .rst_n(rst_n), 
        .tdata_available(start_cnv_sync), //map to start_cnv - which is tied to motor_ena
        .adc_data(phaseA_current),
        .m_axis_tdata(m_axis_currA_tdata),
        .m_axis_tlast(m_axis_currA_tlast),
        .m_axis_tready(m_axis_currA_tready),
        .m_axis_tvalid(m_axis_currA_tvalid)
    );
    
    m_axis_sm m_axis_voltB(
        .clk(clk),
        .rst_n(rst_n), 
        .tdata_available(start_cnv_sync), //map to start_cnv - which is tied to motor_ena
        .adc_data(phaseB_voltage),
        .m_axis_tdata(m_axis_voltB_tdata),
        .m_axis_tlast(m_axis_voltB_tlast),
        .m_axis_tready(m_axis_voltB_tready),
        .m_axis_tvalid(m_axis_voltB_tvalid)
    );
    
    m_axis_sm m_axis_currB(
        .clk(clk),
        .rst_n(rst_n), 
        .tdata_available(start_cnv_sync), //map to start_cnv - which is tied to motor_ena
        .adc_data(phaseB_current),
        .m_axis_tdata(m_axis_currB_tdata),
        .m_axis_tlast(m_axis_currB_tlast),
        .m_axis_tready(m_axis_currB_tready),
        .m_axis_tvalid(m_axis_currB_tvalid)
    );
    
    m_axis_sm m_axis_voltC(
        .clk(clk),
        .rst_n(rst_n), 
        .tdata_available(start_cnv_sync), //map to start_cnv - which is tied to motor_ena
        .adc_data(phaseC_voltage),
        .m_axis_tdata(m_axis_voltC_tdata),
        .m_axis_tlast(m_axis_voltC_tlast),
        .m_axis_tready(m_axis_voltC_tready),
        .m_axis_tvalid(m_axis_voltC_tvalid)
    );
    
    m_axis_sm m_axis_currC(
        .clk(clk),
        .rst_n(rst_n), 
        .tdata_available(start_cnv_sync), //map to start_cnv - which is tied to motor_ena
        .adc_data(phaseC_current),
        .m_axis_tdata(m_axis_currC_tdata),
        .m_axis_tlast(m_axis_currC_tlast),
        .m_axis_tready(m_axis_currC_tready),
        .m_axis_tvalid(m_axis_currC_tvalid)
    );
    
endmodule

m_axis_sm.v

Verilog
`timescale 1ns / 1ps

module m_axis_sm(
    input clk,
    input rst_n, 
    input tdata_available, //map to start_cnv - which is tied to motor_ena
    input [11:0] adc_data,
    output reg [15:0] m_axis_tdata,
    output reg m_axis_tlast,
    input m_axis_tready,
    output reg m_axis_tvalid
    );
    
    reg [3:0] axis_state_reg; 
    parameter init                   = 4'd00;
    parameter GetADCdata             = 4'd01;
    parameter SetTvalidHigh          = 4'd02;
    parameter CheckTready            = 4'd04;
    parameter WaitState              = 4'd05;   
    parameter SetTlastHigh           = 4'd06;
    parameter SetTlastLow            = 4'd07;
    
    always @ (posedge clk or negedge rst_n) begin
        if (rst_n == 1'b0) 
            begin   
                m_axis_tdata <= 16'd0;
                m_axis_tvalid <= 1'b0;
                axis_state_reg <= init; 
            end 
        else 
            begin 
                case(axis_state_reg)
                    init :
                        begin
                            m_axis_tdata <= 16'd0; 
                            m_axis_tvalid <= 1'b0;
                            axis_state_reg <= GetADCdata; 
                        end 
                        
                    GetADCdata : 
                        begin 
                            if (tdata_available == 1'b1)
                                begin 
                                    m_axis_tdata[15:12] <= 4'd0;
                                    m_axis_tdata[11:0] <= adc_data[11:0]; 
                                    axis_state_reg <= SetTvalidHigh; 
                                end
                            else 
                                begin
                                    m_axis_tvalid <= 1'b0;
                                    axis_state_reg <= GetADCdata;  
                                end
                        end 
                        
                    SetTvalidHigh : 
                        begin 
                            m_axis_tvalid <= 1'b1; 
                            axis_state_reg <= CheckTready; 
                        end 
                        
                    CheckTready :
                        begin 
                            if (m_axis_tready == 1'b1)
                                begin
                                    axis_state_reg <= WaitState;
                                end
                            else    
                                begin
                                    axis_state_reg <= CheckTready;
                                end 
                        end 
                        
                    WaitState :
                        begin 
                            if (tdata_available == 1'b0)
                                begin 
                                    axis_state_reg <= SetTlastHigh; 
                                end
                            else 
                                begin
                                    axis_state_reg <= GetADCdata; 
                                end
                        end 
                           
                    SetTlastHigh :
                        begin 
                            m_axis_tlast <= 1'b1;
                            axis_state_reg <= SetTlastLow; 
                        end
                        
                    SetTlastLow :
                        begin
                            m_axis_tlast <= 1'b0;
                            axis_state_reg <= GetADCdata;  
                        end
                endcase
            end 
    end
    
endmodule

Credits

Whitney Knitter
172 projects • 1799 followers
All thoughts/opinions are my own and do not reflect those of any company/entity I currently/previously associate with.
Contact

Comments

Please log in or sign up to comment.