From 96725d36c8ce0f0eda0258540fdea940567684a2 Mon Sep 17 00:00:00 2001 From: dwf1m12 <d.w.flynn@soton.ac.uk> Date: Wed, 17 Aug 2022 22:09:19 +0100 Subject: [PATCH] add local ip_repo with integration components and update associated tcl build scripts --- .../ip_repo/axi_stream_io_1.0/bd/bd.tcl | 86 + .../ip_repo/axi_stream_io_1.0/component.xml | 1456 +++++++++++++++++ .../axi_stream_io_v1_0/data/axi_stream_io.mdd | 10 + .../axi_stream_io_v1_0/data/axi_stream_io.tcl | 5 + .../drivers/axi_stream_io_v1_0/src/Makefile | 26 + .../axi_stream_io_v1_0/src/axi_stream_io.c | 6 + .../axi_stream_io_v1_0/src/axi_stream_io.h | 79 + .../src/axi_stream_io_selftest.c | 60 + .../soclabs.org_user_axi_stream_io_1.0.zip | Bin 0 -> 15835 bytes .../src/axi_stream_io_v1_0_axi_s.v | 424 +++++ .../xgui/axi_stream_io_v1_0.tcl | 58 + .../ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl | 86 + .../ft1248x1_to_stream8_1.0/component.xml | 489 ++++++ .../ft1248x1_to_stream8_0.xcix | Bin 0 -> 253 bytes .../hdl/ft1248x1_to_stream8_v1_0.v | 75 + .../hdl/ft1248x1_to_stream8_v1_0_RXD8.v | 167 ++ .../hdl/ft1248x1_to_stream8_v1_0_TXD8.v | 228 +++ .../ip_project_archive.zip | Bin 0 -> 19366 bytes ...clabs.org_user_ft1248x1_to_stream8_1.0.zip | Bin 0 -> 22475 bytes .../src/ft1248x1_to_stream8.v | 187 +++ .../ft1248x1_to_stream8_1.0/src/synclib.v | 139 ++ .../xgui/ft1248x1_to_stream8_v1_0.tcl | 10 + .../fpga_imp/scripts/build_mcu_fpga_ip.tcl | 4 +- .../scripts/build_mcu_fpga_pynq_z2.tcl | 13 +- .../scripts/build_mcu_fpga_pynq_zcu104.tcl | 14 +- 25 files changed, 3605 insertions(+), 17 deletions(-) create mode 100755 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/bd/bd.tcl create mode 100755 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/component.xml create mode 100755 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd create mode 100755 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl create mode 100755 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/Makefile create mode 100755 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.c create mode 100755 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.h create mode 100755 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c create mode 100644 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/soclabs.org_user_axi_stream_io_1.0.zip create mode 100755 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/src/axi_stream_io_v1_0_axi_s.v create mode 100755 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/xgui/axi_stream_io_v1_0.tcl create mode 100644 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl create mode 100644 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/component.xml create mode 100644 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ft1248x1_to_stream8_0.xcix create mode 100644 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0.v create mode 100644 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_RXD8.v create mode 100644 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_TXD8.v create mode 100755 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ip_project_archive.zip create mode 100644 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/soclabs.org_user_ft1248x1_to_stream8_1.0.zip create mode 100755 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/ft1248x1_to_stream8.v create mode 100755 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/synclib.v create mode 100644 Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/xgui/ft1248x1_to_stream8_v1_0.tcl diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/bd/bd.tcl b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/bd/bd.tcl new file mode 100755 index 0000000..690e4e1 --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/component.xml b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/component.xml new file mode 100755 index 0000000..afd116f --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/component.xml @@ -0,0 +1,1456 @@ +<?xml version="1.0" encoding="UTF-8"?> +<spirit:component xmlns:xilinx="http://www.xilinx.com" xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <spirit:vendor>soclabs.org</spirit:vendor> + <spirit:library>user</spirit:library> + <spirit:name>axi_stream_io</spirit:name> + <spirit:version>1.0</spirit:version> + <spirit:busInterfaces> + <spirit:busInterface> + <spirit:name>S_AXI</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="aximm" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="aximm_rtl" spirit:version="1.0"/> + <spirit:slave> + <spirit:memoryMapRef spirit:memoryMapRef="S_AXI"/> + </spirit:slave> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>BVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_BVALID</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_RREADY</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>BREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_BREADY</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>AWVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_AWVALID</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>AWREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_AWREADY</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>AWPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_AWPROT</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>WDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_WDATA</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_RRESP</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>ARPROT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_ARPROT</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_RVALID</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>ARADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_ARADDR</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>AWADDR</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_AWADDR</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>ARREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_ARREADY</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>WVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_WVALID</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>WREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_WREADY</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>ARVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_ARVALID</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>WSTRB</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_WSTRB</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>BRESP</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_BRESP</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_RDATA</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + <spirit:parameters> + <spirit:parameter> + <spirit:name>WIZ_DATA_WIDTH</spirit:name> + <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.S_AXI.WIZ_DATA_WIDTH" spirit:choiceRef="choice_list_6fc15197">32</spirit:value> + </spirit:parameter> + <spirit:parameter> + <spirit:name>WIZ_NUM_REG</spirit:name> + <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.S_AXI.WIZ_NUM_REG" spirit:minimum="4" spirit:maximum="512" spirit:rangeType="long">4</spirit:value> + </spirit:parameter> + <spirit:parameter> + <spirit:name>SUPPORTS_NARROW_BURST</spirit:name> + <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.S_AXI.SUPPORTS_NARROW_BURST" spirit:choiceRef="choice_pairs_ce1226b1">0</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:busInterface> + <spirit:busInterface> + <spirit:name>rx</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis_rtl" spirit:version="1.0"/> + <spirit:slave/> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>rx_tdata</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>rx_tvalid</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>rx_tready</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + <spirit:parameters> + <spirit:parameter> + <spirit:name>WIZ_DATA_WIDTH</spirit:name> + <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.RX.WIZ_DATA_WIDTH" spirit:choiceRef="choice_list_6fc15197">32</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:busInterface> + <spirit:busInterface> + <spirit:name>tx</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis_rtl" spirit:version="1.0"/> + <spirit:master/> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>tx_tvalid</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>tx_tdata</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>tx_tready</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + <spirit:parameters> + <spirit:parameter> + <spirit:name>WIZ_DATA_WIDTH</spirit:name> + <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.TX.WIZ_DATA_WIDTH" spirit:choiceRef="choice_list_6fc15197">32</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:busInterface> + <spirit:busInterface> + <spirit:name>interrupt</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="interrupt" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="interrupt_rtl" spirit:version="1.0"/> + <spirit:master/> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>INTERRUPT</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>interrupt</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + <spirit:parameters> + <spirit:parameter> + <spirit:name>SENSITIVITY</spirit:name> + <spirit:value spirit:id="BUSIFPARAM_VALUE.INTERRUPT.SENSITIVITY" spirit:choiceRef="choice_list_99a1d2b9">LEVEL_HIGH</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:busInterface> + <spirit:busInterface> + <spirit:name>S_AXI_ACLK</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="clock" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="clock_rtl" spirit:version="1.0"/> + <spirit:slave/> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>CLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_ACLK</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + <spirit:parameters> + <spirit:parameter> + <spirit:name>ASSOCIATED_RESET</spirit:name> + <spirit:value spirit:id="BUSIFPARAM_VALUE.S_AXI_ACLK.ASSOCIATED_RESET">S_AXI_ARESETN</spirit:value> + </spirit:parameter> + <spirit:parameter> + <spirit:name>ASSOCIATED_BUSIF</spirit:name> + <spirit:value spirit:id="BUSIFPARAM_VALUE.S_AXI_ACLK.ASSOCIATED_BUSIF">rx:tx:S_AXI</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:busInterface> + <spirit:busInterface> + <spirit:name>S_AXI_ARESETN</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="reset" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="reset_rtl" spirit:version="1.0"/> + <spirit:slave/> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>S_AXI_ARESETN</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + <spirit:parameters> + <spirit:parameter> + <spirit:name>POLARITY</spirit:name> + <spirit:value spirit:id="BUSIFPARAM_VALUE.S_AXI_ARESETN.POLARITY" spirit:choiceRef="choice_list_9d8b0d81">ACTIVE_LOW</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:busInterface> + </spirit:busInterfaces> + <spirit:memoryMaps> + <spirit:memoryMap> + <spirit:name>S_AXI</spirit:name> + <spirit:addressBlock> + <spirit:name>Reg</spirit:name> + <spirit:baseAddress spirit:format="long">0</spirit:baseAddress> + <spirit:range spirit:format="long">4096</spirit:range> + <spirit:width spirit:format="long">0</spirit:width> + <spirit:register> + <spirit:name>RX_FIFO</spirit:name> + <spirit:displayName>RX FIFO</spirit:displayName> + <spirit:description>Data RX FIFO</spirit:description> + <spirit:addressOffset>0x00</spirit:addressOffset> + <spirit:size spirit:format="long">1</spirit:size> + </spirit:register> + <spirit:register> + <spirit:name>TX_FIFO</spirit:name> + <spirit:displayName>TX_FIFO</spirit:displayName> + <spirit:description>Data TX FIFO</spirit:description> + <spirit:addressOffset>0x04</spirit:addressOffset> + <spirit:size spirit:format="long">1</spirit:size> + </spirit:register> + <spirit:register> + <spirit:name>STAT_REG</spirit:name> + <spirit:displayName>STAT_REG</spirit:displayName> + <spirit:description>Status register</spirit:description> + <spirit:addressOffset>0x08</spirit:addressOffset> + <spirit:size spirit:format="long">1</spirit:size> + </spirit:register> + <spirit:register> + <spirit:name>CTRL_REG</spirit:name> + <spirit:displayName>CTRL_REG</spirit:displayName> + <spirit:description>Control register</spirit:description> + <spirit:addressOffset>0x0c</spirit:addressOffset> + <spirit:size spirit:format="long">1</spirit:size> + </spirit:register> + </spirit:addressBlock> + </spirit:memoryMap> + </spirit:memoryMaps> + <spirit:model> + <spirit:views> + <spirit:view> + <spirit:name>xilinx_verilogsynthesis</spirit:name> + <spirit:displayName>Verilog Synthesis</spirit:displayName> + <spirit:envIdentifier>verilogSource:vivado.xilinx.com:synthesis</spirit:envIdentifier> + <spirit:language>verilog</spirit:language> + <spirit:modelName>iostream_v1_0_axi</spirit:modelName> + <spirit:fileSetRef> + <spirit:localName>xilinx_verilogsynthesis_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>fc7589fa</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + <spirit:view> + <spirit:name>xilinx_verilogbehavioralsimulation</spirit:name> + <spirit:displayName>Verilog Simulation</spirit:displayName> + <spirit:envIdentifier>verilogSource:vivado.xilinx.com:simulation</spirit:envIdentifier> + <spirit:language>verilog</spirit:language> + <spirit:modelName>iostream_v1_0_axi</spirit:modelName> + <spirit:fileSetRef> + <spirit:localName>xilinx_verilogbehavioralsimulation_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>fc7589fa</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + <spirit:view> + <spirit:name>xilinx_softwaredriver</spirit:name> + <spirit:displayName>Software Driver</spirit:displayName> + <spirit:envIdentifier>:vivado.xilinx.com:sw.driver</spirit:envIdentifier> + <spirit:fileSetRef> + <spirit:localName>xilinx_softwaredriver_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>ec44730d</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + <spirit:view> + <spirit:name>xilinx_xpgui</spirit:name> + <spirit:displayName>UI Layout</spirit:displayName> + <spirit:envIdentifier>:vivado.xilinx.com:xgui.ui</spirit:envIdentifier> + <spirit:fileSetRef> + <spirit:localName>xilinx_xpgui_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>1b3a39eb</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + <spirit:view> + <spirit:name>bd_tcl</spirit:name> + <spirit:displayName>Block Diagram</spirit:displayName> + <spirit:envIdentifier>:vivado.xilinx.com:block.diagram</spirit:envIdentifier> + <spirit:fileSetRef> + <spirit:localName>bd_tcl_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>16328387</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + </spirit:views> + <spirit:ports> + <spirit:port> + <spirit:name>interrupt</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>tx_tvalid</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>tx_tdata</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long">7</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>tx_tready</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>rx_tready</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>rx_tdata</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long">7</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>rx_tvalid</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_ACLK</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_ARESETN</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_AWADDR</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="(spirit:decode(id('MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH')) - 1)">3</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_AWPROT</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long">2</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_AWVALID</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_AWREADY</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_WDATA</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="(spirit:decode(id('MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH')) - 1)">31</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_WSTRB</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="((spirit:decode(id('MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH')) / 8) - 1)">3</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_WVALID</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_WREADY</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_BRESP</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long">1</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_BVALID</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_BREADY</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_ARADDR</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="(spirit:decode(id('MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH')) - 1)">3</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_ARPROT</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long">2</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_ARVALID</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_ARREADY</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_RDATA</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="(spirit:decode(id('MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH')) - 1)">31</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_RRESP</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long">1</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_RVALID</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>S_AXI_RREADY</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + </spirit:ports> + <spirit:modelParameters> + <spirit:modelParameter xsi:type="spirit:nameValueTypeType" spirit:dataType="integer"> + <spirit:name>C_S_AXI_DATA_WIDTH</spirit:name> + <spirit:displayName>C S Axi Data Width</spirit:displayName> + <spirit:value spirit:format="long" spirit:resolve="generated" spirit:id="MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH">32</spirit:value> + </spirit:modelParameter> + <spirit:modelParameter spirit:dataType="integer"> + <spirit:name>C_S_AXI_ADDR_WIDTH</spirit:name> + <spirit:displayName>C S Axi Addr Width</spirit:displayName> + <spirit:value spirit:format="long" spirit:resolve="generated" spirit:id="MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH">4</spirit:value> + </spirit:modelParameter> + </spirit:modelParameters> + </spirit:model> + <spirit:choices> + <spirit:choice> + <spirit:name>choice_list_6fc15197</spirit:name> + <spirit:enumeration>32</spirit:enumeration> + </spirit:choice> + <spirit:choice> + <spirit:name>choice_list_99a1d2b9</spirit:name> + <spirit:enumeration>LEVEL_HIGH</spirit:enumeration> + <spirit:enumeration>LEVEL_LOW</spirit:enumeration> + <spirit:enumeration>EDGE_RISING</spirit:enumeration> + <spirit:enumeration>EDGE_FALLING</spirit:enumeration> + </spirit:choice> + <spirit:choice> + <spirit:name>choice_list_9d8b0d81</spirit:name> + <spirit:enumeration>ACTIVE_HIGH</spirit:enumeration> + <spirit:enumeration>ACTIVE_LOW</spirit:enumeration> + </spirit:choice> + <spirit:choice> + <spirit:name>choice_pairs_ce1226b1</spirit:name> + <spirit:enumeration spirit:text="true">1</spirit:enumeration> + <spirit:enumeration spirit:text="false">0</spirit:enumeration> + </spirit:choice> + </spirit:choices> + <spirit:fileSets> + <spirit:fileSet> + <spirit:name>xilinx_verilogsynthesis_view_fileset</spirit:name> + <spirit:file> + <spirit:name>src/axi_stream_io_v1_0_axi_s.v</spirit:name> + <spirit:fileType>verilogSource</spirit:fileType> + <spirit:userFileType>CHECKSUM_fc7589fa</spirit:userFileType> + </spirit:file> + </spirit:fileSet> + <spirit:fileSet> + <spirit:name>xilinx_verilogbehavioralsimulation_view_fileset</spirit:name> + <spirit:file> + <spirit:name>src/axi_stream_io_v1_0_axi_s.v</spirit:name> + <spirit:fileType>verilogSource</spirit:fileType> + </spirit:file> + </spirit:fileSet> + <spirit:fileSet> + <spirit:name>xilinx_softwaredriver_view_fileset</spirit:name> + <spirit:file> + <spirit:name>drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd</spirit:name> + <spirit:userFileType>mdd</spirit:userFileType> + <spirit:userFileType>driver_mdd</spirit:userFileType> + </spirit:file> + <spirit:file> + <spirit:name>drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl</spirit:name> + <spirit:fileType>tclSource</spirit:fileType> + <spirit:userFileType>driver_tcl</spirit:userFileType> + </spirit:file> + <spirit:file> + <spirit:name>drivers/axi_stream_io_v1_0/src/Makefile</spirit:name> + <spirit:userFileType>driver_src</spirit:userFileType> + </spirit:file> + <spirit:file> + <spirit:name>drivers/axi_stream_io_v1_0/src/axi_stream_io.h</spirit:name> + <spirit:fileType>cSource</spirit:fileType> + <spirit:userFileType>driver_src</spirit:userFileType> + <spirit:isIncludeFile>true</spirit:isIncludeFile> + </spirit:file> + <spirit:file> + <spirit:name>drivers/axi_stream_io_v1_0/src/axi_stream_io.c</spirit:name> + <spirit:fileType>cSource</spirit:fileType> + <spirit:userFileType>driver_src</spirit:userFileType> + <spirit:isIncludeFile>true</spirit:isIncludeFile> + </spirit:file> + <spirit:file> + <spirit:name>drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c</spirit:name> + <spirit:fileType>cSource</spirit:fileType> + <spirit:userFileType>driver_src</spirit:userFileType> + <spirit:isIncludeFile>true</spirit:isIncludeFile> + </spirit:file> + </spirit:fileSet> + <spirit:fileSet> + <spirit:name>xilinx_xpgui_view_fileset</spirit:name> + <spirit:file> + <spirit:name>xgui/axi_stream_io_v1_0.tcl</spirit:name> + <spirit:fileType>tclSource</spirit:fileType> + <spirit:userFileType>CHECKSUM_1b3a39eb</spirit:userFileType> + <spirit:userFileType>XGUI_VERSION_2</spirit:userFileType> + </spirit:file> + </spirit:fileSet> + <spirit:fileSet> + <spirit:name>bd_tcl_view_fileset</spirit:name> + <spirit:file> + <spirit:name>bd/bd.tcl</spirit:name> + <spirit:fileType>tclSource</spirit:fileType> + </spirit:file> + </spirit:fileSet> + </spirit:fileSets> + <spirit:description>AXI mapped TX and RX byte stream interface</spirit:description> + <spirit:parameters> + <spirit:parameter> + <spirit:name>C_axi_s_BASEADDR</spirit:name> + <spirit:displayName>C axi s BASEADDR</spirit:displayName> + <spirit:value spirit:format="bitString" spirit:resolve="user" spirit:id="PARAM_VALUE.C_axi_s_BASEADDR" spirit:order="5" spirit:bitStringLength="32">0xFFFFFFFF</spirit:value> + <spirit:vendorExtensions> + <xilinx:parameterInfo> + <xilinx:enablement> + <xilinx:isEnabled xilinx:id="PARAM_ENABLEMENT.C_axi_s_BASEADDR">false</xilinx:isEnabled> + </xilinx:enablement> + </xilinx:parameterInfo> + </spirit:vendorExtensions> + </spirit:parameter> + <spirit:parameter> + <spirit:name>C_axi_s_HIGHADDR</spirit:name> + <spirit:displayName>C axi s HIGHADDR</spirit:displayName> + <spirit:value spirit:format="bitString" spirit:resolve="user" spirit:id="PARAM_VALUE.C_axi_s_HIGHADDR" spirit:order="6" spirit:bitStringLength="32">0x00000000</spirit:value> + <spirit:vendorExtensions> + <xilinx:parameterInfo> + <xilinx:enablement> + <xilinx:isEnabled xilinx:id="PARAM_ENABLEMENT.C_axi_s_HIGHADDR">false</xilinx:isEnabled> + </xilinx:enablement> + </xilinx:parameterInfo> + </spirit:vendorExtensions> + </spirit:parameter> + <spirit:parameter> + <spirit:name>Component_Name</spirit:name> + <spirit:value spirit:resolve="user" spirit:id="PARAM_VALUE.Component_Name" spirit:order="1">axi_stream_io_v1_0</spirit:value> + </spirit:parameter> + <spirit:parameter> + <spirit:name>C_S_AXI_DATA_WIDTH</spirit:name> + <spirit:displayName>C S Axi Data Width</spirit:displayName> + <spirit:value spirit:format="long" spirit:resolve="user" spirit:id="PARAM_VALUE.C_S_AXI_DATA_WIDTH">32</spirit:value> + </spirit:parameter> + <spirit:parameter> + <spirit:name>C_S_AXI_ADDR_WIDTH</spirit:name> + <spirit:displayName>C S Axi Addr Width</spirit:displayName> + <spirit:value spirit:format="long" spirit:resolve="user" spirit:id="PARAM_VALUE.C_S_AXI_ADDR_WIDTH">4</spirit:value> + </spirit:parameter> + </spirit:parameters> + <spirit:vendorExtensions> + <xilinx:coreExtensions> + <xilinx:supportedFamilies> + <xilinx:family xilinx:lifeCycle="Pre-Production">zynquplus</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">zynq</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">artix7</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">artix7l</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">kintex7</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">kintex7l</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">kintexu</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">kintexuplus</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">spartan7</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">virtexuplus</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">virtexuplusHBM</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">aartix7</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">aspartan7</xilinx:family> + <xilinx:family xilinx:lifeCycle="Pre-Production">azynq</xilinx:family> + </xilinx:supportedFamilies> + <xilinx:taxonomies> + <xilinx:taxonomy>AXI_Peripheral</xilinx:taxonomy> + </xilinx:taxonomies> + <xilinx:displayName>axi_stream_io_v1.0</xilinx:displayName> + <xilinx:vendorDisplayName>SoC Labs</xilinx:vendorDisplayName> + <xilinx:vendorURL>http://www.soclabs.org</xilinx:vendorURL> + <xilinx:coreRevision>16</xilinx:coreRevision> + <xilinx:upgrades> + <xilinx:canUpgradeFrom>xilinx.com:user:axi_stream_io:1.0</xilinx:canUpgradeFrom> + </xilinx:upgrades> + <xilinx:coreCreationDateTime>2021-12-12T20:49:24Z</xilinx:coreCreationDateTime> + <xilinx:tags> + <xilinx:tag xilinx:name="ui.data.coregen.dd@16fed581_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2ec9608d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@793f5b3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7322b269_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6e248e43_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@b4e9ef3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@426bcb85_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2e53d487_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@61dade0b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4eafa00f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@53e3a875_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@162982df_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@75f72ee4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@18aeac53_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@606d36b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@38c0eb40_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@57696f2a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@510901ec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@60d2f4d6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3a2da1b3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@cd54b6e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@693cb83d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@ef28d1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5a59314d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@29767284_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@29f27e63_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@13dc2895_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5e36f1df_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@709fc708_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@8bba7d9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@21d8e4a5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@37415f14_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@66dc3d40_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4fba07d0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@eb3af51_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4c66ef79_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@45185362_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@53225cb8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1cf08902_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4b15fae5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@17a6be36_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3301516d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3be10ef6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6a177ab9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@20e4e579_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@f741122_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@df275a0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4ac8a5fd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5ae71cdc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2c59353f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2325ca04_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@498ea243_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4b8c707a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@52cdfb1d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2a0d6185_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4bac3167_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@19a83bf5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@562798bd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@123cc7f3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7062c158_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@778708cf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3a452e27_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@ece9f0f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4b895821_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3dc1927b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3e4d1f1c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@22bc955c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4c436144_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@23f15bc2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2414d94e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@63ae6b17_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1f88dbb1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7517e1ec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@668022b8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3177ce96_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@71f152fd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@30ad2c46_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5aae29a7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@292165c8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@334d7f4a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3479b8c2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@13d09377_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@315680f2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5ba41a48_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@d66c81a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2a99c6a5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4530b54d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@699d5142_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@17559350_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@18f15cc5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@482d154b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@9b0867a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2835d2db_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3070b16_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7616d28e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6f3420ae_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@59ca939e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3c36ad44_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1e50ae02_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@22ebfa5c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@465f09ec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1bdbdf15_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@9060620_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@65357e50_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4e4f99_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7b82dd23_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7a9b0492_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4851d668_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6ee66680_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@18058a64_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@cfe93ee_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@53c2b650_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@11a6efc0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@18afa642_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@12652ecf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@e72e52b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2861fd1c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@24001396_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4454325e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3d14ded5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6a45a760_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@75c51952_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1d040cfa_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@c27bbbf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7158e610_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@499392b5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@e8df7e6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@11aa003e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4273f844_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5fadd8f7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6c93a7db_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@27ee561_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4a52c607_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@11760a9c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4115d1f1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7d41ca58_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4899dc31_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@13b9216c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2e05852a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@384bceec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4ed8c48f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@200621c6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6ac073d7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@18632943_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1c0d8bb2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@50809788_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7fdbc98a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3142de19_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2b3fb5f1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4faf4338_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@eb7476f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1d508d99_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@53d85a46_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@30a744ac_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@238f4e8e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2081d690_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7eee799d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2c95d02_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4e1ddea2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@21e860f8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3660b171_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3ef639f7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@16ba015e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3642a664_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@159c8828_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@14e878fa_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7f0733b2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@10cb371d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3553a1c7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3fc60b7d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@551cc009_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@752a2e44_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@63f8237c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3ca7d308_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@556a2759_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5f380808_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@651a74cf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1ecd1477_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@9b65a49_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@35b2d11e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3536a2cc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1cd68297_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1692283f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@ecc2ee6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@747cc728_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3ec1998a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6fb41197_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2c33db6f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@42060eaa_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@62342897_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@36eef4b6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@19ecf3b7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5d580cef_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4f729cff_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@23321c1e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@539a0d0d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@9a208b1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@38bee981_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@13576b9a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6455b470_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@23aa217a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@25e0ca99_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5787a96e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@43773246_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4d61f0c5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@123ec803_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@441ed6b1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@40743552_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@575fe9d1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@760563e4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@d20fcca_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4486a217_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@61023d9d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7ba954b1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@35c3b2bc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@42fe08ca_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2c2cdfab_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@14ff32f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7ec2d566_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1f0c382e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@10ce9ce2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1d3487ea_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@69af9ff5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@a3f99a9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5d79a274_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2940bbec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3c331f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@346dc4a8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6ee2a2b9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@76248ced_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5a67ad90_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3f211e20_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@31809d90_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@585e4f98_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@42ec0b0a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@85dcc7d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@782407fa_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4693fec4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@206ba19e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@65d9e06_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4115aaf6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7a3e8df0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5a0dab9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@16462cdd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@25040671_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3cc02f38_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6b7d8e4b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1450c3b3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@112dcc8a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@570107d2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2a4c82ba_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@59d6fbcc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1b1ef5d9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7bd35be_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4a26fb6f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7742ea34_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@100b085b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@66ebb4d6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@78ccb7c6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@59569c0f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@16028751_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4b46cdee_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3638e993_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5fc9a2e7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7cd279dc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2476846e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@789eb25_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7ebb6bc1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5b807ab4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@58bb111d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4dd4eede_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2030ea86_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@262d6dbc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@9879ce_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@544f9318_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@783ccf68_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@74b5dbd6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7b1a5399_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4e59d89b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1ebfb7d3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@28806a0b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4f1fac1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@193f5497_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@98f5ccf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5ea19ca3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5c57bfe8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@474ef512_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1c3d233f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@561f98f3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4156e62d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7fcfc34d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4275157_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2004e159_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@f268144_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@c10c0e6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7557e11f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@b8141f0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@63cfb8ab_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3d394ce0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@50390780_ARCHIVE_LOCATION">C:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3dbeacb1_ARCHIVE_LOCATION">C:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4f3f661b_ARCHIVE_LOCATION">C:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@716ccc45_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3278c6a2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@398d4fdc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@384c540d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@145b9325_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5e420b14_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@720a061a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7019edbc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@32cec7a3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5b9ea533_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4ba41145_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7a1c3bc8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3f98c05d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@85ece3f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@64329cf3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6098b91e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@658c8c87_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5e029802_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@46a555e4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@66159ec1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@78addf86_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3d48e636_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@45209cb7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3841593c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7fecffde_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@33c9e638_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@538ac29d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6c1cb496_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6e783269_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@703c8061_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1a7552e4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@71a8b655_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@393dae6f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@26792732_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@56b72513_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@50b98a45_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@75004655_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@27616936_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3a54ec8f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@23e0933_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@21d6563f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7e96eb79_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@fbb747e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5a959611_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3d67b840_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1ececc3c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2c3729d0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@753686b7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4bc158bd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7553bd98_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@686c9917_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@15e3e3fc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@17c20476_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2890ad0d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2502d801_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@615193fc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@10d0b0e1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@1c009a65_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@77fd9a52_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@423f07dc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@589a99d0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@b813605_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@a38b321_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@355431d9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@d146dd7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@3bf71b0b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@27b3813d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5ef70193_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@24d7fb4d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@11d6e696_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@43384aaf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5dcbf251_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@33084c7e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@4c5a8f4b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@38125fe9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@14f39b23_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@71113478_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@36296867_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@511868d0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6f3ba609_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@78a4bc24_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@32825895_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6ea7679a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@600011e1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@766beed_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@5f381aa9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@300820b4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7058d4f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@6ec12ea5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@2b23043_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@51253581_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.dd@7aa26a8e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@b23f618_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@77b30d22_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@4cde9694_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@120ff5dc_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@24113226_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@44aea720_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@2ee819b6_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@4818d5b2_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@38e9bfee_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@1c951027_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@348407d1_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@111f073e_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@16159ba0_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@21bb058_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@28bf5ef8_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@a1c64f7_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@74feff94_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@4f3615f1_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag> + </xilinx:tags> + </xilinx:coreExtensions> + <xilinx:packagingInfo> + <xilinx:xilinxVersion>2021.1</xilinx:xilinxVersion> + <xilinx:checksum xilinx:scope="busInterfaces" xilinx:value="5562313f"/> + <xilinx:checksum xilinx:scope="memoryMaps" xilinx:value="d6592117"/> + <xilinx:checksum xilinx:scope="fileGroups" xilinx:value="323cdeea"/> + <xilinx:checksum xilinx:scope="ports" xilinx:value="7c2aad6e"/> + <xilinx:checksum xilinx:scope="hdlParameters" xilinx:value="cd9ec9b5"/> + <xilinx:checksum xilinx:scope="parameters" xilinx:value="6cced3b9"/> + </xilinx:packagingInfo> + </spirit:vendorExtensions> +</spirit:component> diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd new file mode 100755 index 0000000..d7af75e --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd @@ -0,0 +1,10 @@ + + +OPTION psf_version = 2.1; + +BEGIN DRIVER axi_stream_io + OPTION supported_peripherals = (axi_stream_io); + OPTION copyfiles = all; + OPTION VERSION = 1.0; + OPTION NAME = axi_stream_io; +END DRIVER diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl new file mode 100755 index 0000000..c3a9cd0 --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl @@ -0,0 +1,5 @@ + + +proc generate {drv_handle} { + xdefine_include_file $drv_handle "xparameters.h" "axi_stream_io" "NUM_INSTANCES" "DEVICE_ID" "C_axi_s_BASEADDR" "C_axi_s_HIGHADDR" +} diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/Makefile b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/Makefile new file mode 100755 index 0000000..21453f4 --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/Makefile @@ -0,0 +1,26 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +INCLUDEFILES=*.h +LIBSOURCES=*.c +OUTS = *.o + +libs: + echo "Compiling axi_stream_io..." + $(COMPILER) $(COMPILER_FLAGS) $(EXTRA_COMPILER_FLAGS) $(INCLUDES) $(LIBSOURCES) + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OUTS} + make clean + +include: + ${CP} $(INCLUDEFILES) $(INCLUDEDIR) + +clean: + rm -rf ${OUTS} diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.c b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.c new file mode 100755 index 0000000..c552cbf --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.c @@ -0,0 +1,6 @@ + + +/***************************** Include Files *******************************/ +#include "axi_stream_io.h" + +/************************** Function Definitions ***************************/ diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.h b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.h new file mode 100755 index 0000000..294e851 --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.h @@ -0,0 +1,79 @@ + +#ifndef AXI_STREAM_IO_H +#define AXI_STREAM_IO_H + + +/****************** Include Files ********************/ +#include "xil_types.h" +#include "xstatus.h" + +#define AXI_STREAM_IO_axi_s_SLV_REG0_OFFSET 0 +#define AXI_STREAM_IO_axi_s_SLV_REG1_OFFSET 4 +#define AXI_STREAM_IO_axi_s_SLV_REG2_OFFSET 8 +#define AXI_STREAM_IO_axi_s_SLV_REG3_OFFSET 12 + + +/**************************** Type Definitions *****************************/ +/** + * + * Write a value to a AXI_STREAM_IO register. A 32 bit write is performed. + * If the component is implemented in a smaller width, only the least + * significant data is written. + * + * @param BaseAddress is the base address of the AXI_STREAM_IOdevice. + * @param RegOffset is the register offset from the base to write to. + * @param Data is the data written to the register. + * + * @return None. + * + * @note + * C-style signature: + * void AXI_STREAM_IO_mWriteReg(u32 BaseAddress, unsigned RegOffset, u32 Data) + * + */ +#define AXI_STREAM_IO_mWriteReg(BaseAddress, RegOffset, Data) \ + Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data)) + +/** + * + * Read a value from a AXI_STREAM_IO register. A 32 bit read is performed. + * If the component is implemented in a smaller width, only the least + * significant data is read from the register. The most significant data + * will be read as 0. + * + * @param BaseAddress is the base address of the AXI_STREAM_IO device. + * @param RegOffset is the register offset from the base to write to. + * + * @return Data is the data from the register. + * + * @note + * C-style signature: + * u32 AXI_STREAM_IO_mReadReg(u32 BaseAddress, unsigned RegOffset) + * + */ +#define AXI_STREAM_IO_mReadReg(BaseAddress, RegOffset) \ + Xil_In32((BaseAddress) + (RegOffset)) + +/************************** Function Prototypes ****************************/ +/** + * + * Run a self-test on the driver/device. Note this may be a destructive test if + * resets of the device are performed. + * + * If the hardware system is not built correctly, this function may never + * return to the caller. + * + * @param baseaddr_p is the base address of the AXI_STREAM_IO instance to be worked on. + * + * @return + * + * - XST_SUCCESS if all self-test code passed + * - XST_FAILURE if any self-test code failed + * + * @note Caching must be turned off for this function to work. + * @note Self test may fail if data memory and device are not on the same bus. + * + */ +XStatus AXI_STREAM_IO_Reg_SelfTest(void * baseaddr_p); + +#endif // AXI_STREAM_IO_H diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c new file mode 100755 index 0000000..26bea4d --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c @@ -0,0 +1,60 @@ + +/***************************** Include Files *******************************/ +#include "axi_stream_io.h" +#include "xparameters.h" +#include "stdio.h" +#include "xil_io.h" + +/************************** Constant Definitions ***************************/ +#define READ_WRITE_MUL_FACTOR 0x10 + +/************************** Function Definitions ***************************/ +/** + * + * Run a self-test on the driver/device. Note this may be a destructive test if + * resets of the device are performed. + * + * If the hardware system is not built correctly, this function may never + * return to the caller. + * + * @param baseaddr_p is the base address of the AXI_STREAM_IOinstance to be worked on. + * + * @return + * + * - XST_SUCCESS if all self-test code passed + * - XST_FAILURE if any self-test code failed + * + * @note Caching must be turned off for this function to work. + * @note Self test may fail if data memory and device are not on the same bus. + * + */ +XStatus AXI_STREAM_IO_Reg_SelfTest(void * baseaddr_p) +{ + u32 baseaddr; + int write_loop_index; + int read_loop_index; + int Index; + + baseaddr = (u32) baseaddr_p; + + xil_printf("******************************\n\r"); + xil_printf("* User Peripheral Self Test\n\r"); + xil_printf("******************************\n\n\r"); + + /* + * Write to user logic slave module register(s) and read back + */ + xil_printf("User logic slave module test...\n\r"); + + for (write_loop_index = 0 ; write_loop_index < 4; write_loop_index++) + AXI_STREAM_IO_mWriteReg (baseaddr, write_loop_index*4, (write_loop_index+1)*READ_WRITE_MUL_FACTOR); + for (read_loop_index = 0 ; read_loop_index < 4; read_loop_index++) + if ( AXI_STREAM_IO_mReadReg (baseaddr, read_loop_index*4) != (read_loop_index+1)*READ_WRITE_MUL_FACTOR){ + xil_printf ("Error reading register value at address %x\n", (int)baseaddr + read_loop_index*4); + return XST_FAILURE; + } + + xil_printf(" - slave register write/read passed\n\n\r"); + + return XST_SUCCESS; +} diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/soclabs.org_user_axi_stream_io_1.0.zip b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/soclabs.org_user_axi_stream_io_1.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..2a22446f1995db34a975c88b9976e397a70995e4 GIT binary patch literal 15835 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 HS%G)}IfW>< literal 0 HcmV?d00001 diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/src/axi_stream_io_v1_0_axi_s.v b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/src/axi_stream_io_v1_0_axi_s.v new file mode 100755 index 0000000..c6560f7 --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/src/axi_stream_io_v1_0_axi_s.v @@ -0,0 +1,424 @@ + +`timescale 1 ns / 1 ps + + module iostream_v1_0_axi # + ( + // Users to add parameters here + + // User parameters ends + // Do not modify the parameters beyond this line + + // Width of S_AXI data bus + parameter integer C_S_AXI_DATA_WIDTH = 32, + // Width of S_AXI address bus + parameter integer C_S_AXI_ADDR_WIDTH = 4 + ) + ( + // Users to add ports here + output wire interrupt, + + // Ports of Axi Master Bus Interface tx +// input wire tx_aclk, +// input wire tx_aresetn, + output wire tx_tvalid, + output wire [7 : 0] tx_tdata, +// output wire [0 : 0] tx_tstrb, +// output wire tx_tlast, + input wire tx_tready, + + // Ports of Axi Slave Bus Interface rx +// input wire rx_aclk, +// input wire rx_aresetn, + output wire rx_tready, + input wire [7 : 0] rx_tdata, +// input wire [0 : 0] rx_tstrb, +// input wire rx_tlast, + input wire rx_tvalid, + + // User ports ends + // Do not modify the ports beyond this line + + // Global Clock Signal + input wire S_AXI_ACLK, + // Global Reset Signal. This Signal is Active LOW + input wire S_AXI_ARESETN, + // Write address (issued by master, acceped by Slave) + input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_AWADDR, + // Write channel Protection type. This signal indicates the + // privilege and security level of the transaction, and whether + // the transaction is a data access or an instruction access. + input wire [2 : 0] S_AXI_AWPROT, + // Write address valid. This signal indicates that the master signaling + // valid write address and control information. + input wire S_AXI_AWVALID, + // Write address ready. This signal indicates that the slave is ready + // to accept an address and associated control signals. + output wire S_AXI_AWREADY, + // Write data (issued by master, acceped by Slave) + input wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_WDATA, + // Write strobes. This signal indicates which byte lanes hold + // valid data. There is one write strobe bit for each eight + // bits of the write data bus. + input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB, + // Write valid. This signal indicates that valid write + // data and strobes are available. + input wire S_AXI_WVALID, + // Write ready. This signal indicates that the slave + // can accept the write data. + output wire S_AXI_WREADY, + // Write response. This signal indicates the status + // of the write transaction. + output wire [1 : 0] S_AXI_BRESP, + // Write response valid. This signal indicates that the channel + // is signaling a valid write response. + output wire S_AXI_BVALID, + // Response ready. This signal indicates that the master + // can accept a write response. + input wire S_AXI_BREADY, + // Read address (issued by master, acceped by Slave) + input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_ARADDR, + // Protection type. This signal indicates the privilege + // and security level of the transaction, and whether the + // transaction is a data access or an instruction access. + input wire [2 : 0] S_AXI_ARPROT, + // Read address valid. This signal indicates that the channel + // is signaling valid read address and control information. + input wire S_AXI_ARVALID, + // Read address ready. This signal indicates that the slave is + // ready to accept an address and associated control signals. + output wire S_AXI_ARREADY, + // Read data (issued by slave) + output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA, + // Read response. This signal indicates the status of the + // read transfer. + output wire [1 : 0] S_AXI_RRESP, + // Read valid. This signal indicates that the channel is + // signaling the required read data. + output wire S_AXI_RVALID, + // Read ready. This signal indicates that the master can + // accept the read data and response information. + input wire S_AXI_RREADY + ); + + // AXI4LITE signals + reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_awaddr; + reg axi_awready; + reg axi_wready; + reg [1 : 0] axi_bresp; + reg axi_bvalid; + reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_araddr; + reg axi_arready; + reg [C_S_AXI_DATA_WIDTH-1 : 0] axi_rdata; + reg [1 : 0] axi_rresp; + reg axi_rvalid; + + // Example-specific design signals + // local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH + // ADDR_LSB is used for addressing 32/64 bit registers/memories + // ADDR_LSB = 2 for 32 bits (n downto 2) + // ADDR_LSB = 3 for 64 bits (n downto 3) + localparam integer ADDR_LSB = (C_S_AXI_DATA_WIDTH/32) + 1; + localparam integer OPT_MEM_ADDR_BITS = 1; + + //---------------------------------------------- + //-- Signals for user logic register space example + //------------------------------------------------ + //-- Number of Slave Registers 4 + reg [8:0] tx_reg; // TX data + reg [8:0] rx_reg; // RX data + reg [7:0] ctrl_reg; // ctrl + wire slv_reg_rden; + wire slv_reg_wren; + reg [7:0] reg_data_out; + integer byte_index; + reg aw_en; + + wire tx_req = tx_reg[8]; // request to transmit + wire tx_ack = tx_tready; // acknowledge when stream ready + + wire rx_req = rx_tvalid; // request to receive + wire rx_ack = !rx_reg[8]; + wire rx_val = rx_reg[8]; + + //assign rx_reg[7:0] <= rx_tdata; + + // I/O Connections assignments + + assign interrupt = ctrl_reg[4] & (!tx_req | rx_req); + + // TX stream interface + assign tx_tdata = tx_reg[7:0]; + assign tx_tvalid = tx_req; + + // RX stream interface + assign rx_tready = rx_ack; + + //AXI Slave + assign S_AXI_AWREADY = axi_awready; + assign S_AXI_WREADY = axi_wready; + assign S_AXI_BRESP = axi_bresp; + assign S_AXI_BVALID = axi_bvalid; + assign S_AXI_ARREADY = axi_arready; + assign S_AXI_RDATA = axi_rdata; + assign S_AXI_RRESP = axi_rresp; + assign S_AXI_RVALID = axi_rvalid; + // Implement axi_awready generation + // axi_awready is asserted for one S_AXI_ACLK clock cycle when both + // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is + // de-asserted when reset is low. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_awready <= 1'b0; + aw_en <= 1'b1; + end + else + begin + if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en) + begin + // slave is ready to accept write address when + // there is a valid write address and write data + // on the write address and data bus. This design + // expects no outstanding transactions. + axi_awready <= 1'b1; + aw_en <= 1'b0; + end + else if (S_AXI_BREADY && axi_bvalid) + begin + aw_en <= 1'b1; + axi_awready <= 1'b0; + end + else + begin + axi_awready <= 1'b0; + end + end + end + + // Implement axi_awaddr latching + // This process is used to latch the address when both + // S_AXI_AWVALID and S_AXI_WVALID are valid. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_awaddr <= 0; + end + else + begin + if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en) + begin + // Write Address latching + axi_awaddr <= S_AXI_AWADDR; + end + end + end + + // Implement axi_wready generation + // axi_wready is asserted for one S_AXI_ACLK clock cycle when both + // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is + // de-asserted when reset is low. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_wready <= 1'b0; + end + else + begin + if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID && aw_en ) + begin + // slave is ready to accept write data when + // there is a valid write address and write data + // on the write address and data bus. This design + // expects no outstanding transactions. + axi_wready <= 1'b1; + end + else + begin + axi_wready <= 1'b0; + end + end + end + + // Implement memory mapped register select and write logic generation + // The write data is accepted and written to memory mapped registers when + // axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to + // select byte enables of slave registers while writing. + // These registers are cleared when reset (active low) is applied. + // Slave register write enable is asserted when valid address and data are available + // and the slave is ready to accept the write address and write data. + assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID; + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + rx_reg <= 0; + else if ((ctrl_reg[1] == 1'b1)) + rx_reg <= 0; + else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h0)) + rx_reg[8:0] <= {1'b1, S_AXI_WDATA[7:0]}; + else if (slv_reg_rden && (axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h0)) + rx_reg[8] <= 1'b0; + else if (rx_req & rx_ack) // check precedence (rx_req) + rx_reg[8:0] <= {1'b1, rx_tdata[7:0]}; + end + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + tx_reg <= 0; + else if ((ctrl_reg[0] == 1'b1)) + tx_reg <= 0; + else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h1)) + tx_reg[8:0] <= {1'b1, S_AXI_WDATA[7:0]}; + else if (tx_req & tx_ack) + tx_reg[8] <= 1'b0; + end + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + ctrl_reg <= 8'b00000100; + else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h3)) + ctrl_reg[7:0] <= S_AXI_WDATA[7:0]; + end + + // Implement write response logic generation + // The write response and response valid signals are asserted by the slave + // when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. + // This marks the acceptance of address and indicates the status of + // write transaction. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_bvalid <= 0; + axi_bresp <= 2'b0; + end + else + begin + if (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready && S_AXI_WVALID) + begin + // indicates a valid write response is available + axi_bvalid <= 1'b1; + axi_bresp <= 2'b0; // 'OKAY' response + end // work error responses in future + else + begin + if (S_AXI_BREADY && axi_bvalid) + //check if bready is asserted while bvalid is high) + //(there is a possibility that bready is always asserted high) + begin + axi_bvalid <= 1'b0; + end + end + end + end + + // Implement axi_arready generation + // axi_arready is asserted for one S_AXI_ACLK clock cycle when + // S_AXI_ARVALID is asserted. axi_awready is + // de-asserted when reset (active low) is asserted. + // The read address is also latched when S_AXI_ARVALID is + // asserted. axi_araddr is reset to zero on reset assertion. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_arready <= 1'b0; + axi_araddr <= 32'b0; + end + else + begin + if (~axi_arready && S_AXI_ARVALID) + begin + // indicates that the slave has acceped the valid read address + axi_arready <= 1'b1; + // Read address latching + axi_araddr <= S_AXI_ARADDR; + end + else + begin + axi_arready <= 1'b0; + end + end + end + + // Implement axi_arvalid generation + // axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both + // S_AXI_ARVALID and axi_arready are asserted. The slave registers + // data are available on the axi_rdata bus at this instance. The + // assertion of axi_rvalid marks the validity of read data on the + // bus and axi_rresp indicates the status of read transaction.axi_rvalid + // is deasserted on reset (active low). axi_rresp and axi_rdata are + // cleared to zero on reset (active low). + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_rvalid <= 0; + axi_rresp <= 0; + end + else + begin + if (axi_arready && S_AXI_ARVALID && ~axi_rvalid) + begin + // Valid read data is available at the read data bus + axi_rvalid <= 1'b1; + axi_rresp <= 2'b0; // 'OKAY' response + end + else if (axi_rvalid && S_AXI_RREADY) + begin + // Read data is accepted by the master + axi_rvalid <= 1'b0; + end + end + end + + // Implement memory mapped register select and read logic generation + // Slave register read enable is asserted when valid address is available + // and the slave is ready to accept the read address. + assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid; + always @(*) + begin + // Address decoding for reading registers + case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] ) + 2'h0 : reg_data_out <= rx_reg[7:0]; + 2'h1 : reg_data_out <= tx_reg[7:0]; + 2'h2 : reg_data_out <= {3'b000, ctrl_reg[4], tx_req, !tx_req, rx_val, rx_val}; + 2'h3 : reg_data_out <= ctrl_reg; + default : reg_data_out <= 0; + endcase + end + + // Output register or memory read data + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_rdata <= 0; + end + else + begin + // When there is a valid read address (S_AXI_ARVALID) with + // acceptance of read address by the slave (axi_arready), + // output the read dada + if (slv_reg_rden) + begin + axi_rdata <= {24'h000000, reg_data_out}; // register read data + end + end + end + + // Add user logic here + + // User logic ends + + endmodule diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/xgui/axi_stream_io_v1_0.tcl b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/xgui/axi_stream_io_v1_0.tcl new file mode 100755 index 0000000..fcf8a06 --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/axi_stream_io_1.0/xgui/axi_stream_io_v1_0.tcl @@ -0,0 +1,58 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_axi_s_BASEADDR" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_axi_s_HIGHADDR" -parent ${Page_0} + + +} + +proc update_PARAM_VALUE.C_S_AXI_ADDR_WIDTH { PARAM_VALUE.C_S_AXI_ADDR_WIDTH } { + # Procedure called to update C_S_AXI_ADDR_WIDTH when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S_AXI_ADDR_WIDTH { PARAM_VALUE.C_S_AXI_ADDR_WIDTH } { + # Procedure called to validate C_S_AXI_ADDR_WIDTH + return true +} + +proc update_PARAM_VALUE.C_S_AXI_DATA_WIDTH { PARAM_VALUE.C_S_AXI_DATA_WIDTH } { + # Procedure called to update C_S_AXI_DATA_WIDTH when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S_AXI_DATA_WIDTH { PARAM_VALUE.C_S_AXI_DATA_WIDTH } { + # Procedure called to validate C_S_AXI_DATA_WIDTH + return true +} + +proc update_PARAM_VALUE.C_axi_s_BASEADDR { PARAM_VALUE.C_axi_s_BASEADDR } { + # Procedure called to update C_axi_s_BASEADDR when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_axi_s_BASEADDR { PARAM_VALUE.C_axi_s_BASEADDR } { + # Procedure called to validate C_axi_s_BASEADDR + return true +} + +proc update_PARAM_VALUE.C_axi_s_HIGHADDR { PARAM_VALUE.C_axi_s_HIGHADDR } { + # Procedure called to update C_axi_s_HIGHADDR when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_axi_s_HIGHADDR { PARAM_VALUE.C_axi_s_HIGHADDR } { + # Procedure called to validate C_axi_s_HIGHADDR + return true +} + + +proc update_MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH { MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH PARAM_VALUE.C_S_AXI_DATA_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_S_AXI_DATA_WIDTH}] ${MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH} +} + +proc update_MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH { MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH PARAM_VALUE.C_S_AXI_ADDR_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_S_AXI_ADDR_WIDTH}] ${MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH} +} + diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl new file mode 100644 index 0000000..4804aeb --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/component.xml b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/component.xml new file mode 100644 index 0000000..3f9304c --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/component.xml @@ -0,0 +1,489 @@ +<?xml version="1.0" encoding="UTF-8"?> +<spirit:component xmlns:xilinx="http://www.xilinx.com" xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <spirit:vendor>soclabs.org</spirit:vendor> + <spirit:library>user</spirit:library> + <spirit:name>ft1248x1_to_stream8</spirit:name> + <spirit:version>1.0</spirit:version> + <spirit:busInterfaces> + <spirit:busInterface> + <spirit:name>resetn</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="reset" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="reset_rtl" spirit:version="1.0"/> + <spirit:slave/> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>RST</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>resetn</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + <spirit:parameters> + <spirit:parameter> + <spirit:name>POLARITY</spirit:name> + <spirit:value spirit:id="BUSIFPARAM_VALUE.RESETN.POLARITY" spirit:choiceRef="choice_list_9d8b0d81">ACTIVE_LOW</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:busInterface> + <spirit:busInterface> + <spirit:name>clk</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="clock" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="clock_rtl" spirit:version="1.0"/> + <spirit:slave/> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>CLK</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>clk</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + <spirit:parameters> + <spirit:parameter> + <spirit:name>ASSOCIATED_RESET</spirit:name> + <spirit:value spirit:id="BUSIFPARAM_VALUE.CLK.ASSOCIATED_RESET">resetn</spirit:value> + </spirit:parameter> + <spirit:parameter> + <spirit:name>ASSOCIATED_BUSIF</spirit:name> + <spirit:value spirit:id="BUSIFPARAM_VALUE.CLK.ASSOCIATED_BUSIF">txd:rxd</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:busInterface> + <spirit:busInterface> + <spirit:name>txd</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis_rtl" spirit:version="1.0"/> + <spirit:master/> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>txd_tdata8_o</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>txd_tvalid_o</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>txd_tready_i</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + <spirit:busInterface> + <spirit:name>rxd</spirit:name> + <spirit:busType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis" spirit:version="1.0"/> + <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis_rtl" spirit:version="1.0"/> + <spirit:slave/> + <spirit:portMaps> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TDATA</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>rxd_tdata8_i</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TVALID</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>rxd_tvalid_i</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + <spirit:portMap> + <spirit:logicalPort> + <spirit:name>TREADY</spirit:name> + </spirit:logicalPort> + <spirit:physicalPort> + <spirit:name>rxd_tready_o</spirit:name> + </spirit:physicalPort> + </spirit:portMap> + </spirit:portMaps> + </spirit:busInterface> + </spirit:busInterfaces> + <spirit:model> + <spirit:views> + <spirit:view> + <spirit:name>xilinx_anylanguagesynthesis</spirit:name> + <spirit:displayName>Synthesis</spirit:displayName> + <spirit:envIdentifier>:vivado.xilinx.com:synthesis</spirit:envIdentifier> + <spirit:language>Verilog</spirit:language> + <spirit:modelName>ft1248x1_to_stream8</spirit:modelName> + <spirit:fileSetRef> + <spirit:localName>xilinx_anylanguagesynthesis_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>5c0c346d</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + <spirit:view> + <spirit:name>xilinx_anylanguagebehavioralsimulation</spirit:name> + <spirit:displayName>Simulation</spirit:displayName> + <spirit:envIdentifier>:vivado.xilinx.com:simulation</spirit:envIdentifier> + <spirit:language>Verilog</spirit:language> + <spirit:modelName>ft1248x1_to_stream8</spirit:modelName> + <spirit:fileSetRef> + <spirit:localName>xilinx_anylanguagebehavioralsimulation_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>5c0c346d</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + <spirit:view> + <spirit:name>xilinx_xpgui</spirit:name> + <spirit:displayName>UI Layout</spirit:displayName> + <spirit:envIdentifier>:vivado.xilinx.com:xgui.ui</spirit:envIdentifier> + <spirit:fileSetRef> + <spirit:localName>xilinx_xpgui_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>f92e9879</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + <spirit:view> + <spirit:name>archive_project</spirit:name> + <spirit:displayName>Miscellaneous</spirit:displayName> + <spirit:envIdentifier>:vivado.xilinx.com:misc.files</spirit:envIdentifier> + <spirit:fileSetRef> + <spirit:localName>archive_project_view_fileset</spirit:localName> + </spirit:fileSetRef> + <spirit:parameters> + <spirit:parameter> + <spirit:name>viewChecksum</spirit:name> + <spirit:value>119b3fd8</spirit:value> + </spirit:parameter> + </spirit:parameters> + </spirit:view> + </spirit:views> + <spirit:ports> + <spirit:port> + <spirit:name>ft_clk_i</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_anylanguagesynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_anylanguagebehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>ft_ssn_i</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_anylanguagesynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_anylanguagebehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>ft_miso_o</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_anylanguagesynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_anylanguagebehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>ft_miosio_i</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_anylanguagesynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_anylanguagebehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>ft_miosio_o</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_anylanguagesynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_anylanguagebehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>ft_miosio_z</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_anylanguagesynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_anylanguagebehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>clk</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_anylanguagesynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_anylanguagebehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>resetn</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_anylanguagesynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_anylanguagebehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>txd_tvalid_o</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_anylanguagesynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_anylanguagebehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>txd_tdata8_o</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long">7</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_anylanguagesynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_anylanguagebehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>txd_tready_i</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_anylanguagesynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_anylanguagebehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + <spirit:driver> + <spirit:defaultValue spirit:format="long">1</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>rxd_tready_o</spirit:name> + <spirit:wire> + <spirit:direction>out</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_anylanguagesynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_anylanguagebehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>rxd_tdata8_i</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:vector> + <spirit:left spirit:format="long">7</spirit:left> + <spirit:right spirit:format="long">0</spirit:right> + </spirit:vector> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_anylanguagesynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_anylanguagebehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + <spirit:driver> + <spirit:defaultValue spirit:format="long">0</spirit:defaultValue> + </spirit:driver> + </spirit:wire> + </spirit:port> + <spirit:port> + <spirit:name>rxd_tvalid_i</spirit:name> + <spirit:wire> + <spirit:direction>in</spirit:direction> + <spirit:wireTypeDefs> + <spirit:wireTypeDef> + <spirit:typeName>wire</spirit:typeName> + <spirit:viewNameRef>xilinx_anylanguagesynthesis</spirit:viewNameRef> + <spirit:viewNameRef>xilinx_anylanguagebehavioralsimulation</spirit:viewNameRef> + </spirit:wireTypeDef> + </spirit:wireTypeDefs> + </spirit:wire> + </spirit:port> + </spirit:ports> + </spirit:model> + <spirit:choices> + <spirit:choice> + <spirit:name>choice_list_9d8b0d81</spirit:name> + <spirit:enumeration>ACTIVE_HIGH</spirit:enumeration> + <spirit:enumeration>ACTIVE_LOW</spirit:enumeration> + </spirit:choice> + </spirit:choices> + <spirit:fileSets> + <spirit:fileSet> + <spirit:name>xilinx_anylanguagesynthesis_view_fileset</spirit:name> + <spirit:file> + <spirit:name>src/synclib.v</spirit:name> + <spirit:fileType>verilogSource</spirit:fileType> + <spirit:userFileType>IMPORTED_FILE</spirit:userFileType> + </spirit:file> + <spirit:file> + <spirit:name>src/ft1248x1_to_stream8.v</spirit:name> + <spirit:fileType>verilogSource</spirit:fileType> + <spirit:userFileType>CHECKSUM_06e9a745</spirit:userFileType> + <spirit:userFileType>IMPORTED_FILE</spirit:userFileType> + </spirit:file> + </spirit:fileSet> + <spirit:fileSet> + <spirit:name>xilinx_anylanguagebehavioralsimulation_view_fileset</spirit:name> + <spirit:file> + <spirit:name>src/synclib.v</spirit:name> + <spirit:fileType>verilogSource</spirit:fileType> + <spirit:userFileType>IMPORTED_FILE</spirit:userFileType> + </spirit:file> + <spirit:file> + <spirit:name>src/ft1248x1_to_stream8.v</spirit:name> + <spirit:fileType>verilogSource</spirit:fileType> + <spirit:userFileType>IMPORTED_FILE</spirit:userFileType> + </spirit:file> + </spirit:fileSet> + <spirit:fileSet> + <spirit:name>xilinx_xpgui_view_fileset</spirit:name> + <spirit:file> + <spirit:name>xgui/ft1248x1_to_stream8_v1_0.tcl</spirit:name> + <spirit:fileType>tclSource</spirit:fileType> + <spirit:userFileType>CHECKSUM_f92e9879</spirit:userFileType> + <spirit:userFileType>XGUI_VERSION_2</spirit:userFileType> + </spirit:file> + </spirit:fileSet> + <spirit:fileSet> + <spirit:name>archive_project_view_fileset</spirit:name> + <spirit:file> + <spirit:name>ip_project_archive.zip</spirit:name> + <spirit:userFileType>zip</spirit:userFileType> + </spirit:file> + </spirit:fileSet> + </spirit:fileSets> + <spirit:description>ft1248x1_to_stream8_v1_0</spirit:description> + <spirit:parameters> + <spirit:parameter> + <spirit:name>Component_Name</spirit:name> + <spirit:value spirit:resolve="user" spirit:id="PARAM_VALUE.Component_Name" spirit:order="1">ft1248x1_to_stream8_v1_0</spirit:value> + </spirit:parameter> + </spirit:parameters> + <spirit:vendorExtensions> + <xilinx:coreExtensions> + <xilinx:supportedFamilies> + <xilinx:family xilinx:lifeCycle="Production">zynquplus</xilinx:family> + </xilinx:supportedFamilies> + <xilinx:taxonomies> + <xilinx:taxonomy>/UserIP</xilinx:taxonomy> + </xilinx:taxonomies> + <xilinx:displayName>ft1248x1_to_stream8_v1_0</xilinx:displayName> + <xilinx:definitionSource>package_project</xilinx:definitionSource> + <xilinx:vendorDisplayName>soclabs</xilinx:vendorDisplayName> + <xilinx:vendorURL>http://soclabs.org</xilinx:vendorURL> + <xilinx:coreRevision>3</xilinx:coreRevision> + <xilinx:coreCreationDateTime>2022-08-02T14:30:20Z</xilinx:coreCreationDateTime> + <xilinx:tags> + <xilinx:tag xilinx:name="ui.data.coregen.df@5518b824_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@dd6b747_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@1dd36a4a_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@382bd830_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@6aeff378_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@68b65f1b_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@6385c4eb_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@16b128f7_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@744eb339_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@341d42a_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@119532b1_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@6244a695_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@5677e373_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@42f085dd_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@7de75687_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@7e5d266a_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@75402bf4_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@71bb76b3_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@23e5a153_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@861dc68_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@5d40693a_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@7771d989_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag> + </xilinx:tags> + </xilinx:coreExtensions> + <xilinx:packagingInfo> + <xilinx:xilinxVersion>2021.1</xilinx:xilinxVersion> + <xilinx:checksum xilinx:scope="busInterfaces" xilinx:value="ba903ffc"/> + <xilinx:checksum xilinx:scope="fileGroups" xilinx:value="198bf64b"/> + <xilinx:checksum xilinx:scope="ports" xilinx:value="ad10c1dd"/> + <xilinx:checksum xilinx:scope="parameters" xilinx:value="736a069e"/> + </xilinx:packagingInfo> + </spirit:vendorExtensions> +</spirit:component> diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ft1248x1_to_stream8_0.xcix b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ft1248x1_to_stream8_0.xcix new file mode 100644 index 0000000000000000000000000000000000000000..1b2410ad1ecde98574e898028f41ad55c1c8f3b1 GIT binary patch literal 253 zcmWIWW@gc4U}NB5XqqS(`mg`;-f9L0hK&pi3~US{49UrQ6}dT#3<3=3VDrZHC(Z_H zc<XANJ9B<>sL>VUfFO^v-sk*Jp7Guu%EeoFd27I??T<GVp40a#J$GK)^UN7<-JlP? zXHMyJHD@wqeLQ={S#ZPSpa6!~g{RMWZuQnSG%?z^!k|b0WWT<irkC%TtsUkUj%%$7 zpExITG5;psHIumywcXA+&dLzr&B!FeEP}()5Qj1{Ffc4>1hFAr2=HcQ1MwIc7#U0$ K7#KE#I1B(r*H8NZ literal 0 HcmV?d00001 diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0.v b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0.v new file mode 100644 index 0000000..822ab4c --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0.v @@ -0,0 +1,75 @@ + +`timescale 1 ns / 1 ps + + module ft1248x1_to_stream8_v1_0 # + ( + // Users to add parameters here + + // User parameters ends + // Do not modify the parameters beyond this line + + + // Parameters of Axi Slave Bus Interface RXD8 + parameter integer C_RXD8_TDATA_WIDTH = 32, + + // Parameters of Axi Master Bus Interface TXD8 + parameter integer C_TXD8_TDATA_WIDTH = 32, + parameter integer C_TXD8_START_COUNT = 32 + ) + ( + // Users to add ports here + + // User ports ends + // Do not modify the ports beyond this line + + + // Ports of Axi Slave Bus Interface RXD8 + input wire rxd8_aclk, + input wire rxd8_aresetn, + output wire rxd8_tready, + input wire [C_RXD8_TDATA_WIDTH-1 : 0] rxd8_tdata, + input wire [(C_RXD8_TDATA_WIDTH/8)-1 : 0] rxd8_tstrb, + input wire rxd8_tlast, + input wire rxd8_tvalid, + + // Ports of Axi Master Bus Interface TXD8 + input wire txd8_aclk, + input wire txd8_aresetn, + output wire txd8_tvalid, + output wire [C_TXD8_TDATA_WIDTH-1 : 0] txd8_tdata, + output wire [(C_TXD8_TDATA_WIDTH/8)-1 : 0] txd8_tstrb, + output wire txd8_tlast, + input wire txd8_tready + ); +// Instantiation of Axi Bus Interface RXD8 + ft1248x1_to_stream8_v1_0_RXD8 # ( + .C_S_AXIS_TDATA_WIDTH(C_RXD8_TDATA_WIDTH) + ) ft1248x1_to_stream8_v1_0_RXD8_inst ( + .S_AXIS_ACLK(rxd8_aclk), + .S_AXIS_ARESETN(rxd8_aresetn), + .S_AXIS_TREADY(rxd8_tready), + .S_AXIS_TDATA(rxd8_tdata), + .S_AXIS_TSTRB(rxd8_tstrb), + .S_AXIS_TLAST(rxd8_tlast), + .S_AXIS_TVALID(rxd8_tvalid) + ); + +// Instantiation of Axi Bus Interface TXD8 + ft1248x1_to_stream8_v1_0_TXD8 # ( + .C_M_AXIS_TDATA_WIDTH(C_TXD8_TDATA_WIDTH), + .C_M_START_COUNT(C_TXD8_START_COUNT) + ) ft1248x1_to_stream8_v1_0_TXD8_inst ( + .M_AXIS_ACLK(txd8_aclk), + .M_AXIS_ARESETN(txd8_aresetn), + .M_AXIS_TVALID(txd8_tvalid), + .M_AXIS_TDATA(txd8_tdata), + .M_AXIS_TSTRB(txd8_tstrb), + .M_AXIS_TLAST(txd8_tlast), + .M_AXIS_TREADY(txd8_tready) + ); + + // Add user logic here + + // User logic ends + + endmodule diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_RXD8.v b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_RXD8.v new file mode 100644 index 0000000..9b39ac6 --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_RXD8.v @@ -0,0 +1,167 @@ + +`timescale 1 ns / 1 ps + + module ft1248x1_to_stream8_v1_0_RXD8 # + ( + // Users to add parameters here + + // User parameters ends + // Do not modify the parameters beyond this line + + // AXI4Stream sink: Data Width + parameter integer C_S_AXIS_TDATA_WIDTH = 32 + ) + ( + // Users to add ports here + + // User ports ends + // Do not modify the ports beyond this line + + // AXI4Stream sink: Clock + input wire S_AXIS_ACLK, + // AXI4Stream sink: Reset + input wire S_AXIS_ARESETN, + // Ready to accept data in + output wire S_AXIS_TREADY, + // Data in + input wire [C_S_AXIS_TDATA_WIDTH-1 : 0] S_AXIS_TDATA, + // Byte qualifier + input wire [(C_S_AXIS_TDATA_WIDTH/8)-1 : 0] S_AXIS_TSTRB, + // Indicates boundary of last packet + input wire S_AXIS_TLAST, + // Data is in valid + input wire S_AXIS_TVALID + ); + // function called clogb2 that returns an integer which has the + // value of the ceiling of the log base 2. + function integer clogb2 (input integer bit_depth); + begin + for(clogb2=0; bit_depth>0; clogb2=clogb2+1) + bit_depth = bit_depth >> 1; + end + endfunction + + // Total number of input data. + localparam NUMBER_OF_INPUT_WORDS = 8; + // bit_num gives the minimum number of bits needed to address 'NUMBER_OF_INPUT_WORDS' size of FIFO. + localparam bit_num = clogb2(NUMBER_OF_INPUT_WORDS-1); + // Define the states of state machine + // The control state machine oversees the writing of input streaming data to the FIFO, + // and outputs the streaming data from the FIFO + parameter [1:0] IDLE = 1'b0, // This is the initial/idle state + + WRITE_FIFO = 1'b1; // In this state FIFO is written with the + // input stream data S_AXIS_TDATA + wire axis_tready; + // State variable + reg mst_exec_state; + // FIFO implementation signals + genvar byte_index; + // FIFO write enable + wire fifo_wren; + // FIFO full flag + reg fifo_full_flag; + // FIFO write pointer + reg [bit_num-1:0] write_pointer; + // sink has accepted all the streaming data and stored in FIFO + reg writes_done; + // I/O Connections assignments + + assign S_AXIS_TREADY = axis_tready; + // Control state machine implementation + always @(posedge S_AXIS_ACLK) + begin + if (!S_AXIS_ARESETN) + // Synchronous reset (active low) + begin + mst_exec_state <= IDLE; + end + else + case (mst_exec_state) + IDLE: + // The sink starts accepting tdata when + // there tvalid is asserted to mark the + // presence of valid streaming data + if (S_AXIS_TVALID) + begin + mst_exec_state <= WRITE_FIFO; + end + else + begin + mst_exec_state <= IDLE; + end + WRITE_FIFO: + // When the sink has accepted all the streaming input data, + // the interface swiches functionality to a streaming master + if (writes_done) + begin + mst_exec_state <= IDLE; + end + else + begin + // The sink accepts and stores tdata + // into FIFO + mst_exec_state <= WRITE_FIFO; + end + + endcase + end + // AXI Streaming Sink + // + // The example design sink is always ready to accept the S_AXIS_TDATA until + // the FIFO is not filled with NUMBER_OF_INPUT_WORDS number of input words. + assign axis_tready = ((mst_exec_state == WRITE_FIFO) && (write_pointer <= NUMBER_OF_INPUT_WORDS-1)); + + always@(posedge S_AXIS_ACLK) + begin + if(!S_AXIS_ARESETN) + begin + write_pointer <= 0; + writes_done <= 1'b0; + end + else + if (write_pointer <= NUMBER_OF_INPUT_WORDS-1) + begin + if (fifo_wren) + begin + // write pointer is incremented after every write to the FIFO + // when FIFO write signal is enabled. + write_pointer <= write_pointer + 1; + writes_done <= 1'b0; + end + if ((write_pointer == NUMBER_OF_INPUT_WORDS-1)|| S_AXIS_TLAST) + begin + // reads_done is asserted when NUMBER_OF_INPUT_WORDS numbers of streaming data + // has been written to the FIFO which is also marked by S_AXIS_TLAST(kept for optional usage). + writes_done <= 1'b1; + end + end + end + + // FIFO write enable generation + assign fifo_wren = S_AXIS_TVALID && axis_tready; + + // FIFO Implementation + generate + for(byte_index=0; byte_index<= (C_S_AXIS_TDATA_WIDTH/8-1); byte_index=byte_index+1) + begin:FIFO_GEN + + reg [(C_S_AXIS_TDATA_WIDTH/4)-1:0] stream_data_fifo [0 : NUMBER_OF_INPUT_WORDS-1]; + + // Streaming input data is stored in FIFO + + always @( posedge S_AXIS_ACLK ) + begin + if (fifo_wren)// && S_AXIS_TSTRB[byte_index]) + begin + stream_data_fifo[write_pointer] <= S_AXIS_TDATA[(byte_index*8+7) -: 8]; + end + end + end + endgenerate + + // Add user logic here + + // User logic ends + + endmodule diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_TXD8.v b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_TXD8.v new file mode 100644 index 0000000..3abf9f8 --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_TXD8.v @@ -0,0 +1,228 @@ + +`timescale 1 ns / 1 ps + + module ft1248x1_to_stream8_v1_0_TXD8 # + ( + // Users to add parameters here + + // User parameters ends + // Do not modify the parameters beyond this line + + // Width of S_AXIS address bus. The slave accepts the read and write addresses of width C_M_AXIS_TDATA_WIDTH. + parameter integer C_M_AXIS_TDATA_WIDTH = 32, + // Start count is the number of clock cycles the master will wait before initiating/issuing any transaction. + parameter integer C_M_START_COUNT = 32 + ) + ( + // Users to add ports here + + // User ports ends + // Do not modify the ports beyond this line + + // Global ports + input wire M_AXIS_ACLK, + // + input wire M_AXIS_ARESETN, + // Master Stream Ports. TVALID indicates that the master is driving a valid transfer, A transfer takes place when both TVALID and TREADY are asserted. + output wire M_AXIS_TVALID, + // TDATA is the primary payload that is used to provide the data that is passing across the interface from the master. + output wire [C_M_AXIS_TDATA_WIDTH-1 : 0] M_AXIS_TDATA, + // TSTRB is the byte qualifier that indicates whether the content of the associated byte of TDATA is processed as a data byte or a position byte. + output wire [(C_M_AXIS_TDATA_WIDTH/8)-1 : 0] M_AXIS_TSTRB, + // TLAST indicates the boundary of a packet. + output wire M_AXIS_TLAST, + // TREADY indicates that the slave can accept a transfer in the current cycle. + input wire M_AXIS_TREADY + ); + // Total number of output data + localparam NUMBER_OF_OUTPUT_WORDS = 8; + + // function called clogb2 that returns an integer which has the + // value of the ceiling of the log base 2. + function integer clogb2 (input integer bit_depth); + begin + for(clogb2=0; bit_depth>0; clogb2=clogb2+1) + bit_depth = bit_depth >> 1; + end + endfunction + + // WAIT_COUNT_BITS is the width of the wait counter. + localparam integer WAIT_COUNT_BITS = clogb2(C_M_START_COUNT-1); + + // bit_num gives the minimum number of bits needed to address 'depth' size of FIFO. + localparam bit_num = clogb2(NUMBER_OF_OUTPUT_WORDS); + + // Define the states of state machine + // The control state machine oversees the writing of input streaming data to the FIFO, + // and outputs the streaming data from the FIFO + parameter [1:0] IDLE = 2'b00, // This is the initial/idle state + + INIT_COUNTER = 2'b01, // This state initializes the counter, once + // the counter reaches C_M_START_COUNT count, + // the state machine changes state to SEND_STREAM + SEND_STREAM = 2'b10; // In this state the + // stream data is output through M_AXIS_TDATA + // State variable + reg [1:0] mst_exec_state; + // Example design FIFO read pointer + reg [bit_num-1:0] read_pointer; + + // AXI Stream internal signals + //wait counter. The master waits for the user defined number of clock cycles before initiating a transfer. + reg [WAIT_COUNT_BITS-1 : 0] count; + //streaming data valid + wire axis_tvalid; + //streaming data valid delayed by one clock cycle + reg axis_tvalid_delay; + //Last of the streaming data + wire axis_tlast; + //Last of the streaming data delayed by one clock cycle + reg axis_tlast_delay; + //FIFO implementation signals + reg [C_M_AXIS_TDATA_WIDTH-1 : 0] stream_data_out; + wire tx_en; + //The master has issued all the streaming data stored in FIFO + reg tx_done; + + + // I/O Connections assignments + + assign M_AXIS_TVALID = axis_tvalid_delay; + assign M_AXIS_TDATA = stream_data_out; + assign M_AXIS_TLAST = axis_tlast_delay; + assign M_AXIS_TSTRB = {(C_M_AXIS_TDATA_WIDTH/8){1'b1}}; + + + // Control state machine implementation + always @(posedge M_AXIS_ACLK) + begin + if (!M_AXIS_ARESETN) + // Synchronous reset (active low) + begin + mst_exec_state <= IDLE; + count <= 0; + end + else + case (mst_exec_state) + IDLE: + // The slave starts accepting tdata when + // there tvalid is asserted to mark the + // presence of valid streaming data + //if ( count == 0 ) + // begin + mst_exec_state <= INIT_COUNTER; + // end + //else + // begin + // mst_exec_state <= IDLE; + // end + + INIT_COUNTER: + // The slave starts accepting tdata when + // there tvalid is asserted to mark the + // presence of valid streaming data + if ( count == C_M_START_COUNT - 1 ) + begin + mst_exec_state <= SEND_STREAM; + end + else + begin + count <= count + 1; + mst_exec_state <= INIT_COUNTER; + end + + SEND_STREAM: + // The example design streaming master functionality starts + // when the master drives output tdata from the FIFO and the slave + // has finished storing the S_AXIS_TDATA + if (tx_done) + begin + mst_exec_state <= IDLE; + end + else + begin + mst_exec_state <= SEND_STREAM; + end + endcase + end + + + //tvalid generation + //axis_tvalid is asserted when the control state machine's state is SEND_STREAM and + //number of output streaming data is less than the NUMBER_OF_OUTPUT_WORDS. + assign axis_tvalid = ((mst_exec_state == SEND_STREAM) && (read_pointer < NUMBER_OF_OUTPUT_WORDS)); + + // AXI tlast generation + // axis_tlast is asserted number of output streaming data is NUMBER_OF_OUTPUT_WORDS-1 + // (0 to NUMBER_OF_OUTPUT_WORDS-1) + assign axis_tlast = (read_pointer == NUMBER_OF_OUTPUT_WORDS-1); + + + // Delay the axis_tvalid and axis_tlast signal by one clock cycle + // to match the latency of M_AXIS_TDATA + always @(posedge M_AXIS_ACLK) + begin + if (!M_AXIS_ARESETN) + begin + axis_tvalid_delay <= 1'b0; + axis_tlast_delay <= 1'b0; + end + else + begin + axis_tvalid_delay <= axis_tvalid; + axis_tlast_delay <= axis_tlast; + end + end + + + //read_pointer pointer + + always@(posedge M_AXIS_ACLK) + begin + if(!M_AXIS_ARESETN) + begin + read_pointer <= 0; + tx_done <= 1'b0; + end + else + if (read_pointer <= NUMBER_OF_OUTPUT_WORDS-1) + begin + if (tx_en) + // read pointer is incremented after every read from the FIFO + // when FIFO read signal is enabled. + begin + read_pointer <= read_pointer + 1; + tx_done <= 1'b0; + end + end + else if (read_pointer == NUMBER_OF_OUTPUT_WORDS) + begin + // tx_done is asserted when NUMBER_OF_OUTPUT_WORDS numbers of streaming data + // has been out. + tx_done <= 1'b1; + end + end + + + //FIFO read enable generation + + assign tx_en = M_AXIS_TREADY && axis_tvalid; + + // Streaming output data is read from FIFO + always @( posedge M_AXIS_ACLK ) + begin + if(!M_AXIS_ARESETN) + begin + stream_data_out <= 1; + end + else if (tx_en)// && M_AXIS_TSTRB[byte_index] + begin + stream_data_out <= read_pointer + 32'b1; + end + end + + // Add user logic here + + // User logic ends + + endmodule diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ip_project_archive.zip b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ip_project_archive.zip new file mode 100755 index 0000000000000000000000000000000000000000..e67e74bbc9ca5ffffb895c6ce630825d07197fa2 GIT binary patch literal 19366 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 literal 0 HcmV?d00001 diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/soclabs.org_user_ft1248x1_to_stream8_1.0.zip b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/soclabs.org_user_ft1248x1_to_stream8_1.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..bd8f20f74f0cc9c44da89578d526ab1afbd7f276 GIT binary patch literal 22475 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 a;5x}7z?+o~q=uD&l_7wUfgv>v!~+0G+E0-H literal 0 HcmV?d00001 diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/ft1248x1_to_stream8.v b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/ft1248x1_to_stream8.v new file mode 100755 index 0000000..6c55abc --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/ft1248x1_to_stream8.v @@ -0,0 +1,187 @@ +//----------------------------------------------------------------------------- +// FT1248 1-bit-data to 8-bit AXI-Stream IO +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// Abstract : FT1248 1-bit data off-chip interface (emulate FT232H device) +//----------------------------------------------------------------------------- + + +module ft1248x1_to_stream8 + ( + input wire ft_clk_i, // SCLK + input wire ft_ssn_i, // SS_N + output wire ft_miso_o, // MISO +// inout wire ft_miosio_io, // MIOSIO tristate output control + input wire ft_miosio_i, + output wire ft_miosio_o, + output wire ft_miosio_z, +// assign ft_miosio_io = (ft_miosio_z) ? 1'bz : ft_miosio_o;// tri-state pad control for MIOSIO +// +// assign #1 ft_miosio_i = ft_miosio_io; //add notional delay on inout to ensure last "half-bit" on FT1248TXD is sampled before tri-stated + + input wire clk, // external primary clock + input wire resetn, // external reset (active low) + + // Ports of Axi stream Bus Interface TXD + output wire txd_tvalid_o, + output wire [7 : 0] txd_tdata8_o, + input wire txd_tready_i, + + // Ports of Axi stream Bus Interface RXD + output wire rxd_tready_o, + input wire [7 : 0] rxd_tdata8_i, + input wire rxd_tvalid_i + + ); + +//wire ft_clk; +wire ft_clk_rising; +wire ft_clk_falling; + +wire ft_ssn; +//wire ft_ssn_rising; +//wire ft_ssn_falling; + +SYNCHRONIZER_EDGES u_xync_ft_clk ( + .testmode_i(1'b0), + .clk_i(clk), + .reset_n_i(resetn), + .asyn_i(ft_clk_i), + .syn_o(), + .posedge_o(ft_clk_rising), + .negedge_o(ft_clk_falling) + ); + +SYNCHRONIZER_EDGES u_xync_ft_ssn ( + .testmode_i(1'b0), + .clk_i(clk), + .reset_n_i(resetn), + .asyn_i(ft_ssn_i), + .syn_o(ft_ssn), + .posedge_o( ), + .negedge_o( ) + ); + +//---------------------------------------------- +//-- FT1248 1-bit protocol State Machine +//---------------------------------------------- + +reg [4:0] ft_state; // 17-state for bit-serial +wire [4:0] ft_nextstate = ft_state + 5'b00001; + +// advance state count on rising edge of ft_clk +always @(posedge clk or negedge resetn) + if (!resetn) + ft_state <= 5'b11111; + else if (ft_ssn) // sync reset + ft_state <= 5'b11111; + else if (ft_clk_rising) // loop if multi-data +// ft_state <= (ft_state == 5'b01111) ? 5'b01000 : ft_nextstate; + ft_state <= ft_nextstate; + +// 16: bus turnaround (or bit[5]) +// 0 for CMD3 +// 3 for CMD2 +// 5 for CMD1 +// 6 for CMD0 +// 7 for cmd turnaround +// 8 for data bit0 +// 9 for data bit1 +// 10 for data bit2 +// 11 for data bit3 +// 12 for data bit4 +// 13 for data bit5 +// 14 for data bit6 +// 15 for data bit7 + +// capture 7-bit CMD on falling edge of clock (mid-data) +reg [7:0] ft_cmd; +// - valid sample ready after 7th edge (ready RX or TX data phase functionality) +always @(posedge clk or negedge resetn) + if (!resetn) + ft_cmd <= 8'b00000001; + else if (ft_ssn) // sync reset + ft_cmd <= 8'b00000001; + else if (ft_clk_falling & !ft_state[3] & !ft_nextstate[3]) // on shift if CMD phase) + ft_cmd <= {ft_cmd[6:0],ft_miosio_i}; + +wire ft_cmd_valid = ft_cmd[7]; +wire ft_cmd_rxd = ft_cmd[7] & !ft_cmd[6] & !ft_cmd[3] & !ft_cmd[1] & ft_cmd[0]; +wire ft_cmd_txd = ft_cmd[7] & !ft_cmd[6] & !ft_cmd[3] & !ft_cmd[1] & !ft_cmd[0]; + +// tristate enable for miosio (deselected status or serialized data for read command) +wire ft_miosio_e = ft_ssn_i | (ft_cmd_rxd & !ft_state[4] & ft_state[3]); +assign ft_miosio_z = !ft_miosio_e; + +// capture (ft_cmd_txd) serial data out on falling edge of clock +// bit [0] indicated byte valid +reg [7:0] rxd_sr; +always @(posedge clk or negedge resetn) + if (!resetn) + rxd_sr <= 8'b00000000; + else if (ft_ssn) // sync reset + rxd_sr <= 8'b00000000; + else if (ft_clk_falling & ft_cmd_txd & (ft_state[4:3] == 2'b01)) //serial shift + rxd_sr <= {ft_miosio_i, rxd_sr[7:1]}; + +// AXI STREAM handshake interfaces +// TX stream delivers valid FT1248 read data transfer +// 8-bit write port with extra top-bit used as valid qualifer +reg [8:0] txstream; +always @(posedge clk or negedge resetn) + if (!resetn) + txstream <= 9'b000000000; + else if (txstream[8] & txd_tready_i) // priority clear stream data valid when accepted + txstream[8] <= 1'b0; + else if (ft_clk_falling & ft_cmd_txd & (ft_state==5'b01111)) //load as last shift arrives + txstream[8:0] <= {1'b1, 1'b0, rxd_sr[7:1]}; + +assign txd_tvalid_o = txstream[8]; +assign txd_tdata8_o = txstream[7:0]; + + +// AXI STREAM handshake interfaces +// RX stream accepts 8-bit data to transfer over FT1248 channel +// 8-bit write port with extra top-bit used as valid qualifer +reg [8:0] rxstream; +always @(posedge clk or negedge resetn) + if (!resetn) + rxstream <= 9'b000000000; + else if (!rxstream[8] & rxd_tvalid_i) // if empty can accept valid RX stream data + rxstream[8:0] <= {1'b1,rxd_tdata8_i}; + else if (rxstream[8] & ft_clk_rising & ft_cmd_rxd & (ft_state==5'b01111)) // hold until final shift completion + rxstream[8] <= 1'b0; +assign rxd_tready_o = !rxstream[8]; // ready until loaded + +// shift TXD on rising edge of clock +reg [7:0] txd_sr; +// rewrite for clocked +always @(posedge clk or negedge resetn) + if (!resetn) + txd_sr <= 8'b00000000; + else if (ft_ssn) // sync reset + txd_sr <= 8'b00000000; + else if (ft_clk_falling & ft_cmd_rxd & (ft_state == 5'b00111)) + txd_sr <= rxstream[8] ? rxstream[7:0] : 8'b00000000; + else if (ft_clk_rising & ft_cmd_rxd & (ft_state[4:3] == 2'b01)) //serial shift + txd_sr <= {1'b0,txd_sr[7:1]}; + + +//FT1248 FIFO status signals + +// ft_miso_o reflects TXF when deselected +assign ft_miosio_o = (ft_ssn_i) ? !txstream[8] : txd_sr[0]; + +// ft_miso_o reflects RXE when deselected +assign ft_miso_o = (ft_ssn_i) ? rxstream[8] : (ft_state == 5'b00111); + + +endmodule diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/synclib.v b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/synclib.v new file mode 100755 index 0000000..1daf61f --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/synclib.v @@ -0,0 +1,139 @@ +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Flynn (d.w.flynn@soton.ac.uk) +// +// Copyright � 2022, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module SYNCHRONIZER ( + input wire testmode_i + ,input wire clk_i + ,input wire reset_n_i + ,input wire asyn_i + ,output wire syn_o + ); + +reg sync_stage1; +reg sync_stage2; + + always @(posedge clk_i or negedge reset_n_i) + if(~reset_n_i) begin + sync_stage1 <= 1'b0; + sync_stage2 <= 1'b0; + end + else begin + sync_stage1 <= asyn_i; + sync_stage2 <= sync_stage1; + end + +assign syn_o = (testmode_i) ? asyn_i : sync_stage2; + +endmodule + +module SYNCHRONIZER_EDGES ( + input wire testmode_i + ,input wire clk_i + ,input wire reset_n_i + ,input wire asyn_i + ,output wire syn_o + ,output wire posedge_o + ,output wire negedge_o + ); + +reg sync_stage1; +reg sync_stage2; +reg sync_stage3; + + always @(posedge clk_i or negedge reset_n_i) + if(~reset_n_i) begin + sync_stage1 <= 1'b0; + sync_stage2 <= 1'b0; + sync_stage3 <= 1'b0; + end + else begin + sync_stage1 <= asyn_i; + sync_stage2 <= sync_stage1; + sync_stage3 <= sync_stage2; + end + +assign syn_o = (testmode_i) ? asyn_i : sync_stage2; +assign posedge_o = (testmode_i) ? asyn_i : ( sync_stage2 & !sync_stage3); +assign negedge_o = (testmode_i) ? asyn_i : (!sync_stage2 & sync_stage3); + +endmodule + +module SYNCHRONIZER_RST_LO ( + input wire reset_n_i + ,input wire testmode_i + ,input wire clk_i + ,input wire asyn_i + ,output wire syn_o + ); + +reg sync_stage1; +reg sync_stage2; + + always @(posedge clk_i or negedge reset_n_i) + if(~reset_n_i) begin + sync_stage1 <= 1'b0; + sync_stage2 <= 1'b0; + end + else begin + sync_stage1 <= asyn_i; + sync_stage2 <= sync_stage1; + end +assign syn_o = (testmode_i) ? asyn_i : sync_stage2; + +endmodule + +module SYNCHRONIZER_RST_HI ( + input wire reset_n_i + ,input wire testmode_i + ,input wire clk_i + ,input wire asyn_i + ,output wire syn_o + ); + +reg sync_stage1; +reg sync_stage2; + + always @(posedge clk_i or negedge reset_n_i) + if(~reset_n_i) begin + sync_stage1 <= 1'b1; + sync_stage2 <= 1'b1; + end + else begin + sync_stage1 <= asyn_i; + sync_stage2 <= sync_stage1; + end + +assign syn_o = (testmode_i) ? asyn_i : sync_stage2; + +endmodule + + +module NRST_SYNCHRONIZER_LO ( + input wire reset_n_i + ,input wire testmode_i + ,input wire clk_i + ,output wire synreset_n_o + ); + +reg sync_stage1; +reg sync_stage2; + + always @(posedge clk_i or negedge reset_n_i) + if(~reset_n_i) begin + sync_stage1 <= 1'b0; + sync_stage2 <= 1'b0; + end + else begin + sync_stage1 <= 1'b1; + sync_stage2 <= sync_stage1; + end + +assign synreset_n_o = (testmode_i) ? reset_n_i : sync_stage2; + +endmodule diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/xgui/ft1248x1_to_stream8_v1_0.tcl b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/xgui/ft1248x1_to_stream8_v1_0.tcl new file mode 100644 index 0000000..0db18e9 --- /dev/null +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/xgui/ft1248x1_to_stream8_v1_0.tcl @@ -0,0 +1,10 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + ipgui::add_page $IPINST -name "Page 0" + + +} + + diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/scripts/build_mcu_fpga_ip.tcl b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/scripts/build_mcu_fpga_ip.tcl index fdcfe3c..bac85ab 100644 --- a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/scripts/build_mcu_fpga_ip.tcl +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/scripts/build_mcu_fpga_ip.tcl @@ -78,7 +78,7 @@ read_verilog $soc_vlog/cmsdk_mcu_chip.v update_compile_order -fileset sources_1 -set mculib_ip ./MCULIB +set mculib_ip $outputDir/MCULIB ipx::package_project -root_dir $mculib_ip -vendor soclabs.org -library user -taxonomy /UserIP -import_files -set_current false -force @@ -101,6 +101,6 @@ ipx::archive_core $mculib_ip/soclabs.org_user_cmsdk_mcu_chip_1.0.zip [ipx::curr ipx::move_temp_component_back -component [ipx::current_core] close_project -delete -set_property ip_repo_paths { ip_repo ./MCULIB} [current_project] +set_property ip_repo_paths { ip_repo $mculib_ip} [current_project] update_ip_catalog close_project diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/scripts/build_mcu_fpga_pynq_z2.tcl b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/scripts/build_mcu_fpga_pynq_z2.tcl index 1adae9b..88750cb 100644 --- a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/scripts/build_mcu_fpga_pynq_z2.tcl +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/scripts/build_mcu_fpga_pynq_z2.tcl @@ -19,6 +19,8 @@ set xilinx_part xc7z020clg400-1 set project project_pynq_z2 set importDir target_fpga_pynq_z2 +set ipDir ./ip_repo +set mcuDir ./vivado/built_mcu_fpga/MCULIB set pynqDir pynq_export/pz2/pynq/overlays/soclabs set exportDir /research/soclabs/pynq_export/pz2/pynq/overlays/soclabs #set_property BOARD_PART tul.com:pynq-z2:part0:1.1 [current_project] @@ -36,15 +38,14 @@ set_property TARGET_LANGUAGE Verilog [current_project] set_property DEFAULT_LIB work [current_project] set paths [list \ - "../../../../../../../soclabs/fpga/vivado/pynq/ip_repo"\ - "../../../../../MCULIB"\ + $ipDir\ + $mcuDir\ ] # Set IP repository paths set obj [get_filesets sources_1] if { $obj != {} } { - set_property "ip_repo_paths" "[file normalize "../../../../../../../soclabs/fpga/vivado/pynq/ip_repo"] [file normalize "../../../../../MCULIB"]" $obj - + set_property "ip_repo_paths" "[file normalize $ipDir] [file normalize $mcuDir]" $obj # Rebuild user ip_repo's index before adding any source files update_ip_catalog -rebuild } @@ -111,7 +112,7 @@ exec unzip -u -o $project/design_1.xsa -d $project/export exec mkdir -p $pynqDir exec cp -p $project/export/design_1.bit $pynqDir exec cp -p $project/export/design_1.hwh $pynqDir -exec cp -p $project/export/design_1.bit $exportDir -exec cp -p $project/export/design_1.hwh $exportDir +#exec cp -p $project/export/design_1.bit $exportDir +#exec cp -p $project/export/design_1.hwh $exportDir exit 1 diff --git a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/scripts/build_mcu_fpga_pynq_zcu104.tcl b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/scripts/build_mcu_fpga_pynq_zcu104.tcl index 4051e9a..80b4726 100644 --- a/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/scripts/build_mcu_fpga_pynq_zcu104.tcl +++ b/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/scripts/build_mcu_fpga_pynq_zcu104.tcl @@ -19,6 +19,8 @@ set xilinx_part xczu7ev-ffvc1156-2-e set project project_pynq_zcu104 set importDir target_fpga_zcu104 +set ipDir ./ip_repo +set mcuDir ./vivado/built_mcu_fpga/MCULIB set pynqDir pynq_export/pz104/pynq/overlays/soclabs #set_property BOARD_PART xilinx.com:zcu104:part0:1.1 [current_project] @@ -34,21 +36,15 @@ set_part $xilinx_part set_property TARGET_LANGUAGE Verilog [current_project] set_property DEFAULT_LIB work [current_project] -##set paths [list \ -## "../../../../../../../soclabs/fpga/vivado/pynq/ip_repo"\ -## "./MCULIB"\ -## ] - set paths [list \ - "./MCULIB"\ + $ipDir\ + $mcuDir\ ] # Set IP repository paths set obj [get_filesets sources_1] if { $obj != {} } { -## set_property "ip_repo_paths" "[file normalize "../../../../../../../soclabs/fpga/vivado/pynq/ip_repo"] [file normalize "./MCULIB"]" $obj - set_property "ip_repo_paths" "[file normalize "./MCULIB"]" $obj - + set_property "ip_repo_paths" "[file normalize $ipDir] [file normalize $mcuDir]" $obj # Rebuild user ip_repo's index before adding any source files update_ip_catalog -rebuild } -- GitLab