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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 Tq5k>{?(@g>X{2I!|GN8MIfW>< 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)eX#vsCwoUB)oo5RQ;0OX^B%^TOBI2)+p zt*dqJ%=yisMpujjf;`T8pYuO?#(R4x7jNO^tpS_1Ki*V$PT#Ba+<9%!GiSVYgFg74 zIi=6loXM2+@$4CA!3~dt0vKKwo<8Hb)mz)p#AxFRgC6~p{rY;EUcP6xc9>r{uC*$B z;+)LI{F`{!Oy)k+c01=dD?@-cBa;ZT2o6U>oXH5JmNbIc5HAFHv$BDBj6i4tq&I^& F3;;&gPx}A> 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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 SE=K(QGy0t?LM8Oa(f<c-A@0}! 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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 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