From 18988b865684fd77f2ea7e2dba091532294b366a Mon Sep 17 00:00:00 2001 From: Brian Kiedinger Date: Sun, 30 Mar 2025 21:43:59 -0500 Subject: [PATCH] gitting project in git --- .gitignore | 9 + python/.gitignore | 4 + python/data_recorder.py | 131 + python/data_structures.py | 173 + python/radar_manager.py | 303 + python/read_data_file.py | 113 + python/test_cpi.py | 135 + .../constrs_1/new/constraints.xdc | 504 + .../sources_1/bd/microblaze_bd/.gitignore | 4 + .../bd/microblaze_bd/microblaze_bd.bd | 9021 ++++++ .../sources_1/hdl/axi_intf.sv | 281 + .../sources_1/hdl/axil_slave.v | 294 + .../sources_1/hdl/digital_rx_chain.v | 355 + .../sources_1/hdl/ethernet_top.v | 334 + radar_alinx_kintex.srcs/sources_1/hdl/spi.v | 154 + .../sources_1/hdl/timing_engine.v | 389 + radar_alinx_kintex.srcs/sources_1/hdl/top.v | 876 + .../sources_1/hdl/util_reg.v | 321 + .../sources_1/hdl/verilog_ethernet/arbiter.v | 159 + .../sources_1/hdl/verilog_ethernet/arp.v | 452 + .../hdl/verilog_ethernet/arp_cache.v | 247 + .../hdl/verilog_ethernet/arp_eth_rx.v | 331 + .../hdl/verilog_ethernet/arp_eth_tx.v | 368 + .../hdl/verilog_ethernet/axis_adapter.v | 325 + .../hdl/verilog_ethernet/axis_async_fifo.v | 910 + .../axis_async_fifo_adapter.v | 378 + .../hdl/verilog_ethernet/axis_fifo.v | 565 + .../hdl/verilog_ethernet/axis_xgmii_rx_32.v | 355 + .../hdl/verilog_ethernet/axis_xgmii_rx_64.v | 449 + .../hdl/verilog_ethernet/axis_xgmii_tx_32.v | 563 + .../hdl/verilog_ethernet/axis_xgmii_tx_64.v | 656 + .../hdl/verilog_ethernet/eth_arb_mux.v | 315 + .../hdl/verilog_ethernet/eth_axis_rx.v | 405 + .../hdl/verilog_ethernet/eth_axis_tx.v | 409 + .../hdl/verilog_ethernet/eth_mac_10g.v | 731 + .../hdl/verilog_ethernet/eth_mac_10g_fifo.v | 488 + .../hdl/verilog_ethernet/eth_phy_10g.v | 142 + .../hdl/verilog_ethernet/eth_phy_10g_rx.v | 149 + .../verilog_ethernet/eth_phy_10g_rx_ber_mon.v | 124 + .../eth_phy_10g_rx_frame_sync.v | 146 + .../hdl/verilog_ethernet/eth_phy_10g_rx_if.v | 278 + .../eth_phy_10g_rx_watchdog.v | 172 + .../hdl/verilog_ethernet/eth_phy_10g_tx.v | 127 + .../hdl/verilog_ethernet/eth_phy_10g_tx_if.v | 183 + .../eth_xcvr_phy_quad_wrapper.v | 395 + .../verilog_ethernet/eth_xcvr_phy_wrapper.v | 307 + .../hdl/verilog_ethernet/fpga_core.v | 602 + .../sources_1/hdl/verilog_ethernet/ip_64.v | 353 + .../hdl/verilog_ethernet/ip_arb_mux.v | 406 + .../hdl/verilog_ethernet/ip_complete_64.v | 463 + .../hdl/verilog_ethernet/ip_eth_rx_64.v | 690 + .../hdl/verilog_ethernet/ip_eth_tx_64.v | 652 + .../sources_1/hdl/verilog_ethernet/lfsr.v | 447 + .../hdl/verilog_ethernet/mac_ctrl_rx.v | 448 + .../hdl/verilog_ethernet/mac_ctrl_tx.v | 421 + .../hdl/verilog_ethernet/mac_pause_ctrl_rx.v | 221 + .../hdl/verilog_ethernet/mac_pause_ctrl_tx.v | 313 + .../hdl/verilog_ethernet/priority_encoder.v | 92 + .../hdl/verilog_ethernet/ptp_clock_cdc.v | 830 + .../hdl/verilog_ethernet/sync_reset.v | 61 + .../sources_1/hdl/verilog_ethernet/udp_64.v | 428 + .../verilog_ethernet/udp_checksum_gen_64.v | 597 + .../hdl/verilog_ethernet/udp_complete_64.v | 661 + .../hdl/verilog_ethernet/udp_ip_rx_64.v | 564 + .../hdl/verilog_ethernet/udp_ip_tx_64.v | 553 + .../hdl/verilog_ethernet/xgmii_baser_dec_64.v | 417 + .../hdl/verilog_ethernet/xgmii_baser_enc_64.v | 284 + .../sources_1/hdl/waveform_gen.v | 367 + .../ip/axis_switch_0/axis_switch_0.xci | 507 + .../ip/clock_converter/clock_converter.xci | 189 + .../sources_1/ip/data_fifo/data_fifo.xci | 175 + .../dig_rx_clock_converter.xci | 197 + .../dig_rx_dwidth_converter.xci | 162 + .../eth_xcvr_gt_channel.xci | 898 + .../ip/eth_xcvr_gt_full/eth_xcvr_gt_full.xci | 896 + .../sources_1/ip/hdr_fifo/hdr_fifo.xci | 179 + .../sources_1/ip/hdr_mem/hdr_mem.xci | 281 + .../pulse_buffer_fifo/pulse_buffer_fifo.xci | 183 + .../sources_1/ip/wf_memory/wf_memory.xci | 287 + .../ip/width_converter/width_converter.xci | 154 + .../utils_1/imports/synth_1/top.dcp | Bin 0 -> 4086257 bytes radar_alinx_kintex.xpr | 1970 ++ top.xsa | Bin 0 -> 183243 bytes vitis/.gitignore | 4 + vitis/bootloader/.cproject | 476 + vitis/bootloader/.gitignore | 2 + vitis/bootloader/.project | 27 + vitis/bootloader/_ide/bitstream/top.mmi | 178 + vitis/bootloader/_ide/hwspec.checksum | 1 + .../launch/Debugger_bootloader-Default.launch | 72 + vitis/bootloader/bootloader.prj | 11 + vitis/bootloader/src/blconfig.h | 7 + vitis/bootloader/src/bootloader.c | 545 + vitis/bootloader/src/errors.h | 13 + vitis/bootloader/src/lscript.ld | 221 + vitis/bootloader/src/platform.c | 20 + vitis/bootloader/src/platform_config.h | 4 + vitis/bootloader/src/portab.h | 33 + vitis/bootloader/src/srec.c | 153 + vitis/bootloader/src/srec.h | 38 + vitis/bootloader_system/.cproject | 108 + vitis/bootloader_system/.gitignore | 2 + vitis/bootloader_system/.project | 29 + .../scripts/debugger_bootloader-default.tcl | 19 + .../bootloader_system/bootloader_system.sprj | 19 + vitis/radar/.cproject | 504 + vitis/radar/.gitignore | 2 + vitis/radar/.project | 26 + vitis/radar/_ide/bitstream/top.mmi | 178 + vitis/radar/_ide/hwspec.checksum | 1 + .../_ide/launch/Debugger_radar-Default.launch | 72 + .../_ide/launch/Debugger_radar-sw only.launch | 72 + vitis/radar/_ide/launch/IBERT.launch | 72 + vitis/radar/radar.prj | 11 + vitis/radar/src/.vscode/settings.json | 10 + .../ad9081/inc/adi_ad9081_bf_ad9081.h | 4450 +++ .../ad9081/inc/adi_ad9081_bf_impala_tc.h | 288 + .../ad9081/inc/adi_ad9081_bf_jrxa_des.h | 420 + .../ad9081/inc/adi_ad9081_bf_jtx_dual_link.h | 880 + .../ad9081/inc/adi_ad9081_bf_jtx_qbf_ad9081.h | 109 + .../ad9081/inc/adi_ad9081_bf_lcpll_28nm.h | 336 + .../ad9081/inc/adi_ad9081_bf_main.h | 99 + .../ad9081/inc/adi_ad9081_bf_nb_coarse_nco.h | 313 + .../ad9081/inc/adi_ad9081_bf_nb_ddc_dformat.h | 607 + .../ad9081/inc/adi_ad9081_bf_nb_fine_nco.h | 313 + .../ad9081/inc/adi_ad9081_bf_rx_paging.h | 106 + .../ad9081/inc/adi_ad9081_bf_ser_phy.h | 332 + .../ad9081/inc/adi_ad9081_bf_spi_only_up.h | 229 + .../ad9081_api/ad9081/inc/adi_ad9081_config.h | 1003 + .../ad9081_api/ad9081/inc/adi_ad9081_hal.h | 157 + .../ad9081_api/ad9081/src/adi_ad9081_adc.c | 3799 +++ .../ad9081_api/ad9081/src/adi_ad9081_dac.c | 1814 ++ .../ad9081_api/ad9081/src/adi_ad9081_device.c | 1342 + .../ad9081_api/ad9081/src/adi_ad9081_hal.c | 954 + .../ad9081_api/ad9081/src/adi_ad9081_jesd.c | 3698 +++ .../ad9081_api/ad9081/src/adi_ad9081_sync.c | 517 + .../radar/src/ad9081_api/adi_inc/adi_ad7175.h | 332 + .../radar/src/ad9081_api/adi_inc/adi_ad9081.h | 6052 ++++ .../ad9081_api/adi_inc/adi_cms_api_common.h | 446 + .../ad9081_api/adi_inc/adi_cms_api_config.h | 23 + .../src/ad9081_api/adi_inc/adi_hmc7044.h | 1217 + .../src/ad9081_api/adi_utils/inc/adi_utils.h | 71 + .../src/ad9081_api/adi_utils/src/adi_utils.c | 224 + vitis/radar/src/ad9081_api/readme.md | 23 + vitis/radar/src/ad9081_app_helper.c | 496 + vitis/radar/src/ad9081_app_helper.h | 174 + vitis/radar/src/ad9081_hal_functions.c | 125 + vitis/radar/src/ad9081_hal_functions.h | 13 + vitis/radar/src/data_converter_setup.c | 644 + vitis/radar/src/ethernet.c | 257 + vitis/radar/src/ethernet.h | 8 + vitis/radar/src/hmc7044.c | 101 + vitis/radar/src/hmc7044.h | 9 + vitis/radar/src/hmc7044/inc/hmc7044_hal.h | 55 + vitis/radar/src/hmc7044/inc/hmc7044_reg.h | 127 + .../src/hmc7044/src/adi_hmc7044_device.c | 756 + .../src/hmc7044/src/adi_hmc7044_output_ch.c | 308 + vitis/radar/src/hmc7044/src/adi_hmc7044_pll.c | 549 + vitis/radar/src/hmc7044/src/hmc7044_hal.c | 216 + vitis/radar/src/lscript.ld | 217 + vitis/radar/src/main.c | 161 + vitis/radar/src/main.c.backup | 1048 + vitis/radar/src/novatel.c | 120 + vitis/radar/src/novatel.h | 83 + vitis/radar/src/pl_udp_eth.c | 142 + vitis/radar/src/pl_udp_eth.h | 11 + vitis/radar/src/project.h | 83 + vitis/radar/src/radar_manager_icd.c | 157 + vitis/radar/src/radar_manager_icd.h | 87 + vitis/radar/src/registers.h | 12 + vitis/radar/src/rf_spi.c | 40 + vitis/radar/src/uc_settings.c | 273 + vitis/radar/src/uc_settings.c.backup | 998 + vitis/radar/src/uc_settings.c.bak | 997 + vitis/radar_system/.cproject | 108 + vitis/radar_system/.gitignore | 2 + vitis/radar_system/.project | 29 + vitis/radar_system/_ide/flash/BOOT.bin | Bin 0 -> 10986816 bytes vitis/radar_system/_ide/flash/bootimage.bif | 5 + vitis/radar_system/_ide/flash/radar.elf.srec | 24901 ++++++++++++++++ .../_ide/scripts/debugger_radar-default.tcl | 24 + .../_ide/scripts/debugger_radar-sw_only.tcl | 21 + vitis/radar_system/_ide/scripts/ibert.tcl | 21 + vitis/radar_system/radar_system.sprj | 19 + vitis/top/.cproject | 24 + vitis/top/.gitignore | 3 + vitis/top/.project | 18 + vitis/top/hw/aie_primitive.json | 13 + vitis/top/hw/top.mmi | 178 + vitis/top/hw/top.xsa | Bin 0 -> 183243 bytes .../bsp/Makefile | 49 + .../freertos10_xilinx_microblaze_0/bsp/dep.mk | 3 + .../bsp/microblaze_0/include/FreeRTOS.h | 1362 + .../bsp/microblaze_0/include/FreeRTOSConfig.h | 145 + .../microblaze_0/include/FreeRTOSSTMTrace.h | 698 + .../bsp/microblaze_0/include/StackMacros.h | 34 + .../microblaze_0/include/_profile_timer_hw.h | 281 + .../bsp/microblaze_0/include/arch/cc.h | 82 + .../bsp/microblaze_0/include/arch/cpu.h | 48 + .../bsp/microblaze_0/include/arch/perf.h | 51 + .../bsp/microblaze_0/include/arch/sys_arch.h | 73 + .../bsp/microblaze_0/include/atomic.h | 419 + .../bsp/microblaze_0/include/bspconfig.h | 26 + .../bsp/microblaze_0/include/croutine.h | 753 + .../include/deprecated_definitions.h | 281 + .../bsp/microblaze_0/include/event_groups.h | 777 + .../bsp/microblaze_0/include/fsl.h | 125 + .../bsp/microblaze_0/include/list.h | 499 + .../bsp/microblaze_0/include/lwip/altcp.h | 201 + .../bsp/microblaze_0/include/lwip/altcp_tcp.h | 72 + .../bsp/microblaze_0/include/lwip/altcp_tls.h | 117 + .../bsp/microblaze_0/include/lwip/api.h | 431 + .../bsp/microblaze_0/include/lwip/apps/FILES | 2 + .../include/lwip/apps/altcp_proxyconnect.h | 79 + .../lwip/apps/altcp_tls_mbedtls_opts.h | 67 + .../bsp/microblaze_0/include/lwip/apps/fs.h | 126 + .../include/lwip/apps/http_client.h | 160 + .../microblaze_0/include/lwip/apps/httpd.h | 255 + .../include/lwip/apps/httpd_opts.h | 396 + .../microblaze_0/include/lwip/apps/lwiperf.h | 100 + .../bsp/microblaze_0/include/lwip/apps/mdns.h | 105 + .../include/lwip/apps/mdns_opts.h | 80 + .../include/lwip/apps/mdns_priv.h | 74 + .../bsp/microblaze_0/include/lwip/apps/mqtt.h | 205 + .../include/lwip/apps/mqtt_opts.h | 103 + .../include/lwip/apps/mqtt_priv.h | 104 + .../include/lwip/apps/netbiosns.h | 51 + .../include/lwip/apps/netbiosns_opts.h | 66 + .../bsp/microblaze_0/include/lwip/apps/smtp.h | 128 + .../include/lwip/apps/smtp_opts.h | 80 + .../bsp/microblaze_0/include/lwip/apps/snmp.h | 135 + .../include/lwip/apps/snmp_core.h | 377 + .../include/lwip/apps/snmp_mib2.h | 78 + .../include/lwip/apps/snmp_opts.h | 297 + .../include/lwip/apps/snmp_scalar.h | 113 + .../include/lwip/apps/snmp_snmpv2_framework.h | 32 + .../include/lwip/apps/snmp_snmpv2_usm.h | 24 + .../include/lwip/apps/snmp_table.h | 134 + .../include/lwip/apps/snmp_threadsync.h | 114 + .../microblaze_0/include/lwip/apps/snmpv3.h | 114 + .../bsp/microblaze_0/include/lwip/apps/sntp.h | 80 + .../include/lwip/apps/sntp_opts.h | 209 + .../include/lwip/apps/tftp_opts.h | 106 + .../include/lwip/apps/tftp_server.h | 95 + .../bsp/microblaze_0/include/lwip/arch.h | 393 + .../bsp/microblaze_0/include/lwip/autoip.h | 99 + .../bsp/microblaze_0/include/lwip/debug.h | 161 + .../bsp/microblaze_0/include/lwip/def.h | 152 + .../bsp/microblaze_0/include/lwip/dhcp.h | 139 + .../bsp/microblaze_0/include/lwip/dhcp6.h | 104 + .../bsp/microblaze_0/include/lwip/dns.h | 131 + .../bsp/microblaze_0/include/lwip/err.h | 117 + .../bsp/microblaze_0/include/lwip/errno.h | 198 + .../bsp/microblaze_0/include/lwip/etharp.h | 105 + .../bsp/microblaze_0/include/lwip/ethip6.h | 68 + .../bsp/microblaze_0/include/lwip/icmp.h | 110 + .../bsp/microblaze_0/include/lwip/icmp6.h | 72 + .../bsp/microblaze_0/include/lwip/if_api.h | 68 + .../bsp/microblaze_0/include/lwip/igmp.h | 115 + .../bsp/microblaze_0/include/lwip/inet.h | 169 + .../microblaze_0/include/lwip/inet_chksum.h | 104 + .../bsp/microblaze_0/include/lwip/init.h | 100 + .../microblaze_0/include/lwip/init.h.cmake.in | 100 + .../bsp/microblaze_0/include/lwip/ip.h | 328 + .../bsp/microblaze_0/include/lwip/ip4.h | 109 + .../bsp/microblaze_0/include/lwip/ip4_addr.h | 216 + .../bsp/microblaze_0/include/lwip/ip4_frag.h | 100 + .../bsp/microblaze_0/include/lwip/ip6.h | 93 + .../bsp/microblaze_0/include/lwip/ip6_addr.h | 352 + .../bsp/microblaze_0/include/lwip/ip6_frag.h | 144 + .../bsp/microblaze_0/include/lwip/ip6_zone.h | 304 + .../bsp/microblaze_0/include/lwip/ip_addr.h | 438 + .../bsp/microblaze_0/include/lwip/mem.h | 82 + .../bsp/microblaze_0/include/lwip/memp.h | 155 + .../bsp/microblaze_0/include/lwip/mld6.h | 99 + .../bsp/microblaze_0/include/lwip/nd6.h | 90 + .../bsp/microblaze_0/include/lwip/netbuf.h | 121 + .../bsp/microblaze_0/include/lwip/netdb.h | 150 + .../bsp/microblaze_0/include/lwip/netif.h | 682 + .../bsp/microblaze_0/include/lwip/netifapi.h | 161 + .../bsp/microblaze_0/include/lwip/opt.h | 3523 +++ .../bsp/microblaze_0/include/lwip/pbuf.h | 322 + .../include/lwip/priv/altcp_priv.h | 146 + .../microblaze_0/include/lwip/priv/api_msg.h | 272 + .../microblaze_0/include/lwip/priv/mem_priv.h | 84 + .../include/lwip/priv/memp_priv.h | 161 + .../microblaze_0/include/lwip/priv/memp_std.h | 153 + .../microblaze_0/include/lwip/priv/nd6_priv.h | 142 + .../microblaze_0/include/lwip/priv/raw_priv.h | 69 + .../include/lwip/priv/sockets_priv.h | 175 + .../microblaze_0/include/lwip/priv/tcp_priv.h | 523 + .../include/lwip/priv/tcpip_priv.h | 170 + .../microblaze_0/include/lwip/prot/autoip.h | 78 + .../bsp/microblaze_0/include/lwip/prot/dhcp.h | 178 + .../microblaze_0/include/lwip/prot/dhcp6.h | 138 + .../bsp/microblaze_0/include/lwip/prot/dns.h | 140 + .../microblaze_0/include/lwip/prot/etharp.h | 127 + .../microblaze_0/include/lwip/prot/ethernet.h | 135 + .../bsp/microblaze_0/include/lwip/prot/iana.h | 97 + .../bsp/microblaze_0/include/lwip/prot/icmp.h | 91 + .../microblaze_0/include/lwip/prot/icmp6.h | 170 + .../bsp/microblaze_0/include/lwip/prot/ieee.h | 91 + .../bsp/microblaze_0/include/lwip/prot/igmp.h | 90 + .../bsp/microblaze_0/include/lwip/prot/ip.h | 59 + .../bsp/microblaze_0/include/lwip/prot/ip4.h | 131 + .../bsp/microblaze_0/include/lwip/prot/ip6.h | 233 + .../bsp/microblaze_0/include/lwip/prot/mld6.h | 71 + .../bsp/microblaze_0/include/lwip/prot/nd6.h | 274 + .../bsp/microblaze_0/include/lwip/prot/tcp.h | 100 + .../bsp/microblaze_0/include/lwip/prot/udp.h | 68 + .../bsp/microblaze_0/include/lwip/raw.h | 143 + .../bsp/microblaze_0/include/lwip/sio.h | 142 + .../bsp/microblaze_0/include/lwip/snmp.h | 213 + .../bsp/microblaze_0/include/lwip/sockets.h | 693 + .../bsp/microblaze_0/include/lwip/stats.h | 491 + .../bsp/microblaze_0/include/lwip/sys.h | 578 + .../bsp/microblaze_0/include/lwip/tcp.h | 500 + .../bsp/microblaze_0/include/lwip/tcpbase.h | 88 + .../bsp/microblaze_0/include/lwip/tcpip.h | 113 + .../bsp/microblaze_0/include/lwip/timeouts.h | 128 + .../bsp/microblaze_0/include/lwip/udp.h | 209 + .../bsp/microblaze_0/include/lwipopts.h | 126 + .../bsp/microblaze_0/include/mb_interface.h | 459 + .../microblaze_0/include/mblaze_nt_types.h | 28 + .../bsp/microblaze_0/include/message_buffer.h | 823 + .../include/microblaze_exceptions_g.h | 18 + .../include/microblaze_exceptions_i.h | 73 + .../include/microblaze_instructions.h | 149 + .../include/microblaze_interrupts_i.h | 63 + .../microblaze_0/include/microblaze_sleep.h | 130 + .../bsp/microblaze_0/include/mpu_prototypes.h | 260 + .../bsp/microblaze_0/include/mpu_wrappers.h | 217 + .../bsp/microblaze_0/include/netif/bridgeif.h | 127 + .../include/netif/bridgeif_opts.h | 90 + .../bsp/microblaze_0/include/netif/etharp.h | 3 + .../bsp/microblaze_0/include/netif/ethernet.h | 77 + .../microblaze_0/include/netif/ieee802154.h | 112 + .../bsp/microblaze_0/include/netif/lowpan6.h | 89 + .../microblaze_0/include/netif/lowpan6_ble.h | 78 + .../include/netif/lowpan6_common.h | 82 + .../microblaze_0/include/netif/lowpan6_opts.h | 122 + .../bsp/microblaze_0/include/netif/ppp/ccp.h | 164 + .../microblaze_0/include/netif/ppp/chap-md5.h | 36 + .../microblaze_0/include/netif/ppp/chap-new.h | 200 + .../microblaze_0/include/netif/ppp/chap_ms.h | 44 + .../bsp/microblaze_0/include/netif/ppp/eap.h | 169 + .../bsp/microblaze_0/include/netif/ppp/ecp.h | 62 + .../microblaze_0/include/netif/ppp/eui64.h | 102 + .../bsp/microblaze_0/include/netif/ppp/fsm.h | 182 + .../bsp/microblaze_0/include/netif/ppp/ipcp.h | 134 + .../microblaze_0/include/netif/ppp/ipv6cp.h | 191 + .../bsp/microblaze_0/include/netif/ppp/lcp.h | 179 + .../microblaze_0/include/netif/ppp/magic.h | 130 + .../bsp/microblaze_0/include/netif/ppp/mppe.h | 181 + .../include/netif/ppp/polarssl/arc4.h | 81 + .../include/netif/ppp/polarssl/des.h | 92 + .../include/netif/ppp/polarssl/md4.h | 97 + .../include/netif/ppp/polarssl/md5.h | 96 + .../include/netif/ppp/polarssl/sha1.h | 96 + .../bsp/microblaze_0/include/netif/ppp/ppp.h | 698 + .../microblaze_0/include/netif/ppp/ppp_impl.h | 722 + .../microblaze_0/include/netif/ppp/ppp_opts.h | 610 + .../microblaze_0/include/netif/ppp/pppapi.h | 137 + .../microblaze_0/include/netif/ppp/pppcrypt.h | 144 + .../microblaze_0/include/netif/ppp/pppdebug.h | 88 + .../microblaze_0/include/netif/ppp/pppoe.h | 187 + .../microblaze_0/include/netif/ppp/pppol2tp.h | 209 + .../microblaze_0/include/netif/ppp/pppos.h | 126 + .../bsp/microblaze_0/include/netif/ppp/upap.h | 131 + .../bsp/microblaze_0/include/netif/ppp/vj.h | 169 + .../bsp/microblaze_0/include/netif/slipif.h | 86 + .../bsp/microblaze_0/include/netif/xadapter.h | 87 + .../microblaze_0/include/netif/xaxiemacif.h | 134 + .../microblaze_0/include/netif/xemacliteif.h | 65 + .../microblaze_0/include/netif/xemacpsif.h | 166 + .../microblaze_0/include/netif/xlltemacif.h | 92 + .../bsp/microblaze_0/include/netif/xpqueue.h | 56 + .../microblaze_0/include/netif/xtopology.h | 60 + .../bsp/microblaze_0/include/netif/zepif.h | 81 + .../bsp/microblaze_0/include/portable.h | 223 + .../bsp/microblaze_0/include/portmacro.h | 409 + .../bsp/microblaze_0/include/profile.h | 105 + .../bsp/microblaze_0/include/projdefs.h | 122 + .../bsp/microblaze_0/include/pvr.h | 524 + .../bsp/microblaze_0/include/queue.h | 1722 ++ .../bsp/microblaze_0/include/semphr.h | 1189 + .../bsp/microblaze_0/include/sleep.h | 105 + .../bsp/microblaze_0/include/stack_macros.h | 137 + .../bsp/microblaze_0/include/stream_buffer.h | 869 + .../bsp/microblaze_0/include/task.h | 3112 ++ .../bsp/microblaze_0/include/timers.h | 1355 + .../bsp/microblaze_0/include/xaxidma.h | 743 + .../bsp/microblaze_0/include/xaxidma_bd.h | 674 + .../bsp/microblaze_0/include/xaxidma_bdring.h | 556 + .../bsp/microblaze_0/include/xaxidma_hw.h | 320 + .../include/xaxidma_porting_guide.h | 228 + .../bsp/microblaze_0/include/xaxiethernet.h | 1526 + .../microblaze_0/include/xaxiethernet_hw.h | 935 + .../include/xaxiethernet_porting_guide.h | 157 + .../bsp/microblaze_0/include/xbasic_types.h | 113 + .../bsp/microblaze_0/include/xbram.h | 204 + .../bsp/microblaze_0/include/xbram_hw.h | 383 + .../bsp/microblaze_0/include/xdebug.h | 73 + .../bsp/microblaze_0/include/xenv.h | 169 + .../microblaze_0/include/xenv_standalone.h | 350 + .../bsp/microblaze_0/include/xil_assert.h | 176 + .../bsp/microblaze_0/include/xil_cache.h | 392 + .../microblaze_0/include/xil_cache_vxworks.h | 74 + .../bsp/microblaze_0/include/xil_clocking.h | 65 + .../bsp/microblaze_0/include/xil_exception.h | 112 + .../bsp/microblaze_0/include/xil_hal.h | 43 + .../bsp/microblaze_0/include/xil_io.h | 412 + .../bsp/microblaze_0/include/xil_macroback.h | 1112 + .../bsp/microblaze_0/include/xil_mem.h | 47 + .../include/xil_misc_psreset_api.h | 257 + .../bsp/microblaze_0/include/xil_printf.h | 53 + .../bsp/microblaze_0/include/xil_testcache.h | 54 + .../bsp/microblaze_0/include/xil_testio.h | 76 + .../bsp/microblaze_0/include/xil_testmem.h | 165 + .../bsp/microblaze_0/include/xil_types.h | 211 + .../bsp/microblaze_0/include/xil_util.h | 240 + .../bsp/microblaze_0/include/xintc.h | 370 + .../bsp/microblaze_0/include/xintc_i.h | 67 + .../bsp/microblaze_0/include/xintc_l.h | 312 + .../microblaze_0/include/xinterrupt_wrap.h | 76 + .../bsp/microblaze_0/include/xio.h | 252 + .../bsp/microblaze_0/include/xllfifo.h | 709 + .../bsp/microblaze_0/include/xllfifo_hw.h | 216 + .../bsp/microblaze_0/include/xlwipconfig.h | 47 + .../bsp/microblaze_0/include/xparameters.h | 1200 + .../bsp/microblaze_0/include/xplatform_info.h | 115 + .../bsp/microblaze_0/include/xspi.h | 844 + .../bsp/microblaze_0/include/xspi_i.h | 65 + .../bsp/microblaze_0/include/xspi_l.h | 340 + .../bsp/microblaze_0/include/xstatus.h | 522 + .../bsp/microblaze_0/include/xstreamer.h | 308 + .../bsp/microblaze_0/include/xsysmon.h | 640 + .../bsp/microblaze_0/include/xsysmon_hw.h | 664 + .../bsp/microblaze_0/include/xtmrctr.h | 313 + .../bsp/microblaze_0/include/xtmrctr_i.h | 54 + .../bsp/microblaze_0/include/xtmrctr_l.h | 415 + .../bsp/microblaze_0/include/xuartlite.h | 274 + .../bsp/microblaze_0/include/xuartlite_i.h | 100 + .../bsp/microblaze_0/include/xuartlite_l.h | 310 + .../bsp/microblaze_0/lib/libc.a | Bin 0 -> 1086530 bytes .../bsp/microblaze_0/lib/libfreertos.a | Bin 0 -> 463074 bytes .../bsp/microblaze_0/lib/libgcc.a | Bin 0 -> 179550 bytes .../bsp/microblaze_0/lib/libgloss.a | Bin 0 -> 115770 bytes .../bsp/microblaze_0/lib/liblwip4.a | Bin 0 -> 1600894 bytes .../bsp/microblaze_0/lib/libm.a | Bin 0 -> 540300 bytes .../bsp/microblaze_0/lib/libxil.a | Bin 0 -> 1251548 bytes .../libsrc/axidma_v9_15/src/Makefile | 39 + .../libsrc/axidma_v9_15/src/xaxidma.c | 965 + .../libsrc/axidma_v9_15/src/xaxidma.h | 743 + .../libsrc/axidma_v9_15/src/xaxidma_bd.c | 324 + .../libsrc/axidma_v9_15/src/xaxidma_bd.h | 674 + .../libsrc/axidma_v9_15/src/xaxidma_bdring.c | 1593 + .../libsrc/axidma_v9_15/src/xaxidma_bdring.h | 556 + .../libsrc/axidma_v9_15/src/xaxidma_g.c | 46 + .../libsrc/axidma_v9_15/src/xaxidma_hw.h | 320 + .../axidma_v9_15/src/xaxidma_porting_guide.h | 228 + .../axidma_v9_15/src/xaxidma_selftest.c | 89 + .../libsrc/axidma_v9_15/src/xaxidma_sinit.c | 104 + .../libsrc/axiethernet_v5_14/src/Makefile | 39 + .../axiethernet_v5_14/src/xaxiethernet.c | 1810 ++ .../axiethernet_v5_14/src/xaxiethernet.h | 1526 + .../src/xaxiethernet_control.c | 1691 ++ .../axiethernet_v5_14/src/xaxiethernet_g.c | 88 + .../axiethernet_v5_14/src/xaxiethernet_hw.h | 935 + .../src/xaxiethernet_porting_guide.h | 157 + .../src/xaxiethernet_sinit.c | 73 + .../libsrc/bram_v4_8/src/Makefile | 39 + .../microblaze_0/libsrc/bram_v4_8/src/xbram.c | 123 + .../microblaze_0/libsrc/bram_v4_8/src/xbram.h | 204 + .../libsrc/bram_v4_8/src/xbram_g.c | 141 + .../libsrc/bram_v4_8/src/xbram_hw.h | 383 + .../libsrc/bram_v4_8/src/xbram_intr.c | 212 + .../libsrc/bram_v4_8/src/xbram_selftest.c | 497 + .../libsrc/bram_v4_8/src/xbram_sinit.c | 79 + .../libsrc/cpu_v2_16/src/Makefile | 39 + .../microblaze_0/libsrc/cpu_v2_16/src/xio.c | 204 + .../microblaze_0/libsrc/cpu_v2_16/src/xio.h | 252 + .../freertos10_xilinx_v1_12/src/FreeRTOS.h | 1362 + .../src/FreeRTOSConfig.h | 145 + .../src/FreeRTOSSTMTrace.h | 698 + .../src/License/LICENSE.md | 19 + .../freertos10_xilinx_v1_12/src/Makefile | 127 + .../freertos10_xilinx_v1_12/src/Makefile_dep | 127 + .../src/Makefile_microblaze | 127 + .../src/Makefile_ps7_cortexa9 | 125 + .../src/Makefile_psu_cortexa53 | 132 + .../src/Makefile_psu_cortexr5 | 136 + .../src/Source/croutine.c | 363 + .../src/Source/event_groups.c | 777 + .../src/Source/include/FreeRTOS.h | 1362 + .../src/Source/include/StackMacros.h | 34 + .../src/Source/include/atomic.h | 419 + .../src/Source/include/croutine.h | 753 + .../Source/include/deprecated_definitions.h | 281 + .../src/Source/include/event_groups.h | 777 + .../src/Source/include/list.h | 499 + .../src/Source/include/message_buffer.h | 823 + .../src/Source/include/mpu_prototypes.h | 260 + .../src/Source/include/mpu_wrappers.h | 217 + .../src/Source/include/portable.h | 223 + .../src/Source/include/projdefs.h | 122 + .../src/Source/include/queue.h | 1722 ++ .../src/Source/include/semphr.h | 1189 + .../src/Source/include/stack_macros.h | 137 + .../src/Source/include/stdint.readme | 58 + .../src/Source/include/stream_buffer.h | 869 + .../src/Source/include/task.h | 3112 ++ .../src/Source/include/timers.h | 1355 + .../freertos10_xilinx_v1_12/src/Source/list.c | 215 + .../src/Source/portable/GCC/ARM_CA53/port.c | 844 + .../Source/portable/GCC/ARM_CA53/portASM.S | 484 + .../GCC/ARM_CA53/portZynqUltrascale.c | 310 + .../portable/GCC/ARM_CA53/port_asm_vectors.S | 292 + .../Source/portable/GCC/ARM_CA53/portmacro.h | 315 + .../src/Source/portable/GCC/ARM_CA9/port.c | 726 + .../src/Source/portable/GCC/ARM_CA9/portASM.S | 324 + .../portable/GCC/ARM_CA9/portZynq7000.c | 324 + .../portable/GCC/ARM_CA9/port_asm_vectors.S | 142 + .../Source/portable/GCC/ARM_CA9/portmacro.h | 254 + .../src/Source/portable/GCC/ARM_CR5/port.c | 800 + .../src/Source/portable/GCC/ARM_CR5/portASM.S | 295 + .../portable/GCC/ARM_CR5/portZynqUltrascale.c | 327 + .../portable/GCC/ARM_CR5/port_asm_vectors.S | 89 + .../Source/portable/GCC/ARM_CR5/portmacro.h | 254 + .../Source/portable/GCC/MicroBlazeV9/port.c | 576 + .../GCC/MicroBlazeV9/port_exceptions.c | 280 + .../portable/GCC/MicroBlazeV9/portasm.S | 400 + .../portable/GCC/MicroBlazeV9/portmacro.h | 409 + .../GCC/MicroBlazeV9/portmicroblaze.c | 414 + .../src/Source/portable/MemMang/ReadMe.url | 5 + .../src/Source/portable/MemMang/heap_1.c | 153 + .../src/Source/portable/MemMang/heap_2.c | 286 + .../src/Source/portable/MemMang/heap_3.c | 95 + .../src/Source/portable/MemMang/heap_4.c | 504 + .../src/Source/portable/MemMang/heap_5.c | 559 + .../src/Source/queue.c | 3075 ++ .../src/Source/readme.txt | 17 + .../src/Source/stream_buffer.c | 1307 + .../src/Source/tasks.c | 5442 ++++ .../src/Source/timers.c | 1119 + .../freertos10_xilinx_v1_12/src/StackMacros.h | 34 + .../freertos10_xilinx_v1_12/src/atomic.h | 419 + .../freertos10_xilinx_v1_12/src/croutine.h | 753 + .../src/deprecated_definitions.h | 281 + .../src/event_groups.c | 777 + .../src/event_groups.h | 777 + .../freertos10_xilinx_v1_12/src/heap_4.c | 504 + .../freertos10_xilinx_v1_12/src/inbyte.c | 14 + .../libsrc/freertos10_xilinx_v1_12/src/list.c | 215 + .../libsrc/freertos10_xilinx_v1_12/src/list.h | 499 + .../src/message_buffer.h | 823 + .../src/microblaze_exceptions_g.h | 18 + .../src/mpu_prototypes.h | 260 + .../src/mpu_wrappers.h | 217 + .../freertos10_xilinx_v1_12/src/outbyte.c | 15 + .../libsrc/freertos10_xilinx_v1_12/src/port.c | 576 + .../src/port_exceptions.c | 280 + .../freertos10_xilinx_v1_12/src/portable.h | 223 + .../freertos10_xilinx_v1_12/src/portasm.S | 400 + .../freertos10_xilinx_v1_12/src/portmacro.h | 409 + .../src/portmicroblaze.c | 414 + .../freertos10_xilinx_v1_12/src/projdefs.h | 122 + .../freertos10_xilinx_v1_12/src/queue.c | 3075 ++ .../freertos10_xilinx_v1_12/src/queue.h | 1722 ++ .../freertos10_xilinx_v1_12/src/semphr.h | 1189 + .../src/stack_macros.h | 137 + .../src/stream_buffer.h | 869 + .../libsrc/freertos10_xilinx_v1_12/src/task.h | 3112 ++ .../freertos10_xilinx_v1_12/src/tasks.c | 5442 ++++ .../freertos10_xilinx_v1_12/src/timers.c | 1119 + .../freertos10_xilinx_v1_12/src/timers.h | 1355 + .../libsrc/intc_v3_15/src/Makefile | 39 + .../libsrc/intc_v3_15/src/xintc.c | 1229 + .../libsrc/intc_v3_15/src/xintc.h | 370 + .../libsrc/intc_v3_15/src/xintc_g.c | 95 + .../libsrc/intc_v3_15/src/xintc_i.h | 67 + .../libsrc/intc_v3_15/src/xintc_intr.c | 152 + .../libsrc/intc_v3_15/src/xintc_l.c | 699 + .../libsrc/intc_v3_15/src/xintc_l.h | 312 + .../libsrc/intc_v3_15/src/xintc_options.c | 123 + .../libsrc/intc_v3_15/src/xintc_selftest.c | 235 + .../libsrc/llfifo_v5_5/src/Makefile | 39 + .../libsrc/llfifo_v5_5/src/xllfifo.c | 473 + .../libsrc/llfifo_v5_5/src/xllfifo.h | 709 + .../libsrc/llfifo_v5_5/src/xllfifo_g.c | 32 + .../libsrc/llfifo_v5_5/src/xllfifo_hw.h | 216 + .../libsrc/llfifo_v5_5/src/xllfifo_sinit.c | 62 + .../libsrc/llfifo_v5_5/src/xstreamer.c | 493 + .../libsrc/llfifo_v5_5/src/xstreamer.h | 308 + .../libsrc/lwip211_v1_8/src/ChangeLog | 474 + .../libsrc/lwip211_v1_8/src/Makefile | 55 + .../libsrc/lwip211_v1_8/src/Makefile.adapter | 82 + .../libsrc/lwip211_v1_8/src/Makefile.config | 5 + .../libsrc/lwip211_v1_8/src/Makefile.lwip | 140 + .../contrib/ports/xilinx/include/arch/cc.h | 82 + .../contrib/ports/xilinx/include/arch/cpu.h | 48 + .../contrib/ports/xilinx/include/arch/perf.h | 51 + .../ports/xilinx/include/arch/sys_arch.h | 73 + .../contrib/ports/xilinx/include/lwipopts.h | 126 + .../ports/xilinx/include/netif/xadapter.h | 87 + .../ports/xilinx/include/netif/xaxiemacif.h | 134 + .../ports/xilinx/include/netif/xemacliteif.h | 65 + .../ports/xilinx/include/netif/xemacpsif.h | 166 + .../ports/xilinx/include/netif/xlltemacif.h | 92 + .../ports/xilinx/include/netif/xpqueue.h | 56 + .../ports/xilinx/include/netif/xtopology.h | 60 + .../ports/xilinx/include/xlwipconfig.h | 47 + .../src/contrib/ports/xilinx/netif/xadapter.c | 427 + .../contrib/ports/xilinx/netif/xaxiemacif.c | 747 + .../ports/xilinx/netif/xaxiemacif_dma.c | 958 + .../ports/xilinx/netif/xaxiemacif_fifo.c | 365 + .../ports/xilinx/netif/xaxiemacif_fifo.h | 49 + .../ports/xilinx/netif/xaxiemacif_hw.c | 124 + .../ports/xilinx/netif/xaxiemacif_hw.h | 49 + .../ports/xilinx/netif/xaxiemacif_mcdma.c | 838 + .../ports/xilinx/netif/xaxiemacif_physpeed.c | 779 + .../ports/xilinx/netif/xemac_ieee_reg.h | 101 + .../contrib/ports/xilinx/netif/xemacliteif.c | 854 + .../contrib/ports/xilinx/netif/xemacpsif.c | 795 + .../ports/xilinx/netif/xemacpsif_dma.c | 930 + .../contrib/ports/xilinx/netif/xemacpsif_hw.c | 276 + .../contrib/ports/xilinx/netif/xemacpsif_hw.h | 49 + .../ports/xilinx/netif/xemacpsif_physpeed.c | 1037 + .../src/contrib/ports/xilinx/netif/xpqueue.c | 92 + .../contrib/ports/xilinx/netif/xtopology_g.c | 15 + .../src/contrib/ports/xilinx/sys_arch.c | 621 + .../src/contrib/ports/xilinx/sys_arch_raw.c | 84 + .../lwip211_v1_8/src/lwip-2.1.1/CHANGELOG | 4532 +++ .../src/lwip-2.1.1/CMakeLists.txt | 20 + .../lwip211_v1_8/src/lwip-2.1.1/COPYING | 31 + .../lwip211_v1_8/src/lwip-2.1.1/FEATURES | 11 + .../libsrc/lwip211_v1_8/src/lwip-2.1.1/FILES | 5 + .../libsrc/lwip211_v1_8/src/lwip-2.1.1/README | 106 + .../lwip211_v1_8/src/lwip-2.1.1/UPGRADING | 278 + .../lwip211_v1_8/src/lwip-2.1.1/src/FILES | 15 + .../src/lwip-2.1.1/src/Filelists.cmake | 279 + .../src/lwip-2.1.1/src/Filelists.mk | 205 + .../src/lwip-2.1.1/src/api/api_lib.c | 1367 + .../src/lwip-2.1.1/src/api/api_msg.c | 2183 ++ .../lwip211_v1_8/src/lwip-2.1.1/src/api/err.c | 115 + .../src/lwip-2.1.1/src/api/if_api.c | 102 + .../src/lwip-2.1.1/src/api/netbuf.c | 250 + .../src/lwip-2.1.1/src/api/netdb.c | 414 + .../src/lwip-2.1.1/src/api/netifapi.c | 380 + .../src/lwip-2.1.1/src/api/sockets.c | 4191 +++ .../src/lwip-2.1.1/src/api/tcpip.c | 662 + .../src/apps/altcp_tls/altcp_tls_mbedtls.c | 1178 + .../apps/altcp_tls/altcp_tls_mbedtls_mem.c | 210 + .../apps/altcp_tls/altcp_tls_mbedtls_mem.h | 72 + .../altcp_tls/altcp_tls_mbedtls_structs.h | 83 + .../src/apps/http/altcp_proxyconnect.c | 584 + .../src/lwip-2.1.1/src/apps/http/fs.c | 174 + .../src/lwip-2.1.1/src/apps/http/fs/404.html | 21 + .../lwip-2.1.1/src/apps/http/fs/img/sics.gif | Bin 0 -> 724 bytes .../lwip-2.1.1/src/apps/http/fs/index.html | 46 + .../src/lwip-2.1.1/src/apps/http/fsdata.c | 336 + .../src/lwip-2.1.1/src/apps/http/fsdata.h | 41 + .../lwip-2.1.1/src/apps/http/http_client.c | 909 + .../src/lwip-2.1.1/src/apps/http/httpd.c | 2746 ++ .../lwip-2.1.1/src/apps/http/httpd_structs.h | 123 + .../src/apps/http/makefsdata/makefsdata | 97 + .../src/apps/http/makefsdata/makefsdata.c | 1251 + .../src/apps/http/makefsdata/readme.txt | 13 + .../src/apps/http/makefsdata/tinydir.h | 808 + .../src/lwip-2.1.1/src/apps/lwiperf/lwiperf.c | 841 + .../src/lwip-2.1.1/src/apps/mdns/mdns.c | 2407 ++ .../src/lwip-2.1.1/src/apps/mqtt/mqtt.c | 1463 + .../lwip-2.1.1/src/apps/netbiosns/netbiosns.c | 517 + .../src/lwip-2.1.1/src/apps/smtp/smtp.c | 1556 + .../src/lwip-2.1.1/src/apps/snmp/snmp_asn1.c | 704 + .../src/lwip-2.1.1/src/apps/snmp/snmp_asn1.h | 113 + .../src/lwip-2.1.1/src/apps/snmp/snmp_core.c | 1353 + .../lwip-2.1.1/src/apps/snmp/snmp_core_priv.h | 83 + .../src/lwip-2.1.1/src/apps/snmp/snmp_mib2.c | 116 + .../lwip-2.1.1/src/apps/snmp/snmp_mib2_icmp.c | 182 + .../src/apps/snmp/snmp_mib2_interfaces.c | 368 + .../lwip-2.1.1/src/apps/snmp/snmp_mib2_ip.c | 731 + .../lwip-2.1.1/src/apps/snmp/snmp_mib2_snmp.c | 227 + .../src/apps/snmp/snmp_mib2_system.c | 376 + .../lwip-2.1.1/src/apps/snmp/snmp_mib2_tcp.c | 607 + .../lwip-2.1.1/src/apps/snmp/snmp_mib2_udp.c | 372 + .../src/lwip-2.1.1/src/apps/snmp/snmp_msg.c | 1951 ++ .../src/lwip-2.1.1/src/apps/snmp/snmp_msg.h | 185 + .../lwip-2.1.1/src/apps/snmp/snmp_netconn.c | 123 + .../src/apps/snmp/snmp_pbuf_stream.c | 156 + .../src/apps/snmp/snmp_pbuf_stream.h | 72 + .../src/lwip-2.1.1/src/apps/snmp/snmp_raw.c | 103 + .../lwip-2.1.1/src/apps/snmp/snmp_scalar.c | 232 + .../src/apps/snmp/snmp_snmpv2_framework.c | 90 + .../src/apps/snmp/snmp_snmpv2_usm.c | 410 + .../src/lwip-2.1.1/src/apps/snmp/snmp_table.c | 342 + .../src/apps/snmp/snmp_threadsync.c | 231 + .../src/lwip-2.1.1/src/apps/snmp/snmp_traps.c | 458 + .../src/lwip-2.1.1/src/apps/snmp/snmpv3.c | 136 + .../lwip-2.1.1/src/apps/snmp/snmpv3_mbedtls.c | 342 + .../lwip-2.1.1/src/apps/snmp/snmpv3_priv.h | 69 + .../src/lwip-2.1.1/src/apps/sntp/sntp.c | 869 + .../lwip-2.1.1/src/apps/tftp/tftp_server.c | 435 + .../src/lwip-2.1.1/src/core/altcp.c | 681 + .../src/lwip-2.1.1/src/core/altcp_alloc.c | 87 + .../src/lwip-2.1.1/src/core/altcp_tcp.c | 543 + .../src/lwip-2.1.1/src/core/def.c | 240 + .../src/lwip-2.1.1/src/core/dns.c | 1631 + .../src/lwip-2.1.1/src/core/inet_chksum.c | 608 + .../src/lwip-2.1.1/src/core/init.c | 419 + .../lwip211_v1_8/src/lwip-2.1.1/src/core/ip.c | 167 + .../src/lwip-2.1.1/src/core/ipv4/autoip.c | 527 + .../src/lwip-2.1.1/src/core/ipv4/dhcp.c | 1990 ++ .../src/lwip-2.1.1/src/core/ipv4/etharp.c | 1204 + .../src/lwip-2.1.1/src/core/ipv4/icmp.c | 404 + .../src/lwip-2.1.1/src/core/ipv4/igmp.c | 801 + .../src/lwip-2.1.1/src/core/ipv4/ip4.c | 1132 + .../src/lwip-2.1.1/src/core/ipv4/ip4_addr.c | 321 + .../src/lwip-2.1.1/src/core/ipv4/ip4_frag.c | 894 + .../src/lwip-2.1.1/src/core/ipv6/dhcp6.c | 812 + .../src/lwip-2.1.1/src/core/ipv6/ethip6.c | 123 + .../src/lwip-2.1.1/src/core/ipv6/icmp6.c | 425 + .../src/lwip-2.1.1/src/core/ipv6/inet6.c | 53 + .../src/lwip-2.1.1/src/core/ipv6/ip6.c | 1492 + .../src/lwip-2.1.1/src/core/ipv6/ip6_addr.c | 343 + .../src/lwip-2.1.1/src/core/ipv6/ip6_frag.c | 862 + .../src/lwip-2.1.1/src/core/ipv6/mld6.c | 626 + .../src/lwip-2.1.1/src/core/ipv6/nd6.c | 2434 ++ .../src/lwip-2.1.1/src/core/mem.c | 1018 + .../src/lwip-2.1.1/src/core/memp.c | 447 + .../src/lwip-2.1.1/src/core/netif.c | 1795 ++ .../src/lwip-2.1.1/src/core/pbuf.c | 1514 + .../src/lwip-2.1.1/src/core/raw.c | 671 + .../src/lwip-2.1.1/src/core/stats.c | 168 + .../src/lwip-2.1.1/src/core/sys.c | 148 + .../src/lwip-2.1.1/src/core/tcp.c | 2696 ++ .../src/lwip-2.1.1/src/core/tcp_in.c | 2178 ++ .../src/lwip-2.1.1/src/core/tcp_out.c | 2195 ++ .../src/lwip-2.1.1/src/core/timeouts.c | 451 + .../src/lwip-2.1.1/src/core/udp.c | 1374 + .../src/include/compat/posix/arpa/inet.h | 33 + .../src/include/compat/posix/net/if.h | 36 + .../src/include/compat/posix/netdb.h | 33 + .../src/include/compat/posix/sys/socket.h | 33 + .../src/include/compat/stdc/errno.h | 33 + .../src/lwip-2.1.1/src/include/lwip/altcp.h | 201 + .../lwip-2.1.1/src/include/lwip/altcp_tcp.h | 72 + .../lwip-2.1.1/src/include/lwip/altcp_tls.h | 117 + .../src/lwip-2.1.1/src/include/lwip/api.h | 431 + .../lwip-2.1.1/src/include/lwip/apps/FILES | 2 + .../include/lwip/apps/altcp_proxyconnect.h | 79 + .../lwip/apps/altcp_tls_mbedtls_opts.h | 67 + .../src/lwip-2.1.1/src/include/lwip/apps/fs.h | 126 + .../src/include/lwip/apps/http_client.h | 160 + .../lwip-2.1.1/src/include/lwip/apps/httpd.h | 255 + .../src/include/lwip/apps/httpd_opts.h | 396 + .../src/include/lwip/apps/lwiperf.h | 100 + .../lwip-2.1.1/src/include/lwip/apps/mdns.h | 105 + .../src/include/lwip/apps/mdns_opts.h | 80 + .../src/include/lwip/apps/mdns_priv.h | 74 + .../lwip-2.1.1/src/include/lwip/apps/mqtt.h | 205 + .../src/include/lwip/apps/mqtt_opts.h | 103 + .../src/include/lwip/apps/mqtt_priv.h | 104 + .../src/include/lwip/apps/netbiosns.h | 51 + .../src/include/lwip/apps/netbiosns_opts.h | 66 + .../lwip-2.1.1/src/include/lwip/apps/smtp.h | 128 + .../src/include/lwip/apps/smtp_opts.h | 80 + .../lwip-2.1.1/src/include/lwip/apps/snmp.h | 135 + .../src/include/lwip/apps/snmp_core.h | 377 + .../src/include/lwip/apps/snmp_mib2.h | 78 + .../src/include/lwip/apps/snmp_opts.h | 297 + .../src/include/lwip/apps/snmp_scalar.h | 113 + .../include/lwip/apps/snmp_snmpv2_framework.h | 32 + .../src/include/lwip/apps/snmp_snmpv2_usm.h | 24 + .../src/include/lwip/apps/snmp_table.h | 134 + .../src/include/lwip/apps/snmp_threadsync.h | 114 + .../lwip-2.1.1/src/include/lwip/apps/snmpv3.h | 114 + .../lwip-2.1.1/src/include/lwip/apps/sntp.h | 80 + .../src/include/lwip/apps/sntp_opts.h | 209 + .../src/include/lwip/apps/tftp_opts.h | 106 + .../src/include/lwip/apps/tftp_server.h | 95 + .../src/lwip-2.1.1/src/include/lwip/arch.h | 393 + .../src/lwip-2.1.1/src/include/lwip/autoip.h | 99 + .../src/lwip-2.1.1/src/include/lwip/debug.h | 161 + .../src/lwip-2.1.1/src/include/lwip/def.h | 152 + .../src/lwip-2.1.1/src/include/lwip/dhcp.h | 139 + .../src/lwip-2.1.1/src/include/lwip/dhcp6.h | 104 + .../src/lwip-2.1.1/src/include/lwip/dns.h | 131 + .../src/lwip-2.1.1/src/include/lwip/err.h | 117 + .../src/lwip-2.1.1/src/include/lwip/errno.h | 198 + .../src/lwip-2.1.1/src/include/lwip/etharp.h | 105 + .../src/lwip-2.1.1/src/include/lwip/ethip6.h | 68 + .../src/lwip-2.1.1/src/include/lwip/icmp.h | 110 + .../src/lwip-2.1.1/src/include/lwip/icmp6.h | 72 + .../src/lwip-2.1.1/src/include/lwip/if_api.h | 68 + .../src/lwip-2.1.1/src/include/lwip/igmp.h | 115 + .../src/lwip-2.1.1/src/include/lwip/inet.h | 169 + .../lwip-2.1.1/src/include/lwip/inet_chksum.h | 104 + .../src/lwip-2.1.1/src/include/lwip/init.h | 100 + .../src/include/lwip/init.h.cmake.in | 100 + .../src/lwip-2.1.1/src/include/lwip/ip.h | 328 + .../src/lwip-2.1.1/src/include/lwip/ip4.h | 109 + .../lwip-2.1.1/src/include/lwip/ip4_addr.h | 216 + .../lwip-2.1.1/src/include/lwip/ip4_frag.h | 100 + .../src/lwip-2.1.1/src/include/lwip/ip6.h | 93 + .../lwip-2.1.1/src/include/lwip/ip6_addr.h | 352 + .../lwip-2.1.1/src/include/lwip/ip6_frag.h | 144 + .../lwip-2.1.1/src/include/lwip/ip6_zone.h | 304 + .../src/lwip-2.1.1/src/include/lwip/ip_addr.h | 438 + .../src/lwip-2.1.1/src/include/lwip/mem.h | 82 + .../src/lwip-2.1.1/src/include/lwip/memp.h | 155 + .../src/lwip-2.1.1/src/include/lwip/mld6.h | 99 + .../src/lwip-2.1.1/src/include/lwip/nd6.h | 90 + .../src/lwip-2.1.1/src/include/lwip/netbuf.h | 121 + .../src/lwip-2.1.1/src/include/lwip/netdb.h | 150 + .../src/lwip-2.1.1/src/include/lwip/netif.h | 682 + .../lwip-2.1.1/src/include/lwip/netifapi.h | 161 + .../src/lwip-2.1.1/src/include/lwip/opt.h | 3523 +++ .../src/lwip-2.1.1/src/include/lwip/pbuf.h | 322 + .../src/include/lwip/priv/altcp_priv.h | 146 + .../src/include/lwip/priv/api_msg.h | 272 + .../src/include/lwip/priv/mem_priv.h | 84 + .../src/include/lwip/priv/memp_priv.h | 161 + .../src/include/lwip/priv/memp_std.h | 153 + .../src/include/lwip/priv/nd6_priv.h | 142 + .../src/include/lwip/priv/raw_priv.h | 69 + .../src/include/lwip/priv/sockets_priv.h | 175 + .../src/include/lwip/priv/tcp_priv.h | 523 + .../src/include/lwip/priv/tcpip_priv.h | 170 + .../lwip-2.1.1/src/include/lwip/prot/autoip.h | 78 + .../lwip-2.1.1/src/include/lwip/prot/dhcp.h | 178 + .../lwip-2.1.1/src/include/lwip/prot/dhcp6.h | 138 + .../lwip-2.1.1/src/include/lwip/prot/dns.h | 140 + .../lwip-2.1.1/src/include/lwip/prot/etharp.h | 127 + .../src/include/lwip/prot/ethernet.h | 135 + .../lwip-2.1.1/src/include/lwip/prot/iana.h | 97 + .../lwip-2.1.1/src/include/lwip/prot/icmp.h | 91 + .../lwip-2.1.1/src/include/lwip/prot/icmp6.h | 170 + .../lwip-2.1.1/src/include/lwip/prot/ieee.h | 91 + .../lwip-2.1.1/src/include/lwip/prot/igmp.h | 90 + .../src/lwip-2.1.1/src/include/lwip/prot/ip.h | 59 + .../lwip-2.1.1/src/include/lwip/prot/ip4.h | 131 + .../lwip-2.1.1/src/include/lwip/prot/ip6.h | 233 + .../lwip-2.1.1/src/include/lwip/prot/mld6.h | 71 + .../lwip-2.1.1/src/include/lwip/prot/nd6.h | 274 + .../lwip-2.1.1/src/include/lwip/prot/tcp.h | 100 + .../lwip-2.1.1/src/include/lwip/prot/udp.h | 68 + .../src/lwip-2.1.1/src/include/lwip/raw.h | 143 + .../src/lwip-2.1.1/src/include/lwip/sio.h | 142 + .../src/lwip-2.1.1/src/include/lwip/snmp.h | 213 + .../src/lwip-2.1.1/src/include/lwip/sockets.h | 693 + .../src/lwip-2.1.1/src/include/lwip/stats.h | 491 + .../src/lwip-2.1.1/src/include/lwip/sys.h | 578 + .../src/lwip-2.1.1/src/include/lwip/tcp.h | 500 + .../src/lwip-2.1.1/src/include/lwip/tcpbase.h | 88 + .../src/lwip-2.1.1/src/include/lwip/tcpip.h | 113 + .../lwip-2.1.1/src/include/lwip/timeouts.h | 128 + .../src/lwip-2.1.1/src/include/lwip/udp.h | 209 + .../lwip-2.1.1/src/include/netif/bridgeif.h | 127 + .../src/include/netif/bridgeif_opts.h | 90 + .../src/lwip-2.1.1/src/include/netif/etharp.h | 3 + .../lwip-2.1.1/src/include/netif/ethernet.h | 77 + .../lwip-2.1.1/src/include/netif/ieee802154.h | 112 + .../lwip-2.1.1/src/include/netif/lowpan6.h | 89 + .../src/include/netif/lowpan6_ble.h | 78 + .../src/include/netif/lowpan6_common.h | 82 + .../src/include/netif/lowpan6_opts.h | 122 + .../lwip-2.1.1/src/include/netif/ppp/ccp.h | 164 + .../src/include/netif/ppp/chap-md5.h | 36 + .../src/include/netif/ppp/chap-new.h | 200 + .../src/include/netif/ppp/chap_ms.h | 44 + .../lwip-2.1.1/src/include/netif/ppp/eap.h | 169 + .../lwip-2.1.1/src/include/netif/ppp/ecp.h | 62 + .../lwip-2.1.1/src/include/netif/ppp/eui64.h | 102 + .../lwip-2.1.1/src/include/netif/ppp/fsm.h | 182 + .../lwip-2.1.1/src/include/netif/ppp/ipcp.h | 134 + .../lwip-2.1.1/src/include/netif/ppp/ipv6cp.h | 191 + .../lwip-2.1.1/src/include/netif/ppp/lcp.h | 179 + .../lwip-2.1.1/src/include/netif/ppp/magic.h | 130 + .../lwip-2.1.1/src/include/netif/ppp/mppe.h | 181 + .../src/include/netif/ppp/polarssl/arc4.h | 81 + .../src/include/netif/ppp/polarssl/des.h | 92 + .../src/include/netif/ppp/polarssl/md4.h | 97 + .../src/include/netif/ppp/polarssl/md5.h | 96 + .../src/include/netif/ppp/polarssl/sha1.h | 96 + .../lwip-2.1.1/src/include/netif/ppp/ppp.h | 698 + .../src/include/netif/ppp/ppp_impl.h | 722 + .../src/include/netif/ppp/ppp_opts.h | 610 + .../lwip-2.1.1/src/include/netif/ppp/pppapi.h | 137 + .../src/include/netif/ppp/pppcrypt.h | 144 + .../src/include/netif/ppp/pppdebug.h | 88 + .../lwip-2.1.1/src/include/netif/ppp/pppoe.h | 187 + .../src/include/netif/ppp/pppol2tp.h | 209 + .../lwip-2.1.1/src/include/netif/ppp/pppos.h | 126 + .../lwip-2.1.1/src/include/netif/ppp/upap.h | 131 + .../src/lwip-2.1.1/src/include/netif/ppp/vj.h | 169 + .../src/lwip-2.1.1/src/include/netif/slipif.h | 86 + .../src/lwip-2.1.1/src/include/netif/zepif.h | 81 + .../src/lwip-2.1.1/src/netif/FILES | 23 + .../src/lwip-2.1.1/src/netif/bridgeif.c | 563 + .../src/lwip-2.1.1/src/netif/bridgeif_fdb.c | 212 + .../src/lwip-2.1.1/src/netif/ethernet.c | 321 + .../src/lwip-2.1.1/src/netif/lowpan6.c | 920 + .../src/lwip-2.1.1/src/netif/lowpan6_ble.c | 447 + .../src/lwip-2.1.1/src/netif/lowpan6_common.c | 841 + .../lwip-2.1.1/src/netif/ppp/PPPD_FOLLOWUP | 473 + .../src/lwip-2.1.1/src/netif/ppp/auth.c | 2510 ++ .../src/lwip-2.1.1/src/netif/ppp/ccp.c | 1740 ++ .../src/lwip-2.1.1/src/netif/ppp/chap-md5.c | 126 + .../src/lwip-2.1.1/src/netif/ppp/chap-new.c | 677 + .../src/lwip-2.1.1/src/netif/ppp/chap_ms.c | 962 + .../src/lwip-2.1.1/src/netif/ppp/demand.c | 465 + .../src/lwip-2.1.1/src/netif/ppp/eap.c | 2423 ++ .../src/lwip-2.1.1/src/netif/ppp/ecp.c | 191 + .../src/lwip-2.1.1/src/netif/ppp/eui64.c | 56 + .../src/lwip-2.1.1/src/netif/ppp/fsm.c | 799 + .../src/lwip-2.1.1/src/netif/ppp/ipcp.c | 2418 ++ .../src/lwip-2.1.1/src/netif/ppp/ipv6cp.c | 1533 + .../src/lwip-2.1.1/src/netif/ppp/lcp.c | 2790 ++ .../src/lwip-2.1.1/src/netif/ppp/magic.c | 294 + .../src/lwip-2.1.1/src/netif/ppp/mppe.c | 412 + .../src/lwip-2.1.1/src/netif/ppp/multilink.c | 609 + .../lwip-2.1.1/src/netif/ppp/polarssl/README | 22 + .../lwip-2.1.1/src/netif/ppp/polarssl/arc4.c | 101 + .../lwip-2.1.1/src/netif/ppp/polarssl/des.c | 422 + .../lwip-2.1.1/src/netif/ppp/polarssl/md4.c | 281 + .../lwip-2.1.1/src/netif/ppp/polarssl/md5.c | 300 + .../lwip-2.1.1/src/netif/ppp/polarssl/sha1.c | 335 + .../src/lwip-2.1.1/src/netif/ppp/ppp.c | 1628 + .../src/lwip-2.1.1/src/netif/ppp/pppapi.c | 427 + .../src/lwip-2.1.1/src/netif/ppp/pppcrypt.c | 66 + .../src/lwip-2.1.1/src/netif/ppp/pppoe.c | 1201 + .../src/lwip-2.1.1/src/netif/ppp/pppol2tp.c | 1159 + .../src/lwip-2.1.1/src/netif/ppp/pppos.c | 895 + .../src/lwip-2.1.1/src/netif/ppp/upap.c | 677 + .../src/lwip-2.1.1/src/netif/ppp/utils.c | 957 + .../src/lwip-2.1.1/src/netif/ppp/vj.c | 685 + .../src/lwip-2.1.1/src/netif/slipif.c | 558 + .../src/lwip-2.1.1/src/netif/zepif.c | 300 + .../microblaze_0/libsrc/mig_v1_1/src/xmig.h | 20 + .../microblaze_0/libsrc/spi_v4_9/src/Makefile | 39 + .../microblaze_0/libsrc/spi_v4_9/src/xspi.c | 1369 + .../microblaze_0/libsrc/spi_v4_9/src/xspi.h | 844 + .../microblaze_0/libsrc/spi_v4_9/src/xspi_g.c | 68 + .../microblaze_0/libsrc/spi_v4_9/src/xspi_i.h | 65 + .../microblaze_0/libsrc/spi_v4_9/src/xspi_l.h | 340 + .../libsrc/spi_v4_9/src/xspi_options.c | 199 + .../libsrc/spi_v4_9/src/xspi_selftest.c | 337 + .../libsrc/spi_v4_9/src/xspi_sinit.c | 127 + .../libsrc/spi_v4_9/src/xspi_stats.c | 105 + .../standalone_v8_0/src/Makefile_depends | 86 + .../libsrc/standalone_v8_0/src/_exit.c | 20 + .../src/arm/ARMv8/32bit/gcc/Makefile | 79 + .../src/arm/ARMv8/32bit/gcc/asm_vectors.S | 154 + .../src/arm/ARMv8/32bit/gcc/boot.S | 277 + .../src/arm/ARMv8/32bit/gcc/cpu_init.S | 50 + .../src/arm/ARMv8/32bit/gcc/xil-crt0.S | 101 + .../32bit/platform/ZynqMP/CMakeLists.txt | 1 + .../32bit/platform/ZynqMP/translation_table.S | 155 + .../32bit/platform/ZynqMP/xparameters_ps.h | 323 + .../32bit/platform/versal/CMakeLists.txt | 1 + .../32bit/platform/versal/xparameters_ps.h | 285 + .../src/arm/ARMv8/32bit/sleep.c | 73 + .../src/arm/ARMv8/32bit/usleep.c | 85 + .../src/arm/ARMv8/32bit/xil_cache.c | 588 + .../src/arm/ARMv8/32bit/xil_cache.h | 60 + .../src/arm/ARMv8/32bit/xil_cache_l.h | 41 + .../src/arm/ARMv8/32bit/xil_mmu.c | 124 + .../src/arm/ARMv8/32bit/xil_mmu.h | 77 + .../src/arm/ARMv8/32bit/xparameters_ps.h | 324 + .../src/arm/ARMv8/32bit/xpseudo_asm.h | 53 + .../src/arm/ARMv8/32bit/xreg_cortexa53.h | 394 + .../src/arm/ARMv8/32bit/xtime_l.c | 108 + .../src/arm/ARMv8/32bit/xtime_l.h | 90 + .../ARMv8/64bit/armclang/ARM_argv_veneer.c | 7 + .../src/arm/ARMv8/64bit/armclang/Makefile | 92 + .../arm/ARMv8/64bit/armclang/asm_vectors.S | 372 + .../src/arm/ARMv8/64bit/armclang/boot.S | 408 + .../64bit/armclang/xpseudo_asm_armclang.h | 146 + .../src/arm/ARMv8/64bit/gcc/Makefile | 84 + .../src/arm/ARMv8/64bit/gcc/asm_vectors.S | 413 + .../src/arm/ARMv8/64bit/gcc/boot.S | 491 + .../64bit/gcc/initialise_monitor_handles.c | 26 + .../src/arm/ARMv8/64bit/gcc/xil-crt0.S | 157 + .../ZynqMP/armclang/translation_table.S | 344 + .../platform/ZynqMP/gcc/translation_table.S | 246 + .../64bit/platform/ZynqMP/xparameters_ps.h | 381 + .../versal/armclang/translation_table.S | 529 + .../platform/versal/gcc/translation_table.S | 842 + .../64bit/platform/versal/xparameters_ps.h | 366 + .../src/arm/ARMv8/64bit/sleep.c | 111 + .../src/arm/ARMv8/64bit/xil_cache.c | 918 + .../src/arm/ARMv8/64bit/xil_cache.h | 75 + .../src/arm/ARMv8/64bit/xil_errata.h | 67 + .../src/arm/ARMv8/64bit/xil_mmu.c | 103 + .../src/arm/ARMv8/64bit/xil_mmu.h | 94 + .../src/arm/ARMv8/64bit/xil_smc.c | 84 + .../src/arm/ARMv8/64bit/xil_smc.h | 118 + .../src/arm/ARMv8/64bit/xpm_counter.h | 153 + .../src/arm/ARMv8/64bit/xpseudo_asm.h | 56 + .../arm/ARMv8/64bit/xpvxenconsole/arm64_ops.h | 205 + .../arm/ARMv8/64bit/xpvxenconsole/hypercall.S | 49 + .../arm/ARMv8/64bit/xpvxenconsole/hypercall.h | 29 + .../src/arm/ARMv8/64bit/xpvxenconsole/xen.h | 131 + .../ARMv8/64bit/xpvxenconsole/xen_console.c | 420 + .../ARMv8/64bit/xpvxenconsole/xen_console.h | 39 + .../ARMv8/64bit/xpvxenconsole/xen_events.c | 191 + .../ARMv8/64bit/xpvxenconsole/xen_events.h | 58 + .../src/arm/ARMv8/64bit/xreg_cortexa53.h | 163 + .../src/arm/ARMv8/64bit/xtime_l.c | 116 + .../src/arm/ARMv8/64bit/xtime_l.h | 99 + .../platform/Versal/xfpd_slave_xmpu.h | 1667 ++ .../includes_ps/platform/Versal/xfpd_slcr.h | 147 + .../platform/Versal/xfpd_slcr_secure.h | 197 + .../platform/Versal/xlpd_iou_secure_slcr.h | 164 + .../platform/Versal/xlpd_iou_slcr.h | 2202 ++ .../includes_ps/platform/Versal/xlpd_slcr.h | 501 + .../platform/Versal/xlpd_slcr_secure.h | 328 + .../includes_ps/platform/Versal/xlpd_xppu.h | 6769 +++++ .../includes_ps/platform/Versal/xocm_xmpu.h | 1667 ++ .../platform/Versal/xpmc_iou_secure_slcr.h | 175 + .../platform/Versal/xpmc_iou_slcr.h | 3797 +++ .../includes_ps/platform/Versal/xpmc_xmpu.h | 1667 ++ .../includes_ps/platform/Versal/xpmc_xppu.h | 6769 +++++ .../platform/ZynqMP/xddr_xmpu0_cfg.h | 1315 + .../platform/ZynqMP/xddr_xmpu1_cfg.h | 1314 + .../platform/ZynqMP/xddr_xmpu2_cfg.h | 1313 + .../platform/ZynqMP/xddr_xmpu3_cfg.h | 1315 + .../platform/ZynqMP/xddr_xmpu4_cfg.h | 1315 + .../platform/ZynqMP/xddr_xmpu5_cfg.h | 1315 + .../includes_ps/platform/ZynqMP/xfpd_slcr.h | 393 + .../platform/ZynqMP/xfpd_slcr_secure.h | 288 + .../platform/ZynqMP/xfpd_xmpu_cfg.h | 1314 + .../platform/ZynqMP/xfpd_xmpu_sink.h | 92 + .../platform/ZynqMP/xiou_secure_slcr.h | 185 + .../includes_ps/platform/ZynqMP/xiou_slcr.h | 4040 +++ .../includes_ps/platform/ZynqMP/xlpd_slcr.h | 5678 ++++ .../platform/ZynqMP/xlpd_slcr_secure.h | 152 + .../includes_ps/platform/ZynqMP/xlpd_xppu.h | 869 + .../platform/ZynqMP/xlpd_xppu_sink.h | 92 + .../platform/ZynqMP/xocm_xmpu_cfg.h | 1315 + .../src/arm/common/armclang/_sys_close.c | 13 + .../src/arm/common/armclang/_sys_exit.c | 15 + .../src/arm/common/armclang/_sys_iserror.c | 17 + .../src/arm/common/armclang/_sys_istty.c | 14 + .../src/arm/common/armclang/_sys_open.c | 14 + .../src/arm/common/armclang/_sys_read.c | 38 + .../src/arm/common/armclang/_sys_time.c | 18 + .../src/arm/common/armclang/_sys_write.c | 41 + .../src/arm/common/gcc/_exit.c | 18 + .../src/arm/common/gcc/_open.c | 32 + .../src/arm/common/gcc/_sbrk.c | 43 + .../src/arm/common/gcc/abort.c | 16 + .../src/arm/common/gcc/close.c | 27 + .../src/arm/common/gcc/cpputest_time.c | 31 + .../src/arm/common/gcc/errno.c | 29 + .../src/arm/common/gcc/fcntl.c | 22 + .../src/arm/common/gcc/fstat.c | 28 + .../src/arm/common/gcc/getpid.c | 30 + .../src/arm/common/gcc/isatty.c | 34 + .../standalone_v8_0/src/arm/common/gcc/kill.c | 38 + .../src/arm/common/gcc/lseek.c | 40 + .../standalone_v8_0/src/arm/common/gcc/open.c | 31 + .../standalone_v8_0/src/arm/common/gcc/read.c | 83 + .../standalone_v8_0/src/arm/common/gcc/sbrk.c | 39 + .../standalone_v8_0/src/arm/common/gcc/time.c | 27 + .../src/arm/common/gcc/unlink.c | 28 + .../src/arm/common/gcc/write.c | 100 + .../src/arm/common/gcc/xpseudo_asm_gcc.h | 253 + .../src/arm/common/iccarm/abort.c | 14 + .../src/arm/common/iccarm/clock.c | 28 + .../src/arm/common/iccarm/close.c | 15 + .../src/arm/common/iccarm/exit.c | 16 + .../src/arm/common/iccarm/low_level_init.c | 49 + .../src/arm/common/iccarm/lseek.c | 34 + .../src/arm/common/iccarm/open.c | 28 + .../src/arm/common/iccarm/read.c | 51 + .../src/arm/common/iccarm/remove.c | 22 + .../src/arm/common/iccarm/write.c | 105 + .../arm/common/iccarm/xpseudo_asm_iccarm.c | 43 + .../arm/common/iccarm/xpseudo_asm_iccarm.h | 159 + .../standalone_v8_0/src/arm/common/putnum.c | 55 + .../standalone_v8_0/src/arm/common/vectors.c | 166 + .../standalone_v8_0/src/arm/common/vectors.h | 64 + .../src/arm/common/xil_exception.c | 339 + .../src/arm/common/xil_exception.h | 413 + .../src/arm/common/xil_sleeptimer.c | 152 + .../src/arm/common/xil_sleeptimer.h | 115 + .../src/arm/common/xil_spinlock.c | 368 + .../src/arm/common/xil_spinlock.h | 80 + .../src/arm/common/xpm_counter.c | 606 + .../src/arm/cortexa9/armcc/ARM_argv_veneer.c | 6 + .../src/arm/cortexa9/armcc/Makefile | 86 + .../src/arm/cortexa9/armcc/_sys_close.c | 11 + .../src/arm/cortexa9/armcc/_sys_exit.c | 13 + .../src/arm/cortexa9/armcc/_sys_iserror.c | 15 + .../src/arm/cortexa9/armcc/_sys_istty.c | 12 + .../src/arm/cortexa9/armcc/_sys_open.c | 11 + .../src/arm/cortexa9/armcc/_sys_read.c | 12 + .../src/arm/cortexa9/armcc/_sys_time.c | 17 + .../src/arm/cortexa9/armcc/_sys_write.c | 24 + .../src/arm/cortexa9/armcc/asm_vectors.s | 142 + .../src/arm/cortexa9/armcc/boot.S | 444 + .../arm/cortexa9/armcc/translation_table.s | 169 + .../src/arm/cortexa9/armcc/xpseudo_asm_rvct.c | 122 + .../src/arm/cortexa9/armcc/xpseudo_asm_rvct.h | 112 + .../src/arm/cortexa9/gcc/Makefile | 83 + .../src/arm/cortexa9/gcc/asm_vectors.S | 176 + .../src/arm/cortexa9/gcc/boot.S | 463 + .../src/arm/cortexa9/gcc/cpu_init.S | 53 + .../src/arm/cortexa9/gcc/translation_table.S | 202 + .../src/arm/cortexa9/gcc/xil-crt0.S | 136 + .../src/arm/cortexa9/iccarm/Makefile | 59 + .../src/arm/cortexa9/iccarm/asm_vectors.s | 134 + .../src/arm/cortexa9/iccarm/boot.s | 441 + .../arm/cortexa9/iccarm/translation_table.s | 174 + .../standalone_v8_0/src/arm/cortexa9/sleep.c | 66 + .../standalone_v8_0/src/arm/cortexa9/smc.h | 96 + .../standalone_v8_0/src/arm/cortexa9/usleep.c | 81 + .../src/arm/cortexa9/xil_cache.c | 1522 + .../src/arm/cortexa9/xil_cache.h | 105 + .../src/arm/cortexa9/xil_cache_l.h | 75 + .../src/arm/cortexa9/xil_errata.h | 101 + .../src/arm/cortexa9/xil_misc_psreset_api.c | 436 + .../src/arm/cortexa9/xil_misc_psreset_api.h | 261 + .../src/arm/cortexa9/xil_mmu.c | 202 + .../src/arm/cortexa9/xil_mmu.h | 92 + .../standalone_v8_0/src/arm/cortexa9/xl2cc.h | 154 + .../src/arm/cortexa9/xl2cc_counter.c | 133 + .../src/arm/cortexa9/xl2cc_counter.h | 96 + .../src/arm/cortexa9/xparameters_ps.h | 334 + .../src/arm/cortexa9/xpm_counter.h | 575 + .../src/arm/cortexa9/xpseudo_asm.h | 60 + .../src/arm/cortexa9/xreg_cortexa9.h | 573 + .../src/arm/cortexa9/xtime_l.c | 100 + .../src/arm/cortexa9/xtime_l.h | 86 + .../arm/cortexr5/armclang/ARM_argv_veneer.c | 9 + .../src/arm/cortexr5/armclang/Makefile | 104 + .../src/arm/cortexr5/armclang/asm_vectors.S | 124 + .../src/arm/cortexr5/armclang/boot.S | 292 + .../src/arm/cortexr5/armclang/cpu_init.S | 56 + .../src/arm/cortexr5/armclang/xil-crt0.S | 59 + .../cortexr5/armclang/xpseudo_asm_armclang.h | 154 + .../src/arm/cortexr5/gcc/Makefile | 83 + .../src/arm/cortexr5/gcc/asm_vectors.S | 117 + .../src/arm/cortexr5/gcc/boot.S | 421 + .../src/arm/cortexr5/gcc/cpu_init.S | 48 + .../src/arm/cortexr5/gcc/xil-crt0.S | 154 + .../src/arm/cortexr5/iccarm/Makefile | 59 + .../src/arm/cortexr5/iccarm/asm_vectors.s | 141 + .../src/arm/cortexr5/iccarm/boot.s | 320 + .../src/arm/cortexr5/platform/CMakeLists.txt | 1 + .../cortexr5/platform/ZynqMP/CMakeLists.txt | 1 + .../src/arm/cortexr5/platform/ZynqMP/mpu.c | 411 + .../cortexr5/platform/ZynqMP/xparameters_ps.h | 392 + .../cortexr5/platform/versal/CMakeLists.txt | 1 + .../src/arm/cortexr5/platform/versal/mpu.c | 449 + .../cortexr5/platform/versal/xparameters_ps.h | 375 + .../standalone_v8_0/src/arm/cortexr5/sleep.c | 114 + .../standalone_v8_0/src/arm/cortexr5/usleep.c | 120 + .../src/arm/cortexr5/xil_cache.c | 612 + .../src/arm/cortexr5/xil_cache.h | 95 + .../src/arm/cortexr5/xil_mmu.h | 54 + .../src/arm/cortexr5/xil_mpu.c | 758 + .../src/arm/cortexr5/xil_mpu.h | 125 + .../src/arm/cortexr5/xpm_counter.h | 545 + .../src/arm/cortexr5/xpseudo_asm.h | 60 + .../src/arm/cortexr5/xreg_cortexr5.h | 481 + .../src/arm/cortexr5/xtime_l.c | 143 + .../src/arm/cortexr5/xtime_l.h | 133 + .../arm/platform/versal_net/xparameters_ps.h | 355 + .../libsrc/standalone_v8_0/src/bspconfig.h | 26 + .../libsrc/standalone_v8_0/src/changelog.txt | 714 + .../src/clocking/xil_clocking.c | 128 + .../src/clocking/xil_clocking.h | 65 + .../src/common/clocking/xil_clocking.c | 128 + .../src/common/clocking/xil_clocking.h | 65 + .../src/common/intr/xinterrupt_wrap.c | 446 + .../src/common/intr/xinterrupt_wrap.h | 76 + .../libsrc/standalone_v8_0/src/common/print.c | 36 + .../libsrc/standalone_v8_0/src/common/sleep.h | 105 + .../src/common/versal/xil_error_node.h | 484 + .../src/common/versal/xil_hw.h | 98 + .../src/common/versal_net/xil_error_node.h | 724 + .../src/common/versal_net/xil_hw.h | 96 + .../standalone_v8_0/src/common/xbasic_types.h | 113 + .../standalone_v8_0/src/common/xdebug.h | 73 + .../libsrc/standalone_v8_0/src/common/xenv.h | 169 + .../src/common/xenv_standalone.h | 350 + .../standalone_v8_0/src/common/xil_assert.c | 126 + .../standalone_v8_0/src/common/xil_assert.h | 176 + .../src/common/xil_cache_vxworks.h | 74 + .../standalone_v8_0/src/common/xil_hal.h | 43 + .../standalone_v8_0/src/common/xil_io.h | 412 + .../src/common/xil_macroback.h | 1112 + .../standalone_v8_0/src/common/xil_mem.c | 70 + .../standalone_v8_0/src/common/xil_mem.h | 47 + .../standalone_v8_0/src/common/xil_printf.c | 447 + .../standalone_v8_0/src/common/xil_printf.h | 53 + .../src/common/xil_sleepcommon.c | 85 + .../src/common/xil_testcache.c | 341 + .../src/common/xil_testcache.h | 54 + .../standalone_v8_0/src/common/xil_testio.c | 273 + .../standalone_v8_0/src/common/xil_testio.h | 76 + .../standalone_v8_0/src/common/xil_testmem.c | 1575 + .../standalone_v8_0/src/common/xil_testmem.h | 165 + .../standalone_v8_0/src/common/xil_types.h | 211 + .../standalone_v8_0/src/common/xil_util.c | 1332 + .../standalone_v8_0/src/common/xil_util.h | 240 + .../src/common/xplatform_info.c | 147 + .../src/common/xplatform_info.h | 115 + .../standalone_v8_0/src/common/xstatus.h | 522 + .../libsrc/standalone_v8_0/src/config.make | 2 + .../libsrc/standalone_v8_0/src/errno.c | 19 + .../libsrc/standalone_v8_0/src/fcntl.c | 20 + .../libsrc/standalone_v8_0/src/fsl.h | 125 + .../src/hw_exception_handler.S | 712 + .../libsrc/standalone_v8_0/src/inbyte.c | 14 + .../src/intr/xinterrupt_wrap.c | 446 + .../src/intr/xinterrupt_wrap.h | 76 + .../libsrc/standalone_v8_0/src/mb_interface.h | 459 + .../standalone_v8_0/src/microblaze/Makefile | 86 + .../standalone_v8_0/src/microblaze/_exit.c | 20 + .../standalone_v8_0/src/microblaze/errno.c | 19 + .../standalone_v8_0/src/microblaze/fcntl.c | 20 + .../standalone_v8_0/src/microblaze/fsl.h | 125 + .../src/microblaze/hw_exception_handler.S | 712 + .../src/microblaze/mb_interface.h | 459 + .../microblaze/microblaze_disable_dcache.S | 59 + .../microblaze_disable_exceptions.S | 29 + .../microblaze/microblaze_disable_icache.S | 39 + .../microblaze_disable_interrupts.S | 53 + .../src/microblaze/microblaze_enable_dcache.S | 40 + .../microblaze/microblaze_enable_exceptions.S | 29 + .../src/microblaze/microblaze_enable_icache.S | 38 + .../microblaze/microblaze_enable_interrupts.S | 55 + .../microblaze/microblaze_exception_handler.c | 72 + .../src/microblaze/microblaze_exceptions_g.h | 36 + .../src/microblaze/microblaze_exceptions_i.h | 73 + .../microblaze/microblaze_flush_cache_ext.S | 47 + .../microblaze_flush_cache_ext_range.S | 53 + .../src/microblaze/microblaze_flush_dcache.S | 51 + .../microblaze_flush_dcache_range.S | 97 + .../microblaze/microblaze_init_dcache_range.S | 59 + .../microblaze/microblaze_init_icache_range.S | 60 + .../src/microblaze/microblaze_instructions.h | 149 + .../microblaze/microblaze_interrupt_handler.c | 91 + .../src/microblaze/microblaze_interrupts_g.c | 38 + .../src/microblaze/microblaze_interrupts_i.h | 63 + .../microblaze_invalidate_cache_ext.S | 46 + .../microblaze_invalidate_cache_ext_range.S | 54 + .../microblaze/microblaze_invalidate_dcache.S | 69 + .../microblaze_invalidate_dcache_range.S | 101 + .../microblaze/microblaze_invalidate_icache.S | 70 + .../microblaze_invalidate_icache_range.S | 80 + .../src/microblaze/microblaze_scrub.S | 184 + .../src/microblaze/microblaze_selftest.S | 1088 + .../src/microblaze/microblaze_sleep.c | 284 + .../src/microblaze/microblaze_sleep.h | 130 + .../src/microblaze/microblaze_update_dcache.S | 84 + .../src/microblaze/microblaze_update_icache.S | 83 + .../standalone_v8_0/src/microblaze/pvr.c | 65 + .../standalone_v8_0/src/microblaze/pvr.h | 524 + .../src/microblaze/xil_cache.c | 62 + .../src/microblaze/xil_cache.h | 392 + .../src/microblaze/xil_exception.c | 178 + .../src/microblaze/xil_exception.h | 112 + .../src/microblaze/xil_misc_psreset_api.c | 437 + .../src/microblaze/xil_misc_psreset_api.h | 257 + .../src/microblaze_disable_dcache.S | 59 + .../src/microblaze_disable_exceptions.S | 29 + .../src/microblaze_disable_icache.S | 39 + .../src/microblaze_disable_interrupts.S | 53 + .../src/microblaze_enable_dcache.S | 40 + .../src/microblaze_enable_exceptions.S | 29 + .../src/microblaze_enable_icache.S | 38 + .../src/microblaze_enable_interrupts.S | 55 + .../src/microblaze_exception_handler.c | 72 + .../src/microblaze_exceptions_g.h | 36 + .../src/microblaze_exceptions_i.h | 73 + .../src/microblaze_flush_cache_ext.S | 47 + .../src/microblaze_flush_cache_ext_range.S | 53 + .../src/microblaze_flush_dcache.S | 51 + .../src/microblaze_flush_dcache_range.S | 97 + .../src/microblaze_init_dcache_range.S | 59 + .../src/microblaze_init_icache_range.S | 60 + .../src/microblaze_instructions.h | 149 + .../src/microblaze_interrupts_g.c | 31 + .../src/microblaze_interrupts_i.h | 63 + .../src/microblaze_invalidate_cache_ext.S | 46 + .../microblaze_invalidate_cache_ext_range.S | 54 + .../src/microblaze_invalidate_dcache.S | 69 + .../src/microblaze_invalidate_dcache_range.S | 101 + .../src/microblaze_invalidate_icache.S | 70 + .../src/microblaze_invalidate_icache_range.S | 80 + .../standalone_v8_0/src/microblaze_scrub.S | 184 + .../standalone_v8_0/src/microblaze_selftest.S | 1088 + .../standalone_v8_0/src/microblaze_sleep.c | 284 + .../standalone_v8_0/src/microblaze_sleep.h | 130 + .../src/microblaze_update_dcache.S | 84 + .../src/microblaze_update_icache.S | 83 + .../libsrc/standalone_v8_0/src/outbyte.c | 15 + .../libsrc/standalone_v8_0/src/print.c | 36 + .../standalone_v8_0/src/profile/Makefile | 51 + .../src/profile/_profile_clean.c | 21 + .../src/profile/_profile_init.c | 59 + .../src/profile/_profile_timer_hw.c | 356 + .../src/profile/_profile_timer_hw.h | 281 + .../standalone_v8_0/src/profile/dummy.S | 37 + .../src/profile/mblaze_nt_types.h | 28 + .../standalone_v8_0/src/profile/profile.h | 105 + .../standalone_v8_0/src/profile/profile_cg.c | 145 + .../src/profile/profile_config.h | 30 + .../src/profile/profile_hist.c | 45 + .../src/profile/profile_mcount_arm.S | 18 + .../src/profile/profile_mcount_mb.S | 42 + .../src/profile/profile_mcount_ppc.S | 44 + .../libsrc/standalone_v8_0/src/pvr.c | 65 + .../libsrc/standalone_v8_0/src/pvr.h | 524 + .../libsrc/standalone_v8_0/src/sleep.h | 105 + .../src/versal/xil_error_node.h | 484 + .../standalone_v8_0/src/versal/xil_hw.h | 98 + .../src/versal_net/xil_error_node.h | 724 + .../standalone_v8_0/src/versal_net/xil_hw.h | 96 + .../libsrc/standalone_v8_0/src/xbasic_types.h | 113 + .../libsrc/standalone_v8_0/src/xdebug.h | 73 + .../libsrc/standalone_v8_0/src/xenv.h | 169 + .../standalone_v8_0/src/xenv_standalone.h | 350 + .../libsrc/standalone_v8_0/src/xil_assert.c | 126 + .../libsrc/standalone_v8_0/src/xil_assert.h | 176 + .../libsrc/standalone_v8_0/src/xil_cache.c | 62 + .../libsrc/standalone_v8_0/src/xil_cache.h | 392 + .../standalone_v8_0/src/xil_cache_vxworks.h | 74 + .../libsrc/standalone_v8_0/src/xil_clocking.c | 128 + .../libsrc/standalone_v8_0/src/xil_clocking.h | 65 + .../standalone_v8_0/src/xil_exception.c | 178 + .../standalone_v8_0/src/xil_exception.h | 112 + .../libsrc/standalone_v8_0/src/xil_hal.h | 43 + .../libsrc/standalone_v8_0/src/xil_io.h | 412 + .../standalone_v8_0/src/xil_macroback.h | 1112 + .../libsrc/standalone_v8_0/src/xil_mem.c | 70 + .../libsrc/standalone_v8_0/src/xil_mem.h | 47 + .../src/xil_misc_psreset_api.c | 437 + .../src/xil_misc_psreset_api.h | 257 + .../libsrc/standalone_v8_0/src/xil_printf.c | 447 + .../libsrc/standalone_v8_0/src/xil_printf.h | 53 + .../standalone_v8_0/src/xil_sleepcommon.c | 85 + .../standalone_v8_0/src/xil_testcache.c | 341 + .../standalone_v8_0/src/xil_testcache.h | 54 + .../libsrc/standalone_v8_0/src/xil_testio.c | 273 + .../libsrc/standalone_v8_0/src/xil_testio.h | 76 + .../libsrc/standalone_v8_0/src/xil_testmem.c | 1575 + .../libsrc/standalone_v8_0/src/xil_testmem.h | 165 + .../libsrc/standalone_v8_0/src/xil_types.h | 211 + .../libsrc/standalone_v8_0/src/xil_util.c | 1332 + .../libsrc/standalone_v8_0/src/xil_util.h | 240 + .../standalone_v8_0/src/xinterrupt_wrap.c | 446 + .../standalone_v8_0/src/xinterrupt_wrap.h | 76 + .../standalone_v8_0/src/xplatform_info.c | 147 + .../standalone_v8_0/src/xplatform_info.h | 115 + .../libsrc/standalone_v8_0/src/xstatus.h | 522 + .../libsrc/sysmon_v7_7/src/Makefile | 39 + .../libsrc/sysmon_v7_7/src/xsysmon.c | 1893 ++ .../libsrc/sysmon_v7_7/src/xsysmon.h | 640 + .../libsrc/sysmon_v7_7/src/xsysmon_g.c | 33 + .../libsrc/sysmon_v7_7/src/xsysmon_hw.h | 664 + .../libsrc/sysmon_v7_7/src/xsysmon_intr.c | 295 + .../libsrc/sysmon_v7_7/src/xsysmon_selftest.c | 118 + .../libsrc/sysmon_v7_7/src/xsysmon_sinit.c | 77 + .../libsrc/tmrctr_v4_9/src/Makefile | 39 + .../libsrc/tmrctr_v4_9/src/xtmrctr.c | 706 + .../libsrc/tmrctr_v4_9/src/xtmrctr.h | 313 + .../libsrc/tmrctr_v4_9/src/xtmrctr_g.c | 32 + .../libsrc/tmrctr_v4_9/src/xtmrctr_i.h | 54 + .../libsrc/tmrctr_v4_9/src/xtmrctr_intr.c | 209 + .../libsrc/tmrctr_v4_9/src/xtmrctr_l.c | 53 + .../libsrc/tmrctr_v4_9/src/xtmrctr_l.h | 415 + .../libsrc/tmrctr_v4_9/src/xtmrctr_options.c | 191 + .../libsrc/tmrctr_v4_9/src/xtmrctr_selftest.c | 140 + .../libsrc/tmrctr_v4_9/src/xtmrctr_sinit.c | 77 + .../libsrc/tmrctr_v4_9/src/xtmrctr_stats.c | 89 + .../libsrc/uartlite_v3_7/src/Makefile | 39 + .../libsrc/uartlite_v3_7/src/xuartlite.c | 655 + .../libsrc/uartlite_v3_7/src/xuartlite.h | 274 + .../libsrc/uartlite_v3_7/src/xuartlite_g.c | 34 + .../libsrc/uartlite_v3_7/src/xuartlite_i.h | 100 + .../libsrc/uartlite_v3_7/src/xuartlite_intr.c | 309 + .../libsrc/uartlite_v3_7/src/xuartlite_l.c | 95 + .../libsrc/uartlite_v3_7/src/xuartlite_l.h | 310 + .../uartlite_v3_7/src/xuartlite_selftest.c | 114 + .../uartlite_v3_7/src/xuartlite_sinit.c | 122 + .../uartlite_v3_7/src/xuartlite_stats.c | 118 + .../bsp/system.mss | 166 + .../standalone_microblaze_0/bsp/Makefile | 49 + .../standalone_microblaze_0/bsp/dep.mk | 3 + .../microblaze_0/include/_profile_timer_hw.h | 281 + .../bsp/microblaze_0/include/bspconfig.h | 21 + .../bsp/microblaze_0/include/fsl.h | 125 + .../bsp/microblaze_0/include/mb_interface.h | 459 + .../microblaze_0/include/mblaze_nt_types.h | 28 + .../include/microblaze_exceptions_g.h | 36 + .../include/microblaze_exceptions_i.h | 73 + .../include/microblaze_instructions.h | 149 + .../include/microblaze_interrupts_i.h | 63 + .../microblaze_0/include/microblaze_sleep.h | 130 + .../bsp/microblaze_0/include/profile.h | 105 + .../bsp/microblaze_0/include/pvr.h | 524 + .../bsp/microblaze_0/include/sleep.h | 105 + .../bsp/microblaze_0/include/xaxidma.h | 743 + .../bsp/microblaze_0/include/xaxidma_bd.h | 674 + .../bsp/microblaze_0/include/xaxidma_bdring.h | 556 + .../bsp/microblaze_0/include/xaxidma_hw.h | 320 + .../include/xaxidma_porting_guide.h | 228 + .../bsp/microblaze_0/include/xaxiethernet.h | 1526 + .../microblaze_0/include/xaxiethernet_hw.h | 935 + .../include/xaxiethernet_porting_guide.h | 157 + .../bsp/microblaze_0/include/xbasic_types.h | 113 + .../bsp/microblaze_0/include/xbram.h | 204 + .../bsp/microblaze_0/include/xbram_hw.h | 383 + .../bsp/microblaze_0/include/xdebug.h | 73 + .../bsp/microblaze_0/include/xenv.h | 169 + .../microblaze_0/include/xenv_standalone.h | 350 + .../bsp/microblaze_0/include/xil_assert.h | 176 + .../bsp/microblaze_0/include/xil_cache.h | 392 + .../microblaze_0/include/xil_cache_vxworks.h | 74 + .../bsp/microblaze_0/include/xil_clocking.h | 65 + .../bsp/microblaze_0/include/xil_exception.h | 112 + .../bsp/microblaze_0/include/xil_hal.h | 43 + .../bsp/microblaze_0/include/xil_io.h | 412 + .../bsp/microblaze_0/include/xil_macroback.h | 1112 + .../bsp/microblaze_0/include/xil_mem.h | 47 + .../include/xil_misc_psreset_api.h | 257 + .../bsp/microblaze_0/include/xil_printf.h | 53 + .../bsp/microblaze_0/include/xil_testcache.h | 54 + .../bsp/microblaze_0/include/xil_testio.h | 76 + .../bsp/microblaze_0/include/xil_testmem.h | 165 + .../bsp/microblaze_0/include/xil_types.h | 211 + .../bsp/microblaze_0/include/xil_util.h | 240 + .../bsp/microblaze_0/include/xintc.h | 370 + .../bsp/microblaze_0/include/xintc_i.h | 67 + .../bsp/microblaze_0/include/xintc_l.h | 312 + .../microblaze_0/include/xinterrupt_wrap.h | 76 + .../bsp/microblaze_0/include/xio.h | 252 + .../bsp/microblaze_0/include/xllfifo.h | 709 + .../bsp/microblaze_0/include/xllfifo_hw.h | 216 + .../bsp/microblaze_0/include/xparameters.h | 1204 + .../bsp/microblaze_0/include/xplatform_info.h | 115 + .../bsp/microblaze_0/include/xspi.h | 844 + .../bsp/microblaze_0/include/xspi_i.h | 65 + .../bsp/microblaze_0/include/xspi_l.h | 340 + .../bsp/microblaze_0/include/xstatus.h | 522 + .../bsp/microblaze_0/include/xstreamer.h | 308 + .../bsp/microblaze_0/include/xsysmon.h | 640 + .../bsp/microblaze_0/include/xsysmon_hw.h | 664 + .../bsp/microblaze_0/include/xtmrctr.h | 313 + .../bsp/microblaze_0/include/xtmrctr_i.h | 54 + .../bsp/microblaze_0/include/xtmrctr_l.h | 415 + .../bsp/microblaze_0/include/xuartlite.h | 274 + .../bsp/microblaze_0/include/xuartlite_i.h | 100 + .../bsp/microblaze_0/include/xuartlite_l.h | 310 + .../bsp/microblaze_0/lib/libc.a | Bin 0 -> 1086530 bytes .../bsp/microblaze_0/lib/libgcc.a | Bin 0 -> 179550 bytes .../bsp/microblaze_0/lib/libgloss.a | Bin 0 -> 112114 bytes .../bsp/microblaze_0/lib/libm.a | Bin 0 -> 540300 bytes .../bsp/microblaze_0/lib/libxil.a | Bin 0 -> 1255254 bytes .../libsrc/axidma_v9_15/src/Makefile | 39 + .../libsrc/axidma_v9_15/src/xaxidma.c | 965 + .../libsrc/axidma_v9_15/src/xaxidma.h | 743 + .../libsrc/axidma_v9_15/src/xaxidma_bd.c | 324 + .../libsrc/axidma_v9_15/src/xaxidma_bd.h | 674 + .../libsrc/axidma_v9_15/src/xaxidma_bdring.c | 1593 + .../libsrc/axidma_v9_15/src/xaxidma_bdring.h | 556 + .../libsrc/axidma_v9_15/src/xaxidma_g.c | 46 + .../libsrc/axidma_v9_15/src/xaxidma_hw.h | 320 + .../axidma_v9_15/src/xaxidma_porting_guide.h | 228 + .../axidma_v9_15/src/xaxidma_selftest.c | 89 + .../libsrc/axidma_v9_15/src/xaxidma_sinit.c | 104 + .../libsrc/axiethernet_v5_14/src/Makefile | 39 + .../axiethernet_v5_14/src/xaxiethernet.c | 1810 ++ .../axiethernet_v5_14/src/xaxiethernet.h | 1526 + .../src/xaxiethernet_control.c | 1691 ++ .../axiethernet_v5_14/src/xaxiethernet_g.c | 88 + .../axiethernet_v5_14/src/xaxiethernet_hw.h | 935 + .../src/xaxiethernet_porting_guide.h | 157 + .../src/xaxiethernet_sinit.c | 73 + .../libsrc/bram_v4_8/src/Makefile | 39 + .../microblaze_0/libsrc/bram_v4_8/src/xbram.c | 123 + .../microblaze_0/libsrc/bram_v4_8/src/xbram.h | 204 + .../libsrc/bram_v4_8/src/xbram_g.c | 141 + .../libsrc/bram_v4_8/src/xbram_hw.h | 383 + .../libsrc/bram_v4_8/src/xbram_intr.c | 212 + .../libsrc/bram_v4_8/src/xbram_selftest.c | 497 + .../libsrc/bram_v4_8/src/xbram_sinit.c | 79 + .../libsrc/cpu_v2_16/src/Makefile | 39 + .../microblaze_0/libsrc/cpu_v2_16/src/xio.c | 204 + .../microblaze_0/libsrc/cpu_v2_16/src/xio.h | 252 + .../libsrc/intc_v3_15/src/Makefile | 39 + .../libsrc/intc_v3_15/src/xintc.c | 1229 + .../libsrc/intc_v3_15/src/xintc.h | 370 + .../libsrc/intc_v3_15/src/xintc_g.c | 95 + .../libsrc/intc_v3_15/src/xintc_i.h | 67 + .../libsrc/intc_v3_15/src/xintc_intr.c | 152 + .../libsrc/intc_v3_15/src/xintc_l.c | 699 + .../libsrc/intc_v3_15/src/xintc_l.h | 312 + .../libsrc/intc_v3_15/src/xintc_options.c | 123 + .../libsrc/intc_v3_15/src/xintc_selftest.c | 235 + .../libsrc/llfifo_v5_5/src/Makefile | 39 + .../libsrc/llfifo_v5_5/src/xllfifo.c | 473 + .../libsrc/llfifo_v5_5/src/xllfifo.h | 709 + .../libsrc/llfifo_v5_5/src/xllfifo_g.c | 32 + .../libsrc/llfifo_v5_5/src/xllfifo_hw.h | 216 + .../libsrc/llfifo_v5_5/src/xllfifo_sinit.c | 62 + .../libsrc/llfifo_v5_5/src/xstreamer.c | 493 + .../libsrc/llfifo_v5_5/src/xstreamer.h | 308 + .../microblaze_0/libsrc/mig_v1_1/src/xmig.h | 20 + .../microblaze_0/libsrc/spi_v4_9/src/Makefile | 39 + .../microblaze_0/libsrc/spi_v4_9/src/xspi.c | 1369 + .../microblaze_0/libsrc/spi_v4_9/src/xspi.h | 844 + .../microblaze_0/libsrc/spi_v4_9/src/xspi_g.c | 68 + .../microblaze_0/libsrc/spi_v4_9/src/xspi_i.h | 65 + .../microblaze_0/libsrc/spi_v4_9/src/xspi_l.h | 340 + .../libsrc/spi_v4_9/src/xspi_options.c | 199 + .../libsrc/spi_v4_9/src/xspi_selftest.c | 337 + .../libsrc/spi_v4_9/src/xspi_sinit.c | 127 + .../libsrc/spi_v4_9/src/xspi_stats.c | 105 + .../libsrc/standalone_v8_0/src/Makefile | 86 + .../libsrc/standalone_v8_0/src/_exit.c | 20 + .../src/arm/ARMv8/32bit/gcc/Makefile | 79 + .../src/arm/ARMv8/32bit/gcc/asm_vectors.S | 154 + .../src/arm/ARMv8/32bit/gcc/boot.S | 277 + .../src/arm/ARMv8/32bit/gcc/cpu_init.S | 50 + .../src/arm/ARMv8/32bit/gcc/xil-crt0.S | 101 + .../32bit/platform/ZynqMP/CMakeLists.txt | 1 + .../32bit/platform/ZynqMP/translation_table.S | 155 + .../32bit/platform/ZynqMP/xparameters_ps.h | 323 + .../32bit/platform/versal/CMakeLists.txt | 1 + .../32bit/platform/versal/xparameters_ps.h | 285 + .../src/arm/ARMv8/32bit/sleep.c | 73 + .../src/arm/ARMv8/32bit/usleep.c | 85 + .../src/arm/ARMv8/32bit/xil_cache.c | 588 + .../src/arm/ARMv8/32bit/xil_cache.h | 60 + .../src/arm/ARMv8/32bit/xil_cache_l.h | 41 + .../src/arm/ARMv8/32bit/xil_mmu.c | 124 + .../src/arm/ARMv8/32bit/xil_mmu.h | 77 + .../src/arm/ARMv8/32bit/xparameters_ps.h | 324 + .../src/arm/ARMv8/32bit/xpseudo_asm.h | 53 + .../src/arm/ARMv8/32bit/xreg_cortexa53.h | 394 + .../src/arm/ARMv8/32bit/xtime_l.c | 108 + .../src/arm/ARMv8/32bit/xtime_l.h | 90 + .../ARMv8/64bit/armclang/ARM_argv_veneer.c | 7 + .../src/arm/ARMv8/64bit/armclang/Makefile | 92 + .../arm/ARMv8/64bit/armclang/asm_vectors.S | 372 + .../src/arm/ARMv8/64bit/armclang/boot.S | 408 + .../64bit/armclang/xpseudo_asm_armclang.h | 146 + .../src/arm/ARMv8/64bit/gcc/Makefile | 84 + .../src/arm/ARMv8/64bit/gcc/asm_vectors.S | 413 + .../src/arm/ARMv8/64bit/gcc/boot.S | 491 + .../64bit/gcc/initialise_monitor_handles.c | 26 + .../src/arm/ARMv8/64bit/gcc/xil-crt0.S | 157 + .../ZynqMP/armclang/translation_table.S | 344 + .../platform/ZynqMP/gcc/translation_table.S | 246 + .../64bit/platform/ZynqMP/xparameters_ps.h | 381 + .../versal/armclang/translation_table.S | 529 + .../platform/versal/gcc/translation_table.S | 842 + .../64bit/platform/versal/xparameters_ps.h | 366 + .../src/arm/ARMv8/64bit/sleep.c | 111 + .../src/arm/ARMv8/64bit/xil_cache.c | 918 + .../src/arm/ARMv8/64bit/xil_cache.h | 75 + .../src/arm/ARMv8/64bit/xil_errata.h | 67 + .../src/arm/ARMv8/64bit/xil_mmu.c | 103 + .../src/arm/ARMv8/64bit/xil_mmu.h | 94 + .../src/arm/ARMv8/64bit/xil_smc.c | 84 + .../src/arm/ARMv8/64bit/xil_smc.h | 118 + .../src/arm/ARMv8/64bit/xpm_counter.h | 153 + .../src/arm/ARMv8/64bit/xpseudo_asm.h | 56 + .../arm/ARMv8/64bit/xpvxenconsole/arm64_ops.h | 205 + .../arm/ARMv8/64bit/xpvxenconsole/hypercall.S | 49 + .../arm/ARMv8/64bit/xpvxenconsole/hypercall.h | 29 + .../src/arm/ARMv8/64bit/xpvxenconsole/xen.h | 131 + .../ARMv8/64bit/xpvxenconsole/xen_console.c | 420 + .../ARMv8/64bit/xpvxenconsole/xen_console.h | 39 + .../ARMv8/64bit/xpvxenconsole/xen_events.c | 191 + .../ARMv8/64bit/xpvxenconsole/xen_events.h | 58 + .../src/arm/ARMv8/64bit/xreg_cortexa53.h | 163 + .../src/arm/ARMv8/64bit/xtime_l.c | 116 + .../src/arm/ARMv8/64bit/xtime_l.h | 99 + .../platform/Versal/xfpd_slave_xmpu.h | 1667 ++ .../includes_ps/platform/Versal/xfpd_slcr.h | 147 + .../platform/Versal/xfpd_slcr_secure.h | 197 + .../platform/Versal/xlpd_iou_secure_slcr.h | 164 + .../platform/Versal/xlpd_iou_slcr.h | 2202 ++ .../includes_ps/platform/Versal/xlpd_slcr.h | 501 + .../platform/Versal/xlpd_slcr_secure.h | 328 + .../includes_ps/platform/Versal/xlpd_xppu.h | 6769 +++++ .../includes_ps/platform/Versal/xocm_xmpu.h | 1667 ++ .../platform/Versal/xpmc_iou_secure_slcr.h | 175 + .../platform/Versal/xpmc_iou_slcr.h | 3797 +++ .../includes_ps/platform/Versal/xpmc_xmpu.h | 1667 ++ .../includes_ps/platform/Versal/xpmc_xppu.h | 6769 +++++ .../platform/ZynqMP/xddr_xmpu0_cfg.h | 1315 + .../platform/ZynqMP/xddr_xmpu1_cfg.h | 1314 + .../platform/ZynqMP/xddr_xmpu2_cfg.h | 1313 + .../platform/ZynqMP/xddr_xmpu3_cfg.h | 1315 + .../platform/ZynqMP/xddr_xmpu4_cfg.h | 1315 + .../platform/ZynqMP/xddr_xmpu5_cfg.h | 1315 + .../includes_ps/platform/ZynqMP/xfpd_slcr.h | 393 + .../platform/ZynqMP/xfpd_slcr_secure.h | 288 + .../platform/ZynqMP/xfpd_xmpu_cfg.h | 1314 + .../platform/ZynqMP/xfpd_xmpu_sink.h | 92 + .../platform/ZynqMP/xiou_secure_slcr.h | 185 + .../includes_ps/platform/ZynqMP/xiou_slcr.h | 4040 +++ .../includes_ps/platform/ZynqMP/xlpd_slcr.h | 5678 ++++ .../platform/ZynqMP/xlpd_slcr_secure.h | 152 + .../includes_ps/platform/ZynqMP/xlpd_xppu.h | 869 + .../platform/ZynqMP/xlpd_xppu_sink.h | 92 + .../platform/ZynqMP/xocm_xmpu_cfg.h | 1315 + .../src/arm/common/armclang/_sys_close.c | 13 + .../src/arm/common/armclang/_sys_exit.c | 15 + .../src/arm/common/armclang/_sys_iserror.c | 17 + .../src/arm/common/armclang/_sys_istty.c | 14 + .../src/arm/common/armclang/_sys_open.c | 14 + .../src/arm/common/armclang/_sys_read.c | 38 + .../src/arm/common/armclang/_sys_time.c | 18 + .../src/arm/common/armclang/_sys_write.c | 41 + .../src/arm/common/gcc/_exit.c | 18 + .../src/arm/common/gcc/_open.c | 32 + .../src/arm/common/gcc/_sbrk.c | 43 + .../src/arm/common/gcc/abort.c | 16 + .../src/arm/common/gcc/close.c | 27 + .../src/arm/common/gcc/cpputest_time.c | 31 + .../src/arm/common/gcc/errno.c | 29 + .../src/arm/common/gcc/fcntl.c | 22 + .../src/arm/common/gcc/fstat.c | 28 + .../src/arm/common/gcc/getpid.c | 30 + .../src/arm/common/gcc/isatty.c | 34 + .../standalone_v8_0/src/arm/common/gcc/kill.c | 38 + .../src/arm/common/gcc/lseek.c | 40 + .../standalone_v8_0/src/arm/common/gcc/open.c | 31 + .../standalone_v8_0/src/arm/common/gcc/read.c | 83 + .../standalone_v8_0/src/arm/common/gcc/sbrk.c | 39 + .../standalone_v8_0/src/arm/common/gcc/time.c | 27 + .../src/arm/common/gcc/unlink.c | 28 + .../src/arm/common/gcc/write.c | 100 + .../src/arm/common/gcc/xpseudo_asm_gcc.h | 253 + .../src/arm/common/iccarm/abort.c | 14 + .../src/arm/common/iccarm/clock.c | 28 + .../src/arm/common/iccarm/close.c | 15 + .../src/arm/common/iccarm/exit.c | 16 + .../src/arm/common/iccarm/low_level_init.c | 49 + .../src/arm/common/iccarm/lseek.c | 34 + .../src/arm/common/iccarm/open.c | 28 + .../src/arm/common/iccarm/read.c | 51 + .../src/arm/common/iccarm/remove.c | 22 + .../src/arm/common/iccarm/write.c | 105 + .../arm/common/iccarm/xpseudo_asm_iccarm.c | 43 + .../arm/common/iccarm/xpseudo_asm_iccarm.h | 159 + .../standalone_v8_0/src/arm/common/putnum.c | 55 + .../standalone_v8_0/src/arm/common/vectors.c | 166 + .../standalone_v8_0/src/arm/common/vectors.h | 64 + .../src/arm/common/xil_exception.c | 339 + .../src/arm/common/xil_exception.h | 413 + .../src/arm/common/xil_sleeptimer.c | 152 + .../src/arm/common/xil_sleeptimer.h | 115 + .../src/arm/common/xil_spinlock.c | 368 + .../src/arm/common/xil_spinlock.h | 80 + .../src/arm/common/xpm_counter.c | 606 + .../src/arm/cortexa9/armcc/ARM_argv_veneer.c | 6 + .../src/arm/cortexa9/armcc/Makefile | 86 + .../src/arm/cortexa9/armcc/_sys_close.c | 11 + .../src/arm/cortexa9/armcc/_sys_exit.c | 13 + .../src/arm/cortexa9/armcc/_sys_iserror.c | 15 + .../src/arm/cortexa9/armcc/_sys_istty.c | 12 + .../src/arm/cortexa9/armcc/_sys_open.c | 11 + .../src/arm/cortexa9/armcc/_sys_read.c | 12 + .../src/arm/cortexa9/armcc/_sys_time.c | 17 + .../src/arm/cortexa9/armcc/_sys_write.c | 24 + .../src/arm/cortexa9/armcc/asm_vectors.s | 142 + .../src/arm/cortexa9/armcc/boot.S | 444 + .../arm/cortexa9/armcc/translation_table.s | 169 + .../src/arm/cortexa9/armcc/xpseudo_asm_rvct.c | 122 + .../src/arm/cortexa9/armcc/xpseudo_asm_rvct.h | 112 + .../src/arm/cortexa9/gcc/Makefile | 83 + .../src/arm/cortexa9/gcc/asm_vectors.S | 176 + .../src/arm/cortexa9/gcc/boot.S | 463 + .../src/arm/cortexa9/gcc/cpu_init.S | 53 + .../src/arm/cortexa9/gcc/translation_table.S | 202 + .../src/arm/cortexa9/gcc/xil-crt0.S | 136 + .../src/arm/cortexa9/iccarm/Makefile | 59 + .../src/arm/cortexa9/iccarm/asm_vectors.s | 134 + .../src/arm/cortexa9/iccarm/boot.s | 441 + .../arm/cortexa9/iccarm/translation_table.s | 174 + .../standalone_v8_0/src/arm/cortexa9/sleep.c | 66 + .../standalone_v8_0/src/arm/cortexa9/smc.h | 96 + .../standalone_v8_0/src/arm/cortexa9/usleep.c | 81 + .../src/arm/cortexa9/xil_cache.c | 1522 + .../src/arm/cortexa9/xil_cache.h | 105 + .../src/arm/cortexa9/xil_cache_l.h | 75 + .../src/arm/cortexa9/xil_errata.h | 101 + .../src/arm/cortexa9/xil_misc_psreset_api.c | 436 + .../src/arm/cortexa9/xil_misc_psreset_api.h | 261 + .../src/arm/cortexa9/xil_mmu.c | 202 + .../src/arm/cortexa9/xil_mmu.h | 92 + .../standalone_v8_0/src/arm/cortexa9/xl2cc.h | 154 + .../src/arm/cortexa9/xl2cc_counter.c | 133 + .../src/arm/cortexa9/xl2cc_counter.h | 96 + .../src/arm/cortexa9/xparameters_ps.h | 334 + .../src/arm/cortexa9/xpm_counter.h | 575 + .../src/arm/cortexa9/xpseudo_asm.h | 60 + .../src/arm/cortexa9/xreg_cortexa9.h | 573 + .../src/arm/cortexa9/xtime_l.c | 100 + .../src/arm/cortexa9/xtime_l.h | 86 + .../arm/cortexr5/armclang/ARM_argv_veneer.c | 9 + .../src/arm/cortexr5/armclang/Makefile | 104 + .../src/arm/cortexr5/armclang/asm_vectors.S | 124 + .../src/arm/cortexr5/armclang/boot.S | 292 + .../src/arm/cortexr5/armclang/cpu_init.S | 56 + .../src/arm/cortexr5/armclang/xil-crt0.S | 59 + .../cortexr5/armclang/xpseudo_asm_armclang.h | 154 + .../src/arm/cortexr5/gcc/Makefile | 83 + .../src/arm/cortexr5/gcc/asm_vectors.S | 117 + .../src/arm/cortexr5/gcc/boot.S | 421 + .../src/arm/cortexr5/gcc/cpu_init.S | 48 + .../src/arm/cortexr5/gcc/xil-crt0.S | 154 + .../src/arm/cortexr5/iccarm/Makefile | 59 + .../src/arm/cortexr5/iccarm/asm_vectors.s | 141 + .../src/arm/cortexr5/iccarm/boot.s | 320 + .../src/arm/cortexr5/platform/CMakeLists.txt | 1 + .../cortexr5/platform/ZynqMP/CMakeLists.txt | 1 + .../src/arm/cortexr5/platform/ZynqMP/mpu.c | 411 + .../cortexr5/platform/ZynqMP/xparameters_ps.h | 392 + .../cortexr5/platform/versal/CMakeLists.txt | 1 + .../src/arm/cortexr5/platform/versal/mpu.c | 449 + .../cortexr5/platform/versal/xparameters_ps.h | 375 + .../standalone_v8_0/src/arm/cortexr5/sleep.c | 114 + .../standalone_v8_0/src/arm/cortexr5/usleep.c | 120 + .../src/arm/cortexr5/xil_cache.c | 612 + .../src/arm/cortexr5/xil_cache.h | 95 + .../src/arm/cortexr5/xil_mmu.h | 54 + .../src/arm/cortexr5/xil_mpu.c | 758 + .../src/arm/cortexr5/xil_mpu.h | 125 + .../src/arm/cortexr5/xpm_counter.h | 545 + .../src/arm/cortexr5/xpseudo_asm.h | 60 + .../src/arm/cortexr5/xreg_cortexr5.h | 481 + .../src/arm/cortexr5/xtime_l.c | 143 + .../src/arm/cortexr5/xtime_l.h | 133 + .../arm/platform/versal_net/xparameters_ps.h | 355 + .../libsrc/standalone_v8_0/src/bspconfig.h | 21 + .../libsrc/standalone_v8_0/src/changelog.txt | 714 + .../src/clocking/xil_clocking.c | 128 + .../src/clocking/xil_clocking.h | 65 + .../src/common/clocking/xil_clocking.c | 128 + .../src/common/clocking/xil_clocking.h | 65 + .../src/common/intr/xinterrupt_wrap.c | 446 + .../src/common/intr/xinterrupt_wrap.h | 76 + .../libsrc/standalone_v8_0/src/common/print.c | 36 + .../libsrc/standalone_v8_0/src/common/sleep.h | 105 + .../src/common/versal/xil_error_node.h | 484 + .../src/common/versal/xil_hw.h | 98 + .../src/common/versal_net/xil_error_node.h | 724 + .../src/common/versal_net/xil_hw.h | 96 + .../standalone_v8_0/src/common/xbasic_types.h | 113 + .../standalone_v8_0/src/common/xdebug.h | 73 + .../libsrc/standalone_v8_0/src/common/xenv.h | 169 + .../src/common/xenv_standalone.h | 350 + .../standalone_v8_0/src/common/xil_assert.c | 126 + .../standalone_v8_0/src/common/xil_assert.h | 176 + .../src/common/xil_cache_vxworks.h | 74 + .../standalone_v8_0/src/common/xil_hal.h | 43 + .../standalone_v8_0/src/common/xil_io.h | 412 + .../src/common/xil_macroback.h | 1112 + .../standalone_v8_0/src/common/xil_mem.c | 70 + .../standalone_v8_0/src/common/xil_mem.h | 47 + .../standalone_v8_0/src/common/xil_printf.c | 447 + .../standalone_v8_0/src/common/xil_printf.h | 53 + .../src/common/xil_sleepcommon.c | 85 + .../src/common/xil_testcache.c | 341 + .../src/common/xil_testcache.h | 54 + .../standalone_v8_0/src/common/xil_testio.c | 273 + .../standalone_v8_0/src/common/xil_testio.h | 76 + .../standalone_v8_0/src/common/xil_testmem.c | 1575 + .../standalone_v8_0/src/common/xil_testmem.h | 165 + .../standalone_v8_0/src/common/xil_types.h | 211 + .../standalone_v8_0/src/common/xil_util.c | 1332 + .../standalone_v8_0/src/common/xil_util.h | 240 + .../src/common/xplatform_info.c | 147 + .../src/common/xplatform_info.h | 115 + .../standalone_v8_0/src/common/xstatus.h | 522 + .../libsrc/standalone_v8_0/src/config.make | 3 + .../libsrc/standalone_v8_0/src/errno.c | 19 + .../libsrc/standalone_v8_0/src/fcntl.c | 20 + .../libsrc/standalone_v8_0/src/fsl.h | 125 + .../src/hw_exception_handler.S | 712 + .../libsrc/standalone_v8_0/src/inbyte.c | 14 + .../src/intr/xinterrupt_wrap.c | 446 + .../src/intr/xinterrupt_wrap.h | 76 + .../libsrc/standalone_v8_0/src/mb_interface.h | 459 + .../standalone_v8_0/src/microblaze/Makefile | 86 + .../standalone_v8_0/src/microblaze/_exit.c | 20 + .../standalone_v8_0/src/microblaze/errno.c | 19 + .../standalone_v8_0/src/microblaze/fcntl.c | 20 + .../standalone_v8_0/src/microblaze/fsl.h | 125 + .../src/microblaze/hw_exception_handler.S | 712 + .../src/microblaze/mb_interface.h | 459 + .../microblaze/microblaze_disable_dcache.S | 59 + .../microblaze_disable_exceptions.S | 29 + .../microblaze/microblaze_disable_icache.S | 39 + .../microblaze_disable_interrupts.S | 53 + .../src/microblaze/microblaze_enable_dcache.S | 40 + .../microblaze/microblaze_enable_exceptions.S | 29 + .../src/microblaze/microblaze_enable_icache.S | 38 + .../microblaze/microblaze_enable_interrupts.S | 55 + .../microblaze/microblaze_exception_handler.c | 72 + .../src/microblaze/microblaze_exceptions_g.h | 36 + .../src/microblaze/microblaze_exceptions_i.h | 73 + .../microblaze/microblaze_flush_cache_ext.S | 47 + .../microblaze_flush_cache_ext_range.S | 53 + .../src/microblaze/microblaze_flush_dcache.S | 51 + .../microblaze_flush_dcache_range.S | 97 + .../microblaze/microblaze_init_dcache_range.S | 59 + .../microblaze/microblaze_init_icache_range.S | 60 + .../src/microblaze/microblaze_instructions.h | 149 + .../microblaze/microblaze_interrupt_handler.c | 91 + .../src/microblaze/microblaze_interrupts_g.c | 38 + .../src/microblaze/microblaze_interrupts_i.h | 63 + .../microblaze_invalidate_cache_ext.S | 46 + .../microblaze_invalidate_cache_ext_range.S | 54 + .../microblaze/microblaze_invalidate_dcache.S | 69 + .../microblaze_invalidate_dcache_range.S | 101 + .../microblaze/microblaze_invalidate_icache.S | 70 + .../microblaze_invalidate_icache_range.S | 80 + .../src/microblaze/microblaze_scrub.S | 184 + .../src/microblaze/microblaze_selftest.S | 1088 + .../src/microblaze/microblaze_sleep.c | 284 + .../src/microblaze/microblaze_sleep.h | 130 + .../src/microblaze/microblaze_update_dcache.S | 84 + .../src/microblaze/microblaze_update_icache.S | 83 + .../standalone_v8_0/src/microblaze/pvr.c | 65 + .../standalone_v8_0/src/microblaze/pvr.h | 524 + .../src/microblaze/xil_cache.c | 62 + .../src/microblaze/xil_cache.h | 392 + .../src/microblaze/xil_exception.c | 178 + .../src/microblaze/xil_exception.h | 112 + .../src/microblaze/xil_misc_psreset_api.c | 437 + .../src/microblaze/xil_misc_psreset_api.h | 257 + .../src/microblaze_disable_dcache.S | 59 + .../src/microblaze_disable_exceptions.S | 29 + .../src/microblaze_disable_icache.S | 39 + .../src/microblaze_disable_interrupts.S | 53 + .../src/microblaze_enable_dcache.S | 40 + .../src/microblaze_enable_exceptions.S | 29 + .../src/microblaze_enable_icache.S | 38 + .../src/microblaze_enable_interrupts.S | 55 + .../src/microblaze_exception_handler.c | 72 + .../src/microblaze_exceptions_g.h | 36 + .../src/microblaze_exceptions_i.h | 73 + .../src/microblaze_flush_cache_ext.S | 47 + .../src/microblaze_flush_cache_ext_range.S | 53 + .../src/microblaze_flush_dcache.S | 51 + .../src/microblaze_flush_dcache_range.S | 97 + .../src/microblaze_init_dcache_range.S | 59 + .../src/microblaze_init_icache_range.S | 60 + .../src/microblaze_instructions.h | 149 + .../src/microblaze_interrupt_handler.c | 91 + .../src/microblaze_interrupts_g.c | 31 + .../src/microblaze_interrupts_i.h | 63 + .../src/microblaze_invalidate_cache_ext.S | 46 + .../microblaze_invalidate_cache_ext_range.S | 54 + .../src/microblaze_invalidate_dcache.S | 69 + .../src/microblaze_invalidate_dcache_range.S | 101 + .../src/microblaze_invalidate_icache.S | 70 + .../src/microblaze_invalidate_icache_range.S | 80 + .../standalone_v8_0/src/microblaze_scrub.S | 184 + .../standalone_v8_0/src/microblaze_selftest.S | 1088 + .../standalone_v8_0/src/microblaze_sleep.c | 284 + .../standalone_v8_0/src/microblaze_sleep.h | 130 + .../src/microblaze_update_dcache.S | 84 + .../src/microblaze_update_icache.S | 83 + .../libsrc/standalone_v8_0/src/outbyte.c | 15 + .../libsrc/standalone_v8_0/src/print.c | 36 + .../standalone_v8_0/src/profile/Makefile | 51 + .../src/profile/_profile_clean.c | 21 + .../src/profile/_profile_init.c | 59 + .../src/profile/_profile_timer_hw.c | 356 + .../src/profile/_profile_timer_hw.h | 281 + .../standalone_v8_0/src/profile/dummy.S | 37 + .../src/profile/mblaze_nt_types.h | 28 + .../standalone_v8_0/src/profile/profile.h | 105 + .../standalone_v8_0/src/profile/profile_cg.c | 145 + .../src/profile/profile_config.h | 30 + .../src/profile/profile_hist.c | 45 + .../src/profile/profile_mcount_arm.S | 18 + .../src/profile/profile_mcount_mb.S | 42 + .../src/profile/profile_mcount_ppc.S | 44 + .../libsrc/standalone_v8_0/src/pvr.c | 65 + .../libsrc/standalone_v8_0/src/pvr.h | 524 + .../libsrc/standalone_v8_0/src/sleep.h | 105 + .../src/versal/xil_error_node.h | 484 + .../standalone_v8_0/src/versal/xil_hw.h | 98 + .../src/versal_net/xil_error_node.h | 724 + .../standalone_v8_0/src/versal_net/xil_hw.h | 96 + .../libsrc/standalone_v8_0/src/xbasic_types.h | 113 + .../libsrc/standalone_v8_0/src/xdebug.h | 73 + .../libsrc/standalone_v8_0/src/xenv.h | 169 + .../standalone_v8_0/src/xenv_standalone.h | 350 + .../libsrc/standalone_v8_0/src/xil_assert.c | 126 + .../libsrc/standalone_v8_0/src/xil_assert.h | 176 + .../libsrc/standalone_v8_0/src/xil_cache.c | 62 + .../libsrc/standalone_v8_0/src/xil_cache.h | 392 + .../standalone_v8_0/src/xil_cache_vxworks.h | 74 + .../libsrc/standalone_v8_0/src/xil_clocking.c | 128 + .../libsrc/standalone_v8_0/src/xil_clocking.h | 65 + .../standalone_v8_0/src/xil_exception.c | 178 + .../standalone_v8_0/src/xil_exception.h | 112 + .../libsrc/standalone_v8_0/src/xil_hal.h | 43 + .../libsrc/standalone_v8_0/src/xil_io.h | 412 + .../standalone_v8_0/src/xil_macroback.h | 1112 + .../libsrc/standalone_v8_0/src/xil_mem.c | 70 + .../libsrc/standalone_v8_0/src/xil_mem.h | 47 + .../src/xil_misc_psreset_api.c | 437 + .../src/xil_misc_psreset_api.h | 257 + .../libsrc/standalone_v8_0/src/xil_printf.c | 447 + .../libsrc/standalone_v8_0/src/xil_printf.h | 53 + .../standalone_v8_0/src/xil_sleepcommon.c | 85 + .../standalone_v8_0/src/xil_testcache.c | 341 + .../standalone_v8_0/src/xil_testcache.h | 54 + .../libsrc/standalone_v8_0/src/xil_testio.c | 273 + .../libsrc/standalone_v8_0/src/xil_testio.h | 76 + .../libsrc/standalone_v8_0/src/xil_testmem.c | 1575 + .../libsrc/standalone_v8_0/src/xil_testmem.h | 165 + .../libsrc/standalone_v8_0/src/xil_types.h | 211 + .../libsrc/standalone_v8_0/src/xil_util.c | 1332 + .../libsrc/standalone_v8_0/src/xil_util.h | 240 + .../standalone_v8_0/src/xinterrupt_wrap.c | 446 + .../standalone_v8_0/src/xinterrupt_wrap.h | 76 + .../standalone_v8_0/src/xplatform_info.c | 147 + .../standalone_v8_0/src/xplatform_info.h | 115 + .../libsrc/standalone_v8_0/src/xstatus.h | 522 + .../libsrc/sysmon_v7_7/src/Makefile | 39 + .../libsrc/sysmon_v7_7/src/xsysmon.c | 1893 ++ .../libsrc/sysmon_v7_7/src/xsysmon.h | 640 + .../libsrc/sysmon_v7_7/src/xsysmon_g.c | 33 + .../libsrc/sysmon_v7_7/src/xsysmon_hw.h | 664 + .../libsrc/sysmon_v7_7/src/xsysmon_intr.c | 295 + .../libsrc/sysmon_v7_7/src/xsysmon_selftest.c | 118 + .../libsrc/sysmon_v7_7/src/xsysmon_sinit.c | 77 + .../libsrc/tmrctr_v4_9/src/Makefile | 39 + .../libsrc/tmrctr_v4_9/src/xtmrctr.c | 706 + .../libsrc/tmrctr_v4_9/src/xtmrctr.h | 313 + .../libsrc/tmrctr_v4_9/src/xtmrctr_g.c | 32 + .../libsrc/tmrctr_v4_9/src/xtmrctr_i.h | 54 + .../libsrc/tmrctr_v4_9/src/xtmrctr_intr.c | 209 + .../libsrc/tmrctr_v4_9/src/xtmrctr_l.c | 53 + .../libsrc/tmrctr_v4_9/src/xtmrctr_l.h | 415 + .../libsrc/tmrctr_v4_9/src/xtmrctr_options.c | 191 + .../libsrc/tmrctr_v4_9/src/xtmrctr_selftest.c | 140 + .../libsrc/tmrctr_v4_9/src/xtmrctr_sinit.c | 77 + .../libsrc/tmrctr_v4_9/src/xtmrctr_stats.c | 89 + .../libsrc/uartlite_v3_7/src/Makefile | 39 + .../libsrc/uartlite_v3_7/src/xuartlite.c | 655 + .../libsrc/uartlite_v3_7/src/xuartlite.h | 274 + .../libsrc/uartlite_v3_7/src/xuartlite_g.c | 34 + .../libsrc/uartlite_v3_7/src/xuartlite_i.h | 100 + .../libsrc/uartlite_v3_7/src/xuartlite_intr.c | 309 + .../libsrc/uartlite_v3_7/src/xuartlite_l.c | 95 + .../libsrc/uartlite_v3_7/src/xuartlite_l.h | 310 + .../uartlite_v3_7/src/xuartlite_selftest.c | 114 + .../uartlite_v3_7/src/xuartlite_sinit.c | 122 + .../uartlite_v3_7/src/xuartlite_stats.c | 118 + .../standalone_microblaze_0/bsp/system.mss | 141 + .../standalone_microblaze_0/bsp/system_0.mss | 141 + vitis/top/platform.spr | 1 + vitis/top/platform.tcl | 79 + vitis/top/tempdsa/aie_primitive.json | 13 + vitis/top/tempdsa/top.mmi | 178 + vitis/top/tempdsa/top.xsa | Bin 0 -> 183243 bytes 1975 files changed, 703353 insertions(+) create mode 100644 .gitignore create mode 100644 python/.gitignore create mode 100755 python/data_recorder.py create mode 100755 python/data_structures.py create mode 100755 python/radar_manager.py create mode 100755 python/read_data_file.py create mode 100755 python/test_cpi.py create mode 100755 radar_alinx_kintex.srcs/constrs_1/new/constraints.xdc create mode 100644 radar_alinx_kintex.srcs/sources_1/bd/microblaze_bd/.gitignore create mode 100755 radar_alinx_kintex.srcs/sources_1/bd/microblaze_bd/microblaze_bd.bd create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/axi_intf.sv create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/axil_slave.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/digital_rx_chain.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/ethernet_top.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/spi.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/timing_engine.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/top.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/util_reg.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arbiter.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp_cache.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp_eth_rx.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp_eth_tx.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_adapter.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_async_fifo.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_async_fifo_adapter.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_fifo.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_rx_32.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_rx_64.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_tx_32.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_tx_64.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_arb_mux.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_axis_rx.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_axis_tx.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_mac_10g.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_mac_10g_fifo.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_ber_mon.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_frame_sync.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_if.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_watchdog.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_tx.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_tx_if.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_xcvr_phy_quad_wrapper.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_xcvr_phy_wrapper.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/fpga_core.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_64.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_arb_mux.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_complete_64.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_eth_rx_64.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_eth_tx_64.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/lfsr.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_ctrl_rx.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_ctrl_tx.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_pause_ctrl_rx.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_pause_ctrl_tx.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/priority_encoder.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ptp_clock_cdc.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/sync_reset.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_64.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_checksum_gen_64.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_complete_64.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_ip_rx_64.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_ip_tx_64.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/xgmii_baser_dec_64.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/xgmii_baser_enc_64.v create mode 100755 radar_alinx_kintex.srcs/sources_1/hdl/waveform_gen.v create mode 100755 radar_alinx_kintex.srcs/sources_1/ip/axis_switch_0/axis_switch_0.xci create mode 100755 radar_alinx_kintex.srcs/sources_1/ip/clock_converter/clock_converter.xci create mode 100755 radar_alinx_kintex.srcs/sources_1/ip/data_fifo/data_fifo.xci create mode 100755 radar_alinx_kintex.srcs/sources_1/ip/dig_rx_clock_converter/dig_rx_clock_converter.xci create mode 100755 radar_alinx_kintex.srcs/sources_1/ip/dig_rx_dwidth_converter/dig_rx_dwidth_converter.xci create mode 100755 radar_alinx_kintex.srcs/sources_1/ip/eth_xcvr_gt_channel/eth_xcvr_gt_channel.xci create mode 100755 radar_alinx_kintex.srcs/sources_1/ip/eth_xcvr_gt_full/eth_xcvr_gt_full.xci create mode 100755 radar_alinx_kintex.srcs/sources_1/ip/hdr_fifo/hdr_fifo.xci create mode 100755 radar_alinx_kintex.srcs/sources_1/ip/hdr_mem/hdr_mem.xci create mode 100755 radar_alinx_kintex.srcs/sources_1/ip/pulse_buffer_fifo/pulse_buffer_fifo.xci create mode 100755 radar_alinx_kintex.srcs/sources_1/ip/wf_memory/wf_memory.xci create mode 100755 radar_alinx_kintex.srcs/sources_1/ip/width_converter/width_converter.xci create mode 100755 radar_alinx_kintex.srcs/utils_1/imports/synth_1/top.dcp create mode 100755 radar_alinx_kintex.xpr create mode 100644 top.xsa create mode 100644 vitis/.gitignore create mode 100644 vitis/bootloader/.cproject create mode 100644 vitis/bootloader/.gitignore create mode 100644 vitis/bootloader/.project create mode 100644 vitis/bootloader/_ide/bitstream/top.mmi create mode 100644 vitis/bootloader/_ide/hwspec.checksum create mode 100644 vitis/bootloader/_ide/launch/Debugger_bootloader-Default.launch create mode 100644 vitis/bootloader/bootloader.prj create mode 100644 vitis/bootloader/src/blconfig.h create mode 100644 vitis/bootloader/src/bootloader.c create mode 100644 vitis/bootloader/src/errors.h create mode 100644 vitis/bootloader/src/lscript.ld create mode 100644 vitis/bootloader/src/platform.c create mode 100644 vitis/bootloader/src/platform_config.h create mode 100644 vitis/bootloader/src/portab.h create mode 100644 vitis/bootloader/src/srec.c create mode 100644 vitis/bootloader/src/srec.h create mode 100644 vitis/bootloader_system/.cproject create mode 100644 vitis/bootloader_system/.gitignore create mode 100644 vitis/bootloader_system/.project create mode 100644 vitis/bootloader_system/_ide/scripts/debugger_bootloader-default.tcl create mode 100644 vitis/bootloader_system/bootloader_system.sprj create mode 100755 vitis/radar/.cproject create mode 100755 vitis/radar/.gitignore create mode 100755 vitis/radar/.project create mode 100644 vitis/radar/_ide/bitstream/top.mmi create mode 100755 vitis/radar/_ide/hwspec.checksum create mode 100755 vitis/radar/_ide/launch/Debugger_radar-Default.launch create mode 100755 vitis/radar/_ide/launch/Debugger_radar-sw only.launch create mode 100755 vitis/radar/_ide/launch/IBERT.launch create mode 100755 vitis/radar/radar.prj create mode 100755 vitis/radar/src/.vscode/settings.json create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_bf_ad9081.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_bf_impala_tc.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_bf_jrxa_des.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_bf_jtx_dual_link.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_bf_jtx_qbf_ad9081.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_bf_lcpll_28nm.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_bf_main.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_bf_nb_coarse_nco.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_bf_nb_ddc_dformat.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_bf_nb_fine_nco.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_bf_rx_paging.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_bf_ser_phy.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_bf_spi_only_up.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_config.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/inc/adi_ad9081_hal.h create mode 100755 vitis/radar/src/ad9081_api/ad9081/src/adi_ad9081_adc.c create mode 100755 vitis/radar/src/ad9081_api/ad9081/src/adi_ad9081_dac.c create mode 100755 vitis/radar/src/ad9081_api/ad9081/src/adi_ad9081_device.c create mode 100755 vitis/radar/src/ad9081_api/ad9081/src/adi_ad9081_hal.c create mode 100755 vitis/radar/src/ad9081_api/ad9081/src/adi_ad9081_jesd.c create mode 100755 vitis/radar/src/ad9081_api/ad9081/src/adi_ad9081_sync.c create mode 100755 vitis/radar/src/ad9081_api/adi_inc/adi_ad7175.h create mode 100755 vitis/radar/src/ad9081_api/adi_inc/adi_ad9081.h create mode 100755 vitis/radar/src/ad9081_api/adi_inc/adi_cms_api_common.h create mode 100755 vitis/radar/src/ad9081_api/adi_inc/adi_cms_api_config.h create mode 100755 vitis/radar/src/ad9081_api/adi_inc/adi_hmc7044.h create mode 100755 vitis/radar/src/ad9081_api/adi_utils/inc/adi_utils.h create mode 100755 vitis/radar/src/ad9081_api/adi_utils/src/adi_utils.c create mode 100755 vitis/radar/src/ad9081_api/readme.md create mode 100755 vitis/radar/src/ad9081_app_helper.c create mode 100755 vitis/radar/src/ad9081_app_helper.h create mode 100755 vitis/radar/src/ad9081_hal_functions.c create mode 100755 vitis/radar/src/ad9081_hal_functions.h create mode 100755 vitis/radar/src/data_converter_setup.c create mode 100755 vitis/radar/src/ethernet.c create mode 100755 vitis/radar/src/ethernet.h create mode 100755 vitis/radar/src/hmc7044.c create mode 100755 vitis/radar/src/hmc7044.h create mode 100755 vitis/radar/src/hmc7044/inc/hmc7044_hal.h create mode 100755 vitis/radar/src/hmc7044/inc/hmc7044_reg.h create mode 100755 vitis/radar/src/hmc7044/src/adi_hmc7044_device.c create mode 100755 vitis/radar/src/hmc7044/src/adi_hmc7044_output_ch.c create mode 100755 vitis/radar/src/hmc7044/src/adi_hmc7044_pll.c create mode 100755 vitis/radar/src/hmc7044/src/hmc7044_hal.c create mode 100755 vitis/radar/src/lscript.ld create mode 100755 vitis/radar/src/main.c create mode 100755 vitis/radar/src/main.c.backup create mode 100755 vitis/radar/src/novatel.c create mode 100755 vitis/radar/src/novatel.h create mode 100755 vitis/radar/src/pl_udp_eth.c create mode 100755 vitis/radar/src/pl_udp_eth.h create mode 100755 vitis/radar/src/project.h create mode 100755 vitis/radar/src/radar_manager_icd.c create mode 100755 vitis/radar/src/radar_manager_icd.h create mode 100755 vitis/radar/src/registers.h create mode 100755 vitis/radar/src/rf_spi.c create mode 100755 vitis/radar/src/uc_settings.c create mode 100755 vitis/radar/src/uc_settings.c.backup create mode 100755 vitis/radar/src/uc_settings.c.bak create mode 100755 vitis/radar_system/.cproject create mode 100755 vitis/radar_system/.gitignore create mode 100755 vitis/radar_system/.project create mode 100644 vitis/radar_system/_ide/flash/BOOT.bin create mode 100644 vitis/radar_system/_ide/flash/bootimage.bif create mode 100755 vitis/radar_system/_ide/flash/radar.elf.srec create mode 100755 vitis/radar_system/_ide/scripts/debugger_radar-default.tcl create mode 100755 vitis/radar_system/_ide/scripts/debugger_radar-sw_only.tcl create mode 100755 vitis/radar_system/_ide/scripts/ibert.tcl create mode 100755 vitis/radar_system/radar_system.sprj create mode 100755 vitis/top/.cproject create mode 100755 vitis/top/.gitignore create mode 100755 vitis/top/.project create mode 100644 vitis/top/hw/aie_primitive.json create mode 100644 vitis/top/hw/top.mmi create mode 100644 vitis/top/hw/top.xsa create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/dep.mk create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/FreeRTOS.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/FreeRTOSConfig.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/FreeRTOSSTMTrace.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/StackMacros.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/_profile_timer_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/arch/cc.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/arch/cpu.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/arch/perf.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/arch/sys_arch.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/atomic.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/bspconfig.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/croutine.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/deprecated_definitions.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/event_groups.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/fsl.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/list.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/altcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/altcp_tcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/altcp_tls.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/api.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/FILES create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/altcp_proxyconnect.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/altcp_tls_mbedtls_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/fs.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/http_client.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/httpd.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/httpd_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/lwiperf.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/mdns.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/mdns_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/mdns_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/mqtt.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/mqtt_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/mqtt_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/netbiosns.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/netbiosns_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/smtp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/smtp_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/snmp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/snmp_core.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/snmp_mib2.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/snmp_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/snmp_scalar.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/snmp_snmpv2_framework.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/snmp_snmpv2_usm.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/snmp_table.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/snmp_threadsync.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/snmpv3.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/sntp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/sntp_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/tftp_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/apps/tftp_server.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/arch.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/autoip.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/debug.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/def.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/dhcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/dhcp6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/dns.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/err.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/errno.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/etharp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/ethip6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/icmp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/icmp6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/if_api.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/igmp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/inet.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/inet_chksum.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/init.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/init.h.cmake.in create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/ip.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/ip4.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/ip4_addr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/ip4_frag.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/ip6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/ip6_addr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/ip6_frag.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/ip6_zone.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/ip_addr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/mem.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/memp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/mld6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/nd6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/netbuf.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/netdb.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/netif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/netifapi.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/opt.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/pbuf.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/priv/altcp_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/priv/api_msg.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/priv/mem_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/priv/memp_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/priv/memp_std.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/priv/nd6_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/priv/raw_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/priv/sockets_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/priv/tcp_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/priv/tcpip_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/autoip.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/dhcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/dhcp6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/dns.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/etharp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/ethernet.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/iana.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/icmp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/icmp6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/ieee.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/igmp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/ip.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/ip4.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/ip6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/mld6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/nd6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/tcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/prot/udp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/raw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/sio.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/snmp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/sockets.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/stats.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/sys.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/tcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/tcpbase.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/tcpip.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/timeouts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwip/udp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/lwipopts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/mb_interface.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/mblaze_nt_types.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/message_buffer.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/microblaze_exceptions_g.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/microblaze_exceptions_i.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/microblaze_instructions.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/microblaze_interrupts_i.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/microblaze_sleep.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/mpu_prototypes.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/mpu_wrappers.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/bridgeif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/bridgeif_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/etharp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ethernet.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ieee802154.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/lowpan6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/lowpan6_ble.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/lowpan6_common.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/lowpan6_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/ccp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/chap-md5.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/chap-new.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/chap_ms.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/eap.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/ecp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/eui64.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/fsm.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/ipcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/ipv6cp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/lcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/magic.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/mppe.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/polarssl/arc4.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/polarssl/des.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/polarssl/md4.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/polarssl/md5.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/polarssl/sha1.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/ppp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/ppp_impl.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/ppp_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/pppapi.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/pppcrypt.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/pppdebug.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/pppoe.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/pppol2tp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/pppos.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/upap.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/ppp/vj.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/slipif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/xadapter.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/xaxiemacif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/xemacliteif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/xemacpsif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/xlltemacif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/xpqueue.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/xtopology.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/netif/zepif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/portable.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/portmacro.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/profile.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/projdefs.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/pvr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/queue.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/semphr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/sleep.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/stack_macros.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/stream_buffer.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/task.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/timers.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xaxidma.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xaxidma_bd.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xaxidma_bdring.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xaxidma_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xaxidma_porting_guide.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xaxiethernet.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xaxiethernet_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xaxiethernet_porting_guide.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xbasic_types.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xbram.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xbram_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xdebug.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xenv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xenv_standalone.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_assert.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_cache.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_cache_vxworks.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_clocking.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_exception.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_hal.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_io.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_macroback.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_mem.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_misc_psreset_api.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_printf.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_testcache.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_testio.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_testmem.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_types.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xil_util.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xintc.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xintc_i.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xintc_l.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xinterrupt_wrap.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xio.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xllfifo.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xllfifo_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xlwipconfig.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xparameters.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xplatform_info.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xspi.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xspi_i.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xspi_l.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xstatus.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xstreamer.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xsysmon.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xsysmon_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xtmrctr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xtmrctr_i.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xtmrctr_l.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xuartlite.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xuartlite_i.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/include/xuartlite_l.h create mode 100755 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/lib/libc.a create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/lib/libfreertos.a create mode 100755 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/lib/libgcc.a create mode 100755 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/lib/libgloss.a create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/lib/liblwip4.a create mode 100755 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/lib/libm.a create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/lib/libxil.a create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_bd.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_bd.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_bdring.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_bdring.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_g.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_porting_guide.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_selftest.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_sinit.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/xaxiethernet.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/xaxiethernet.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/xaxiethernet_control.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/xaxiethernet_g.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/xaxiethernet_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/xaxiethernet_porting_guide.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/xaxiethernet_sinit.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/xbram.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/xbram.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/xbram_g.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/xbram_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/xbram_intr.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/xbram_selftest.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/xbram_sinit.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/cpu_v2_16/src/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/cpu_v2_16/src/xio.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/cpu_v2_16/src/xio.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/FreeRTOS.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/FreeRTOSConfig.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/FreeRTOSSTMTrace.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/License/LICENSE.md create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Makefile_dep create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Makefile_microblaze create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Makefile_ps7_cortexa9 create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Makefile_psu_cortexa53 create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Makefile_psu_cortexr5 create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/croutine.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/event_groups.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/FreeRTOS.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/StackMacros.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/atomic.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/croutine.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/deprecated_definitions.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/event_groups.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/list.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/message_buffer.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/mpu_prototypes.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/mpu_wrappers.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/portable.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/projdefs.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/queue.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/semphr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/stack_macros.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/stdint.readme create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/stream_buffer.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/task.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/include/timers.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/list.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CA53/port.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CA53/portASM.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CA53/portZynqUltrascale.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CA53/port_asm_vectors.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CA53/portmacro.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CA9/port.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CA9/portASM.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CA9/portZynq7000.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CA9/port_asm_vectors.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CA9/portmacro.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CR5/port.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CR5/portASM.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CR5/portZynqUltrascale.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CR5/port_asm_vectors.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/ARM_CR5/portmacro.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/MicroBlazeV9/port.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/MicroBlazeV9/port_exceptions.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/MicroBlazeV9/portasm.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/MicroBlazeV9/portmacro.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/GCC/MicroBlazeV9/portmicroblaze.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/MemMang/ReadMe.url create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/MemMang/heap_1.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/MemMang/heap_2.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/MemMang/heap_3.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/MemMang/heap_4.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/portable/MemMang/heap_5.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/queue.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/readme.txt create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/stream_buffer.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/tasks.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/Source/timers.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/StackMacros.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/atomic.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/croutine.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/deprecated_definitions.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/event_groups.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/event_groups.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/heap_4.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/inbyte.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/list.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/list.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/message_buffer.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/microblaze_exceptions_g.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/mpu_prototypes.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/mpu_wrappers.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/outbyte.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/port.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/port_exceptions.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/portable.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/portasm.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/portmacro.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/portmicroblaze.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/projdefs.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/queue.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/queue.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/semphr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/stack_macros.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/stream_buffer.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/task.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/tasks.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/timers.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/freertos10_xilinx_v1_12/src/timers.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc_g.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc_i.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc_intr.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc_l.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc_l.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc_options.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc_selftest.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/xllfifo.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/xllfifo.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/xllfifo_g.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/xllfifo_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/xllfifo_sinit.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/xstreamer.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/xstreamer.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/ChangeLog create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/Makefile.adapter create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/Makefile.config create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/Makefile.lwip create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/include/arch/cc.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/include/arch/cpu.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/include/arch/perf.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/include/arch/sys_arch.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/include/lwipopts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/include/netif/xadapter.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/include/netif/xaxiemacif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/include/netif/xemacliteif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/include/netif/xemacpsif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/include/netif/xlltemacif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/include/netif/xpqueue.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/include/netif/xtopology.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/include/xlwipconfig.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xadapter.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xaxiemacif.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xaxiemacif_dma.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xaxiemacif_fifo.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xaxiemacif_fifo.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xaxiemacif_hw.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xaxiemacif_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xaxiemacif_mcdma.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xaxiemacif_physpeed.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xemac_ieee_reg.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xemacliteif.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xemacpsif.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xemacpsif_dma.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xemacpsif_hw.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xemacpsif_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xemacpsif_physpeed.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xpqueue.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/netif/xtopology_g.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/sys_arch.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/contrib/ports/xilinx/sys_arch_raw.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/CHANGELOG create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/CMakeLists.txt create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/COPYING create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/FEATURES create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/FILES create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/README create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/UPGRADING create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/FILES create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/Filelists.cmake create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/Filelists.mk create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/api/api_lib.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/api/api_msg.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/api/err.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/api/if_api.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/api/netbuf.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/api/netdb.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/api/netifapi.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/api/sockets.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/api/tcpip.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/altcp_tls/altcp_tls_mbedtls.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/altcp_tls/altcp_tls_mbedtls_mem.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/http/altcp_proxyconnect.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/http/fs.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/http/fs/404.html create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/http/fs/img/sics.gif create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/http/fs/index.html create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/http/fsdata.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/http/fsdata.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/http/http_client.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/http/httpd.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/http/httpd_structs.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/http/makefsdata/makefsdata create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/http/makefsdata/makefsdata.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/http/makefsdata/readme.txt create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/http/makefsdata/tinydir.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/lwiperf/lwiperf.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/mdns/mdns.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/mqtt/mqtt.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/netbiosns/netbiosns.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/smtp/smtp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_asn1.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_asn1.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_core.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_core_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_mib2.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_mib2_icmp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_mib2_interfaces.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_mib2_ip.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_mib2_snmp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_mib2_system.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_mib2_tcp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_mib2_udp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_msg.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_msg.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_netconn.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_pbuf_stream.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_pbuf_stream.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_raw.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_scalar.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_snmpv2_framework.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_snmpv2_usm.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_table.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_threadsync.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmp_traps.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmpv3.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmpv3_mbedtls.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/snmp/snmpv3_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/sntp/sntp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/apps/tftp/tftp_server.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/altcp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/altcp_alloc.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/altcp_tcp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/def.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/dns.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/inet_chksum.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/init.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ip.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv4/autoip.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv4/dhcp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv4/etharp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv4/icmp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv4/igmp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv4/ip4.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv4/ip4_addr.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv4/ip4_frag.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv6/dhcp6.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv6/ethip6.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv6/icmp6.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv6/inet6.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv6/ip6.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv6/ip6_addr.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv6/ip6_frag.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv6/mld6.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/ipv6/nd6.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/mem.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/memp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/netif.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/pbuf.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/raw.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/stats.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/sys.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/tcp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/tcp_in.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/tcp_out.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/timeouts.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/core/udp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/compat/posix/arpa/inet.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/compat/posix/net/if.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/compat/posix/netdb.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/compat/posix/sys/socket.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/compat/stdc/errno.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/altcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/altcp_tcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/altcp_tls.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/api.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/FILES create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/altcp_proxyconnect.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/altcp_tls_mbedtls_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/fs.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/http_client.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/httpd.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/httpd_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/lwiperf.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/mdns.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/mdns_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/mdns_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/mqtt.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/mqtt_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/mqtt_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/netbiosns.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/netbiosns_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/smtp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/smtp_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/snmp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/snmp_core.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/snmp_mib2.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/snmp_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/snmp_scalar.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/snmp_snmpv2_framework.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/snmp_snmpv2_usm.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/snmp_table.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/snmp_threadsync.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/snmpv3.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/sntp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/sntp_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/tftp_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/apps/tftp_server.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/arch.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/autoip.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/debug.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/def.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/dhcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/dhcp6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/dns.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/err.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/errno.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/etharp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/ethip6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/icmp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/icmp6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/if_api.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/igmp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/inet.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/inet_chksum.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/init.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/init.h.cmake.in create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/ip.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/ip4.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/ip4_addr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/ip4_frag.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/ip6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/ip6_addr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/ip6_frag.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/ip6_zone.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/ip_addr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/mem.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/memp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/mld6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/nd6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/netbuf.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/netdb.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/netif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/netifapi.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/opt.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/pbuf.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/priv/altcp_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/priv/api_msg.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/priv/mem_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/priv/memp_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/priv/memp_std.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/priv/nd6_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/priv/raw_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/priv/sockets_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/priv/tcp_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/priv/tcpip_priv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/autoip.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/dhcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/dhcp6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/dns.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/etharp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/ethernet.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/iana.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/icmp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/icmp6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/ieee.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/igmp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/ip.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/ip4.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/ip6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/mld6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/nd6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/tcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/prot/udp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/raw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/sio.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/snmp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/sockets.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/stats.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/sys.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/tcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/tcpbase.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/tcpip.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/timeouts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/lwip/udp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/bridgeif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/bridgeif_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/etharp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ethernet.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ieee802154.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/lowpan6.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/lowpan6_ble.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/lowpan6_common.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/lowpan6_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/ccp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/chap-md5.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/chap-new.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/chap_ms.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/eap.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/ecp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/eui64.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/fsm.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/ipcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/ipv6cp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/lcp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/magic.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/mppe.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/polarssl/arc4.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/polarssl/des.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/polarssl/md4.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/polarssl/md5.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/polarssl/sha1.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/ppp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/ppp_impl.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/ppp_opts.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/pppapi.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/pppcrypt.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/pppdebug.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/pppoe.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/pppol2tp.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/pppos.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/upap.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/ppp/vj.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/slipif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/include/netif/zepif.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/FILES create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/bridgeif.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/bridgeif_fdb.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ethernet.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/lowpan6.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/lowpan6_ble.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/lowpan6_common.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/PPPD_FOLLOWUP create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/auth.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/ccp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/chap-md5.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/chap-new.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/chap_ms.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/demand.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/eap.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/ecp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/eui64.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/fsm.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/ipcp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/ipv6cp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/lcp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/magic.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/mppe.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/multilink.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/polarssl/README create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/polarssl/arc4.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/polarssl/des.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/polarssl/md4.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/polarssl/md5.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/polarssl/sha1.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/ppp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/pppapi.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/pppcrypt.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/pppoe.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/pppol2tp.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/pppos.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/upap.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/utils.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/ppp/vj.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/slipif.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/lwip211_v1_8/src/lwip-2.1.1/src/netif/zepif.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/mig_v1_1/src/xmig.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi_g.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi_i.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi_l.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi_options.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi_selftest.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi_sinit.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi_stats.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/Makefile_depends create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/_exit.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/gcc/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/gcc/asm_vectors.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/gcc/boot.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/gcc/cpu_init.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/gcc/xil-crt0.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/platform/ZynqMP/CMakeLists.txt create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/platform/ZynqMP/translation_table.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/platform/ZynqMP/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/platform/versal/CMakeLists.txt create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/platform/versal/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/sleep.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/usleep.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xil_cache.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xil_cache.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xil_cache_l.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xil_mmu.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xil_mmu.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xpseudo_asm.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xreg_cortexa53.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xtime_l.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xtime_l.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/armclang/ARM_argv_veneer.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/armclang/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/armclang/asm_vectors.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/armclang/boot.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/armclang/xpseudo_asm_armclang.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/gcc/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/gcc/asm_vectors.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/gcc/boot.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/gcc/initialise_monitor_handles.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/gcc/xil-crt0.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/platform/ZynqMP/armclang/translation_table.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/platform/ZynqMP/gcc/translation_table.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/platform/ZynqMP/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/platform/versal/armclang/translation_table.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/platform/versal/gcc/translation_table.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/platform/versal/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/sleep.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xil_cache.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xil_cache.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xil_errata.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xil_mmu.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xil_mmu.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xil_smc.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xil_smc.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpm_counter.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpseudo_asm.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/arm64_ops.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/hypercall.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/hypercall.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/xen.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/xen_console.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/xen_console.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/xen_events.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/xen_events.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xreg_cortexa53.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xtime_l.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xtime_l.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xfpd_slave_xmpu.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xfpd_slcr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xfpd_slcr_secure.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xlpd_iou_secure_slcr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xlpd_iou_slcr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xlpd_slcr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xlpd_slcr_secure.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xlpd_xppu.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xocm_xmpu.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xpmc_iou_secure_slcr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xpmc_iou_slcr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xpmc_xmpu.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xpmc_xppu.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xddr_xmpu0_cfg.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xddr_xmpu1_cfg.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xddr_xmpu2_cfg.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xddr_xmpu3_cfg.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xddr_xmpu4_cfg.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xddr_xmpu5_cfg.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xfpd_slcr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xfpd_slcr_secure.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xfpd_xmpu_cfg.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xfpd_xmpu_sink.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xiou_secure_slcr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xiou_slcr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xlpd_slcr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xlpd_slcr_secure.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xlpd_xppu.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xlpd_xppu_sink.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xocm_xmpu_cfg.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_close.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_exit.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_iserror.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_istty.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_open.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_read.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_time.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_write.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/_exit.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/_open.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/_sbrk.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/abort.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/close.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/cpputest_time.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/errno.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/fcntl.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/fstat.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/getpid.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/isatty.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/kill.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/lseek.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/open.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/read.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/sbrk.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/time.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/unlink.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/write.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/xpseudo_asm_gcc.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/abort.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/clock.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/close.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/exit.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/low_level_init.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/lseek.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/open.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/read.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/remove.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/write.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/xpseudo_asm_iccarm.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/xpseudo_asm_iccarm.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/putnum.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/vectors.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/vectors.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/xil_exception.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/xil_exception.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/xil_sleeptimer.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/xil_sleeptimer.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/xil_spinlock.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/xil_spinlock.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/xpm_counter.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/ARM_argv_veneer.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_close.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_exit.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_iserror.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_istty.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_open.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_read.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_time.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_write.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/asm_vectors.s create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/boot.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/translation_table.s create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/xpseudo_asm_rvct.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/xpseudo_asm_rvct.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/gcc/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/gcc/asm_vectors.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/gcc/boot.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/gcc/cpu_init.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/gcc/translation_table.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/gcc/xil-crt0.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/iccarm/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/iccarm/asm_vectors.s create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/iccarm/boot.s create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/iccarm/translation_table.s create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/sleep.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/smc.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/usleep.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_cache.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_cache.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_cache_l.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_errata.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_misc_psreset_api.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_misc_psreset_api.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_mmu.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_mmu.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xl2cc.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xl2cc_counter.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xl2cc_counter.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xpm_counter.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xpseudo_asm.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xreg_cortexa9.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xtime_l.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xtime_l.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/armclang/ARM_argv_veneer.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/armclang/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/armclang/asm_vectors.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/armclang/boot.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/armclang/cpu_init.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/armclang/xil-crt0.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/armclang/xpseudo_asm_armclang.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/gcc/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/gcc/asm_vectors.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/gcc/boot.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/gcc/cpu_init.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/gcc/xil-crt0.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/iccarm/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/iccarm/asm_vectors.s create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/iccarm/boot.s create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/platform/CMakeLists.txt create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/platform/ZynqMP/CMakeLists.txt create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/platform/ZynqMP/mpu.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/platform/ZynqMP/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/platform/versal/CMakeLists.txt create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/platform/versal/mpu.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/platform/versal/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/sleep.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/usleep.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xil_cache.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xil_cache.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xil_mmu.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xil_mpu.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xil_mpu.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xpm_counter.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xpseudo_asm.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xreg_cortexr5.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xtime_l.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xtime_l.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/platform/versal_net/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/bspconfig.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/changelog.txt create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/clocking/xil_clocking.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/clocking/xil_clocking.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/clocking/xil_clocking.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/clocking/xil_clocking.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/intr/xinterrupt_wrap.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/intr/xinterrupt_wrap.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/print.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/sleep.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/versal/xil_error_node.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/versal/xil_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/versal_net/xil_error_node.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/versal_net/xil_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xbasic_types.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xdebug.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xenv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xenv_standalone.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_assert.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_assert.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_cache_vxworks.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_hal.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_io.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_macroback.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_mem.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_mem.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_printf.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_printf.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_sleepcommon.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_testcache.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_testcache.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_testio.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_testio.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_testmem.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_testmem.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_types.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_util.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_util.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xplatform_info.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xplatform_info.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xstatus.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/config.make create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/errno.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/fcntl.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/fsl.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/hw_exception_handler.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/inbyte.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/intr/xinterrupt_wrap.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/intr/xinterrupt_wrap.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/mb_interface.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/_exit.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/errno.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/fcntl.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/fsl.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/hw_exception_handler.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/mb_interface.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_disable_dcache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_disable_exceptions.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_disable_icache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_disable_interrupts.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_enable_dcache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_enable_exceptions.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_enable_icache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_enable_interrupts.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_exception_handler.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_exceptions_g.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_exceptions_i.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_flush_cache_ext.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_flush_cache_ext_range.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_flush_dcache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_flush_dcache_range.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_init_dcache_range.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_init_icache_range.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_instructions.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_interrupt_handler.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_interrupts_g.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_interrupts_i.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_invalidate_cache_ext.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_invalidate_cache_ext_range.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_invalidate_dcache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_invalidate_dcache_range.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_invalidate_icache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_invalidate_icache_range.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_scrub.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_selftest.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_sleep.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_sleep.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_update_dcache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_update_icache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/pvr.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/pvr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/xil_cache.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/xil_cache.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/xil_exception.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/xil_exception.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/xil_misc_psreset_api.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/xil_misc_psreset_api.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_disable_dcache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_disable_exceptions.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_disable_icache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_disable_interrupts.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_enable_dcache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_enable_exceptions.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_enable_icache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_enable_interrupts.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_exception_handler.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_exceptions_g.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_exceptions_i.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_flush_cache_ext.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_flush_cache_ext_range.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_flush_dcache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_flush_dcache_range.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_init_dcache_range.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_init_icache_range.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_instructions.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_interrupts_g.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_interrupts_i.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_invalidate_cache_ext.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_invalidate_cache_ext_range.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_invalidate_dcache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_invalidate_dcache_range.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_invalidate_icache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_invalidate_icache_range.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_scrub.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_selftest.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_sleep.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_sleep.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_update_dcache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_update_icache.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/outbyte.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/print.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/_profile_clean.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/_profile_init.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/_profile_timer_hw.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/_profile_timer_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/dummy.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/mblaze_nt_types.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/profile.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/profile_cg.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/profile_config.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/profile_hist.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/profile_mcount_arm.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/profile_mcount_mb.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/profile_mcount_ppc.S create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/pvr.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/pvr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/sleep.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/versal/xil_error_node.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/versal/xil_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/versal_net/xil_error_node.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/versal_net/xil_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xbasic_types.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xdebug.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xenv.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xenv_standalone.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_assert.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_assert.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_cache.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_cache.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_cache_vxworks.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_clocking.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_clocking.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_exception.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_exception.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_hal.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_io.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_macroback.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_mem.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_mem.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_misc_psreset_api.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_misc_psreset_api.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_printf.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_printf.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_sleepcommon.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_testcache.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_testcache.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_testio.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_testio.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_testmem.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_testmem.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_types.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_util.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_util.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xinterrupt_wrap.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xinterrupt_wrap.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xplatform_info.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xplatform_info.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xstatus.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/xsysmon.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/xsysmon.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/xsysmon_g.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/xsysmon_hw.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/xsysmon_intr.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/xsysmon_selftest.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/xsysmon_sinit.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_g.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_i.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_intr.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_l.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_l.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_options.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_selftest.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_sinit.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_stats.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/Makefile create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_g.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_i.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_intr.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_l.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_l.h create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_selftest.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_sinit.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_stats.c create mode 100644 vitis/top/microblaze_0/freertos10_xilinx_microblaze_0/bsp/system.mss create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/dep.mk create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/_profile_timer_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/bspconfig.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/fsl.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/mb_interface.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/mblaze_nt_types.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/microblaze_exceptions_g.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/microblaze_exceptions_i.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/microblaze_instructions.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/microblaze_interrupts_i.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/microblaze_sleep.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/profile.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/pvr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/sleep.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xaxidma.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xaxidma_bd.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xaxidma_bdring.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xaxidma_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xaxidma_porting_guide.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xaxiethernet.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xaxiethernet_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xaxiethernet_porting_guide.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xbasic_types.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xbram.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xbram_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xdebug.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xenv.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xenv_standalone.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_assert.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_cache.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_cache_vxworks.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_clocking.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_exception.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_hal.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_io.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_macroback.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_mem.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_misc_psreset_api.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_printf.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_testcache.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_testio.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_testmem.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_types.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xil_util.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xintc.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xintc_i.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xintc_l.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xinterrupt_wrap.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xio.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xllfifo.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xllfifo_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xparameters.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xplatform_info.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xspi.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xspi_i.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xspi_l.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xstatus.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xstreamer.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xsysmon.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xsysmon_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xtmrctr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xtmrctr_i.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xtmrctr_l.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xuartlite.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xuartlite_i.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/include/xuartlite_l.h create mode 100755 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/lib/libc.a create mode 100755 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/lib/libgcc.a create mode 100755 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/lib/libgloss.a create mode 100755 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/lib/libm.a create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/lib/libxil.a create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_bd.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_bd.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_bdring.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_bdring.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_g.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_porting_guide.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_selftest.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axidma_v9_15/src/xaxidma_sinit.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/xaxiethernet.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/xaxiethernet.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/xaxiethernet_control.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/xaxiethernet_g.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/xaxiethernet_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/xaxiethernet_porting_guide.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/axiethernet_v5_14/src/xaxiethernet_sinit.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/xbram.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/xbram.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/xbram_g.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/xbram_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/xbram_intr.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/xbram_selftest.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/bram_v4_8/src/xbram_sinit.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/cpu_v2_16/src/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/cpu_v2_16/src/xio.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/cpu_v2_16/src/xio.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc_g.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc_i.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc_intr.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc_l.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc_l.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc_options.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/intc_v3_15/src/xintc_selftest.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/xllfifo.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/xllfifo.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/xllfifo_g.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/xllfifo_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/xllfifo_sinit.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/xstreamer.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/llfifo_v5_5/src/xstreamer.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/mig_v1_1/src/xmig.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi_g.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi_i.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi_l.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi_options.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi_selftest.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi_sinit.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/spi_v4_9/src/xspi_stats.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/_exit.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/gcc/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/gcc/asm_vectors.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/gcc/boot.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/gcc/cpu_init.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/gcc/xil-crt0.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/platform/ZynqMP/CMakeLists.txt create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/platform/ZynqMP/translation_table.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/platform/ZynqMP/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/platform/versal/CMakeLists.txt create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/platform/versal/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/sleep.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/usleep.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xil_cache.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xil_cache.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xil_cache_l.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xil_mmu.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xil_mmu.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xpseudo_asm.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xreg_cortexa53.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xtime_l.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/32bit/xtime_l.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/armclang/ARM_argv_veneer.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/armclang/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/armclang/asm_vectors.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/armclang/boot.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/armclang/xpseudo_asm_armclang.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/gcc/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/gcc/asm_vectors.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/gcc/boot.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/gcc/initialise_monitor_handles.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/gcc/xil-crt0.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/platform/ZynqMP/armclang/translation_table.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/platform/ZynqMP/gcc/translation_table.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/platform/ZynqMP/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/platform/versal/armclang/translation_table.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/platform/versal/gcc/translation_table.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/platform/versal/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/sleep.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xil_cache.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xil_cache.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xil_errata.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xil_mmu.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xil_mmu.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xil_smc.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xil_smc.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpm_counter.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpseudo_asm.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/arm64_ops.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/hypercall.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/hypercall.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/xen.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/xen_console.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/xen_console.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/xen_events.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xpvxenconsole/xen_events.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xreg_cortexa53.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xtime_l.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/64bit/xtime_l.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xfpd_slave_xmpu.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xfpd_slcr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xfpd_slcr_secure.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xlpd_iou_secure_slcr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xlpd_iou_slcr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xlpd_slcr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xlpd_slcr_secure.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xlpd_xppu.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xocm_xmpu.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xpmc_iou_secure_slcr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xpmc_iou_slcr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xpmc_xmpu.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/Versal/xpmc_xppu.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xddr_xmpu0_cfg.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xddr_xmpu1_cfg.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xddr_xmpu2_cfg.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xddr_xmpu3_cfg.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xddr_xmpu4_cfg.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xddr_xmpu5_cfg.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xfpd_slcr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xfpd_slcr_secure.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xfpd_xmpu_cfg.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xfpd_xmpu_sink.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xiou_secure_slcr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xiou_slcr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xlpd_slcr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xlpd_slcr_secure.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xlpd_xppu.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xlpd_xppu_sink.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/ARMv8/includes_ps/platform/ZynqMP/xocm_xmpu_cfg.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_close.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_exit.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_iserror.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_istty.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_open.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_read.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_time.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/armclang/_sys_write.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/_exit.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/_open.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/_sbrk.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/abort.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/close.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/cpputest_time.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/errno.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/fcntl.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/fstat.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/getpid.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/isatty.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/kill.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/lseek.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/open.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/read.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/sbrk.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/time.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/unlink.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/write.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/gcc/xpseudo_asm_gcc.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/abort.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/clock.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/close.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/exit.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/low_level_init.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/lseek.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/open.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/read.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/remove.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/write.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/xpseudo_asm_iccarm.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/iccarm/xpseudo_asm_iccarm.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/putnum.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/vectors.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/vectors.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/xil_exception.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/xil_exception.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/xil_sleeptimer.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/xil_sleeptimer.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/xil_spinlock.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/xil_spinlock.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/common/xpm_counter.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/ARM_argv_veneer.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_close.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_exit.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_iserror.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_istty.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_open.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_read.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_time.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/_sys_write.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/asm_vectors.s create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/boot.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/translation_table.s create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/xpseudo_asm_rvct.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/armcc/xpseudo_asm_rvct.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/gcc/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/gcc/asm_vectors.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/gcc/boot.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/gcc/cpu_init.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/gcc/translation_table.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/gcc/xil-crt0.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/iccarm/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/iccarm/asm_vectors.s create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/iccarm/boot.s create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/iccarm/translation_table.s create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/sleep.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/smc.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/usleep.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_cache.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_cache.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_cache_l.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_errata.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_misc_psreset_api.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_misc_psreset_api.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_mmu.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xil_mmu.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xl2cc.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xl2cc_counter.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xl2cc_counter.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xpm_counter.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xpseudo_asm.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xreg_cortexa9.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xtime_l.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexa9/xtime_l.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/armclang/ARM_argv_veneer.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/armclang/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/armclang/asm_vectors.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/armclang/boot.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/armclang/cpu_init.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/armclang/xil-crt0.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/armclang/xpseudo_asm_armclang.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/gcc/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/gcc/asm_vectors.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/gcc/boot.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/gcc/cpu_init.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/gcc/xil-crt0.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/iccarm/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/iccarm/asm_vectors.s create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/iccarm/boot.s create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/platform/CMakeLists.txt create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/platform/ZynqMP/CMakeLists.txt create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/platform/ZynqMP/mpu.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/platform/ZynqMP/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/platform/versal/CMakeLists.txt create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/platform/versal/mpu.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/platform/versal/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/sleep.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/usleep.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xil_cache.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xil_cache.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xil_mmu.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xil_mpu.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xil_mpu.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xpm_counter.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xpseudo_asm.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xreg_cortexr5.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xtime_l.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/cortexr5/xtime_l.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/arm/platform/versal_net/xparameters_ps.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/bspconfig.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/changelog.txt create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/clocking/xil_clocking.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/clocking/xil_clocking.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/clocking/xil_clocking.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/clocking/xil_clocking.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/intr/xinterrupt_wrap.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/intr/xinterrupt_wrap.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/print.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/sleep.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/versal/xil_error_node.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/versal/xil_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/versal_net/xil_error_node.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/versal_net/xil_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xbasic_types.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xdebug.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xenv.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xenv_standalone.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_assert.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_assert.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_cache_vxworks.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_hal.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_io.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_macroback.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_mem.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_mem.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_printf.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_printf.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_sleepcommon.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_testcache.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_testcache.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_testio.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_testio.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_testmem.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_testmem.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_types.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_util.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xil_util.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xplatform_info.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xplatform_info.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/common/xstatus.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/config.make create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/errno.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/fcntl.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/fsl.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/hw_exception_handler.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/inbyte.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/intr/xinterrupt_wrap.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/intr/xinterrupt_wrap.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/mb_interface.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/_exit.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/errno.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/fcntl.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/fsl.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/hw_exception_handler.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/mb_interface.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_disable_dcache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_disable_exceptions.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_disable_icache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_disable_interrupts.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_enable_dcache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_enable_exceptions.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_enable_icache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_enable_interrupts.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_exception_handler.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_exceptions_g.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_exceptions_i.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_flush_cache_ext.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_flush_cache_ext_range.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_flush_dcache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_flush_dcache_range.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_init_dcache_range.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_init_icache_range.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_instructions.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_interrupt_handler.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_interrupts_g.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_interrupts_i.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_invalidate_cache_ext.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_invalidate_cache_ext_range.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_invalidate_dcache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_invalidate_dcache_range.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_invalidate_icache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_invalidate_icache_range.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_scrub.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_selftest.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_sleep.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_sleep.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_update_dcache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/microblaze_update_icache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/pvr.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/pvr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/xil_cache.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/xil_cache.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/xil_exception.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/xil_exception.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/xil_misc_psreset_api.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze/xil_misc_psreset_api.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_disable_dcache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_disable_exceptions.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_disable_icache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_disable_interrupts.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_enable_dcache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_enable_exceptions.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_enable_icache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_enable_interrupts.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_exception_handler.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_exceptions_g.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_exceptions_i.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_flush_cache_ext.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_flush_cache_ext_range.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_flush_dcache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_flush_dcache_range.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_init_dcache_range.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_init_icache_range.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_instructions.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_interrupt_handler.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_interrupts_g.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_interrupts_i.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_invalidate_cache_ext.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_invalidate_cache_ext_range.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_invalidate_dcache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_invalidate_dcache_range.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_invalidate_icache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_invalidate_icache_range.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_scrub.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_selftest.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_sleep.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_sleep.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_update_dcache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/microblaze_update_icache.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/outbyte.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/print.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/_profile_clean.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/_profile_init.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/_profile_timer_hw.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/_profile_timer_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/dummy.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/mblaze_nt_types.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/profile.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/profile_cg.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/profile_config.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/profile_hist.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/profile_mcount_arm.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/profile_mcount_mb.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/profile/profile_mcount_ppc.S create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/pvr.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/pvr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/sleep.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/versal/xil_error_node.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/versal/xil_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/versal_net/xil_error_node.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/versal_net/xil_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xbasic_types.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xdebug.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xenv.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xenv_standalone.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_assert.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_assert.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_cache.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_cache.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_cache_vxworks.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_clocking.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_clocking.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_exception.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_exception.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_hal.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_io.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_macroback.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_mem.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_mem.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_misc_psreset_api.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_misc_psreset_api.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_printf.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_printf.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_sleepcommon.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_testcache.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_testcache.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_testio.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_testio.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_testmem.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_testmem.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_types.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_util.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xil_util.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xinterrupt_wrap.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xinterrupt_wrap.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xplatform_info.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xplatform_info.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/standalone_v8_0/src/xstatus.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/xsysmon.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/xsysmon.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/xsysmon_g.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/xsysmon_hw.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/xsysmon_intr.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/xsysmon_selftest.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/sysmon_v7_7/src/xsysmon_sinit.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_g.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_i.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_intr.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_l.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_l.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_options.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_selftest.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_sinit.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/tmrctr_v4_9/src/xtmrctr_stats.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/Makefile create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_g.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_i.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_intr.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_l.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_l.h create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_selftest.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_sinit.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/microblaze_0/libsrc/uartlite_v3_7/src/xuartlite_stats.c create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/system.mss create mode 100644 vitis/top/microblaze_0/standalone_microblaze_0/bsp/system_0.mss create mode 100755 vitis/top/platform.spr create mode 100755 vitis/top/platform.tcl create mode 100644 vitis/top/tempdsa/aie_primitive.json create mode 100644 vitis/top/tempdsa/top.mmi create mode 100644 vitis/top/tempdsa/top.xsa diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3d4ad49 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +Packages +radar_alinx_kintex.cache +radar_alinx_kintex.gen +radar_alinx_kintex.hw +radar_alinx_kintex.ioplanning +radar_alinx_kintex.ip_user_files +radar_alinx_kintex.runs +radar_alinx_kintex.sim + diff --git a/python/.gitignore b/python/.gitignore new file mode 100644 index 0000000..ba62072 --- /dev/null +++ b/python/.gitignore @@ -0,0 +1,4 @@ +__pycache__ +.idea +*.zip +*.bin diff --git a/python/data_recorder.py b/python/data_recorder.py new file mode 100755 index 0000000..012f725 --- /dev/null +++ b/python/data_recorder.py @@ -0,0 +1,131 @@ +import socket +import numpy as np +import ctypes +import data_structures +import threading +import queue +import os +import mmap + +class DataRecorder: + def __init__(self, + host="192.168.2.128", + port=1234, + packet_size=4096): + + + # # TESTTTT + # self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + # print('SO_RCVBUF', self.s.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)) + # self.s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 4 * 1024 * 1024) + # print('SO_RCVBUF', self.s.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)) + # self.s.settimeout(1) + # self.s.bind(("", 1234)) + # data = np.arange(16, dtype=np.uint32) + # data = data.tobytes() + # self.s.sendto(data, (host, 1234)) + # self.s.close() + # # TESTTTTT + + + + # UDP Socket for High Speed Data + self.ip = host + self.port = port + self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + print('SO_RCVBUF', self.s.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)) + self.s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 4 * 1024 * 1024) + print('SO_RCVBUF', self.s.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)) + self.s.settimeout(1) + self.s.bind(("", port)) + # Need to send one udp message to set IP and port info inside FPGA + data = np.arange(16, dtype=np.uint32) + data = data.tobytes() + self.s.sendto(data, (self.ip, self.port)) + + + self.max_packet_size = packet_size + + # Data Buffer + # self.buffer = bytearray(512 * 1024 * 1024) + self.buffer = mmap.mmap(-1, 512 * 1024 * 1024) + self.buffer_view = memoryview(self.buffer) + + self.stop_event = threading.Event() + + self.fid = None + self.write_to_disk = False + self.write_offset = 0 + self.write_count = 0 + self.write_queue = queue.SimpleQueue() + + def start_recording(self, filename, write_to_disk=False): + + self.write_to_disk = write_to_disk + + if write_to_disk: + self.write_offset = 0 + self.write_count = 0 + self.fid = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC | os.O_DIRECT ) + + self.write_queue = queue.SimpleQueue() + self.write_data_thread = threading.Thread(target=self.write_data) + self.write_data_thread.start() + + self.get_data_thread = threading.Thread(target=self.get_data) + + self.get_data_thread.start() + + def stop_recording(self): + print('Stop Thread') + self.stop_event.set() + self.get_data_thread.join() + print('Get Data Thread Joined') + if self.write_to_disk: + self.write_data_thread.join() + print('Write Data Thread Joined') + + def write_data(self): + + write_chunk_size = 4 * 1024 * 1024 + buffer_view = memoryview(self.buffer) + + print('Waiting For Data to Write') + while not self.stop_event.is_set(): + + try: + num_bytes = self.write_queue.get(timeout=1) + + self.write_count += num_bytes + + if self.write_count > write_chunk_size: + # print(self.write_offset) + # os.write(self.fid, self.buffer[self.write_offset:self.write_offset + write_chunk_size]) + os.write(self.fid, buffer_view[self.write_offset:self.write_offset + write_chunk_size]) + self.write_offset += write_chunk_size + self.write_count -= write_chunk_size + self.write_offset = self.write_offset % len(self.buffer) + except queue.Empty: + print('DR Queue Empty!', self.ip) + + + def get_data(self): + offset = 0 + + print('Waiting For Data From Socket') + while not self.stop_event.is_set(): + + try: + n = self.s.recv_into(self.buffer_view[offset:offset + self.max_packet_size]) + + if self.write_to_disk: + self.write_queue.put(n) + + offset += n + offset = offset % len(self.buffer) + # print(offset) + + except socket.timeout: + continue + + diff --git a/python/data_structures.py b/python/data_structures.py new file mode 100755 index 0000000..0c9ce87 --- /dev/null +++ b/python/data_structures.py @@ -0,0 +1,173 @@ +import ctypes +from ctypes import Structure, c_uint64, c_uint32, c_uint16, c_uint8, c_float + +AXI_WRITE_REG = 1 +AXI_READ_REG = 2 +AXI_READ_RESP = 3 +ACK_MSG = 4 +NACK_MSG = 5 +AXI_WRITE_REG_BURST = 6 +RF_SPI_WRITE = 7 +SET_AD9081_DAC_NCO = 128 +SET_AD9081_ADC_NCO = 129 + +ACK_FLAG_VALID_PACKET = 0x01 +ACK_FLAG_VALID_EXECUTION = 0x02 +ACK_FLAG_GOT_FRAME_END = 0x04 + +MAX_BURST_LENGTH = 512 + +HDR_FLAG_REQ_ACK = 0x01 + +class CpiHeader(Structure): + _pack_ = 1 + _fields_ = [ + ("sync", c_uint32), + ("num_pulses", c_uint32), + ("num_samples", c_uint32), + ("start_sample", c_uint32), + ("tx_num_samples", c_uint32), + ("tx_start_sample", c_uint32), + ("pri", c_uint32), + ("inter_cpi", c_uint32), + + # ("spare", c_uint32), # Populated by FPGA + ("pps_sec", c_uint64), # Populated by FPGA + ("pps_frac_sec", c_uint64), # Populated by FPGA + ("system_time", c_uint64), # Populated by FPGA + + ("tx_lo_offset", c_float), + ("rx_lo_offset", c_float), + ("data1", c_uint32 * 240) # Populated by user + + ] + + +class Header(Structure): + _pack_ = 1 + _fields_ = [ + ("fsync", c_uint32), + ("type", c_uint16), + ("flags", c_uint16), + ("length", c_uint16) + ] + + # Have to put this here to get pycharm autocomplete to work, don't like this, but autocomplete is too convenient + def __init__(self): + self.fsync = 0xAABBCCDD + self.type = 0 + self.flags = 0 + self.length = 0 + + +def init_header(self, msg_id): + self.header = Header() + self.header.type = msg_id + self.header.length = ctypes.sizeof(self) + + +class WriteRegType(Structure): + _pack_ = 1 + _fields_ = [ + ("header", Header), + ("address", c_uint32), + ("data", c_uint32) + ] + + def __init__(self): + init_header(self, AXI_WRITE_REG) + self.address = 0 + self.data = 0 + + +class WriteRegBurstType(Structure): + _pack_ = 1 + _fields_ = [ + ("header", Header), + ("address", c_uint32), + ("length", c_uint32), + ("data", c_uint32 * MAX_BURST_LENGTH) + ] + + def __init__(self): + init_header(self, AXI_WRITE_REG_BURST) + self.address = 0 + self.length = 0 + + +class AckType(Structure): + _pack_ = 1 + _fields_ = [ + ("header", Header), + ("flags", c_uint32) + ] + + def __init__(self): + init_header(self, ACK_MSG) + self.flags = 0 + + +class ReadRequestType(Structure): + _pack_ = 1 + _fields_ = [ + ("header", Header), + ("address", c_uint32) + ] + + def __init__(self): + init_header(self, AXI_READ_REG) + self.address = 0 + + +class ReadResponseType(Structure): + _pack_ = 1 + _fields_ = [ + ("header", Header), + ("data", c_uint32) + ] + + def __init__(self): + init_header(self, AXI_READ_RESP) + self.data = 0 + + +class DacNcoConfigType(Structure): + _pack_ = 1 + _fields_ = [ + ("header", Header), + ("channel", c_uint32), + ("frequency", c_float) + ] + + def __init__(self): + init_header(self, SET_AD9081_DAC_NCO) + self.channel = 0 + self.frequency = 0 + +class AdcNcoConfigType(Structure): + _pack_ = 1 + _fields_ = [ + ("header", Header), + ("channel", c_uint32), + ("frequency", c_float) + ] + + def __init__(self): + init_header(self, SET_AD9081_ADC_NCO) + self.channel = 0 + self.frequency = 0 + +class RfSpiWriteType(Structure): + _pack_ = 1 + _fields_ = [ + ("header", Header), + ("dev_sel", c_uint32), + ("num_bits", c_uint32), + ("data", c_uint32) + ] + + def __init__(self): + init_header(self, RF_SPI_WRITE) + self.dev_sel = 0 + self.num_bits = 0 + self.data = 0 \ No newline at end of file diff --git a/python/radar_manager.py b/python/radar_manager.py new file mode 100755 index 0000000..a08777d --- /dev/null +++ b/python/radar_manager.py @@ -0,0 +1,303 @@ +import ctypes +import datetime +import ipaddress +import socket +import struct +import time + +import numpy as np + +import data_structures as msg_types +from data_structures import CpiHeader + +TIMING_ENGINE_ADDR = 0x40051000 +DIG_RX_ADDR = 0x20000000 +DIG_RX_STRIDE = 0x10000 +WAVEFORM_GEN_ADDR = 0x40053000 + +NUM_RX = 2 + +def form_chirp(pulsewidth, bw, sample_rate, win=None, ): + + n = int(np.round(pulsewidth * sample_rate)) + d_t = 1 / sample_rate + f = np.linspace(-bw/2, bw/2, n) + + phi = np.cumsum(2 * np.pi * f * d_t) + + x = np.exp(-1j * phi) + + return x.astype(np.complex64) + +class RadarManager: + def __init__(self, + host="192.168.1.200", + port=5001): + + self.host = host + self.port = port + self.s = None + self.CONNECTED = False + + self.connect() + + # Update UDP packet size + self.packet_size = 4096 + self.axi_write_register(0x4005001C, self.packet_size) + + self.reset_10g_udp() + + + self.stop_running() + + def connect(self): + self.CONNECTED = False + + retry_cnt = 0 + while True: + try: + self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.s.settimeout(5) + self.s.connect((self.host, self.port)) + self.s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + self.s.settimeout(5) + self.CONNECTED = True + break + except socket.error as e: + print("Connection Error %s" % e) + # print("Connection Timeout, trying again %d" % retry_cnt) + self.CONNECTED = False + retry_cnt += 1 + if retry_cnt >= 1: + break + + return self.CONNECTED + + def disconnect(self): + self.s.close() + self.CONNECTED = False + + def is_connected(self): + return self.CONNECTED + + def send_bytes(self, msg_bytes): + self.s.sendall(msg_bytes) + + def send_message(self, msg, update_hdr=True, enable_ack=True, wait_for_ack=True, timeout=10): + self.s.settimeout(timeout) + ret = True + msg.header.flags = 0 + + # Request a completion ACK + if enable_ack: + msg.header.flags = msg_types.HDR_FLAG_REQ_ACK + + # Serialize message and send + self.send_bytes(bytes(msg)) + + # Need to wait for response + if wait_for_ack: + recv_bytes, err = self.get_response(ctypes.sizeof(msg_types.AckType)) + resp = msg_types.AckType.from_buffer_copy(recv_bytes) + ret = True + + return ret + + def get_response(self, size): + recv_data = bytearray() + while len(recv_data) < size: + try: + recv_data += self.s.recv(size, 0) + except socket.timeout as e: + return 0, -1 + return recv_data, 0 + + def axi_write_register(self, address, data): + # Make sure address is word aligned + address -= (address % 4) + + # Form message + msg = msg_types.WriteRegType() + msg.address = address + msg.data = data + + self.send_message(msg) + + return + + def axi_write_register_burst(self, address, data): + # Make sure address is word aligned + address -= (address % 4) + + # Form message + msg = msg_types.WriteRegBurstType() + msg.address = address + msg.length = len(data) + for i in range(len(data)): + msg.data[i] = data[i] + + self.send_message(msg) + + return + + def axi_read_register(self, address): + # Make sure address is word aligned + address -= (address % 4) + + # Form message + msg = msg_types.ReadRequestType() + msg.address = address + + self.send_message(msg, enable_ack=False, wait_for_ack=False) + + # Get response + recv_bytes, _ = self.get_response(ctypes.sizeof(msg_types.ReadResponseType)) + resp = msg_types.ReadResponseType.from_buffer_copy(recv_bytes) + + return resp.data + + def set_dac_nco(self, channel, frequency): + # Form message + msg = msg_types.DacNcoConfigType() + msg.channel = channel + msg.frequency = frequency + + self.send_message(msg) + + return + + def set_adc_nco(self, channel, frequency): + # Form message + msg = msg_types.AdcNcoConfigType() + msg.channel = channel + msg.frequency = frequency + + self.send_message(msg) + + return + + def rf_spi_write(self, dev_sel, num_bits, data): + # Form message + msg = msg_types.RfSpiWriteType() + msg.dev_sel = dev_sel + msg.num_bits = num_bits + msg.data = data + + self.send_message(msg) + + return + + + def load_waveform(self, ch, amp, bw, pw): + addr = 0x0010000 + 0x0010000 * ch + print('Load', hex(addr)) + num_samples = pw + wf = form_chirp(pw, bw, 1) + wf = wf * amp + + bram_address = addr + + iq = wf * 0x7FFF + iq_real = iq.real.astype(np.uint16) + iq_imag = iq.imag.astype(np.uint16) + iq_real = iq_real.astype(np.uint32) + iq_imag = iq_imag.astype(np.uint32) + data = iq_real | (iq_imag << 16) + + num_bursts = num_samples / msg_types.MAX_BURST_LENGTH + num_bursts = int(np.ceil(num_bursts)) + + for i in range(num_bursts): + start_ind = i * msg_types.MAX_BURST_LENGTH + stop_ind = start_ind + msg_types.MAX_BURST_LENGTH + stop_ind = min(stop_ind, num_samples) + burst_data = data[start_ind:stop_ind] + self.axi_write_register_burst(bram_address + i * 4 * msg_types.MAX_BURST_LENGTH, burst_data) + + def reset_10g_udp(self): + val = self.axi_read_register(0x40050008) + self.axi_write_register(0x40050008, val | (1 << 15)) + self.axi_write_register(0x40050008, val) + time.sleep(2) + + def setup_cpi_header(self, pri, inter_cpi, num_pulses, num_samples, start_sample, + tx_num_samples, tx_start_sample, rx_lo_offset, tx_lo_offset): + # Load Up header BRAM + header = CpiHeader() + header.sync = 0xAABBCCDD + header.num_pulses = num_pulses + header.num_samples = num_samples + header.start_sample = start_sample + header.tx_num_samples = tx_num_samples + header.tx_start_sample = tx_start_sample + header.pri = pri + header.inter_cpi = inter_cpi + header.tx_lo_offset = tx_lo_offset + header.rx_lo_offset = rx_lo_offset + + data = np.frombuffer(bytes(header), dtype=np.uint32) + self.axi_write_register_burst(TIMING_ENGINE_ADDR + 0xC00, data) + + def setup_timing_engine(self, pri, num_pulses, inter_cpi): + self.axi_write_register(TIMING_ENGINE_ADDR + 0x4, pri - 1) + self.axi_write_register(TIMING_ENGINE_ADDR + 0x8, num_pulses) + self.axi_write_register(TIMING_ENGINE_ADDR + 0x10, inter_cpi - 1) + + def setup_rx(self, num_samples, start_sample): + for i in range(NUM_RX): + self.axi_write_register(DIG_RX_ADDR + i*DIG_RX_STRIDE + 0x4, num_samples >> 2) + self.axi_write_register(DIG_RX_ADDR + i*DIG_RX_STRIDE + 0x8, start_sample >> 2) + + def setup_tx(self, num_samples, start_sample): + self.axi_write_register(WAVEFORM_GEN_ADDR + 0x4, num_samples >> 2) + self.axi_write_register(WAVEFORM_GEN_ADDR + 0x8, start_sample >> 2) + + def start_running(self): + for i in range(NUM_RX): + self.axi_write_register(DIG_RX_ADDR + i*DIG_RX_STRIDE + 0x0, 0) # RX Reset + self.axi_write_register(WAVEFORM_GEN_ADDR + 0x0, 0) # TX Reset + self.axi_write_register(TIMING_ENGINE_ADDR + 0x0, 0) # Timing Reset (do this last) + + def stop_running(self): + self.axi_write_register(TIMING_ENGINE_ADDR + 0x0, 1) # Timing Engine Reset + for i in range(NUM_RX): + self.axi_write_register(DIG_RX_ADDR + i*DIG_RX_STRIDE + 0x0, 1) # RX Reset + self.axi_write_register(WAVEFORM_GEN_ADDR + 0x0, 1) # TX Reset + + def setup_rf_attenuators(self, rf_atten): + self.rf_spi_write(0, 6, rf_atten[0]) # TX0 RF (ADRF5730) + self.rf_spi_write(1, 6, rf_atten[1]) # TX1 RF (ADRF5730) + + self.rf_spi_write(2, 6, rf_atten[2]) # RX0 RF (ADRF5721) + self.rf_spi_write(3, 6, rf_atten[3]) # RX0 IF (HMC624) + + self.rf_spi_write(4, 6, rf_atten[4]) # RX1 RF (ADRF5721) + self.rf_spi_write(5, 6, rf_atten[5]) # RX1 IF (HMC624) + + + def configure_cpi(self, pri, inter_cpi, num_pulses, num_samples, start_sample, + tx_num_samples, tx_start_sample, rx_lo_offset, tx_lo_offset): + self.load_waveform(0, 1, 0.1, tx_num_samples) + self.load_waveform(1, 1, 0.1, tx_num_samples) + + rf_atten = [1, 2, 3, 4, 5, 6] + self.setup_rf_attenuators(rf_atten) + + # DAC at 5.25 GHz is in second nyquist + # ADC would be in 3rd nyquist + lo = 5.25e9 + f_dac = 9e9 + f_adc = 3e9 + tx_lo = 5.25e9 % f_dac + rx_lo = 5.25e9 % f_adc + for i in range(4): + self.set_adc_nco(i, rx_lo) + self.set_dac_nco(0, tx_lo) + self.set_dac_nco(1, tx_lo) + self.set_dac_nco(2, tx_lo + tx_lo_offset) + self.set_dac_nco(3, tx_lo + rx_lo_offset) + self.setup_timing_engine(pri, num_pulses, inter_cpi) + self.setup_rx(num_samples, start_sample) + self.setup_tx(tx_num_samples, tx_start_sample) + self.setup_cpi_header(pri, inter_cpi, num_pulses, num_samples, start_sample, + tx_num_samples, tx_start_sample, rx_lo_offset, tx_lo_offset) \ No newline at end of file diff --git a/python/read_data_file.py b/python/read_data_file.py new file mode 100755 index 0000000..c04fbf5 --- /dev/null +++ b/python/read_data_file.py @@ -0,0 +1,113 @@ +import ctypes +import os.path +import time +import numpy as np +from matplotlib import pyplot as plt +import socket + +import data_structures +import radar_manager +from data_recorder import DataRecorder + + +def db20(x): + return 20*np.log10(np.abs(x)) + + +def db20n(x): + x = db20(x) + x = x - np.max(x) + return x + + +def main(): + print('Hello') + + clk = 187.5e6 + + # Parse Data + headers = [] + offset = 0 + + file = 'test0.bin' + fid = open(file, 'rb') + + # Find header, recording buffer could have wrapped depending on data rate and how long we ran for + hdr_sync = False + while not hdr_sync: + # data = recorder.buffer[offset:offset + 4] + data = fid.read(4) + sync_word = np.frombuffer(data, dtype=np.uint32)[0] + if sync_word == 0xAABBCCDD: + hdr_sync = True + print('Header found at offset', offset) + fid.seek(-4, 1) + + # Get the first header + header = fid.read(ctypes.sizeof(data_structures.CpiHeader)) + header = data_structures.CpiHeader.from_buffer_copy(header) + fid.seek(-ctypes.sizeof(data_structures.CpiHeader), 1) + + + # CPI Parameters (timing values are in clk ticks) + num_pulses = header.num_pulses + num_samples = header.num_samples + pri = header.pri + inter_cpi = header.inter_cpi + data_size = num_pulses * num_samples * 4 + + file_size = os.path.getsize(file) + expected_num_cpis = int(file_size / (ctypes.sizeof(data_structures.CpiHeader) + data_size)) + print('Expected CPIS:', expected_num_cpis) + + + for i in range(expected_num_cpis): + # Get Header + data = fid.read(ctypes.sizeof(data_structures.CpiHeader)) + headers.append(data_structures.CpiHeader.from_buffer_copy(data)) + + # Get CPI + data = fid.read(data_size) + + # Check some header fields + cpi_times = np.array([x.system_time for x in headers]) / 187.5e6 + pps_frac = np.array([x.pps_frac_sec for x in headers]) / 187.5e6 + pps_sec = np.array([x.pps_sec for x in headers]) + utc_time = pps_sec + pps_frac + print(pri, inter_cpi, num_pulses * pri + inter_cpi) + print(cpi_times - cpi_times[0]) + print(pps_frac) + print(pps_sec - pps_sec[0]) + + # Plot last CPI + data2 = np.frombuffer(data, dtype=np.int16) + i = data2[0::2] + q = data2[1::2] + iq = i + 1j * q + iq = iq.reshape(-1, num_samples) + iq = iq + 1e-15 + + vmin = -60 + vmax = 0 + + plt.figure() + plt.plot(np.diff(cpi_times)) + + plt.figure() + plt.plot(iq.T.real, '.-') + plt.plot(iq.T.imag, '--.') + plt.grid() + + plt.figure() + plt.imshow(db20n(iq), aspect='auto', interpolation='nearest', vmin=vmin, vmax=vmax) + plt.ylabel('Pulse Count') + plt.xlabel('Sample Count') + plt.colorbar() + + + plt.show() + + +if __name__ == '__main__': + + main() diff --git a/python/test_cpi.py b/python/test_cpi.py new file mode 100755 index 0000000..322c082 --- /dev/null +++ b/python/test_cpi.py @@ -0,0 +1,135 @@ +import ctypes +import time +import numpy as np +from matplotlib import pyplot as plt + +import data_structures +import radar_manager +from data_recorder import DataRecorder + +# Give 10g eth interface an ip and set MTU for better performance +# sudo ifconfig enp5s0f0 192.168.2.10 up mtu 5000 +# sudo ifconfig enp5s0f1 192.168.3.10 up mtu 5000 + +# Note that increases the size of rmem_max in the linux kernel improves performance for data recording +# this can be done witht the following terminal command +# sudo sysctl -w net.core.rmem_max=1048576 + +def db20(x): + return 20*np.log10(np.abs(x)) + + +def db20n(x): + x = db20(x) + x = x - np.max(x) + return x + + +def main(): + print('Hello') + + clk = 187.5e6 + + # CPI Parameters (timing values are in clk ticks) + num_pulses = 128 + num_samples = 8192 + start_sample = 0 + tx_num_samples = 1024 + tx_start_sample = start_sample + pri = int(.001 * clk) + inter_cpi = 50 + tx_lo_offset = 10e6 + rx_lo_offset = 0 + + pri_float = pri / clk + + print('PRI', pri_float, 'PRF', 1 / pri_float) + print('Expected Data Rate', num_samples * 4 / pri_float / 1e6) + + radar = radar_manager.RadarManager() + + recorder0 = DataRecorder("192.168.2.128", 1234, packet_size=radar.packet_size) + recorder1 = DataRecorder("192.168.3.128", 1235, packet_size=radar.packet_size) + recorder0.start_recording('test0.bin', True) + recorder1.start_recording('test1.bin', True) + + radar.configure_cpi(pri, inter_cpi, num_pulses, num_samples, start_sample, + tx_num_samples, tx_start_sample, rx_lo_offset, tx_lo_offset) + + print('Start Running') + radar.start_running() + # Let it run for a bit + time.sleep(5) + # Stop running + radar.stop_running() + # Stop the data recorder + recorder0.stop_recording() + recorder1.stop_recording() + + # Parse some data + + # Find header, recording buffer could have wrapped depending on data rate and how long we ran for + recorders = [recorder0, recorder1] + for recorder in recorders: + headers = [] + offset = 0 + plot_recorder = recorder + hdr_sync = False + while not hdr_sync: + data = plot_recorder.buffer[offset:offset + 4] + sync_word = np.frombuffer(data, dtype=np.uint32)[0] + if sync_word == 0xAABBCCDD: + hdr_sync = True + print('Header found at offset', offset) + else: + offset += 4 + + num_cpi = 16 + for i in range(num_cpi): + # Get Header + data = plot_recorder.buffer[offset:offset + ctypes.sizeof(data_structures.CpiHeader)] + offset += ctypes.sizeof(data_structures.CpiHeader) + headers.append(data_structures.CpiHeader.from_buffer_copy(data)) + + # Get CPI + data_size = num_pulses * num_samples * 4 + data = plot_recorder.buffer[offset:offset + data_size] + offset += data_size + + # Check some header fields + cpi_times = np.array([x.system_time for x in headers]) / 187.5e6 + pps_frac = np.array([x.pps_frac_sec for x in headers]) / 187.5e6 + pps_sec = np.array([x.pps_sec for x in headers]) + utc_time = pps_sec + pps_frac + print(pri, inter_cpi, num_pulses * pri + inter_cpi) + print(cpi_times - cpi_times[0]) + print(pps_frac) + print(pps_sec - pps_sec[0]) + + # Plot last CPI + data2 = np.frombuffer(data, dtype=np.int16) + i = data2[0::2] + q = data2[1::2] + iq = i + 1j * q + iq = iq.reshape(-1, num_samples) + iq = iq + 1e-15 + + vmin = -60 + vmax = 0 + + fid, axs = plt.subplots(2) + axs[0].plot(iq.T.real, '.-') + axs[0].plot(iq.T.imag, '--.') + axs[0].grid() + + axs[1].imshow(db20n(iq), aspect='auto', interpolation='nearest', vmin=vmin, vmax=vmax) + axs[1].set_ylabel('Pulse Count') + axs[1].set_xlabel('Sample Count') + + + plt.show() + + +if __name__ == '__main__': + + main() diff --git a/radar_alinx_kintex.srcs/constrs_1/new/constraints.xdc b/radar_alinx_kintex.srcs/constrs_1/new/constraints.xdc new file mode 100755 index 0000000..a75546b --- /dev/null +++ b/radar_alinx_kintex.srcs/constrs_1/new/constraints.xdc @@ -0,0 +1,504 @@ +#------------------------------------------- +# Config +#------------------------------------------- +set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] +set_property CONFIG_MODE SPIx4 [current_design] +set_property CONFIG_VOLTAGE 3.3 [current_design] +set_property CFGBVS VCCO [current_design] + +#------------------------------------------- +# Register False Paths +#------------------------------------------- +set_false_path -from [get_cells util_reg_i/reg_*] +set_false_path -from [get_cells timing_engine_i/reg_*] +set_false_path -from [get_cells timing_engine_i/system_time_start_of_cpi*] +set_false_path -from [get_cells *digital_rx_chain_i/reg_*] +set_false_path -from [get_cells waveform_gen_i/reg_*] + +#------------------------------------------- +# Clocks +#------------------------------------------- +set_property PACKAGE_PIN AK17 [get_ports clk_200_p] +set_property PACKAGE_PIN AK16 [get_ports clk_200_n] +#create_clock -period 5.000 -name clk_200 [get_ports clk_200_p] + +set_property IOSTANDARD DIFF_SSTL12 [get_ports clk_200_p] +set_property IOSTANDARD DIFF_SSTL12 [get_ports clk_200_n] + +#set_property PACKAGE_PIN AF6 [get_ports clk_125_p] +#set_property PACKAGE_PIN AF5 [get_ports clk_125_n] +#create_clock -period 8.000 -name clk_125 [get_ports clk_125_p] + +# set_property IOSTANDARD DIFF_SSTL12 [get_ports clk_125_p] +# set_property IOSTANDARD DIFF_SSTL12 [get_ports clk_125_n] + +#------------------------------------------- +# RF Attenautors +#------------------------------------------- +set_property PACKAGE_PIN G26 [get_ports tx0_rf_attn_sin] +set_property PACKAGE_PIN H26 [get_ports tx0_rf_attn_clk] +set_property PACKAGE_PIN J26 [get_ports tx0_rf_attn_le] +set_property PACKAGE_PIN L25 [get_ports tx1_rf_attn_sin] +set_property PACKAGE_PIN P23 [get_ports tx1_rf_attn_clk] +set_property PACKAGE_PIN R23 [get_ports tx1_rf_attn_le] +set_property PACKAGE_PIN K25 [get_ports txlo_drv_en] + +set_property PACKAGE_PIN R25 [get_ports rx0_rf_attn_sin] +set_property PACKAGE_PIN T25 [get_ports rx0_rf_attn_clk] +set_property PACKAGE_PIN T24 [get_ports rx0_rf_attn_le] +set_property PACKAGE_PIN AM11 [get_ports rx0_if_attn_sin] +set_property PACKAGE_PIN AF13 [get_ports rx0_if_attn_clk] +set_property PACKAGE_PIN AE13 [get_ports rx0_if_attn_le] +set_property PACKAGE_PIN AN11 [get_ports rx0_lna_en] + +set_property PACKAGE_PIN J24 [get_ports rx1_rf_attn_sin] +set_property PACKAGE_PIN G27 [get_ports rx1_rf_attn_clk] +set_property PACKAGE_PIN H27 [get_ports rx1_rf_attn_le] +set_property PACKAGE_PIN K26 [get_ports rx1_if_attn_sin] +set_property PACKAGE_PIN L27 [get_ports rx1_if_attn_clk] +set_property PACKAGE_PIN M27 [get_ports rx1_if_attn_le] +set_property PACKAGE_PIN K27 [get_ports rx1_lna_en] + +set_property IOSTANDARD LVCMOS18 [get_ports tx0_rf_attn_sin] +set_property IOSTANDARD LVCMOS18 [get_ports tx0_rf_attn_clk] +set_property IOSTANDARD LVCMOS18 [get_ports tx0_rf_attn_le] +set_property IOSTANDARD LVCMOS18 [get_ports tx1_rf_attn_sin] +set_property IOSTANDARD LVCMOS18 [get_ports tx1_rf_attn_clk] +set_property IOSTANDARD LVCMOS18 [get_ports tx1_rf_attn_le] +set_property IOSTANDARD LVCMOS18 [get_ports txlo_drv_en] + +set_property IOSTANDARD LVCMOS18 [get_ports rx0_rf_attn_sin] +set_property IOSTANDARD LVCMOS18 [get_ports rx0_rf_attn_clk] +set_property IOSTANDARD LVCMOS18 [get_ports rx0_rf_attn_le] +set_property IOSTANDARD LVCMOS18 [get_ports rx0_if_attn_sin] +set_property IOSTANDARD LVCMOS18 [get_ports rx0_if_attn_clk] +set_property IOSTANDARD LVCMOS18 [get_ports rx0_if_attn_le] +set_property IOSTANDARD LVCMOS18 [get_ports rx0_lna_en] + +set_property IOSTANDARD LVCMOS18 [get_ports rx1_rf_attn_sin] +set_property IOSTANDARD LVCMOS18 [get_ports rx1_rf_attn_clk] +set_property IOSTANDARD LVCMOS18 [get_ports rx1_rf_attn_le] +set_property IOSTANDARD LVCMOS18 [get_ports rx1_if_attn_sin] +set_property IOSTANDARD LVCMOS18 [get_ports rx1_if_attn_clk] +set_property IOSTANDARD LVCMOS18 [get_ports rx1_if_attn_le] +set_property IOSTANDARD LVCMOS18 [get_ports rx1_lna_en] + +#------------------------------------------- +# PPS +#------------------------------------------- +set_property PACKAGE_PIN H24 [get_ports pps] +set_property IOSTANDARD LVCMOS18 [get_ports pps] + +#------------------------------------------- +# FAN PWM +#------------------------------------------- +set_property PACKAGE_PIN P20 [get_ports fan_pwm] + +set_property IOSTANDARD LVCMOS18 [get_ports fan_pwm] + +set_property PACKAGE_PIN L17 [get_ports fmc_power_en] +set_property IOSTANDARD LVCMOS18 [get_ports fmc_power_en] + +#------------------------------------------- +# LEDs +#------------------------------------------- +set_property PACKAGE_PIN L20 [get_ports {leds[0]}] +set_property PACKAGE_PIN M20 [get_ports {leds[1]}] +set_property PACKAGE_PIN M21 [get_ports {leds[2]}] +set_property PACKAGE_PIN N21 [get_ports {leds[3]}] +set_property IOSTANDARD LVCMOS18 [get_ports {leds[*]}] + +#------------------------------------------- +# UART +#------------------------------------------- +set_property PACKAGE_PIN N27 [get_ports uart_rxd] +set_property PACKAGE_PIN K22 [get_ports uart_txd] + +set_property IOSTANDARD LVCMOS18 [get_ports uart_rxd] +set_property IOSTANDARD LVCMOS18 [get_ports uart_txd] + + +#------------------------------------------- +# SFP +#------------------------------------------- +set_property PACKAGE_PIN AP2 [get_ports sfp0_rx_p] +set_property PACKAGE_PIN AP1 [get_ports sfp0_rx_n] +set_property PACKAGE_PIN AN4 [get_ports sfp0_tx_p] +set_property PACKAGE_PIN AN3 [get_ports sfp0_tx_n] +set_property PACKAGE_PIN AM2 [get_ports sfp1_rx_p] +set_property PACKAGE_PIN AM1 [get_ports sfp1_rx_n] +set_property PACKAGE_PIN AM6 [get_ports sfp1_tx_p] +set_property PACKAGE_PIN AM5 [get_ports sfp1_tx_n] +set_property PACKAGE_PIN AK2 [get_ports sfp2_rx_p] +set_property PACKAGE_PIN AK1 [get_ports sfp2_rx_n] +set_property PACKAGE_PIN AL4 [get_ports sfp2_tx_p] +set_property PACKAGE_PIN AL3 [get_ports sfp2_tx_n] +set_property PACKAGE_PIN AJ4 [get_ports sfp3_rx_p] +set_property PACKAGE_PIN AJ3 [get_ports sfp3_rx_n] +set_property PACKAGE_PIN AK6 [get_ports sfp3_tx_p] +set_property PACKAGE_PIN AK5 [get_ports sfp3_tx_n] +set_property PACKAGE_PIN AF5 [get_ports sfp_mgt_refclk_0_n] +set_property PACKAGE_PIN AF6 [get_ports sfp_mgt_refclk_0_p] + +set_property PACKAGE_PIN AM10 [get_ports sfp0_tx_disable_b] +set_property PACKAGE_PIN AL10 [get_ports sfp1_tx_disable_b] +set_property PACKAGE_PIN AP9 [get_ports sfp2_tx_disable_b] +set_property PACKAGE_PIN AN9 [get_ports sfp3_tx_disable_b] +set_property IOSTANDARD LVCMOS18 [get_ports sfp0_tx_disable_b] +set_property IOSTANDARD LVCMOS18 [get_ports sfp1_tx_disable_b] +set_property IOSTANDARD LVCMOS18 [get_ports sfp2_tx_disable_b] +set_property IOSTANDARD LVCMOS18 [get_ports sfp3_tx_disable_b] + +set_false_path -to [get_ports {sfp0_tx_disable_b sfp1_tx_disable_b sfp2_tx_disable_b sfp3_tx_disable_b}] +set_output_delay 0.000 [get_ports {sfp0_tx_disable_b sfp1_tx_disable_b sfp2_tx_disable_b sfp3_tx_disable_b}] + +#------------------------------------------- +# 1 Gb Ethernet (PHY 2) +#------------------------------------------- +set_property PACKAGE_PIN A23 [get_ports mdc] +set_property PACKAGE_PIN A22 [get_ports mdio] +set_property PACKAGE_PIN H22 [get_ports phy_rst_n] +set_property PACKAGE_PIN D23 [get_ports rgmii_rxc] +set_property PACKAGE_PIN A29 [get_ports rgmii_rx_ctl] +set_property PACKAGE_PIN B29 [get_ports {rgmii_rd[0]}] +set_property PACKAGE_PIN A28 [get_ports {rgmii_rd[1]}] +set_property PACKAGE_PIN A27 [get_ports {rgmii_rd[2]}] +set_property PACKAGE_PIN C23 [get_ports {rgmii_rd[3]}] +set_property PACKAGE_PIN B24 [get_ports rgmii_txc] +set_property PACKAGE_PIN A24 [get_ports rgmii_tx_ctl] +set_property PACKAGE_PIN B20 [get_ports {rgmii_td[0]}] +set_property PACKAGE_PIN A20 [get_ports {rgmii_td[1]}] +set_property PACKAGE_PIN B21 [get_ports {rgmii_td[2]}] +set_property PACKAGE_PIN B22 [get_ports {rgmii_td[3]}] + +set_property IOSTANDARD LVCMOS18 [get_ports mdc] +set_property IOSTANDARD LVCMOS18 [get_ports mdio] +set_property IOSTANDARD LVCMOS18 [get_ports phy_rst_n] +set_property IOSTANDARD LVCMOS18 [get_ports rgmii_rxc] +set_property IOSTANDARD LVCMOS18 [get_ports rgmii_rx_ctl] +set_property IOSTANDARD LVCMOS18 [get_ports {rgmii_rd[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {rgmii_rd[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {rgmii_rd[2]}] +set_property IOSTANDARD LVCMOS18 [get_ports {rgmii_rd[3]}] +set_property IOSTANDARD LVCMOS18 [get_ports rgmii_txc] +set_property IOSTANDARD LVCMOS18 [get_ports rgmii_tx_ctl] +set_property IOSTANDARD LVCMOS18 [get_ports {rgmii_td[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {rgmii_td[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {rgmii_td[2]}] +set_property IOSTANDARD LVCMOS18 [get_ports {rgmii_td[3]}] + +#------------------------------------------- +# FMC (HPC) +#------------------------------------------- +set_property PACKAGE_PIN C27 [get_ports fmc_spi0_mosi] +set_property PACKAGE_PIN A25 [get_ports fmc_spi0_miso] +set_property PACKAGE_PIN B27 [get_ports fmc_spi0_sck] +set_property PACKAGE_PIN B25 [get_ports fmc_spi0_ss] + +set_property PACKAGE_PIN C22 [get_ports fmc_spi1_mosi] +set_property PACKAGE_PIN D20 [get_ports fmc_spi1_sck] +set_property PACKAGE_PIN C21 [get_ports fmc_spi1_ss] +set_property PACKAGE_PIN F27 [get_ports resetb] + +set_property IOSTANDARD LVCMOS18 [get_ports fmc_spi0_mosi] +set_property IOSTANDARD LVCMOS18 [get_ports fmc_spi0_miso] +set_property IOSTANDARD LVCMOS18 [get_ports fmc_spi0_sck] +set_property IOSTANDARD LVCMOS18 [get_ports fmc_spi0_ss] +set_property IOSTANDARD LVCMOS18 [get_ports fmc_spi1_mosi] +set_property IOSTANDARD LVCMOS18 [get_ports fmc_spi1_sck] +set_property IOSTANDARD LVCMOS18 [get_ports fmc_spi1_ss] +set_property IOSTANDARD LVCMOS18 [get_ports resetb] + +set_property PACKAGE_PIN E25 [get_ports jesd_sysref_p] +set_property PACKAGE_PIN D25 [get_ports jesd_sysref_n] + +set_property IOSTANDARD LVDS [get_ports jesd_sysref_p] +set_property DIFF_TERM_ADV TERM_100 [get_ports jesd_sysref_p] + +set_property PACKAGE_PIN K5 [get_ports jesd_qpll0_refclk_n] +set_property PACKAGE_PIN K6 [get_ports jesd_qpll0_refclk_p] +create_clock -period 5.333 -name jesd_qpll_refclk [get_ports jesd_qpll0_refclk_p] + +#set_property PACKAGE_PIN P5 [get_ports jesd_qpll0_refclk_n] +#set_property PACKAGE_PIN P6 [get_ports jesd_qpll0_refclk_p] + +#set_property PACKAGE_PIN G10 [get_ports jesd_core_clk_p] +#set_property PACKAGE_PIN F10 [get_ports jesd_core_clk_n] + +set_property PACKAGE_PIN D24 [get_ports jesd_core_clk_p] +set_property PACKAGE_PIN C24 [get_ports jesd_core_clk_n] + +set_property IOSTANDARD LVDS [get_ports jesd_core_clk_p] +create_clock -period 5.333 -name jesd_core_clk [get_ports jesd_core_clk_n] + +#set_property PACKAGE_PIN F2 [get_ports {jesd_rxp_in[0]}] +#set_property PACKAGE_PIN H2 [get_ports {jesd_rxp_in[1]}] +#set_property PACKAGE_PIN K2 [get_ports {jesd_rxp_in[2]}] +#set_property PACKAGE_PIN M2 [get_ports {jesd_rxp_in[3]}] +#set_property PACKAGE_PIN A4 [get_ports {jesd_rxp_in[4]}] +#set_property PACKAGE_PIN B2 [get_ports {jesd_rxp_in[5]}] +#set_property PACKAGE_PIN D2 [get_ports {jesd_rxp_in[6]}] +#set_property PACKAGE_PIN E4 [get_ports {jesd_rxp_in[7]}] + + +#set_property PACKAGE_PIN G4 [get_ports {jesd_txp_out[0]}] +#set_property PACKAGE_PIN J4 [get_ports {jesd_txp_out[1]}] +#set_property PACKAGE_PIN L4 [get_ports {jesd_txp_out[2]}] +#set_property PACKAGE_PIN N4 [get_ports {jesd_txp_out[3]}] +#set_property PACKAGE_PIN B6 [get_ports {jesd_txp_out[4]}] +#set_property PACKAGE_PIN C4 [get_ports {jesd_txp_out[5]}] +#set_property PACKAGE_PIN D6 [get_ports {jesd_txp_out[6]}] +#set_property PACKAGE_PIN F6 [get_ports {jesd_txp_out[7]}] + + +#------------------------------------------- +# DDR +#------------------------------------------- +set_property PACKAGE_PIN AG14 [get_ports {ddr_adr[0]}] +set_property PACKAGE_PIN AF17 [get_ports {ddr_adr[1]}] +set_property PACKAGE_PIN AF15 [get_ports {ddr_adr[2]}] +set_property PACKAGE_PIN AJ14 [get_ports {ddr_adr[3]}] +set_property PACKAGE_PIN AD18 [get_ports {ddr_adr[4]}] +set_property PACKAGE_PIN AG17 [get_ports {ddr_adr[5]}] +set_property PACKAGE_PIN AE17 [get_ports {ddr_adr[6]}] +set_property PACKAGE_PIN AK18 [get_ports {ddr_adr[7]}] +set_property PACKAGE_PIN AD16 [get_ports {ddr_adr[8]}] +set_property PACKAGE_PIN AH18 [get_ports {ddr_adr[9]}] +set_property PACKAGE_PIN AD19 [get_ports {ddr_adr[10]}] +set_property PACKAGE_PIN AD15 [get_ports {ddr_adr[11]}] +set_property PACKAGE_PIN AH16 [get_ports {ddr_adr[12]}] +set_property PACKAGE_PIN AL17 [get_ports {ddr_adr[13]}] +set_property PACKAGE_PIN AL15 [get_ports {ddr_adr[14]}] +set_property PACKAGE_PIN AL19 [get_ports {ddr_adr[15]}] +set_property PACKAGE_PIN AM19 [get_ports {ddr_adr[16]}] + +set_property PACKAGE_PIN AG15 [get_ports {ddr_ba[0]}] +set_property PACKAGE_PIN AL18 [get_ports {ddr_ba[1]}] +set_property PACKAGE_PIN AJ15 [get_ports {ddr_bg[0]}] + +set_property PACKAGE_PIN AE16 [get_ports {ddr_ck_t[0]}] +set_property PACKAGE_PIN AE15 [get_ports {ddr_ck_c[0]}] +set_property PACKAGE_PIN AE18 [get_ports {ddr_cs_n[0]}] + +set_property PACKAGE_PIN AJ16 [get_ports {ddr_cke[0]}] +set_property PACKAGE_PIN AG19 [get_ports {ddr_odt[0]}] +set_property PACKAGE_PIN AF18 [get_ports ddr_act_n] + +set_property PACKAGE_PIN AG16 [get_ports ddr_reset_n] + +set_property PACKAGE_PIN AN34 [get_ports {ddr_dqs_t[7]}] +set_property PACKAGE_PIN AP34 [get_ports {ddr_dqs_c[7]}] +set_property PACKAGE_PIN AL32 [get_ports {ddr_dm_n[7]}] +set_property PACKAGE_PIN AN31 [get_ports {ddr_dq[56]}] +set_property PACKAGE_PIN AL34 [get_ports {ddr_dq[57]}] +set_property PACKAGE_PIN AN32 [get_ports {ddr_dq[58]}] +set_property PACKAGE_PIN AN33 [get_ports {ddr_dq[59]}] +set_property PACKAGE_PIN AM32 [get_ports {ddr_dq[60]}] +set_property PACKAGE_PIN AM34 [get_ports {ddr_dq[61]}] +set_property PACKAGE_PIN AP31 [get_ports {ddr_dq[62]}] +set_property PACKAGE_PIN AP33 [get_ports {ddr_dq[63]}] + +set_property PACKAGE_PIN AH33 [get_ports {ddr_dqs_t[6]}] +set_property PACKAGE_PIN AJ33 [get_ports {ddr_dqs_c[6]}] +set_property PACKAGE_PIN AJ29 [get_ports {ddr_dm_n[6]}] +set_property PACKAGE_PIN AK31 [get_ports {ddr_dq[48]}] +set_property PACKAGE_PIN AH34 [get_ports {ddr_dq[49]}] +set_property PACKAGE_PIN AK32 [get_ports {ddr_dq[50]}] +set_property PACKAGE_PIN AJ31 [get_ports {ddr_dq[51]}] +set_property PACKAGE_PIN AJ30 [get_ports {ddr_dq[52]}] +set_property PACKAGE_PIN AH31 [get_ports {ddr_dq[53]}] +set_property PACKAGE_PIN AJ34 [get_ports {ddr_dq[54]}] +set_property PACKAGE_PIN AH32 [get_ports {ddr_dq[55]}] + +set_property PACKAGE_PIN AN29 [get_ports {ddr_dqs_t[5]}] +set_property PACKAGE_PIN AP30 [get_ports {ddr_dqs_c[5]}] +set_property PACKAGE_PIN AN26 [get_ports {ddr_dm_n[5]}] +set_property PACKAGE_PIN AN28 [get_ports {ddr_dq[40]}] +set_property PACKAGE_PIN AM30 [get_ports {ddr_dq[41]}] +set_property PACKAGE_PIN AP28 [get_ports {ddr_dq[42]}] +set_property PACKAGE_PIN AM29 [get_ports {ddr_dq[43]}] +set_property PACKAGE_PIN AN27 [get_ports {ddr_dq[44]}] +set_property PACKAGE_PIN AL30 [get_ports {ddr_dq[45]}] +set_property PACKAGE_PIN AL29 [get_ports {ddr_dq[46]}] +set_property PACKAGE_PIN AP29 [get_ports {ddr_dq[47]}] + +set_property PACKAGE_PIN AL27 [get_ports {ddr_dqs_t[4]}] +set_property PACKAGE_PIN AL28 [get_ports {ddr_dqs_c[4]}] +set_property PACKAGE_PIN AH26 [get_ports {ddr_dm_n[4]}] +set_property PACKAGE_PIN AM26 [get_ports {ddr_dq[32]}] +set_property PACKAGE_PIN AJ28 [get_ports {ddr_dq[33]}] +set_property PACKAGE_PIN AM27 [get_ports {ddr_dq[34]}] +set_property PACKAGE_PIN AK28 [get_ports {ddr_dq[35]}] +set_property PACKAGE_PIN AH27 [get_ports {ddr_dq[36]}] +set_property PACKAGE_PIN AH28 [get_ports {ddr_dq[37]}] +set_property PACKAGE_PIN AK26 [get_ports {ddr_dq[38]}] +set_property PACKAGE_PIN AK27 [get_ports {ddr_dq[39]}] + +set_property PACKAGE_PIN AP20 [get_ports {ddr_dqs_t[3]}] +set_property PACKAGE_PIN AP21 [get_ports {ddr_dqs_c[3]}] +set_property PACKAGE_PIN AM21 [get_ports {ddr_dm_n[3]}] +set_property PACKAGE_PIN AM22 [get_ports {ddr_dq[24]}] +set_property PACKAGE_PIN AP24 [get_ports {ddr_dq[25]}] +set_property PACKAGE_PIN AN22 [get_ports {ddr_dq[26]}] +set_property PACKAGE_PIN AN24 [get_ports {ddr_dq[27]}] +set_property PACKAGE_PIN AN23 [get_ports {ddr_dq[28]}] +set_property PACKAGE_PIN AP25 [get_ports {ddr_dq[29]}] +set_property PACKAGE_PIN AP23 [get_ports {ddr_dq[30]}] +set_property PACKAGE_PIN AM24 [get_ports {ddr_dq[31]}] + +set_property PACKAGE_PIN AJ20 [get_ports {ddr_dqs_t[2]}] +set_property PACKAGE_PIN AK20 [get_ports {ddr_dqs_c[2]}] +set_property PACKAGE_PIN AJ21 [get_ports {ddr_dm_n[2]}] +set_property PACKAGE_PIN AK22 [get_ports {ddr_dq[16]}] +set_property PACKAGE_PIN AL22 [get_ports {ddr_dq[17]}] +set_property PACKAGE_PIN AM20 [get_ports {ddr_dq[18]}] +set_property PACKAGE_PIN AL23 [get_ports {ddr_dq[19]}] +set_property PACKAGE_PIN AK23 [get_ports {ddr_dq[20]}] +set_property PACKAGE_PIN AL25 [get_ports {ddr_dq[21]}] +set_property PACKAGE_PIN AL20 [get_ports {ddr_dq[22]}] +set_property PACKAGE_PIN AL24 [get_ports {ddr_dq[23]}] + +set_property PACKAGE_PIN AH24 [get_ports {ddr_dqs_t[1]}] +set_property PACKAGE_PIN AJ25 [get_ports {ddr_dqs_c[1]}] +set_property PACKAGE_PIN AE25 [get_ports {ddr_dm_n[1]}] +set_property PACKAGE_PIN AF24 [get_ports {ddr_dq[8]}] +set_property PACKAGE_PIN AJ23 [get_ports {ddr_dq[9]}] +set_property PACKAGE_PIN AF23 [get_ports {ddr_dq[10]}] +set_property PACKAGE_PIN AH23 [get_ports {ddr_dq[11]}] +set_property PACKAGE_PIN AG25 [get_ports {ddr_dq[12]}] +set_property PACKAGE_PIN AJ24 [get_ports {ddr_dq[13]}] +set_property PACKAGE_PIN AG24 [get_ports {ddr_dq[14]}] +set_property PACKAGE_PIN AH22 [get_ports {ddr_dq[15]}] + +set_property PACKAGE_PIN AG21 [get_ports {ddr_dqs_t[0]}] +set_property PACKAGE_PIN AH21 [get_ports {ddr_dqs_c[0]}] +set_property PACKAGE_PIN AD21 [get_ports {ddr_dm_n[0]}] +set_property PACKAGE_PIN AE20 [get_ports {ddr_dq[0]}] +set_property PACKAGE_PIN AG20 [get_ports {ddr_dq[1]}] +set_property PACKAGE_PIN AF20 [get_ports {ddr_dq[2]}] +set_property PACKAGE_PIN AE22 [get_ports {ddr_dq[3]}] +set_property PACKAGE_PIN AD20 [get_ports {ddr_dq[4]}] +set_property PACKAGE_PIN AG22 [get_ports {ddr_dq[5]}] +set_property PACKAGE_PIN AF22 [get_ports {ddr_dq[6]}] +set_property PACKAGE_PIN AE23 [get_ports {ddr_dq[7]}] + + + + + +connect_debug_port u_ila_0/probe1 [get_nets [list pps_q2]] +connect_debug_port u_ila_0/probe3 [get_nets [list pps_red_i_1__0_n_0]] + + + +connect_debug_port u_ila_0/probe4 [get_nets [list util_reg_i/spi_active]] +connect_debug_port u_ila_0/probe5 [get_nets [list util_reg_i/spi_shift_data]] +connect_debug_port u_ila_0/probe10 [get_nets [list util_reg_i/le_active]] + + +create_debug_core u_ila_0 ila +set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0] +set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_0] +set_property C_ADV_TRIGGER false [get_debug_cores u_ila_0] +set_property C_DATA_DEPTH 4096 [get_debug_cores u_ila_0] +set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_0] +set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_0] +set_property C_TRIGIN_EN false [get_debug_cores u_ila_0] +set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0] +set_property port_width 1 [get_debug_ports u_ila_0/clk] +connect_debug_port u_ila_0/clk [get_nets [list microblaze_bd_i/ddr4_0/inst/u_ddr4_infrastructure/addn_ui_clkout1]] +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0] +set_property port_width 8 [get_debug_ports u_ila_0/probe0] +connect_debug_port u_ila_0/probe0 [get_nets [list {util_reg_i/spi_bit_cnt_reg[0]} {util_reg_i/spi_bit_cnt_reg[1]} {util_reg_i/spi_bit_cnt_reg[2]} {util_reg_i/spi_bit_cnt_reg[3]} {util_reg_i/spi_bit_cnt_reg[4]} {util_reg_i/spi_bit_cnt_reg[5]} {util_reg_i/spi_bit_cnt_reg[6]} {util_reg_i/spi_bit_cnt_reg[7]}]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1] +set_property port_width 32 [get_debug_ports u_ila_0/probe1] +connect_debug_port u_ila_0/probe1 [get_nets [list {util_reg_i/reg_spi_data[0]} {util_reg_i/reg_spi_data[1]} {util_reg_i/reg_spi_data[2]} {util_reg_i/reg_spi_data[3]} {util_reg_i/reg_spi_data[4]} {util_reg_i/reg_spi_data[5]} {util_reg_i/reg_spi_data[6]} {util_reg_i/reg_spi_data[7]} {util_reg_i/reg_spi_data[8]} {util_reg_i/reg_spi_data[9]} {util_reg_i/reg_spi_data[10]} {util_reg_i/reg_spi_data[11]} {util_reg_i/reg_spi_data[12]} {util_reg_i/reg_spi_data[13]} {util_reg_i/reg_spi_data[14]} {util_reg_i/reg_spi_data[15]} {util_reg_i/reg_spi_data[16]} {util_reg_i/reg_spi_data[17]} {util_reg_i/reg_spi_data[18]} {util_reg_i/reg_spi_data[19]} {util_reg_i/reg_spi_data[20]} {util_reg_i/reg_spi_data[21]} {util_reg_i/reg_spi_data[22]} {util_reg_i/reg_spi_data[23]} {util_reg_i/reg_spi_data[24]} {util_reg_i/reg_spi_data[25]} {util_reg_i/reg_spi_data[26]} {util_reg_i/reg_spi_data[27]} {util_reg_i/reg_spi_data[28]} {util_reg_i/reg_spi_data[29]} {util_reg_i/reg_spi_data[30]} {util_reg_i/reg_spi_data[31]}]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2] +set_property port_width 8 [get_debug_ports u_ila_0/probe2] +connect_debug_port u_ila_0/probe2 [get_nets [list {util_reg_i/spi_clk_cnt_reg[0]} {util_reg_i/spi_clk_cnt_reg[1]} {util_reg_i/spi_clk_cnt_reg[2]} {util_reg_i/spi_clk_cnt_reg[3]} {util_reg_i/spi_clk_cnt_reg[4]} {util_reg_i/spi_clk_cnt_reg[5]} {util_reg_i/spi_clk_cnt_reg[6]} {util_reg_i/spi_clk_cnt_reg[7]}]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe3] +set_property port_width 5 [get_debug_ports u_ila_0/probe3] +connect_debug_port u_ila_0/probe3 [get_nets [list {util_reg_i/le_count_reg[0]} {util_reg_i/le_count_reg[1]} {util_reg_i/le_count_reg[2]} {util_reg_i/le_count_reg[3]} {util_reg_i/le_count_reg[4]}]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe4] +set_property port_width 1 [get_debug_ports u_ila_0/probe4] +connect_debug_port u_ila_0/probe4 [get_nets [list util_reg_i/start_spi_transaction]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe5] +set_property port_width 1 [get_debug_ports u_ila_0/probe5] +connect_debug_port u_ila_0/probe5 [get_nets [list tx0_rf_attn_clk_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe6] +set_property port_width 1 [get_debug_ports u_ila_0/probe6] +connect_debug_port u_ila_0/probe6 [get_nets [list tx0_rf_attn_le_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe7] +set_property port_width 1 [get_debug_ports u_ila_0/probe7] +connect_debug_port u_ila_0/probe7 [get_nets [list tx0_rf_attn_sin_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe8] +set_property port_width 1 [get_debug_ports u_ila_0/probe8] +connect_debug_port u_ila_0/probe8 [get_nets [list rx0_if_attn_clk_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe9] +set_property port_width 1 [get_debug_ports u_ila_0/probe9] +connect_debug_port u_ila_0/probe9 [get_nets [list rx0_if_attn_le_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe10] +set_property port_width 1 [get_debug_ports u_ila_0/probe10] +connect_debug_port u_ila_0/probe10 [get_nets [list rx0_if_attn_sin_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe11] +set_property port_width 1 [get_debug_ports u_ila_0/probe11] +connect_debug_port u_ila_0/probe11 [get_nets [list rx0_rf_attn_clk_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe12] +set_property port_width 1 [get_debug_ports u_ila_0/probe12] +connect_debug_port u_ila_0/probe12 [get_nets [list rx0_rf_attn_le_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe13] +set_property port_width 1 [get_debug_ports u_ila_0/probe13] +connect_debug_port u_ila_0/probe13 [get_nets [list rx0_rf_attn_sin_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe14] +set_property port_width 1 [get_debug_ports u_ila_0/probe14] +connect_debug_port u_ila_0/probe14 [get_nets [list rx1_if_attn_clk_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe15] +set_property port_width 1 [get_debug_ports u_ila_0/probe15] +connect_debug_port u_ila_0/probe15 [get_nets [list rx1_if_attn_le_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe16] +set_property port_width 1 [get_debug_ports u_ila_0/probe16] +connect_debug_port u_ila_0/probe16 [get_nets [list rx1_if_attn_sin_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe17] +set_property port_width 1 [get_debug_ports u_ila_0/probe17] +connect_debug_port u_ila_0/probe17 [get_nets [list rx1_rf_attn_clk_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe18] +set_property port_width 1 [get_debug_ports u_ila_0/probe18] +connect_debug_port u_ila_0/probe18 [get_nets [list rx1_rf_attn_le_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe19] +set_property port_width 1 [get_debug_ports u_ila_0/probe19] +connect_debug_port u_ila_0/probe19 [get_nets [list rx1_rf_attn_sin_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe20] +set_property port_width 1 [get_debug_ports u_ila_0/probe20] +connect_debug_port u_ila_0/probe20 [get_nets [list tx1_rf_attn_clk_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe21] +set_property port_width 1 [get_debug_ports u_ila_0/probe21] +connect_debug_port u_ila_0/probe21 [get_nets [list tx1_rf_attn_le_OBUF]] +create_debug_port u_ila_0 probe +set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe22] +set_property port_width 1 [get_debug_ports u_ila_0/probe22] +connect_debug_port u_ila_0/probe22 [get_nets [list tx1_rf_attn_sin_OBUF]] +set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub] +set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub] +set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub] +connect_debug_port dbg_hub/clk [get_nets clk] diff --git a/radar_alinx_kintex.srcs/sources_1/bd/microblaze_bd/.gitignore b/radar_alinx_kintex.srcs/sources_1/bd/microblaze_bd/.gitignore new file mode 100644 index 0000000..a0e7533 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/bd/microblaze_bd/.gitignore @@ -0,0 +1,4 @@ +ip +ipshared +ui +*.bda diff --git a/radar_alinx_kintex.srcs/sources_1/bd/microblaze_bd/microblaze_bd.bd b/radar_alinx_kintex.srcs/sources_1/bd/microblaze_bd/microblaze_bd.bd new file mode 100755 index 0000000..44c373d --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/bd/microblaze_bd/microblaze_bd.bd @@ -0,0 +1,9021 @@ +{ + "design": { + "design_info": { + "boundary_crc": "0x1F2328300D1AB620", + "device": "xcku040-ffva1156-2-i", + "gen_directory": "../../../../radar_alinx_kintex.gen/sources_1/bd/microblaze_bd", + "name": "microblaze_bd", + "rev_ctrl_bd_flag": "RevCtrlBdOff", + "synth_flow_mode": "Singular", + "tool_version": "2022.2", + "validated": "true" + }, + "design_tree": { + "microblaze_0": "", + "microblaze_0_local_memory": { + "dlmb_v10": "", + "ilmb_v10": "", + "dlmb_bram_if_cntlr": "", + "ilmb_bram_if_cntlr": "", + "lmb_bram": "" + }, + "microblaze_0_axi_periph": { + "xbar": "", + "s00_couplers": {}, + "m00_couplers": {}, + "m01_couplers": {}, + "m02_couplers": {}, + "m03_couplers": {}, + "m04_couplers": {}, + "m05_couplers": {}, + "m06_couplers": {}, + "m07_couplers": { + "auto_cc": "" + }, + "m08_couplers": {}, + "m09_couplers": {}, + "m10_couplers": {} + }, + "microblaze_0_axi_intc": "", + "microblaze_0_xlconcat": "", + "mdm_1": "", + "rst_150": "", + "axi_uartlite_0": "", + "axi_timer_0": "", + "axi_ethernet_0": "", + "ddr4_0": "", + "axi_interconnect_0": { + "xbar": "", + "s00_couplers": { + "s00_data_fifo": "", + "auto_us": "" + }, + "s01_couplers": { + "s01_data_fifo": "", + "auto_us": "" + }, + "s02_couplers": { + "s02_data_fifo": "", + "auto_us": "" + }, + "s03_couplers": { + "s03_data_fifo": "", + "auto_cc": "" + }, + "s04_couplers": { + "s04_data_fifo": "", + "auto_cc": "" + }, + "m00_couplers": { + "m00_data_fifo": "" + } + }, + "rst_ddr": "", + "axi_ethernet_0_dma": "", + "clk_wiz_0": "", + "system_management_wiz_0": "", + "axi_quad_spi_0": "", + "axi_quad_spi_1": "", + "jesd": { + "jesd204_phy_0": "", + "jesd204c_1": "", + "jesd204c_0": "", + "util_ds_buf_1": "", + "util_ds_buf_0": "" + }, + "axi_bram_ctrl_0": "", + "axi_bram_ctrl_2": "", + "axi_bram_ctrl_3": "", + "axi_bram_ctrl_1": "", + "axi_interconnect_1": { + "xbar": "", + "s00_couplers": {}, + "m00_couplers": {}, + "m01_couplers": {}, + "m02_couplers": {}, + "m03_couplers": {}, + "m04_couplers": {}, + "m05_couplers": {}, + "m06_couplers": {}, + "m07_couplers": {}, + "m08_couplers": {}, + "m09_couplers": {}, + "m10_couplers": {}, + "m11_couplers": {} + }, + "axi_fifo_mm_s_0": "", + "axis_dwidth_converter_0": "", + "axis_dwidth_converter_1": "", + "qspi_flash": "" + }, + "interface_ports": { + "clk_200_in": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:diff_clock:1.0", + "vlnv": "xilinx.com:interface:diff_clock_rtl:1.0", + "parameters": { + "CAN_DEBUG": { + "value": "false", + "value_src": "default" + }, + "FREQ_HZ": { + "value": "200000000" + } + }, + "port_maps": { + "CLK_N": { + "physical_name": "clk_200_in_clk_n", + "direction": "I" + }, + "CLK_P": { + "physical_name": "clk_200_in_clk_p", + "direction": "I" + } + } + }, + "uart": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:uart:1.0", + "vlnv": "xilinx.com:interface:uart_rtl:1.0", + "port_maps": { + "RxD": { + "physical_name": "uart_rxd", + "direction": "I" + }, + "TxD": { + "physical_name": "uart_txd", + "direction": "O" + } + } + }, + "mdio": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:mdio:1.0", + "vlnv": "xilinx.com:interface:mdio_rtl:1.0", + "parameters": { + "CAN_DEBUG": { + "value": "false", + "value_src": "default" + } + }, + "port_maps": { + "MDC": { + "physical_name": "mdio_mdc", + "direction": "O" + }, + "MDIO_I": { + "physical_name": "mdio_mdio_i", + "direction": "I" + }, + "MDIO_O": { + "physical_name": "mdio_mdio_o", + "direction": "O" + }, + "MDIO_T": { + "physical_name": "mdio_mdio_t", + "direction": "O" + } + } + }, + "rgmii": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:rgmii:1.0", + "vlnv": "xilinx.com:interface:rgmii_rtl:1.0", + "port_maps": { + "RD": { + "physical_name": "rgmii_rd", + "direction": "I", + "left": "3", + "right": "0" + }, + "RX_CTL": { + "physical_name": "rgmii_rx_ctl", + "direction": "I" + }, + "RXC": { + "physical_name": "rgmii_rxc", + "direction": "I" + }, + "TD": { + "physical_name": "rgmii_td", + "direction": "O", + "left": "3", + "right": "0" + }, + "TX_CTL": { + "physical_name": "rgmii_tx_ctl", + "direction": "O" + }, + "TXC": { + "physical_name": "rgmii_txc", + "direction": "O" + } + } + }, + "ddr": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:ddr4:1.0", + "vlnv": "xilinx.com:interface:ddr4_rtl:1.0", + "parameters": { + "AXI_ARBITRATION_SCHEME": { + "value": "RD_PRI_REG", + "value_src": "user_prop" + }, + "BURST_LENGTH": { + "value": "8", + "value_src": "user_prop" + }, + "CAN_DEBUG": { + "value": "false", + "value_src": "default" + }, + "CAS_LATENCY": { + "value": "17", + "value_src": "user_prop" + }, + "CAS_WRITE_LATENCY": { + "value": "12", + "value_src": "user_prop" + }, + "CS_ENABLED": { + "value": "true", + "value_src": "user_prop" + }, + "CUSTOM_PARTS": { + "value": "no_file_loaded", + "value_src": "user_prop" + }, + "DATA_MASK_ENABLED": { + "value": "DM_NO_DBI", + "value_src": "user_prop" + }, + "DATA_WIDTH": { + "value": "64", + "value_src": "user_prop" + }, + "MEMORY_PART": { + "value": "MT40A512M16LY-075", + "value_src": "user_prop" + }, + "MEMORY_TYPE": { + "value": "Components", + "value_src": "user_prop" + }, + "MEM_ADDR_MAP": { + "value": "ROW_COLUMN_BANK", + "value_src": "user_prop" + }, + "SLOT": { + "value": "Single", + "value_src": "user_prop" + }, + "TIMEPERIOD_PS": { + "value": "833", + "value_src": "user_prop" + } + }, + "port_maps": { + "ACT_N": { + "physical_name": "ddr_act_n", + "direction": "O" + }, + "ADR": { + "physical_name": "ddr_adr", + "direction": "O", + "left": "16", + "right": "0" + }, + "BA": { + "physical_name": "ddr_ba", + "direction": "O", + "left": "1", + "right": "0" + }, + "BG": { + "physical_name": "ddr_bg", + "direction": "O", + "left": "0", + "right": "0" + }, + "CK_C": { + "physical_name": "ddr_ck_c", + "direction": "O", + "left": "0", + "right": "0" + }, + "CK_T": { + "physical_name": "ddr_ck_t", + "direction": "O", + "left": "0", + "right": "0" + }, + "CKE": { + "physical_name": "ddr_cke", + "direction": "O", + "left": "0", + "right": "0" + }, + "CS_N": { + "physical_name": "ddr_cs_n", + "direction": "O", + "left": "0", + "right": "0" + }, + "DM_N": { + "physical_name": "ddr_dm_n", + "direction": "IO", + "left": "7", + "right": "0" + }, + "DQ": { + "physical_name": "ddr_dq", + "direction": "IO", + "left": "63", + "right": "0" + }, + "DQS_C": { + "physical_name": "ddr_dqs_c", + "direction": "IO", + "left": "7", + "right": "0" + }, + "DQS_T": { + "physical_name": "ddr_dqs_t", + "direction": "IO", + "left": "7", + "right": "0" + }, + "ODT": { + "physical_name": "ddr_odt", + "direction": "O", + "left": "0", + "right": "0" + }, + "RESET_N": { + "physical_name": "ddr_reset_n", + "direction": "O" + } + } + }, + "util_reg_axil": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "parameters": { + "ADDR_WIDTH": { + "value": "32" + }, + "ARUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "AWUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "BUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "CLK_DOMAIN": { + "value": "microblaze_bd_ddr4_0_0_c0_ddr4_ui_clk", + "value_src": "user_prop" + }, + "DATA_WIDTH": { + "value": "32" + }, + "FREQ_HZ": { + "value": "150000000", + "value_src": "user_prop" + }, + "HAS_BRESP": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_BURST": { + "value": "0" + }, + "HAS_CACHE": { + "value": "0" + }, + "HAS_LOCK": { + "value": "0" + }, + "HAS_PROT": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_QOS": { + "value": "0" + }, + "HAS_REGION": { + "value": "0" + }, + "HAS_RRESP": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_WSTRB": { + "value": "1", + "value_src": "const_prop" + }, + "ID_WIDTH": { + "value": "0", + "value_src": "default" + }, + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "MAX_BURST_LENGTH": { + "value": "1", + "value_src": "ip_prop" + }, + "NUM_READ_OUTSTANDING": { + "value": "1", + "value_src": "default" + }, + "NUM_READ_THREADS": { + "value": "1", + "value_src": "default" + }, + "NUM_WRITE_OUTSTANDING": { + "value": "1", + "value_src": "default" + }, + "NUM_WRITE_THREADS": { + "value": "1", + "value_src": "default" + }, + "PHASE": { + "value": "0", + "value_src": "default_prop" + }, + "PROTOCOL": { + "value": "AXI4LITE" + }, + "READ_WRITE_MODE": { + "value": "READ_WRITE", + "value_src": "default" + }, + "RUSER_BITS_PER_BYTE": { + "value": "0", + "value_src": "default" + }, + "RUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "SUPPORTS_NARROW_BURST": { + "value": "0", + "value_src": "ip_prop" + }, + "WUSER_BITS_PER_BYTE": { + "value": "0", + "value_src": "default" + }, + "WUSER_WIDTH": { + "value": "0", + "value_src": "default" + } + }, + "memory_map_ref": "util_reg_axil", + "port_maps": { + "AWADDR": { + "physical_name": "util_reg_axil_awaddr", + "direction": "O", + "left": "31", + "right": "0" + }, + "AWPROT": { + "physical_name": "util_reg_axil_awprot", + "direction": "O", + "left": "2", + "right": "0" + }, + "AWVALID": { + "physical_name": "util_reg_axil_awvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "AWREADY": { + "physical_name": "util_reg_axil_awready", + "direction": "I", + "left": "0", + "right": "0" + }, + "WDATA": { + "physical_name": "util_reg_axil_wdata", + "direction": "O", + "left": "31", + "right": "0" + }, + "WSTRB": { + "physical_name": "util_reg_axil_wstrb", + "direction": "O", + "left": "3", + "right": "0" + }, + "WVALID": { + "physical_name": "util_reg_axil_wvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "WREADY": { + "physical_name": "util_reg_axil_wready", + "direction": "I", + "left": "0", + "right": "0" + }, + "BRESP": { + "physical_name": "util_reg_axil_bresp", + "direction": "I", + "left": "1", + "right": "0" + }, + "BVALID": { + "physical_name": "util_reg_axil_bvalid", + "direction": "I", + "left": "0", + "right": "0" + }, + "BREADY": { + "physical_name": "util_reg_axil_bready", + "direction": "O", + "left": "0", + "right": "0" + }, + "ARADDR": { + "physical_name": "util_reg_axil_araddr", + "direction": "O", + "left": "31", + "right": "0" + }, + "ARPROT": { + "physical_name": "util_reg_axil_arprot", + "direction": "O", + "left": "2", + "right": "0" + }, + "ARVALID": { + "physical_name": "util_reg_axil_arvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "ARREADY": { + "physical_name": "util_reg_axil_arready", + "direction": "I", + "left": "0", + "right": "0" + }, + "RDATA": { + "physical_name": "util_reg_axil_rdata", + "direction": "I", + "left": "31", + "right": "0" + }, + "RRESP": { + "physical_name": "util_reg_axil_rresp", + "direction": "I", + "left": "1", + "right": "0" + }, + "RVALID": { + "physical_name": "util_reg_axil_rvalid", + "direction": "I", + "left": "0", + "right": "0" + }, + "RREADY": { + "physical_name": "util_reg_axil_rready", + "direction": "O", + "left": "0", + "right": "0" + } + } + }, + "jesd_axis_rx": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:axis:1.0", + "vlnv": "xilinx.com:interface:axis_rtl:1.0", + "parameters": { + "CLK_DOMAIN": { + "value": "microblaze_bd_core_clk", + "value_src": "default" + }, + "FREQ_HZ": { + "value": "187500000" + }, + "HAS_TKEEP": { + "value": "0", + "value_src": "const_prop" + }, + "HAS_TLAST": { + "value": "0", + "value_src": "const_prop" + }, + "HAS_TREADY": { + "value": "0", + "value_src": "const_prop" + }, + "HAS_TSTRB": { + "value": "0", + "value_src": "const_prop" + }, + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "LAYERED_METADATA": { + "value": "undef", + "value_src": "default" + }, + "PHASE": { + "value": "0.0", + "value_src": "default" + }, + "TDATA_NUM_BYTES": { + "value": "64", + "value_src": "auto_prop" + }, + "TDEST_WIDTH": { + "value": "0", + "value_src": "const_prop" + }, + "TID_WIDTH": { + "value": "0", + "value_src": "const_prop" + }, + "TUSER_WIDTH": { + "value": "0", + "value_src": "const_prop" + } + }, + "port_maps": { + "TDATA": { + "physical_name": "jesd_axis_rx_tdata", + "direction": "O", + "left": "511", + "right": "0" + }, + "TVALID": { + "physical_name": "jesd_axis_rx_tvalid", + "direction": "O" + } + } + }, + "jesd_axis_rx_cmd": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:axis:1.0", + "vlnv": "xilinx.com:interface:axis_rtl:1.0", + "parameters": { + "CLK_DOMAIN": { + "value": "microblaze_bd_core_clk", + "value_src": "default" + }, + "FREQ_HZ": { + "value": "187500000" + }, + "HAS_TKEEP": { + "value": "0", + "value_src": "const_prop" + }, + "HAS_TLAST": { + "value": "0", + "value_src": "const_prop" + }, + "HAS_TREADY": { + "value": "1", + "value_src": "auto_prop" + }, + "HAS_TSTRB": { + "value": "0", + "value_src": "const_prop" + }, + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "LAYERED_METADATA": { + "value": "undef", + "value_src": "default" + }, + "PHASE": { + "value": "0.0", + "value_src": "default" + }, + "TDATA_NUM_BYTES": { + "value": "32", + "value_src": "auto_prop" + }, + "TDEST_WIDTH": { + "value": "0", + "value_src": "const_prop" + }, + "TID_WIDTH": { + "value": "0", + "value_src": "const_prop" + }, + "TUSER_WIDTH": { + "value": "8", + "value_src": "auto_prop" + } + }, + "port_maps": { + "TDATA": { + "physical_name": "jesd_axis_rx_cmd_tdata", + "direction": "O", + "left": "255", + "right": "0" + }, + "TREADY": { + "physical_name": "jesd_axis_rx_cmd_tready", + "direction": "I" + }, + "TUSER": { + "physical_name": "jesd_axis_rx_cmd_tuser", + "direction": "O", + "left": "7", + "right": "0" + }, + "TVALID": { + "physical_name": "jesd_axis_rx_cmd_tvalid", + "direction": "O" + } + } + }, + "jesd_axis_tx": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:axis:1.0", + "vlnv": "xilinx.com:interface:axis_rtl:1.0", + "parameters": { + "CLK_DOMAIN": { + "value": "microblaze_bd_core_clk", + "value_src": "default" + }, + "FREQ_HZ": { + "value": "187500000" + }, + "HAS_TKEEP": { + "value": "0" + }, + "HAS_TLAST": { + "value": "0" + }, + "HAS_TREADY": { + "value": "1" + }, + "HAS_TSTRB": { + "value": "0" + }, + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "LAYERED_METADATA": { + "value": "undef" + }, + "PHASE": { + "value": "0.0", + "value_src": "default" + }, + "TDATA_NUM_BYTES": { + "value": "64" + }, + "TDEST_WIDTH": { + "value": "0" + }, + "TID_WIDTH": { + "value": "0" + }, + "TUSER_WIDTH": { + "value": "0" + } + }, + "port_maps": { + "TDATA": { + "physical_name": "jesd_axis_tx_tdata", + "direction": "I", + "left": "511", + "right": "0" + }, + "TREADY": { + "physical_name": "jesd_axis_tx_tready", + "direction": "O" + } + } + }, + "jesd_axis_tx_cmd": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:axis:1.0", + "vlnv": "xilinx.com:interface:axis_rtl:1.0", + "parameters": { + "CLK_DOMAIN": { + "value": "microblaze_bd_core_clk", + "value_src": "default" + }, + "FREQ_HZ": { + "value": "187500000" + }, + "HAS_TKEEP": { + "value": "0" + }, + "HAS_TLAST": { + "value": "0" + }, + "HAS_TREADY": { + "value": "1" + }, + "HAS_TSTRB": { + "value": "0" + }, + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "LAYERED_METADATA": { + "value": "undef" + }, + "PHASE": { + "value": "0.0", + "value_src": "default" + }, + "TDATA_NUM_BYTES": { + "value": "32" + }, + "TDEST_WIDTH": { + "value": "0" + }, + "TID_WIDTH": { + "value": "0" + }, + "TUSER_WIDTH": { + "value": "0" + } + }, + "port_maps": { + "TDATA": { + "physical_name": "jesd_axis_tx_cmd_tdata", + "direction": "I", + "left": "255", + "right": "0" + }, + "TREADY": { + "physical_name": "jesd_axis_tx_cmd_tready", + "direction": "O" + }, + "TVALID": { + "physical_name": "jesd_axis_tx_cmd_tvalid", + "direction": "I" + } + } + }, + "fmc_spi0": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:spi:1.0", + "vlnv": "xilinx.com:interface:spi_rtl:1.0", + "port_maps": { + "IO0_I": { + "physical_name": "fmc_spi0_io0_i", + "direction": "I" + }, + "IO0_O": { + "physical_name": "fmc_spi0_io0_o", + "direction": "O" + }, + "IO0_T": { + "physical_name": "fmc_spi0_io0_t", + "direction": "O" + }, + "IO1_I": { + "physical_name": "fmc_spi0_io1_i", + "direction": "I" + }, + "IO1_O": { + "physical_name": "fmc_spi0_io1_o", + "direction": "O" + }, + "IO1_T": { + "physical_name": "fmc_spi0_io1_t", + "direction": "O" + }, + "SCK_I": { + "physical_name": "fmc_spi0_sck_i", + "direction": "I" + }, + "SCK_O": { + "physical_name": "fmc_spi0_sck_o", + "direction": "O" + }, + "SCK_T": { + "physical_name": "fmc_spi0_sck_t", + "direction": "O" + }, + "SS_I": { + "physical_name": "fmc_spi0_ss_i", + "direction": "I", + "left": "0", + "right": "0" + }, + "SS_O": { + "physical_name": "fmc_spi0_ss_o", + "direction": "O", + "left": "0", + "right": "0" + }, + "SS_T": { + "physical_name": "fmc_spi0_ss_t", + "direction": "O" + } + } + }, + "jesd_qpll0_refclk": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:diff_clock:1.0", + "vlnv": "xilinx.com:interface:diff_clock_rtl:1.0", + "parameters": { + "CAN_DEBUG": { + "value": "false", + "value_src": "default" + }, + "FREQ_HZ": { + "value": "187500000" + } + }, + "port_maps": { + "CLK_P": { + "physical_name": "jesd_qpll0_refclk_clk_p", + "direction": "I", + "left": "0", + "right": "0" + }, + "CLK_N": { + "physical_name": "jesd_qpll0_refclk_clk_n", + "direction": "I", + "left": "0", + "right": "0" + } + } + }, + "jesd_sysref": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:diff_clock:1.0", + "vlnv": "xilinx.com:interface:diff_clock_rtl:1.0", + "parameters": { + "CAN_DEBUG": { + "value": "false", + "value_src": "default" + }, + "FREQ_HZ": { + "value": "100000000", + "value_src": "default" + } + }, + "port_maps": { + "CLK_P": { + "physical_name": "jesd_sysref_clk_p", + "direction": "I", + "left": "0", + "right": "0" + }, + "CLK_N": { + "physical_name": "jesd_sysref_clk_n", + "direction": "I", + "left": "0", + "right": "0" + } + } + }, + "fmc_spi1": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:spi:1.0", + "vlnv": "xilinx.com:interface:spi_rtl:1.0", + "port_maps": { + "IO0_I": { + "physical_name": "fmc_spi1_io0_i", + "direction": "I" + }, + "IO0_O": { + "physical_name": "fmc_spi1_io0_o", + "direction": "O" + }, + "IO0_T": { + "physical_name": "fmc_spi1_io0_t", + "direction": "O" + }, + "IO1_I": { + "physical_name": "fmc_spi1_io1_i", + "direction": "I" + }, + "IO1_O": { + "physical_name": "fmc_spi1_io1_o", + "direction": "O" + }, + "IO1_T": { + "physical_name": "fmc_spi1_io1_t", + "direction": "O" + }, + "SCK_I": { + "physical_name": "fmc_spi1_sck_i", + "direction": "I" + }, + "SCK_O": { + "physical_name": "fmc_spi1_sck_o", + "direction": "O" + }, + "SCK_T": { + "physical_name": "fmc_spi1_sck_t", + "direction": "O" + }, + "SS_I": { + "physical_name": "fmc_spi1_ss_i", + "direction": "I", + "left": "1", + "right": "0" + }, + "SS_O": { + "physical_name": "fmc_spi1_ss_o", + "direction": "O", + "left": "1", + "right": "0" + }, + "SS_T": { + "physical_name": "fmc_spi1_ss_t", + "direction": "O" + } + } + }, + "dac0_wf_bram": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:bram:1.0", + "vlnv": "xilinx.com:interface:bram_rtl:1.0", + "parameters": { + "MASTER_TYPE": { + "value": "BRAM_CTRL" + }, + "MEM_ECC": { + "value": "NONE", + "value_src": "user_prop" + }, + "MEM_SIZE": { + "value": "32768", + "value_src": "ip_prop" + }, + "MEM_WIDTH": { + "value": "32", + "value_src": "ip_prop" + }, + "READ_LATENCY": { + "value": "1", + "value_src": "user_prop" + }, + "READ_WRITE_MODE": { + "value": "READ_WRITE" + } + }, + "port_maps": { + "ADDR": { + "physical_name": "dac0_wf_bram_addr", + "direction": "O", + "left": "14", + "right": "0" + }, + "CLK": { + "physical_name": "dac0_wf_bram_clk", + "direction": "O" + }, + "DIN": { + "physical_name": "dac0_wf_bram_din", + "direction": "O", + "left": "31", + "right": "0" + }, + "DOUT": { + "physical_name": "dac0_wf_bram_dout", + "direction": "I", + "left": "31", + "right": "0" + }, + "EN": { + "physical_name": "dac0_wf_bram_en", + "direction": "O" + }, + "RST": { + "physical_name": "dac0_wf_bram_rst", + "direction": "O" + }, + "WE": { + "physical_name": "dac0_wf_bram_we", + "direction": "O", + "left": "3", + "right": "0" + } + } + }, + "dac1_wf_bram": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:bram:1.0", + "vlnv": "xilinx.com:interface:bram_rtl:1.0", + "parameters": { + "MASTER_TYPE": { + "value": "BRAM_CTRL" + }, + "MEM_ECC": { + "value": "NONE", + "value_src": "user_prop" + }, + "MEM_SIZE": { + "value": "32768", + "value_src": "ip_prop" + }, + "MEM_WIDTH": { + "value": "32", + "value_src": "ip_prop" + }, + "READ_LATENCY": { + "value": "1", + "value_src": "user_prop" + }, + "READ_WRITE_MODE": { + "value": "READ_WRITE" + } + }, + "port_maps": { + "ADDR": { + "physical_name": "dac1_wf_bram_addr", + "direction": "O", + "left": "14", + "right": "0" + }, + "CLK": { + "physical_name": "dac1_wf_bram_clk", + "direction": "O" + }, + "DIN": { + "physical_name": "dac1_wf_bram_din", + "direction": "O", + "left": "31", + "right": "0" + }, + "DOUT": { + "physical_name": "dac1_wf_bram_dout", + "direction": "I", + "left": "31", + "right": "0" + }, + "EN": { + "physical_name": "dac1_wf_bram_en", + "direction": "O" + }, + "RST": { + "physical_name": "dac1_wf_bram_rst", + "direction": "O" + }, + "WE": { + "physical_name": "dac1_wf_bram_we", + "direction": "O", + "left": "3", + "right": "0" + } + } + }, + "dac2_wf_bram": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:bram:1.0", + "vlnv": "xilinx.com:interface:bram_rtl:1.0", + "parameters": { + "MASTER_TYPE": { + "value": "BRAM_CTRL" + }, + "MEM_ECC": { + "value": "NONE", + "value_src": "user_prop" + }, + "MEM_SIZE": { + "value": "32768", + "value_src": "ip_prop" + }, + "MEM_WIDTH": { + "value": "32", + "value_src": "ip_prop" + }, + "READ_LATENCY": { + "value": "1", + "value_src": "user_prop" + }, + "READ_WRITE_MODE": { + "value": "READ_WRITE" + } + }, + "port_maps": { + "ADDR": { + "physical_name": "dac2_wf_bram_addr", + "direction": "O", + "left": "14", + "right": "0" + }, + "CLK": { + "physical_name": "dac2_wf_bram_clk", + "direction": "O" + }, + "DIN": { + "physical_name": "dac2_wf_bram_din", + "direction": "O", + "left": "31", + "right": "0" + }, + "DOUT": { + "physical_name": "dac2_wf_bram_dout", + "direction": "I", + "left": "31", + "right": "0" + }, + "EN": { + "physical_name": "dac2_wf_bram_en", + "direction": "O" + }, + "RST": { + "physical_name": "dac2_wf_bram_rst", + "direction": "O" + }, + "WE": { + "physical_name": "dac2_wf_bram_we", + "direction": "O", + "left": "3", + "right": "0" + } + } + }, + "dac3_wf_bram": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:bram:1.0", + "vlnv": "xilinx.com:interface:bram_rtl:1.0", + "parameters": { + "MASTER_TYPE": { + "value": "BRAM_CTRL" + }, + "MEM_ECC": { + "value": "NONE", + "value_src": "user_prop" + }, + "MEM_SIZE": { + "value": "32768", + "value_src": "ip_prop" + }, + "MEM_WIDTH": { + "value": "32", + "value_src": "ip_prop" + }, + "READ_LATENCY": { + "value": "1", + "value_src": "user_prop" + }, + "READ_WRITE_MODE": { + "value": "READ_WRITE" + } + }, + "port_maps": { + "ADDR": { + "physical_name": "dac3_wf_bram_addr", + "direction": "O", + "left": "14", + "right": "0" + }, + "CLK": { + "physical_name": "dac3_wf_bram_clk", + "direction": "O" + }, + "DIN": { + "physical_name": "dac3_wf_bram_din", + "direction": "O", + "left": "31", + "right": "0" + }, + "DOUT": { + "physical_name": "dac3_wf_bram_dout", + "direction": "I", + "left": "31", + "right": "0" + }, + "EN": { + "physical_name": "dac3_wf_bram_en", + "direction": "O" + }, + "RST": { + "physical_name": "dac3_wf_bram_rst", + "direction": "O" + }, + "WE": { + "physical_name": "dac3_wf_bram_we", + "direction": "O", + "left": "3", + "right": "0" + } + } + }, + "timing_engine_axil": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "parameters": { + "ADDR_WIDTH": { + "value": "32" + }, + "ARUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "AWUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "BUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "CLK_DOMAIN": { + "value": "microblaze_bd_ddr4_0_0_c0_ddr4_ui_clk", + "value_src": "user_prop" + }, + "DATA_WIDTH": { + "value": "32" + }, + "FREQ_HZ": { + "value": "150000000", + "value_src": "user_prop" + }, + "HAS_BRESP": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_BURST": { + "value": "0" + }, + "HAS_CACHE": { + "value": "0" + }, + "HAS_LOCK": { + "value": "0" + }, + "HAS_PROT": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_QOS": { + "value": "0" + }, + "HAS_REGION": { + "value": "0" + }, + "HAS_RRESP": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_WSTRB": { + "value": "1", + "value_src": "const_prop" + }, + "ID_WIDTH": { + "value": "0", + "value_src": "default" + }, + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "MAX_BURST_LENGTH": { + "value": "1", + "value_src": "ip_prop" + }, + "NUM_READ_OUTSTANDING": { + "value": "1", + "value_src": "default" + }, + "NUM_READ_THREADS": { + "value": "1", + "value_src": "default" + }, + "NUM_WRITE_OUTSTANDING": { + "value": "1", + "value_src": "default" + }, + "NUM_WRITE_THREADS": { + "value": "1", + "value_src": "default" + }, + "PHASE": { + "value": "0" + }, + "PROTOCOL": { + "value": "AXI4LITE" + }, + "READ_WRITE_MODE": { + "value": "READ_WRITE", + "value_src": "default" + }, + "RUSER_BITS_PER_BYTE": { + "value": "0", + "value_src": "default" + }, + "RUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "SUPPORTS_NARROW_BURST": { + "value": "0", + "value_src": "ip_prop" + }, + "WUSER_BITS_PER_BYTE": { + "value": "0", + "value_src": "default" + }, + "WUSER_WIDTH": { + "value": "0", + "value_src": "default" + } + }, + "memory_map_ref": "timing_engine_axil", + "port_maps": { + "AWADDR": { + "physical_name": "timing_engine_axil_awaddr", + "direction": "O", + "left": "31", + "right": "0" + }, + "AWPROT": { + "physical_name": "timing_engine_axil_awprot", + "direction": "O", + "left": "2", + "right": "0" + }, + "AWVALID": { + "physical_name": "timing_engine_axil_awvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "AWREADY": { + "physical_name": "timing_engine_axil_awready", + "direction": "I", + "left": "0", + "right": "0" + }, + "WDATA": { + "physical_name": "timing_engine_axil_wdata", + "direction": "O", + "left": "31", + "right": "0" + }, + "WSTRB": { + "physical_name": "timing_engine_axil_wstrb", + "direction": "O", + "left": "3", + "right": "0" + }, + "WVALID": { + "physical_name": "timing_engine_axil_wvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "WREADY": { + "physical_name": "timing_engine_axil_wready", + "direction": "I", + "left": "0", + "right": "0" + }, + "BRESP": { + "physical_name": "timing_engine_axil_bresp", + "direction": "I", + "left": "1", + "right": "0" + }, + "BVALID": { + "physical_name": "timing_engine_axil_bvalid", + "direction": "I", + "left": "0", + "right": "0" + }, + "BREADY": { + "physical_name": "timing_engine_axil_bready", + "direction": "O", + "left": "0", + "right": "0" + }, + "ARADDR": { + "physical_name": "timing_engine_axil_araddr", + "direction": "O", + "left": "31", + "right": "0" + }, + "ARPROT": { + "physical_name": "timing_engine_axil_arprot", + "direction": "O", + "left": "2", + "right": "0" + }, + "ARVALID": { + "physical_name": "timing_engine_axil_arvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "ARREADY": { + "physical_name": "timing_engine_axil_arready", + "direction": "I", + "left": "0", + "right": "0" + }, + "RDATA": { + "physical_name": "timing_engine_axil_rdata", + "direction": "I", + "left": "31", + "right": "0" + }, + "RRESP": { + "physical_name": "timing_engine_axil_rresp", + "direction": "I", + "left": "1", + "right": "0" + }, + "RVALID": { + "physical_name": "timing_engine_axil_rvalid", + "direction": "I", + "left": "0", + "right": "0" + }, + "RREADY": { + "physical_name": "timing_engine_axil_rready", + "direction": "O", + "left": "0", + "right": "0" + } + } + }, + "udp_rx": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:axis:1.0", + "vlnv": "xilinx.com:interface:axis_rtl:1.0", + "parameters": { + "CLK_DOMAIN": { + "value": "microblaze_bd_s_axi_aclk_0", + "value_src": "default" + }, + "FREQ_HZ": { + "value": "156250000" + }, + "HAS_TKEEP": { + "value": "0" + }, + "HAS_TLAST": { + "value": "1" + }, + "HAS_TREADY": { + "value": "1" + }, + "HAS_TSTRB": { + "value": "0" + }, + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "LAYERED_METADATA": { + "value": "undef" + }, + "PHASE": { + "value": "0.0", + "value_src": "default" + }, + "TDATA_NUM_BYTES": { + "value": "8" + }, + "TDEST_WIDTH": { + "value": "0" + }, + "TID_WIDTH": { + "value": "0" + }, + "TUSER_WIDTH": { + "value": "0" + } + }, + "port_maps": { + "TVALID": { + "physical_name": "udp_rx_tvalid", + "direction": "I" + }, + "TREADY": { + "physical_name": "udp_rx_tready", + "direction": "O" + }, + "TDATA": { + "physical_name": "udp_rx_tdata", + "direction": "I", + "left": "63", + "right": "0" + }, + "TLAST": { + "physical_name": "udp_rx_tlast", + "direction": "I" + } + } + }, + "udp_tx": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:axis:1.0", + "vlnv": "xilinx.com:interface:axis_rtl:1.0", + "parameters": { + "CLK_DOMAIN": { + "value": "microblaze_bd_s_axi_aclk_0", + "value_src": "default" + }, + "FREQ_HZ": { + "value": "156250000" + }, + "HAS_TKEEP": { + "value": "1", + "value_src": "ip_prop" + }, + "HAS_TLAST": { + "value": "1", + "value_src": "default_prop" + }, + "HAS_TREADY": { + "value": "1", + "value_src": "default" + }, + "HAS_TSTRB": { + "value": "0", + "value_src": "default" + }, + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "LAYERED_METADATA": { + "value": "undef", + "value_src": "default" + }, + "PHASE": { + "value": "0.0", + "value_src": "default" + }, + "TDATA_NUM_BYTES": { + "value": "8", + "value_src": "default_prop" + }, + "TDEST_WIDTH": { + "value": "0", + "value_src": "default" + }, + "TID_WIDTH": { + "value": "0", + "value_src": "default" + }, + "TUSER_WIDTH": { + "value": "0", + "value_src": "default" + } + }, + "port_maps": { + "TVALID": { + "physical_name": "udp_tx_tvalid", + "direction": "O" + }, + "TREADY": { + "physical_name": "udp_tx_tready", + "direction": "I" + }, + "TDATA": { + "physical_name": "udp_tx_tdata", + "direction": "O", + "left": "63", + "right": "0" + }, + "TKEEP": { + "physical_name": "udp_tx_tkeep", + "direction": "O", + "left": "7", + "right": "0" + }, + "TLAST": { + "physical_name": "udp_tx_tlast", + "direction": "O" + } + } + }, + "dig_rx0_axil": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "parameters": { + "ADDR_WIDTH": { + "value": "32" + }, + "ARUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "AWUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "BUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "CLK_DOMAIN": { + "value": "microblaze_bd_ddr4_0_0_c0_ddr4_ui_clk", + "value_src": "user_prop" + }, + "DATA_WIDTH": { + "value": "32" + }, + "FREQ_HZ": { + "value": "150000000", + "value_src": "user_prop" + }, + "HAS_BRESP": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_BURST": { + "value": "0" + }, + "HAS_CACHE": { + "value": "0" + }, + "HAS_LOCK": { + "value": "0" + }, + "HAS_PROT": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_QOS": { + "value": "0" + }, + "HAS_REGION": { + "value": "0" + }, + "HAS_RRESP": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_WSTRB": { + "value": "1", + "value_src": "const_prop" + }, + "ID_WIDTH": { + "value": "0", + "value_src": "default" + }, + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "MAX_BURST_LENGTH": { + "value": "1", + "value_src": "ip_prop" + }, + "NUM_READ_OUTSTANDING": { + "value": "1", + "value_src": "default" + }, + "NUM_READ_THREADS": { + "value": "1", + "value_src": "default" + }, + "NUM_WRITE_OUTSTANDING": { + "value": "1", + "value_src": "default" + }, + "NUM_WRITE_THREADS": { + "value": "1", + "value_src": "default" + }, + "PHASE": { + "value": "0", + "value_src": "default_prop" + }, + "PROTOCOL": { + "value": "AXI4LITE" + }, + "READ_WRITE_MODE": { + "value": "READ_WRITE", + "value_src": "default" + }, + "RUSER_BITS_PER_BYTE": { + "value": "0", + "value_src": "default" + }, + "RUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "SUPPORTS_NARROW_BURST": { + "value": "0", + "value_src": "ip_prop" + }, + "WUSER_BITS_PER_BYTE": { + "value": "0", + "value_src": "default" + }, + "WUSER_WIDTH": { + "value": "0", + "value_src": "default" + } + }, + "memory_map_ref": "dig_rx0_axil", + "port_maps": { + "AWADDR": { + "physical_name": "dig_rx0_axil_awaddr", + "direction": "O", + "left": "31", + "right": "0" + }, + "AWPROT": { + "physical_name": "dig_rx0_axil_awprot", + "direction": "O", + "left": "2", + "right": "0" + }, + "AWVALID": { + "physical_name": "dig_rx0_axil_awvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "AWREADY": { + "physical_name": "dig_rx0_axil_awready", + "direction": "I", + "left": "0", + "right": "0" + }, + "WDATA": { + "physical_name": "dig_rx0_axil_wdata", + "direction": "O", + "left": "31", + "right": "0" + }, + "WSTRB": { + "physical_name": "dig_rx0_axil_wstrb", + "direction": "O", + "left": "3", + "right": "0" + }, + "WVALID": { + "physical_name": "dig_rx0_axil_wvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "WREADY": { + "physical_name": "dig_rx0_axil_wready", + "direction": "I", + "left": "0", + "right": "0" + }, + "BRESP": { + "physical_name": "dig_rx0_axil_bresp", + "direction": "I", + "left": "1", + "right": "0" + }, + "BVALID": { + "physical_name": "dig_rx0_axil_bvalid", + "direction": "I", + "left": "0", + "right": "0" + }, + "BREADY": { + "physical_name": "dig_rx0_axil_bready", + "direction": "O", + "left": "0", + "right": "0" + }, + "ARADDR": { + "physical_name": "dig_rx0_axil_araddr", + "direction": "O", + "left": "31", + "right": "0" + }, + "ARPROT": { + "physical_name": "dig_rx0_axil_arprot", + "direction": "O", + "left": "2", + "right": "0" + }, + "ARVALID": { + "physical_name": "dig_rx0_axil_arvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "ARREADY": { + "physical_name": "dig_rx0_axil_arready", + "direction": "I", + "left": "0", + "right": "0" + }, + "RDATA": { + "physical_name": "dig_rx0_axil_rdata", + "direction": "I", + "left": "31", + "right": "0" + }, + "RRESP": { + "physical_name": "dig_rx0_axil_rresp", + "direction": "I", + "left": "1", + "right": "0" + }, + "RVALID": { + "physical_name": "dig_rx0_axil_rvalid", + "direction": "I", + "left": "0", + "right": "0" + }, + "RREADY": { + "physical_name": "dig_rx0_axil_rready", + "direction": "O", + "left": "0", + "right": "0" + } + } + }, + "wf_gen_axil": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "parameters": { + "ADDR_WIDTH": { + "value": "32" + }, + "ARUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "AWUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "BUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "CLK_DOMAIN": { + "value": "microblaze_bd_ddr4_0_0_c0_ddr4_ui_clk", + "value_src": "user_prop" + }, + "DATA_WIDTH": { + "value": "32" + }, + "FREQ_HZ": { + "value": "150000000", + "value_src": "user_prop" + }, + "HAS_BRESP": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_BURST": { + "value": "0" + }, + "HAS_CACHE": { + "value": "0" + }, + "HAS_LOCK": { + "value": "0" + }, + "HAS_PROT": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_QOS": { + "value": "0" + }, + "HAS_REGION": { + "value": "0" + }, + "HAS_RRESP": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_WSTRB": { + "value": "1", + "value_src": "const_prop" + }, + "ID_WIDTH": { + "value": "0", + "value_src": "default" + }, + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "MAX_BURST_LENGTH": { + "value": "1", + "value_src": "ip_prop" + }, + "NUM_READ_OUTSTANDING": { + "value": "1", + "value_src": "default" + }, + "NUM_READ_THREADS": { + "value": "1", + "value_src": "default" + }, + "NUM_WRITE_OUTSTANDING": { + "value": "1", + "value_src": "default" + }, + "NUM_WRITE_THREADS": { + "value": "1", + "value_src": "default" + }, + "PHASE": { + "value": "0" + }, + "PROTOCOL": { + "value": "AXI4LITE" + }, + "READ_WRITE_MODE": { + "value": "READ_WRITE", + "value_src": "default" + }, + "RUSER_BITS_PER_BYTE": { + "value": "0", + "value_src": "default" + }, + "RUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "SUPPORTS_NARROW_BURST": { + "value": "0", + "value_src": "ip_prop" + }, + "WUSER_BITS_PER_BYTE": { + "value": "0", + "value_src": "default" + }, + "WUSER_WIDTH": { + "value": "0", + "value_src": "default" + } + }, + "memory_map_ref": "wf_gen_axil", + "port_maps": { + "AWADDR": { + "physical_name": "wf_gen_axil_awaddr", + "direction": "O", + "left": "31", + "right": "0" + }, + "AWPROT": { + "physical_name": "wf_gen_axil_awprot", + "direction": "O", + "left": "2", + "right": "0" + }, + "AWVALID": { + "physical_name": "wf_gen_axil_awvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "AWREADY": { + "physical_name": "wf_gen_axil_awready", + "direction": "I", + "left": "0", + "right": "0" + }, + "WDATA": { + "physical_name": "wf_gen_axil_wdata", + "direction": "O", + "left": "31", + "right": "0" + }, + "WSTRB": { + "physical_name": "wf_gen_axil_wstrb", + "direction": "O", + "left": "3", + "right": "0" + }, + "WVALID": { + "physical_name": "wf_gen_axil_wvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "WREADY": { + "physical_name": "wf_gen_axil_wready", + "direction": "I", + "left": "0", + "right": "0" + }, + "BRESP": { + "physical_name": "wf_gen_axil_bresp", + "direction": "I", + "left": "1", + "right": "0" + }, + "BVALID": { + "physical_name": "wf_gen_axil_bvalid", + "direction": "I", + "left": "0", + "right": "0" + }, + "BREADY": { + "physical_name": "wf_gen_axil_bready", + "direction": "O", + "left": "0", + "right": "0" + }, + "ARADDR": { + "physical_name": "wf_gen_axil_araddr", + "direction": "O", + "left": "31", + "right": "0" + }, + "ARPROT": { + "physical_name": "wf_gen_axil_arprot", + "direction": "O", + "left": "2", + "right": "0" + }, + "ARVALID": { + "physical_name": "wf_gen_axil_arvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "ARREADY": { + "physical_name": "wf_gen_axil_arready", + "direction": "I", + "left": "0", + "right": "0" + }, + "RDATA": { + "physical_name": "wf_gen_axil_rdata", + "direction": "I", + "left": "31", + "right": "0" + }, + "RRESP": { + "physical_name": "wf_gen_axil_rresp", + "direction": "I", + "left": "1", + "right": "0" + }, + "RVALID": { + "physical_name": "wf_gen_axil_rvalid", + "direction": "I", + "left": "0", + "right": "0" + }, + "RREADY": { + "physical_name": "wf_gen_axil_rready", + "direction": "O", + "left": "0", + "right": "0" + } + } + }, + "dig_rx1_axil": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "parameters": { + "ADDR_WIDTH": { + "value": "32" + }, + "ARUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "AWUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "BUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "CLK_DOMAIN": { + "value": "microblaze_bd_ddr4_0_0_c0_ddr4_ui_clk", + "value_src": "user_prop" + }, + "DATA_WIDTH": { + "value": "32" + }, + "FREQ_HZ": { + "value": "150000000", + "value_src": "user_prop" + }, + "HAS_BRESP": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_BURST": { + "value": "0" + }, + "HAS_CACHE": { + "value": "0" + }, + "HAS_LOCK": { + "value": "0" + }, + "HAS_PROT": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_QOS": { + "value": "0" + }, + "HAS_REGION": { + "value": "0" + }, + "HAS_RRESP": { + "value": "1", + "value_src": "const_prop" + }, + "HAS_WSTRB": { + "value": "1", + "value_src": "const_prop" + }, + "ID_WIDTH": { + "value": "0", + "value_src": "default" + }, + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "MAX_BURST_LENGTH": { + "value": "1", + "value_src": "ip_prop" + }, + "NUM_READ_OUTSTANDING": { + "value": "1", + "value_src": "default" + }, + "NUM_READ_THREADS": { + "value": "1", + "value_src": "default" + }, + "NUM_WRITE_OUTSTANDING": { + "value": "1", + "value_src": "default" + }, + "NUM_WRITE_THREADS": { + "value": "1", + "value_src": "default" + }, + "PHASE": { + "value": "0" + }, + "PROTOCOL": { + "value": "AXI4LITE" + }, + "READ_WRITE_MODE": { + "value": "READ_WRITE", + "value_src": "default" + }, + "RUSER_BITS_PER_BYTE": { + "value": "0", + "value_src": "default" + }, + "RUSER_WIDTH": { + "value": "0", + "value_src": "default" + }, + "SUPPORTS_NARROW_BURST": { + "value": "0", + "value_src": "ip_prop" + }, + "WUSER_BITS_PER_BYTE": { + "value": "0", + "value_src": "default" + }, + "WUSER_WIDTH": { + "value": "0", + "value_src": "default" + } + }, + "memory_map_ref": "dig_rx1_axil", + "port_maps": { + "AWADDR": { + "physical_name": "dig_rx1_axil_awaddr", + "direction": "O", + "left": "31", + "right": "0" + }, + "AWPROT": { + "physical_name": "dig_rx1_axil_awprot", + "direction": "O", + "left": "2", + "right": "0" + }, + "AWVALID": { + "physical_name": "dig_rx1_axil_awvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "AWREADY": { + "physical_name": "dig_rx1_axil_awready", + "direction": "I", + "left": "0", + "right": "0" + }, + "WDATA": { + "physical_name": "dig_rx1_axil_wdata", + "direction": "O", + "left": "31", + "right": "0" + }, + "WSTRB": { + "physical_name": "dig_rx1_axil_wstrb", + "direction": "O", + "left": "3", + "right": "0" + }, + "WVALID": { + "physical_name": "dig_rx1_axil_wvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "WREADY": { + "physical_name": "dig_rx1_axil_wready", + "direction": "I", + "left": "0", + "right": "0" + }, + "BRESP": { + "physical_name": "dig_rx1_axil_bresp", + "direction": "I", + "left": "1", + "right": "0" + }, + "BVALID": { + "physical_name": "dig_rx1_axil_bvalid", + "direction": "I", + "left": "0", + "right": "0" + }, + "BREADY": { + "physical_name": "dig_rx1_axil_bready", + "direction": "O", + "left": "0", + "right": "0" + }, + "ARADDR": { + "physical_name": "dig_rx1_axil_araddr", + "direction": "O", + "left": "31", + "right": "0" + }, + "ARPROT": { + "physical_name": "dig_rx1_axil_arprot", + "direction": "O", + "left": "2", + "right": "0" + }, + "ARVALID": { + "physical_name": "dig_rx1_axil_arvalid", + "direction": "O", + "left": "0", + "right": "0" + }, + "ARREADY": { + "physical_name": "dig_rx1_axil_arready", + "direction": "I", + "left": "0", + "right": "0" + }, + "RDATA": { + "physical_name": "dig_rx1_axil_rdata", + "direction": "I", + "left": "31", + "right": "0" + }, + "RRESP": { + "physical_name": "dig_rx1_axil_rresp", + "direction": "I", + "left": "1", + "right": "0" + }, + "RVALID": { + "physical_name": "dig_rx1_axil_rvalid", + "direction": "I", + "left": "0", + "right": "0" + }, + "RREADY": { + "physical_name": "dig_rx1_axil_rready", + "direction": "O", + "left": "0", + "right": "0" + } + } + }, + "STARTUP_IO": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:startup:1.0", + "vlnv": "xilinx.com:interface:startup_rtl:1.0", + "port_maps": { + "cfgclk": { + "physical_name": "STARTUP_IO_cfgclk", + "direction": "O" + }, + "cfgmclk": { + "physical_name": "STARTUP_IO_cfgmclk", + "direction": "O" + }, + "eos": { + "physical_name": "STARTUP_IO_eos", + "direction": "O" + }, + "gsr": { + "physical_name": "STARTUP_IO_gsr", + "direction": "I" + }, + "gts": { + "physical_name": "STARTUP_IO_gts", + "direction": "I" + }, + "keyclearb": { + "physical_name": "STARTUP_IO_keyclearb", + "direction": "I" + }, + "preq": { + "physical_name": "STARTUP_IO_preq", + "direction": "O" + }, + "userdoneo": { + "physical_name": "STARTUP_IO_userdoneo", + "direction": "I" + }, + "usrclkts": { + "physical_name": "STARTUP_IO_usrclkts", + "direction": "I" + }, + "usrdonets": { + "physical_name": "STARTUP_IO_usrdonets", + "direction": "I" + } + } + } + }, + "ports": { + "ext_reset_in_200": { + "type": "rst", + "direction": "I", + "parameters": { + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "POLARITY": { + "value": "ACTIVE_LOW", + "value_src": "default" + } + } + }, + "phy_rst_n": { + "type": "rst", + "direction": "O", + "left": "0", + "right": "0", + "parameters": { + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "POLARITY": { + "value": "ACTIVE_LOW" + } + } + }, + "ddr_init_calib_complete": { + "direction": "O" + }, + "mb_axi_clk": { + "type": "clk", + "direction": "O", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "util_reg_axil:timing_engine_axil:dig_rx0_axil:wf_gen_axil:dig_rx1_axil" + }, + "ASSOCIATED_RESET": { + "value": "qspi_flash_aresetn" + }, + "CLK_DOMAIN": { + "value": "microblaze_bd_ddr4_0_0_c0_ddr4_ui_clk", + "value_src": "user_prop" + }, + "FREQ_HZ": { + "value": "150000000", + "value_src": "user_prop" + }, + "FREQ_TOLERANCE_HZ": { + "value": "0", + "value_src": "default" + }, + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "PHASE": { + "value": "0", + "value_src": "default_prop" + } + } + }, + "mb_axi_aresetn": { + "type": "rst", + "direction": "O", + "left": "0", + "right": "0", + "parameters": { + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "POLARITY": { + "value": "ACTIVE_LOW", + "value_src": "const_prop" + } + } + }, + "jesd_rxp_in": { + "direction": "I", + "left": "7", + "right": "0" + }, + "jesd_rxn_in": { + "direction": "I", + "left": "7", + "right": "0" + }, + "jesd_txp_out": { + "direction": "O", + "left": "7", + "right": "0" + }, + "jesd_txn_out": { + "direction": "O", + "left": "7", + "right": "0" + }, + "jesd_axis_rx_aresetn": { + "type": "rst", + "direction": "O", + "parameters": { + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "POLARITY": { + "value": "ACTIVE_LOW", + "value_src": "const_prop" + } + } + }, + "jesd_axis_tx_aresetn": { + "type": "rst", + "direction": "O", + "parameters": { + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "POLARITY": { + "value": "ACTIVE_LOW", + "value_src": "const_prop" + } + } + }, + "jesd_tx_core_reset": { + "direction": "I" + }, + "jesd_rx_core_reset": { + "direction": "I" + }, + "common0_qpll1_lock_out": { + "direction": "O" + }, + "common1_qpll1_lock_out": { + "direction": "O" + }, + "jesd_tx_sys_reset": { + "direction": "I" + }, + "jesd_rx_sys_reset": { + "direction": "I" + }, + "jesd_core_clk": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "jesd_axis_rx:jesd_axis_rx_cmd:jesd_axis_tx:jesd_axis_tx_cmd" + }, + "CLK_DOMAIN": { + "value": "microblaze_bd_core_clk", + "value_src": "default" + }, + "FREQ_HZ": { + "value": "187500000" + }, + "FREQ_TOLERANCE_HZ": { + "value": "0", + "value_src": "default" + }, + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "PHASE": { + "value": "0.0", + "value_src": "default" + } + } + }, + "eth_clk": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "udp_rx:udp_tx" + }, + "ASSOCIATED_RESET": { + "value": "eth_resetn" + }, + "CLK_DOMAIN": { + "value": "microblaze_bd_s_axi_aclk_0", + "value_src": "default" + }, + "FREQ_HZ": { + "value": "156250000" + }, + "FREQ_TOLERANCE_HZ": { + "value": "0", + "value_src": "default" + }, + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "PHASE": { + "value": "0.0", + "value_src": "default" + } + } + }, + "eth_resetn": { + "type": "rst", + "direction": "I", + "parameters": { + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "POLARITY": { + "value": "ACTIVE_LOW", + "value_src": "default" + } + } + }, + "qspi_flash_aresetn": { + "type": "rst", + "direction": "I", + "parameters": { + "INSERT_VIP": { + "value": "0", + "value_src": "default" + }, + "POLARITY": { + "value": "ACTIVE_LOW", + "value_src": "default" + } + } + }, + "pps": { + "direction": "I", + "left": "0", + "right": "0" + } + }, + "components": { + "microblaze_0": { + "vlnv": "xilinx.com:ip:microblaze:11.0", + "xci_name": "microblaze_bd_microblaze_0_0", + "xci_path": "ip/microblaze_bd_microblaze_0_0/microblaze_bd_microblaze_0_0.xci", + "inst_hier_path": "microblaze_0", + "parameters": { + "C_BRANCH_TARGET_CACHE_SIZE": { + "value": "0" + }, + "C_CACHE_BYTE_SIZE": { + "value": "32768" + }, + "C_DCACHE_BYTE_SIZE": { + "value": "32768" + }, + "C_DCACHE_DATA_WIDTH": { + "value": "1" + }, + "C_DCACHE_LINE_LEN": { + "value": "16" + }, + "C_DCACHE_VICTIMS": { + "value": "8" + }, + "C_DEBUG_ENABLED": { + "value": "1" + }, + "C_DIV_ZERO_EXCEPTION": { + "value": "1" + }, + "C_D_AXI": { + "value": "1" + }, + "C_D_LMB": { + "value": "1" + }, + "C_FPU_EXCEPTION": { + "value": "1" + }, + "C_ICACHE_DATA_WIDTH": { + "value": "1" + }, + "C_ICACHE_LINE_LEN": { + "value": "16" + }, + "C_ICACHE_STREAMS": { + "value": "1" + }, + "C_ICACHE_VICTIMS": { + "value": "8" + }, + "C_I_LMB": { + "value": "1" + }, + "C_M_AXI_D_BUS_EXCEPTION": { + "value": "1" + }, + "C_USE_BRANCH_TARGET_CACHE": { + "value": "0" + }, + "C_USE_DCACHE": { + "value": "1" + }, + "C_USE_FPU": { + "value": "1" + }, + "C_USE_ICACHE": { + "value": "1" + }, + "G_TEMPLATE_LIST": { + "value": "9" + } + }, + "interface_ports": { + "DLMB": { + "vlnv": "xilinx.com:interface:lmb_rtl:1.0", + "mode": "Master", + "address_space_ref": "Data", + "base_address": { + "minimum": "0x00000000", + "maximum": "0xFFFFFFFF", + "width": "32" + } + }, + "ILMB": { + "vlnv": "xilinx.com:interface:lmb_rtl:1.0", + "mode": "Master", + "address_space_ref": "Instruction", + "base_address": { + "minimum": "0x00000000", + "maximum": "0xFFFFFFFF", + "width": "32" + } + }, + "M_AXI_DP": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Master", + "address_space_ref": "Data", + "base_address": { + "minimum": "0x00000000", + "maximum": "0xFFFFFFFF", + "width": "32" + } + }, + "M_AXI_DC": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Master", + "address_space_ref": "Data", + "base_address": { + "minimum": "0x00000000", + "maximum": "0xFFFFFFFF", + "width": "32" + } + }, + "M_AXI_IC": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Master", + "address_space_ref": "Instruction", + "base_address": { + "minimum": "0x00000000", + "maximum": "0xFFFFFFFF", + "width": "32" + } + } + }, + "addressing": { + "address_spaces": { + "Data": { + "range": "4G", + "width": "32" + }, + "Instruction": { + "range": "4G", + "width": "32" + } + } + }, + "hdl_attributes": { + "BMM_INFO_PROCESSOR": { + "value": "microblaze-le > microblaze_bd microblaze_0_local_memory/dlmb_bram_if_cntlr", + "value_src": "default" + }, + "KEEP_HIERARCHY": { + "value": "yes", + "value_src": "default" + } + } + }, + "microblaze_0_local_memory": { + "interface_ports": { + "DLMB": { + "mode": "MirroredMaster", + "vlnv_bus_definition": "xilinx.com:interface:lmb:1.0", + "vlnv": "xilinx.com:interface:lmb_rtl:1.0" + }, + "ILMB": { + "mode": "MirroredMaster", + "vlnv_bus_definition": "xilinx.com:interface:lmb:1.0", + "vlnv": "xilinx.com:interface:lmb_rtl:1.0" + } + }, + "ports": { + "LMB_Clk": { + "type": "clk", + "direction": "I" + }, + "SYS_Rst": { + "type": "rst", + "direction": "I" + } + }, + "components": { + "dlmb_v10": { + "vlnv": "xilinx.com:ip:lmb_v10:3.0", + "xci_name": "microblaze_bd_dlmb_v10_0", + "xci_path": "ip/microblaze_bd_dlmb_v10_0/microblaze_bd_dlmb_v10_0.xci", + "inst_hier_path": "microblaze_0_local_memory/dlmb_v10", + "interface_ports": { + "LMB_M": { + "vlnv": "xilinx.com:interface:lmb_rtl:1.0", + "mode": "MirroredMaster", + "bridges": [ + "LMB_Sl_0" + ] + } + } + }, + "ilmb_v10": { + "vlnv": "xilinx.com:ip:lmb_v10:3.0", + "xci_name": "microblaze_bd_ilmb_v10_0", + "xci_path": "ip/microblaze_bd_ilmb_v10_0/microblaze_bd_ilmb_v10_0.xci", + "inst_hier_path": "microblaze_0_local_memory/ilmb_v10", + "interface_ports": { + "LMB_M": { + "vlnv": "xilinx.com:interface:lmb_rtl:1.0", + "mode": "MirroredMaster", + "bridges": [ + "LMB_Sl_0" + ] + } + } + }, + "dlmb_bram_if_cntlr": { + "vlnv": "xilinx.com:ip:lmb_bram_if_cntlr:4.0", + "xci_name": "microblaze_bd_dlmb_bram_if_cntlr_0", + "xci_path": "ip/microblaze_bd_dlmb_bram_if_cntlr_0/microblaze_bd_dlmb_bram_if_cntlr_0.xci", + "inst_hier_path": "microblaze_0_local_memory/dlmb_bram_if_cntlr", + "parameters": { + "C_ECC": { + "value": "0" + } + }, + "hdl_attributes": { + "BMM_INFO_ADDRESS_SPACE": { + "value": "byte 0x00000000 32 > microblaze_bd microblaze_0_local_memory/lmb_bram", + "value_src": "default" + }, + "KEEP_HIERARCHY": { + "value": "yes", + "value_src": "default" + } + } + }, + "ilmb_bram_if_cntlr": { + "vlnv": "xilinx.com:ip:lmb_bram_if_cntlr:4.0", + "xci_name": "microblaze_bd_ilmb_bram_if_cntlr_0", + "xci_path": "ip/microblaze_bd_ilmb_bram_if_cntlr_0/microblaze_bd_ilmb_bram_if_cntlr_0.xci", + "inst_hier_path": "microblaze_0_local_memory/ilmb_bram_if_cntlr", + "parameters": { + "C_ECC": { + "value": "0" + } + } + }, + "lmb_bram": { + "vlnv": "xilinx.com:ip:blk_mem_gen:8.4", + "xci_name": "microblaze_bd_lmb_bram_0", + "xci_path": "ip/microblaze_bd_lmb_bram_0/microblaze_bd_lmb_bram_0.xci", + "inst_hier_path": "microblaze_0_local_memory/lmb_bram", + "parameters": { + "Memory_Type": { + "value": "True_Dual_Port_RAM" + }, + "use_bram_block": { + "value": "BRAM_Controller" + } + } + } + }, + "interface_nets": { + "microblaze_0_dlmb": { + "interface_ports": [ + "DLMB", + "dlmb_v10/LMB_M" + ] + }, + "microblaze_0_dlmb_bus": { + "interface_ports": [ + "dlmb_v10/LMB_Sl_0", + "dlmb_bram_if_cntlr/SLMB" + ] + }, + "microblaze_0_dlmb_cntlr": { + "interface_ports": [ + "dlmb_bram_if_cntlr/BRAM_PORT", + "lmb_bram/BRAM_PORTA" + ] + }, + "microblaze_0_ilmb": { + "interface_ports": [ + "ILMB", + "ilmb_v10/LMB_M" + ] + }, + "microblaze_0_ilmb_bus": { + "interface_ports": [ + "ilmb_v10/LMB_Sl_0", + "ilmb_bram_if_cntlr/SLMB" + ] + }, + "microblaze_0_ilmb_cntlr": { + "interface_ports": [ + "ilmb_bram_if_cntlr/BRAM_PORT", + "lmb_bram/BRAM_PORTB" + ] + } + }, + "nets": { + "SYS_Rst_1": { + "ports": [ + "SYS_Rst", + "dlmb_v10/SYS_Rst", + "dlmb_bram_if_cntlr/LMB_Rst", + "ilmb_v10/SYS_Rst", + "ilmb_bram_if_cntlr/LMB_Rst" + ] + }, + "microblaze_0_Clk": { + "ports": [ + "LMB_Clk", + "dlmb_v10/LMB_Clk", + "dlmb_bram_if_cntlr/LMB_Clk", + "ilmb_v10/LMB_Clk", + "ilmb_bram_if_cntlr/LMB_Clk" + ] + } + } + }, + "microblaze_0_axi_periph": { + "vlnv": "xilinx.com:ip:axi_interconnect:2.1", + "xci_path": "ip/microblaze_bd_microblaze_0_axi_periph_0/microblaze_bd_microblaze_0_axi_periph_0.xci", + "inst_hier_path": "microblaze_0_axi_periph", + "xci_name": "microblaze_bd_microblaze_0_axi_periph_0", + "parameters": { + "NUM_MI": { + "value": "11" + }, + "NUM_SI": { + "value": "1" + } + }, + "interface_ports": { + "S00_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M00_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M01_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M02_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M03_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M04_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M05_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "parameters": { + "CLK_DOMAIN": { + "value": "microblaze_bd_ddr4_0_0_c0_ddr4_ui_clk", + "value_src": "undefined" + } + } + }, + "M06_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "parameters": { + "CLK_DOMAIN": { + "value": "microblaze_bd_ddr4_0_0_c0_ddr4_ui_clk", + "value_src": "undefined" + } + } + }, + "M07_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M08_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "parameters": { + "CLK_DOMAIN": { + "value": "microblaze_bd_ddr4_0_0_c0_ddr4_ui_clk", + "value_src": "undefined" + } + } + }, + "M09_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "parameters": { + "CLK_DOMAIN": { + "value": "microblaze_bd_ddr4_0_0_c0_ddr4_ui_clk", + "value_src": "undefined" + } + } + }, + "M10_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "parameters": { + "CLK_DOMAIN": { + "value": "microblaze_bd_ddr4_0_0_c0_ddr4_ui_clk", + "value_src": "undefined" + } + } + } + }, + "ports": { + "ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_RESET": { + "value": "ARESETN" + } + } + }, + "ARESETN": { + "type": "rst", + "direction": "I" + }, + "S00_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S00_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S00_ARESETN" + } + } + }, + "S00_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M00_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M00_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M00_ARESETN" + } + } + }, + "M00_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M01_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M01_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M01_ARESETN" + } + } + }, + "M01_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M02_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M02_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M02_ARESETN" + } + } + }, + "M02_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M03_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M03_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M03_ARESETN" + } + } + }, + "M03_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M04_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M04_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M04_ARESETN" + } + } + }, + "M04_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M05_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M05_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M05_ARESETN" + } + } + }, + "M05_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M06_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M06_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M06_ARESETN" + } + } + }, + "M06_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M07_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M07_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M07_ARESETN" + } + } + }, + "M07_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M08_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M08_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M08_ARESETN" + } + } + }, + "M08_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M09_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M09_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M09_ARESETN" + } + } + }, + "M09_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M10_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M10_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M10_ARESETN" + } + } + }, + "M10_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "components": { + "xbar": { + "vlnv": "xilinx.com:ip:axi_crossbar:2.1", + "xci_name": "microblaze_bd_xbar_0", + "xci_path": "ip/microblaze_bd_xbar_0/microblaze_bd_xbar_0.xci", + "inst_hier_path": "microblaze_0_axi_periph/xbar", + "parameters": { + "NUM_MI": { + "value": "11" + }, + "NUM_SI": { + "value": "1" + }, + "STRATEGY": { + "value": "0" + } + }, + "interface_ports": { + "S00_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M00_AXI", + "M01_AXI", + "M02_AXI", + "M03_AXI", + "M04_AXI", + "M05_AXI", + "M06_AXI", + "M07_AXI", + "M08_AXI", + "M09_AXI", + "M10_AXI" + ] + } + } + }, + "s00_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "s00_couplers_to_s00_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m00_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m00_couplers_to_m00_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m01_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m01_couplers_to_m01_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m02_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m02_couplers_to_m02_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m03_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m03_couplers_to_m03_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m04_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m04_couplers_to_m04_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m05_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m05_couplers_to_m05_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m06_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m06_couplers_to_m06_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m07_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "components": { + "auto_cc": { + "vlnv": "xilinx.com:ip:axi_clock_converter:2.1", + "xci_name": "microblaze_bd_auto_cc_0", + "xci_path": "ip/microblaze_bd_auto_cc_0/microblaze_bd_auto_cc_0.xci", + "inst_hier_path": "microblaze_0_axi_periph/m07_couplers/auto_cc", + "interface_ports": { + "S_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M_AXI" + ] + } + } + } + }, + "interface_nets": { + "auto_cc_to_m07_couplers": { + "interface_ports": [ + "M_AXI", + "auto_cc/M_AXI" + ] + }, + "m07_couplers_to_auto_cc": { + "interface_ports": [ + "S_AXI", + "auto_cc/S_AXI" + ] + } + }, + "nets": { + "M_ACLK_1": { + "ports": [ + "M_ACLK", + "auto_cc/m_axi_aclk" + ] + }, + "M_ARESETN_1": { + "ports": [ + "M_ARESETN", + "auto_cc/m_axi_aresetn" + ] + }, + "S_ACLK_1": { + "ports": [ + "S_ACLK", + "auto_cc/s_axi_aclk" + ] + }, + "S_ARESETN_1": { + "ports": [ + "S_ARESETN", + "auto_cc/s_axi_aresetn" + ] + } + } + }, + "m08_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m08_couplers_to_m08_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m09_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m09_couplers_to_m09_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m10_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m10_couplers_to_m10_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + } + }, + "interface_nets": { + "m00_couplers_to_microblaze_0_axi_periph": { + "interface_ports": [ + "M00_AXI", + "m00_couplers/M_AXI" + ] + }, + "m01_couplers_to_microblaze_0_axi_periph": { + "interface_ports": [ + "M01_AXI", + "m01_couplers/M_AXI" + ] + }, + "m02_couplers_to_microblaze_0_axi_periph": { + "interface_ports": [ + "M02_AXI", + "m02_couplers/M_AXI" + ] + }, + "m03_couplers_to_microblaze_0_axi_periph": { + "interface_ports": [ + "M03_AXI", + "m03_couplers/M_AXI" + ] + }, + "m04_couplers_to_microblaze_0_axi_periph": { + "interface_ports": [ + "M04_AXI", + "m04_couplers/M_AXI" + ] + }, + "m05_couplers_to_microblaze_0_axi_periph": { + "interface_ports": [ + "M05_AXI", + "m05_couplers/M_AXI" + ] + }, + "m06_couplers_to_microblaze_0_axi_periph": { + "interface_ports": [ + "M06_AXI", + "m06_couplers/M_AXI" + ] + }, + "m07_couplers_to_microblaze_0_axi_periph": { + "interface_ports": [ + "M07_AXI", + "m07_couplers/M_AXI" + ] + }, + "m08_couplers_to_microblaze_0_axi_periph": { + "interface_ports": [ + "M08_AXI", + "m08_couplers/M_AXI" + ] + }, + "m09_couplers_to_microblaze_0_axi_periph": { + "interface_ports": [ + "M09_AXI", + "m09_couplers/M_AXI" + ] + }, + "m10_couplers_to_microblaze_0_axi_periph": { + "interface_ports": [ + "M10_AXI", + "m10_couplers/M_AXI" + ] + }, + "microblaze_0_axi_periph_to_s00_couplers": { + "interface_ports": [ + "S00_AXI", + "s00_couplers/S_AXI" + ] + }, + "s00_couplers_to_xbar": { + "interface_ports": [ + "s00_couplers/M_AXI", + "xbar/S00_AXI" + ] + }, + "xbar_to_m00_couplers": { + "interface_ports": [ + "xbar/M00_AXI", + "m00_couplers/S_AXI" + ] + }, + "xbar_to_m01_couplers": { + "interface_ports": [ + "xbar/M01_AXI", + "m01_couplers/S_AXI" + ] + }, + "xbar_to_m02_couplers": { + "interface_ports": [ + "xbar/M02_AXI", + "m02_couplers/S_AXI" + ] + }, + "xbar_to_m03_couplers": { + "interface_ports": [ + "xbar/M03_AXI", + "m03_couplers/S_AXI" + ] + }, + "xbar_to_m04_couplers": { + "interface_ports": [ + "xbar/M04_AXI", + "m04_couplers/S_AXI" + ] + }, + "xbar_to_m05_couplers": { + "interface_ports": [ + "xbar/M05_AXI", + "m05_couplers/S_AXI" + ] + }, + "xbar_to_m06_couplers": { + "interface_ports": [ + "xbar/M06_AXI", + "m06_couplers/S_AXI" + ] + }, + "xbar_to_m07_couplers": { + "interface_ports": [ + "xbar/M07_AXI", + "m07_couplers/S_AXI" + ] + }, + "xbar_to_m08_couplers": { + "interface_ports": [ + "xbar/M08_AXI", + "m08_couplers/S_AXI" + ] + }, + "xbar_to_m09_couplers": { + "interface_ports": [ + "xbar/M09_AXI", + "m09_couplers/S_AXI" + ] + }, + "xbar_to_m10_couplers": { + "interface_ports": [ + "xbar/M10_AXI", + "m10_couplers/S_AXI" + ] + } + }, + "nets": { + "M00_ACLK_1": { + "ports": [ + "M00_ACLK", + "m00_couplers/M_ACLK" + ] + }, + "M00_ARESETN_1": { + "ports": [ + "M00_ARESETN", + "m00_couplers/M_ARESETN" + ] + }, + "M01_ACLK_1": { + "ports": [ + "M01_ACLK", + "m01_couplers/M_ACLK" + ] + }, + "M01_ARESETN_1": { + "ports": [ + "M01_ARESETN", + "m01_couplers/M_ARESETN" + ] + }, + "M02_ACLK_1": { + "ports": [ + "M02_ACLK", + "m02_couplers/M_ACLK" + ] + }, + "M02_ARESETN_1": { + "ports": [ + "M02_ARESETN", + "m02_couplers/M_ARESETN" + ] + }, + "M03_ACLK_1": { + "ports": [ + "M03_ACLK", + "m03_couplers/M_ACLK" + ] + }, + "M03_ARESETN_1": { + "ports": [ + "M03_ARESETN", + "m03_couplers/M_ARESETN" + ] + }, + "M04_ACLK_1": { + "ports": [ + "M04_ACLK", + "m04_couplers/M_ACLK" + ] + }, + "M04_ARESETN_1": { + "ports": [ + "M04_ARESETN", + "m04_couplers/M_ARESETN" + ] + }, + "M05_ACLK_1": { + "ports": [ + "M05_ACLK", + "m05_couplers/M_ACLK" + ] + }, + "M05_ARESETN_1": { + "ports": [ + "M05_ARESETN", + "m05_couplers/M_ARESETN" + ] + }, + "M06_ACLK_1": { + "ports": [ + "M06_ACLK", + "m06_couplers/M_ACLK" + ] + }, + "M06_ARESETN_1": { + "ports": [ + "M06_ARESETN", + "m06_couplers/M_ARESETN" + ] + }, + "M07_ACLK_1": { + "ports": [ + "M07_ACLK", + "m07_couplers/M_ACLK" + ] + }, + "M07_ARESETN_1": { + "ports": [ + "M07_ARESETN", + "m07_couplers/M_ARESETN" + ] + }, + "M08_ACLK_1": { + "ports": [ + "M08_ACLK", + "m08_couplers/M_ACLK" + ] + }, + "M08_ARESETN_1": { + "ports": [ + "M08_ARESETN", + "m08_couplers/M_ARESETN" + ] + }, + "M09_ACLK_1": { + "ports": [ + "M09_ACLK", + "m09_couplers/M_ACLK" + ] + }, + "M09_ARESETN_1": { + "ports": [ + "M09_ARESETN", + "m09_couplers/M_ARESETN" + ] + }, + "M10_ACLK_1": { + "ports": [ + "M10_ACLK", + "m10_couplers/M_ACLK" + ] + }, + "M10_ARESETN_1": { + "ports": [ + "M10_ARESETN", + "m10_couplers/M_ARESETN" + ] + }, + "S00_ACLK_1": { + "ports": [ + "S00_ACLK", + "s00_couplers/S_ACLK" + ] + }, + "S00_ARESETN_1": { + "ports": [ + "S00_ARESETN", + "s00_couplers/S_ARESETN" + ] + }, + "microblaze_0_axi_periph_ACLK_net": { + "ports": [ + "ACLK", + "xbar/aclk", + "s00_couplers/M_ACLK", + "m00_couplers/S_ACLK", + "m01_couplers/S_ACLK", + "m02_couplers/S_ACLK", + "m03_couplers/S_ACLK", + "m04_couplers/S_ACLK", + "m05_couplers/S_ACLK", + "m06_couplers/S_ACLK", + "m07_couplers/S_ACLK", + "m08_couplers/S_ACLK", + "m09_couplers/S_ACLK", + "m10_couplers/S_ACLK" + ] + }, + "microblaze_0_axi_periph_ARESETN_net": { + "ports": [ + "ARESETN", + "xbar/aresetn", + "s00_couplers/M_ARESETN", + "m00_couplers/S_ARESETN", + "m01_couplers/S_ARESETN", + "m02_couplers/S_ARESETN", + "m03_couplers/S_ARESETN", + "m04_couplers/S_ARESETN", + "m05_couplers/S_ARESETN", + "m06_couplers/S_ARESETN", + "m07_couplers/S_ARESETN", + "m08_couplers/S_ARESETN", + "m09_couplers/S_ARESETN", + "m10_couplers/S_ARESETN" + ] + } + } + }, + "microblaze_0_axi_intc": { + "vlnv": "xilinx.com:ip:axi_intc:4.1", + "xci_name": "microblaze_bd_microblaze_0_axi_intc_0", + "xci_path": "ip/microblaze_bd_microblaze_0_axi_intc_0/microblaze_bd_microblaze_0_axi_intc_0.xci", + "inst_hier_path": "microblaze_0_axi_intc", + "parameters": { + "C_HAS_FAST": { + "value": "1" + } + } + }, + "microblaze_0_xlconcat": { + "vlnv": "xilinx.com:ip:xlconcat:2.1", + "xci_name": "microblaze_bd_microblaze_0_xlconcat_0", + "xci_path": "ip/microblaze_bd_microblaze_0_xlconcat_0/microblaze_bd_microblaze_0_xlconcat_0.xci", + "inst_hier_path": "microblaze_0_xlconcat", + "parameters": { + "NUM_PORTS": { + "value": "13" + } + } + }, + "mdm_1": { + "vlnv": "xilinx.com:ip:mdm:3.2", + "xci_name": "microblaze_bd_mdm_1_0", + "xci_path": "ip/microblaze_bd_mdm_1_0/microblaze_bd_mdm_1_0.xci", + "inst_hier_path": "mdm_1" + }, + "rst_150": { + "vlnv": "xilinx.com:ip:proc_sys_reset:5.0", + "xci_name": "microblaze_bd_rst_clk_wiz_1_100M_0", + "xci_path": "ip/microblaze_bd_rst_clk_wiz_1_100M_0/microblaze_bd_rst_clk_wiz_1_100M_0.xci", + "inst_hier_path": "rst_150" + }, + "axi_uartlite_0": { + "vlnv": "xilinx.com:ip:axi_uartlite:2.0", + "xci_name": "microblaze_bd_axi_uartlite_0_0", + "xci_path": "ip/microblaze_bd_axi_uartlite_0_0/microblaze_bd_axi_uartlite_0_0.xci", + "inst_hier_path": "axi_uartlite_0", + "parameters": { + "C_BAUDRATE": { + "value": "115200" + } + } + }, + "axi_timer_0": { + "vlnv": "xilinx.com:ip:axi_timer:2.0", + "xci_name": "microblaze_bd_axi_timer_0_0", + "xci_path": "ip/microblaze_bd_axi_timer_0_0/microblaze_bd_axi_timer_0_0.xci", + "inst_hier_path": "axi_timer_0" + }, + "axi_ethernet_0": { + "vlnv": "xilinx.com:ip:axi_ethernet:7.2", + "xci_name": "microblaze_bd_axi_ethernet_0_2", + "xci_path": "ip/microblaze_bd_axi_ethernet_0_2/microblaze_bd_axi_ethernet_0_2.xci", + "inst_hier_path": "axi_ethernet_0", + "parameters": { + "Frame_Filter": { + "value": "false" + }, + "PHY_TYPE": { + "value": "RGMII" + }, + "RXCSUM": { + "value": "Full" + }, + "RXMEM": { + "value": "4k" + }, + "Statistics_Counters": { + "value": "false" + }, + "TXCSUM": { + "value": "Full" + }, + "TXMEM": { + "value": "4k" + }, + "axiliteclkrate": { + "value": "150.0" + }, + "axisclkrate": { + "value": "300.0" + } + }, + "interface_ports": { + "s_axi": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "parameters": { + "ADDR_WIDTH": { + "value": "18" + }, + "PROTOCOL": { + "value": "AXI4LITE" + } + }, + "memory_map_ref": "s_axi" + }, + "s_axis_txd": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:axis:1.0", + "vlnv": "xilinx.com:interface:axis_rtl:1.0" + }, + "s_axis_txc": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:axis:1.0", + "vlnv": "xilinx.com:interface:axis_rtl:1.0" + }, + "m_axis_rxd": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:axis:1.0", + "vlnv": "xilinx.com:interface:axis_rtl:1.0" + }, + "m_axis_rxs": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:axis:1.0", + "vlnv": "xilinx.com:interface:axis_rtl:1.0" + }, + "mdio": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:mdio:1.0", + "vlnv": "xilinx.com:interface:mdio_rtl:1.0" + }, + "rgmii": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:rgmii:1.0", + "vlnv": "xilinx.com:interface:rgmii_rtl:1.0" + } + }, + "addressing": { + "memory_maps": { + "s_axi": { + "address_blocks": { + "Reg0": { + "base_address": "0", + "range": "256K", + "width": "18", + "usage": "register", + "bank_blocks": { + "SEG_eth_buf_REG;/eth_buf/S_AXI/Reg;xilinx.com:ip:axi_ethernet_buffer:2.0;/eth_buf;S_AXI;NONE;NONE": { + "base_address": "0", + "range": "256K", + "width": "18", + "usage": "register" + } + } + } + } + } + } + } + }, + "ddr4_0": { + "vlnv": "xilinx.com:ip:ddr4:2.2", + "xci_name": "microblaze_bd_ddr4_0_0", + "xci_path": "ip/microblaze_bd_ddr4_0_0/microblaze_bd_ddr4_0_0.xci", + "inst_hier_path": "ddr4_0", + "parameters": { + "ADDN_UI_CLKOUT1_FREQ_HZ": { + "value": "150" + }, + "ADDN_UI_CLKOUT2_FREQ_HZ": { + "value": "300" + }, + "C0.DDR4_DataWidth": { + "value": "64" + }, + "C0.DDR4_InputClockPeriod": { + "value": "4998" + }, + "C0.DDR4_MemoryPart": { + "value": "MT40A512M16LY-075" + } + }, + "interface_ports": { + "C0_DDR4_S_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "memory_map_ref": "C0_DDR4_MEMORY_MAP" + } + }, + "addressing": { + "memory_maps": { + "C0_DDR4_MEMORY_MAP": { + "address_blocks": { + "C0_DDR4_ADDRESS_BLOCK": { + "base_address": "0", + "range": "4G", + "width": "32", + "usage": "memory", + "offset_base_param": "C0_DDR4_MEMORY_MAP_BASEADDR", + "offset_high_param": "C0_DDR4_MEMORY_MAP_HIGHADDR" + } + } + } + } + } + }, + "axi_interconnect_0": { + "vlnv": "xilinx.com:ip:axi_interconnect:2.1", + "xci_path": "ip/microblaze_bd_axi_interconnect_0_0/microblaze_bd_axi_interconnect_0_0.xci", + "inst_hier_path": "axi_interconnect_0", + "xci_name": "microblaze_bd_axi_interconnect_0_0", + "parameters": { + "M00_HAS_DATA_FIFO": { + "value": "1" + }, + "NUM_MI": { + "value": "1" + }, + "NUM_SI": { + "value": "5" + }, + "S00_HAS_DATA_FIFO": { + "value": "1" + }, + "S01_HAS_DATA_FIFO": { + "value": "1" + }, + "S02_HAS_DATA_FIFO": { + "value": "1" + }, + "S03_HAS_DATA_FIFO": { + "value": "1" + }, + "S04_HAS_DATA_FIFO": { + "value": "1" + } + }, + "interface_ports": { + "S00_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M00_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S01_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S02_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S03_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S04_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_RESET": { + "value": "ARESETN" + } + } + }, + "ARESETN": { + "type": "rst", + "direction": "I" + }, + "S00_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S00_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S00_ARESETN" + } + } + }, + "S00_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M00_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M00_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M00_ARESETN" + } + } + }, + "M00_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S01_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S01_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S01_ARESETN" + } + } + }, + "S01_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S02_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S02_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S02_ARESETN" + } + } + }, + "S02_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S03_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S03_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S03_ARESETN" + } + } + }, + "S03_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S04_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S04_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S04_ARESETN" + } + } + }, + "S04_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "components": { + "xbar": { + "vlnv": "xilinx.com:ip:axi_crossbar:2.1", + "xci_name": "microblaze_bd_xbar_1", + "xci_path": "ip/microblaze_bd_xbar_1/microblaze_bd_xbar_1.xci", + "inst_hier_path": "axi_interconnect_0/xbar", + "parameters": { + "NUM_MI": { + "value": "1" + }, + "NUM_SI": { + "value": "5" + }, + "STRATEGY": { + "value": "0" + } + }, + "interface_ports": { + "S00_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M00_AXI" + ] + }, + "S01_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M00_AXI" + ] + }, + "S02_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M00_AXI" + ] + }, + "S03_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M00_AXI" + ] + }, + "S04_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M00_AXI" + ] + } + } + }, + "s00_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "components": { + "s00_data_fifo": { + "vlnv": "xilinx.com:ip:axi_data_fifo:2.1", + "xci_name": "microblaze_bd_s00_data_fifo_0", + "xci_path": "ip/microblaze_bd_s00_data_fifo_0/microblaze_bd_s00_data_fifo_0.xci", + "inst_hier_path": "axi_interconnect_0/s00_couplers/s00_data_fifo", + "interface_ports": { + "S_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M_AXI" + ] + } + } + }, + "auto_us": { + "vlnv": "xilinx.com:ip:axi_dwidth_converter:2.1", + "xci_name": "microblaze_bd_auto_us_0", + "xci_path": "ip/microblaze_bd_auto_us_0/microblaze_bd_auto_us_0.xci", + "inst_hier_path": "axi_interconnect_0/s00_couplers/auto_us", + "parameters": { + "MI_DATA_WIDTH": { + "value": "512" + }, + "SI_DATA_WIDTH": { + "value": "32" + } + }, + "interface_ports": { + "S_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M_AXI" + ] + } + } + } + }, + "interface_nets": { + "auto_us_to_s00_data_fifo": { + "interface_ports": [ + "s00_data_fifo/S_AXI", + "auto_us/M_AXI" + ] + }, + "s00_couplers_to_auto_us": { + "interface_ports": [ + "S_AXI", + "auto_us/S_AXI" + ] + }, + "s00_data_fifo_to_s00_couplers": { + "interface_ports": [ + "M_AXI", + "s00_data_fifo/M_AXI" + ] + } + }, + "nets": { + "M_ACLK_1": { + "ports": [ + "M_ACLK", + "s00_data_fifo/aclk" + ] + }, + "M_ARESETN_1": { + "ports": [ + "M_ARESETN", + "s00_data_fifo/aresetn" + ] + }, + "S_ACLK_1": { + "ports": [ + "S_ACLK", + "auto_us/s_axi_aclk" + ] + }, + "S_ARESETN_1": { + "ports": [ + "S_ARESETN", + "auto_us/s_axi_aresetn" + ] + } + } + }, + "s01_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "components": { + "s01_data_fifo": { + "vlnv": "xilinx.com:ip:axi_data_fifo:2.1", + "xci_name": "microblaze_bd_s01_data_fifo_0", + "xci_path": "ip/microblaze_bd_s01_data_fifo_0/microblaze_bd_s01_data_fifo_0.xci", + "inst_hier_path": "axi_interconnect_0/s01_couplers/s01_data_fifo", + "interface_ports": { + "S_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M_AXI" + ] + } + } + }, + "auto_us": { + "vlnv": "xilinx.com:ip:axi_dwidth_converter:2.1", + "xci_name": "microblaze_bd_auto_us_1", + "xci_path": "ip/microblaze_bd_auto_us_1/microblaze_bd_auto_us_1.xci", + "inst_hier_path": "axi_interconnect_0/s01_couplers/auto_us", + "parameters": { + "MI_DATA_WIDTH": { + "value": "512" + }, + "SI_DATA_WIDTH": { + "value": "32" + } + }, + "interface_ports": { + "S_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M_AXI" + ] + } + } + } + }, + "interface_nets": { + "auto_us_to_s01_data_fifo": { + "interface_ports": [ + "s01_data_fifo/S_AXI", + "auto_us/M_AXI" + ] + }, + "s01_couplers_to_auto_us": { + "interface_ports": [ + "S_AXI", + "auto_us/S_AXI" + ] + }, + "s01_data_fifo_to_s01_couplers": { + "interface_ports": [ + "M_AXI", + "s01_data_fifo/M_AXI" + ] + } + }, + "nets": { + "M_ACLK_1": { + "ports": [ + "M_ACLK", + "s01_data_fifo/aclk" + ] + }, + "M_ARESETN_1": { + "ports": [ + "M_ARESETN", + "s01_data_fifo/aresetn" + ] + }, + "S_ACLK_1": { + "ports": [ + "S_ACLK", + "auto_us/s_axi_aclk" + ] + }, + "S_ARESETN_1": { + "ports": [ + "S_ARESETN", + "auto_us/s_axi_aresetn" + ] + } + } + }, + "s02_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "components": { + "s02_data_fifo": { + "vlnv": "xilinx.com:ip:axi_data_fifo:2.1", + "xci_name": "microblaze_bd_s02_data_fifo_0", + "xci_path": "ip/microblaze_bd_s02_data_fifo_0/microblaze_bd_s02_data_fifo_0.xci", + "inst_hier_path": "axi_interconnect_0/s02_couplers/s02_data_fifo", + "interface_ports": { + "S_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M_AXI" + ] + } + } + }, + "auto_us": { + "vlnv": "xilinx.com:ip:axi_dwidth_converter:2.1", + "xci_name": "microblaze_bd_auto_us_2", + "xci_path": "ip/microblaze_bd_auto_us_2/microblaze_bd_auto_us_2.xci", + "inst_hier_path": "axi_interconnect_0/s02_couplers/auto_us", + "parameters": { + "MI_DATA_WIDTH": { + "value": "512" + }, + "SI_DATA_WIDTH": { + "value": "32" + } + }, + "interface_ports": { + "S_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M_AXI" + ] + } + } + } + }, + "interface_nets": { + "auto_us_to_s02_data_fifo": { + "interface_ports": [ + "s02_data_fifo/S_AXI", + "auto_us/M_AXI" + ] + }, + "s02_couplers_to_auto_us": { + "interface_ports": [ + "S_AXI", + "auto_us/S_AXI" + ] + }, + "s02_data_fifo_to_s02_couplers": { + "interface_ports": [ + "M_AXI", + "s02_data_fifo/M_AXI" + ] + } + }, + "nets": { + "M_ACLK_1": { + "ports": [ + "M_ACLK", + "s02_data_fifo/aclk" + ] + }, + "M_ARESETN_1": { + "ports": [ + "M_ARESETN", + "s02_data_fifo/aresetn" + ] + }, + "S_ACLK_1": { + "ports": [ + "S_ACLK", + "auto_us/s_axi_aclk" + ] + }, + "S_ARESETN_1": { + "ports": [ + "S_ARESETN", + "auto_us/s_axi_aresetn" + ] + } + } + }, + "s03_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "components": { + "s03_data_fifo": { + "vlnv": "xilinx.com:ip:axi_data_fifo:2.1", + "xci_name": "microblaze_bd_s03_data_fifo_0", + "xci_path": "ip/microblaze_bd_s03_data_fifo_0/microblaze_bd_s03_data_fifo_0.xci", + "inst_hier_path": "axi_interconnect_0/s03_couplers/s03_data_fifo", + "interface_ports": { + "S_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M_AXI" + ] + } + } + }, + "auto_cc": { + "vlnv": "xilinx.com:ip:axi_clock_converter:2.1", + "xci_name": "microblaze_bd_auto_cc_1", + "xci_path": "ip/microblaze_bd_auto_cc_1/microblaze_bd_auto_cc_1.xci", + "inst_hier_path": "axi_interconnect_0/s03_couplers/auto_cc", + "interface_ports": { + "S_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M_AXI" + ] + } + } + } + }, + "interface_nets": { + "auto_cc_to_s03_data_fifo": { + "interface_ports": [ + "s03_data_fifo/S_AXI", + "auto_cc/M_AXI" + ] + }, + "s03_couplers_to_auto_cc": { + "interface_ports": [ + "S_AXI", + "auto_cc/S_AXI" + ] + }, + "s03_data_fifo_to_s03_couplers": { + "interface_ports": [ + "M_AXI", + "s03_data_fifo/M_AXI" + ] + } + }, + "nets": { + "M_ACLK_1": { + "ports": [ + "M_ACLK", + "s03_data_fifo/aclk", + "auto_cc/m_axi_aclk" + ] + }, + "M_ARESETN_1": { + "ports": [ + "M_ARESETN", + "s03_data_fifo/aresetn", + "auto_cc/m_axi_aresetn" + ] + }, + "S_ACLK_1": { + "ports": [ + "S_ACLK", + "auto_cc/s_axi_aclk" + ] + }, + "S_ARESETN_1": { + "ports": [ + "S_ARESETN", + "auto_cc/s_axi_aresetn" + ] + } + } + }, + "s04_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "components": { + "s04_data_fifo": { + "vlnv": "xilinx.com:ip:axi_data_fifo:2.1", + "xci_name": "microblaze_bd_s04_data_fifo_0", + "xci_path": "ip/microblaze_bd_s04_data_fifo_0/microblaze_bd_s04_data_fifo_0.xci", + "inst_hier_path": "axi_interconnect_0/s04_couplers/s04_data_fifo", + "interface_ports": { + "S_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M_AXI" + ] + } + } + }, + "auto_cc": { + "vlnv": "xilinx.com:ip:axi_clock_converter:2.1", + "xci_name": "microblaze_bd_auto_cc_2", + "xci_path": "ip/microblaze_bd_auto_cc_2/microblaze_bd_auto_cc_2.xci", + "inst_hier_path": "axi_interconnect_0/s04_couplers/auto_cc", + "interface_ports": { + "S_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M_AXI" + ] + } + } + } + }, + "interface_nets": { + "auto_cc_to_s04_data_fifo": { + "interface_ports": [ + "s04_data_fifo/S_AXI", + "auto_cc/M_AXI" + ] + }, + "s04_couplers_to_auto_cc": { + "interface_ports": [ + "S_AXI", + "auto_cc/S_AXI" + ] + }, + "s04_data_fifo_to_s04_couplers": { + "interface_ports": [ + "M_AXI", + "s04_data_fifo/M_AXI" + ] + } + }, + "nets": { + "M_ACLK_1": { + "ports": [ + "M_ACLK", + "s04_data_fifo/aclk", + "auto_cc/m_axi_aclk" + ] + }, + "M_ARESETN_1": { + "ports": [ + "M_ARESETN", + "s04_data_fifo/aresetn", + "auto_cc/m_axi_aresetn" + ] + }, + "S_ACLK_1": { + "ports": [ + "S_ACLK", + "auto_cc/s_axi_aclk" + ] + }, + "S_ARESETN_1": { + "ports": [ + "S_ARESETN", + "auto_cc/s_axi_aresetn" + ] + } + } + }, + "m00_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "components": { + "m00_data_fifo": { + "vlnv": "xilinx.com:ip:axi_data_fifo:2.1", + "xci_name": "microblaze_bd_m00_data_fifo_0", + "xci_path": "ip/microblaze_bd_m00_data_fifo_0/microblaze_bd_m00_data_fifo_0.xci", + "inst_hier_path": "axi_interconnect_0/m00_couplers/m00_data_fifo", + "interface_ports": { + "S_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M_AXI" + ] + } + } + } + }, + "interface_nets": { + "m00_couplers_to_m00_data_fifo": { + "interface_ports": [ + "S_AXI", + "m00_data_fifo/S_AXI" + ] + }, + "m00_data_fifo_to_m00_couplers": { + "interface_ports": [ + "M_AXI", + "m00_data_fifo/M_AXI" + ] + } + }, + "nets": { + "S_ACLK_1": { + "ports": [ + "S_ACLK", + "m00_data_fifo/aclk" + ] + }, + "S_ARESETN_1": { + "ports": [ + "S_ARESETN", + "m00_data_fifo/aresetn" + ] + } + } + } + }, + "interface_nets": { + "axi_interconnect_0_to_s00_couplers": { + "interface_ports": [ + "S00_AXI", + "s00_couplers/S_AXI" + ] + }, + "axi_interconnect_0_to_s01_couplers": { + "interface_ports": [ + "S01_AXI", + "s01_couplers/S_AXI" + ] + }, + "axi_interconnect_0_to_s02_couplers": { + "interface_ports": [ + "S02_AXI", + "s02_couplers/S_AXI" + ] + }, + "axi_interconnect_0_to_s03_couplers": { + "interface_ports": [ + "S03_AXI", + "s03_couplers/S_AXI" + ] + }, + "axi_interconnect_0_to_s04_couplers": { + "interface_ports": [ + "S04_AXI", + "s04_couplers/S_AXI" + ] + }, + "m00_couplers_to_axi_interconnect_0": { + "interface_ports": [ + "M00_AXI", + "m00_couplers/M_AXI" + ] + }, + "s00_couplers_to_xbar": { + "interface_ports": [ + "s00_couplers/M_AXI", + "xbar/S00_AXI" + ] + }, + "s01_couplers_to_xbar": { + "interface_ports": [ + "s01_couplers/M_AXI", + "xbar/S01_AXI" + ] + }, + "s02_couplers_to_xbar": { + "interface_ports": [ + "s02_couplers/M_AXI", + "xbar/S02_AXI" + ] + }, + "s03_couplers_to_xbar": { + "interface_ports": [ + "s03_couplers/M_AXI", + "xbar/S03_AXI" + ] + }, + "s04_couplers_to_xbar": { + "interface_ports": [ + "s04_couplers/M_AXI", + "xbar/S04_AXI" + ] + }, + "xbar_to_m00_couplers": { + "interface_ports": [ + "xbar/M00_AXI", + "m00_couplers/S_AXI" + ] + } + }, + "nets": { + "M00_ACLK_1": { + "ports": [ + "M00_ACLK", + "m00_couplers/M_ACLK" + ] + }, + "M00_ARESETN_1": { + "ports": [ + "M00_ARESETN", + "m00_couplers/M_ARESETN" + ] + }, + "S00_ACLK_1": { + "ports": [ + "S00_ACLK", + "s00_couplers/S_ACLK" + ] + }, + "S00_ARESETN_1": { + "ports": [ + "S00_ARESETN", + "s00_couplers/S_ARESETN" + ] + }, + "S01_ACLK_1": { + "ports": [ + "S01_ACLK", + "s01_couplers/S_ACLK" + ] + }, + "S01_ARESETN_1": { + "ports": [ + "S01_ARESETN", + "s01_couplers/S_ARESETN" + ] + }, + "S02_ACLK_1": { + "ports": [ + "S02_ACLK", + "s02_couplers/S_ACLK" + ] + }, + "S02_ARESETN_1": { + "ports": [ + "S02_ARESETN", + "s02_couplers/S_ARESETN" + ] + }, + "S03_ACLK_1": { + "ports": [ + "S03_ACLK", + "s03_couplers/S_ACLK" + ] + }, + "S03_ARESETN_1": { + "ports": [ + "S03_ARESETN", + "s03_couplers/S_ARESETN" + ] + }, + "S04_ACLK_1": { + "ports": [ + "S04_ACLK", + "s04_couplers/S_ACLK" + ] + }, + "S04_ARESETN_1": { + "ports": [ + "S04_ARESETN", + "s04_couplers/S_ARESETN" + ] + }, + "axi_interconnect_0_ACLK_net": { + "ports": [ + "ACLK", + "xbar/aclk", + "s00_couplers/M_ACLK", + "s01_couplers/M_ACLK", + "s02_couplers/M_ACLK", + "s03_couplers/M_ACLK", + "s04_couplers/M_ACLK", + "m00_couplers/S_ACLK" + ] + }, + "axi_interconnect_0_ARESETN_net": { + "ports": [ + "ARESETN", + "xbar/aresetn", + "s00_couplers/M_ARESETN", + "s01_couplers/M_ARESETN", + "s02_couplers/M_ARESETN", + "s03_couplers/M_ARESETN", + "s04_couplers/M_ARESETN", + "m00_couplers/S_ARESETN" + ] + } + } + }, + "rst_ddr": { + "vlnv": "xilinx.com:ip:proc_sys_reset:5.0", + "xci_name": "microblaze_bd_proc_sys_reset_0_0", + "xci_path": "ip/microblaze_bd_proc_sys_reset_0_0/microblaze_bd_proc_sys_reset_0_0.xci", + "inst_hier_path": "rst_ddr" + }, + "axi_ethernet_0_dma": { + "vlnv": "xilinx.com:ip:axi_dma:7.1", + "xci_name": "microblaze_bd_axi_ethernet_0_dma_1", + "xci_path": "ip/microblaze_bd_axi_ethernet_0_dma_1/microblaze_bd_axi_ethernet_0_dma_1.xci", + "inst_hier_path": "axi_ethernet_0_dma", + "parameters": { + "c_include_mm2s_dre": { + "value": "1" + }, + "c_include_s2mm_dre": { + "value": "1" + }, + "c_mm2s_burst_size": { + "value": "256" + }, + "c_s2mm_burst_size": { + "value": "256" + }, + "c_sg_length_width": { + "value": "16" + }, + "c_sg_use_stsapp_length": { + "value": "1" + } + }, + "interface_ports": { + "M_AXI_SG": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Master", + "address_space_ref": "Data_SG", + "base_address": { + "minimum": "0x00000000", + "maximum": "0xFFFFFFFF", + "width": "32" + } + }, + "M_AXI_MM2S": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Master", + "address_space_ref": "Data_MM2S", + "base_address": { + "minimum": "0x00000000", + "maximum": "0xFFFFFFFF", + "width": "32" + } + }, + "M_AXI_S2MM": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Master", + "address_space_ref": "Data_S2MM", + "base_address": { + "minimum": "0x00000000", + "maximum": "0xFFFFFFFF", + "width": "32" + } + } + }, + "addressing": { + "address_spaces": { + "Data_SG": { + "range": "4G", + "width": "32" + }, + "Data_MM2S": { + "range": "4G", + "width": "32" + }, + "Data_S2MM": { + "range": "4G", + "width": "32" + } + } + } + }, + "clk_wiz_0": { + "vlnv": "xilinx.com:ip:clk_wiz:6.0", + "xci_name": "microblaze_bd_clk_wiz_0_1", + "xci_path": "ip/microblaze_bd_clk_wiz_0_1/microblaze_bd_clk_wiz_0_1.xci", + "inst_hier_path": "clk_wiz_0", + "parameters": { + "CLKOUT1_JITTER": { + "value": "150.364" + }, + "CLKOUT1_REQUESTED_OUT_FREQ": { + "value": "125" + }, + "CLKOUT2_JITTER": { + "value": "126.608" + }, + "CLKOUT2_PHASE_ERROR": { + "value": "164.985" + }, + "CLKOUT2_REQUESTED_OUT_FREQ": { + "value": "333.33333" + }, + "CLKOUT2_USED": { + "value": "true" + }, + "CLKOUT3_JITTER": { + "value": "211.559" + }, + "CLKOUT3_PHASE_ERROR": { + "value": "164.985" + }, + "CLKOUT3_REQUESTED_OUT_FREQ": { + "value": "25" + }, + "CLKOUT3_USED": { + "value": "true" + }, + "MMCM_CLKOUT0_DIVIDE_F": { + "value": "8.000" + }, + "MMCM_CLKOUT1_DIVIDE": { + "value": "3" + }, + "MMCM_CLKOUT2_DIVIDE": { + "value": "40" + }, + "NUM_OUT_CLKS": { + "value": "3" + }, + "PRIM_SOURCE": { + "value": "Global_buffer" + }, + "USE_LOCKED": { + "value": "false" + }, + "USE_RESET": { + "value": "false" + } + } + }, + "system_management_wiz_0": { + "vlnv": "xilinx.com:ip:system_management_wiz:1.3", + "xci_name": "microblaze_bd_system_management_wiz_0_0", + "xci_path": "ip/microblaze_bd_system_management_wiz_0_0/microblaze_bd_system_management_wiz_0_0.xci", + "inst_hier_path": "system_management_wiz_0", + "parameters": { + "CHANNEL_ENABLE_VBRAM": { + "value": "false" + }, + "CHANNEL_ENABLE_VCCAUX": { + "value": "false" + }, + "CHANNEL_ENABLE_VCCINT": { + "value": "false" + }, + "CHANNEL_ENABLE_VP_VN": { + "value": "false" + }, + "ENABLE_TEMP_BUS": { + "value": "false" + }, + "OT_ALARM": { + "value": "false" + }, + "USER_TEMP_ALARM": { + "value": "false" + }, + "VCCAUX_ALARM": { + "value": "false" + }, + "VCCINT_ALARM": { + "value": "false" + } + } + }, + "axi_quad_spi_0": { + "vlnv": "xilinx.com:ip:axi_quad_spi:3.2", + "xci_name": "microblaze_bd_axi_quad_spi_0_0", + "xci_path": "ip/microblaze_bd_axi_quad_spi_0_0/microblaze_bd_axi_quad_spi_0_0.xci", + "inst_hier_path": "axi_quad_spi_0", + "parameters": { + "C_NUM_SS_BITS": { + "value": "1" + }, + "Multiples16": { + "value": "2" + } + } + }, + "axi_quad_spi_1": { + "vlnv": "xilinx.com:ip:axi_quad_spi:3.2", + "xci_name": "microblaze_bd_axi_quad_spi_1_0", + "xci_path": "ip/microblaze_bd_axi_quad_spi_1_0/microblaze_bd_axi_quad_spi_1_0.xci", + "inst_hier_path": "axi_quad_spi_1", + "parameters": { + "C_NUM_SS_BITS": { + "value": "2" + }, + "Multiples16": { + "value": "2" + } + } + }, + "jesd": { + "interface_ports": { + "s_axi_tx": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "jesd_axis_tx": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:axis:1.0", + "vlnv": "xilinx.com:interface:axis_rtl:1.0" + }, + "jesd_axis_tx_cmd": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:axis:1.0", + "vlnv": "xilinx.com:interface:axis_rtl:1.0" + }, + "s_axi_rx": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "jesd_axis_rx": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:axis:1.0", + "vlnv": "xilinx.com:interface:axis_rtl:1.0" + }, + "jesd_axis_rx_cmd": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:axis:1.0", + "vlnv": "xilinx.com:interface:axis_rtl:1.0" + }, + "jesd_sysref": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:diff_clock:1.0", + "vlnv": "xilinx.com:interface:diff_clock_rtl:1.0" + }, + "jesd_qpll0_refclk": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:diff_clock:1.0", + "vlnv": "xilinx.com:interface:diff_clock_rtl:1.0" + }, + "s_axi_phy": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "mb_axi_clk": { + "type": "clk", + "direction": "I" + }, + "jesd_txp_out": { + "direction": "O", + "left": "7", + "right": "0" + }, + "jesd_txn_out": { + "direction": "O", + "left": "7", + "right": "0" + }, + "jesd_rxp_in": { + "direction": "I", + "left": "7", + "right": "0" + }, + "jesd_rxn_in": { + "direction": "I", + "left": "7", + "right": "0" + }, + "mb_axi_aresetn": { + "type": "rst", + "direction": "I" + }, + "jesd_tx_core_reset": { + "direction": "I" + }, + "irq": { + "direction": "O" + }, + "jesd_axis_tx_aresetn": { + "type": "rst", + "direction": "O" + }, + "jesd_rx_core_reset": { + "direction": "I" + }, + "irq1": { + "direction": "O" + }, + "jesd_axis_rx_aresetn": { + "type": "rst", + "direction": "O" + }, + "common0_qpll1_lock_out": { + "direction": "O" + }, + "common1_qpll1_lock_out": { + "direction": "O" + }, + "jesd_core_clk": { + "direction": "I" + }, + "jesd_tx_sys_reset": { + "direction": "I" + }, + "jesd_rx_sys_reset": { + "direction": "I" + } + }, + "components": { + "jesd204_phy_0": { + "vlnv": "xilinx.com:ip:jesd204_phy:4.0", + "xci_name": "microblaze_bd_jesd204_phy_0_0", + "xci_path": "ip/microblaze_bd_jesd204_phy_0_0/microblaze_bd_jesd204_phy_0_0.xci", + "inst_hier_path": "jesd/jesd204_phy_0", + "parameters": { + "Axi_Lite": { + "value": "true" + }, + "C_LANES": { + "value": "8" + }, + "C_PLL_SELECTION": { + "value": "1" + }, + "DRPCLK_FREQ": { + "value": "125.0" + }, + "Equalization_Mode": { + "value": "High_Loss" + }, + "GT_Line_Rate": { + "value": "12.375" + }, + "GT_Location": { + "value": "X0Y12" + }, + "GT_REFCLK_FREQ": { + "value": "187.5" + }, + "RX_GT_Line_Rate": { + "value": "12.375" + }, + "RX_GT_REFCLK_FREQ": { + "value": "187.5" + }, + "RX_PLL_SELECTION": { + "value": "1" + }, + "Rx_JesdVersion": { + "value": "1" + }, + "Rx_use_64b": { + "value": "1" + }, + "TransceiverControl": { + "value": "false" + }, + "Tx_JesdVersion": { + "value": "1" + }, + "Tx_use_64b": { + "value": "1" + } + }, + "interface_ports": { + "s_axi": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "memory_map_ref": "s_axi" + } + }, + "addressing": { + "memory_maps": { + "s_axi": { + "address_blocks": { + "Reg": { + "base_address": "0", + "range": "4K", + "width": "12", + "usage": "register" + } + } + } + } + } + }, + "jesd204c_1": { + "vlnv": "xilinx.com:ip:jesd204c:4.2", + "xci_name": "microblaze_bd_jesd204c_1_0", + "xci_path": "ip/microblaze_bd_jesd204c_1_0/microblaze_bd_jesd204c_1_0.xci", + "inst_hier_path": "jesd/jesd204c_1", + "parameters": { + "AXICLK_FREQ": { + "value": "150" + }, + "C_LANES": { + "value": "8" + }, + "C_PLL_SELECTION": { + "value": "1" + }, + "DRPCLK_FREQ": { + "value": "187.5" + }, + "GT_Line_Rate": { + "value": "12.375" + }, + "GT_REFCLK_FREQ": { + "value": "187.5" + } + }, + "interface_ports": { + "s_axi": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "memory_map_ref": "s_axi" + } + }, + "addressing": { + "memory_maps": { + "s_axi": { + "address_blocks": { + "Reg": { + "base_address": "0", + "range": "4K", + "width": "12", + "usage": "register" + } + } + } + } + } + }, + "jesd204c_0": { + "vlnv": "xilinx.com:ip:jesd204c:4.2", + "xci_name": "microblaze_bd_jesd204c_0_0", + "xci_path": "ip/microblaze_bd_jesd204c_0_0/microblaze_bd_jesd204c_0_0.xci", + "inst_hier_path": "jesd/jesd204c_0", + "parameters": { + "AXICLK_FREQ": { + "value": "150.0" + }, + "C_LANES": { + "value": "8" + }, + "C_NODE_IS_TRANSMIT": { + "value": "0" + }, + "C_PLL_SELECTION": { + "value": "1" + }, + "DRPCLK_FREQ": { + "value": "187.5" + }, + "GT_Line_Rate": { + "value": "12.375" + }, + "GT_REFCLK_FREQ": { + "value": "187.5" + } + }, + "interface_ports": { + "s_axi": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "memory_map_ref": "s_axi" + } + }, + "addressing": { + "memory_maps": { + "s_axi": { + "address_blocks": { + "Reg": { + "base_address": "0", + "range": "4K", + "width": "12", + "usage": "register" + } + } + } + } + } + }, + "util_ds_buf_1": { + "vlnv": "xilinx.com:ip:util_ds_buf:2.2", + "xci_name": "microblaze_bd_util_ds_buf_1_0", + "xci_path": "ip/microblaze_bd_util_ds_buf_1_0/microblaze_bd_util_ds_buf_1_0.xci", + "inst_hier_path": "jesd/util_ds_buf_1", + "parameters": { + "C_BUF_TYPE": { + "value": "IBUFDS" + } + } + }, + "util_ds_buf_0": { + "vlnv": "xilinx.com:ip:util_ds_buf:2.2", + "xci_name": "microblaze_bd_util_ds_buf_0_0", + "xci_path": "ip/microblaze_bd_util_ds_buf_0_0/microblaze_bd_util_ds_buf_0_0.xci", + "inst_hier_path": "jesd/util_ds_buf_0", + "parameters": { + "C_BUF_TYPE": { + "value": "IBUFDSGTE" + } + } + } + }, + "interface_nets": { + "Conn1": { + "interface_ports": [ + "jesd_sysref", + "util_ds_buf_1/CLK_IN_D" + ] + }, + "Conn2": { + "interface_ports": [ + "jesd_qpll0_refclk", + "util_ds_buf_0/CLK_IN_D" + ] + }, + "jesd204_phy_0_gt0_rx": { + "interface_ports": [ + "jesd204_phy_0/gt0_rx", + "jesd204c_0/gt0_rx" + ] + }, + "jesd204_phy_0_gt1_rx": { + "interface_ports": [ + "jesd204_phy_0/gt1_rx", + "jesd204c_0/gt1_rx" + ] + }, + "jesd204_phy_0_gt2_rx": { + "interface_ports": [ + "jesd204_phy_0/gt2_rx", + "jesd204c_0/gt2_rx" + ] + }, + "jesd204_phy_0_gt3_rx": { + "interface_ports": [ + "jesd204_phy_0/gt3_rx", + "jesd204c_0/gt3_rx" + ] + }, + "jesd204_phy_0_gt4_rx": { + "interface_ports": [ + "jesd204_phy_0/gt4_rx", + "jesd204c_0/gt4_rx" + ] + }, + "jesd204_phy_0_gt5_rx": { + "interface_ports": [ + "jesd204_phy_0/gt5_rx", + "jesd204c_0/gt5_rx" + ] + }, + "jesd204_phy_0_gt6_rx": { + "interface_ports": [ + "jesd204_phy_0/gt6_rx", + "jesd204c_0/gt6_rx" + ] + }, + "jesd204_phy_0_gt7_rx": { + "interface_ports": [ + "jesd204_phy_0/gt7_rx", + "jesd204c_0/gt7_rx" + ] + }, + "jesd204c_0_m_axis_rx": { + "interface_ports": [ + "jesd_axis_rx", + "jesd204c_0/m_axis_rx" + ] + }, + "jesd204c_0_m_axis_rx_cmd": { + "interface_ports": [ + "jesd_axis_rx_cmd", + "jesd204c_0/m_axis_rx_cmd" + ] + }, + "jesd204c_1_gt0_tx": { + "interface_ports": [ + "jesd204c_1/gt0_tx", + "jesd204_phy_0/gt0_tx" + ] + }, + "jesd204c_1_gt1_tx": { + "interface_ports": [ + "jesd204c_1/gt1_tx", + "jesd204_phy_0/gt1_tx" + ] + }, + "jesd204c_1_gt2_tx": { + "interface_ports": [ + "jesd204c_1/gt2_tx", + "jesd204_phy_0/gt2_tx" + ] + }, + "jesd204c_1_gt3_tx": { + "interface_ports": [ + "jesd204c_1/gt3_tx", + "jesd204_phy_0/gt3_tx" + ] + }, + "jesd204c_1_gt4_tx": { + "interface_ports": [ + "jesd204c_1/gt4_tx", + "jesd204_phy_0/gt4_tx" + ] + }, + "jesd204c_1_gt5_tx": { + "interface_ports": [ + "jesd204c_1/gt5_tx", + "jesd204_phy_0/gt5_tx" + ] + }, + "jesd204c_1_gt6_tx": { + "interface_ports": [ + "jesd204c_1/gt6_tx", + "jesd204_phy_0/gt6_tx" + ] + }, + "jesd204c_1_gt7_tx": { + "interface_ports": [ + "jesd204c_1/gt7_tx", + "jesd204_phy_0/gt7_tx" + ] + }, + "microblaze_0_axi_periph_M07_AXI": { + "interface_ports": [ + "s_axi_rx", + "jesd204c_0/s_axi" + ] + }, + "microblaze_0_axi_periph_M08_AXI": { + "interface_ports": [ + "s_axi_tx", + "jesd204c_1/s_axi" + ] + }, + "s_axi_phy_1": { + "interface_ports": [ + "s_axi_phy", + "jesd204_phy_0/s_axi" + ] + }, + "s_axis_tx_0_1": { + "interface_ports": [ + "jesd_axis_tx", + "jesd204c_1/s_axis_tx" + ] + }, + "s_axis_tx_cmd_0_1": { + "interface_ports": [ + "jesd_axis_tx_cmd", + "jesd204c_1/s_axis_tx_cmd" + ] + } + }, + "nets": { + "jesd204_phy_0_common0_qpll0_lock_out": { + "ports": [ + "jesd204_phy_0/common0_qpll0_lock_out", + "common0_qpll1_lock_out" + ] + }, + "jesd204_phy_0_common1_qpll0_lock_out": { + "ports": [ + "jesd204_phy_0/common1_qpll0_lock_out", + "common1_qpll1_lock_out" + ] + }, + "jesd204_phy_0_rx_reset_done": { + "ports": [ + "jesd204_phy_0/rx_reset_done", + "jesd204c_0/rx_reset_done" + ] + }, + "jesd204_phy_0_tx_reset_done": { + "ports": [ + "jesd204_phy_0/tx_reset_done", + "jesd204c_1/tx_reset_done" + ] + }, + "jesd204_phy_0_txn_out": { + "ports": [ + "jesd204_phy_0/txn_out", + "jesd_txn_out" + ] + }, + "jesd204_phy_0_txoutclk": { + "ports": [ + "jesd_core_clk", + "jesd204c_1/tx_core_clk", + "jesd204_phy_0/tx_core_clk", + "jesd204c_0/rx_core_clk", + "jesd204_phy_0/rx_core_clk" + ] + }, + "jesd204_phy_0_txp_out": { + "ports": [ + "jesd204_phy_0/txp_out", + "jesd_txp_out" + ] + }, + "jesd204c_0_irq": { + "ports": [ + "jesd204c_0/irq", + "irq1" + ] + }, + "jesd204c_0_rx_aresetn": { + "ports": [ + "jesd204c_0/rx_aresetn", + "jesd_axis_rx_aresetn" + ] + }, + "jesd204c_0_rx_reset_gt": { + "ports": [ + "jesd204c_0/rx_reset_gt", + "jesd204_phy_0/rx_reset_gt" + ] + }, + "jesd204c_1_irq": { + "ports": [ + "jesd204c_1/irq", + "irq" + ] + }, + "jesd204c_1_tx_aresetn": { + "ports": [ + "jesd204c_1/tx_aresetn", + "jesd_axis_tx_aresetn" + ] + }, + "jesd204c_1_tx_reset_gt": { + "ports": [ + "jesd204c_1/tx_reset_gt", + "jesd204_phy_0/tx_reset_gt" + ] + }, + "microblaze_0_Clk": { + "ports": [ + "mb_axi_clk", + "jesd204c_0/s_axi_aclk", + "jesd204c_1/s_axi_aclk", + "jesd204_phy_0/drpclk", + "jesd204_phy_0/s_axi_aclk" + ] + }, + "rst_clk_wiz_1_100M_peripheral_aresetn": { + "ports": [ + "mb_axi_aresetn", + "jesd204c_0/s_axi_aresetn", + "jesd204c_1/s_axi_aresetn", + "jesd204_phy_0/s_axi_aresetn" + ] + }, + "rx_core_reset_0_1": { + "ports": [ + "jesd_rx_core_reset", + "jesd204c_0/rx_core_reset" + ] + }, + "rx_sys_reset_0_1": { + "ports": [ + "jesd_rx_sys_reset", + "jesd204_phy_0/rx_sys_reset" + ] + }, + "rxn_in_0_1": { + "ports": [ + "jesd_rxn_in", + "jesd204_phy_0/rxn_in" + ] + }, + "rxp_in_0_1": { + "ports": [ + "jesd_rxp_in", + "jesd204_phy_0/rxp_in" + ] + }, + "tx_core_reset_0_1": { + "ports": [ + "jesd_tx_core_reset", + "jesd204c_1/tx_core_reset" + ] + }, + "tx_sys_reset_0_1": { + "ports": [ + "jesd_tx_sys_reset", + "jesd204_phy_0/tx_sys_reset" + ] + }, + "util_ds_buf_0_IBUF_OUT": { + "ports": [ + "util_ds_buf_0/IBUF_OUT", + "jesd204_phy_0/cpll_refclk", + "jesd204_phy_0/qpll0_refclk", + "jesd204_phy_0/qpll1_refclk" + ] + }, + "util_ds_buf_1_IBUF_OUT": { + "ports": [ + "util_ds_buf_1/IBUF_OUT", + "jesd204c_0/rx_sysref", + "jesd204c_1/tx_sysref" + ] + } + } + }, + "axi_bram_ctrl_0": { + "vlnv": "xilinx.com:ip:axi_bram_ctrl:4.1", + "xci_name": "microblaze_bd_axi_bram_ctrl_0_0", + "xci_path": "ip/microblaze_bd_axi_bram_ctrl_0_0/microblaze_bd_axi_bram_ctrl_0_0.xci", + "inst_hier_path": "axi_bram_ctrl_0", + "parameters": { + "PROTOCOL": { + "value": "AXI4LITE" + }, + "SINGLE_PORT_BRAM": { + "value": "1" + } + } + }, + "axi_bram_ctrl_2": { + "vlnv": "xilinx.com:ip:axi_bram_ctrl:4.1", + "xci_name": "microblaze_bd_axi_bram_ctrl_1_1", + "xci_path": "ip/microblaze_bd_axi_bram_ctrl_1_1/microblaze_bd_axi_bram_ctrl_1_1.xci", + "inst_hier_path": "axi_bram_ctrl_2", + "parameters": { + "PROTOCOL": { + "value": "AXI4LITE" + }, + "SINGLE_PORT_BRAM": { + "value": "1" + } + } + }, + "axi_bram_ctrl_3": { + "vlnv": "xilinx.com:ip:axi_bram_ctrl:4.1", + "xci_name": "microblaze_bd_axi_bram_ctrl_1_2", + "xci_path": "ip/microblaze_bd_axi_bram_ctrl_1_2/microblaze_bd_axi_bram_ctrl_1_2.xci", + "inst_hier_path": "axi_bram_ctrl_3", + "parameters": { + "PROTOCOL": { + "value": "AXI4LITE" + }, + "SINGLE_PORT_BRAM": { + "value": "1" + } + } + }, + "axi_bram_ctrl_1": { + "vlnv": "xilinx.com:ip:axi_bram_ctrl:4.1", + "xci_name": "microblaze_bd_axi_bram_ctrl_0_1", + "xci_path": "ip/microblaze_bd_axi_bram_ctrl_0_1/microblaze_bd_axi_bram_ctrl_0_1.xci", + "inst_hier_path": "axi_bram_ctrl_1", + "parameters": { + "PROTOCOL": { + "value": "AXI4LITE" + }, + "SINGLE_PORT_BRAM": { + "value": "1" + } + } + }, + "axi_interconnect_1": { + "vlnv": "xilinx.com:ip:axi_interconnect:2.1", + "xci_path": "ip/microblaze_bd_axi_interconnect_1_0/microblaze_bd_axi_interconnect_1_0.xci", + "inst_hier_path": "axi_interconnect_1", + "xci_name": "microblaze_bd_axi_interconnect_1_0", + "parameters": { + "NUM_MI": { + "value": "12" + } + }, + "interface_ports": { + "S00_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M00_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M01_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M02_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M03_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M04_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M05_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M06_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M07_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M08_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M09_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M10_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "M11_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_RESET": { + "value": "ARESETN" + } + } + }, + "ARESETN": { + "type": "rst", + "direction": "I" + }, + "S00_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S00_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S00_ARESETN" + } + } + }, + "S00_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M00_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M00_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M00_ARESETN" + } + } + }, + "M00_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M01_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M01_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M01_ARESETN" + } + } + }, + "M01_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M02_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M02_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M02_ARESETN" + } + } + }, + "M02_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M03_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M03_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M03_ARESETN" + } + } + }, + "M03_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M04_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M04_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M04_ARESETN" + } + } + }, + "M04_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M05_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M05_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M05_ARESETN" + } + } + }, + "M05_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M06_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M06_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M06_ARESETN" + } + } + }, + "M06_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M07_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M07_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M07_ARESETN" + } + } + }, + "M07_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M08_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M08_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M08_ARESETN" + } + } + }, + "M08_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M09_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M09_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M09_ARESETN" + } + } + }, + "M09_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M10_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M10_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M10_ARESETN" + } + } + }, + "M10_ARESETN": { + "type": "rst", + "direction": "I" + }, + "M11_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M11_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M11_ARESETN" + } + } + }, + "M11_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "components": { + "xbar": { + "vlnv": "xilinx.com:ip:axi_crossbar:2.1", + "xci_name": "microblaze_bd_xbar_2", + "xci_path": "ip/microblaze_bd_xbar_2/microblaze_bd_xbar_2.xci", + "inst_hier_path": "axi_interconnect_1/xbar", + "parameters": { + "NUM_MI": { + "value": "12" + }, + "NUM_SI": { + "value": "1" + }, + "STRATEGY": { + "value": "0" + } + }, + "interface_ports": { + "S00_AXI": { + "vlnv": "xilinx.com:interface:aximm_rtl:1.0", + "mode": "Slave", + "bridges": [ + "M00_AXI", + "M01_AXI", + "M02_AXI", + "M03_AXI", + "M04_AXI", + "M05_AXI", + "M06_AXI", + "M07_AXI", + "M08_AXI", + "M09_AXI", + "M10_AXI", + "M11_AXI" + ] + } + } + }, + "s00_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "s00_couplers_to_s00_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m00_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m00_couplers_to_m00_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m01_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m01_couplers_to_m01_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m02_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m02_couplers_to_m02_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m03_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m03_couplers_to_m03_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m04_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m04_couplers_to_m04_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m05_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m05_couplers_to_m05_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m06_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m06_couplers_to_m06_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m07_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m07_couplers_to_m07_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m08_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m08_couplers_to_m08_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m09_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m09_couplers_to_m09_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m10_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m10_couplers_to_m10_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + }, + "m11_couplers": { + "interface_ports": { + "M_AXI": { + "mode": "Master", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + }, + "S_AXI": { + "mode": "Slave", + "vlnv_bus_definition": "xilinx.com:interface:aximm:1.0", + "vlnv": "xilinx.com:interface:aximm_rtl:1.0" + } + }, + "ports": { + "M_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "M_AXI" + }, + "ASSOCIATED_RESET": { + "value": "M_ARESETN" + } + } + }, + "M_ARESETN": { + "type": "rst", + "direction": "I" + }, + "S_ACLK": { + "type": "clk", + "direction": "I", + "parameters": { + "ASSOCIATED_BUSIF": { + "value": "S_AXI" + }, + "ASSOCIATED_RESET": { + "value": "S_ARESETN" + } + } + }, + "S_ARESETN": { + "type": "rst", + "direction": "I" + } + }, + "interface_nets": { + "m11_couplers_to_m11_couplers": { + "interface_ports": [ + "S_AXI", + "M_AXI" + ] + } + } + } + }, + "interface_nets": { + "axi_interconnect_1_to_s00_couplers": { + "interface_ports": [ + "S00_AXI", + "s00_couplers/S_AXI" + ] + }, + "m00_couplers_to_axi_interconnect_1": { + "interface_ports": [ + "M00_AXI", + "m00_couplers/M_AXI" + ] + }, + "m01_couplers_to_axi_interconnect_1": { + "interface_ports": [ + "M01_AXI", + "m01_couplers/M_AXI" + ] + }, + "m02_couplers_to_axi_interconnect_1": { + "interface_ports": [ + "M02_AXI", + "m02_couplers/M_AXI" + ] + }, + "m03_couplers_to_axi_interconnect_1": { + "interface_ports": [ + "M03_AXI", + "m03_couplers/M_AXI" + ] + }, + "m04_couplers_to_axi_interconnect_1": { + "interface_ports": [ + "M04_AXI", + "m04_couplers/M_AXI" + ] + }, + "m05_couplers_to_axi_interconnect_1": { + "interface_ports": [ + "M05_AXI", + "m05_couplers/M_AXI" + ] + }, + "m06_couplers_to_axi_interconnect_1": { + "interface_ports": [ + "M06_AXI", + "m06_couplers/M_AXI" + ] + }, + "m07_couplers_to_axi_interconnect_1": { + "interface_ports": [ + "M07_AXI", + "m07_couplers/M_AXI" + ] + }, + "m08_couplers_to_axi_interconnect_1": { + "interface_ports": [ + "M08_AXI", + "m08_couplers/M_AXI" + ] + }, + "m09_couplers_to_axi_interconnect_1": { + "interface_ports": [ + "M09_AXI", + "m09_couplers/M_AXI" + ] + }, + "m10_couplers_to_axi_interconnect_1": { + "interface_ports": [ + "M10_AXI", + "m10_couplers/M_AXI" + ] + }, + "m11_couplers_to_axi_interconnect_1": { + "interface_ports": [ + "M11_AXI", + "m11_couplers/M_AXI" + ] + }, + "s00_couplers_to_xbar": { + "interface_ports": [ + "s00_couplers/M_AXI", + "xbar/S00_AXI" + ] + }, + "xbar_to_m00_couplers": { + "interface_ports": [ + "xbar/M00_AXI", + "m00_couplers/S_AXI" + ] + }, + "xbar_to_m01_couplers": { + "interface_ports": [ + "xbar/M01_AXI", + "m01_couplers/S_AXI" + ] + }, + "xbar_to_m02_couplers": { + "interface_ports": [ + "xbar/M02_AXI", + "m02_couplers/S_AXI" + ] + }, + "xbar_to_m03_couplers": { + "interface_ports": [ + "xbar/M03_AXI", + "m03_couplers/S_AXI" + ] + }, + "xbar_to_m04_couplers": { + "interface_ports": [ + "xbar/M04_AXI", + "m04_couplers/S_AXI" + ] + }, + "xbar_to_m05_couplers": { + "interface_ports": [ + "xbar/M05_AXI", + "m05_couplers/S_AXI" + ] + }, + "xbar_to_m06_couplers": { + "interface_ports": [ + "xbar/M06_AXI", + "m06_couplers/S_AXI" + ] + }, + "xbar_to_m07_couplers": { + "interface_ports": [ + "xbar/M07_AXI", + "m07_couplers/S_AXI" + ] + }, + "xbar_to_m08_couplers": { + "interface_ports": [ + "xbar/M08_AXI", + "m08_couplers/S_AXI" + ] + }, + "xbar_to_m09_couplers": { + "interface_ports": [ + "xbar/M09_AXI", + "m09_couplers/S_AXI" + ] + }, + "xbar_to_m10_couplers": { + "interface_ports": [ + "xbar/M10_AXI", + "m10_couplers/S_AXI" + ] + }, + "xbar_to_m11_couplers": { + "interface_ports": [ + "xbar/M11_AXI", + "m11_couplers/S_AXI" + ] + } + }, + "nets": { + "axi_interconnect_1_ACLK_net": { + "ports": [ + "ACLK", + "xbar/aclk", + "s00_couplers/S_ACLK", + "s00_couplers/M_ACLK", + "m00_couplers/M_ACLK", + "m01_couplers/M_ACLK", + "m02_couplers/M_ACLK", + "m03_couplers/M_ACLK", + "m04_couplers/M_ACLK", + "m05_couplers/M_ACLK", + "m06_couplers/M_ACLK", + "m07_couplers/M_ACLK", + "m08_couplers/M_ACLK", + "m09_couplers/M_ACLK", + "m10_couplers/M_ACLK", + "m11_couplers/M_ACLK", + "m00_couplers/S_ACLK", + "m01_couplers/S_ACLK", + "m02_couplers/S_ACLK", + "m03_couplers/S_ACLK", + "m04_couplers/S_ACLK", + "m05_couplers/S_ACLK", + "m06_couplers/S_ACLK", + "m07_couplers/S_ACLK", + "m08_couplers/S_ACLK", + "m09_couplers/S_ACLK", + "m10_couplers/S_ACLK", + "m11_couplers/S_ACLK" + ] + }, + "axi_interconnect_1_ARESETN_net": { + "ports": [ + "ARESETN", + "xbar/aresetn", + "s00_couplers/S_ARESETN", + "s00_couplers/M_ARESETN", + "m00_couplers/M_ARESETN", + "m01_couplers/M_ARESETN", + "m02_couplers/M_ARESETN", + "m03_couplers/M_ARESETN", + "m04_couplers/M_ARESETN", + "m05_couplers/M_ARESETN", + "m06_couplers/M_ARESETN", + "m07_couplers/M_ARESETN", + "m08_couplers/M_ARESETN", + "m09_couplers/M_ARESETN", + "m10_couplers/M_ARESETN", + "m11_couplers/M_ARESETN", + "m00_couplers/S_ARESETN", + "m01_couplers/S_ARESETN", + "m02_couplers/S_ARESETN", + "m03_couplers/S_ARESETN", + "m04_couplers/S_ARESETN", + "m05_couplers/S_ARESETN", + "m06_couplers/S_ARESETN", + "m07_couplers/S_ARESETN", + "m08_couplers/S_ARESETN", + "m09_couplers/S_ARESETN", + "m10_couplers/S_ARESETN", + "m11_couplers/S_ARESETN" + ] + } + } + }, + "axi_fifo_mm_s_0": { + "vlnv": "xilinx.com:ip:axi_fifo_mm_s:4.2", + "xci_name": "microblaze_bd_axi_fifo_mm_s_0_0", + "xci_path": "ip/microblaze_bd_axi_fifo_mm_s_0_0/microblaze_bd_axi_fifo_mm_s_0_0.xci", + "inst_hier_path": "axi_fifo_mm_s_0", + "parameters": { + "C_AXIS_TUSER_WIDTH": { + "value": "4" + }, + "C_DATA_INTERFACE_TYPE": { + "value": "0" + }, + "C_S_AXI4_DATA_WIDTH": { + "value": "32" + }, + "C_USE_TX_CTRL": { + "value": "0" + }, + "C_USE_TX_DATA": { + "value": "1" + } + } + }, + "axis_dwidth_converter_0": { + "vlnv": "xilinx.com:ip:axis_dwidth_converter:1.1", + "xci_name": "microblaze_bd_axis_dwidth_converter_0_0", + "xci_path": "ip/microblaze_bd_axis_dwidth_converter_0_0/microblaze_bd_axis_dwidth_converter_0_0.xci", + "inst_hier_path": "axis_dwidth_converter_0", + "parameters": { + "M_TDATA_NUM_BYTES": { + "value": "4" + } + } + }, + "axis_dwidth_converter_1": { + "vlnv": "xilinx.com:ip:axis_dwidth_converter:1.1", + "xci_name": "microblaze_bd_axis_dwidth_converter_1_0", + "xci_path": "ip/microblaze_bd_axis_dwidth_converter_1_0/microblaze_bd_axis_dwidth_converter_1_0.xci", + "inst_hier_path": "axis_dwidth_converter_1", + "parameters": { + "M_TDATA_NUM_BYTES": { + "value": "8" + } + } + }, + "qspi_flash": { + "vlnv": "xilinx.com:ip:axi_quad_spi:3.2", + "xci_name": "microblaze_bd_axi_quad_spi_2_0", + "xci_path": "ip/microblaze_bd_axi_quad_spi_2_0/microblaze_bd_axi_quad_spi_2_0.xci", + "inst_hier_path": "qspi_flash", + "parameters": { + "C_SPI_MEMORY": { + "value": "2" + }, + "C_SPI_MODE": { + "value": "2" + }, + "C_USE_STARTUP": { + "value": "1" + }, + "C_USE_STARTUP_INT": { + "value": "1" + } + } + } + }, + "interface_nets": { + "S00_AXI_1": { + "interface_ports": [ + "axi_interconnect_1/S00_AXI", + "microblaze_0_axi_periph/M01_AXI" + ] + }, + "S_AXIS_0_1": { + "interface_ports": [ + "udp_rx", + "axis_dwidth_converter_0/S_AXIS" + ] + }, + "axi_bram_ctrl_0_BRAM_PORTA": { + "interface_ports": [ + "dac0_wf_bram", + "axi_bram_ctrl_0/BRAM_PORTA" + ] + }, + "axi_bram_ctrl_1_BRAM_PORTA": { + "interface_ports": [ + "dac1_wf_bram", + "axi_bram_ctrl_1/BRAM_PORTA" + ] + }, + "axi_bram_ctrl_2_BRAM_PORTA": { + "interface_ports": [ + "dac2_wf_bram", + "axi_bram_ctrl_2/BRAM_PORTA" + ] + }, + "axi_bram_ctrl_3_BRAM_PORTA": { + "interface_ports": [ + "dac3_wf_bram", + "axi_bram_ctrl_3/BRAM_PORTA" + ] + }, + "axi_ethernet_0_dma_M_AXIS_CNTRL": { + "interface_ports": [ + "axi_ethernet_0_dma/M_AXIS_CNTRL", + "axi_ethernet_0/s_axis_txc" + ] + }, + "axi_ethernet_0_dma_M_AXIS_MM2S": { + "interface_ports": [ + "axi_ethernet_0_dma/M_AXIS_MM2S", + "axi_ethernet_0/s_axis_txd" + ] + }, + "axi_ethernet_0_dma_M_AXI_MM2S": { + "interface_ports": [ + "axi_ethernet_0_dma/M_AXI_MM2S", + "axi_interconnect_0/S00_AXI" + ] + }, + "axi_ethernet_0_dma_M_AXI_S2MM": { + "interface_ports": [ + "axi_ethernet_0_dma/M_AXI_S2MM", + "axi_interconnect_0/S01_AXI" + ] + }, + "axi_ethernet_0_dma_M_AXI_SG": { + "interface_ports": [ + "axi_ethernet_0_dma/M_AXI_SG", + "axi_interconnect_0/S02_AXI" + ] + }, + "axi_ethernet_0_m_axis_rxd": { + "interface_ports": [ + "axi_ethernet_0_dma/S_AXIS_S2MM", + "axi_ethernet_0/m_axis_rxd" + ] + }, + "axi_ethernet_0_m_axis_rxs": { + "interface_ports": [ + "axi_ethernet_0_dma/S_AXIS_STS", + "axi_ethernet_0/m_axis_rxs" + ] + }, + "axi_ethernet_0_mdio": { + "interface_ports": [ + "mdio", + "axi_ethernet_0/mdio" + ] + }, + "axi_ethernet_0_rgmii": { + "interface_ports": [ + "rgmii", + "axi_ethernet_0/rgmii" + ] + }, + "axi_fifo_mm_s_0_AXI_STR_TXD": { + "interface_ports": [ + "axis_dwidth_converter_1/S_AXIS", + "axi_fifo_mm_s_0/AXI_STR_TXD" + ] + }, + "axi_interconnect_0_M00_AXI": { + "interface_ports": [ + "axi_interconnect_0/M00_AXI", + "ddr4_0/C0_DDR4_S_AXI" + ] + }, + "axi_interconnect_1_M00_AXI": { + "interface_ports": [ + "axi_bram_ctrl_0/S_AXI", + "axi_interconnect_1/M00_AXI" + ] + }, + "axi_interconnect_1_M01_AXI": { + "interface_ports": [ + "axi_bram_ctrl_1/S_AXI", + "axi_interconnect_1/M01_AXI" + ] + }, + "axi_interconnect_1_M02_AXI": { + "interface_ports": [ + "axi_bram_ctrl_2/S_AXI", + "axi_interconnect_1/M02_AXI" + ] + }, + "axi_interconnect_1_M03_AXI": { + "interface_ports": [ + "axi_bram_ctrl_3/S_AXI", + "axi_interconnect_1/M03_AXI" + ] + }, + "axi_interconnect_1_M04_AXI": { + "interface_ports": [ + "axi_quad_spi_1/AXI_LITE", + "axi_interconnect_1/M04_AXI" + ] + }, + "axi_interconnect_1_M05_AXI": { + "interface_ports": [ + "axi_quad_spi_0/AXI_LITE", + "axi_interconnect_1/M05_AXI" + ] + }, + "axi_interconnect_1_M06_AXI": { + "interface_ports": [ + "axi_uartlite_0/S_AXI", + "axi_interconnect_1/M06_AXI" + ] + }, + "axi_interconnect_1_M08_AXI": { + "interface_ports": [ + "axi_interconnect_1/M08_AXI", + "jesd/s_axi_phy" + ] + }, + "axi_interconnect_1_M10_AXI": { + "interface_ports": [ + "system_management_wiz_0/S_AXI_LITE", + "axi_interconnect_1/M10_AXI" + ] + }, + "axi_interconnect_1_M11_AXI": { + "interface_ports": [ + "axi_interconnect_1/M11_AXI", + "qspi_flash/AXI_LITE" + ] + }, + "axi_quad_spi_0_SPI_0": { + "interface_ports": [ + "fmc_spi0", + "axi_quad_spi_0/SPI_0" + ] + }, + "axi_quad_spi_1_SPI_0": { + "interface_ports": [ + "fmc_spi1", + "axi_quad_spi_1/SPI_0" + ] + }, + "axi_uartlite_0_UART": { + "interface_ports": [ + "uart", + "axi_uartlite_0/UART" + ] + }, + "axis_dwidth_converter_0_M_AXIS": { + "interface_ports": [ + "axis_dwidth_converter_0/M_AXIS", + "axi_fifo_mm_s_0/AXI_STR_RXD" + ] + }, + "axis_dwidth_converter_1_M_AXIS": { + "interface_ports": [ + "udp_tx", + "axis_dwidth_converter_1/M_AXIS" + ] + }, + "clk_200_in_1": { + "interface_ports": [ + "clk_200_in", + "ddr4_0/C0_SYS_CLK" + ] + }, + "ddr4_0_C0_DDR4": { + "interface_ports": [ + "ddr", + "ddr4_0/C0_DDR4" + ] + }, + "jesd204c_0_m_axis_rx": { + "interface_ports": [ + "jesd_axis_rx", + "jesd/jesd_axis_rx" + ] + }, + "jesd204c_0_m_axis_rx_cmd": { + "interface_ports": [ + "jesd_axis_rx_cmd", + "jesd/jesd_axis_rx_cmd" + ] + }, + "jesd_qpll0_refclk_1": { + "interface_ports": [ + "jesd_qpll0_refclk", + "jesd/jesd_qpll0_refclk" + ] + }, + "jesd_sysref_1": { + "interface_ports": [ + "jesd_sysref", + "jesd/jesd_sysref" + ] + }, + "microblaze_0_M_AXI_DC": { + "interface_ports": [ + "microblaze_0/M_AXI_DC", + "axi_interconnect_0/S03_AXI" + ] + }, + "microblaze_0_M_AXI_IC": { + "interface_ports": [ + "microblaze_0/M_AXI_IC", + "axi_interconnect_0/S04_AXI" + ] + }, + "microblaze_0_axi_dp": { + "interface_ports": [ + "microblaze_0_axi_periph/S00_AXI", + "microblaze_0/M_AXI_DP" + ] + }, + "microblaze_0_axi_periph_M02_AXI": { + "interface_ports": [ + "microblaze_0_axi_periph/M02_AXI", + "axi_ethernet_0/s_axi" + ] + }, + "microblaze_0_axi_periph_M03_AXI": { + "interface_ports": [ + "microblaze_0_axi_periph/M03_AXI", + "axi_timer_0/S_AXI" + ] + }, + "microblaze_0_axi_periph_M04_AXI": { + "interface_ports": [ + "microblaze_0_axi_periph/M04_AXI", + "axi_ethernet_0_dma/S_AXI_LITE" + ] + }, + "microblaze_0_axi_periph_M05_AXI": { + "interface_ports": [ + "timing_engine_axil", + "microblaze_0_axi_periph/M05_AXI" + ] + }, + "microblaze_0_axi_periph_M06_AXI": { + "interface_ports": [ + "util_reg_axil", + "microblaze_0_axi_periph/M06_AXI" + ] + }, + "microblaze_0_axi_periph_M07_AXI": { + "interface_ports": [ + "microblaze_0_axi_periph/M07_AXI", + "axi_fifo_mm_s_0/S_AXI" + ] + }, + "microblaze_0_axi_periph_M08_AXI": { + "interface_ports": [ + "dig_rx0_axil", + "microblaze_0_axi_periph/M08_AXI" + ] + }, + "microblaze_0_axi_periph_M09_AXI": { + "interface_ports": [ + "wf_gen_axil", + "microblaze_0_axi_periph/M09_AXI" + ] + }, + "microblaze_0_axi_periph_M10_AXI": { + "interface_ports": [ + "dig_rx1_axil", + "microblaze_0_axi_periph/M10_AXI" + ] + }, + "microblaze_0_debug": { + "interface_ports": [ + "mdm_1/MBDEBUG_0", + "microblaze_0/DEBUG" + ] + }, + "microblaze_0_dlmb_1": { + "interface_ports": [ + "microblaze_0/DLMB", + "microblaze_0_local_memory/DLMB" + ] + }, + "microblaze_0_ilmb_1": { + "interface_ports": [ + "microblaze_0/ILMB", + "microblaze_0_local_memory/ILMB" + ] + }, + "microblaze_0_intc_axi": { + "interface_ports": [ + "microblaze_0_axi_periph/M00_AXI", + "microblaze_0_axi_intc/s_axi" + ] + }, + "microblaze_0_interrupt": { + "interface_ports": [ + "microblaze_0_axi_intc/interrupt", + "microblaze_0/INTERRUPT" + ] + }, + "qspi_flash_STARTUP_IO_S": { + "interface_ports": [ + "STARTUP_IO", + "qspi_flash/STARTUP_IO_S" + ] + }, + "s_axi_rx_1": { + "interface_ports": [ + "jesd/s_axi_rx", + "axi_interconnect_1/M07_AXI" + ] + }, + "s_axi_tx_1": { + "interface_ports": [ + "jesd/s_axi_tx", + "axi_interconnect_1/M09_AXI" + ] + }, + "s_axis_tx_0_1": { + "interface_ports": [ + "jesd_axis_tx", + "jesd/jesd_axis_tx" + ] + }, + "s_axis_tx_cmd_0_1": { + "interface_ports": [ + "jesd_axis_tx_cmd", + "jesd/jesd_axis_tx_cmd" + ] + } + }, + "nets": { + "In12_0_1": { + "ports": [ + "pps", + "microblaze_0_xlconcat/In12" + ] + }, + "axi_ethernet_0_dma_mm2s_cntrl_reset_out_n": { + "ports": [ + "axi_ethernet_0_dma/mm2s_cntrl_reset_out_n", + "axi_ethernet_0/axi_txc_arstn" + ] + }, + "axi_ethernet_0_dma_mm2s_introut": { + "ports": [ + "axi_ethernet_0_dma/mm2s_introut", + "microblaze_0_xlconcat/In4" + ] + }, + "axi_ethernet_0_dma_mm2s_prmry_reset_out_n": { + "ports": [ + "axi_ethernet_0_dma/mm2s_prmry_reset_out_n", + "axi_ethernet_0/axi_txd_arstn" + ] + }, + "axi_ethernet_0_dma_s2mm_introut": { + "ports": [ + "axi_ethernet_0_dma/s2mm_introut", + "microblaze_0_xlconcat/In5" + ] + }, + "axi_ethernet_0_dma_s2mm_sts_reset_out_n": { + "ports": [ + "axi_ethernet_0_dma/s2mm_sts_reset_out_n", + "axi_ethernet_0/axi_rxs_arstn" + ] + }, + "axi_ethernet_0_fifo_s2mm_prmry_reset_out_n": { + "ports": [ + "axi_ethernet_0_dma/s2mm_prmry_reset_out_n", + "axi_ethernet_0/axi_rxd_arstn" + ] + }, + "axi_ethernet_0_interrupt": { + "ports": [ + "axi_ethernet_0/interrupt", + "microblaze_0_xlconcat/In1" + ] + }, + "axi_ethernet_0_mac_irq": { + "ports": [ + "axi_ethernet_0/mac_irq", + "microblaze_0_xlconcat/In3" + ] + }, + "axi_ethernet_0_phy_rst_n": { + "ports": [ + "axi_ethernet_0/phy_rst_n", + "phy_rst_n" + ] + }, + "axi_fifo_mm_s_0_interrupt": { + "ports": [ + "axi_fifo_mm_s_0/interrupt", + "microblaze_0_xlconcat/In10" + ] + }, + "axi_quad_spi_0_ip2intc_irpt": { + "ports": [ + "axi_quad_spi_0/ip2intc_irpt", + "microblaze_0_xlconcat/In8" + ] + }, + "axi_quad_spi_1_ip2intc_irpt": { + "ports": [ + "axi_quad_spi_1/ip2intc_irpt", + "microblaze_0_xlconcat/In9" + ] + }, + "axi_timer_0_interrupt": { + "ports": [ + "axi_timer_0/interrupt", + "microblaze_0_xlconcat/In2" + ] + }, + "axi_uartlite_0_interrupt": { + "ports": [ + "axi_uartlite_0/interrupt", + "microblaze_0_xlconcat/In0" + ] + }, + "clk_wiz_0_clk_out1": { + "ports": [ + "clk_wiz_0/clk_out1", + "axi_ethernet_0/gtx_clk" + ] + }, + "clk_wiz_0_clk_out2": { + "ports": [ + "clk_wiz_0/clk_out2", + "axi_ethernet_0/ref_clk" + ] + }, + "clk_wiz_0_clk_out3": { + "ports": [ + "clk_wiz_0/clk_out3", + "qspi_flash/ext_spi_clk" + ] + }, + "core_clk_1": { + "ports": [ + "jesd_core_clk", + "jesd/jesd_core_clk" + ] + }, + "ddr4_0_c0_ddr4_ui_clk": { + "ports": [ + "ddr4_0/c0_ddr4_ui_clk", + "rst_ddr/slowest_sync_clk", + "axi_interconnect_0/ACLK", + "axi_interconnect_0/S00_ACLK", + "axi_interconnect_0/M00_ACLK", + "axi_interconnect_0/S01_ACLK", + "axi_interconnect_0/S02_ACLK", + "axi_ethernet_0_dma/m_axi_sg_aclk", + "axi_ethernet_0_dma/m_axi_mm2s_aclk", + "axi_ethernet_0_dma/m_axi_s2mm_aclk", + "axi_ethernet_0/axis_clk" + ] + }, + "ddr4_0_c0_init_calib_complete": { + "ports": [ + "ddr4_0/c0_init_calib_complete", + "ddr_init_calib_complete" + ] + }, + "ext_reset_in_0_1": { + "ports": [ + "ext_reset_in_200", + "rst_150/ext_reset_in", + "rst_ddr/ext_reset_in" + ] + }, + "jesd204_phy_0_txn_out": { + "ports": [ + "jesd/jesd_txn_out", + "jesd_txn_out" + ] + }, + "jesd204_phy_0_txp_out": { + "ports": [ + "jesd/jesd_txp_out", + "jesd_txp_out" + ] + }, + "jesd204c_0_irq": { + "ports": [ + "jesd/irq1", + "microblaze_0_xlconcat/In6" + ] + }, + "jesd204c_0_rx_aresetn": { + "ports": [ + "jesd/jesd_axis_rx_aresetn", + "jesd_axis_rx_aresetn" + ] + }, + "jesd204c_1_irq": { + "ports": [ + "jesd/irq", + "microblaze_0_xlconcat/In7" + ] + }, + "jesd204c_1_tx_aresetn": { + "ports": [ + "jesd/jesd_axis_tx_aresetn", + "jesd_axis_tx_aresetn" + ] + }, + "jesd_common0_qpll1_lock_out_0": { + "ports": [ + "jesd/common0_qpll1_lock_out", + "common0_qpll1_lock_out" + ] + }, + "jesd_common1_qpll1_lock_out_0": { + "ports": [ + "jesd/common1_qpll1_lock_out", + "common1_qpll1_lock_out" + ] + }, + "mdm_1_debug_sys_rst": { + "ports": [ + "mdm_1/Debug_SYS_Rst", + "rst_150/mb_debug_sys_rst" + ] + }, + "microblaze_0_Clk": { + "ports": [ + "ddr4_0/addn_ui_clkout1", + "microblaze_0/Clk", + "microblaze_0_axi_periph/ACLK", + "microblaze_0_axi_periph/S00_ACLK", + "microblaze_0_axi_periph/M00_ACLK", + "microblaze_0_axi_intc/s_axi_aclk", + "microblaze_0_axi_intc/processor_clk", + "microblaze_0_local_memory/LMB_Clk", + "rst_150/slowest_sync_clk", + "axi_uartlite_0/s_axi_aclk", + "microblaze_0_axi_periph/M01_ACLK", + "axi_timer_0/s_axi_aclk", + "microblaze_0_axi_periph/M02_ACLK", + "microblaze_0_axi_periph/M03_ACLK", + "microblaze_0_axi_periph/M04_ACLK", + "axi_ethernet_0/s_axi_lite_clk", + "axi_ethernet_0_dma/s_axi_lite_aclk", + "axi_interconnect_0/S03_ACLK", + "axi_interconnect_0/S04_ACLK", + "clk_wiz_0/clk_in1", + "system_management_wiz_0/s_axi_aclk", + "microblaze_0_axi_periph/M05_ACLK", + "microblaze_0_axi_periph/M06_ACLK", + "mb_axi_clk", + "axi_quad_spi_0/ext_spi_clk", + "axi_quad_spi_0/s_axi_aclk", + "axi_quad_spi_1/ext_spi_clk", + "axi_quad_spi_1/s_axi_aclk", + "jesd/mb_axi_clk", + "axi_bram_ctrl_0/s_axi_aclk", + "axi_bram_ctrl_3/s_axi_aclk", + "axi_bram_ctrl_2/s_axi_aclk", + "axi_bram_ctrl_1/s_axi_aclk", + "axi_interconnect_1/ACLK", + "axi_interconnect_1/S00_ACLK", + "axi_interconnect_1/M00_ACLK", + "axi_interconnect_1/M01_ACLK", + "axi_interconnect_1/M02_ACLK", + "axi_interconnect_1/M03_ACLK", + "axi_interconnect_1/M04_ACLK", + "axi_interconnect_1/M05_ACLK", + "axi_interconnect_1/M06_ACLK", + "axi_interconnect_1/M07_ACLK", + "axi_interconnect_1/M08_ACLK", + "axi_interconnect_1/M09_ACLK", + "axi_interconnect_1/M10_ACLK", + "microblaze_0_axi_periph/M08_ACLK", + "microblaze_0_axi_periph/M09_ACLK", + "microblaze_0_axi_periph/M10_ACLK", + "axi_interconnect_1/M11_ACLK", + "qspi_flash/s_axi_aclk" + ] + }, + "microblaze_0_intr": { + "ports": [ + "microblaze_0_xlconcat/dout", + "microblaze_0_axi_intc/intr" + ] + }, + "qspi_flash_ip2intc_irpt": { + "ports": [ + "qspi_flash/ip2intc_irpt", + "microblaze_0_xlconcat/In11" + ] + }, + "rst_clk_wiz_1_100M_bus_struct_reset": { + "ports": [ + "rst_150/bus_struct_reset", + "microblaze_0_local_memory/SYS_Rst" + ] + }, + "rst_clk_wiz_1_100M_mb_reset": { + "ports": [ + "rst_150/mb_reset", + "microblaze_0/Reset", + "microblaze_0_axi_intc/processor_rst" + ] + }, + "rst_clk_wiz_1_100M_peripheral_aresetn": { + "ports": [ + "rst_150/peripheral_aresetn", + "microblaze_0_axi_periph/ARESETN", + "microblaze_0_axi_periph/S00_ARESETN", + "microblaze_0_axi_periph/M00_ARESETN", + "microblaze_0_axi_intc/s_axi_aresetn", + "microblaze_0_axi_periph/M01_ARESETN", + "axi_uartlite_0/s_axi_aresetn", + "axi_timer_0/s_axi_aresetn", + "microblaze_0_axi_periph/M02_ARESETN", + "microblaze_0_axi_periph/M03_ARESETN", + "microblaze_0_axi_periph/M04_ARESETN", + "axi_ethernet_0/s_axi_lite_resetn", + "axi_ethernet_0_dma/axi_resetn", + "axi_interconnect_0/S03_ARESETN", + "axi_interconnect_0/S04_ARESETN", + "system_management_wiz_0/s_axi_aresetn", + "microblaze_0_axi_periph/M05_ARESETN", + "microblaze_0_axi_periph/M06_ARESETN", + "mb_axi_aresetn", + "axi_quad_spi_0/s_axi_aresetn", + "axi_quad_spi_1/s_axi_aresetn", + "jesd/mb_axi_aresetn", + "axi_bram_ctrl_0/s_axi_aresetn", + "axi_bram_ctrl_3/s_axi_aresetn", + "axi_bram_ctrl_2/s_axi_aresetn", + "axi_bram_ctrl_1/s_axi_aresetn", + "axi_interconnect_1/ARESETN", + "axi_interconnect_1/S00_ARESETN", + "axi_interconnect_1/M00_ARESETN", + "axi_interconnect_1/M01_ARESETN", + "axi_interconnect_1/M02_ARESETN", + "axi_interconnect_1/M03_ARESETN", + "axi_interconnect_1/M04_ARESETN", + "axi_interconnect_1/M05_ARESETN", + "axi_interconnect_1/M06_ARESETN", + "axi_interconnect_1/M07_ARESETN", + "axi_interconnect_1/M08_ARESETN", + "axi_interconnect_1/M09_ARESETN", + "axi_interconnect_1/M10_ARESETN", + "microblaze_0_axi_periph/M08_ARESETN", + "microblaze_0_axi_periph/M09_ARESETN", + "microblaze_0_axi_periph/M10_ARESETN", + "axi_interconnect_1/M11_ARESETN" + ] + }, + "rst_ddr_mb_reset": { + "ports": [ + "rst_ddr/mb_reset", + "ddr4_0/sys_rst" + ] + }, + "rst_ddr_peripheral_aresetn": { + "ports": [ + "rst_ddr/peripheral_aresetn", + "ddr4_0/c0_ddr4_aresetn", + "axi_interconnect_0/ARESETN", + "axi_interconnect_0/S00_ARESETN", + "axi_interconnect_0/M00_ARESETN", + "axi_interconnect_0/S01_ARESETN", + "axi_interconnect_0/S02_ARESETN" + ] + }, + "rx_core_reset_0_1": { + "ports": [ + "jesd_rx_core_reset", + "jesd/jesd_rx_core_reset" + ] + }, + "rx_sys_reset_0_1": { + "ports": [ + "jesd_rx_sys_reset", + "jesd/jesd_rx_sys_reset" + ] + }, + "rxn_in_0_1": { + "ports": [ + "jesd_rxn_in", + "jesd/jesd_rxn_in" + ] + }, + "rxp_in_0_1": { + "ports": [ + "jesd_rxp_in", + "jesd/jesd_rxp_in" + ] + }, + "s_axi_aclk_0_1": { + "ports": [ + "eth_clk", + "axi_fifo_mm_s_0/s_axi_aclk", + "microblaze_0_axi_periph/M07_ACLK", + "axis_dwidth_converter_0/aclk", + "axis_dwidth_converter_1/aclk" + ] + }, + "s_axi_aresetn_0_1": { + "ports": [ + "eth_resetn", + "axi_fifo_mm_s_0/s_axi_aresetn", + "microblaze_0_axi_periph/M07_ARESETN", + "axis_dwidth_converter_0/aresetn", + "axis_dwidth_converter_1/aresetn" + ] + }, + "s_axi_aresetn_0_2": { + "ports": [ + "qspi_flash_aresetn", + "qspi_flash/s_axi_aresetn" + ] + }, + "tx_core_reset_0_1": { + "ports": [ + "jesd_tx_core_reset", + "jesd/jesd_tx_core_reset" + ] + }, + "tx_sys_reset_0_1": { + "ports": [ + "jesd_tx_sys_reset", + "jesd/jesd_tx_sys_reset" + ] + } + }, + "addressing": { + "/": { + "memory_maps": { + "dig_rx0_axil": { + "address_blocks": { + "Reg": { + "base_address": "0", + "range": "64K", + "width": "16", + "usage": "register" + } + } + }, + "dig_rx1_axil": { + "address_blocks": { + "Reg": { + "base_address": "0", + "range": "64K", + "width": "16", + "usage": "register" + } + } + }, + "timing_engine_axil": { + "address_blocks": { + "Reg": { + "base_address": "0", + "range": "64K", + "width": "16", + "usage": "register" + } + } + }, + "util_reg_axil": { + "address_blocks": { + "Reg": { + "base_address": "0", + "range": "64K", + "width": "16", + "usage": "register" + } + } + }, + "wf_gen_axil": { + "address_blocks": { + "Reg": { + "base_address": "0", + "range": "64K", + "width": "16", + "usage": "register" + } + } + } + } + }, + "/microblaze_0": { + "address_spaces": { + "Data": { + "segments": { + "SEG_axi_bram_ctrl_0_Mem0": { + "address_block": "/axi_bram_ctrl_0/S_AXI/Mem0", + "offset": "0x00010000", + "range": "32K" + }, + "SEG_axi_bram_ctrl_1_Mem0": { + "address_block": "/axi_bram_ctrl_1/S_AXI/Mem0", + "offset": "0x00020000", + "range": "32K" + }, + "SEG_axi_bram_ctrl_2_Mem0": { + "address_block": "/axi_bram_ctrl_2/S_AXI/Mem0", + "offset": "0x00030000", + "range": "32K" + }, + "SEG_axi_bram_ctrl_3_Mem0": { + "address_block": "/axi_bram_ctrl_3/S_AXI/Mem0", + "offset": "0x00040000", + "range": "32K" + }, + "SEG_axi_ethernet_0_Reg0": { + "address_block": "/axi_ethernet_0/s_axi/Reg0", + "offset": "0x40080000", + "range": "256K" + }, + "SEG_axi_ethernet_0_dma_Reg": { + "address_block": "/axi_ethernet_0_dma/S_AXI_LITE/Reg", + "offset": "0x40040000", + "range": "64K" + }, + "SEG_axi_fifo_mm_s_0_Mem0": { + "address_block": "/axi_fifo_mm_s_0/S_AXI/Mem0", + "offset": "0x400F0000", + "range": "64K", + "offset_high_param": "C_HIGHADDR" + }, + "SEG_axi_quad_spi_0_Reg": { + "address_block": "/axi_quad_spi_0/AXI_LITE/Reg", + "offset": "0x400C0000", + "range": "64K", + "offset_high_param": "C_HIGHADDR" + }, + "SEG_axi_quad_spi_1_Reg": { + "address_block": "/axi_quad_spi_1/AXI_LITE/Reg", + "offset": "0x400D0000", + "range": "64K", + "offset_high_param": "C_HIGHADDR" + }, + "SEG_axi_timer_0_Reg": { + "address_block": "/axi_timer_0/S_AXI/Reg", + "offset": "0x40030000", + "range": "64K" + }, + "SEG_axi_uartlite_0_Reg": { + "address_block": "/axi_uartlite_0/S_AXI/Reg", + "offset": "0x40000000", + "range": "64K" + }, + "SEG_ddr4_0_C0_DDR4_ADDRESS_BLOCK": { + "address_block": "/ddr4_0/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK", + "offset": "0x80000000", + "range": "2G", + "offset_base_param": "C0_DDR4_MEMORY_MAP_BASEADDR", + "offset_high_param": "C0_DDR4_MEMORY_MAP_HIGHADDR" + }, + "SEG_dig_rx1_axil_Reg": { + "address_block": "/dig_rx1_axil/Reg", + "offset": "0x20010000", + "range": "4K" + }, + "SEG_dig_rx_axil_Reg": { + "address_block": "/dig_rx0_axil/Reg", + "offset": "0x20000000", + "range": "4K" + }, + "SEG_dlmb_bram_if_cntlr_Mem": { + "address_block": "/microblaze_0_local_memory/dlmb_bram_if_cntlr/SLMB/Mem", + "offset": "0x00000000", + "range": "32K", + "offset_high_param": "C_HIGHADDR" + }, + "SEG_jesd204_phy_0_Reg": { + "address_block": "/jesd/jesd204_phy_0/s_axi/Reg", + "offset": "0x400E0000", + "range": "64K" + }, + "SEG_jesd204c_0_Reg": { + "address_block": "/jesd/jesd204c_0/s_axi/Reg", + "offset": "0x40060000", + "range": "64K" + }, + "SEG_jesd204c_1_Reg": { + "address_block": "/jesd/jesd204c_1/s_axi/Reg", + "offset": "0x40070000", + "range": "64K" + }, + "SEG_microblaze_0_axi_intc_Reg": { + "address_block": "/microblaze_0_axi_intc/S_AXI/Reg", + "offset": "0x40010000", + "range": "64K" + }, + "SEG_qspi_flash_Reg": { + "address_block": "/qspi_flash/AXI_LITE/Reg", + "offset": "0x40100000", + "range": "64K", + "offset_high_param": "C_HIGHADDR" + }, + "SEG_system_management_wiz_0_Reg": { + "address_block": "/system_management_wiz_0/S_AXI_LITE/Reg", + "offset": "0x40020000", + "range": "64K" + }, + "SEG_timing_engine_axil_Reg": { + "address_block": "/timing_engine_axil/Reg", + "offset": "0x40051000", + "range": "4K" + }, + "SEG_util_reg_axil_Reg": { + "address_block": "/util_reg_axil/Reg", + "offset": "0x40050000", + "range": "4K" + }, + "SEG_wf_gen_axil_Reg": { + "address_block": "/wf_gen_axil/Reg", + "offset": "0x40053000", + "range": "4K" + } + } + }, + "Instruction": { + "segments": { + "SEG_ddr4_0_C0_DDR4_ADDRESS_BLOCK": { + "address_block": "/ddr4_0/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK", + "offset": "0x80000000", + "range": "2G", + "offset_base_param": "C0_DDR4_MEMORY_MAP_BASEADDR", + "offset_high_param": "C0_DDR4_MEMORY_MAP_HIGHADDR" + }, + "SEG_ilmb_bram_if_cntlr_Mem": { + "address_block": "/microblaze_0_local_memory/ilmb_bram_if_cntlr/SLMB/Mem", + "offset": "0x00000000", + "range": "32K", + "offset_high_param": "C_HIGHADDR" + } + } + } + } + }, + "/axi_ethernet_0_dma": { + "address_spaces": { + "Data_SG": { + "segments": { + "SEG_ddr4_0_C0_DDR4_ADDRESS_BLOCK": { + "address_block": "/ddr4_0/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK", + "offset": "0x80000000", + "range": "2G", + "offset_base_param": "C0_DDR4_MEMORY_MAP_BASEADDR", + "offset_high_param": "C0_DDR4_MEMORY_MAP_HIGHADDR" + } + } + }, + "Data_MM2S": { + "segments": { + "SEG_ddr4_0_C0_DDR4_ADDRESS_BLOCK": { + "address_block": "/ddr4_0/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK", + "offset": "0x80000000", + "range": "2G", + "offset_base_param": "C0_DDR4_MEMORY_MAP_BASEADDR", + "offset_high_param": "C0_DDR4_MEMORY_MAP_HIGHADDR" + } + } + }, + "Data_S2MM": { + "segments": { + "SEG_ddr4_0_C0_DDR4_ADDRESS_BLOCK": { + "address_block": "/ddr4_0/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK", + "offset": "0x80000000", + "range": "2G", + "offset_base_param": "C0_DDR4_MEMORY_MAP_BASEADDR", + "offset_high_param": "C0_DDR4_MEMORY_MAP_HIGHADDR" + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/axi_intf.sv b/radar_alinx_kintex.srcs/sources_1/hdl/axi_intf.sv new file mode 100755 index 0000000..9018a6e --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/axi_intf.sv @@ -0,0 +1,281 @@ +interface axi4_intf#( + // Width of S_AXI address araddr + parameter integer AXI_ADDR_WIDTH = 32, + // Width of S_AXI data bus + parameter integer AXI_DATA_WIDTH = 32 + + ) ( + input wire clk, + input wire resetn + ); + + logic [(AXI_ADDR_WIDTH-1):0] araddr; + logic [ 1:0] arburst; + logic [ 3:0] arcache; + logic [ 7:0] arlen; + logic arlock; + logic [ 2:0] arprot; + logic [ 3:0] arqos; + logic arready; + logic [ 2:0] arsize; + logic arvalid; + + logic [(AXI_ADDR_WIDTH-1):0] awaddr; + logic [ 1:0] awburst; + logic [ 3:0] awcache; + logic [ 7:0] awlen; + logic awlock; + logic [ 2:0] awprot; + logic [ 3:0] awqos; + logic awready; + logic [ 2:0] awsize; + logic awvalid; + + logic bready; + logic [1:0] bresp; + logic bvalid; + + logic [(AXI_DATA_WIDTH-1):0] rdata; + logic rlast; + logic rready; + logic [1:0] rresp; + logic rvalid; + + logic [(AXI_DATA_WIDTH-1):0] wdata; + logic wlast; + logic wready; + logic [((AXI_DATA_WIDTH/8)-1):0] wstrb; + logic wvalid; + +modport master ( + input clk, + input resetn, + + output araddr, + output arburst, + output arcache, + output arlen, + output arlock, + output arprot, + output arqos, + input arready, + output arsize, + output arvalid, + + output awaddr, + output awburst, + output awcache, + output awlen, + output awlock, + output awprot, + output awqos, + input awready, + output awsize, + output awvalid, + + output bready, + input bresp, + input bvalid, + + input rdata, + input rlast, + output rready, + input rresp, + input rvalid, + + output wdata, + output wlast, + input wready, + output wstrb, + output wvalid); + +modport slave ( + input clk, + input resetn, + + input araddr, + input arburst, + input arcache, + input arlen, + input arlock, + input arprot, + input arqos, + output arready, + input arsize, + input arvalid, + + input awaddr, + input awburst, + input awcache, + input awlen, + input awlock, + input awprot, + input awqos, + output awready, + input awsize, + input awvalid, + + input bready, + output bresp, + output bvalid, + + output rdata, + output rlast, + input rready, + output rresp, + output rvalid, + + input wdata, + input wlast, + output wready, + input wstrb, + input wvalid); + +endinterface + + +interface axi4l_intf#( + // Width of S_AXI address araddr + parameter integer AXI_ADDR_WIDTH = 32, + // Width of S_AXI data bus + parameter integer AXI_DATA_WIDTH = 32 + + ) ( + input wire clk, + input wire resetn + ); + + logic [(AXI_ADDR_WIDTH-1):0] araddr; + logic [2:0] arprot; + logic arready; + logic arvalid; + + logic [(AXI_ADDR_WIDTH-1):0] awaddr; + logic [2:0] awprot; + logic awready; + logic awvalid; + + logic bready; + logic [1:0] bresp; + logic bvalid; + + logic [(AXI_DATA_WIDTH-1):0] rdata; + logic rready; + logic [1:0] rresp; + logic rvalid; + + logic [(AXI_DATA_WIDTH-1):0] wdata; + logic wready; + logic [((AXI_DATA_WIDTH/8)-1):0] wstrb; + logic wvalid; + +modport master ( + input clk, + input resetn, + + output araddr, + output arprot, + input arready, + output arvalid, + + output awaddr, + output awprot, + input awready, + output awvalid, + + output bready, + input bresp, + input bvalid, + + input rdata, + output rready, + input rresp, + input rvalid, + + output wdata, + input wready, + output wstrb, + output wvalid); + +modport slave ( + input clk, + input resetn, + + input araddr, + input arprot, + output arready, + input arvalid, + + input awaddr, + input awprot, + output awready, + input awvalid, + + input bready, + output bresp, + output bvalid, + + output rdata, + input rready, + output rresp, + output rvalid, + + input wdata, + output wready, + input wstrb, + input wvalid); + +endinterface + +interface axi4s_intf#( + // Width of S_AXI data bus + parameter integer AXI_DATA_WIDTH = 32, + parameter integer AXI_ID_WIDTH = 4, + parameter integer AXI_DEST_WIDTH = 4, + parameter integer AXI_USER_WIDTH = 4 + + ) ( + input wire clk, + input wire resetn + ); + + logic [(AXI_DATA_WIDTH-1):0] tdata; + logic tready; + logic [((AXI_DATA_WIDTH/8)-1):0] tstrb; + logic [((AXI_DATA_WIDTH/8)-1):0] tkeep; + logic tvalid; + logic tlast; + logic [(AXI_ID_WIDTH-1):0] tid; + logic [(AXI_DEST_WIDTH-1):0] tdest; + logic [(AXI_USER_WIDTH-1):0] tuser; + +modport master ( + input clk, + input resetn, + + output tdata, + input tready, + output tstrb, + output tkeep, + output tvalid, + output tlast, + output tid, + output tdest, + output tuser); + +modport slave ( + input clk, + input resetn, + + input tdata, + output tready, + input tstrb, + input tkeep, + input tvalid, + input tlast, + input tid, + input tdest, + input tuser); + + +endinterface \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/axil_slave.v b/radar_alinx_kintex.srcs/sources_1/hdl/axil_slave.v new file mode 100755 index 0000000..5631b3d --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/axil_slave.v @@ -0,0 +1,294 @@ + +`timescale 1 ns / 1 ps + + module axil_slave # + ( + parameter integer DATA_WIDTH = 32, + parameter integer ADDR_WIDTH = 9 + ) + ( + // AXIL Slave + input wire S_AXI_ACLK, + input wire S_AXI_ARESETN, + input wire [ADDR_WIDTH-1 : 0] S_AXI_AWADDR, + input wire [2 : 0] S_AXI_AWPROT, + input wire S_AXI_AWVALID, + output wire S_AXI_AWREADY, + input wire [DATA_WIDTH-1 : 0] S_AXI_WDATA, + input wire [(DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB, + input wire S_AXI_WVALID, + output wire S_AXI_WREADY, + output wire [1 : 0] S_AXI_BRESP, + output wire S_AXI_BVALID, + input wire S_AXI_BREADY, + input wire [ADDR_WIDTH-1 : 0] S_AXI_ARADDR, + input wire [2 : 0] S_AXI_ARPROT, + input wire S_AXI_ARVALID, + output wire S_AXI_ARREADY, + output wire [DATA_WIDTH-1 : 0] S_AXI_RDATA, + output wire [1 : 0] S_AXI_RRESP, + output wire S_AXI_RVALID, + input wire S_AXI_RREADY, + + output wire [ADDR_WIDTH-1 : 0] raddr, + output wire [ADDR_WIDTH-1 : 0] waddr, + output wire wren, + output wire rden, + output wire [DATA_WIDTH-1 : 0] wdata, + input wire [DATA_WIDTH-1 : 0] rdata + ); + + // AXI4LITE signals + reg [ADDR_WIDTH-1 : 0] axi_awaddr; + reg axi_awready; + reg axi_wready; + reg [1 : 0] axi_bresp; + reg axi_bvalid; + reg [ADDR_WIDTH-1 : 0] axi_araddr; + reg axi_arready; + wire [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 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 = (DATA_WIDTH/32) + 1; + localparam integer OPT_MEM_ADDR_BITS = 6; + + wire slv_reg_rden; + wire slv_reg_wren; + wire [DATA_WIDTH-1:0] reg_data_out; + integer byte_index; + reg aw_en; + + + //---------------------------------------------- + //-- AXIL Protocl Implementation + //------------------------------------------------ + 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 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 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; + + // 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; + + // // 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 <= reg_data_out; // register read data + // end + // end + // end + + assign axi_rdata = rdata; + + assign wren = slv_reg_wren; + assign rden = slv_reg_rden; + assign wdata = S_AXI_WDATA; + assign waddr = axi_awaddr; + assign raddr = axi_araddr; + // assign reg_data_out = rdata; + + endmodule diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/digital_rx_chain.v b/radar_alinx_kintex.srcs/sources_1/hdl/digital_rx_chain.v new file mode 100755 index 0000000..bad665b --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/digital_rx_chain.v @@ -0,0 +1,355 @@ +`resetall +`timescale 1ns / 1ps +`default_nettype none + +module digital_rx_chain # +( + parameter CTRL_REG_ADDR = 32'h00000000, + parameter NUM_SAMPLES_REG_ADDR = 32'h00000004, + parameter START_SAMPLE_REG_ADDR = 32'h00000008, + + parameter integer AXI_ADDR_WIDTH = 32, + parameter integer AXI_DATA_WIDTH = 32 +) +( + input wire clk, + + // AXI4L Config Interface + axi4l_intf.slave ctrl_if, + + input wire start_of_pulse, + + // Input Data + input wire in_tvalid, + input wire [63:0] in_tdata_i, + input wire [63:0] in_tdata_q, + + // Output Data + axi4s_intf.master rx_out + +); + +reg out_tvalid_r; +wire out_tlast_r; +wire out_tstart_r; + +// ------------------------------ +// Register Inputs for timing +// ------------------------------ +reg in_tstart_reg; +reg in_tvalid_reg; +reg [63:0] in_tdata_i_reg; +reg [63:0] in_tdata_q_reg; +always @ (posedge clk) begin + in_tstart_reg <= start_of_pulse; + in_tvalid_reg <= in_tvalid; + in_tdata_i_reg <= in_tdata_i; + in_tdata_q_reg <= in_tdata_q; +end + + +// ------------------------------ +// AXIL Decode +// ------------------------------ +wire [AXI_ADDR_WIDTH-1 : 0] raddr; +wire [AXI_ADDR_WIDTH-1 : 0] waddr; +wire rden; +wire wren; +wire [AXI_DATA_WIDTH-1 : 0] wdata; +reg [AXI_DATA_WIDTH-1 : 0] rdata; + + +axil_slave +# ( + .DATA_WIDTH(AXI_DATA_WIDTH), + .ADDR_WIDTH(AXI_ADDR_WIDTH) +) axil_slave_i +( + // AXIL Slave + .S_AXI_ACLK(ctrl_if.clk), + .S_AXI_ARESETN(ctrl_if.resetn), + .S_AXI_AWADDR(ctrl_if.awaddr), + .S_AXI_AWPROT(ctrl_if.awprot), + .S_AXI_AWVALID(ctrl_if.awvalid), + .S_AXI_AWREADY(ctrl_if.awready), + .S_AXI_WDATA(ctrl_if.wdata), + .S_AXI_WSTRB(ctrl_if.wstrb), + .S_AXI_WVALID(ctrl_if.wvalid), + .S_AXI_WREADY(ctrl_if.wready), + .S_AXI_BRESP(ctrl_if.bresp), + .S_AXI_BVALID(ctrl_if.bvalid), + .S_AXI_BREADY(ctrl_if.bready), + .S_AXI_ARADDR(ctrl_if.araddr), + .S_AXI_ARPROT(ctrl_if.arprot), + .S_AXI_ARVALID(ctrl_if.arvalid), + .S_AXI_ARREADY(ctrl_if.arready), + .S_AXI_RDATA(ctrl_if.rdata), + .S_AXI_RRESP(ctrl_if.rresp), + .S_AXI_RVALID(ctrl_if.rvalid), + .S_AXI_RREADY(ctrl_if.rready), + + .raddr(raddr), + .waddr(waddr), + .wren(wren), + .rden(rden), + .wdata(wdata), + .rdata(rdata) +); + +// ------------------------------ +// Config Registers +// ------------------------------ +wire reset; +reg [31:0] reg_ctrl; +reg [15:0] reg_num_samples; +reg [27:0] reg_start_sample; + +always @ (posedge ctrl_if.clk) begin + if (~ctrl_if.resetn) begin + reg_ctrl <= 0; + end else if (wren && waddr[11:0] == CTRL_REG_ADDR) begin + reg_ctrl <= wdata[15:0]; + end +end + +always @ (posedge ctrl_if.clk) begin + if (~ctrl_if.resetn) begin + reg_num_samples <= 0; + end else if (wren && waddr[11:0] == NUM_SAMPLES_REG_ADDR) begin + reg_num_samples <= wdata[15:0]; + end +end + +always @ (posedge ctrl_if.clk) begin + if (~ctrl_if.resetn) begin + reg_start_sample <= 0; + end else if (wren && waddr[11:0] == START_SAMPLE_REG_ADDR) begin + reg_start_sample <= wdata; + end +end + +always @ (posedge ctrl_if.clk) begin + if (rden) begin + if ( raddr[11:0] == CTRL_REG_ADDR ) + rdata <= reg_ctrl; + if ( raddr[11:0] == NUM_SAMPLES_REG_ADDR ) + rdata <= reg_num_samples; + if ( raddr[11:0] == START_SAMPLE_REG_ADDR ) + rdata <= reg_start_sample; + end +end + +assign reset = reg_ctrl[0]; + + +// ------------------------------ +// Event Counter +// ------------------------------ +reg [15:0] event_cnt; + +always @ (posedge clk) begin + if (reset == 1'b1) begin + event_cnt <= 0; + end else begin + if (in_tstart_reg) begin + event_cnt <= event_cnt + 1; + end + end +end + +// ------------------------------ +// Sample gating +// ------------------------------ +reg [16:0] sample_cnt; +reg pulse_active; +reg pulse_active_q; +reg pulse_active_fed; +reg pulse_active_fed_q; + +// Delay event pulse by start sample +reg [27:0] start_sample_cnt; +reg [27:0] start_sample_this_pulse; +reg delay_active; +reg delay_active_q; +reg delay_active_fed; + +always @ (posedge clk) begin + if (reset == 1'b1) begin + start_sample_cnt <= 0; + delay_active <= 0; + end else begin + + delay_active_q <= delay_active; + delay_active_fed <= ~delay_active && delay_active_q; + + if (in_tstart_reg && in_tvalid_reg) begin + start_sample_cnt <= reg_start_sample; + start_sample_this_pulse <= reg_start_sample; + delay_active <= 1; + end + + if (delay_active) begin + start_sample_cnt <= start_sample_cnt - 1; + if (start_sample_cnt == 0) begin + delay_active <= 0; + end + end + + end +end + +always @ (posedge clk) begin + if (reset == 1'b1) begin + sample_cnt <= 0; + pulse_active <= 0; + pulse_active_q <= 0; + pulse_active_fed <= 1; + pulse_active_fed_q <= 1; + + end else begin + + pulse_active_q <= pulse_active; + pulse_active_fed <= ~pulse_active && pulse_active_q; + pulse_active_fed_q <= pulse_active_fed; + + // if (in_tstart_reg && in_tvalid_reg) begin + if (delay_active_fed && in_tvalid_reg) begin + sample_cnt <= 0; + pulse_active <= 1; + end; + + if (out_tvalid_r) begin + sample_cnt <= sample_cnt + 1; + if (sample_cnt == reg_num_samples-1) begin + sample_cnt <= 0; + pulse_active <= 0; + end + end + end +end + +assign out_tlast_r = ((sample_cnt == reg_num_samples-1) && out_tvalid_r) ? 1'b1 : 1'b0; +assign out_tstart_r = ((sample_cnt == 0) && out_tvalid_r) ? 1'b1 : 1'b0; +assign out_tvalid_r = in_tvalid_reg && (pulse_active || delay_active_fed); + +// ------------------------------ +// Buffer +// ------------------------------ +axi4s_intf # ( + .AXI_DATA_WIDTH(128), + .AXI_USER_WIDTH(1) + ) + axis_odec_out ( + .clk(clk), + .resetn(~reset) + ); + + axi4s_intf # ( + .AXI_DATA_WIDTH(128), + .AXI_USER_WIDTH(1) + ) + axis_pulse_buffer_out ( + .clk(clk), + .resetn(~reset) + ); + + axi4s_intf # ( + .AXI_DATA_WIDTH(64), + .AXI_USER_WIDTH(8) + ) + axis_dwidth_conv_out ( + .clk(clk), + .resetn(~reset) + ); + +assign axis_odec_out.tvalid = out_tvalid_r && (pulse_active || delay_active_fed); +assign axis_odec_out.tlast = out_tlast_r; +assign axis_odec_out.tuser = out_tstart_r; + +assign axis_odec_out.tdata[15:0] = in_tdata_i_reg[63:48]; +assign axis_odec_out.tdata[31:16] = in_tdata_q_reg[63:48]; +assign axis_odec_out.tdata[47:32] = in_tdata_i_reg[47:32]; +assign axis_odec_out.tdata[63:48] = in_tdata_q_reg[47:32]; +assign axis_odec_out.tdata[79:64] = in_tdata_i_reg[31:16]; +assign axis_odec_out.tdata[95:80] = in_tdata_q_reg[31:16]; +assign axis_odec_out.tdata[111:96] = in_tdata_i_reg[15:0]; +assign axis_odec_out.tdata[127:112] = in_tdata_q_reg[15:0]; + +//assign axis_odec_out.tdata[15:0] = in_tdata_i_reg[15:0]; +//assign axis_odec_out.tdata[31:16] = in_tdata_q_reg[15:0]; +//assign axis_odec_out.tdata[47:32] = in_tdata_i_reg[31:16]; +//assign axis_odec_out.tdata[63:48] = in_tdata_q_reg[31:16]; +//assign axis_odec_out.tdata[79:64] = in_tdata_i_reg[47:32]; +//assign axis_odec_out.tdata[95:80] = in_tdata_q_reg[47:32]; +//assign axis_odec_out.tdata[111:96] = in_tdata_i_reg[63:48]; +//assign axis_odec_out.tdata[127:112] = in_tdata_q_reg[63:48]; + +// assign axis_odec_out.tdata[63:0] = in_tdata_i_reg[63:0]; +// assign axis_odec_out.tdata[127:64] = in_tdata_q_reg[63:0]; + +pulse_buffer_fifo pulse_buffer_fifo_i ( + .s_axis_aresetn(~reset), + .s_axis_aclk(clk), + + .s_axis_tvalid(axis_odec_out.tvalid), + .s_axis_tready(), + .s_axis_tdata(axis_odec_out.tdata), + .s_axis_tlast(axis_odec_out.tlast), + .s_axis_tuser(axis_odec_out.tuser), + + .m_axis_tvalid(axis_pulse_buffer_out.tvalid), + .m_axis_tready(axis_pulse_buffer_out.tready), + .m_axis_tdata(axis_pulse_buffer_out.tdata), + .m_axis_tlast(axis_pulse_buffer_out.tlast), + .m_axis_tuser(axis_pulse_buffer_out.tuser) +); + +wire [15:0] dwidth_conv_tuser_in; +assign dwidth_conv_tuser_in[15:1] = '0; +assign dwidth_conv_tuser_in[0] = axis_pulse_buffer_out.tuser; + +// This is going from 128 bits to 64 bits +dig_rx_dwidth_converter dig_rx_dwidth_converter_i ( + .aresetn(~reset), + .aclk(clk), + + .s_axis_tvalid(axis_pulse_buffer_out.tvalid), + .s_axis_tready(axis_pulse_buffer_out.tready), + .s_axis_tdata(axis_pulse_buffer_out.tdata), + .s_axis_tlast(axis_pulse_buffer_out.tlast), + .s_axis_tuser(dwidth_conv_tuser_in), + + .m_axis_tvalid(axis_dwidth_conv_out.tvalid), + .m_axis_tready(axis_dwidth_conv_out.tready), + .m_axis_tdata(axis_dwidth_conv_out.tdata), + .m_axis_tlast(axis_dwidth_conv_out.tlast), + .m_axis_tuser(axis_dwidth_conv_out.tuser) +); + +// Now need a clock converter to go to output which is connected directly to eth udp +dig_rx_clock_converter dig_rx_clock_converter_i ( + .s_axis_aresetn(axis_dwidth_conv_out.resetn), + .s_axis_aclk(axis_dwidth_conv_out.clk), + .s_axis_tvalid(axis_dwidth_conv_out.tvalid), + .s_axis_tready(axis_dwidth_conv_out.tready), + .s_axis_tdata(axis_dwidth_conv_out.tdata), + .s_axis_tlast(axis_dwidth_conv_out.tlast), + .s_axis_tuser(axis_dwidth_conv_out.tuser), + + .m_axis_aresetn(rx_out.resetn), + .m_axis_aclk(rx_out.clk), + .m_axis_tvalid(rx_out.tvalid), + .m_axis_tready(rx_out.tready), + .m_axis_tdata(rx_out.tdata), + .m_axis_tlast(rx_out.tlast), + .m_axis_tuser(rx_out.tuser) +); + +assign rx_out.tkeep = '1; +// assign rx_out.tuser = reg_num_samples; +assign rx_out.tdest = 1; + +endmodule + + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/ethernet_top.v b/radar_alinx_kintex.srcs/sources_1/hdl/ethernet_top.v new file mode 100755 index 0000000..f63b451 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/ethernet_top.v @@ -0,0 +1,334 @@ +`resetall +`timescale 1ns / 1ps +`default_nettype none + +module ethernet_top # +( + parameter integer AXI_ADDR_WIDTH = 32, + parameter integer AXI_DATA_WIDTH = 32 +) +( + /* + * Clock: 125MHz LVDS + * Reset: active low + */ + input wire clk_freerun, + input wire reset, + output wire [3:0] eth_clk, + output wire [3:0] eth_resetn, + + input wire [15:0] packet_size, + + axi4s_intf.master rx_udp_0, + axi4s_intf.slave tx_udp_0, + + axi4s_intf.master rx_udp_1, + axi4s_intf.slave tx_udp_1, + + /* + * Ethernet: SFP+ + */ + input wire sfp0_rx_p, + input wire sfp0_rx_n, + output wire sfp0_tx_p, + output wire sfp0_tx_n, + input wire sfp1_rx_p, + input wire sfp1_rx_n, + output wire sfp1_tx_p, + output wire sfp1_tx_n, + input wire sfp2_rx_p, + input wire sfp2_rx_n, + output wire sfp2_tx_p, + output wire sfp2_tx_n, + input wire sfp3_rx_p, + input wire sfp3_rx_n, + output wire sfp3_tx_p, + output wire sfp3_tx_n, + input wire sfp_mgt_refclk_0_p, + input wire sfp_mgt_refclk_0_n, + output wire sfp0_tx_disable_b, + output wire sfp1_tx_disable_b, + output wire sfp2_tx_disable_b, + output wire sfp3_tx_disable_b +); + +// Internal 156.25 MHz clock +wire clk_156mhz_int; +wire rst_156mhz_int; + +// XGMII 10G PHY +assign sfp0_tx_disable_b = 1'b0; +assign sfp1_tx_disable_b = 1'b0; +assign sfp2_tx_disable_b = 1'b0; +assign sfp3_tx_disable_b = 1'b0; + +wire sfp0_tx_clk_int; +wire sfp0_tx_rst_int; +wire [63:0] sfp0_txd_int; +wire [7:0] sfp0_txc_int; +wire sfp0_rx_clk_int; +wire sfp0_rx_rst_int; +wire [63:0] sfp0_rxd_int; +wire [7:0] sfp0_rxc_int; + +wire sfp1_tx_clk_int; +wire sfp1_tx_rst_int; +wire [63:0] sfp1_txd_int; +wire [7:0] sfp1_txc_int; +wire sfp1_rx_clk_int; +wire sfp1_rx_rst_int; +wire [63:0] sfp1_rxd_int; +wire [7:0] sfp1_rxc_int; + +wire sfp2_tx_clk_int; +wire sfp2_tx_rst_int; +wire [63:0] sfp2_txd_int; +wire [7:0] sfp2_txc_int; +wire sfp2_rx_clk_int; +wire sfp2_rx_rst_int; +wire [63:0] sfp2_rxd_int; +wire [7:0] sfp2_rxc_int; + +wire sfp3_tx_clk_int; +wire sfp3_tx_rst_int; +wire [63:0] sfp3_txd_int; +wire [7:0] sfp3_txc_int; +wire sfp3_rx_clk_int; +wire sfp3_rx_rst_int; +wire [63:0] sfp3_rxd_int; +wire [7:0] sfp3_rxc_int; + +assign clk_156mhz_int = sfp0_tx_clk_int; +assign rst_156mhz_int = sfp0_tx_rst_int; + +// assign eth_resetn = !sfp0_tx_rst_int; +// assign eth_clk = sfp0_tx_clk_int; +assign eth_resetn[0] = !sfp0_tx_rst_int; +assign eth_clk[0] = sfp0_tx_clk_int; +assign eth_resetn[1] = !sfp1_tx_rst_int; +assign eth_clk[1] = sfp1_tx_clk_int; +assign eth_resetn[2] = !sfp2_tx_rst_int; +assign eth_clk[2] = sfp2_tx_clk_int; +assign eth_resetn[3] = !sfp3_tx_rst_int; +assign eth_clk[3] = sfp3_tx_clk_int; + +wire sfp0_rx_block_lock; +wire sfp1_rx_block_lock; +wire sfp2_rx_block_lock; +wire sfp3_rx_block_lock; + +wire sfp_mgt_refclk_0; + +wire reset_freerun; + +sync_reset #( + .N(4) +) +sync_reset_freerun_inst ( + .clk(clk_freerun), + .rst(reset), + .out(reset_freerun) +); + +IBUFDS_GTE3 ibufds_gte4_sfp_mgt_refclk_0_inst ( + .I (sfp_mgt_refclk_0_p), + .IB (sfp_mgt_refclk_0_n), + .CEB (1'b0), + .O (sfp_mgt_refclk_0), + .ODIV2 () +); + + +eth_xcvr_phy_quad_wrapper +sfp_phy_inst ( + .xcvr_ctrl_clk(clk_freerun), + .xcvr_ctrl_rst(reset_freerun), + + /* + * Common + */ + .xcvr_gtpowergood_out(), + + /* + * PLL + */ + .xcvr_gtrefclk00_in(sfp_mgt_refclk_0), + + /* + * Serial data + */ + .xcvr_txp({sfp3_tx_p, sfp2_tx_p, sfp1_tx_p, sfp0_tx_p}), + .xcvr_txn({sfp3_tx_n, sfp2_tx_n, sfp1_tx_n, sfp0_tx_n}), + .xcvr_rxp({sfp3_rx_p, sfp2_rx_p, sfp1_rx_p, sfp0_rx_p}), + .xcvr_rxn({sfp3_rx_n, sfp2_rx_n, sfp1_rx_n, sfp0_rx_n}), + + /* + * PHY connections + */ + .phy_1_tx_clk(sfp0_tx_clk_int), + .phy_1_tx_rst(sfp0_tx_rst_int), + .phy_1_xgmii_txd(sfp0_txd_int), + .phy_1_xgmii_txc(sfp0_txc_int), + .phy_1_rx_clk(sfp0_rx_clk_int), + .phy_1_rx_rst(sfp0_rx_rst_int), + .phy_1_xgmii_rxd(sfp0_rxd_int), + .phy_1_xgmii_rxc(sfp0_rxc_int), + .phy_1_tx_bad_block(), + .phy_1_rx_error_count(), + .phy_1_rx_bad_block(), + .phy_1_rx_sequence_error(), + .phy_1_rx_block_lock(sfp0_rx_block_lock), + .phy_1_rx_status(), + .phy_1_cfg_tx_prbs31_enable(1'b0), + .phy_1_cfg_rx_prbs31_enable(1'b0), + + .phy_2_tx_clk(sfp1_tx_clk_int), + .phy_2_tx_rst(sfp1_tx_rst_int), + .phy_2_xgmii_txd(sfp1_txd_int), + .phy_2_xgmii_txc(sfp1_txc_int), + .phy_2_rx_clk(sfp1_rx_clk_int), + .phy_2_rx_rst(sfp1_rx_rst_int), + .phy_2_xgmii_rxd(sfp1_rxd_int), + .phy_2_xgmii_rxc(sfp1_rxc_int), + .phy_2_tx_bad_block(), + .phy_2_rx_error_count(), + .phy_2_rx_bad_block(), + .phy_2_rx_sequence_error(), + .phy_2_rx_block_lock(sfp1_rx_block_lock), + .phy_2_rx_status(), + .phy_2_cfg_tx_prbs31_enable(1'b0), + .phy_2_cfg_rx_prbs31_enable(1'b0), + + .phy_3_tx_clk(sfp2_tx_clk_int), + .phy_3_tx_rst(sfp2_tx_rst_int), + .phy_3_xgmii_txd(sfp2_txd_int), + .phy_3_xgmii_txc(sfp2_txc_int), + .phy_3_rx_clk(sfp2_rx_clk_int), + .phy_3_rx_rst(sfp2_rx_rst_int), + .phy_3_xgmii_rxd(sfp2_rxd_int), + .phy_3_xgmii_rxc(sfp2_rxc_int), + .phy_3_tx_bad_block(), + .phy_3_rx_error_count(), + .phy_3_rx_bad_block(), + .phy_3_rx_sequence_error(), + .phy_3_rx_block_lock(sfp2_rx_block_lock), + .phy_3_rx_status(), + .phy_3_cfg_tx_prbs31_enable(1'b0), + .phy_3_cfg_rx_prbs31_enable(1'b0), + + .phy_4_tx_clk(sfp3_tx_clk_int), + .phy_4_tx_rst(sfp3_tx_rst_int), + .phy_4_xgmii_txd(sfp3_txd_int), + .phy_4_xgmii_txc(sfp3_txc_int), + .phy_4_rx_clk(sfp3_rx_clk_int), + .phy_4_rx_rst(sfp3_rx_rst_int), + .phy_4_xgmii_rxd(sfp3_rxd_int), + .phy_4_xgmii_rxc(sfp3_rxc_int), + .phy_4_tx_bad_block(), + .phy_4_rx_error_count(), + .phy_4_rx_bad_block(), + .phy_4_rx_sequence_error(), + .phy_4_rx_block_lock(sfp3_rx_block_lock), + .phy_4_rx_status(), + .phy_4_cfg_tx_prbs31_enable(1'b0), + .phy_4_cfg_rx_prbs31_enable(1'b0) +); + +assign sfp2_txd_int = 64'h0707070707070707; +assign sfp2_txc_int = 8'hff; +assign sfp3_txd_int = 64'h0707070707070707; +assign sfp3_txc_int = 8'hff; + +fpga_core # ( + .IP_ADDR(2), + .PORT_IN(1234), + .MAC_ADDR(48'h02_00_00_00_00_00) +) +core_inst_0 ( + /* + * Clock: 156.25 MHz + * Synchronous reset + */ + // .clk(clk_156mhz_int), + // .rst(rst_156mhz_int), + .clk(sfp0_tx_clk_int), + .rst(sfp0_tx_rst_int), + .packet_size(packet_size), + + .rx_fifo_udp_payload_axis_tdata(rx_udp_0.tdata), + .rx_fifo_udp_payload_axis_tkeep(rx_udp_0.tkeep), + .rx_fifo_udp_payload_axis_tvalid(rx_udp_0.tvalid), + .rx_fifo_udp_payload_axis_tready(rx_udp_0.tready), + .rx_fifo_udp_payload_axis_tlast(rx_udp_0.tlast), + .rx_fifo_udp_payload_axis_tuser(rx_udp_0.tuser), + + .tx_fifo_udp_payload_axis_tdata(tx_udp_0.tdata), + .tx_fifo_udp_payload_axis_tkeep(tx_udp_0.tkeep), + .tx_fifo_udp_payload_axis_tvalid(tx_udp_0.tvalid), + .tx_fifo_udp_payload_axis_tready(tx_udp_0.tready), + .tx_fifo_udp_payload_axis_tlast(tx_udp_0.tlast), + .tx_fifo_udp_payload_axis_tuser(tx_udp_0.tuser), + .tx_fifo_udp_payload_axis_tdest(tx_udp_0.tdest), + + /* + * Ethernet: SFP+ + */ + .sfp_tx_clk(sfp0_tx_clk_int), + .sfp_tx_rst(sfp0_tx_rst_int), + .sfp_txd(sfp0_txd_int), + .sfp_txc(sfp0_txc_int), + .sfp_rx_clk(sfp0_rx_clk_int), + .sfp_rx_rst(sfp0_rx_rst_int), + .sfp_rxd(sfp0_rxd_int), + .sfp_rxc(sfp0_rxc_int) +); + +fpga_core # ( + .IP_ADDR(3), + .PORT_IN(1235), + .MAC_ADDR(48'h03_00_00_00_00_00) +) +core_inst_1 ( + /* + * Clock: 156.25 MHz + * Synchronous reset + */ + // .clk(clk_156mhz_int), + // .rst(rst_156mhz_int), + .clk(sfp1_tx_clk_int), + .rst(sfp1_tx_rst_int), + .packet_size(packet_size), + + .rx_fifo_udp_payload_axis_tdata(rx_udp_1.tdata), + .rx_fifo_udp_payload_axis_tkeep(rx_udp_1.tkeep), + .rx_fifo_udp_payload_axis_tvalid(rx_udp_1.tvalid), + .rx_fifo_udp_payload_axis_tready(rx_udp_1.tready), + .rx_fifo_udp_payload_axis_tlast(rx_udp_1.tlast), + .rx_fifo_udp_payload_axis_tuser(rx_udp_1.tuser), + + .tx_fifo_udp_payload_axis_tdata(tx_udp_1.tdata), + .tx_fifo_udp_payload_axis_tkeep(tx_udp_1.tkeep), + .tx_fifo_udp_payload_axis_tvalid(tx_udp_1.tvalid), + .tx_fifo_udp_payload_axis_tready(tx_udp_1.tready), + .tx_fifo_udp_payload_axis_tlast(tx_udp_1.tlast), + .tx_fifo_udp_payload_axis_tuser(tx_udp_1.tuser), + .tx_fifo_udp_payload_axis_tdest(tx_udp_1.tdest), + + /* + * Ethernet: SFP+ + */ + .sfp_tx_clk(sfp1_tx_clk_int), + .sfp_tx_rst(sfp1_tx_rst_int), + .sfp_txd(sfp1_txd_int), + .sfp_txc(sfp1_txc_int), + .sfp_rx_clk(sfp1_rx_clk_int), + .sfp_rx_rst(sfp1_rx_rst_int), + .sfp_rxd(sfp1_rxd_int), + .sfp_rxc(sfp1_rxc_int) +); + + +endmodule + + +`resetall \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/spi.v b/radar_alinx_kintex.srcs/sources_1/hdl/spi.v new file mode 100755 index 0000000..b8e8d0a --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/spi.v @@ -0,0 +1,154 @@ +`resetall +`timescale 1ns / 1ps +`default_nettype none + +module simple_spi # +( + parameter integer AXI_ADDR_WIDTH = 32, + parameter integer AXI_DATA_WIDTH = 32 +) +( + input wire clk, + input wire reset, + + // AXI4L Config Interface + axi4l_intf.slave ctrl_if, + + output wire [31:0] ss, + inout wire mosi, + input wire miso, + output wire sck +); + +// ------------------------------ +// AXIL Decode +// ------------------------------ +wire [AXI_ADDR_WIDTH-1 : 0] raddr; +wire [AXI_ADDR_WIDTH-1 : 0] waddr; +wire rden; +wire wren; +wire [AXI_DATA_WIDTH-1 : 0] wdata; +reg [AXI_DATA_WIDTH-1 : 0] rdata; + + +axil_slave +# ( + .DATA_WIDTH(AXI_DATA_WIDTH), + .ADDR_WIDTH(AXI_ADDR_WIDTH) +) axil_slave_i +( + // AXIL Slave + .S_AXI_ACLK(ctrl_if.clk), + .S_AXI_ARESETN(ctrl_if.resetn), + .S_AXI_AWADDR(ctrl_if.awaddr), + .S_AXI_AWPROT(ctrl_if.awprot), + .S_AXI_AWVALID(ctrl_if.awvalid), + .S_AXI_AWREADY(ctrl_if.awready), + .S_AXI_WDATA(ctrl_if.wdata), + .S_AXI_WSTRB(ctrl_if.wstrb), + .S_AXI_WVALID(ctrl_if.wvalid), + .S_AXI_WREADY(ctrl_if.wready), + .S_AXI_BRESP(ctrl_if.bresp), + .S_AXI_BVALID(ctrl_if.bvalid), + .S_AXI_BREADY(ctrl_if.bready), + .S_AXI_ARADDR(ctrl_if.araddr), + .S_AXI_ARPROT(ctrl_if.arprot), + .S_AXI_ARVALID(ctrl_if.arvalid), + .S_AXI_ARREADY(ctrl_if.arready), + .S_AXI_RDATA(ctrl_if.rdata), + .S_AXI_RRESP(ctrl_if.rresp), + .S_AXI_RVALID(ctrl_if.rvalid), + .S_AXI_RREADY(ctrl_if.rready), + + .raddr(raddr), + .waddr(waddr), + .wren(wren), + .rden(rden), + .wdata(wdata), + .rdata(rdata) +); + +// ------------------------------ +// Config Registers +// ------------------------------ +reg [31:0] clk_div; +reg [7:0] data; +reg [31:0] ss; +reg [24:0] pwm_pulsewidth; + +always @ (posedge clk) begin + if (reset) begin + scratch <= 0; + end else if (wren && waddr[11:0] == 'h004) begin + scratch <= wdata; + end +end + +always @ (posedge clk) begin + if (reset) begin + gpo_reg <= 0; + end else if (wren && waddr[11:0] == 'h008) begin + gpo_reg <= wdata; + end +end + +always @ (posedge clk) begin + if (reset) begin + pwm_period <= 1500000; + end else if (wren && waddr[11:0] == 'h010) begin + pwm_period <= wdata; + end +end + +always @ (posedge clk) begin + if (reset) begin + pwm_pulsewidth <= 500000; + end else if (wren && waddr[11:0] == 'h014) begin + pwm_pulsewidth <= wdata; + end +end + +always @ (posedge clk) begin + if (rden) begin + if (raddr[11:0] == 'h000) + rdata <= 'h12345678; + if (raddr[11:0] == 'h004) + rdata <= scratch; + if (raddr[11:0] == 'h008) + rdata <= gpo_reg; + if (raddr[11:0] == 'h00C) + rdata <= gpi; + end +end + +assign gpo = gpo_reg; + +// ------------------------------ +// Fan PWM +// ------------------------------ +reg [24:0] pwm_cnt; +reg pwm_out; + +assign fan_pwm = pwm_out; + +always @ (posedge clk) begin + if (pwm_cnt < pwm_period) begin + pwm_cnt <= pwm_cnt + 1; + end else begin + pwm_cnt <= 0; + end + + if (pwm_cnt < pwm_pulsewidth) begin + pwm_out <= 1'bz; + end else begin + pwm_out <= 1'b0; + end + +end + + + +endmodule + + +`resetall \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/timing_engine.v b/radar_alinx_kintex.srcs/sources_1/hdl/timing_engine.v new file mode 100755 index 0000000..9c70a7a --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/timing_engine.v @@ -0,0 +1,389 @@ +`resetall +`timescale 1ns / 1ps +`default_nettype none + +module timing_engine # +( + parameter integer AXI_ADDR_WIDTH = 32, + parameter integer AXI_DATA_WIDTH = 32, + parameter NUM_RX = 2 +) +( + input wire clk, + input wire pps, + + + // AXI4L Config Interface + axi4l_intf.slave ctrl_if, + + output wire start_of_cpi, + output wire start_of_pulse, + + axi4s_intf.master hdr_out[NUM_RX] +); + +// ------------------------------ +// AXIL Decode +// ------------------------------ +wire [AXI_ADDR_WIDTH-1 : 0] raddr; +wire [AXI_ADDR_WIDTH-1 : 0] waddr; +wire rden; +wire wren; +wire [AXI_DATA_WIDTH-1 : 0] wdata; +reg [AXI_DATA_WIDTH-1 : 0] rdata; + + +axil_slave +# ( + .DATA_WIDTH(AXI_DATA_WIDTH), + .ADDR_WIDTH(AXI_ADDR_WIDTH) +) axil_slave_i +( + // AXIL Slave + .S_AXI_ACLK(ctrl_if.clk), + .S_AXI_ARESETN(ctrl_if.resetn), + .S_AXI_AWADDR(ctrl_if.awaddr), + .S_AXI_AWPROT(ctrl_if.awprot), + .S_AXI_AWVALID(ctrl_if.awvalid), + .S_AXI_AWREADY(ctrl_if.awready), + .S_AXI_WDATA(ctrl_if.wdata), + .S_AXI_WSTRB(ctrl_if.wstrb), + .S_AXI_WVALID(ctrl_if.wvalid), + .S_AXI_WREADY(ctrl_if.wready), + .S_AXI_BRESP(ctrl_if.bresp), + .S_AXI_BVALID(ctrl_if.bvalid), + .S_AXI_BREADY(ctrl_if.bready), + .S_AXI_ARADDR(ctrl_if.araddr), + .S_AXI_ARPROT(ctrl_if.arprot), + .S_AXI_ARVALID(ctrl_if.arvalid), + .S_AXI_ARREADY(ctrl_if.arready), + .S_AXI_RDATA(ctrl_if.rdata), + .S_AXI_RRESP(ctrl_if.rresp), + .S_AXI_RVALID(ctrl_if.rvalid), + .S_AXI_RREADY(ctrl_if.rready), + + .raddr(raddr), + .waddr(waddr), + .wren(wren), + .rden(rden), + .wdata(wdata), + .rdata(rdata) +); + +// ------------------------------ +// Config Registers +// ------------------------------ +wire reset; +assign reset = ~ctrl_if.resetn; +reg [31:0] reg_ctrl; +reg [31:0] reg_pri; +reg [31:0] reg_num_pulses; +reg [31:0] reg_inter_cpi; +reg [64:0] system_time; +reg [64:0] pps_frac_sec; +reg [32:0] pps_sec; +reg [32:0] reg_pps_sec_set; +reg reg_pps_set; +reg hdr_bram_we; + +always @ (posedge ctrl_if.clk) begin + if (reset) begin + reg_ctrl <= 0; + end else if (wren && waddr[11:0] == 'h000) begin + reg_ctrl <= wdata; + end +end + +always @ (posedge ctrl_if.clk) begin + if (reset) begin + reg_pri <= 0; + end else if (wren && waddr[11:0] == 'h004) begin + reg_pri <= wdata; + end +end + +always @ (posedge ctrl_if.clk) begin + if (reset) begin + reg_num_pulses <= 0; + end else if (wren && waddr[11:0] == 'h008) begin + reg_num_pulses <= wdata; + end +end + +always @ (posedge ctrl_if.clk) begin + if (reset) begin + reg_inter_cpi <= 0; + end else if (wren && waddr[11:0] == 'h010) begin + reg_inter_cpi <= wdata; + end +end + +always @ (posedge ctrl_if.clk) begin + if (reset) begin + reg_pps_sec_set <= 0; + reg_pps_set <= 0; + end else if (wren && waddr[11:0] == 'h014) begin + reg_pps_sec_set <= wdata; + reg_pps_set <= 1; + end else begin + reg_pps_set <= 0; + end +end + +always @ (posedge ctrl_if.clk) begin + if (wren && waddr[11:10] == 2'b11) begin + hdr_bram_we <= 1; + end else begin + hdr_bram_we <= 0; + end +end + +always @ (posedge ctrl_if.clk) begin + if (rden) begin + if (raddr[11:0] == 'h000) + rdata <= reg_ctrl; + if (raddr[11:0] == 'h004) + rdata <= reg_pri; + if (raddr[11:0] == 'h008) + rdata <= reg_num_pulses; + if (raddr[11:0] == 'h00C) + rdata <= reg_inter_cpi; + end +end + +// ------------------------------ +// Timestamping +// ------------------------------ +reg [64:0] system_time_start_of_cpi; +reg [64:0] pps_sec_start_of_cpi; +reg [64:0] pps_frac_sec_start_of_cpi; + + +reg [15:0] pps_pipe; +reg pps_debounce; +reg pps_q; +reg pps_q2; +reg pps_red; + +always @ (posedge clk) begin + pps_pipe <= {pps_pipe[14:0], pps}; + pps_debounce = |pps_pipe; + pps_q <= pps_debounce; + pps_q2 <= pps_q; + pps_red <= !pps_q2 & pps_q; +end + +always @ (posedge clk) begin + system_time <= system_time + 1; + + if (start_of_cpi) begin + system_time_start_of_cpi <= system_time; + pps_frac_sec_start_of_cpi <= pps_frac_sec; + pps_sec_start_of_cpi <= pps_sec; + end + + // Fractional seconds rolls over every time PPS strobes + if (pps_red) begin + pps_frac_sec <= 0; + end else begin + pps_frac_sec <= pps_frac_sec + 1; + end + + if (reg_pps_set) begin + pps_sec <= reg_pps_sec_set; + end else if (pps_red) begin + pps_sec <= pps_sec + 1; + end + +end + +// ------------------------------ +// Header Generation +// ------------------------------ +wire start_of_cpi_hdr_clk; + +xpm_cdc_pulse #( + .RST_USED(0) +) +xpm_cdc_pulse_inst ( + .src_clk(clk), + .src_pulse(start_of_cpi_stretch), + .dest_clk(hdr_out[0].clk), + .dest_pulse(start_of_cpi_hdr_clk) +); + +reg [7:0] hdr_count; +reg hdr_active; +reg hdr_active_q; +reg hdr_active_q2; +reg hdr_active_q3; +reg [63:0] hdr_bram_out; +reg [63:0] hdr_data; +wire hdr_tlast; +reg hdr_tlast_q; +reg hdr_tlast_q2; +reg hdr_tlast_q3; + +always @ (posedge hdr_out[0].clk) begin + if (rst == 1'b1) begin + hdr_count <= 0; + hdr_active <= 0; + end else begin + if (start_of_cpi_hdr_clk) begin + hdr_active <= 1; + hdr_count <= 0; + end + + if (hdr_active) begin + hdr_count <= hdr_count + 1; + if (hdr_count == 127) begin + hdr_active <= 0; + end + end + + hdr_active_q <= hdr_active; + hdr_active_q2 <= hdr_active_q; + hdr_active_q3 <= hdr_active_q2; + + hdr_tlast_q <= hdr_tlast; + hdr_tlast_q2 <= hdr_tlast_q; + hdr_tlast_q3 <= hdr_tlast_q2; + + + if (hdr_count == 6) begin // index 3 of header after accounting for latency (64 bit words) + hdr_data <= {32'h00000000, pps_sec_start_of_cpi}; + end else if (hdr_count == 7) begin + hdr_data <= pps_frac_sec_start_of_cpi; + end else if (hdr_count == 8) begin + hdr_data <= system_time_start_of_cpi; + end else begin + hdr_data <= hdr_bram_out; + end + + end +end + +assign hdr_tlast = (hdr_count == 127) ? 1 : 0; + +hdr_mem hdr_mem_i ( + .clka(ctrl_if.clk), + .ena(1'b1), + .wea(hdr_bram_we), + .addra(waddr[9:2]), + .dina(wdata), + + .clkb(hdr_out[0].clk), + .enb(1'b1), + .addrb(hdr_count), + .doutb(hdr_bram_out) +); + + +genvar i; +generate + for (i = 0; i < NUM_RX; i = i + 1) begin + hdr_fifo hdr_fifo_i ( + .s_axis_aresetn(rstn), + .s_axis_aclk(hdr_out[i].clk), + + .s_axis_tvalid(hdr_active_q3), + .s_axis_tready(), + .s_axis_tdata(hdr_data), + .s_axis_tlast(hdr_tlast_q3), + + .m_axis_tvalid(hdr_out[i].tvalid), + .m_axis_tready(hdr_out[i].tready), + .m_axis_tdata(hdr_out[i].tdata), + .m_axis_tlast(hdr_out[i].tlast) + ); + + assign hdr_out[i].tkeep = '1; + assign hdr_out[i].tuser = 64; + assign hdr_out[i].tdest = 0; + end +endgenerate + +// hdr_fifo hdr_fifo_i ( +// .s_axis_aresetn(rstn), +// .s_axis_aclk(hdr_out.clk), + +// .s_axis_tvalid(hdr_active_q3), +// .s_axis_tready(), +// .s_axis_tdata(hdr_data), +// .s_axis_tlast(hdr_tlast_q3), + +// .m_axis_tvalid(hdr_out.tvalid), +// .m_axis_tready(hdr_out.tready), +// .m_axis_tdata(hdr_out.tdata), +// .m_axis_tlast(hdr_out.tlast) +// ); + +// assign hdr_out.tkeep = '1; +// assign hdr_out.tuser = 64; +// assign hdr_out.tdest = 0; + +// ------------------------------ +// Timing +// ------------------------------ +wire rst; +wire rstn; + +reg [31:0] pri_cnt; +reg [31:0] pulse_cnt; +wire inter_cpi_active; +reg start_of_pulse_reg; +reg start_of_cpi_reg; +reg [3:0] start_of_cpi_pipe; +wire start_of_cpi_stretch; + +assign rst = reg_ctrl[0]; +assign rstn = ~rst; +assign start_of_cpi = start_of_cpi_reg; +assign start_of_pulse = start_of_pulse_reg; + +assign inter_cpi_active = (pulse_cnt < reg_num_pulses) ? 0 : 1; +assign start_of_cpi_stretch = |start_of_cpi_pipe; + +always @ (posedge clk) begin + if (rst == 1'b1) begin + pri_cnt <= 0; + pulse_cnt <= 0; + start_of_pulse_reg = 1'b0; + end else begin + + start_of_cpi_pipe <= {start_of_cpi_pipe[2:0], start_of_cpi}; + + start_of_pulse_reg = 1'b0; + start_of_cpi_reg = 1'b0; + pri_cnt <= pri_cnt + 1; + + if (inter_cpi_active == 0) begin + + if (pri_cnt == 1) begin + start_of_pulse_reg = 1'b1; + if (pulse_cnt == 0) begin + start_of_cpi_reg = 1'b1; + end + end + + if (pri_cnt == reg_pri) begin + pri_cnt <= 0; + pulse_cnt <= pulse_cnt + 1; + end + + end else begin + + if (pri_cnt == reg_inter_cpi) begin + pri_cnt <= 0; + pulse_cnt <= 0; + end + end + + end +end + + +endmodule + + +`resetall \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/top.v b/radar_alinx_kintex.srcs/sources_1/hdl/top.v new file mode 100755 index 0000000..e30776e --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/top.v @@ -0,0 +1,876 @@ +`timescale 1 ps / 1 ps + +module top # +( + parameter NUM_RX = 2 +) +( + input wire clk_200_n, + input wire clk_200_p, + + output wire ddr_act_n, + output wire [16:0] ddr_adr, + output wire [1:0] ddr_ba, + output wire [0:0] ddr_bg, + output wire [0:0] ddr_ck_c, + output wire [0:0] ddr_ck_t, + output wire [0:0] ddr_cke, + output wire [0:0] ddr_cs_n, + inout wire [7:0] ddr_dm_n, + inout wire [63:0] ddr_dq, + inout wire [7:0] ddr_dqs_c, + inout wire [7:0] ddr_dqs_t, + output wire [0:0] ddr_odt, + output wire ddr_reset_n, + + output wire mdc, + inout wire mdio, + output wire phy_rst_n, + + input wire [3:0] rgmii_rd, + input wire rgmii_rx_ctl, + input wire rgmii_rxc, + output wire [3:0] rgmii_td, + output wire rgmii_tx_ctl, + output wire rgmii_txc, + + input wire uart_rxd, + output wire uart_txd, + + output wire [3:0] leds, + output wire fan_pwm, + output wire fmc_power_en, + input wire pps, + + // RF Control + output wire tx0_rf_attn_sin, //ADRF5730 + output wire tx0_rf_attn_clk, //ADRF5730 + output wire tx0_rf_attn_le, //ADRF5730 + output wire tx1_rf_attn_sin, //ADRF5730 + output wire tx1_rf_attn_clk, //ADRF5730 + output wire tx1_rf_attn_le, //ADRF5730 + output wire txlo_drv_en, + + output wire rx0_rf_attn_sin, //ADRF5721 + output wire rx0_rf_attn_clk, //ADRF5721 + output wire rx0_rf_attn_le, //ADRF5721 + output wire rx0_if_attn_sin, //HMC624 + output wire rx0_if_attn_clk, //HMC624 + output wire rx0_if_attn_le, //HMC624 + output wire rx0_lna_en, + + output wire rx1_rf_attn_sin, //ADRF5721 + output wire rx1_rf_attn_clk, //ADRF5721 + output wire rx1_rf_attn_le, //ADRF5721 + output wire rx1_if_attn_sin, //HMC624 + output wire rx1_if_attn_clk, //HMC624 + output wire rx1_if_attn_le, //HMC624 + output wire rx1_lna_en, + + // Ethernet: SFP+ + input wire sfp0_rx_p, + input wire sfp0_rx_n, + output wire sfp0_tx_p, + output wire sfp0_tx_n, + input wire sfp1_rx_p, + input wire sfp1_rx_n, + output wire sfp1_tx_p, + output wire sfp1_tx_n, + input wire sfp2_rx_p, + input wire sfp2_rx_n, + output wire sfp2_tx_p, + output wire sfp2_tx_n, + input wire sfp3_rx_p, + input wire sfp3_rx_n, + output wire sfp3_tx_p, + output wire sfp3_tx_n, + input wire sfp_mgt_refclk_0_p, + input wire sfp_mgt_refclk_0_n, + output wire sfp0_tx_disable_b, + output wire sfp1_tx_disable_b, + output wire sfp2_tx_disable_b, + output wire sfp3_tx_disable_b, + + // FMC AD9081 + // SPI0 - To AD9081 + // SPI1 - To Clk Gen HMC7044LP10BE + inout wire fmc_spi0_mosi, + inout wire fmc_spi0_miso, + inout wire fmc_spi0_sck, + inout wire fmc_spi0_ss, + + inout wire fmc_spi1_mosi, + inout wire fmc_spi1_sck, + inout wire fmc_spi1_ss, + + input wire [7:0] jesd_rxn_in, + input wire [7:0] jesd_rxp_in, + output wire [7:0] jesd_txn_out, + output wire [7:0] jesd_txp_out, + + input wire jesd_sysref_p, + input wire jesd_sysref_n, + + input wire jesd_core_clk_p, + input wire jesd_core_clk_n, + + input wire jesd_qpll0_refclk_p, + input wire jesd_qpll0_refclk_n, + + output wire resetb + +); + wire mdio_mdio_i; + wire mdio_mdio_o; + wire mdio_mdio_t; + + wire fmc_spi0_io0_i; + wire fmc_spi0_io0_o; + wire fmc_spi0_io0_t; + wire fmc_spi0_io1_i; + wire fmc_spi0_io1_o; + wire fmc_spi0_io1_t; + wire fmc_spi0_sck_i; + wire fmc_spi0_sck_o; + wire fmc_spi0_sck_t; + wire fmc_spi0_ss_i; + wire fmc_spi0_ss_o; + wire fmc_spi0_ss_t; + + wire fmc_spi1_io0_i; + wire fmc_spi1_io0_o; + wire fmc_spi1_io0_t; + wire fmc_spi1_io1_i; + wire fmc_spi1_io1_o; + wire fmc_spi1_io1_t; + wire fmc_spi1_sck_i; + wire fmc_spi1_sck_o; + wire fmc_spi1_sck_t; + wire [1:0]fmc_spi1_ss_i; + wire [1:0]fmc_spi1_ss_o; + wire fmc_spi1_ss_t; + + wire ddr_init_calib_complete; + wire mb_axi_clk; + wire mb_axi_aresetn; + wire mb_axi_reset; + + wire common0_qpll1_lock_out; + wire common1_qpll1_lock_out; + + wire jesd_axis_tx_aresetn; + wire jesd_axis_rx_aresetn; + wire [255:0]jesd_axis_rx_cmd_tdata; + wire jesd_axis_rx_cmd_tready; + wire [7:0]jesd_axis_rx_cmd_tuser; + wire jesd_axis_rx_cmd_tvalid; + wire [511:0]jesd_axis_rx_tdata; + wire jesd_axis_rx_tvalid; + wire [255:0]jesd_axis_tx_cmd_tdata; + wire jesd_axis_tx_cmd_tready; + wire jesd_axis_tx_cmd_tvalid; + wire [511:0]jesd_axis_tx_tdata; + wire jesd_axis_tx_tready; + + wire jesd_rx_core_reset; + wire jesd_rx_sys_reset; + wire jesd_tx_core_reset; + wire jesd_tx_sys_reset; + wire jesd_core_clk; + wire jesd_core_clk_in; + + wire [14:0] dac0_wf_bram_addr; + wire dac0_wf_bram_clk; + wire [31:0] dac0_wf_bram_din; + wire [31:0] dac0_wf_bram_dout; + wire dac0_wf_bram_en; + wire dac0_wf_bram_rst; + wire [3:0] dac0_wf_bram_we; + + wire [14:0] dac1_wf_bram_addr; + wire dac1_wf_bram_clk; + wire [31:0] dac1_wf_bram_din; + wire [31:0] dac1_wf_bram_dout; + wire dac1_wf_bram_en; + wire dac1_wf_bram_rst; + wire [3:0] dac1_wf_bram_we; + + wire [14:0] dac2_wf_bram_addr; + wire dac2_wf_bram_clk; + wire [31:0] dac2_wf_bram_din; + wire [31:0] dac2_wf_bram_dout; + wire dac2_wf_bram_en; + wire dac2_wf_bram_rst; + wire [3:0] dac2_wf_bram_we; + + wire [14:0] dac3_wf_bram_addr; + wire dac3_wf_bram_clk; + wire [31:0] dac3_wf_bram_din; + wire [31:0] dac3_wf_bram_dout; + wire dac3_wf_bram_en; + wire dac3_wf_bram_rst; + wire [3:0] dac3_wf_bram_we; + + wire start_of_cpi; + wire start_of_pulse; + + wire [3:0] eth_clk; + wire [3:0] eth_resetn; + wire ext_reset_in_200; + // ------------------------------ + // Buffers + // ------------------------------ + IBUFDS #( + .DIFF_TERM("TRUE"), // Differential Termination + .IBUF_LOW_PWR("FALSE"), // Low power="TRUE", Highest performance="FALSE" + .IOSTANDARD("LVDS") // Specify the input I/O standard + ) core_clk_ibufds_c ( + .I (jesd_core_clk_p), + .IB (jesd_core_clk_n), + .O (jesd_core_clk_in) + ); + + BUFG BUFG_inst ( + .O(jesd_core_clk), + .I(jesd_core_clk_in) + ); + + IOBUF mdio_mdio_iobuf + (.I(mdio_mdio_o), + .IO(mdio), + .O(mdio_mdio_i), + .T(mdio_mdio_t)); + + IOBUF fmc_spi0_io0_iobuf + (.I(fmc_spi0_io0_o), + .IO(fmc_spi0_mosi), + .O(fmc_spi0_io0_i), + .T(fmc_spi0_io0_t)); + IOBUF fmc_spi0_io1_iobuf + (.I(fmc_spi0_io1_o), + .IO(fmc_spi0_miso), + .O(fmc_spi0_io1_i), + .T(fmc_spi0_io1_t)); + IOBUF fmc_spi0_sck_iobuf + (.I(fmc_spi0_sck_o), + .IO(fmc_spi0_sck), + .O(fmc_spi0_sck_i), + .T(fmc_spi0_sck_t)); + IOBUF fmc_spi0_ss_iobuf_0 + (.I(fmc_spi0_ss_o), + .IO(fmc_spi0_ss), + .O(fmc_spi0_ss_i), + .T(fmc_spi0_ss_t)); + + // This is 3 Wire Interface, Don't need MISO + // Use extra slave select to manually control tristate pin + // of MOSI, Xilinx driver doesn't support swapping tristate in the middle of + // a transaction + IOBUF fmc_spi1_io0_iobuf + (.I(fmc_spi1_io0_o), + .IO(fmc_spi1_mosi), + .O(fmc_spi1_io0_i), + .T(fmc_spi1_ss_o[1])); + + assign fmc_spi1_io1_i = fmc_spi1_io0_i; + + IOBUF fmc_spi1_sck_iobuf + (.I(fmc_spi1_sck_o), + .IO(fmc_spi1_sck), + .O(fmc_spi1_sck_i), + .T(fmc_spi1_sck_t)); + IOBUF fmc_spi1_ss_iobuf_0 + (.I(fmc_spi1_ss_o[0]), + .IO(fmc_spi1_ss), + .O(fmc_spi1_ss_i[0]), + .T(fmc_spi1_ss_t)); + + + // ------------------------------ + // BD + // ------------------------------ + axi4l_intf # ( + .AXI_ADDR_WIDTH(32), + .AXI_DATA_WIDTH(32) + ) + util_reg_if ( + .clk(mb_axi_clk), + .resetn(mb_axi_aresetn) + ); + + axi4l_intf # ( + .AXI_ADDR_WIDTH(32), + .AXI_DATA_WIDTH(32) + ) + timing_engine_if ( + .clk(mb_axi_clk), + .resetn(mb_axi_aresetn) + ); + + axi4l_intf # ( + .AXI_ADDR_WIDTH(32), + .AXI_DATA_WIDTH(32) + ) + dig_rx_if[NUM_RX] ( + .clk(mb_axi_clk), + .resetn(mb_axi_aresetn) + ); + + axi4l_intf # ( + .AXI_ADDR_WIDTH(32), + .AXI_DATA_WIDTH(32) + ) + wf_gen_if ( + .clk(mb_axi_clk), + .resetn(mb_axi_aresetn) + ); + + // axi4s_intf # ( + // .AXI_DATA_WIDTH(64), + // .AXI_ID_WIDTH(1) + // ) + // rx_udp_axis[NUM_RX] ( + // .clk(eth_clk[0]), + // .resetn(eth_resetn[0]) + // ); + + axi4s_intf # ( + .AXI_DATA_WIDTH(64), + .AXI_ID_WIDTH(1) + ) + rx_udp_axis[NUM_RX] (); + + axi4s_intf # ( + .AXI_DATA_WIDTH(64), + .AXI_ID_WIDTH(1) + ) + tx_udp_0_axis ( + .clk(eth_clk[0]), + .resetn(eth_resetn[0]) + ); + + assign ext_reset_in_200 = 1; + assign mb_axi_reset = !mb_axi_aresetn; + wire qspi_flash_aresetn; + + + reg [15:0] pps_pipe; + reg pps_debounce; + reg pps_q; + reg pps_q2; + reg pps_red; + + always @ (posedge mb_axi_clk) begin + pps_pipe <= {pps_pipe[14:0], pps}; + pps_debounce = |pps_pipe; + pps_q <= pps_debounce; + pps_q2 <= pps_q; + pps_red <= !pps_q2 & pps_q; + end + + microblaze_bd microblaze_bd_i + ( + .STARTUP_IO_cfgclk(), + .STARTUP_IO_cfgmclk(), + .STARTUP_IO_eos(), + .STARTUP_IO_gsr(1'b0), + .STARTUP_IO_gts(1'b0), + .STARTUP_IO_keyclearb(1'b1), + .STARTUP_IO_preq(), + .STARTUP_IO_userdoneo(1'b1), + .STARTUP_IO_usrclkts(1'b0), + .STARTUP_IO_usrdonets(1'b1), + + .qspi_flash_aresetn(qspi_flash_aresetn), + + .pps(pps_red), + + .clk_200_in_clk_n(clk_200_n), + .clk_200_in_clk_p(clk_200_p), + .ddr_act_n(ddr_act_n), + .ddr_adr(ddr_adr), + .ddr_ba(ddr_ba), + .ddr_bg(ddr_bg), + .ddr_ck_c(ddr_ck_c), + .ddr_ck_t(ddr_ck_t), + .ddr_cke(ddr_cke), + .ddr_cs_n(ddr_cs_n), + .ddr_dm_n(ddr_dm_n), + .ddr_dq(ddr_dq), + .ddr_dqs_c(ddr_dqs_c), + .ddr_dqs_t(ddr_dqs_t), + .ddr_odt(ddr_odt), + .ddr_reset_n(ddr_reset_n), + .ddr_init_calib_complete(ddr_init_calib_complete), + .ext_reset_in_200(ext_reset_in_200), + .mdio_mdc(mdc), + .mdio_mdio_i(mdio_mdio_i), + .mdio_mdio_o(mdio_mdio_o), + .mdio_mdio_t(mdio_mdio_t), + .phy_rst_n(phy_rst_n), + .rgmii_rd(rgmii_rd), + .rgmii_rx_ctl(rgmii_rx_ctl), + .rgmii_rxc(rgmii_rxc), + .rgmii_td(rgmii_td), + .rgmii_tx_ctl(rgmii_tx_ctl), + .rgmii_txc(rgmii_txc), + .uart_rxd(uart_rxd), + .uart_txd(uart_txd), + .mb_axi_clk(mb_axi_clk), + .mb_axi_aresetn(mb_axi_aresetn), + .util_reg_axil_araddr(util_reg_if.araddr), + .util_reg_axil_arprot(util_reg_if.arprot), + .util_reg_axil_arready(util_reg_if.arready), + .util_reg_axil_arvalid(util_reg_if.arvalid), + .util_reg_axil_awaddr(util_reg_if.awaddr), + .util_reg_axil_awprot(util_reg_if.awprot), + .util_reg_axil_awready(util_reg_if.awready), + .util_reg_axil_awvalid(util_reg_if.awvalid), + .util_reg_axil_bready(util_reg_if.bready), + .util_reg_axil_bresp(util_reg_if.bresp), + .util_reg_axil_bvalid(util_reg_if.bvalid), + .util_reg_axil_rdata(util_reg_if.rdata), + .util_reg_axil_rready(util_reg_if.rready), + .util_reg_axil_rresp(util_reg_if.rresp), + .util_reg_axil_rvalid(util_reg_if.rvalid), + .util_reg_axil_wdata(util_reg_if.wdata), + .util_reg_axil_wready(util_reg_if.wready), + .util_reg_axil_wstrb(util_reg_if.wstrb), + .util_reg_axil_wvalid(util_reg_if.wvalid), + + .timing_engine_axil_araddr(timing_engine_if.araddr), + .timing_engine_axil_arprot(timing_engine_if.arprot), + .timing_engine_axil_arready(timing_engine_if.arready), + .timing_engine_axil_arvalid(timing_engine_if.arvalid), + .timing_engine_axil_awaddr(timing_engine_if.awaddr), + .timing_engine_axil_awprot(timing_engine_if.awprot), + .timing_engine_axil_awready(timing_engine_if.awready), + .timing_engine_axil_awvalid(timing_engine_if.awvalid), + .timing_engine_axil_bready(timing_engine_if.bready), + .timing_engine_axil_bresp(timing_engine_if.bresp), + .timing_engine_axil_bvalid(timing_engine_if.bvalid), + .timing_engine_axil_rdata(timing_engine_if.rdata), + .timing_engine_axil_rready(timing_engine_if.rready), + .timing_engine_axil_rresp(timing_engine_if.rresp), + .timing_engine_axil_rvalid(timing_engine_if.rvalid), + .timing_engine_axil_wdata(timing_engine_if.wdata), + .timing_engine_axil_wready(timing_engine_if.wready), + .timing_engine_axil_wstrb(timing_engine_if.wstrb), + .timing_engine_axil_wvalid(timing_engine_if.wvalid), + + .dig_rx0_axil_araddr(dig_rx_if[0].araddr), + .dig_rx0_axil_arprot(dig_rx_if[0].arprot), + .dig_rx0_axil_arready(dig_rx_if[0].arready), + .dig_rx0_axil_arvalid(dig_rx_if[0].arvalid), + .dig_rx0_axil_awaddr(dig_rx_if[0].awaddr), + .dig_rx0_axil_awprot(dig_rx_if[0].awprot), + .dig_rx0_axil_awready(dig_rx_if[0].awready), + .dig_rx0_axil_awvalid(dig_rx_if[0].awvalid), + .dig_rx0_axil_bready(dig_rx_if[0].bready), + .dig_rx0_axil_bresp(dig_rx_if[0].bresp), + .dig_rx0_axil_bvalid(dig_rx_if[0].bvalid), + .dig_rx0_axil_rdata(dig_rx_if[0].rdata), + .dig_rx0_axil_rready(dig_rx_if[0].rready), + .dig_rx0_axil_rresp(dig_rx_if[0].rresp), + .dig_rx0_axil_rvalid(dig_rx_if[0].rvalid), + .dig_rx0_axil_wdata(dig_rx_if[0].wdata), + .dig_rx0_axil_wready(dig_rx_if[0].wready), + .dig_rx0_axil_wstrb(dig_rx_if[0].wstrb), + .dig_rx0_axil_wvalid(dig_rx_if[0].wvalid), + + .dig_rx1_axil_araddr(dig_rx_if[1].araddr), + .dig_rx1_axil_arprot(dig_rx_if[1].arprot), + .dig_rx1_axil_arready(dig_rx_if[1].arready), + .dig_rx1_axil_arvalid(dig_rx_if[1].arvalid), + .dig_rx1_axil_awaddr(dig_rx_if[1].awaddr), + .dig_rx1_axil_awprot(dig_rx_if[1].awprot), + .dig_rx1_axil_awready(dig_rx_if[1].awready), + .dig_rx1_axil_awvalid(dig_rx_if[1].awvalid), + .dig_rx1_axil_bready(dig_rx_if[1].bready), + .dig_rx1_axil_bresp(dig_rx_if[1].bresp), + .dig_rx1_axil_bvalid(dig_rx_if[1].bvalid), + .dig_rx1_axil_rdata(dig_rx_if[1].rdata), + .dig_rx1_axil_rready(dig_rx_if[1].rready), + .dig_rx1_axil_rresp(dig_rx_if[1].rresp), + .dig_rx1_axil_rvalid(dig_rx_if[1].rvalid), + .dig_rx1_axil_wdata(dig_rx_if[1].wdata), + .dig_rx1_axil_wready(dig_rx_if[1].wready), + .dig_rx1_axil_wstrb(dig_rx_if[1].wstrb), + .dig_rx1_axil_wvalid(dig_rx_if[1].wvalid), + + .wf_gen_axil_araddr(wf_gen_if.araddr), + .wf_gen_axil_arprot(wf_gen_if.arprot), + .wf_gen_axil_arready(wf_gen_if.arready), + .wf_gen_axil_arvalid(wf_gen_if.arvalid), + .wf_gen_axil_awaddr(wf_gen_if.awaddr), + .wf_gen_axil_awprot(wf_gen_if.awprot), + .wf_gen_axil_awready(wf_gen_if.awready), + .wf_gen_axil_awvalid(wf_gen_if.awvalid), + .wf_gen_axil_bready(wf_gen_if.bready), + .wf_gen_axil_bresp(wf_gen_if.bresp), + .wf_gen_axil_bvalid(wf_gen_if.bvalid), + .wf_gen_axil_rdata(wf_gen_if.rdata), + .wf_gen_axil_rready(wf_gen_if.rready), + .wf_gen_axil_rresp(wf_gen_if.rresp), + .wf_gen_axil_rvalid(wf_gen_if.rvalid), + .wf_gen_axil_wdata(wf_gen_if.wdata), + .wf_gen_axil_wready(wf_gen_if.wready), + .wf_gen_axil_wstrb(wf_gen_if.wstrb), + .wf_gen_axil_wvalid(wf_gen_if.wvalid), + + .fmc_spi0_io0_i(fmc_spi0_io0_i), + .fmc_spi0_io0_o(fmc_spi0_io0_o), + .fmc_spi0_io0_t(fmc_spi0_io0_t), + .fmc_spi0_io1_i(fmc_spi0_io1_i), + .fmc_spi0_io1_o(fmc_spi0_io1_o), + .fmc_spi0_io1_t(fmc_spi0_io1_t), + .fmc_spi0_sck_i(fmc_spi0_sck_i), + .fmc_spi0_sck_o(fmc_spi0_sck_o), + .fmc_spi0_sck_t(fmc_spi0_sck_t), + .fmc_spi0_ss_i(fmc_spi0_ss_i), + .fmc_spi0_ss_o(fmc_spi0_ss_o), + .fmc_spi0_ss_t(fmc_spi0_ss_t), + + .fmc_spi1_io0_i(fmc_spi1_io0_i), + .fmc_spi1_io0_o(fmc_spi1_io0_o), + .fmc_spi1_io0_t(fmc_spi1_io0_t), + .fmc_spi1_io1_i(fmc_spi1_io1_i), + .fmc_spi1_io1_o(fmc_spi1_io1_o), + .fmc_spi1_io1_t(fmc_spi1_io1_t), + .fmc_spi1_sck_i(fmc_spi1_sck_i), + .fmc_spi1_sck_o(fmc_spi1_sck_o), + .fmc_spi1_sck_t(fmc_spi1_sck_t), + .fmc_spi1_ss_i(fmc_spi1_ss_i), + .fmc_spi1_ss_o(fmc_spi1_ss_o), + .fmc_spi1_ss_t(fmc_spi1_ss_t), + + .common0_qpll1_lock_out(common0_qpll1_lock_out), + .common1_qpll1_lock_out(common1_qpll1_lock_out), + .jesd_axis_tx_aresetn(jesd_axis_tx_aresetn), + .jesd_axis_rx_aresetn(jesd_axis_rx_aresetn), + .jesd_axis_rx_cmd_tdata(jesd_axis_rx_cmd_tdata), + .jesd_axis_rx_cmd_tready(jesd_axis_rx_cmd_tready), + .jesd_axis_rx_cmd_tuser(jesd_axis_rx_cmd_tuser), + .jesd_axis_rx_cmd_tvalid(jesd_axis_rx_cmd_tvalid), + .jesd_axis_rx_tdata(jesd_axis_rx_tdata), + .jesd_axis_rx_tvalid(jesd_axis_rx_tvalid), + .jesd_axis_tx_cmd_tdata(jesd_axis_tx_cmd_tdata), + .jesd_axis_tx_cmd_tready(jesd_axis_tx_cmd_tready), + .jesd_axis_tx_cmd_tvalid(jesd_axis_tx_cmd_tvalid), + .jesd_axis_tx_tdata(jesd_axis_tx_tdata), + .jesd_axis_tx_tready(jesd_axis_tx_tready), + .jesd_qpll0_refclk_clk_n(jesd_qpll0_refclk_n), + .jesd_qpll0_refclk_clk_p(jesd_qpll0_refclk_p), + .jesd_sysref_clk_n(jesd_sysref_n), + .jesd_sysref_clk_p(jesd_sysref_p), + .jesd_rx_core_reset(jesd_rx_core_reset), + .jesd_rxn_in(jesd_rxn_in), + .jesd_rxp_in(jesd_rxp_in), + .jesd_tx_core_reset(jesd_tx_core_reset), + .jesd_txn_out(jesd_txn_out), + .jesd_txp_out(jesd_txp_out), + .jesd_tx_sys_reset(jesd_tx_sys_reset), + .jesd_rx_sys_reset(jesd_rx_sys_reset), + .jesd_core_clk(jesd_core_clk), + + .eth_clk(eth_clk[0]), + .eth_resetn(eth_resetn[0]), + .udp_rx_tdata(rx_udp_axis[0].tdata), + .udp_rx_tready(rx_udp_axis[0].tready), + .udp_rx_tvalid(rx_udp_axis[0].tvalid), + .udp_rx_tlast(rx_udp_axis[0].tlast), + + .udp_tx_tdata(tx_udp_0_axis.tdata), + .udp_tx_tkeep(tx_udp_0_axis.tkeep), + .udp_tx_tlast(tx_udp_0_axis.tlast), + .udp_tx_tready(tx_udp_0_axis.tready), + .udp_tx_tvalid(tx_udp_0_axis.tvalid), + + .dac0_wf_bram_addr(dac0_wf_bram_addr), + .dac0_wf_bram_clk(dac0_wf_bram_clk), + .dac0_wf_bram_din(dac0_wf_bram_din), + .dac0_wf_bram_dout(dac0_wf_bram_dout), + .dac0_wf_bram_en(dac0_wf_bram_en), + .dac0_wf_bram_rst(dac0_wf_bram_rst), + .dac0_wf_bram_we(dac0_wf_bram_we), + + .dac1_wf_bram_addr(dac1_wf_bram_addr), + .dac1_wf_bram_clk(dac1_wf_bram_clk), + .dac1_wf_bram_din(dac1_wf_bram_din), + .dac1_wf_bram_dout(dac1_wf_bram_dout), + .dac1_wf_bram_en(dac1_wf_bram_en), + .dac1_wf_bram_rst(dac1_wf_bram_rst), + .dac1_wf_bram_we(dac1_wf_bram_we), + + .dac2_wf_bram_addr(dac2_wf_bram_addr), + .dac2_wf_bram_clk(dac2_wf_bram_clk), + .dac2_wf_bram_din(dac2_wf_bram_din), + .dac2_wf_bram_dout(dac2_wf_bram_dout), + .dac2_wf_bram_en(dac2_wf_bram_en), + .dac2_wf_bram_rst(dac2_wf_bram_rst), + .dac2_wf_bram_we(dac2_wf_bram_we), + + .dac3_wf_bram_addr(dac3_wf_bram_addr), + .dac3_wf_bram_clk(dac3_wf_bram_clk), + .dac3_wf_bram_din(dac3_wf_bram_din), + .dac3_wf_bram_dout(dac3_wf_bram_dout), + .dac3_wf_bram_en(dac3_wf_bram_en), + .dac3_wf_bram_rst(dac3_wf_bram_rst), + .dac3_wf_bram_we(dac3_wf_bram_we) + + ); + + // ------------------------------ + // Utility Registers + // ------------------------------ + + wire [31:0] gpi; + wire [31:0] gpo; + wire [15:0] packet_size; + wire eth_reset; + + + assign leds = gpo[3:0]; + assign fmc_power_en = gpo[4]; + assign resetb = gpo[5]; + assign jesd_rx_core_reset = gpo[6]; + assign jesd_tx_core_reset = gpo[7]; + assign jesd_rx_sys_reset = gpo[8]; + assign jesd_tx_sys_reset = gpo[9]; + assign qspi_flash_aresetn = ~gpo[10]; + assign eth_reset = gpo[15]; + + assign gpi[31:3] = 0; + // assign gpi[31] = start_of_cpi; + // assign gpi[30] = start_of_pulse; + assign gpi[2] = common1_qpll1_lock_out; + assign gpi[1] = common0_qpll1_lock_out; + assign gpi[0] = ddr_init_calib_complete; + + util_reg util_reg_i + ( + .ctrl_if(util_reg_if), + + .gpo(gpo), + .gpi(gpi), + .packet_size(packet_size), + .fan_pwm(fan_pwm), + + .tx0_rf_attn_sin(tx0_rf_attn_sin), + .tx0_rf_attn_clk(tx0_rf_attn_clk), + .tx0_rf_attn_le(tx0_rf_attn_le), + .tx1_rf_attn_sin(tx1_rf_attn_sin), + .tx1_rf_attn_clk(tx1_rf_attn_clk), + .tx1_rf_attn_le(tx1_rf_attn_le), + + .rx0_rf_attn_sin(rx0_rf_attn_sin), + .rx0_rf_attn_clk(rx0_rf_attn_clk), + .rx0_rf_attn_le(rx0_rf_attn_le), + .rx0_if_attn_sin(rx0_if_attn_sin), + .rx0_if_attn_clk(rx0_if_attn_clk), + .rx0_if_attn_le(rx0_if_attn_le), + + .rx1_rf_attn_sin(rx1_rf_attn_sin), + .rx1_rf_attn_clk(rx1_rf_attn_clk), + .rx1_rf_attn_le(rx1_rf_attn_le), + .rx1_if_attn_sin(rx1_if_attn_sin), + .rx1_if_attn_clk(rx1_if_attn_clk), + .rx1_if_attn_le(rx1_if_attn_le) + ); + + // ------------------------------ + // 10G Ethernet + // ------------------------------ + axi4s_intf # ( + .AXI_DATA_WIDTH(64), + .AXI_USER_WIDTH(16) + ) + tx_udp_switch_out[NUM_RX] (); + + axi4s_intf # ( + .AXI_DATA_WIDTH(64), + .AXI_USER_WIDTH(16) + ) + hdr_out[NUM_RX] (); + + axi4s_intf # ( + .AXI_DATA_WIDTH(64), + .AXI_USER_WIDTH(15) + ) + rx_axis[NUM_RX] (); + + + // These are from the block design, not currently using this though + assign tx_udp_0_axis.tuser = 1'b0; + assign tx_udp_0_axis.tready = 1'b1; + + // This one is not connected to block design + assign rx_udp_axis[1].tready = 1; + + ethernet_top ethernet_top_i + ( + .clk_freerun(mb_axi_clk), + .reset(eth_reset), + .eth_clk(eth_clk), + .eth_resetn(eth_resetn), + .packet_size(packet_size), + + .rx_udp_0(rx_udp_axis[0]), + .tx_udp_0(tx_udp_switch_out[0]), + + .rx_udp_1(rx_udp_axis[1]), + .tx_udp_1(tx_udp_switch_out[1]), + + .sfp0_rx_p(sfp0_rx_p), + .sfp0_rx_n(sfp0_rx_n), + .sfp0_tx_p(sfp0_tx_p), + .sfp0_tx_n(sfp0_tx_n), + .sfp1_rx_p(sfp1_rx_p), + .sfp1_rx_n(sfp1_rx_n), + .sfp1_tx_p(sfp1_tx_p), + .sfp1_tx_n(sfp1_tx_n), + .sfp2_rx_p(sfp2_rx_p), + .sfp2_rx_n(sfp2_rx_n), + .sfp2_tx_p(sfp2_tx_p), + .sfp2_tx_n(sfp2_tx_n), + .sfp3_rx_p(sfp3_rx_p), + .sfp3_rx_n(sfp3_rx_n), + .sfp3_tx_p(sfp3_tx_p), + .sfp3_tx_n(sfp3_tx_n), + .sfp_mgt_refclk_0_p(sfp_mgt_refclk_0_p), + .sfp_mgt_refclk_0_n(sfp_mgt_refclk_0_n), + .sfp0_tx_disable_b(sfp0_tx_disable_b), + .sfp1_tx_disable_b(sfp1_tx_disable_b), + .sfp2_tx_disable_b(sfp2_tx_disable_b), + .sfp3_tx_disable_b(sfp3_tx_disable_b) + ); + + genvar i; + generate + for (i = 0; i < NUM_RX; i = i + 1) begin + + assign tx_udp_switch_out[i].clk = eth_clk[i]; + assign tx_udp_switch_out[i].resetn = eth_resetn[i]; + + assign rx_axis[i].clk = eth_clk[i]; + assign rx_axis[i].resetn = eth_resetn[i]; + + assign hdr_out[i].clk = eth_clk[i]; + assign hdr_out[i].resetn = eth_resetn[i]; + + assign rx_udp_axis[i].clk = eth_clk[i]; + assign rx_udp_axis[i].resetn = eth_resetn[i]; + + + // ------------------------------ + // RX Chain + // ------------------------------ + digital_rx_chain digital_rx_chain_i ( + .clk(jesd_core_clk), + + .ctrl_if(dig_rx_if[i]), + + .start_of_pulse(start_of_pulse), + + .in_tvalid(jesd_axis_rx_tvalid), + .in_tdata_i(jesd_axis_rx_tdata[i*128+63 :i*128+0]), + .in_tdata_q(jesd_axis_rx_tdata[i*128+127 :i*128+64]), + + .rx_out(rx_axis[i]) + ); + + + axis_switch_0 axis_switch_i ( + .aclk(eth_clk[i]), + .aresetn(eth_resetn[i]), + .s_axis_tvalid({hdr_out[i].tvalid, rx_axis[i].tvalid}), + .s_axis_tready({hdr_out[i].tready, rx_axis[i].tready}), + .s_axis_tdata({hdr_out[i].tdata, rx_axis[i].tdata}), + .s_axis_tlast({hdr_out[i].tlast, rx_axis[i].tlast}), + .s_axis_tuser({hdr_out[i].tuser, rx_axis[i].tuser}), + .s_axis_tdest({hdr_out[i].tdest, rx_axis[i].tdest}), + + .m_axis_tvalid(tx_udp_switch_out[i].tvalid), + .m_axis_tready(tx_udp_switch_out[i].tready), + .m_axis_tdata(tx_udp_switch_out[i].tdata), + .m_axis_tlast(tx_udp_switch_out[i].tlast), + .m_axis_tuser(tx_udp_switch_out[i].tuser), + .m_axis_tdest(tx_udp_switch_out[i].tdest), + .s_req_suppress(2'b00), + .s_decode_err() + ); + + assign tx_udp_switch_out[i].tkeep = '1; + + end + endgenerate + + // ------------------------------ + // Timing Engine + // ------------------------------ + timing_engine timing_engine_i + ( + .clk(jesd_core_clk), + .pps(pps), + + .ctrl_if(timing_engine_if), + + .start_of_cpi(start_of_cpi), + .start_of_pulse(start_of_pulse), + + .hdr_out(hdr_out) + ); + + + + // ------------------------------ + // TX Chain + // ------------------------------ + assign jesd_axis_rx_cmd_tready = 1'b1; + assign jesd_axis_tx_cmd_tdata = 0; + assign jesd_axis_tx_cmd_tvalid = 1'b1; + + waveform_gen waveform_gen_i ( + .clk(jesd_core_clk), + + .ctrl_if(wf_gen_if), + + .start_of_pulse(start_of_pulse), + + .dac0_wf_bram_addr(dac0_wf_bram_addr), + .dac0_wf_bram_clk(dac0_wf_bram_clk), + .dac0_wf_bram_din(dac0_wf_bram_din), + .dac0_wf_bram_dout(dac0_wf_bram_dout), + .dac0_wf_bram_en(dac0_wf_bram_en), + .dac0_wf_bram_rst(dac0_wf_bram_rst), + .dac0_wf_bram_we(dac0_wf_bram_we), + + .dac1_wf_bram_addr(dac1_wf_bram_addr), + .dac1_wf_bram_clk(dac1_wf_bram_clk), + .dac1_wf_bram_din(dac1_wf_bram_din), + .dac1_wf_bram_dout(dac1_wf_bram_dout), + .dac1_wf_bram_en(dac1_wf_bram_en), + .dac1_wf_bram_rst(dac1_wf_bram_rst), + .dac1_wf_bram_we(dac1_wf_bram_we), + + .dac2_wf_bram_addr(dac2_wf_bram_addr), + .dac2_wf_bram_clk(dac2_wf_bram_clk), + .dac2_wf_bram_din(dac2_wf_bram_din), + .dac2_wf_bram_dout(dac2_wf_bram_dout), + .dac2_wf_bram_en(dac2_wf_bram_en), + .dac2_wf_bram_rst(dac2_wf_bram_rst), + .dac2_wf_bram_we(dac2_wf_bram_we), + + .dac3_wf_bram_addr(dac3_wf_bram_addr), + .dac3_wf_bram_clk(dac3_wf_bram_clk), + .dac3_wf_bram_din(dac3_wf_bram_din), + .dac3_wf_bram_dout(dac3_wf_bram_dout), + .dac3_wf_bram_en(dac3_wf_bram_en), + .dac3_wf_bram_rst(dac3_wf_bram_rst), + .dac3_wf_bram_we(dac3_wf_bram_we), + + .jesd_tx(jesd_axis_tx_tdata) + ); + + +endmodule diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/util_reg.v b/radar_alinx_kintex.srcs/sources_1/hdl/util_reg.v new file mode 100755 index 0000000..f28f783 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/util_reg.v @@ -0,0 +1,321 @@ +`resetall +`timescale 1ns / 1ps +`default_nettype none + +module util_reg # +( + parameter integer AXI_ADDR_WIDTH = 32, + parameter integer AXI_DATA_WIDTH = 32 +) +( + // AXI4L Config Interface + axi4l_intf.slave ctrl_if, + + output wire [31:0] gpo, + input wire [31:0] gpi, + output wire [15:0] packet_size, + output wire fan_pwm, + + output wire tx0_rf_attn_sin, //ADRF5730 + output wire tx0_rf_attn_clk, //ADRF5730 + output wire tx0_rf_attn_le, //ADRF5730 + output wire tx1_rf_attn_sin, //ADRF5730 + output wire tx1_rf_attn_clk, //ADRF5730 + output wire tx1_rf_attn_le, //ADRF5730 + + output wire rx0_rf_attn_sin, //ADRF5721 + output wire rx0_rf_attn_clk, //ADRF5721 + output wire rx0_rf_attn_le, //ADRF5721 + output wire rx0_if_attn_sin, //HMC624 + output wire rx0_if_attn_clk, //HMC624 + output wire rx0_if_attn_le, //HMC624 + + output wire rx1_rf_attn_sin, //ADRF5721 + output wire rx1_rf_attn_clk, //ADRF5721 + output wire rx1_rf_attn_le, //ADRF5721 + output wire rx1_if_attn_sin, //HMC624 + output wire rx1_if_attn_clk, //HMC624 + output wire rx1_if_attn_le //HMC624 +); + +// ------------------------------ +// AXIL Decode +// ------------------------------ +wire [AXI_ADDR_WIDTH-1 : 0] raddr; +wire [AXI_ADDR_WIDTH-1 : 0] waddr; +wire rden; +wire wren; +wire [AXI_DATA_WIDTH-1 : 0] wdata; +reg [AXI_DATA_WIDTH-1 : 0] rdata; + + +axil_slave +# ( + .DATA_WIDTH(AXI_DATA_WIDTH), + .ADDR_WIDTH(AXI_ADDR_WIDTH) +) axil_slave_i +( + // AXIL Slave + .S_AXI_ACLK(ctrl_if.clk), + .S_AXI_ARESETN(ctrl_if.resetn), + .S_AXI_AWADDR(ctrl_if.awaddr), + .S_AXI_AWPROT(ctrl_if.awprot), + .S_AXI_AWVALID(ctrl_if.awvalid), + .S_AXI_AWREADY(ctrl_if.awready), + .S_AXI_WDATA(ctrl_if.wdata), + .S_AXI_WSTRB(ctrl_if.wstrb), + .S_AXI_WVALID(ctrl_if.wvalid), + .S_AXI_WREADY(ctrl_if.wready), + .S_AXI_BRESP(ctrl_if.bresp), + .S_AXI_BVALID(ctrl_if.bvalid), + .S_AXI_BREADY(ctrl_if.bready), + .S_AXI_ARADDR(ctrl_if.araddr), + .S_AXI_ARPROT(ctrl_if.arprot), + .S_AXI_ARVALID(ctrl_if.arvalid), + .S_AXI_ARREADY(ctrl_if.arready), + .S_AXI_RDATA(ctrl_if.rdata), + .S_AXI_RRESP(ctrl_if.rresp), + .S_AXI_RVALID(ctrl_if.rvalid), + .S_AXI_RREADY(ctrl_if.rready), + + .raddr(raddr), + .waddr(waddr), + .wren(wren), + .rden(rden), + .wdata(wdata), + .rdata(rdata) +); + +// ------------------------------ +// Config Registers +// ------------------------------ +wire reset; +assign reset = ~ctrl_if.resetn; +reg [31:0] scratch; +reg [31:0] reg_gpo; +reg [24:0] pwm_period; +reg [24:0] pwm_pulsewidth; +reg [15:0] reg_packet_size; +reg [7:0] reg_num_bits; +reg [15:0] reg_dev_sel; +reg [31:0] reg_spi_data; +reg [7:0] reg_spi_clk_div; +reg start_spi_transaction; + +always @ (posedge ctrl_if.clk) begin + if (reset) begin + scratch <= 0; + end else if (wren && waddr[11:0] == 'h004) begin + scratch <= wdata; + end +end + +always @ (posedge ctrl_if.clk) begin + if (reset) begin + reg_gpo <= 0; + end else if (wren && waddr[11:0] == 'h008) begin + reg_gpo <= wdata; + end +end + +always @ (posedge ctrl_if.clk) begin + if (reset) begin + pwm_period <= 1500000; + end else if (wren && waddr[11:0] == 'h010) begin + pwm_period <= wdata; + end +end + +always @ (posedge ctrl_if.clk) begin + if (reset) begin + pwm_pulsewidth <= 500000; + end else if (wren && waddr[11:0] == 'h014) begin + pwm_pulsewidth <= wdata; + end +end + +always @ (posedge ctrl_if.clk) begin + if (reset) begin + reg_packet_size <= 1024; + end else if (wren && waddr[11:0] == 'h01C) begin + reg_packet_size <= wdata; + end +end + +always @ (posedge ctrl_if.clk) begin + if (reset) begin + reg_num_bits <= 6; + start_spi_transaction <= 0; + end else if (wren && waddr[11:0] == 'h100) begin + reg_num_bits <= wdata; + start_spi_transaction <= 1; + end else begin + start_spi_transaction <= 0; + end +end + +always @ (posedge ctrl_if.clk) begin + if (reset) begin + reg_dev_sel <= 0; + end else if (wren && waddr[11:0] == 'h104) begin + reg_dev_sel <= wdata; + end +end + +always @ (posedge ctrl_if.clk) begin + if (reset) begin + reg_spi_data <= 0; + end else if (wren && waddr[11:0] == 'h108) begin + reg_spi_data <= wdata; + end +end + +always @ (posedge ctrl_if.clk) begin + if (reset) begin + reg_spi_clk_div <= 16; + end else if (wren && waddr[11:0] == 'h10C) begin + reg_spi_clk_div <= wdata; + end +end + +always @ (posedge ctrl_if.clk) begin + if (rden) begin + if (raddr[11:0] == 'h000) + rdata <= 'h12345678; + if (raddr[11:0] == 'h004) + rdata <= scratch; + if (raddr[11:0] == 'h008) + rdata <= reg_gpo; + if (raddr[11:0] == 'h00C) + rdata <= gpi; + if (raddr[11:0] == 'h010) + rdata <= pwm_period; + if (raddr[11:0] == 'h014) + rdata <= pwm_pulsewidth; + if (raddr[11:0] == 'h01C) + rdata <= reg_packet_size; + if (raddr[11:0] == 'h100) + rdata <= reg_num_bits; + if (raddr[11:0] == 'h104) + rdata <= reg_dev_sel; + if (raddr[11:0] == 'h108) + rdata <= reg_spi_data; + if (raddr[11:0] == 'h10C) + rdata <= reg_spi_clk_div; + if (raddr[11:0] == 'h110) + rdata <= {28'b0000000, 2'b00, spi_active, le_active}; + end +end + +assign gpo = reg_gpo; +assign packet_size = reg_packet_size; + +// ------------------------------ +// Fan PWM +// ------------------------------ +reg [24:0] pwm_cnt; +reg pwm_out; + +assign fan_pwm = pwm_out; + +always @ (posedge ctrl_if.clk) begin + if (pwm_cnt < pwm_period) begin + pwm_cnt <= pwm_cnt + 1; + end else begin + pwm_cnt <= 0; + end + + if (pwm_cnt < pwm_pulsewidth) begin + pwm_out <= 1'bz; + end else begin + pwm_out <= 1'b0; + end + +end + +// ------------------------------ +// Attenuator Serial Bus Control +// ------------------------------ +reg [7:0] spi_clk_cnt; +reg [7:0] spi_bit_cnt; +reg spi_active; +reg le_active; +reg [31:0] spi_shift_data; +reg [7:0] le_count; +reg le; + +always @ (posedge ctrl_if.clk) begin + + if (start_spi_transaction) begin + spi_active <= 1; + end + + if (spi_active) begin + spi_clk_cnt <= spi_clk_cnt + 1; + if (spi_clk_cnt == reg_spi_clk_div) begin + spi_clk_cnt <= 0; + spi_bit_cnt <= spi_bit_cnt + 1; + // Shift Data Down One Bit + spi_shift_data <= spi_shift_data >> 1; + if (spi_bit_cnt == reg_num_bits) begin + spi_active <= 0; + le_active <= 1; + end + end + end else begin + spi_clk_cnt <= 0; + spi_bit_cnt <= 0; + spi_shift_data <= reg_spi_data; + end + + if (le_active) begin + le_count <= le_count + 1; + if (le_count == 10) begin + le = 1; + end else if (le_count == 20) begin + le = 0; + le_active <= 0; + end; + end else begin + le_count <= 0; + le = 0; + end + + +end + +wire spi_data; +wire spi_clk; +wire spi_le; + + +assign spi_data = spi_active ? spi_shift_data[0] : 0; +assign spi_clk = (spi_clk_cnt > reg_spi_clk_div[7:1]) ? 1 : 0; +assign spi_le = le; + +assign tx0_rf_attn_sin = reg_dev_sel[0] ? spi_data : 0; +assign tx0_rf_attn_clk = reg_dev_sel[0] ? spi_clk : 0; +assign tx0_rf_attn_le = reg_dev_sel[0] ? spi_le : 0; +assign tx1_rf_attn_sin = reg_dev_sel[1] ? spi_data : 0; +assign tx1_rf_attn_clk = reg_dev_sel[1] ? spi_clk : 0; +assign tx1_rf_attn_le = reg_dev_sel[1] ? spi_le : 0; + +assign rx0_rf_attn_sin = reg_dev_sel[2] ? spi_data : 0; +assign rx0_rf_attn_clk = reg_dev_sel[2] ? spi_clk : 0; +assign rx0_rf_attn_le = reg_dev_sel[2] ? spi_le : 0; +assign rx0_if_attn_sin = reg_dev_sel[3] ? spi_data : 0; +assign rx0_if_attn_clk = reg_dev_sel[3] ? spi_clk : 0; +assign rx0_if_attn_le = reg_dev_sel[3] ? spi_le : 0; + +assign rx1_rf_attn_sin = reg_dev_sel[4] ? spi_data : 0; +assign rx1_rf_attn_clk = reg_dev_sel[4] ? spi_clk : 0; +assign rx1_rf_attn_le = reg_dev_sel[4] ? spi_le : 0; +assign rx1_if_attn_sin = reg_dev_sel[5] ? spi_data : 0; +assign rx1_if_attn_clk = reg_dev_sel[5] ? spi_clk : 0; +assign rx1_if_attn_le = reg_dev_sel[5] ? spi_le : 0; + + +endmodule + + +`resetall \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arbiter.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arbiter.v new file mode 100755 index 0000000..7629077 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arbiter.v @@ -0,0 +1,159 @@ +/* + +Copyright (c) 2014-2021 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * Arbiter module + */ +module arbiter # +( + parameter PORTS = 4, + // select round robin arbitration + parameter ARB_TYPE_ROUND_ROBIN = 0, + // blocking arbiter enable + parameter ARB_BLOCK = 0, + // block on acknowledge assert when nonzero, request deassert when 0 + parameter ARB_BLOCK_ACK = 1, + // LSB priority selection + parameter ARB_LSB_HIGH_PRIORITY = 0 +) +( + input wire clk, + input wire rst, + + input wire [PORTS-1:0] request, + input wire [PORTS-1:0] acknowledge, + + output wire [PORTS-1:0] grant, + output wire grant_valid, + output wire [$clog2(PORTS)-1:0] grant_encoded +); + +reg [PORTS-1:0] grant_reg = 0, grant_next; +reg grant_valid_reg = 0, grant_valid_next; +reg [$clog2(PORTS)-1:0] grant_encoded_reg = 0, grant_encoded_next; + +assign grant_valid = grant_valid_reg; +assign grant = grant_reg; +assign grant_encoded = grant_encoded_reg; + +wire request_valid; +wire [$clog2(PORTS)-1:0] request_index; +wire [PORTS-1:0] request_mask; + +priority_encoder #( + .WIDTH(PORTS), + .LSB_HIGH_PRIORITY(ARB_LSB_HIGH_PRIORITY) +) +priority_encoder_inst ( + .input_unencoded(request), + .output_valid(request_valid), + .output_encoded(request_index), + .output_unencoded(request_mask) +); + +reg [PORTS-1:0] mask_reg = 0, mask_next; + +wire masked_request_valid; +wire [$clog2(PORTS)-1:0] masked_request_index; +wire [PORTS-1:0] masked_request_mask; + +priority_encoder #( + .WIDTH(PORTS), + .LSB_HIGH_PRIORITY(ARB_LSB_HIGH_PRIORITY) +) +priority_encoder_masked ( + .input_unencoded(request & mask_reg), + .output_valid(masked_request_valid), + .output_encoded(masked_request_index), + .output_unencoded(masked_request_mask) +); + +always @* begin + grant_next = 0; + grant_valid_next = 0; + grant_encoded_next = 0; + mask_next = mask_reg; + + if (ARB_BLOCK && !ARB_BLOCK_ACK && grant_reg & request) begin + // granted request still asserted; hold it + grant_valid_next = grant_valid_reg; + grant_next = grant_reg; + grant_encoded_next = grant_encoded_reg; + end else if (ARB_BLOCK && ARB_BLOCK_ACK && grant_valid && !(grant_reg & acknowledge)) begin + // granted request not yet acknowledged; hold it + grant_valid_next = grant_valid_reg; + grant_next = grant_reg; + grant_encoded_next = grant_encoded_reg; + end else if (request_valid) begin + if (ARB_TYPE_ROUND_ROBIN) begin + if (masked_request_valid) begin + grant_valid_next = 1; + grant_next = masked_request_mask; + grant_encoded_next = masked_request_index; + if (ARB_LSB_HIGH_PRIORITY) begin + mask_next = {PORTS{1'b1}} << (masked_request_index + 1); + end else begin + mask_next = {PORTS{1'b1}} >> (PORTS - masked_request_index); + end + end else begin + grant_valid_next = 1; + grant_next = request_mask; + grant_encoded_next = request_index; + if (ARB_LSB_HIGH_PRIORITY) begin + mask_next = {PORTS{1'b1}} << (request_index + 1); + end else begin + mask_next = {PORTS{1'b1}} >> (PORTS - request_index); + end + end + end else begin + grant_valid_next = 1; + grant_next = request_mask; + grant_encoded_next = request_index; + end + end +end + +always @(posedge clk) begin + grant_reg <= grant_next; + grant_valid_reg <= grant_valid_next; + grant_encoded_reg <= grant_encoded_next; + mask_reg <= mask_next; + + if (rst) begin + grant_reg <= 0; + grant_valid_reg <= 0; + grant_encoded_reg <= 0; + mask_reg <= 0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp.v new file mode 100755 index 0000000..1bf8786 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp.v @@ -0,0 +1,452 @@ +/* + +Copyright (c) 2014-2020 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * ARP block for IPv4, ethernet frame interface + */ +module arp # +( + // Width of AXI stream interfaces in bits + parameter DATA_WIDTH = 8, + // Propagate tkeep signal + // If disabled, tkeep assumed to be 1'b1 + parameter KEEP_ENABLE = (DATA_WIDTH>8), + // tkeep signal width (words per cycle) + parameter KEEP_WIDTH = (DATA_WIDTH/8), + // Log2 of ARP cache size + parameter CACHE_ADDR_WIDTH = 9, + // ARP request retry count + parameter REQUEST_RETRY_COUNT = 4, + // ARP request retry interval (in cycles) + parameter REQUEST_RETRY_INTERVAL = 125000000*2, + // ARP request timeout (in cycles) + parameter REQUEST_TIMEOUT = 125000000*30 +) +( + input wire clk, + input wire rst, + + /* + * Ethernet frame input + */ + input wire s_eth_hdr_valid, + output wire s_eth_hdr_ready, + input wire [47:0] s_eth_dest_mac, + input wire [47:0] s_eth_src_mac, + input wire [15:0] s_eth_type, + input wire [DATA_WIDTH-1:0] s_eth_payload_axis_tdata, + input wire [KEEP_WIDTH-1:0] s_eth_payload_axis_tkeep, + input wire s_eth_payload_axis_tvalid, + output wire s_eth_payload_axis_tready, + input wire s_eth_payload_axis_tlast, + input wire s_eth_payload_axis_tuser, + + /* + * Ethernet frame output + */ + output wire m_eth_hdr_valid, + input wire m_eth_hdr_ready, + output wire [47:0] m_eth_dest_mac, + output wire [47:0] m_eth_src_mac, + output wire [15:0] m_eth_type, + output wire [DATA_WIDTH-1:0] m_eth_payload_axis_tdata, + output wire [KEEP_WIDTH-1:0] m_eth_payload_axis_tkeep, + output wire m_eth_payload_axis_tvalid, + input wire m_eth_payload_axis_tready, + output wire m_eth_payload_axis_tlast, + output wire m_eth_payload_axis_tuser, + + /* + * ARP requests + */ + input wire arp_request_valid, + output wire arp_request_ready, + input wire [31:0] arp_request_ip, + output wire arp_response_valid, + input wire arp_response_ready, + output wire arp_response_error, + output wire [47:0] arp_response_mac, + + /* + * Configuration + */ + input wire [47:0] local_mac, + input wire [31:0] local_ip, + input wire [31:0] gateway_ip, + input wire [31:0] subnet_mask, + input wire clear_cache +); + +localparam [15:0] + ARP_OPER_ARP_REQUEST = 16'h0001, + ARP_OPER_ARP_REPLY = 16'h0002, + ARP_OPER_INARP_REQUEST = 16'h0008, + ARP_OPER_INARP_REPLY = 16'h0009; + +wire incoming_frame_valid; +reg incoming_frame_ready; +wire [47:0] incoming_eth_dest_mac; +wire [47:0] incoming_eth_src_mac; +wire [15:0] incoming_eth_type; +wire [15:0] incoming_arp_htype; +wire [15:0] incoming_arp_ptype; +wire [7:0] incoming_arp_hlen; +wire [7:0] incoming_arp_plen; +wire [15:0] incoming_arp_oper; +wire [47:0] incoming_arp_sha; +wire [31:0] incoming_arp_spa; +wire [47:0] incoming_arp_tha; +wire [31:0] incoming_arp_tpa; + +/* + * ARP frame processing + */ +arp_eth_rx #( + .DATA_WIDTH(DATA_WIDTH), + .KEEP_ENABLE(KEEP_ENABLE), + .KEEP_WIDTH(KEEP_WIDTH) +) +arp_eth_rx_inst ( + .clk(clk), + .rst(rst), + // Ethernet frame input + .s_eth_hdr_valid(s_eth_hdr_valid), + .s_eth_hdr_ready(s_eth_hdr_ready), + .s_eth_dest_mac(s_eth_dest_mac), + .s_eth_src_mac(s_eth_src_mac), + .s_eth_type(s_eth_type), + .s_eth_payload_axis_tdata(s_eth_payload_axis_tdata), + .s_eth_payload_axis_tkeep(s_eth_payload_axis_tkeep), + .s_eth_payload_axis_tvalid(s_eth_payload_axis_tvalid), + .s_eth_payload_axis_tready(s_eth_payload_axis_tready), + .s_eth_payload_axis_tlast(s_eth_payload_axis_tlast), + .s_eth_payload_axis_tuser(s_eth_payload_axis_tuser), + // ARP frame output + .m_frame_valid(incoming_frame_valid), + .m_frame_ready(incoming_frame_ready), + .m_eth_dest_mac(incoming_eth_dest_mac), + .m_eth_src_mac(incoming_eth_src_mac), + .m_eth_type(incoming_eth_type), + .m_arp_htype(incoming_arp_htype), + .m_arp_ptype(incoming_arp_ptype), + .m_arp_hlen(incoming_arp_hlen), + .m_arp_plen(incoming_arp_plen), + .m_arp_oper(incoming_arp_oper), + .m_arp_sha(incoming_arp_sha), + .m_arp_spa(incoming_arp_spa), + .m_arp_tha(incoming_arp_tha), + .m_arp_tpa(incoming_arp_tpa), + // Status signals + .busy(), + .error_header_early_termination(), + .error_invalid_header() +); + +reg outgoing_frame_valid_reg = 1'b0, outgoing_frame_valid_next; +wire outgoing_frame_ready; +reg [47:0] outgoing_eth_dest_mac_reg = 48'd0, outgoing_eth_dest_mac_next; +reg [15:0] outgoing_arp_oper_reg = 16'd0, outgoing_arp_oper_next; +reg [47:0] outgoing_arp_tha_reg = 48'd0, outgoing_arp_tha_next; +reg [31:0] outgoing_arp_tpa_reg = 32'd0, outgoing_arp_tpa_next; + +arp_eth_tx #( + .DATA_WIDTH(DATA_WIDTH), + .KEEP_ENABLE(KEEP_ENABLE), + .KEEP_WIDTH(KEEP_WIDTH) +) +arp_eth_tx_inst ( + .clk(clk), + .rst(rst), + // ARP frame input + .s_frame_valid(outgoing_frame_valid_reg), + .s_frame_ready(outgoing_frame_ready), + .s_eth_dest_mac(outgoing_eth_dest_mac_reg), + .s_eth_src_mac(local_mac), + .s_eth_type(16'h0806), + .s_arp_htype(16'h0001), + .s_arp_ptype(16'h0800), + .s_arp_oper(outgoing_arp_oper_reg), + .s_arp_sha(local_mac), + .s_arp_spa(local_ip), + .s_arp_tha(outgoing_arp_tha_reg), + .s_arp_tpa(outgoing_arp_tpa_reg), + // Ethernet frame output + .m_eth_hdr_valid(m_eth_hdr_valid), + .m_eth_hdr_ready(m_eth_hdr_ready), + .m_eth_dest_mac(m_eth_dest_mac), + .m_eth_src_mac(m_eth_src_mac), + .m_eth_type(m_eth_type), + .m_eth_payload_axis_tdata(m_eth_payload_axis_tdata), + .m_eth_payload_axis_tkeep(m_eth_payload_axis_tkeep), + .m_eth_payload_axis_tvalid(m_eth_payload_axis_tvalid), + .m_eth_payload_axis_tready(m_eth_payload_axis_tready), + .m_eth_payload_axis_tlast(m_eth_payload_axis_tlast), + .m_eth_payload_axis_tuser(m_eth_payload_axis_tuser), + // Status signals + .busy() +); + +reg cache_query_request_valid_reg = 1'b0, cache_query_request_valid_next; +reg [31:0] cache_query_request_ip_reg = 32'd0, cache_query_request_ip_next; +wire cache_query_response_valid; +wire cache_query_response_error; +wire [47:0] cache_query_response_mac; + +reg cache_write_request_valid_reg = 1'b0, cache_write_request_valid_next; +reg [31:0] cache_write_request_ip_reg = 32'd0, cache_write_request_ip_next; +reg [47:0] cache_write_request_mac_reg = 48'd0, cache_write_request_mac_next; + +/* + * ARP cache + */ +arp_cache #( + .CACHE_ADDR_WIDTH(CACHE_ADDR_WIDTH) +) +arp_cache_inst ( + .clk(clk), + .rst(rst), + // Query cache + .query_request_valid(cache_query_request_valid_reg), + .query_request_ready(), + .query_request_ip(cache_query_request_ip_reg), + .query_response_valid(cache_query_response_valid), + .query_response_ready(1'b1), + .query_response_error(cache_query_response_error), + .query_response_mac(cache_query_response_mac), + // Write cache + .write_request_valid(cache_write_request_valid_reg), + .write_request_ready(), + .write_request_ip(cache_write_request_ip_reg), + .write_request_mac(cache_write_request_mac_reg), + // Configuration + .clear_cache(clear_cache) +); + +reg arp_request_operation_reg = 1'b0, arp_request_operation_next; + +reg arp_request_ready_reg = 1'b0, arp_request_ready_next; +reg [31:0] arp_request_ip_reg = 32'd0, arp_request_ip_next; + +reg arp_response_valid_reg = 1'b0, arp_response_valid_next; +reg arp_response_error_reg = 1'b0, arp_response_error_next; +reg [47:0] arp_response_mac_reg = 48'd0, arp_response_mac_next; + +reg [5:0] arp_request_retry_cnt_reg = 6'd0, arp_request_retry_cnt_next; +reg [35:0] arp_request_timer_reg = 36'd0, arp_request_timer_next; + +assign arp_request_ready = arp_request_ready_reg; + +assign arp_response_valid = arp_response_valid_reg; +assign arp_response_error = arp_response_error_reg; +assign arp_response_mac = arp_response_mac_reg; + +always @* begin + incoming_frame_ready = 1'b0; + + outgoing_frame_valid_next = outgoing_frame_valid_reg && !outgoing_frame_ready; + outgoing_eth_dest_mac_next = outgoing_eth_dest_mac_reg; + outgoing_arp_oper_next = outgoing_arp_oper_reg; + outgoing_arp_tha_next = outgoing_arp_tha_reg; + outgoing_arp_tpa_next = outgoing_arp_tpa_reg; + + cache_query_request_valid_next = 1'b0; + cache_query_request_ip_next = cache_query_request_ip_reg; + + cache_write_request_valid_next = 1'b0; + cache_write_request_mac_next = cache_write_request_mac_reg; + cache_write_request_ip_next = cache_write_request_ip_reg; + + arp_request_ready_next = 1'b0; + arp_request_ip_next = arp_request_ip_reg; + arp_request_operation_next = arp_request_operation_reg; + arp_request_retry_cnt_next = arp_request_retry_cnt_reg; + arp_request_timer_next = arp_request_timer_reg; + arp_response_valid_next = arp_response_valid_reg && !arp_response_ready; + arp_response_error_next = 1'b0; + arp_response_mac_next = 48'd0; + + // manage incoming frames + incoming_frame_ready = outgoing_frame_ready; + if (incoming_frame_valid && incoming_frame_ready) begin + if (incoming_eth_type == 16'h0806 && incoming_arp_htype == 16'h0001 && incoming_arp_ptype == 16'h0800) begin + // store sender addresses in cache + cache_write_request_valid_next = 1'b1; + cache_write_request_ip_next = incoming_arp_spa; + cache_write_request_mac_next = incoming_arp_sha; + if (incoming_arp_oper == ARP_OPER_ARP_REQUEST) begin + // ARP request + if (incoming_arp_tpa == local_ip) begin + // send reply frame to valid incoming request + outgoing_frame_valid_next = 1'b1; + outgoing_eth_dest_mac_next = incoming_eth_src_mac; + outgoing_arp_oper_next = ARP_OPER_ARP_REPLY; + outgoing_arp_tha_next = incoming_arp_sha; + outgoing_arp_tpa_next = incoming_arp_spa; + end + end else if (incoming_arp_oper == ARP_OPER_INARP_REQUEST) begin + // INARP request + if (incoming_arp_tha == local_mac) begin + // send reply frame to valid incoming request + outgoing_frame_valid_next = 1'b1; + outgoing_eth_dest_mac_next = incoming_eth_src_mac; + outgoing_arp_oper_next = ARP_OPER_INARP_REPLY; + outgoing_arp_tha_next = incoming_arp_sha; + outgoing_arp_tpa_next = incoming_arp_spa; + end + end + end + end + + // manage ARP lookup requests + if (arp_request_operation_reg) begin + arp_request_ready_next = 1'b0; + cache_query_request_valid_next = 1'b1; + arp_request_timer_next = arp_request_timer_reg - 1; + // if we got a response, it will go in the cache, so when the query succeds, we're done + if (cache_query_response_valid && !cache_query_response_error) begin + arp_request_operation_next = 1'b0; + cache_query_request_valid_next = 1'b0; + arp_response_valid_next = 1'b1; + arp_response_error_next = 1'b0; + arp_response_mac_next = cache_query_response_mac; + end + // timer timeout + if (arp_request_timer_reg == 0) begin + if (arp_request_retry_cnt_reg > 0) begin + // have more retries + // send ARP request frame + outgoing_frame_valid_next = 1'b1; + outgoing_eth_dest_mac_next = 48'hffffffffffff; + outgoing_arp_oper_next = ARP_OPER_ARP_REQUEST; + outgoing_arp_tha_next = 48'h000000000000; + outgoing_arp_tpa_next = arp_request_ip_reg; + arp_request_retry_cnt_next = arp_request_retry_cnt_reg - 1; + if (arp_request_retry_cnt_reg > 1) begin + arp_request_timer_next = REQUEST_RETRY_INTERVAL; + end else begin + arp_request_timer_next = REQUEST_TIMEOUT; + end + end else begin + // out of retries + arp_request_operation_next = 1'b0; + arp_response_valid_next = 1'b1; + arp_response_error_next = 1'b1; + cache_query_request_valid_next = 1'b0; + end + end + end else begin + arp_request_ready_next = !arp_response_valid_next; + if (cache_query_request_valid_reg) begin + cache_query_request_valid_next = 1'b1; + if (cache_query_response_valid) begin + if (cache_query_response_error) begin + arp_request_operation_next = 1'b1; + // send ARP request frame + outgoing_frame_valid_next = 1'b1; + outgoing_eth_dest_mac_next = 48'hffffffffffff; + outgoing_arp_oper_next = ARP_OPER_ARP_REQUEST; + outgoing_arp_tha_next = 48'h000000000000; + outgoing_arp_tpa_next = arp_request_ip_reg; + arp_request_retry_cnt_next = REQUEST_RETRY_COUNT-1; + arp_request_timer_next = REQUEST_RETRY_INTERVAL; + end else begin + cache_query_request_valid_next = 1'b0; + arp_response_valid_next = 1'b1; + arp_response_error_next = 1'b0; + arp_response_mac_next = cache_query_response_mac; + end + end + end else if (arp_request_valid && arp_request_ready) begin + if (arp_request_ip == 32'hffffffff) begin + // broadcast address; use broadcast MAC address + arp_response_valid_next = 1'b1; + arp_response_error_next = 1'b0; + arp_response_mac_next = 48'hffffffffffff; + end else if (((arp_request_ip ^ gateway_ip) & subnet_mask) == 0) begin + // within subnet + // (no bits differ between request IP and gateway IP where subnet mask is set) + if (~(arp_request_ip | subnet_mask) == 0) begin + // broadcast address; use broadcast MAC address + // (all bits in request IP set where subnet mask is clear) + arp_response_valid_next = 1'b1; + arp_response_error_next = 1'b0; + arp_response_mac_next = 48'hffffffffffff; + end else begin + // unicast address; look up IP directly + cache_query_request_valid_next = 1'b1; + cache_query_request_ip_next = arp_request_ip; + arp_request_ip_next = arp_request_ip; + end + end else begin + // outside of subnet, so look up gateway address + cache_query_request_valid_next = 1'b1; + cache_query_request_ip_next = gateway_ip; + arp_request_ip_next = gateway_ip; + end + end + end +end + +always @(posedge clk) begin + if (rst) begin + outgoing_frame_valid_reg <= 1'b0; + cache_query_request_valid_reg <= 1'b0; + cache_write_request_valid_reg <= 1'b0; + arp_request_ready_reg <= 1'b0; + arp_request_operation_reg <= 1'b0; + arp_request_retry_cnt_reg <= 6'd0; + arp_request_timer_reg <= 36'd0; + arp_response_valid_reg <= 1'b0; + end else begin + outgoing_frame_valid_reg <= outgoing_frame_valid_next; + cache_query_request_valid_reg <= cache_query_request_valid_next; + cache_write_request_valid_reg <= cache_write_request_valid_next; + arp_request_ready_reg <= arp_request_ready_next; + arp_request_operation_reg <= arp_request_operation_next; + arp_request_retry_cnt_reg <= arp_request_retry_cnt_next; + arp_request_timer_reg <= arp_request_timer_next; + arp_response_valid_reg <= arp_response_valid_next; + end + + cache_query_request_ip_reg <= cache_query_request_ip_next; + outgoing_eth_dest_mac_reg <= outgoing_eth_dest_mac_next; + outgoing_arp_oper_reg <= outgoing_arp_oper_next; + outgoing_arp_tha_reg <= outgoing_arp_tha_next; + outgoing_arp_tpa_reg <= outgoing_arp_tpa_next; + cache_write_request_mac_reg <= cache_write_request_mac_next; + cache_write_request_ip_reg <= cache_write_request_ip_next; + arp_request_ip_reg <= arp_request_ip_next; + arp_response_error_reg <= arp_response_error_next; + arp_response_mac_reg <= arp_response_mac_next; +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp_cache.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp_cache.v new file mode 100755 index 0000000..53fe6cd --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp_cache.v @@ -0,0 +1,247 @@ +/* + +Copyright (c) 2014-2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * ARP cache + */ +module arp_cache #( + parameter CACHE_ADDR_WIDTH = 9 +) +( + input wire clk, + input wire rst, + + /* + * Cache query + */ + input wire query_request_valid, + output wire query_request_ready, + input wire [31:0] query_request_ip, + + output wire query_response_valid, + input wire query_response_ready, + output wire query_response_error, + output wire [47:0] query_response_mac, + + /* + * Cache write + */ + input wire write_request_valid, + output wire write_request_ready, + input wire [31:0] write_request_ip, + input wire [47:0] write_request_mac, + + /* + * Configuration + */ + input wire clear_cache +); + +reg mem_write = 0; +reg store_query = 0; +reg store_write = 0; + +reg query_ip_valid_reg = 0, query_ip_valid_next; +reg [31:0] query_ip_reg = 0; +reg write_ip_valid_reg = 0, write_ip_valid_next; +reg [31:0] write_ip_reg = 0; +reg [47:0] write_mac_reg = 0; +reg clear_cache_reg = 0, clear_cache_next; + +reg [CACHE_ADDR_WIDTH-1:0] wr_ptr_reg = {CACHE_ADDR_WIDTH{1'b0}}, wr_ptr_next; +reg [CACHE_ADDR_WIDTH-1:0] rd_ptr_reg = {CACHE_ADDR_WIDTH{1'b0}}, rd_ptr_next; + +reg valid_mem[(2**CACHE_ADDR_WIDTH)-1:0]; +reg [31:0] ip_addr_mem[(2**CACHE_ADDR_WIDTH)-1:0]; +reg [47:0] mac_addr_mem[(2**CACHE_ADDR_WIDTH)-1:0]; + +reg query_request_ready_reg = 0, query_request_ready_next; + +reg query_response_valid_reg = 0, query_response_valid_next; +reg query_response_error_reg = 0, query_response_error_next; +reg [47:0] query_response_mac_reg = 0; + +reg write_request_ready_reg = 0, write_request_ready_next; + +wire [31:0] query_request_hash; +wire [31:0] write_request_hash; + +assign query_request_ready = query_request_ready_reg; + +assign query_response_valid = query_response_valid_reg; +assign query_response_error = query_response_error_reg; +assign query_response_mac = query_response_mac_reg; + +assign write_request_ready = write_request_ready_reg; + +lfsr #( + .LFSR_WIDTH(32), + .LFSR_POLY(32'h4c11db7), + .LFSR_CONFIG("GALOIS"), + .LFSR_FEED_FORWARD(0), + .REVERSE(1), + .DATA_WIDTH(32), + .STYLE("AUTO") +) +rd_hash ( + .data_in(query_request_ip), + .state_in(32'hffffffff), + .data_out(), + .state_out(query_request_hash) +); + +lfsr #( + .LFSR_WIDTH(32), + .LFSR_POLY(32'h4c11db7), + .LFSR_CONFIG("GALOIS"), + .LFSR_FEED_FORWARD(0), + .REVERSE(1), + .DATA_WIDTH(32), + .STYLE("AUTO") +) +wr_hash ( + .data_in(write_request_ip), + .state_in(32'hffffffff), + .data_out(), + .state_out(write_request_hash) +); + +integer i; + +initial begin + for (i = 0; i < 2**CACHE_ADDR_WIDTH; i = i + 1) begin + valid_mem[i] = 1'b0; + ip_addr_mem[i] = 32'd0; + mac_addr_mem[i] = 48'd0; + end +end + +always @* begin + mem_write = 1'b0; + store_query = 1'b0; + store_write = 1'b0; + + wr_ptr_next = wr_ptr_reg; + rd_ptr_next = rd_ptr_reg; + + clear_cache_next = clear_cache_reg | clear_cache; + + query_ip_valid_next = query_ip_valid_reg; + + query_request_ready_next = (~query_ip_valid_reg || ~query_request_valid || query_response_ready) && !clear_cache_next; + + query_response_valid_next = query_response_valid_reg & ~query_response_ready; + query_response_error_next = query_response_error_reg; + + if (query_ip_valid_reg && (~query_request_valid || query_response_ready)) begin + query_response_valid_next = 1; + query_ip_valid_next = 0; + if (valid_mem[rd_ptr_reg] && ip_addr_mem[rd_ptr_reg] == query_ip_reg) begin + query_response_error_next = 0; + end else begin + query_response_error_next = 1; + end + end + + if (query_request_valid && query_request_ready && (~query_ip_valid_reg || ~query_request_valid || query_response_ready)) begin + store_query = 1; + query_ip_valid_next = 1; + rd_ptr_next = query_request_hash[CACHE_ADDR_WIDTH-1:0]; + end + + write_ip_valid_next = write_ip_valid_reg; + + write_request_ready_next = !clear_cache_next; + + if (write_ip_valid_reg) begin + write_ip_valid_next = 0; + mem_write = 1; + end + + if (write_request_valid && write_request_ready) begin + store_write = 1; + write_ip_valid_next = 1; + wr_ptr_next = write_request_hash[CACHE_ADDR_WIDTH-1:0]; + end + + if (clear_cache) begin + clear_cache_next = 1'b1; + wr_ptr_next = 0; + end else if (clear_cache_reg) begin + wr_ptr_next = wr_ptr_reg + 1; + clear_cache_next = wr_ptr_next != 0; + mem_write = 1; + end +end + +always @(posedge clk) begin + if (rst) begin + query_ip_valid_reg <= 1'b0; + query_request_ready_reg <= 1'b0; + query_response_valid_reg <= 1'b0; + write_ip_valid_reg <= 1'b0; + write_request_ready_reg <= 1'b0; + clear_cache_reg <= 1'b1; + wr_ptr_reg <= 0; + end else begin + query_ip_valid_reg <= query_ip_valid_next; + query_request_ready_reg <= query_request_ready_next; + query_response_valid_reg <= query_response_valid_next; + write_ip_valid_reg <= write_ip_valid_next; + write_request_ready_reg <= write_request_ready_next; + clear_cache_reg <= clear_cache_next; + wr_ptr_reg <= wr_ptr_next; + end + + query_response_error_reg <= query_response_error_next; + + if (store_query) begin + query_ip_reg <= query_request_ip; + end + + if (store_write) begin + write_ip_reg <= write_request_ip; + write_mac_reg <= write_request_mac; + end + + rd_ptr_reg <= rd_ptr_next; + + query_response_mac_reg <= mac_addr_mem[rd_ptr_reg]; + + if (mem_write) begin + valid_mem[wr_ptr_reg] <= !clear_cache_reg; + ip_addr_mem[wr_ptr_reg] <= write_ip_reg; + mac_addr_mem[wr_ptr_reg] <= write_mac_reg; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp_eth_rx.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp_eth_rx.v new file mode 100755 index 0000000..bfc74b1 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp_eth_rx.v @@ -0,0 +1,331 @@ +/* + +Copyright (c) 2014-2020 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * ARP ethernet frame receiver (Ethernet frame in, ARP frame out) + */ +module arp_eth_rx # +( + // Width of AXI stream interfaces in bits + parameter DATA_WIDTH = 8, + // Propagate tkeep signal + // If disabled, tkeep assumed to be 1'b1 + parameter KEEP_ENABLE = (DATA_WIDTH>8), + // tkeep signal width (words per cycle) + parameter KEEP_WIDTH = (DATA_WIDTH/8) +) +( + input wire clk, + input wire rst, + + /* + * Ethernet frame input + */ + input wire s_eth_hdr_valid, + output wire s_eth_hdr_ready, + input wire [47:0] s_eth_dest_mac, + input wire [47:0] s_eth_src_mac, + input wire [15:0] s_eth_type, + input wire [DATA_WIDTH-1:0] s_eth_payload_axis_tdata, + input wire [KEEP_WIDTH-1:0] s_eth_payload_axis_tkeep, + input wire s_eth_payload_axis_tvalid, + output wire s_eth_payload_axis_tready, + input wire s_eth_payload_axis_tlast, + input wire s_eth_payload_axis_tuser, + + /* + * ARP frame output + */ + output wire m_frame_valid, + input wire m_frame_ready, + output wire [47:0] m_eth_dest_mac, + output wire [47:0] m_eth_src_mac, + output wire [15:0] m_eth_type, + output wire [15:0] m_arp_htype, + output wire [15:0] m_arp_ptype, + output wire [7:0] m_arp_hlen, + output wire [7:0] m_arp_plen, + output wire [15:0] m_arp_oper, + output wire [47:0] m_arp_sha, + output wire [31:0] m_arp_spa, + output wire [47:0] m_arp_tha, + output wire [31:0] m_arp_tpa, + + /* + * Status signals + */ + output wire busy, + output wire error_header_early_termination, + output wire error_invalid_header +); + +parameter BYTE_LANES = KEEP_ENABLE ? KEEP_WIDTH : 1; + +parameter HDR_SIZE = 28; + +parameter CYCLE_COUNT = (HDR_SIZE+BYTE_LANES-1)/BYTE_LANES; + +parameter PTR_WIDTH = $clog2(CYCLE_COUNT); + +parameter OFFSET = HDR_SIZE % BYTE_LANES; + +// bus width assertions +initial begin + if (BYTE_LANES * 8 != DATA_WIDTH) begin + $error("Error: AXI stream interface requires byte (8-bit) granularity (instance %m)"); + $finish; + end +end + +/* + +ARP Frame + + Field Length + Destination MAC address 6 octets + Source MAC address 6 octets + Ethertype (0x0806) 2 octets + HTYPE (1) 2 octets + PTYPE (0x0800) 2 octets + HLEN (6) 1 octets + PLEN (4) 1 octets + OPER 2 octets + SHA Sender MAC 6 octets + SPA Sender IP 4 octets + THA Target MAC 6 octets + TPA Target IP 4 octets + +This module receives an Ethernet frame with header fields in parallel and +payload on an AXI stream interface, decodes the ARP packet fields, and +produces the frame fields in parallel. + +*/ + +// datapath control signals +reg store_eth_hdr; + +reg read_eth_header_reg = 1'b1, read_eth_header_next; +reg read_arp_header_reg = 1'b0, read_arp_header_next; +reg [PTR_WIDTH-1:0] ptr_reg = 0, ptr_next; + +reg s_eth_hdr_ready_reg = 1'b0, s_eth_hdr_ready_next; +reg s_eth_payload_axis_tready_reg = 1'b0, s_eth_payload_axis_tready_next; + +reg m_frame_valid_reg = 1'b0, m_frame_valid_next; +reg [47:0] m_eth_dest_mac_reg = 48'd0; +reg [47:0] m_eth_src_mac_reg = 48'd0; +reg [15:0] m_eth_type_reg = 16'd0; +reg [15:0] m_arp_htype_reg = 16'd0, m_arp_htype_next; +reg [15:0] m_arp_ptype_reg = 16'd0, m_arp_ptype_next; +reg [7:0] m_arp_hlen_reg = 8'd0, m_arp_hlen_next; +reg [7:0] m_arp_plen_reg = 8'd0, m_arp_plen_next; +reg [15:0] m_arp_oper_reg = 16'd0, m_arp_oper_next; +reg [47:0] m_arp_sha_reg = 48'd0, m_arp_sha_next; +reg [31:0] m_arp_spa_reg = 32'd0, m_arp_spa_next; +reg [47:0] m_arp_tha_reg = 48'd0, m_arp_tha_next; +reg [31:0] m_arp_tpa_reg = 32'd0, m_arp_tpa_next; + +reg busy_reg = 1'b0; +reg error_header_early_termination_reg = 1'b0, error_header_early_termination_next; +reg error_invalid_header_reg = 1'b0, error_invalid_header_next; + +assign s_eth_hdr_ready = s_eth_hdr_ready_reg; +assign s_eth_payload_axis_tready = s_eth_payload_axis_tready_reg; + +assign m_frame_valid = m_frame_valid_reg; +assign m_eth_dest_mac = m_eth_dest_mac_reg; +assign m_eth_src_mac = m_eth_src_mac_reg; +assign m_eth_type = m_eth_type_reg; +assign m_arp_htype = m_arp_htype_reg; +assign m_arp_ptype = m_arp_ptype_reg; +assign m_arp_hlen = m_arp_hlen_reg; +assign m_arp_plen = m_arp_plen_reg; +assign m_arp_oper = m_arp_oper_reg; +assign m_arp_sha = m_arp_sha_reg; +assign m_arp_spa = m_arp_spa_reg; +assign m_arp_tha = m_arp_tha_reg; +assign m_arp_tpa = m_arp_tpa_reg; + +assign busy = busy_reg; +assign error_header_early_termination = error_header_early_termination_reg; +assign error_invalid_header = error_invalid_header_reg; + +always @* begin + read_eth_header_next = read_eth_header_reg; + read_arp_header_next = read_arp_header_reg; + ptr_next = ptr_reg; + + s_eth_hdr_ready_next = 1'b0; + s_eth_payload_axis_tready_next = 1'b0; + + store_eth_hdr = 1'b0; + + m_frame_valid_next = m_frame_valid_reg && !m_frame_ready; + + m_arp_htype_next = m_arp_htype_reg; + m_arp_ptype_next = m_arp_ptype_reg; + m_arp_hlen_next = m_arp_hlen_reg; + m_arp_plen_next = m_arp_plen_reg; + m_arp_oper_next = m_arp_oper_reg; + m_arp_sha_next = m_arp_sha_reg; + m_arp_spa_next = m_arp_spa_reg; + m_arp_tha_next = m_arp_tha_reg; + m_arp_tpa_next = m_arp_tpa_reg; + + error_header_early_termination_next = 1'b0; + error_invalid_header_next = 1'b0; + + if (s_eth_hdr_ready && s_eth_hdr_valid) begin + if (read_eth_header_reg) begin + store_eth_hdr = 1'b1; + ptr_next = 0; + read_eth_header_next = 1'b0; + read_arp_header_next = 1'b1; + end + end + + if (s_eth_payload_axis_tready && s_eth_payload_axis_tvalid) begin + if (read_arp_header_reg) begin + // word transfer in - store it + ptr_next = ptr_reg + 1; + + `define _HEADER_FIELD_(offset, field) \ + if (ptr_reg == offset/BYTE_LANES && (!KEEP_ENABLE || s_eth_payload_axis_tkeep[offset%BYTE_LANES])) begin \ + field = s_eth_payload_axis_tdata[(offset%BYTE_LANES)*8 +: 8]; \ + end + + `_HEADER_FIELD_(0, m_arp_htype_next[1*8 +: 8]) + `_HEADER_FIELD_(1, m_arp_htype_next[0*8 +: 8]) + `_HEADER_FIELD_(2, m_arp_ptype_next[1*8 +: 8]) + `_HEADER_FIELD_(3, m_arp_ptype_next[0*8 +: 8]) + `_HEADER_FIELD_(4, m_arp_hlen_next[0*8 +: 8]) + `_HEADER_FIELD_(5, m_arp_plen_next[0*8 +: 8]) + `_HEADER_FIELD_(6, m_arp_oper_next[1*8 +: 8]) + `_HEADER_FIELD_(7, m_arp_oper_next[0*8 +: 8]) + `_HEADER_FIELD_(8, m_arp_sha_next[5*8 +: 8]) + `_HEADER_FIELD_(9, m_arp_sha_next[4*8 +: 8]) + `_HEADER_FIELD_(10, m_arp_sha_next[3*8 +: 8]) + `_HEADER_FIELD_(11, m_arp_sha_next[2*8 +: 8]) + `_HEADER_FIELD_(12, m_arp_sha_next[1*8 +: 8]) + `_HEADER_FIELD_(13, m_arp_sha_next[0*8 +: 8]) + `_HEADER_FIELD_(14, m_arp_spa_next[3*8 +: 8]) + `_HEADER_FIELD_(15, m_arp_spa_next[2*8 +: 8]) + `_HEADER_FIELD_(16, m_arp_spa_next[1*8 +: 8]) + `_HEADER_FIELD_(17, m_arp_spa_next[0*8 +: 8]) + `_HEADER_FIELD_(18, m_arp_tha_next[5*8 +: 8]) + `_HEADER_FIELD_(19, m_arp_tha_next[4*8 +: 8]) + `_HEADER_FIELD_(20, m_arp_tha_next[3*8 +: 8]) + `_HEADER_FIELD_(21, m_arp_tha_next[2*8 +: 8]) + `_HEADER_FIELD_(22, m_arp_tha_next[1*8 +: 8]) + `_HEADER_FIELD_(23, m_arp_tha_next[0*8 +: 8]) + `_HEADER_FIELD_(24, m_arp_tpa_next[3*8 +: 8]) + `_HEADER_FIELD_(25, m_arp_tpa_next[2*8 +: 8]) + `_HEADER_FIELD_(26, m_arp_tpa_next[1*8 +: 8]) + `_HEADER_FIELD_(27, m_arp_tpa_next[0*8 +: 8]) + + if (ptr_reg == 27/BYTE_LANES && (!KEEP_ENABLE || s_eth_payload_axis_tkeep[27%BYTE_LANES])) begin + read_arp_header_next = 1'b0; + end + + `undef _HEADER_FIELD_ + end + + if (s_eth_payload_axis_tlast) begin + if (read_arp_header_next) begin + // don't have the whole header + error_header_early_termination_next = 1'b1; + end else if (m_arp_hlen_next != 4'd6 || m_arp_plen_next != 4'd4) begin + // lengths not valid + error_invalid_header_next = 1'b1; + end else begin + // otherwise, transfer tuser + m_frame_valid_next = !s_eth_payload_axis_tuser; + end + + ptr_next = 1'b0; + read_eth_header_next = 1'b1; + read_arp_header_next = 1'b0; + end + end + + if (read_eth_header_next) begin + s_eth_hdr_ready_next = !m_frame_valid_next; + end else begin + s_eth_payload_axis_tready_next = 1'b1; + end +end + +always @(posedge clk) begin + read_eth_header_reg <= read_eth_header_next; + read_arp_header_reg <= read_arp_header_next; + ptr_reg <= ptr_next; + + s_eth_hdr_ready_reg <= s_eth_hdr_ready_next; + s_eth_payload_axis_tready_reg <= s_eth_payload_axis_tready_next; + + m_frame_valid_reg <= m_frame_valid_next; + + m_arp_htype_reg <= m_arp_htype_next; + m_arp_ptype_reg <= m_arp_ptype_next; + m_arp_hlen_reg <= m_arp_hlen_next; + m_arp_plen_reg <= m_arp_plen_next; + m_arp_oper_reg <= m_arp_oper_next; + m_arp_sha_reg <= m_arp_sha_next; + m_arp_spa_reg <= m_arp_spa_next; + m_arp_tha_reg <= m_arp_tha_next; + m_arp_tpa_reg <= m_arp_tpa_next; + + error_header_early_termination_reg <= error_header_early_termination_next; + error_invalid_header_reg <= error_invalid_header_next; + + busy_reg <= read_arp_header_next; + + // datapath + if (store_eth_hdr) begin + m_eth_dest_mac_reg <= s_eth_dest_mac; + m_eth_src_mac_reg <= s_eth_src_mac; + m_eth_type_reg <= s_eth_type; + end + + if (rst) begin + read_eth_header_reg <= 1'b1; + read_arp_header_reg <= 1'b0; + ptr_reg <= 0; + s_eth_payload_axis_tready_reg <= 1'b0; + m_frame_valid_reg <= 1'b0; + busy_reg <= 1'b0; + error_header_early_termination_reg <= 1'b0; + error_invalid_header_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp_eth_tx.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp_eth_tx.v new file mode 100755 index 0000000..4fde08a --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/arp_eth_tx.v @@ -0,0 +1,368 @@ +/* + +Copyright (c) 2014-2020 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * ARP ethernet frame transmitter (ARP frame in, Ethernet frame out) + */ +module arp_eth_tx # +( + // Width of AXI stream interfaces in bits + parameter DATA_WIDTH = 8, + // Propagate tkeep signal + // If disabled, tkeep assumed to be 1'b1 + parameter KEEP_ENABLE = (DATA_WIDTH>8), + // tkeep signal width (words per cycle) + parameter KEEP_WIDTH = (DATA_WIDTH/8) +) +( + input wire clk, + input wire rst, + + /* + * ARP frame input + */ + input wire s_frame_valid, + output wire s_frame_ready, + input wire [47:0] s_eth_dest_mac, + input wire [47:0] s_eth_src_mac, + input wire [15:0] s_eth_type, + input wire [15:0] s_arp_htype, + input wire [15:0] s_arp_ptype, + input wire [15:0] s_arp_oper, + input wire [47:0] s_arp_sha, + input wire [31:0] s_arp_spa, + input wire [47:0] s_arp_tha, + input wire [31:0] s_arp_tpa, + + /* + * Ethernet frame output + */ + output wire m_eth_hdr_valid, + input wire m_eth_hdr_ready, + output wire [47:0] m_eth_dest_mac, + output wire [47:0] m_eth_src_mac, + output wire [15:0] m_eth_type, + output wire [DATA_WIDTH-1:0] m_eth_payload_axis_tdata, + output wire [KEEP_WIDTH-1:0] m_eth_payload_axis_tkeep, + output wire m_eth_payload_axis_tvalid, + input wire m_eth_payload_axis_tready, + output wire m_eth_payload_axis_tlast, + output wire m_eth_payload_axis_tuser, + + /* + * Status signals + */ + output wire busy +); + +parameter BYTE_LANES = KEEP_ENABLE ? KEEP_WIDTH : 1; + +parameter HDR_SIZE = 28; + +parameter CYCLE_COUNT = (HDR_SIZE+BYTE_LANES-1)/BYTE_LANES; + +parameter PTR_WIDTH = $clog2(CYCLE_COUNT); + +parameter OFFSET = HDR_SIZE % BYTE_LANES; + +// bus width assertions +initial begin + if (BYTE_LANES * 8 != DATA_WIDTH) begin + $error("Error: AXI stream interface requires byte (8-bit) granularity (instance %m)"); + $finish; + end +end + +/* + +ARP Frame + + Field Length + Destination MAC address 6 octets + Source MAC address 6 octets + Ethertype (0x0806) 2 octets + HTYPE (1) 2 octets + PTYPE (0x0800) 2 octets + HLEN (6) 1 octets + PLEN (4) 1 octets + OPER 2 octets + SHA Sender MAC 6 octets + SPA Sender IP 4 octets + THA Target MAC 6 octets + TPA Target IP 4 octets + +This module receives an ARP frame with header fields in parallel and +transmits the complete Ethernet payload on an AXI interface. + +*/ + +// datapath control signals +reg store_frame; + +reg send_arp_header_reg = 1'b0, send_arp_header_next; +reg [PTR_WIDTH-1:0] ptr_reg = 0, ptr_next; + +reg [15:0] arp_htype_reg = 16'd0; +reg [15:0] arp_ptype_reg = 16'd0; +reg [15:0] arp_oper_reg = 16'd0; +reg [47:0] arp_sha_reg = 48'd0; +reg [31:0] arp_spa_reg = 32'd0; +reg [47:0] arp_tha_reg = 48'd0; +reg [31:0] arp_tpa_reg = 32'd0; + +reg s_frame_ready_reg = 1'b0, s_frame_ready_next; + +reg m_eth_hdr_valid_reg = 1'b0, m_eth_hdr_valid_next; +reg [47:0] m_eth_dest_mac_reg = 48'd0; +reg [47:0] m_eth_src_mac_reg = 48'd0; +reg [15:0] m_eth_type_reg = 16'd0; + +reg busy_reg = 1'b0; + +// internal datapath +reg [DATA_WIDTH-1:0] m_eth_payload_axis_tdata_int; +reg [KEEP_WIDTH-1:0] m_eth_payload_axis_tkeep_int; +reg m_eth_payload_axis_tvalid_int; +reg m_eth_payload_axis_tready_int_reg = 1'b0; +reg m_eth_payload_axis_tlast_int; +reg m_eth_payload_axis_tuser_int; +wire m_eth_payload_axis_tready_int_early; + +assign s_frame_ready = s_frame_ready_reg; + +assign m_eth_hdr_valid = m_eth_hdr_valid_reg; +assign m_eth_dest_mac = m_eth_dest_mac_reg; +assign m_eth_src_mac = m_eth_src_mac_reg; +assign m_eth_type = m_eth_type_reg; + +assign busy = busy_reg; + +always @* begin + send_arp_header_next = send_arp_header_reg; + ptr_next = ptr_reg; + + s_frame_ready_next = 1'b0; + + store_frame = 1'b0; + + m_eth_hdr_valid_next = m_eth_hdr_valid_reg && !m_eth_hdr_ready; + + m_eth_payload_axis_tdata_int = {DATA_WIDTH{1'b0}}; + m_eth_payload_axis_tkeep_int = {KEEP_WIDTH{1'b0}}; + m_eth_payload_axis_tvalid_int = 1'b0; + m_eth_payload_axis_tlast_int = 1'b0; + m_eth_payload_axis_tuser_int = 1'b0; + + if (s_frame_ready && s_frame_valid) begin + store_frame = 1'b1; + m_eth_hdr_valid_next = 1'b1; + ptr_next = 0; + send_arp_header_next = 1'b1; + end + + if (m_eth_payload_axis_tready_int_reg) begin + if (send_arp_header_reg) begin + ptr_next = ptr_reg + 1; + + m_eth_payload_axis_tdata_int = {DATA_WIDTH{1'b0}}; + m_eth_payload_axis_tkeep_int = {KEEP_WIDTH{1'b0}}; + m_eth_payload_axis_tvalid_int = 1'b1; + m_eth_payload_axis_tlast_int = 1'b0; + m_eth_payload_axis_tuser_int = 1'b0; + + `define _HEADER_FIELD_(offset, field) \ + if (ptr_reg == offset/BYTE_LANES) begin \ + m_eth_payload_axis_tdata_int[(offset%BYTE_LANES)*8 +: 8] = field; \ + m_eth_payload_axis_tkeep_int[offset%BYTE_LANES] = 1'b1; \ + end + + `_HEADER_FIELD_(0, arp_htype_reg[1*8 +: 8]) + `_HEADER_FIELD_(1, arp_htype_reg[0*8 +: 8]) + `_HEADER_FIELD_(2, arp_ptype_reg[1*8 +: 8]) + `_HEADER_FIELD_(3, arp_ptype_reg[0*8 +: 8]) + `_HEADER_FIELD_(4, 8'd6) + `_HEADER_FIELD_(5, 8'd4) + `_HEADER_FIELD_(6, arp_oper_reg[1*8 +: 8]) + `_HEADER_FIELD_(7, arp_oper_reg[0*8 +: 8]) + `_HEADER_FIELD_(8, arp_sha_reg[5*8 +: 8]) + `_HEADER_FIELD_(9, arp_sha_reg[4*8 +: 8]) + `_HEADER_FIELD_(10, arp_sha_reg[3*8 +: 8]) + `_HEADER_FIELD_(11, arp_sha_reg[2*8 +: 8]) + `_HEADER_FIELD_(12, arp_sha_reg[1*8 +: 8]) + `_HEADER_FIELD_(13, arp_sha_reg[0*8 +: 8]) + `_HEADER_FIELD_(14, arp_spa_reg[3*8 +: 8]) + `_HEADER_FIELD_(15, arp_spa_reg[2*8 +: 8]) + `_HEADER_FIELD_(16, arp_spa_reg[1*8 +: 8]) + `_HEADER_FIELD_(17, arp_spa_reg[0*8 +: 8]) + `_HEADER_FIELD_(18, arp_tha_reg[5*8 +: 8]) + `_HEADER_FIELD_(19, arp_tha_reg[4*8 +: 8]) + `_HEADER_FIELD_(20, arp_tha_reg[3*8 +: 8]) + `_HEADER_FIELD_(21, arp_tha_reg[2*8 +: 8]) + `_HEADER_FIELD_(22, arp_tha_reg[1*8 +: 8]) + `_HEADER_FIELD_(23, arp_tha_reg[0*8 +: 8]) + `_HEADER_FIELD_(24, arp_tpa_reg[3*8 +: 8]) + `_HEADER_FIELD_(25, arp_tpa_reg[2*8 +: 8]) + `_HEADER_FIELD_(26, arp_tpa_reg[1*8 +: 8]) + `_HEADER_FIELD_(27, arp_tpa_reg[0*8 +: 8]) + + if (ptr_reg == 27/BYTE_LANES) begin + m_eth_payload_axis_tlast_int = 1'b1; + send_arp_header_next = 1'b0; + end + + `undef _HEADER_FIELD_ + end + end + + s_frame_ready_next = !m_eth_hdr_valid_next && !send_arp_header_next; +end + +always @(posedge clk) begin + send_arp_header_reg <= send_arp_header_next; + ptr_reg <= ptr_next; + + s_frame_ready_reg <= s_frame_ready_next; + + m_eth_hdr_valid_reg <= m_eth_hdr_valid_next; + + busy_reg <= send_arp_header_next; + + if (store_frame) begin + m_eth_dest_mac_reg <= s_eth_dest_mac; + m_eth_src_mac_reg <= s_eth_src_mac; + m_eth_type_reg <= s_eth_type; + arp_htype_reg <= s_arp_htype; + arp_ptype_reg <= s_arp_ptype; + arp_oper_reg <= s_arp_oper; + arp_sha_reg <= s_arp_sha; + arp_spa_reg <= s_arp_spa; + arp_tha_reg <= s_arp_tha; + arp_tpa_reg <= s_arp_tpa; + end + + if (rst) begin + send_arp_header_reg <= 1'b0; + ptr_reg <= 0; + s_frame_ready_reg <= 1'b0; + m_eth_hdr_valid_reg <= 1'b0; + busy_reg <= 1'b0; + end +end + +// output datapath logic +reg [DATA_WIDTH-1:0] m_eth_payload_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] m_eth_payload_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg m_eth_payload_axis_tvalid_reg = 1'b0, m_eth_payload_axis_tvalid_next; +reg m_eth_payload_axis_tlast_reg = 1'b0; +reg m_eth_payload_axis_tuser_reg = 1'b0; + +reg [DATA_WIDTH-1:0] temp_m_eth_payload_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] temp_m_eth_payload_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg temp_m_eth_payload_axis_tvalid_reg = 1'b0, temp_m_eth_payload_axis_tvalid_next; +reg temp_m_eth_payload_axis_tlast_reg = 1'b0; +reg temp_m_eth_payload_axis_tuser_reg = 1'b0; + +// datapath control +reg store_eth_payload_int_to_output; +reg store_eth_payload_int_to_temp; +reg store_eth_payload_axis_temp_to_output; + +assign m_eth_payload_axis_tdata = m_eth_payload_axis_tdata_reg; +assign m_eth_payload_axis_tkeep = KEEP_ENABLE ? m_eth_payload_axis_tkeep_reg : {KEEP_WIDTH{1'b1}}; +assign m_eth_payload_axis_tvalid = m_eth_payload_axis_tvalid_reg; +assign m_eth_payload_axis_tlast = m_eth_payload_axis_tlast_reg; +assign m_eth_payload_axis_tuser = m_eth_payload_axis_tuser_reg; + +// enable ready input next cycle if output is ready or if both output registers are empty +assign m_eth_payload_axis_tready_int_early = m_eth_payload_axis_tready || (!temp_m_eth_payload_axis_tvalid_reg && !m_eth_payload_axis_tvalid_reg); + +always @* begin + // transfer sink ready state to source + m_eth_payload_axis_tvalid_next = m_eth_payload_axis_tvalid_reg; + temp_m_eth_payload_axis_tvalid_next = temp_m_eth_payload_axis_tvalid_reg; + + store_eth_payload_int_to_output = 1'b0; + store_eth_payload_int_to_temp = 1'b0; + store_eth_payload_axis_temp_to_output = 1'b0; + + if (m_eth_payload_axis_tready_int_reg) begin + // input is ready + if (m_eth_payload_axis_tready || !m_eth_payload_axis_tvalid_reg) begin + // output is ready or currently not valid, transfer data to output + m_eth_payload_axis_tvalid_next = m_eth_payload_axis_tvalid_int; + store_eth_payload_int_to_output = 1'b1; + end else begin + // output is not ready, store input in temp + temp_m_eth_payload_axis_tvalid_next = m_eth_payload_axis_tvalid_int; + store_eth_payload_int_to_temp = 1'b1; + end + end else if (m_eth_payload_axis_tready) begin + // input is not ready, but output is ready + m_eth_payload_axis_tvalid_next = temp_m_eth_payload_axis_tvalid_reg; + temp_m_eth_payload_axis_tvalid_next = 1'b0; + store_eth_payload_axis_temp_to_output = 1'b1; + end +end + +always @(posedge clk) begin + m_eth_payload_axis_tvalid_reg <= m_eth_payload_axis_tvalid_next; + m_eth_payload_axis_tready_int_reg <= m_eth_payload_axis_tready_int_early; + temp_m_eth_payload_axis_tvalid_reg <= temp_m_eth_payload_axis_tvalid_next; + + // datapath + if (store_eth_payload_int_to_output) begin + m_eth_payload_axis_tdata_reg <= m_eth_payload_axis_tdata_int; + m_eth_payload_axis_tkeep_reg <= m_eth_payload_axis_tkeep_int; + m_eth_payload_axis_tlast_reg <= m_eth_payload_axis_tlast_int; + m_eth_payload_axis_tuser_reg <= m_eth_payload_axis_tuser_int; + end else if (store_eth_payload_axis_temp_to_output) begin + m_eth_payload_axis_tdata_reg <= temp_m_eth_payload_axis_tdata_reg; + m_eth_payload_axis_tkeep_reg <= temp_m_eth_payload_axis_tkeep_reg; + m_eth_payload_axis_tlast_reg <= temp_m_eth_payload_axis_tlast_reg; + m_eth_payload_axis_tuser_reg <= temp_m_eth_payload_axis_tuser_reg; + end + + if (store_eth_payload_int_to_temp) begin + temp_m_eth_payload_axis_tdata_reg <= m_eth_payload_axis_tdata_int; + temp_m_eth_payload_axis_tkeep_reg <= m_eth_payload_axis_tkeep_int; + temp_m_eth_payload_axis_tlast_reg <= m_eth_payload_axis_tlast_int; + temp_m_eth_payload_axis_tuser_reg <= m_eth_payload_axis_tuser_int; + end + + if (rst) begin + m_eth_payload_axis_tvalid_reg <= 1'b0; + m_eth_payload_axis_tready_int_reg <= 1'b0; + temp_m_eth_payload_axis_tvalid_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_adapter.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_adapter.v new file mode 100755 index 0000000..0dedfac --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_adapter.v @@ -0,0 +1,325 @@ +/* + +Copyright (c) 2014-2023 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4-Stream bus width adapter + */ +module axis_adapter # +( + // Width of input AXI stream interface in bits + parameter S_DATA_WIDTH = 8, + // Propagate tkeep signal on input interface + // If disabled, tkeep assumed to be 1'b1 + parameter S_KEEP_ENABLE = (S_DATA_WIDTH>8), + // tkeep signal width (words per cycle) on input interface + parameter S_KEEP_WIDTH = ((S_DATA_WIDTH+7)/8), + // Width of output AXI stream interface in bits + parameter M_DATA_WIDTH = 8, + // Propagate tkeep signal on output interface + // If disabled, tkeep assumed to be 1'b1 + parameter M_KEEP_ENABLE = (M_DATA_WIDTH>8), + // tkeep signal width (words per cycle) on output interface + parameter M_KEEP_WIDTH = ((M_DATA_WIDTH+7)/8), + // Propagate tid signal + parameter ID_ENABLE = 0, + // tid signal width + parameter ID_WIDTH = 8, + // Propagate tdest signal + parameter DEST_ENABLE = 0, + // tdest signal width + parameter DEST_WIDTH = 8, + // Propagate tuser signal + parameter USER_ENABLE = 1, + // tuser signal width + parameter USER_WIDTH = 1 +) +( + input wire clk, + input wire rst, + + /* + * AXI input + */ + input wire [S_DATA_WIDTH-1:0] s_axis_tdata, + input wire [S_KEEP_WIDTH-1:0] s_axis_tkeep, + input wire s_axis_tvalid, + output wire s_axis_tready, + input wire s_axis_tlast, + input wire [ID_WIDTH-1:0] s_axis_tid, + input wire [DEST_WIDTH-1:0] s_axis_tdest, + input wire [USER_WIDTH-1:0] s_axis_tuser, + + /* + * AXI output + */ + output wire [M_DATA_WIDTH-1:0] m_axis_tdata, + output wire [M_KEEP_WIDTH-1:0] m_axis_tkeep, + output wire m_axis_tvalid, + input wire m_axis_tready, + output wire m_axis_tlast, + output wire [ID_WIDTH-1:0] m_axis_tid, + output wire [DEST_WIDTH-1:0] m_axis_tdest, + output wire [USER_WIDTH-1:0] m_axis_tuser +); + +// force keep width to 1 when disabled +localparam S_BYTE_LANES = S_KEEP_ENABLE ? S_KEEP_WIDTH : 1; +localparam M_BYTE_LANES = M_KEEP_ENABLE ? M_KEEP_WIDTH : 1; + +// bus byte sizes (must be identical) +localparam S_BYTE_SIZE = S_DATA_WIDTH / S_BYTE_LANES; +localparam M_BYTE_SIZE = M_DATA_WIDTH / M_BYTE_LANES; + +// bus width assertions +initial begin + if (S_BYTE_SIZE * S_BYTE_LANES != S_DATA_WIDTH) begin + $error("Error: input data width not evenly divisible (instance %m)"); + $finish; + end + + if (M_BYTE_SIZE * M_BYTE_LANES != M_DATA_WIDTH) begin + $error("Error: output data width not evenly divisible (instance %m)"); + $finish; + end + + if (S_BYTE_SIZE != M_BYTE_SIZE) begin + $error("Error: byte size mismatch (instance %m)"); + $finish; + end +end + +generate + +if (M_BYTE_LANES == S_BYTE_LANES) begin : bypass + // same width; bypass + + assign s_axis_tready = m_axis_tready; + + assign m_axis_tdata = s_axis_tdata; + assign m_axis_tkeep = M_KEEP_ENABLE ? s_axis_tkeep : {M_KEEP_WIDTH{1'b1}}; + assign m_axis_tvalid = s_axis_tvalid; + assign m_axis_tlast = s_axis_tlast; + assign m_axis_tid = ID_ENABLE ? s_axis_tid : {ID_WIDTH{1'b0}}; + assign m_axis_tdest = DEST_ENABLE ? s_axis_tdest : {DEST_WIDTH{1'b0}}; + assign m_axis_tuser = USER_ENABLE ? s_axis_tuser : {USER_WIDTH{1'b0}}; + +end else if (M_BYTE_LANES > S_BYTE_LANES) begin : upsize + // output is wider; upsize + + // required number of segments in wider bus + localparam SEG_COUNT = M_BYTE_LANES / S_BYTE_LANES; + // data width and keep width per segment + localparam SEG_DATA_WIDTH = M_DATA_WIDTH / SEG_COUNT; + localparam SEG_KEEP_WIDTH = M_BYTE_LANES / SEG_COUNT; + + reg [$clog2(SEG_COUNT)-1:0] seg_reg = 0; + + reg [S_DATA_WIDTH-1:0] s_axis_tdata_reg = {S_DATA_WIDTH{1'b0}}; + reg [S_KEEP_WIDTH-1:0] s_axis_tkeep_reg = {S_KEEP_WIDTH{1'b0}}; + reg s_axis_tvalid_reg = 1'b0; + reg s_axis_tlast_reg = 1'b0; + reg [ID_WIDTH-1:0] s_axis_tid_reg = {ID_WIDTH{1'b0}}; + reg [DEST_WIDTH-1:0] s_axis_tdest_reg = {DEST_WIDTH{1'b0}}; + reg [USER_WIDTH-1:0] s_axis_tuser_reg = {USER_WIDTH{1'b0}}; + + reg [M_DATA_WIDTH-1:0] m_axis_tdata_reg = {M_DATA_WIDTH{1'b0}}; + reg [M_KEEP_WIDTH-1:0] m_axis_tkeep_reg = {M_KEEP_WIDTH{1'b0}}; + reg m_axis_tvalid_reg = 1'b0; + reg m_axis_tlast_reg = 1'b0; + reg [ID_WIDTH-1:0] m_axis_tid_reg = {ID_WIDTH{1'b0}}; + reg [DEST_WIDTH-1:0] m_axis_tdest_reg = {DEST_WIDTH{1'b0}}; + reg [USER_WIDTH-1:0] m_axis_tuser_reg = {USER_WIDTH{1'b0}}; + + assign s_axis_tready = !s_axis_tvalid_reg; + + assign m_axis_tdata = m_axis_tdata_reg; + assign m_axis_tkeep = M_KEEP_ENABLE ? m_axis_tkeep_reg : {M_KEEP_WIDTH{1'b1}}; + assign m_axis_tvalid = m_axis_tvalid_reg; + assign m_axis_tlast = m_axis_tlast_reg; + assign m_axis_tid = ID_ENABLE ? m_axis_tid_reg : {ID_WIDTH{1'b0}}; + assign m_axis_tdest = DEST_ENABLE ? m_axis_tdest_reg : {DEST_WIDTH{1'b0}}; + assign m_axis_tuser = USER_ENABLE ? m_axis_tuser_reg : {USER_WIDTH{1'b0}}; + + always @(posedge clk) begin + m_axis_tvalid_reg <= m_axis_tvalid_reg && !m_axis_tready; + + if (!m_axis_tvalid_reg || m_axis_tready) begin + // output register empty + + if (seg_reg == 0) begin + m_axis_tdata_reg[seg_reg*SEG_DATA_WIDTH +: SEG_DATA_WIDTH] <= s_axis_tvalid_reg ? s_axis_tdata_reg : s_axis_tdata; + m_axis_tkeep_reg <= s_axis_tvalid_reg ? s_axis_tkeep_reg : s_axis_tkeep; + end else begin + m_axis_tdata_reg[seg_reg*SEG_DATA_WIDTH +: SEG_DATA_WIDTH] <= s_axis_tdata; + m_axis_tkeep_reg[seg_reg*SEG_KEEP_WIDTH +: SEG_KEEP_WIDTH] <= s_axis_tkeep; + end + m_axis_tlast_reg <= s_axis_tvalid_reg ? s_axis_tlast_reg : s_axis_tlast; + m_axis_tid_reg <= s_axis_tvalid_reg ? s_axis_tid_reg : s_axis_tid; + m_axis_tdest_reg <= s_axis_tvalid_reg ? s_axis_tdest_reg : s_axis_tdest; + m_axis_tuser_reg <= s_axis_tvalid_reg ? s_axis_tuser_reg : s_axis_tuser; + + if (s_axis_tvalid_reg) begin + // consume data from buffer + s_axis_tvalid_reg <= 1'b0; + + if (s_axis_tlast_reg || seg_reg == SEG_COUNT-1) begin + seg_reg <= 0; + m_axis_tvalid_reg <= 1'b1; + end else begin + seg_reg <= seg_reg + 1; + end + end else if (s_axis_tvalid) begin + // data direct from input + if (s_axis_tlast || seg_reg == SEG_COUNT-1) begin + seg_reg <= 0; + m_axis_tvalid_reg <= 1'b1; + end else begin + seg_reg <= seg_reg + 1; + end + end + end else if (s_axis_tvalid && s_axis_tready) begin + // store input data in skid buffer + s_axis_tdata_reg <= s_axis_tdata; + s_axis_tkeep_reg <= s_axis_tkeep; + s_axis_tvalid_reg <= 1'b1; + s_axis_tlast_reg <= s_axis_tlast; + s_axis_tid_reg <= s_axis_tid; + s_axis_tdest_reg <= s_axis_tdest; + s_axis_tuser_reg <= s_axis_tuser; + end + + if (rst) begin + seg_reg <= 0; + s_axis_tvalid_reg <= 1'b0; + m_axis_tvalid_reg <= 1'b0; + end + end + +end else begin : downsize + // output is narrower; downsize + + // required number of segments in wider bus + localparam SEG_COUNT = S_BYTE_LANES / M_BYTE_LANES; + // data width and keep width per segment + localparam SEG_DATA_WIDTH = S_DATA_WIDTH / SEG_COUNT; + localparam SEG_KEEP_WIDTH = S_BYTE_LANES / SEG_COUNT; + + reg [S_DATA_WIDTH-1:0] s_axis_tdata_reg = {S_DATA_WIDTH{1'b0}}; + reg [S_KEEP_WIDTH-1:0] s_axis_tkeep_reg = {S_KEEP_WIDTH{1'b0}}; + reg s_axis_tvalid_reg = 1'b0; + reg s_axis_tlast_reg = 1'b0; + reg [ID_WIDTH-1:0] s_axis_tid_reg = {ID_WIDTH{1'b0}}; + reg [DEST_WIDTH-1:0] s_axis_tdest_reg = {DEST_WIDTH{1'b0}}; + reg [USER_WIDTH-1:0] s_axis_tuser_reg = {USER_WIDTH{1'b0}}; + + reg [M_DATA_WIDTH-1:0] m_axis_tdata_reg = {M_DATA_WIDTH{1'b0}}; + reg [M_KEEP_WIDTH-1:0] m_axis_tkeep_reg = {M_KEEP_WIDTH{1'b0}}; + reg m_axis_tvalid_reg = 1'b0; + reg m_axis_tlast_reg = 1'b0; + reg [ID_WIDTH-1:0] m_axis_tid_reg = {ID_WIDTH{1'b0}}; + reg [DEST_WIDTH-1:0] m_axis_tdest_reg = {DEST_WIDTH{1'b0}}; + reg [USER_WIDTH-1:0] m_axis_tuser_reg = {USER_WIDTH{1'b0}}; + + assign s_axis_tready = !s_axis_tvalid_reg; + + assign m_axis_tdata = m_axis_tdata_reg; + assign m_axis_tkeep = M_KEEP_ENABLE ? m_axis_tkeep_reg : {M_KEEP_WIDTH{1'b1}}; + assign m_axis_tvalid = m_axis_tvalid_reg; + assign m_axis_tlast = m_axis_tlast_reg; + assign m_axis_tid = ID_ENABLE ? m_axis_tid_reg : {ID_WIDTH{1'b0}}; + assign m_axis_tdest = DEST_ENABLE ? m_axis_tdest_reg : {DEST_WIDTH{1'b0}}; + assign m_axis_tuser = USER_ENABLE ? m_axis_tuser_reg : {USER_WIDTH{1'b0}}; + + always @(posedge clk) begin + m_axis_tvalid_reg <= m_axis_tvalid_reg && !m_axis_tready; + + if (!m_axis_tvalid_reg || m_axis_tready) begin + // output register empty + + m_axis_tdata_reg <= s_axis_tvalid_reg ? s_axis_tdata_reg : s_axis_tdata; + m_axis_tkeep_reg <= s_axis_tvalid_reg ? s_axis_tkeep_reg : s_axis_tkeep; + m_axis_tlast_reg <= 1'b0; + m_axis_tid_reg <= s_axis_tvalid_reg ? s_axis_tid_reg : s_axis_tid; + m_axis_tdest_reg <= s_axis_tvalid_reg ? s_axis_tdest_reg : s_axis_tdest; + m_axis_tuser_reg <= s_axis_tvalid_reg ? s_axis_tuser_reg : s_axis_tuser; + + if (s_axis_tvalid_reg) begin + // buffer has data; shift out from buffer + s_axis_tdata_reg <= s_axis_tdata_reg >> SEG_DATA_WIDTH; + s_axis_tkeep_reg <= s_axis_tkeep_reg >> SEG_KEEP_WIDTH; + + m_axis_tvalid_reg <= 1'b1; + + if ((s_axis_tkeep_reg >> SEG_KEEP_WIDTH) == 0) begin + s_axis_tvalid_reg <= 1'b0; + m_axis_tlast_reg <= s_axis_tlast_reg; + end + end else if (s_axis_tvalid && s_axis_tready) begin + // buffer is empty; store from input + s_axis_tdata_reg <= s_axis_tdata >> SEG_DATA_WIDTH; + s_axis_tkeep_reg <= s_axis_tkeep >> SEG_KEEP_WIDTH; + s_axis_tlast_reg <= s_axis_tlast; + s_axis_tid_reg <= s_axis_tid; + s_axis_tdest_reg <= s_axis_tdest; + s_axis_tuser_reg <= s_axis_tuser; + + m_axis_tvalid_reg <= 1'b1; + + if ((s_axis_tkeep >> SEG_KEEP_WIDTH) == 0) begin + s_axis_tvalid_reg <= 1'b0; + m_axis_tlast_reg <= s_axis_tlast; + end else begin + s_axis_tvalid_reg <= 1'b1; + end + end + end else if (s_axis_tvalid && s_axis_tready) begin + // store input data + s_axis_tdata_reg <= s_axis_tdata; + s_axis_tkeep_reg <= s_axis_tkeep; + s_axis_tvalid_reg <= 1'b1; + s_axis_tlast_reg <= s_axis_tlast; + s_axis_tid_reg <= s_axis_tid; + s_axis_tdest_reg <= s_axis_tdest; + s_axis_tuser_reg <= s_axis_tuser; + end + + if (rst) begin + s_axis_tvalid_reg <= 1'b0; + m_axis_tvalid_reg <= 1'b0; + end + end + +end + +endgenerate + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_async_fifo.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_async_fifo.v new file mode 100755 index 0000000..b73ae6c --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_async_fifo.v @@ -0,0 +1,910 @@ +/* + +Copyright (c) 2014-2023 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4-Stream asynchronous FIFO + */ +module axis_async_fifo # +( + // FIFO depth in words + // KEEP_WIDTH words per cycle if KEEP_ENABLE set + // Rounded up to nearest power of 2 cycles + parameter DEPTH = 4096, + // Width of AXI stream interfaces in bits + parameter DATA_WIDTH = 8, + // Propagate tkeep signal + // If disabled, tkeep assumed to be 1'b1 + parameter KEEP_ENABLE = (DATA_WIDTH>8), + // tkeep signal width (words per cycle) + parameter KEEP_WIDTH = ((DATA_WIDTH+7)/8), + // Propagate tlast signal + parameter LAST_ENABLE = 1, + // Propagate tid signal + parameter ID_ENABLE = 0, + // tid signal width + parameter ID_WIDTH = 8, + // Propagate tdest signal + parameter DEST_ENABLE = 0, + // tdest signal width + parameter DEST_WIDTH = 8, + // Propagate tuser signal + parameter USER_ENABLE = 1, + // tuser signal width + parameter USER_WIDTH = 1, + // number of RAM pipeline registers + parameter RAM_PIPELINE = 1, + // use output FIFO + // When set, the RAM read enable and pipeline clock enables are removed + parameter OUTPUT_FIFO_ENABLE = 0, + // Frame FIFO mode - operate on frames instead of cycles + // When set, m_axis_tvalid will not be deasserted within a frame + // Requires LAST_ENABLE set + parameter FRAME_FIFO = 0, + // tuser value for bad frame marker + parameter USER_BAD_FRAME_VALUE = 1'b1, + // tuser mask for bad frame marker + parameter USER_BAD_FRAME_MASK = 1'b1, + // Drop frames larger than FIFO + // Requires FRAME_FIFO set + parameter DROP_OVERSIZE_FRAME = FRAME_FIFO, + // Drop frames marked bad + // Requires FRAME_FIFO and DROP_OVERSIZE_FRAME set + parameter DROP_BAD_FRAME = 0, + // Drop incoming frames when full + // When set, s_axis_tready is always asserted + // Requires FRAME_FIFO and DROP_OVERSIZE_FRAME set + parameter DROP_WHEN_FULL = 0, + // Mark incoming frames as bad frames when full + // When set, s_axis_tready is always asserted + // Requires FRAME_FIFO to be clear + parameter MARK_WHEN_FULL = 0, + // Enable pause request input + parameter PAUSE_ENABLE = 0, + // Pause between frames + parameter FRAME_PAUSE = FRAME_FIFO +) +( + /* + * AXI input + */ + input wire s_clk, + input wire s_rst, + input wire [DATA_WIDTH-1:0] s_axis_tdata, + input wire [KEEP_WIDTH-1:0] s_axis_tkeep, + input wire s_axis_tvalid, + output wire s_axis_tready, + input wire s_axis_tlast, + input wire [ID_WIDTH-1:0] s_axis_tid, + input wire [DEST_WIDTH-1:0] s_axis_tdest, + input wire [USER_WIDTH-1:0] s_axis_tuser, + + /* + * AXI output + */ + input wire m_clk, + input wire m_rst, + output wire [DATA_WIDTH-1:0] m_axis_tdata, + output wire [KEEP_WIDTH-1:0] m_axis_tkeep, + output wire m_axis_tvalid, + input wire m_axis_tready, + output wire m_axis_tlast, + output wire [ID_WIDTH-1:0] m_axis_tid, + output wire [DEST_WIDTH-1:0] m_axis_tdest, + output wire [USER_WIDTH-1:0] m_axis_tuser, + + /* + * Pause + */ + input wire s_pause_req, + output wire s_pause_ack, + input wire m_pause_req, + output wire m_pause_ack, + + /* + * Status + */ + output wire [$clog2(DEPTH):0] s_status_depth, + output wire [$clog2(DEPTH):0] s_status_depth_commit, + output wire s_status_overflow, + output wire s_status_bad_frame, + output wire s_status_good_frame, + output wire [$clog2(DEPTH):0] m_status_depth, + output wire [$clog2(DEPTH):0] m_status_depth_commit, + output wire m_status_overflow, + output wire m_status_bad_frame, + output wire m_status_good_frame +); + +parameter ADDR_WIDTH = (KEEP_ENABLE && KEEP_WIDTH > 1) ? $clog2(DEPTH/KEEP_WIDTH) : $clog2(DEPTH); + +parameter OUTPUT_FIFO_ADDR_WIDTH = RAM_PIPELINE < 2 ? 3 : $clog2(RAM_PIPELINE*2+7); + +// check configuration +initial begin + if (FRAME_FIFO && !LAST_ENABLE) begin + $error("Error: FRAME_FIFO set requires LAST_ENABLE set (instance %m)"); + $finish; + end + + if (DROP_OVERSIZE_FRAME && !FRAME_FIFO) begin + $error("Error: DROP_OVERSIZE_FRAME set requires FRAME_FIFO set (instance %m)"); + $finish; + end + + if (DROP_BAD_FRAME && !(FRAME_FIFO && DROP_OVERSIZE_FRAME)) begin + $error("Error: DROP_BAD_FRAME set requires FRAME_FIFO and DROP_OVERSIZE_FRAME set (instance %m)"); + $finish; + end + + if (DROP_WHEN_FULL && !(FRAME_FIFO && DROP_OVERSIZE_FRAME)) begin + $error("Error: DROP_WHEN_FULL set requires FRAME_FIFO and DROP_OVERSIZE_FRAME set (instance %m)"); + $finish; + end + + if ((DROP_BAD_FRAME || MARK_WHEN_FULL) && (USER_BAD_FRAME_MASK & {USER_WIDTH{1'b1}}) == 0) begin + $error("Error: Invalid USER_BAD_FRAME_MASK value (instance %m)"); + $finish; + end + + if (MARK_WHEN_FULL && FRAME_FIFO) begin + $error("Error: MARK_WHEN_FULL is not compatible with FRAME_FIFO (instance %m)"); + $finish; + end + + if (MARK_WHEN_FULL && !LAST_ENABLE) begin + $error("Error: MARK_WHEN_FULL set requires LAST_ENABLE set (instance %m)"); + $finish; + end +end + +localparam KEEP_OFFSET = DATA_WIDTH; +localparam LAST_OFFSET = KEEP_OFFSET + (KEEP_ENABLE ? KEEP_WIDTH : 0); +localparam ID_OFFSET = LAST_OFFSET + (LAST_ENABLE ? 1 : 0); +localparam DEST_OFFSET = ID_OFFSET + (ID_ENABLE ? ID_WIDTH : 0); +localparam USER_OFFSET = DEST_OFFSET + (DEST_ENABLE ? DEST_WIDTH : 0); +localparam WIDTH = USER_OFFSET + (USER_ENABLE ? USER_WIDTH : 0); + +function [ADDR_WIDTH:0] bin2gray(input [ADDR_WIDTH:0] b); + bin2gray = b ^ (b >> 1); +endfunction + +function [ADDR_WIDTH:0] gray2bin(input [ADDR_WIDTH:0] g); + integer i; + for (i = 0; i <= ADDR_WIDTH; i = i + 1) begin + gray2bin[i] = ^(g >> i); + end +endfunction + +reg [ADDR_WIDTH:0] wr_ptr_reg = {ADDR_WIDTH+1{1'b0}}; +reg [ADDR_WIDTH:0] wr_ptr_commit_reg = {ADDR_WIDTH+1{1'b0}}; +reg [ADDR_WIDTH:0] wr_ptr_gray_reg = {ADDR_WIDTH+1{1'b0}}; +reg [ADDR_WIDTH:0] wr_ptr_sync_commit_reg = {ADDR_WIDTH+1{1'b0}}; +reg [ADDR_WIDTH:0] rd_ptr_reg = {ADDR_WIDTH+1{1'b0}}; +reg [ADDR_WIDTH:0] rd_ptr_gray_reg = {ADDR_WIDTH+1{1'b0}}; +reg [ADDR_WIDTH:0] wr_ptr_conv_reg = {ADDR_WIDTH+1{1'b0}}; +reg [ADDR_WIDTH:0] rd_ptr_conv_reg = {ADDR_WIDTH+1{1'b0}}; + +reg [ADDR_WIDTH:0] wr_ptr_temp; +reg [ADDR_WIDTH:0] rd_ptr_temp; + +(* SHREG_EXTRACT = "NO" *) +reg [ADDR_WIDTH:0] wr_ptr_gray_sync1_reg = {ADDR_WIDTH+1{1'b0}}; +(* SHREG_EXTRACT = "NO" *) +reg [ADDR_WIDTH:0] wr_ptr_gray_sync2_reg = {ADDR_WIDTH+1{1'b0}}; +(* SHREG_EXTRACT = "NO" *) +reg [ADDR_WIDTH:0] wr_ptr_commit_sync_reg = {ADDR_WIDTH+1{1'b0}}; +(* SHREG_EXTRACT = "NO" *) +reg [ADDR_WIDTH:0] rd_ptr_gray_sync1_reg = {ADDR_WIDTH+1{1'b0}}; +(* SHREG_EXTRACT = "NO" *) +reg [ADDR_WIDTH:0] rd_ptr_gray_sync2_reg = {ADDR_WIDTH+1{1'b0}}; + +reg wr_ptr_update_valid_reg = 1'b0; +reg wr_ptr_update_reg = 1'b0; +(* SHREG_EXTRACT = "NO" *) +reg wr_ptr_update_sync1_reg = 1'b0; +(* SHREG_EXTRACT = "NO" *) +reg wr_ptr_update_sync2_reg = 1'b0; +(* SHREG_EXTRACT = "NO" *) +reg wr_ptr_update_sync3_reg = 1'b0; +(* SHREG_EXTRACT = "NO" *) +reg wr_ptr_update_ack_sync1_reg = 1'b0; +(* SHREG_EXTRACT = "NO" *) +reg wr_ptr_update_ack_sync2_reg = 1'b0; + +(* SHREG_EXTRACT = "NO" *) +reg s_rst_sync1_reg = 1'b1; +(* SHREG_EXTRACT = "NO" *) +reg s_rst_sync2_reg = 1'b1; +(* SHREG_EXTRACT = "NO" *) +reg s_rst_sync3_reg = 1'b1; +(* SHREG_EXTRACT = "NO" *) +reg m_rst_sync1_reg = 1'b1; +(* SHREG_EXTRACT = "NO" *) +reg m_rst_sync2_reg = 1'b1; +(* SHREG_EXTRACT = "NO" *) +reg m_rst_sync3_reg = 1'b1; + +(* ramstyle = "no_rw_check" *) +reg [WIDTH-1:0] mem[(2**ADDR_WIDTH)-1:0]; +reg mem_read_data_valid_reg = 1'b0; + +(* shreg_extract = "no" *) +reg [WIDTH-1:0] m_axis_pipe_reg[RAM_PIPELINE+1-1:0]; +reg [RAM_PIPELINE+1-1:0] m_axis_tvalid_pipe_reg = 0; + +// full when first TWO MSBs do NOT match, but rest matches +// (gray code equivalent of first MSB different but rest same) +wire full = wr_ptr_gray_reg == (rd_ptr_gray_sync2_reg ^ {2'b11, {ADDR_WIDTH-1{1'b0}}}); +// empty when pointers match exactly +wire empty = FRAME_FIFO ? (rd_ptr_reg == wr_ptr_commit_sync_reg) : (rd_ptr_gray_reg == wr_ptr_gray_sync2_reg); +// overflow within packet +wire full_wr = wr_ptr_reg == (wr_ptr_commit_reg ^ {1'b1, {ADDR_WIDTH{1'b0}}}); + +// control signals +reg write; +reg read; +reg store_output; + +reg s_frame_reg = 1'b0; +reg m_frame_reg = 1'b0; + +reg drop_frame_reg = 1'b0; +reg mark_frame_reg = 1'b0; +reg send_frame_reg = 1'b0; +reg overflow_reg = 1'b0; +reg bad_frame_reg = 1'b0; +reg good_frame_reg = 1'b0; + +reg m_drop_frame_reg = 1'b0; +reg m_terminate_frame_reg = 1'b0; + +reg [ADDR_WIDTH:0] s_depth_reg = 0; +reg [ADDR_WIDTH:0] s_depth_commit_reg = 0; +reg [ADDR_WIDTH:0] m_depth_reg = 0; +reg [ADDR_WIDTH:0] m_depth_commit_reg = 0; + +reg overflow_sync1_reg = 1'b0; +reg overflow_sync2_reg = 1'b0; +reg overflow_sync3_reg = 1'b0; +reg overflow_sync4_reg = 1'b0; +reg bad_frame_sync1_reg = 1'b0; +reg bad_frame_sync2_reg = 1'b0; +reg bad_frame_sync3_reg = 1'b0; +reg bad_frame_sync4_reg = 1'b0; +reg good_frame_sync1_reg = 1'b0; +reg good_frame_sync2_reg = 1'b0; +reg good_frame_sync3_reg = 1'b0; +reg good_frame_sync4_reg = 1'b0; + +assign s_axis_tready = (FRAME_FIFO ? (!full || (full_wr && DROP_OVERSIZE_FRAME) || DROP_WHEN_FULL) : (!full || MARK_WHEN_FULL)) && !s_rst_sync3_reg; + +wire [WIDTH-1:0] s_axis; + +generate + assign s_axis[DATA_WIDTH-1:0] = s_axis_tdata; + if (KEEP_ENABLE) assign s_axis[KEEP_OFFSET +: KEEP_WIDTH] = s_axis_tkeep; + if (LAST_ENABLE) assign s_axis[LAST_OFFSET] = s_axis_tlast | mark_frame_reg; + if (ID_ENABLE) assign s_axis[ID_OFFSET +: ID_WIDTH] = s_axis_tid; + if (DEST_ENABLE) assign s_axis[DEST_OFFSET +: DEST_WIDTH] = s_axis_tdest; + if (USER_ENABLE) assign s_axis[USER_OFFSET +: USER_WIDTH] = mark_frame_reg ? USER_BAD_FRAME_VALUE : s_axis_tuser; +endgenerate + +wire [WIDTH-1:0] m_axis = m_axis_pipe_reg[RAM_PIPELINE+1-1]; + +wire m_axis_tready_pipe; +wire m_axis_tvalid_pipe = m_axis_tvalid_pipe_reg[RAM_PIPELINE+1-1]; + +wire [DATA_WIDTH-1:0] m_axis_tdata_pipe = m_axis[DATA_WIDTH-1:0]; +wire [KEEP_WIDTH-1:0] m_axis_tkeep_pipe = KEEP_ENABLE ? m_axis[KEEP_OFFSET +: KEEP_WIDTH] : {KEEP_WIDTH{1'b1}}; +wire m_axis_tlast_pipe = LAST_ENABLE ? m_axis[LAST_OFFSET] | m_terminate_frame_reg : 1'b1; +wire [ID_WIDTH-1:0] m_axis_tid_pipe = ID_ENABLE ? m_axis[ID_OFFSET +: ID_WIDTH] : {ID_WIDTH{1'b0}}; +wire [DEST_WIDTH-1:0] m_axis_tdest_pipe = DEST_ENABLE ? m_axis[DEST_OFFSET +: DEST_WIDTH] : {DEST_WIDTH{1'b0}}; +wire [USER_WIDTH-1:0] m_axis_tuser_pipe = USER_ENABLE ? (m_terminate_frame_reg ? USER_BAD_FRAME_VALUE : m_axis[USER_OFFSET +: USER_WIDTH]) : {USER_WIDTH{1'b0}}; + +wire m_axis_tready_out; +wire m_axis_tvalid_out; + +wire [DATA_WIDTH-1:0] m_axis_tdata_out; +wire [KEEP_WIDTH-1:0] m_axis_tkeep_out; +wire m_axis_tlast_out; +wire [ID_WIDTH-1:0] m_axis_tid_out; +wire [DEST_WIDTH-1:0] m_axis_tdest_out; +wire [USER_WIDTH-1:0] m_axis_tuser_out; + +wire pipe_ready; + +assign s_status_depth = (KEEP_ENABLE && KEEP_WIDTH > 1) ? {s_depth_reg, {$clog2(KEEP_WIDTH){1'b0}}} : s_depth_reg; +assign s_status_depth_commit = (KEEP_ENABLE && KEEP_WIDTH > 1) ? {s_depth_commit_reg, {$clog2(KEEP_WIDTH){1'b0}}} : s_depth_commit_reg; +assign s_status_overflow = overflow_reg; +assign s_status_bad_frame = bad_frame_reg; +assign s_status_good_frame = good_frame_reg; + +assign m_status_depth = (KEEP_ENABLE && KEEP_WIDTH > 1) ? {m_depth_reg, {$clog2(KEEP_WIDTH){1'b0}}} : m_depth_reg; +assign m_status_depth_commit = (KEEP_ENABLE && KEEP_WIDTH > 1) ? {m_depth_commit_reg, {$clog2(KEEP_WIDTH){1'b0}}} : m_depth_commit_reg; +assign m_status_overflow = overflow_sync3_reg ^ overflow_sync4_reg; +assign m_status_bad_frame = bad_frame_sync3_reg ^ bad_frame_sync4_reg; +assign m_status_good_frame = good_frame_sync3_reg ^ good_frame_sync4_reg; + +// reset synchronization +always @(posedge m_clk or posedge m_rst) begin + if (m_rst) begin + s_rst_sync1_reg <= 1'b1; + end else begin + s_rst_sync1_reg <= 1'b0; + end +end + +always @(posedge s_clk) begin + s_rst_sync2_reg <= s_rst_sync1_reg; + s_rst_sync3_reg <= s_rst_sync2_reg; +end + +always @(posedge s_clk or posedge s_rst) begin + if (s_rst) begin + m_rst_sync1_reg <= 1'b1; + end else begin + m_rst_sync1_reg <= 1'b0; + end +end + +always @(posedge m_clk) begin + m_rst_sync2_reg <= m_rst_sync1_reg; + m_rst_sync3_reg <= m_rst_sync2_reg; +end + +// Write logic +always @(posedge s_clk) begin + overflow_reg <= 1'b0; + bad_frame_reg <= 1'b0; + good_frame_reg <= 1'b0; + + if (FRAME_FIFO && wr_ptr_update_valid_reg) begin + // have updated pointer to sync + if (wr_ptr_update_reg == wr_ptr_update_ack_sync2_reg) begin + // no sync in progress; sync update + wr_ptr_update_valid_reg <= 1'b0; + wr_ptr_sync_commit_reg <= wr_ptr_commit_reg; + wr_ptr_update_reg <= !wr_ptr_update_ack_sync2_reg; + end + end + + if (s_axis_tready && s_axis_tvalid && LAST_ENABLE) begin + // track input frame status + s_frame_reg <= !s_axis_tlast; + end + + if (s_rst_sync3_reg && LAST_ENABLE) begin + // if sink side is reset during transfer, drop partial frame + if (s_frame_reg && !(s_axis_tready && s_axis_tvalid && s_axis_tlast)) begin + drop_frame_reg <= 1'b1; + end + if (s_axis_tready && s_axis_tvalid && !s_axis_tlast) begin + drop_frame_reg <= 1'b1; + end + end + + if (FRAME_FIFO) begin + // frame FIFO mode + if (s_axis_tready && s_axis_tvalid) begin + // transfer in + if ((full && DROP_WHEN_FULL) || (full_wr && DROP_OVERSIZE_FRAME) || drop_frame_reg) begin + // full, packet overflow, or currently dropping frame + // drop frame + drop_frame_reg <= 1'b1; + if (s_axis_tlast) begin + // end of frame, reset write pointer + wr_ptr_temp = wr_ptr_commit_reg; + wr_ptr_reg <= wr_ptr_temp; + wr_ptr_gray_reg <= bin2gray(wr_ptr_temp); + drop_frame_reg <= 1'b0; + overflow_reg <= 1'b1; + end + end else begin + mem[wr_ptr_reg[ADDR_WIDTH-1:0]] <= s_axis; + wr_ptr_temp = wr_ptr_reg + 1; + wr_ptr_reg <= wr_ptr_temp; + wr_ptr_gray_reg <= bin2gray(wr_ptr_temp); + if (s_axis_tlast || (!DROP_OVERSIZE_FRAME && (full_wr || send_frame_reg))) begin + // end of frame or send frame + send_frame_reg <= !s_axis_tlast; + if (s_axis_tlast && DROP_BAD_FRAME && USER_BAD_FRAME_MASK & ~(s_axis_tuser ^ USER_BAD_FRAME_VALUE)) begin + // bad packet, reset write pointer + wr_ptr_temp = wr_ptr_commit_reg; + wr_ptr_reg <= wr_ptr_temp; + wr_ptr_gray_reg <= bin2gray(wr_ptr_temp); + bad_frame_reg <= 1'b1; + end else begin + // good packet or packet overflow, update write pointer + wr_ptr_temp = wr_ptr_reg + 1; + wr_ptr_reg <= wr_ptr_temp; + wr_ptr_commit_reg <= wr_ptr_temp; + wr_ptr_gray_reg <= bin2gray(wr_ptr_temp); + + if (wr_ptr_update_reg == wr_ptr_update_ack_sync2_reg) begin + // no sync in progress; sync update + wr_ptr_update_valid_reg <= 1'b0; + wr_ptr_sync_commit_reg <= wr_ptr_temp; + wr_ptr_update_reg <= !wr_ptr_update_ack_sync2_reg; + end else begin + // sync in progress; flag it for later + wr_ptr_update_valid_reg <= 1'b1; + end + + good_frame_reg <= s_axis_tlast; + end + end + end + end else if (s_axis_tvalid && full_wr && FRAME_FIFO && !DROP_OVERSIZE_FRAME) begin + // data valid with packet overflow + // update write pointer + send_frame_reg <= 1'b1; + wr_ptr_temp = wr_ptr_reg; + wr_ptr_reg <= wr_ptr_temp; + wr_ptr_commit_reg <= wr_ptr_temp; + wr_ptr_gray_reg <= bin2gray(wr_ptr_temp); + + if (wr_ptr_update_reg == wr_ptr_update_ack_sync2_reg) begin + // no sync in progress; sync update + wr_ptr_update_valid_reg <= 1'b0; + wr_ptr_sync_commit_reg <= wr_ptr_temp; + wr_ptr_update_reg <= !wr_ptr_update_ack_sync2_reg; + end else begin + // sync in progress; flag it for later + wr_ptr_update_valid_reg <= 1'b1; + end + end + end else begin + // normal FIFO mode + if (s_axis_tready && s_axis_tvalid) begin + if (drop_frame_reg && LAST_ENABLE) begin + // currently dropping frame + if (s_axis_tlast) begin + // end of frame + if (!full && mark_frame_reg && MARK_WHEN_FULL) begin + // terminate marked frame + mark_frame_reg <= 1'b0; + mem[wr_ptr_reg[ADDR_WIDTH-1:0]] <= s_axis; + wr_ptr_temp = wr_ptr_reg + 1; + wr_ptr_reg <= wr_ptr_temp; + wr_ptr_commit_reg <= wr_ptr_temp; + wr_ptr_gray_reg <= bin2gray(wr_ptr_temp); + end + // end of frame, clear drop flag + drop_frame_reg <= 1'b0; + overflow_reg <= 1'b1; + end + end else if ((full || mark_frame_reg) && MARK_WHEN_FULL) begin + // full or marking frame + // drop frame; mark if this isn't the first cycle + drop_frame_reg <= 1'b1; + mark_frame_reg <= mark_frame_reg || s_frame_reg; + if (s_axis_tlast) begin + drop_frame_reg <= 1'b0; + overflow_reg <= 1'b1; + end + end else begin + // transfer in + mem[wr_ptr_reg[ADDR_WIDTH-1:0]] <= s_axis; + wr_ptr_temp = wr_ptr_reg + 1; + wr_ptr_reg <= wr_ptr_temp; + wr_ptr_commit_reg <= wr_ptr_temp; + wr_ptr_gray_reg <= bin2gray(wr_ptr_temp); + end + end else if ((!full && !drop_frame_reg && mark_frame_reg) && MARK_WHEN_FULL) begin + // terminate marked frame + mark_frame_reg <= 1'b0; + mem[wr_ptr_reg[ADDR_WIDTH-1:0]] <= s_axis; + wr_ptr_temp = wr_ptr_reg + 1; + wr_ptr_reg <= wr_ptr_temp; + wr_ptr_commit_reg <= wr_ptr_temp; + wr_ptr_gray_reg <= bin2gray(wr_ptr_temp); + end + end + + if (s_rst_sync3_reg) begin + wr_ptr_reg <= {ADDR_WIDTH+1{1'b0}}; + wr_ptr_commit_reg <= {ADDR_WIDTH+1{1'b0}}; + wr_ptr_gray_reg <= {ADDR_WIDTH+1{1'b0}}; + wr_ptr_sync_commit_reg <= {ADDR_WIDTH+1{1'b0}}; + + wr_ptr_update_valid_reg <= 1'b0; + wr_ptr_update_reg <= 1'b0; + end + + if (s_rst) begin + wr_ptr_reg <= {ADDR_WIDTH+1{1'b0}}; + wr_ptr_commit_reg <= {ADDR_WIDTH+1{1'b0}}; + wr_ptr_gray_reg <= {ADDR_WIDTH+1{1'b0}}; + wr_ptr_sync_commit_reg <= {ADDR_WIDTH+1{1'b0}}; + + wr_ptr_update_valid_reg <= 1'b0; + wr_ptr_update_reg <= 1'b0; + + s_frame_reg <= 1'b0; + + drop_frame_reg <= 1'b0; + mark_frame_reg <= 1'b0; + send_frame_reg <= 1'b0; + overflow_reg <= 1'b0; + bad_frame_reg <= 1'b0; + good_frame_reg <= 1'b0; + end +end + +// Write-side status +always @(posedge s_clk) begin + rd_ptr_conv_reg <= gray2bin(rd_ptr_gray_sync2_reg); + s_depth_reg <= wr_ptr_reg - rd_ptr_conv_reg; + s_depth_commit_reg <= wr_ptr_commit_reg - rd_ptr_conv_reg; +end + +// pointer synchronization +always @(posedge s_clk) begin + rd_ptr_gray_sync1_reg <= rd_ptr_gray_reg; + rd_ptr_gray_sync2_reg <= rd_ptr_gray_sync1_reg; + wr_ptr_update_ack_sync1_reg <= wr_ptr_update_sync3_reg; + wr_ptr_update_ack_sync2_reg <= wr_ptr_update_ack_sync1_reg; + + if (s_rst) begin + rd_ptr_gray_sync1_reg <= {ADDR_WIDTH+1{1'b0}}; + rd_ptr_gray_sync2_reg <= {ADDR_WIDTH+1{1'b0}}; + wr_ptr_update_ack_sync1_reg <= 1'b0; + wr_ptr_update_ack_sync2_reg <= 1'b0; + end +end + +always @(posedge m_clk) begin + wr_ptr_gray_sync1_reg <= wr_ptr_gray_reg; + wr_ptr_gray_sync2_reg <= wr_ptr_gray_sync1_reg; + if (FRAME_FIFO && wr_ptr_update_sync2_reg ^ wr_ptr_update_sync3_reg) begin + wr_ptr_commit_sync_reg <= wr_ptr_sync_commit_reg; + end + wr_ptr_update_sync1_reg <= wr_ptr_update_reg; + wr_ptr_update_sync2_reg <= wr_ptr_update_sync1_reg; + wr_ptr_update_sync3_reg <= wr_ptr_update_sync2_reg; + + if (FRAME_FIFO && m_rst_sync3_reg) begin + wr_ptr_gray_sync1_reg <= {ADDR_WIDTH+1{1'b0}}; + end + + if (m_rst) begin + wr_ptr_gray_sync1_reg <= {ADDR_WIDTH+1{1'b0}}; + wr_ptr_gray_sync2_reg <= {ADDR_WIDTH+1{1'b0}}; + wr_ptr_commit_sync_reg <= {ADDR_WIDTH+1{1'b0}}; + wr_ptr_update_sync1_reg <= 1'b0; + wr_ptr_update_sync2_reg <= 1'b0; + wr_ptr_update_sync3_reg <= 1'b0; + end +end + +// status synchronization +always @(posedge s_clk) begin + overflow_sync1_reg <= overflow_sync1_reg ^ overflow_reg; + bad_frame_sync1_reg <= bad_frame_sync1_reg ^ bad_frame_reg; + good_frame_sync1_reg <= good_frame_sync1_reg ^ good_frame_reg; + + if (s_rst) begin + overflow_sync1_reg <= 1'b0; + bad_frame_sync1_reg <= 1'b0; + good_frame_sync1_reg <= 1'b0; + end +end + +always @(posedge m_clk) begin + overflow_sync2_reg <= overflow_sync1_reg; + overflow_sync3_reg <= overflow_sync2_reg; + overflow_sync4_reg <= overflow_sync3_reg; + bad_frame_sync2_reg <= bad_frame_sync1_reg; + bad_frame_sync3_reg <= bad_frame_sync2_reg; + bad_frame_sync4_reg <= bad_frame_sync3_reg; + good_frame_sync2_reg <= good_frame_sync1_reg; + good_frame_sync3_reg <= good_frame_sync2_reg; + good_frame_sync4_reg <= good_frame_sync3_reg; + + if (m_rst) begin + overflow_sync2_reg <= 1'b0; + overflow_sync3_reg <= 1'b0; + overflow_sync4_reg <= 1'b0; + bad_frame_sync2_reg <= 1'b0; + bad_frame_sync3_reg <= 1'b0; + bad_frame_sync4_reg <= 1'b0; + good_frame_sync2_reg <= 1'b0; + good_frame_sync3_reg <= 1'b0; + good_frame_sync4_reg <= 1'b0; + end +end + +// Read logic +integer j; + +always @(posedge m_clk) begin + if (m_axis_tready_pipe) begin + // output ready; invalidate stage + m_axis_tvalid_pipe_reg[RAM_PIPELINE+1-1] <= 1'b0; + m_terminate_frame_reg <= 1'b0; + end + + for (j = RAM_PIPELINE+1-1; j > 0; j = j - 1) begin + if (m_axis_tready_pipe || ((~m_axis_tvalid_pipe_reg) >> j)) begin + // output ready or bubble in pipeline; transfer down pipeline + m_axis_tvalid_pipe_reg[j] <= m_axis_tvalid_pipe_reg[j-1]; + m_axis_pipe_reg[j] <= m_axis_pipe_reg[j-1]; + m_axis_tvalid_pipe_reg[j-1] <= 1'b0; + end + end + + if (m_axis_tready_pipe || ~m_axis_tvalid_pipe_reg) begin + // output ready or bubble in pipeline; read new data from FIFO + m_axis_tvalid_pipe_reg[0] <= 1'b0; + m_axis_pipe_reg[0] <= mem[rd_ptr_reg[ADDR_WIDTH-1:0]]; + if (!empty && !m_rst_sync3_reg && !m_drop_frame_reg && pipe_ready) begin + // not empty, increment pointer + m_axis_tvalid_pipe_reg[0] <= 1'b1; + rd_ptr_temp = rd_ptr_reg + 1; + rd_ptr_reg <= rd_ptr_temp; + rd_ptr_gray_reg <= rd_ptr_temp ^ (rd_ptr_temp >> 1); + end + end + + if (m_axis_tvalid_pipe && LAST_ENABLE) begin + // track output frame status + if (m_axis_tlast_pipe && m_axis_tready_pipe) begin + m_frame_reg <= 1'b0; + end else begin + m_frame_reg <= 1'b1; + end + end + + if (m_drop_frame_reg && (OUTPUT_FIFO_ENABLE ? pipe_ready : m_axis_tready_pipe || !m_axis_tvalid_pipe) && LAST_ENABLE) begin + // terminate frame + // (only for frame transfers interrupted by source reset) + m_axis_tvalid_pipe_reg[RAM_PIPELINE+1-1] <= 1'b1; + m_terminate_frame_reg <= 1'b1; + m_drop_frame_reg <= 1'b0; + end + + if (m_rst_sync3_reg && LAST_ENABLE) begin + // if source side is reset during transfer, drop partial frame + + // empty output pipeline, except for last stage + if (RAM_PIPELINE > 0) begin + m_axis_tvalid_pipe_reg[RAM_PIPELINE+1-2:0] <= 0; + end + + if (m_frame_reg && (!m_axis_tvalid_pipe || (m_axis_tvalid_pipe && !m_axis_tlast_pipe)) && + !(m_drop_frame_reg || m_terminate_frame_reg)) begin + // terminate frame + m_drop_frame_reg <= 1'b1; + end + end + + if (m_rst_sync3_reg) begin + rd_ptr_reg <= {ADDR_WIDTH+1{1'b0}}; + rd_ptr_gray_reg <= {ADDR_WIDTH+1{1'b0}}; + end + + if (m_rst) begin + rd_ptr_reg <= {ADDR_WIDTH+1{1'b0}}; + rd_ptr_gray_reg <= {ADDR_WIDTH+1{1'b0}}; + m_axis_tvalid_pipe_reg <= 0; + m_frame_reg <= 1'b0; + m_drop_frame_reg <= 1'b0; + m_terminate_frame_reg <= 1'b0; + end +end + +// Read-side status +always @(posedge m_clk) begin + wr_ptr_conv_reg <= gray2bin(wr_ptr_gray_sync2_reg); + m_depth_reg <= wr_ptr_conv_reg - rd_ptr_reg; + m_depth_commit_reg <= FRAME_FIFO ? wr_ptr_commit_sync_reg - rd_ptr_reg : wr_ptr_conv_reg - rd_ptr_reg; +end + +generate + +if (!OUTPUT_FIFO_ENABLE) begin + + assign pipe_ready = 1'b1; + + assign m_axis_tready_pipe = m_axis_tready_out; + assign m_axis_tvalid_out = m_axis_tvalid_pipe; + + assign m_axis_tdata_out = m_axis_tdata_pipe; + assign m_axis_tkeep_out = m_axis_tkeep_pipe; + assign m_axis_tlast_out = m_axis_tlast_pipe; + assign m_axis_tid_out = m_axis_tid_pipe; + assign m_axis_tdest_out = m_axis_tdest_pipe; + assign m_axis_tuser_out = m_axis_tuser_pipe; + +end else begin : output_fifo + + // output datapath logic + reg [DATA_WIDTH-1:0] m_axis_tdata_reg = {DATA_WIDTH{1'b0}}; + reg [KEEP_WIDTH-1:0] m_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; + reg m_axis_tvalid_reg = 1'b0; + reg m_axis_tlast_reg = 1'b0; + reg [ID_WIDTH-1:0] m_axis_tid_reg = {ID_WIDTH{1'b0}}; + reg [DEST_WIDTH-1:0] m_axis_tdest_reg = {DEST_WIDTH{1'b0}}; + reg [USER_WIDTH-1:0] m_axis_tuser_reg = {USER_WIDTH{1'b0}}; + + reg [OUTPUT_FIFO_ADDR_WIDTH+1-1:0] out_fifo_wr_ptr_reg = 0; + reg [OUTPUT_FIFO_ADDR_WIDTH+1-1:0] out_fifo_rd_ptr_reg = 0; + reg out_fifo_half_full_reg = 1'b0; + + wire out_fifo_full = out_fifo_wr_ptr_reg == (out_fifo_rd_ptr_reg ^ {1'b1, {OUTPUT_FIFO_ADDR_WIDTH{1'b0}}}); + wire out_fifo_empty = out_fifo_wr_ptr_reg == out_fifo_rd_ptr_reg; + + (* ram_style = "distributed", ramstyle = "no_rw_check, mlab" *) + reg [DATA_WIDTH-1:0] out_fifo_tdata[2**OUTPUT_FIFO_ADDR_WIDTH-1:0]; + (* ram_style = "distributed", ramstyle = "no_rw_check, mlab" *) + reg [KEEP_WIDTH-1:0] out_fifo_tkeep[2**OUTPUT_FIFO_ADDR_WIDTH-1:0]; + (* ram_style = "distributed", ramstyle = "no_rw_check, mlab" *) + reg out_fifo_tlast[2**OUTPUT_FIFO_ADDR_WIDTH-1:0]; + (* ram_style = "distributed", ramstyle = "no_rw_check, mlab" *) + reg [ID_WIDTH-1:0] out_fifo_tid[2**OUTPUT_FIFO_ADDR_WIDTH-1:0]; + (* ram_style = "distributed", ramstyle = "no_rw_check, mlab" *) + reg [DEST_WIDTH-1:0] out_fifo_tdest[2**OUTPUT_FIFO_ADDR_WIDTH-1:0]; + (* ram_style = "distributed", ramstyle = "no_rw_check, mlab" *) + reg [USER_WIDTH-1:0] out_fifo_tuser[2**OUTPUT_FIFO_ADDR_WIDTH-1:0]; + + assign pipe_ready = !out_fifo_half_full_reg; + + assign m_axis_tready_pipe = 1'b1; + + assign m_axis_tdata_out = m_axis_tdata_reg; + assign m_axis_tkeep_out = KEEP_ENABLE ? m_axis_tkeep_reg : {KEEP_WIDTH{1'b1}}; + assign m_axis_tvalid_out = m_axis_tvalid_reg; + assign m_axis_tlast_out = LAST_ENABLE ? m_axis_tlast_reg : 1'b1; + assign m_axis_tid_out = ID_ENABLE ? m_axis_tid_reg : {ID_WIDTH{1'b0}}; + assign m_axis_tdest_out = DEST_ENABLE ? m_axis_tdest_reg : {DEST_WIDTH{1'b0}}; + assign m_axis_tuser_out = USER_ENABLE ? m_axis_tuser_reg : {USER_WIDTH{1'b0}}; + + always @(posedge m_clk) begin + m_axis_tvalid_reg <= m_axis_tvalid_reg && !m_axis_tready_out; + + out_fifo_half_full_reg <= $unsigned(out_fifo_wr_ptr_reg - out_fifo_rd_ptr_reg) >= 2**(OUTPUT_FIFO_ADDR_WIDTH-1); + + if (!out_fifo_full && m_axis_tvalid_pipe) begin + out_fifo_tdata[out_fifo_wr_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]] <= m_axis_tdata_pipe; + out_fifo_tkeep[out_fifo_wr_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]] <= m_axis_tkeep_pipe; + out_fifo_tlast[out_fifo_wr_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]] <= m_axis_tlast_pipe; + out_fifo_tid[out_fifo_wr_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]] <= m_axis_tid_pipe; + out_fifo_tdest[out_fifo_wr_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]] <= m_axis_tdest_pipe; + out_fifo_tuser[out_fifo_wr_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]] <= m_axis_tuser_pipe; + out_fifo_wr_ptr_reg <= out_fifo_wr_ptr_reg + 1; + end + + if (!out_fifo_empty && (!m_axis_tvalid_reg || m_axis_tready_out)) begin + m_axis_tdata_reg <= out_fifo_tdata[out_fifo_rd_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]]; + m_axis_tkeep_reg <= out_fifo_tkeep[out_fifo_rd_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]]; + m_axis_tvalid_reg <= 1'b1; + m_axis_tlast_reg <= out_fifo_tlast[out_fifo_rd_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]]; + m_axis_tid_reg <= out_fifo_tid[out_fifo_rd_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]]; + m_axis_tdest_reg <= out_fifo_tdest[out_fifo_rd_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]]; + m_axis_tuser_reg <= out_fifo_tuser[out_fifo_rd_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]]; + out_fifo_rd_ptr_reg <= out_fifo_rd_ptr_reg + 1; + end + + if (m_rst) begin + out_fifo_wr_ptr_reg <= 0; + out_fifo_rd_ptr_reg <= 0; + m_axis_tvalid_reg <= 1'b0; + end + end + +end + +if (PAUSE_ENABLE) begin : pause + + // Pause logic + reg pause_reg = 1'b0; + reg pause_frame_reg = 1'b0; + + reg s_pause_req_sync1_reg; + reg s_pause_req_sync2_reg; + reg s_pause_req_sync3_reg; + reg s_pause_ack_sync1_reg; + reg s_pause_ack_sync2_reg; + reg s_pause_ack_sync3_reg; + + always @(posedge s_clk) begin + s_pause_req_sync1_reg <= s_pause_req; + s_pause_ack_sync2_reg <= s_pause_ack_sync1_reg; + s_pause_ack_sync3_reg <= s_pause_ack_sync2_reg; + end + + always @(posedge m_clk) begin + s_pause_req_sync2_reg <= s_pause_req_sync1_reg; + s_pause_req_sync3_reg <= s_pause_req_sync2_reg; + s_pause_ack_sync1_reg <= pause_reg; + end + + assign m_axis_tready_out = m_axis_tready && !pause_reg; + assign m_axis_tvalid = m_axis_tvalid_out && !pause_reg; + + assign m_axis_tdata = m_axis_tdata_out; + assign m_axis_tkeep = m_axis_tkeep_out; + assign m_axis_tlast = m_axis_tlast_out; + assign m_axis_tid = m_axis_tid_out; + assign m_axis_tdest = m_axis_tdest_out; + assign m_axis_tuser = m_axis_tuser_out; + + assign s_pause_ack = s_pause_ack_sync3_reg; + assign m_pause_ack = pause_reg; + + always @(posedge m_clk) begin + if (FRAME_PAUSE) begin + if (pause_reg) begin + // paused; update pause status + pause_reg <= m_pause_req || s_pause_req_sync3_reg; + end else if (m_axis_tvalid_out) begin + // frame transfer; set frame bit + pause_frame_reg <= 1'b1; + if (m_axis_tready && m_axis_tlast) begin + // end of frame; clear frame bit and update pause status + pause_frame_reg <= 1'b0; + pause_reg <= m_pause_req || s_pause_req_sync3_reg; + end + end else if (!pause_frame_reg) begin + // idle; update pause status + pause_reg <= m_pause_req || s_pause_req_sync3_reg; + end + end else begin + pause_reg <= m_pause_req || s_pause_req_sync3_reg; + end + + if (m_rst) begin + pause_frame_reg <= 1'b0; + pause_reg <= 1'b0; + end + end + +end else begin + + assign m_axis_tready_out = m_axis_tready; + assign m_axis_tvalid = m_axis_tvalid_out; + + assign m_axis_tdata = m_axis_tdata_out; + assign m_axis_tkeep = m_axis_tkeep_out; + assign m_axis_tlast = m_axis_tlast_out; + assign m_axis_tid = m_axis_tid_out; + assign m_axis_tdest = m_axis_tdest_out; + assign m_axis_tuser = m_axis_tuser_out; + + assign s_pause_ack = 1'b0; + assign m_pause_ack = 1'b0; + +end + +endgenerate + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_async_fifo_adapter.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_async_fifo_adapter.v new file mode 100755 index 0000000..7796996 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_async_fifo_adapter.v @@ -0,0 +1,378 @@ +/* + +Copyright (c) 2019 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4-Stream asynchronous FIFO with width converter + */ +module axis_async_fifo_adapter # +( + // FIFO depth in words + // KEEP_WIDTH words per cycle if KEEP_ENABLE set + // Rounded up to nearest power of 2 cycles + parameter DEPTH = 4096, + // Width of input AXI stream interface in bits + parameter S_DATA_WIDTH = 8, + // Propagate tkeep signal on input interface + // If disabled, tkeep assumed to be 1'b1 + parameter S_KEEP_ENABLE = (S_DATA_WIDTH>8), + // tkeep signal width (words per cycle) on input interface + parameter S_KEEP_WIDTH = ((S_DATA_WIDTH+7)/8), + // Width of output AXI stream interface in bits + parameter M_DATA_WIDTH = 8, + // Propagate tkeep signal on output interface + // If disabled, tkeep assumed to be 1'b1 + parameter M_KEEP_ENABLE = (M_DATA_WIDTH>8), + // tkeep signal width (words per cycle) on output interface + parameter M_KEEP_WIDTH = ((M_DATA_WIDTH+7)/8), + // Propagate tid signal + parameter ID_ENABLE = 0, + // tid signal width + parameter ID_WIDTH = 8, + // Propagate tdest signal + parameter DEST_ENABLE = 0, + // tdest signal width + parameter DEST_WIDTH = 8, + // Propagate tuser signal + parameter USER_ENABLE = 1, + // tuser signal width + parameter USER_WIDTH = 1, + // number of RAM pipeline registers in FIFO + parameter RAM_PIPELINE = 1, + // use output FIFO + // When set, the RAM read enable and pipeline clock enables are removed + parameter OUTPUT_FIFO_ENABLE = 0, + // Frame FIFO mode - operate on frames instead of cycles + // When set, m_axis_tvalid will not be deasserted within a frame + // Requires LAST_ENABLE set + parameter FRAME_FIFO = 0, + // tuser value for bad frame marker + parameter USER_BAD_FRAME_VALUE = 1'b1, + // tuser mask for bad frame marker + parameter USER_BAD_FRAME_MASK = 1'b1, + // Drop frames larger than FIFO + // Requires FRAME_FIFO set + parameter DROP_OVERSIZE_FRAME = FRAME_FIFO, + // Drop frames marked bad + // Requires FRAME_FIFO and DROP_OVERSIZE_FRAME set + parameter DROP_BAD_FRAME = 0, + // Drop incoming frames when full + // When set, s_axis_tready is always asserted + // Requires FRAME_FIFO and DROP_OVERSIZE_FRAME set + parameter DROP_WHEN_FULL = 0, + // Mark incoming frames as bad frames when full + // When set, s_axis_tready is always asserted + // Requires FRAME_FIFO to be clear + parameter MARK_WHEN_FULL = 0, + // Enable pause request input + parameter PAUSE_ENABLE = 0, + // Pause between frames + parameter FRAME_PAUSE = FRAME_FIFO +) +( + /* + * AXI input + */ + input wire s_clk, + input wire s_rst, + input wire [S_DATA_WIDTH-1:0] s_axis_tdata, + input wire [S_KEEP_WIDTH-1:0] s_axis_tkeep, + input wire s_axis_tvalid, + output wire s_axis_tready, + input wire s_axis_tlast, + input wire [ID_WIDTH-1:0] s_axis_tid, + input wire [DEST_WIDTH-1:0] s_axis_tdest, + input wire [USER_WIDTH-1:0] s_axis_tuser, + + /* + * AXI output + */ + input wire m_clk, + input wire m_rst, + output wire [M_DATA_WIDTH-1:0] m_axis_tdata, + output wire [M_KEEP_WIDTH-1:0] m_axis_tkeep, + output wire m_axis_tvalid, + input wire m_axis_tready, + output wire m_axis_tlast, + output wire [ID_WIDTH-1:0] m_axis_tid, + output wire [DEST_WIDTH-1:0] m_axis_tdest, + output wire [USER_WIDTH-1:0] m_axis_tuser, + + /* + * Pause + */ + input wire s_pause_req, + output wire s_pause_ack, + input wire m_pause_req, + output wire m_pause_ack, + + /* + * Status + */ + output wire [$clog2(DEPTH):0] s_status_depth, + output wire [$clog2(DEPTH):0] s_status_depth_commit, + output wire s_status_overflow, + output wire s_status_bad_frame, + output wire s_status_good_frame, + output wire [$clog2(DEPTH):0] m_status_depth, + output wire [$clog2(DEPTH):0] m_status_depth_commit, + output wire m_status_overflow, + output wire m_status_bad_frame, + output wire m_status_good_frame +); + +// force keep width to 1 when disabled +localparam S_BYTE_LANES = S_KEEP_ENABLE ? S_KEEP_WIDTH : 1; +localparam M_BYTE_LANES = M_KEEP_ENABLE ? M_KEEP_WIDTH : 1; + +// bus byte sizes (must be identical) +localparam S_BYTE_SIZE = S_DATA_WIDTH / S_BYTE_LANES; +localparam M_BYTE_SIZE = M_DATA_WIDTH / M_BYTE_LANES; +// output bus is wider +localparam EXPAND_BUS = M_BYTE_LANES > S_BYTE_LANES; +// total data and keep widths +localparam DATA_WIDTH = EXPAND_BUS ? M_DATA_WIDTH : S_DATA_WIDTH; +localparam KEEP_WIDTH = EXPAND_BUS ? M_BYTE_LANES : S_BYTE_LANES; + +// bus width assertions +initial begin + if (S_BYTE_SIZE * S_BYTE_LANES != S_DATA_WIDTH) begin + $error("Error: input data width not evenly divisible (instance %m)"); + $finish; + end + + if (M_BYTE_SIZE * M_BYTE_LANES != M_DATA_WIDTH) begin + $error("Error: output data width not evenly divisible (instance %m)"); + $finish; + end + + if (S_BYTE_SIZE != M_BYTE_SIZE) begin + $error("Error: byte size mismatch (instance %m)"); + $finish; + end +end + +wire [DATA_WIDTH-1:0] pre_fifo_axis_tdata; +wire [KEEP_WIDTH-1:0] pre_fifo_axis_tkeep; +wire pre_fifo_axis_tvalid; +wire pre_fifo_axis_tready; +wire pre_fifo_axis_tlast; +wire [ID_WIDTH-1:0] pre_fifo_axis_tid; +wire [DEST_WIDTH-1:0] pre_fifo_axis_tdest; +wire [USER_WIDTH-1:0] pre_fifo_axis_tuser; + +wire [DATA_WIDTH-1:0] post_fifo_axis_tdata; +wire [KEEP_WIDTH-1:0] post_fifo_axis_tkeep; +wire post_fifo_axis_tvalid; +wire post_fifo_axis_tready; +wire post_fifo_axis_tlast; +wire [ID_WIDTH-1:0] post_fifo_axis_tid; +wire [DEST_WIDTH-1:0] post_fifo_axis_tdest; +wire [USER_WIDTH-1:0] post_fifo_axis_tuser; + +generate + +if (M_BYTE_LANES > S_BYTE_LANES) begin : upsize_pre + + // output wider, adapt width before FIFO + + axis_adapter #( + .S_DATA_WIDTH(S_DATA_WIDTH), + .S_KEEP_ENABLE(S_KEEP_ENABLE), + .S_KEEP_WIDTH(S_KEEP_WIDTH), + .M_DATA_WIDTH(M_DATA_WIDTH), + .M_KEEP_ENABLE(M_KEEP_ENABLE), + .M_KEEP_WIDTH(M_KEEP_WIDTH), + .ID_ENABLE(ID_ENABLE), + .ID_WIDTH(ID_WIDTH), + .DEST_ENABLE(DEST_ENABLE), + .DEST_WIDTH(DEST_WIDTH), + .USER_ENABLE(USER_ENABLE), + .USER_WIDTH(USER_WIDTH) + ) + adapter_inst ( + .clk(s_clk), + .rst(s_rst), + // AXI input + .s_axis_tdata(s_axis_tdata), + .s_axis_tkeep(s_axis_tkeep), + .s_axis_tvalid(s_axis_tvalid), + .s_axis_tready(s_axis_tready), + .s_axis_tlast(s_axis_tlast), + .s_axis_tid(s_axis_tid), + .s_axis_tdest(s_axis_tdest), + .s_axis_tuser(s_axis_tuser), + // AXI output + .m_axis_tdata(pre_fifo_axis_tdata), + .m_axis_tkeep(pre_fifo_axis_tkeep), + .m_axis_tvalid(pre_fifo_axis_tvalid), + .m_axis_tready(pre_fifo_axis_tready), + .m_axis_tlast(pre_fifo_axis_tlast), + .m_axis_tid(pre_fifo_axis_tid), + .m_axis_tdest(pre_fifo_axis_tdest), + .m_axis_tuser(pre_fifo_axis_tuser) + ); + +end else begin : bypass_pre + + assign pre_fifo_axis_tdata = s_axis_tdata; + assign pre_fifo_axis_tkeep = s_axis_tkeep; + assign pre_fifo_axis_tvalid = s_axis_tvalid; + assign s_axis_tready = pre_fifo_axis_tready; + assign pre_fifo_axis_tlast = s_axis_tlast; + assign pre_fifo_axis_tid = s_axis_tid; + assign pre_fifo_axis_tdest = s_axis_tdest; + assign pre_fifo_axis_tuser = s_axis_tuser; + +end + +axis_async_fifo #( + .DEPTH(DEPTH), + .DATA_WIDTH(DATA_WIDTH), + .KEEP_ENABLE(EXPAND_BUS ? M_KEEP_ENABLE : S_KEEP_ENABLE), + .KEEP_WIDTH(KEEP_WIDTH), + .LAST_ENABLE(1), + .ID_ENABLE(ID_ENABLE), + .ID_WIDTH(ID_WIDTH), + .DEST_ENABLE(DEST_ENABLE), + .DEST_WIDTH(DEST_WIDTH), + .USER_ENABLE(USER_ENABLE), + .USER_WIDTH(USER_WIDTH), + .RAM_PIPELINE(RAM_PIPELINE), + .OUTPUT_FIFO_ENABLE(OUTPUT_FIFO_ENABLE), + .FRAME_FIFO(FRAME_FIFO), + .USER_BAD_FRAME_VALUE(USER_BAD_FRAME_VALUE), + .USER_BAD_FRAME_MASK(USER_BAD_FRAME_MASK), + .DROP_OVERSIZE_FRAME(DROP_OVERSIZE_FRAME), + .DROP_BAD_FRAME(DROP_BAD_FRAME), + .DROP_WHEN_FULL(DROP_WHEN_FULL), + .MARK_WHEN_FULL(MARK_WHEN_FULL), + .PAUSE_ENABLE(PAUSE_ENABLE), + .FRAME_PAUSE(FRAME_PAUSE) +) +fifo_inst ( + // AXI input + .s_clk(s_clk), + .s_rst(s_rst), + .s_axis_tdata(pre_fifo_axis_tdata), + .s_axis_tkeep(pre_fifo_axis_tkeep), + .s_axis_tvalid(pre_fifo_axis_tvalid), + .s_axis_tready(pre_fifo_axis_tready), + .s_axis_tlast(pre_fifo_axis_tlast), + .s_axis_tid(pre_fifo_axis_tid), + .s_axis_tdest(pre_fifo_axis_tdest), + .s_axis_tuser(pre_fifo_axis_tuser), + // AXI output + .m_clk(m_clk), + .m_rst(m_rst), + .m_axis_tdata(post_fifo_axis_tdata), + .m_axis_tkeep(post_fifo_axis_tkeep), + .m_axis_tvalid(post_fifo_axis_tvalid), + .m_axis_tready(post_fifo_axis_tready), + .m_axis_tlast(post_fifo_axis_tlast), + .m_axis_tid(post_fifo_axis_tid), + .m_axis_tdest(post_fifo_axis_tdest), + .m_axis_tuser(post_fifo_axis_tuser), + // Pause + .s_pause_req(s_pause_req), + .s_pause_ack(s_pause_ack), + .m_pause_req(m_pause_req), + .m_pause_ack(m_pause_ack), + // Status + .s_status_depth(s_status_depth), + .s_status_depth_commit(s_status_depth_commit), + .s_status_overflow(s_status_overflow), + .s_status_bad_frame(s_status_bad_frame), + .s_status_good_frame(s_status_good_frame), + .m_status_depth(m_status_depth), + .m_status_depth_commit(m_status_depth_commit), + .m_status_overflow(m_status_overflow), + .m_status_bad_frame(m_status_bad_frame), + .m_status_good_frame(m_status_good_frame) +); + +if (M_BYTE_LANES < S_BYTE_LANES) begin : downsize_post + + // input wider, adapt width after FIFO + + axis_adapter #( + .S_DATA_WIDTH(S_DATA_WIDTH), + .S_KEEP_ENABLE(S_KEEP_ENABLE), + .S_KEEP_WIDTH(S_KEEP_WIDTH), + .M_DATA_WIDTH(M_DATA_WIDTH), + .M_KEEP_ENABLE(M_KEEP_ENABLE), + .M_KEEP_WIDTH(M_KEEP_WIDTH), + .ID_ENABLE(ID_ENABLE), + .ID_WIDTH(ID_WIDTH), + .DEST_ENABLE(DEST_ENABLE), + .DEST_WIDTH(DEST_WIDTH), + .USER_ENABLE(USER_ENABLE), + .USER_WIDTH(USER_WIDTH) + ) + adapter_inst ( + .clk(m_clk), + .rst(m_rst), + // AXI input + .s_axis_tdata(post_fifo_axis_tdata), + .s_axis_tkeep(post_fifo_axis_tkeep), + .s_axis_tvalid(post_fifo_axis_tvalid), + .s_axis_tready(post_fifo_axis_tready), + .s_axis_tlast(post_fifo_axis_tlast), + .s_axis_tid(post_fifo_axis_tid), + .s_axis_tdest(post_fifo_axis_tdest), + .s_axis_tuser(post_fifo_axis_tuser), + // AXI output + .m_axis_tdata(m_axis_tdata), + .m_axis_tkeep(m_axis_tkeep), + .m_axis_tvalid(m_axis_tvalid), + .m_axis_tready(m_axis_tready), + .m_axis_tlast(m_axis_tlast), + .m_axis_tid(m_axis_tid), + .m_axis_tdest(m_axis_tdest), + .m_axis_tuser(m_axis_tuser) + ); + +end else begin : bypass_post + + assign m_axis_tdata = post_fifo_axis_tdata; + assign m_axis_tkeep = post_fifo_axis_tkeep; + assign m_axis_tvalid = post_fifo_axis_tvalid; + assign post_fifo_axis_tready = m_axis_tready; + assign m_axis_tlast = post_fifo_axis_tlast; + assign m_axis_tid = post_fifo_axis_tid; + assign m_axis_tdest = post_fifo_axis_tdest; + assign m_axis_tuser = post_fifo_axis_tuser; + +end + +endgenerate + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_fifo.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_fifo.v new file mode 100755 index 0000000..acac04a --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_fifo.v @@ -0,0 +1,565 @@ +/* + +Copyright (c) 2013-2023 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4-Stream FIFO + */ +module axis_fifo # +( + // FIFO depth in words + // KEEP_WIDTH words per cycle if KEEP_ENABLE set + // Rounded up to nearest power of 2 cycles + parameter DEPTH = 4096, + // Width of AXI stream interfaces in bits + parameter DATA_WIDTH = 8, + // Propagate tkeep signal + // If disabled, tkeep assumed to be 1'b1 + parameter KEEP_ENABLE = (DATA_WIDTH>8), + // tkeep signal width (words per cycle) + parameter KEEP_WIDTH = ((DATA_WIDTH+7)/8), + // Propagate tlast signal + parameter LAST_ENABLE = 1, + // Propagate tid signal + parameter ID_ENABLE = 0, + // tid signal width + parameter ID_WIDTH = 8, + // Propagate tdest signal + parameter DEST_ENABLE = 0, + // tdest signal width + parameter DEST_WIDTH = 8, + // Propagate tuser signal + parameter USER_ENABLE = 1, + // tuser signal width + parameter USER_WIDTH = 1, + // number of RAM pipeline registers + parameter RAM_PIPELINE = 1, + // use output FIFO + // When set, the RAM read enable and pipeline clock enables are removed + parameter OUTPUT_FIFO_ENABLE = 0, + // Frame FIFO mode - operate on frames instead of cycles + // When set, m_axis_tvalid will not be deasserted within a frame + // Requires LAST_ENABLE set + parameter FRAME_FIFO = 0, + // tuser value for bad frame marker + parameter USER_BAD_FRAME_VALUE = 1'b1, + // tuser mask for bad frame marker + parameter USER_BAD_FRAME_MASK = 1'b1, + // Drop frames larger than FIFO + // Requires FRAME_FIFO set + parameter DROP_OVERSIZE_FRAME = FRAME_FIFO, + // Drop frames marked bad + // Requires FRAME_FIFO and DROP_OVERSIZE_FRAME set + parameter DROP_BAD_FRAME = 0, + // Drop incoming frames when full + // When set, s_axis_tready is always asserted + // Requires FRAME_FIFO and DROP_OVERSIZE_FRAME set + parameter DROP_WHEN_FULL = 0, + // Mark incoming frames as bad frames when full + // When set, s_axis_tready is always asserted + // Requires FRAME_FIFO to be clear + parameter MARK_WHEN_FULL = 0, + // Enable pause request input + parameter PAUSE_ENABLE = 0, + // Pause between frames + parameter FRAME_PAUSE = FRAME_FIFO +) +( + input wire clk, + input wire rst, + + /* + * AXI input + */ + input wire [DATA_WIDTH-1:0] s_axis_tdata, + input wire [KEEP_WIDTH-1:0] s_axis_tkeep, + input wire s_axis_tvalid, + output wire s_axis_tready, + input wire s_axis_tlast, + input wire [ID_WIDTH-1:0] s_axis_tid, + input wire [DEST_WIDTH-1:0] s_axis_tdest, + input wire [USER_WIDTH-1:0] s_axis_tuser, + + /* + * AXI output + */ + output wire [DATA_WIDTH-1:0] m_axis_tdata, + output wire [KEEP_WIDTH-1:0] m_axis_tkeep, + output wire m_axis_tvalid, + input wire m_axis_tready, + output wire m_axis_tlast, + output wire [ID_WIDTH-1:0] m_axis_tid, + output wire [DEST_WIDTH-1:0] m_axis_tdest, + output wire [USER_WIDTH-1:0] m_axis_tuser, + + /* + * Pause + */ + input wire pause_req, + output wire pause_ack, + + /* + * Status + */ + output wire [$clog2(DEPTH):0] status_depth, + output wire [$clog2(DEPTH):0] status_depth_commit, + output wire status_overflow, + output wire status_bad_frame, + output wire status_good_frame +); + +parameter ADDR_WIDTH = (KEEP_ENABLE && KEEP_WIDTH > 1) ? $clog2(DEPTH/KEEP_WIDTH) : $clog2(DEPTH); + +parameter OUTPUT_FIFO_ADDR_WIDTH = RAM_PIPELINE < 2 ? 3 : $clog2(RAM_PIPELINE*2+7); + +// check configuration +initial begin + if (FRAME_FIFO && !LAST_ENABLE) begin + $error("Error: FRAME_FIFO set requires LAST_ENABLE set (instance %m)"); + $finish; + end + + if (DROP_OVERSIZE_FRAME && !FRAME_FIFO) begin + $error("Error: DROP_OVERSIZE_FRAME set requires FRAME_FIFO set (instance %m)"); + $finish; + end + + if (DROP_BAD_FRAME && !(FRAME_FIFO && DROP_OVERSIZE_FRAME)) begin + $error("Error: DROP_BAD_FRAME set requires FRAME_FIFO and DROP_OVERSIZE_FRAME set (instance %m)"); + $finish; + end + + if (DROP_WHEN_FULL && !(FRAME_FIFO && DROP_OVERSIZE_FRAME)) begin + $error("Error: DROP_WHEN_FULL set requires FRAME_FIFO and DROP_OVERSIZE_FRAME set (instance %m)"); + $finish; + end + + if ((DROP_BAD_FRAME || MARK_WHEN_FULL) && (USER_BAD_FRAME_MASK & {USER_WIDTH{1'b1}}) == 0) begin + $error("Error: Invalid USER_BAD_FRAME_MASK value (instance %m)"); + $finish; + end + + if (MARK_WHEN_FULL && FRAME_FIFO) begin + $error("Error: MARK_WHEN_FULL is not compatible with FRAME_FIFO (instance %m)"); + $finish; + end + + if (MARK_WHEN_FULL && !LAST_ENABLE) begin + $error("Error: MARK_WHEN_FULL set requires LAST_ENABLE set (instance %m)"); + $finish; + end +end + +localparam KEEP_OFFSET = DATA_WIDTH; +localparam LAST_OFFSET = KEEP_OFFSET + (KEEP_ENABLE ? KEEP_WIDTH : 0); +localparam ID_OFFSET = LAST_OFFSET + (LAST_ENABLE ? 1 : 0); +localparam DEST_OFFSET = ID_OFFSET + (ID_ENABLE ? ID_WIDTH : 0); +localparam USER_OFFSET = DEST_OFFSET + (DEST_ENABLE ? DEST_WIDTH : 0); +localparam WIDTH = USER_OFFSET + (USER_ENABLE ? USER_WIDTH : 0); + +reg [ADDR_WIDTH:0] wr_ptr_reg = {ADDR_WIDTH+1{1'b0}}; +reg [ADDR_WIDTH:0] wr_ptr_commit_reg = {ADDR_WIDTH+1{1'b0}}; +reg [ADDR_WIDTH:0] rd_ptr_reg = {ADDR_WIDTH+1{1'b0}}; + +(* ramstyle = "no_rw_check" *) +reg [WIDTH-1:0] mem[(2**ADDR_WIDTH)-1:0]; +reg mem_read_data_valid_reg = 1'b0; + +(* shreg_extract = "no" *) +reg [WIDTH-1:0] m_axis_pipe_reg[RAM_PIPELINE+1-1:0]; +reg [RAM_PIPELINE+1-1:0] m_axis_tvalid_pipe_reg = 0; + +// full when first MSB different but rest same +wire full = wr_ptr_reg == (rd_ptr_reg ^ {1'b1, {ADDR_WIDTH{1'b0}}}); +// empty when pointers match exactly +wire empty = wr_ptr_commit_reg == rd_ptr_reg; +// overflow within packet +wire full_wr = wr_ptr_reg == (wr_ptr_commit_reg ^ {1'b1, {ADDR_WIDTH{1'b0}}}); + +reg s_frame_reg = 1'b0; + +reg drop_frame_reg = 1'b0; +reg mark_frame_reg = 1'b0; +reg send_frame_reg = 1'b0; +reg [ADDR_WIDTH:0] depth_reg = 0; +reg [ADDR_WIDTH:0] depth_commit_reg = 0; +reg overflow_reg = 1'b0; +reg bad_frame_reg = 1'b0; +reg good_frame_reg = 1'b0; + +assign s_axis_tready = FRAME_FIFO ? (!full || (full_wr && DROP_OVERSIZE_FRAME) || DROP_WHEN_FULL) : (!full || MARK_WHEN_FULL); + +wire [WIDTH-1:0] s_axis; + +generate + assign s_axis[DATA_WIDTH-1:0] = s_axis_tdata; + if (KEEP_ENABLE) assign s_axis[KEEP_OFFSET +: KEEP_WIDTH] = s_axis_tkeep; + if (LAST_ENABLE) assign s_axis[LAST_OFFSET] = s_axis_tlast | mark_frame_reg; + if (ID_ENABLE) assign s_axis[ID_OFFSET +: ID_WIDTH] = s_axis_tid; + if (DEST_ENABLE) assign s_axis[DEST_OFFSET +: DEST_WIDTH] = s_axis_tdest; + if (USER_ENABLE) assign s_axis[USER_OFFSET +: USER_WIDTH] = mark_frame_reg ? USER_BAD_FRAME_VALUE : s_axis_tuser; +endgenerate + +wire [WIDTH-1:0] m_axis = m_axis_pipe_reg[RAM_PIPELINE+1-1]; + +wire m_axis_tready_pipe; +wire m_axis_tvalid_pipe = m_axis_tvalid_pipe_reg[RAM_PIPELINE+1-1]; + +wire [DATA_WIDTH-1:0] m_axis_tdata_pipe = m_axis[DATA_WIDTH-1:0]; +wire [KEEP_WIDTH-1:0] m_axis_tkeep_pipe = KEEP_ENABLE ? m_axis[KEEP_OFFSET +: KEEP_WIDTH] : {KEEP_WIDTH{1'b1}}; +wire m_axis_tlast_pipe = LAST_ENABLE ? m_axis[LAST_OFFSET] : 1'b1; +wire [ID_WIDTH-1:0] m_axis_tid_pipe = ID_ENABLE ? m_axis[ID_OFFSET +: ID_WIDTH] : {ID_WIDTH{1'b0}}; +wire [DEST_WIDTH-1:0] m_axis_tdest_pipe = DEST_ENABLE ? m_axis[DEST_OFFSET +: DEST_WIDTH] : {DEST_WIDTH{1'b0}}; +wire [USER_WIDTH-1:0] m_axis_tuser_pipe = USER_ENABLE ? m_axis[USER_OFFSET +: USER_WIDTH] : {USER_WIDTH{1'b0}}; + +wire m_axis_tready_out; +wire m_axis_tvalid_out; + +wire [DATA_WIDTH-1:0] m_axis_tdata_out; +wire [KEEP_WIDTH-1:0] m_axis_tkeep_out; +wire m_axis_tlast_out; +wire [ID_WIDTH-1:0] m_axis_tid_out; +wire [DEST_WIDTH-1:0] m_axis_tdest_out; +wire [USER_WIDTH-1:0] m_axis_tuser_out; + +wire pipe_ready; + +assign status_depth = (KEEP_ENABLE && KEEP_WIDTH > 1) ? {depth_reg, {$clog2(KEEP_WIDTH){1'b0}}} : depth_reg; +assign status_depth_commit = (KEEP_ENABLE && KEEP_WIDTH > 1) ? {depth_commit_reg, {$clog2(KEEP_WIDTH){1'b0}}} : depth_commit_reg; +assign status_overflow = overflow_reg; +assign status_bad_frame = bad_frame_reg; +assign status_good_frame = good_frame_reg; + +// Write logic +always @(posedge clk) begin + overflow_reg <= 1'b0; + bad_frame_reg <= 1'b0; + good_frame_reg <= 1'b0; + + if (s_axis_tready && s_axis_tvalid && LAST_ENABLE) begin + // track input frame status + s_frame_reg <= !s_axis_tlast; + end + + if (FRAME_FIFO) begin + // frame FIFO mode + if (s_axis_tready && s_axis_tvalid) begin + // transfer in + if ((full && DROP_WHEN_FULL) || (full_wr && DROP_OVERSIZE_FRAME) || drop_frame_reg) begin + // full, packet overflow, or currently dropping frame + // drop frame + drop_frame_reg <= 1'b1; + if (s_axis_tlast) begin + // end of frame, reset write pointer + wr_ptr_reg <= wr_ptr_commit_reg; + drop_frame_reg <= 1'b0; + overflow_reg <= 1'b1; + end + end else begin + // store it + mem[wr_ptr_reg[ADDR_WIDTH-1:0]] <= s_axis; + wr_ptr_reg <= wr_ptr_reg + 1; + if (s_axis_tlast || (!DROP_OVERSIZE_FRAME && (full_wr || send_frame_reg))) begin + // end of frame or send frame + send_frame_reg <= !s_axis_tlast; + if (s_axis_tlast && DROP_BAD_FRAME && USER_BAD_FRAME_MASK & ~(s_axis_tuser ^ USER_BAD_FRAME_VALUE)) begin + // bad packet, reset write pointer + wr_ptr_reg <= wr_ptr_commit_reg; + bad_frame_reg <= 1'b1; + end else begin + // good packet or packet overflow, update write pointer + wr_ptr_commit_reg <= wr_ptr_reg + 1; + good_frame_reg <= s_axis_tlast; + end + end + end + end else if (s_axis_tvalid && full_wr && !DROP_OVERSIZE_FRAME) begin + // data valid with packet overflow + // update write pointer + send_frame_reg <= 1'b1; + wr_ptr_commit_reg <= wr_ptr_reg; + end + end else begin + // normal FIFO mode + if (s_axis_tready && s_axis_tvalid) begin + if (drop_frame_reg && MARK_WHEN_FULL) begin + // currently dropping frame + if (s_axis_tlast) begin + // end of frame + if (!full && mark_frame_reg) begin + // terminate marked frame + mark_frame_reg <= 1'b0; + mem[wr_ptr_reg[ADDR_WIDTH-1:0]] <= s_axis; + wr_ptr_reg <= wr_ptr_reg + 1; + wr_ptr_commit_reg <= wr_ptr_reg + 1; + end + // end of frame, clear drop flag + drop_frame_reg <= 1'b0; + overflow_reg <= 1'b1; + end + end else if ((full || mark_frame_reg) && MARK_WHEN_FULL) begin + // full or marking frame + // drop frame; mark if this isn't the first cycle + drop_frame_reg <= 1'b1; + mark_frame_reg <= mark_frame_reg || s_frame_reg; + if (s_axis_tlast) begin + drop_frame_reg <= 1'b0; + overflow_reg <= 1'b1; + end + end else begin + // transfer in + mem[wr_ptr_reg[ADDR_WIDTH-1:0]] <= s_axis; + wr_ptr_reg <= wr_ptr_reg + 1; + wr_ptr_commit_reg <= wr_ptr_reg + 1; + end + end else if ((!full && !drop_frame_reg && mark_frame_reg) && MARK_WHEN_FULL) begin + // terminate marked frame + mark_frame_reg <= 1'b0; + mem[wr_ptr_reg[ADDR_WIDTH-1:0]] <= s_axis; + wr_ptr_reg <= wr_ptr_reg + 1; + wr_ptr_commit_reg <= wr_ptr_reg + 1; + end + end + + if (rst) begin + wr_ptr_reg <= {ADDR_WIDTH+1{1'b0}}; + wr_ptr_commit_reg <= {ADDR_WIDTH+1{1'b0}}; + + s_frame_reg <= 1'b0; + + drop_frame_reg <= 1'b0; + mark_frame_reg <= 1'b0; + send_frame_reg <= 1'b0; + overflow_reg <= 1'b0; + bad_frame_reg <= 1'b0; + good_frame_reg <= 1'b0; + end +end + +// Status +always @(posedge clk) begin + depth_reg <= wr_ptr_reg - rd_ptr_reg; + depth_commit_reg <= wr_ptr_commit_reg - rd_ptr_reg; +end + +// Read logic +integer j; + +always @(posedge clk) begin + if (m_axis_tready_pipe) begin + // output ready; invalidate stage + m_axis_tvalid_pipe_reg[RAM_PIPELINE+1-1] <= 1'b0; + end + + for (j = RAM_PIPELINE+1-1; j > 0; j = j - 1) begin + if (m_axis_tready_pipe || ((~m_axis_tvalid_pipe_reg) >> j)) begin + // output ready or bubble in pipeline; transfer down pipeline + m_axis_tvalid_pipe_reg[j] <= m_axis_tvalid_pipe_reg[j-1]; + m_axis_pipe_reg[j] <= m_axis_pipe_reg[j-1]; + m_axis_tvalid_pipe_reg[j-1] <= 1'b0; + end + end + + if (m_axis_tready_pipe || ~m_axis_tvalid_pipe_reg) begin + // output ready or bubble in pipeline; read new data from FIFO + m_axis_tvalid_pipe_reg[0] <= 1'b0; + m_axis_pipe_reg[0] <= mem[rd_ptr_reg[ADDR_WIDTH-1:0]]; + if (!empty && pipe_ready) begin + // not empty, increment pointer + m_axis_tvalid_pipe_reg[0] <= 1'b1; + rd_ptr_reg <= rd_ptr_reg + 1; + end + end + + if (rst) begin + rd_ptr_reg <= {ADDR_WIDTH+1{1'b0}}; + m_axis_tvalid_pipe_reg <= 0; + end +end + +generate + +if (!OUTPUT_FIFO_ENABLE) begin + + assign pipe_ready = 1'b1; + + assign m_axis_tready_pipe = m_axis_tready_out; + assign m_axis_tvalid_out = m_axis_tvalid_pipe; + + assign m_axis_tdata_out = m_axis_tdata_pipe; + assign m_axis_tkeep_out = m_axis_tkeep_pipe; + assign m_axis_tlast_out = m_axis_tlast_pipe; + assign m_axis_tid_out = m_axis_tid_pipe; + assign m_axis_tdest_out = m_axis_tdest_pipe; + assign m_axis_tuser_out = m_axis_tuser_pipe; + +end else begin : output_fifo + + // output datapath logic + reg [DATA_WIDTH-1:0] m_axis_tdata_reg = {DATA_WIDTH{1'b0}}; + reg [KEEP_WIDTH-1:0] m_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; + reg m_axis_tvalid_reg = 1'b0; + reg m_axis_tlast_reg = 1'b0; + reg [ID_WIDTH-1:0] m_axis_tid_reg = {ID_WIDTH{1'b0}}; + reg [DEST_WIDTH-1:0] m_axis_tdest_reg = {DEST_WIDTH{1'b0}}; + reg [USER_WIDTH-1:0] m_axis_tuser_reg = {USER_WIDTH{1'b0}}; + + reg [OUTPUT_FIFO_ADDR_WIDTH+1-1:0] out_fifo_wr_ptr_reg = 0; + reg [OUTPUT_FIFO_ADDR_WIDTH+1-1:0] out_fifo_rd_ptr_reg = 0; + reg out_fifo_half_full_reg = 1'b0; + + wire out_fifo_full = out_fifo_wr_ptr_reg == (out_fifo_rd_ptr_reg ^ {1'b1, {OUTPUT_FIFO_ADDR_WIDTH{1'b0}}}); + wire out_fifo_empty = out_fifo_wr_ptr_reg == out_fifo_rd_ptr_reg; + + (* ram_style = "distributed", ramstyle = "no_rw_check, mlab" *) + reg [DATA_WIDTH-1:0] out_fifo_tdata[2**OUTPUT_FIFO_ADDR_WIDTH-1:0]; + (* ram_style = "distributed", ramstyle = "no_rw_check, mlab" *) + reg [KEEP_WIDTH-1:0] out_fifo_tkeep[2**OUTPUT_FIFO_ADDR_WIDTH-1:0]; + (* ram_style = "distributed", ramstyle = "no_rw_check, mlab" *) + reg out_fifo_tlast[2**OUTPUT_FIFO_ADDR_WIDTH-1:0]; + (* ram_style = "distributed", ramstyle = "no_rw_check, mlab" *) + reg [ID_WIDTH-1:0] out_fifo_tid[2**OUTPUT_FIFO_ADDR_WIDTH-1:0]; + (* ram_style = "distributed", ramstyle = "no_rw_check, mlab" *) + reg [DEST_WIDTH-1:0] out_fifo_tdest[2**OUTPUT_FIFO_ADDR_WIDTH-1:0]; + (* ram_style = "distributed", ramstyle = "no_rw_check, mlab" *) + reg [USER_WIDTH-1:0] out_fifo_tuser[2**OUTPUT_FIFO_ADDR_WIDTH-1:0]; + + assign pipe_ready = !out_fifo_half_full_reg; + + assign m_axis_tready_pipe = 1'b1; + + assign m_axis_tdata_out = m_axis_tdata_reg; + assign m_axis_tkeep_out = KEEP_ENABLE ? m_axis_tkeep_reg : {KEEP_WIDTH{1'b1}}; + assign m_axis_tvalid_out = m_axis_tvalid_reg; + assign m_axis_tlast_out = LAST_ENABLE ? m_axis_tlast_reg : 1'b1; + assign m_axis_tid_out = ID_ENABLE ? m_axis_tid_reg : {ID_WIDTH{1'b0}}; + assign m_axis_tdest_out = DEST_ENABLE ? m_axis_tdest_reg : {DEST_WIDTH{1'b0}}; + assign m_axis_tuser_out = USER_ENABLE ? m_axis_tuser_reg : {USER_WIDTH{1'b0}}; + + always @(posedge clk) begin + m_axis_tvalid_reg <= m_axis_tvalid_reg && !m_axis_tready_out; + + out_fifo_half_full_reg <= $unsigned(out_fifo_wr_ptr_reg - out_fifo_rd_ptr_reg) >= 2**(OUTPUT_FIFO_ADDR_WIDTH-1); + + if (!out_fifo_full && m_axis_tvalid_pipe) begin + out_fifo_tdata[out_fifo_wr_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]] <= m_axis_tdata_pipe; + out_fifo_tkeep[out_fifo_wr_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]] <= m_axis_tkeep_pipe; + out_fifo_tlast[out_fifo_wr_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]] <= m_axis_tlast_pipe; + out_fifo_tid[out_fifo_wr_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]] <= m_axis_tid_pipe; + out_fifo_tdest[out_fifo_wr_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]] <= m_axis_tdest_pipe; + out_fifo_tuser[out_fifo_wr_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]] <= m_axis_tuser_pipe; + out_fifo_wr_ptr_reg <= out_fifo_wr_ptr_reg + 1; + end + + if (!out_fifo_empty && (!m_axis_tvalid_reg || m_axis_tready_out)) begin + m_axis_tdata_reg <= out_fifo_tdata[out_fifo_rd_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]]; + m_axis_tkeep_reg <= out_fifo_tkeep[out_fifo_rd_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]]; + m_axis_tvalid_reg <= 1'b1; + m_axis_tlast_reg <= out_fifo_tlast[out_fifo_rd_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]]; + m_axis_tid_reg <= out_fifo_tid[out_fifo_rd_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]]; + m_axis_tdest_reg <= out_fifo_tdest[out_fifo_rd_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]]; + m_axis_tuser_reg <= out_fifo_tuser[out_fifo_rd_ptr_reg[OUTPUT_FIFO_ADDR_WIDTH-1:0]]; + out_fifo_rd_ptr_reg <= out_fifo_rd_ptr_reg + 1; + end + + if (rst) begin + out_fifo_wr_ptr_reg <= 0; + out_fifo_rd_ptr_reg <= 0; + m_axis_tvalid_reg <= 1'b0; + end + end + +end + +if (PAUSE_ENABLE) begin : pause + + // Pause logic + reg pause_reg = 1'b0; + reg pause_frame_reg = 1'b0; + + assign m_axis_tready_out = m_axis_tready && !pause_reg; + assign m_axis_tvalid = m_axis_tvalid_out && !pause_reg; + + assign m_axis_tdata = m_axis_tdata_out; + assign m_axis_tkeep = m_axis_tkeep_out; + assign m_axis_tlast = m_axis_tlast_out; + assign m_axis_tid = m_axis_tid_out; + assign m_axis_tdest = m_axis_tdest_out; + assign m_axis_tuser = m_axis_tuser_out; + + assign pause_ack = pause_reg; + + always @(posedge clk) begin + if (FRAME_PAUSE) begin + if (pause_reg) begin + // paused; update pause status + pause_reg <= pause_req; + end else if (m_axis_tvalid_out) begin + // frame transfer; set frame bit + pause_frame_reg <= 1'b1; + if (m_axis_tready && m_axis_tlast) begin + // end of frame; clear frame bit and update pause status + pause_frame_reg <= 1'b0; + pause_reg <= pause_req; + end + end else if (!pause_frame_reg) begin + // idle; update pause status + pause_reg <= pause_req; + end + end else begin + pause_reg <= pause_req; + end + + if (rst) begin + pause_frame_reg <= 1'b0; + pause_reg <= 1'b0; + end + end + +end else begin + + assign m_axis_tready_out = m_axis_tready; + assign m_axis_tvalid = m_axis_tvalid_out; + + assign m_axis_tdata = m_axis_tdata_out; + assign m_axis_tkeep = m_axis_tkeep_out; + assign m_axis_tlast = m_axis_tlast_out; + assign m_axis_tid = m_axis_tid_out; + assign m_axis_tdest = m_axis_tdest_out; + assign m_axis_tuser = m_axis_tuser_out; + + assign pause_ack = 1'b0; + +end + +endgenerate + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_rx_32.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_rx_32.v new file mode 100755 index 0000000..c846605 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_rx_32.v @@ -0,0 +1,355 @@ +/* + +Copyright (c) 2015-2017 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4-Stream XGMII frame receiver (XGMII in, AXI out) + */ +module axis_xgmii_rx_32 # +( + parameter DATA_WIDTH = 32, + parameter KEEP_WIDTH = (DATA_WIDTH/8), + parameter CTRL_WIDTH = (DATA_WIDTH/8), + parameter PTP_TS_ENABLE = 0, + parameter PTP_TS_WIDTH = 96, + parameter USER_WIDTH = (PTP_TS_ENABLE ? PTP_TS_WIDTH : 0) + 1 +) +( + input wire clk, + input wire rst, + + /* + * XGMII input + */ + input wire [DATA_WIDTH-1:0] xgmii_rxd, + input wire [CTRL_WIDTH-1:0] xgmii_rxc, + + /* + * AXI output + */ + output wire [DATA_WIDTH-1:0] m_axis_tdata, + output wire [KEEP_WIDTH-1:0] m_axis_tkeep, + output wire m_axis_tvalid, + output wire m_axis_tlast, + output wire [USER_WIDTH-1:0] m_axis_tuser, + + /* + * PTP + */ + input wire [PTP_TS_WIDTH-1:0] ptp_ts, + + /* + * Configuration + */ + input wire cfg_rx_enable, + + /* + * Status + */ + output wire start_packet, + output wire error_bad_frame, + output wire error_bad_fcs +); + +// bus width assertions +initial begin + if (DATA_WIDTH != 32) begin + $error("Error: Interface width must be 32"); + $finish; + end + + if (KEEP_WIDTH * 8 != DATA_WIDTH || CTRL_WIDTH * 8 != DATA_WIDTH) begin + $error("Error: Interface requires byte (8-bit) granularity"); + $finish; + end +end + +localparam [7:0] + ETH_PRE = 8'h55, + ETH_SFD = 8'hD5; + +localparam [7:0] + XGMII_IDLE = 8'h07, + XGMII_START = 8'hfb, + XGMII_TERM = 8'hfd, + XGMII_ERROR = 8'hfe; + +localparam [1:0] + STATE_IDLE = 2'd0, + STATE_PREAMBLE = 2'd1, + STATE_PAYLOAD = 2'd2, + STATE_LAST = 2'd3; + +reg [1:0] state_reg = STATE_IDLE, state_next; + +// datapath control signals +reg reset_crc; + +reg [1:0] term_lane_reg = 0, term_lane_d0_reg = 0; +reg term_present_reg = 1'b0; +reg framing_error_reg = 1'b0; + +reg [DATA_WIDTH-1:0] xgmii_rxd_d0 = {DATA_WIDTH{1'b0}}; +reg [DATA_WIDTH-1:0] xgmii_rxd_d1 = {DATA_WIDTH{1'b0}}; +reg [DATA_WIDTH-1:0] xgmii_rxd_d2 = {DATA_WIDTH{1'b0}}; + +reg [CTRL_WIDTH-1:0] xgmii_rxc_d0 = {CTRL_WIDTH{1'b0}}; + +reg xgmii_start_d0 = 1'b0; +reg xgmii_start_d1 = 1'b0; +reg xgmii_start_d2 = 1'b0; + +reg [DATA_WIDTH-1:0] m_axis_tdata_reg = {DATA_WIDTH{1'b0}}, m_axis_tdata_next; +reg [KEEP_WIDTH-1:0] m_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}, m_axis_tkeep_next; +reg m_axis_tvalid_reg = 1'b0, m_axis_tvalid_next; +reg m_axis_tlast_reg = 1'b0, m_axis_tlast_next; +reg [USER_WIDTH-1:0] m_axis_tuser_reg = {USER_WIDTH{1'b0}}, m_axis_tuser_next; + +reg start_packet_reg = 1'b0, start_packet_next; +reg error_bad_frame_reg = 1'b0, error_bad_frame_next; +reg error_bad_fcs_reg = 1'b0, error_bad_fcs_next; + +reg [31:0] crc_state = 32'hFFFFFFFF; + +wire [31:0] crc_next; + +wire [3:0] crc_valid; +reg [3:0] crc_valid_save; + +assign crc_valid[3] = crc_next == ~32'h2144df1c; +assign crc_valid[2] = crc_next == ~32'hc622f71d; +assign crc_valid[1] = crc_next == ~32'hb1c2a1a3; +assign crc_valid[0] = crc_next == ~32'h9d6cdf7e; + +assign m_axis_tdata = m_axis_tdata_reg; +assign m_axis_tkeep = m_axis_tkeep_reg; +assign m_axis_tvalid = m_axis_tvalid_reg; +assign m_axis_tlast = m_axis_tlast_reg; +assign m_axis_tuser = m_axis_tuser_reg; + +assign start_packet = start_packet_reg; +assign error_bad_frame = error_bad_frame_reg; +assign error_bad_fcs = error_bad_fcs_reg; + +wire last_cycle = state_reg == STATE_LAST; + +lfsr #( + .LFSR_WIDTH(32), + .LFSR_POLY(32'h4c11db7), + .LFSR_CONFIG("GALOIS"), + .LFSR_FEED_FORWARD(0), + .REVERSE(1), + .DATA_WIDTH(32), + .STYLE("AUTO") +) +eth_crc ( + .data_in(xgmii_rxd_d0), + .state_in(crc_state), + .data_out(), + .state_out(crc_next) +); + +always @* begin + state_next = STATE_IDLE; + + reset_crc = 1'b0; + + m_axis_tdata_next = xgmii_rxd_d2; + m_axis_tkeep_next = {KEEP_WIDTH{1'b1}}; + m_axis_tvalid_next = 1'b0; + m_axis_tlast_next = 1'b0; + m_axis_tuser_next = m_axis_tuser_reg; + m_axis_tuser_next[0] = 1'b0; + + start_packet_next = 1'b0; + error_bad_frame_next = 1'b0; + error_bad_fcs_next = 1'b0; + + case (state_reg) + STATE_IDLE: begin + // idle state - wait for packet + reset_crc = 1'b1; + + if (xgmii_start_d2 && cfg_rx_enable) begin + // start condition + if (framing_error_reg) begin + // control or error characters in first data word + m_axis_tdata_next = xgmii_rxd_d2; + m_axis_tkeep_next = 4'h1; + m_axis_tvalid_next = 1'b1; + m_axis_tlast_next = 1'b1; + m_axis_tuser_next[0] = 1'b1; + error_bad_frame_next = 1'b1; + state_next = STATE_IDLE; + end else begin + reset_crc = 1'b0; + state_next = STATE_PREAMBLE; + end + end else begin + if (PTP_TS_ENABLE) begin + m_axis_tuser_next[1 +: PTP_TS_WIDTH] = ptp_ts; + end + state_next = STATE_IDLE; + end + end + STATE_PREAMBLE: begin + // drop preamble + start_packet_next = 1'b1; + state_next = STATE_PAYLOAD; + end + STATE_PAYLOAD: begin + // read payload + m_axis_tdata_next = xgmii_rxd_d2; + m_axis_tkeep_next = {KEEP_WIDTH{1'b1}}; + m_axis_tvalid_next = 1'b1; + m_axis_tlast_next = 1'b0; + m_axis_tuser_next[0] = 1'b0; + + if (framing_error_reg) begin + // control or error characters in packet + m_axis_tlast_next = 1'b1; + m_axis_tuser_next[0] = 1'b1; + error_bad_frame_next = 1'b1; + reset_crc = 1'b1; + state_next = STATE_IDLE; + end else if (term_present_reg) begin + reset_crc = 1'b1; + if (term_lane_reg == 0) begin + // end this cycle + m_axis_tkeep_next = 4'b1111; + m_axis_tlast_next = 1'b1; + if (term_lane_reg == 0 && crc_valid_save[3]) begin + // CRC valid + end else begin + m_axis_tuser_next[0] = 1'b1; + error_bad_frame_next = 1'b1; + error_bad_fcs_next = 1'b1; + end + state_next = STATE_IDLE; + end else begin + // need extra cycle + state_next = STATE_LAST; + end + end else begin + state_next = STATE_PAYLOAD; + end + end + STATE_LAST: begin + // last cycle of packet + m_axis_tdata_next = xgmii_rxd_d2; + m_axis_tkeep_next = {KEEP_WIDTH{1'b1}} >> (CTRL_WIDTH-term_lane_d0_reg); + m_axis_tvalid_next = 1'b1; + m_axis_tlast_next = 1'b1; + m_axis_tuser_next[0] = 1'b0; + + reset_crc = 1'b1; + + if ((term_lane_d0_reg == 1 && crc_valid_save[0]) || + (term_lane_d0_reg == 2 && crc_valid_save[1]) || + (term_lane_d0_reg == 3 && crc_valid_save[2])) begin + // CRC valid + end else begin + m_axis_tuser_next[0] = 1'b1; + error_bad_frame_next = 1'b1; + error_bad_fcs_next = 1'b1; + end + + state_next = STATE_IDLE; + end + endcase +end + +integer i; + +always @(posedge clk) begin + state_reg <= state_next; + + m_axis_tdata_reg <= m_axis_tdata_next; + m_axis_tkeep_reg <= m_axis_tkeep_next; + m_axis_tvalid_reg <= m_axis_tvalid_next; + m_axis_tlast_reg <= m_axis_tlast_next; + m_axis_tuser_reg <= m_axis_tuser_next; + + start_packet_reg <= start_packet_next; + error_bad_frame_reg <= error_bad_frame_next; + error_bad_fcs_reg <= error_bad_fcs_next; + + term_lane_reg <= 0; + term_present_reg <= 1'b0; + framing_error_reg <= xgmii_rxc != 0; + + for (i = CTRL_WIDTH-1; i >= 0; i = i - 1) begin + if (xgmii_rxc[i] && (xgmii_rxd[i*8 +: 8] == XGMII_TERM)) begin + term_lane_reg <= i; + term_present_reg <= 1'b1; + framing_error_reg <= (xgmii_rxc & ({CTRL_WIDTH{1'b1}} >> (CTRL_WIDTH-i))) != 0; + end + end + + term_lane_d0_reg <= term_lane_reg; + + if (reset_crc) begin + crc_state <= 32'hFFFFFFFF; + end else begin + crc_state <= crc_next; + end + + crc_valid_save <= crc_valid; + + for (i = 0; i < CTRL_WIDTH; i = i + 1) begin + xgmii_rxd_d0[i*8 +: 8] <= xgmii_rxc[i] ? 8'd0 : xgmii_rxd[i*8 +: 8]; + end + xgmii_rxc_d0 <= xgmii_rxc; + xgmii_rxd_d1 <= xgmii_rxd_d0; + xgmii_rxd_d2 <= xgmii_rxd_d1; + + xgmii_start_d0 <= xgmii_rxc[0] && xgmii_rxd[7:0] == XGMII_START; + xgmii_start_d1 <= xgmii_start_d0; + xgmii_start_d2 <= xgmii_start_d1; + + if (rst) begin + state_reg <= STATE_IDLE; + + m_axis_tvalid_reg <= 1'b0; + + start_packet_reg <= 1'b0; + error_bad_frame_reg <= 1'b0; + error_bad_fcs_reg <= 1'b0; + + xgmii_rxc_d0 <= {CTRL_WIDTH{1'b0}}; + + xgmii_start_d0 <= 1'b0; + xgmii_start_d1 <= 1'b0; + xgmii_start_d2 <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_rx_64.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_rx_64.v new file mode 100755 index 0000000..132decf --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_rx_64.v @@ -0,0 +1,449 @@ +/* + +Copyright (c) 2015-2017 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4-Stream XGMII frame receiver (XGMII in, AXI out) + */ +module axis_xgmii_rx_64 # +( + parameter DATA_WIDTH = 64, + parameter KEEP_WIDTH = (DATA_WIDTH/8), + parameter CTRL_WIDTH = (DATA_WIDTH/8), + parameter PTP_TS_ENABLE = 0, + parameter PTP_TS_FMT_TOD = 1, + parameter PTP_TS_WIDTH = PTP_TS_FMT_TOD ? 96 : 64, + parameter USER_WIDTH = (PTP_TS_ENABLE ? PTP_TS_WIDTH : 0) + 1 +) +( + input wire clk, + input wire rst, + + /* + * XGMII input + */ + input wire [DATA_WIDTH-1:0] xgmii_rxd, + input wire [CTRL_WIDTH-1:0] xgmii_rxc, + + /* + * AXI output + */ + output wire [DATA_WIDTH-1:0] m_axis_tdata, + output wire [KEEP_WIDTH-1:0] m_axis_tkeep, + output wire m_axis_tvalid, + output wire m_axis_tlast, + output wire [USER_WIDTH-1:0] m_axis_tuser, + + /* + * PTP + */ + input wire [PTP_TS_WIDTH-1:0] ptp_ts, + + /* + * Configuration + */ + input wire cfg_rx_enable, + + /* + * Status + */ + output wire [1:0] start_packet, + output wire error_bad_frame, + output wire error_bad_fcs +); + +// bus width assertions +initial begin + if (DATA_WIDTH != 64) begin + $error("Error: Interface width must be 64"); + $finish; + end + + if (KEEP_WIDTH * 8 != DATA_WIDTH || CTRL_WIDTH * 8 != DATA_WIDTH) begin + $error("Error: Interface requires byte (8-bit) granularity"); + $finish; + end +end + +localparam [7:0] + ETH_PRE = 8'h55, + ETH_SFD = 8'hD5; + +localparam [7:0] + XGMII_IDLE = 8'h07, + XGMII_START = 8'hfb, + XGMII_TERM = 8'hfd, + XGMII_ERROR = 8'hfe; + +localparam [1:0] + STATE_IDLE = 2'd0, + STATE_PAYLOAD = 2'd1, + STATE_LAST = 2'd2; + +reg [1:0] state_reg = STATE_IDLE, state_next; + +// datapath control signals +reg reset_crc; + +reg lanes_swapped = 1'b0; +reg [31:0] swap_rxd = 32'd0; +reg [3:0] swap_rxc = 4'd0; +reg [3:0] swap_rxc_term = 4'd0; + +reg [DATA_WIDTH-1:0] xgmii_rxd_masked = {DATA_WIDTH{1'b0}}; +reg [CTRL_WIDTH-1:0] xgmii_term = {CTRL_WIDTH{1'b0}}; +reg [2:0] term_lane_reg = 0, term_lane_d0_reg = 0; +reg term_present_reg = 1'b0; +reg framing_error_reg = 1'b0, framing_error_d0_reg = 1'b0; + +reg [DATA_WIDTH-1:0] xgmii_rxd_d0 = {DATA_WIDTH{1'b0}}; +reg [DATA_WIDTH-1:0] xgmii_rxd_d1 = {DATA_WIDTH{1'b0}}; + +reg [CTRL_WIDTH-1:0] xgmii_rxc_d0 = {CTRL_WIDTH{1'b0}}; + +reg xgmii_start_swap = 1'b0; +reg xgmii_start_d0 = 1'b0; +reg xgmii_start_d1 = 1'b0; + +reg [DATA_WIDTH-1:0] m_axis_tdata_reg = {DATA_WIDTH{1'b0}}, m_axis_tdata_next; +reg [KEEP_WIDTH-1:0] m_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}, m_axis_tkeep_next; +reg m_axis_tvalid_reg = 1'b0, m_axis_tvalid_next; +reg m_axis_tlast_reg = 1'b0, m_axis_tlast_next; +reg [USER_WIDTH-1:0] m_axis_tuser_reg = {USER_WIDTH{1'b0}}, m_axis_tuser_next; + +reg [1:0] start_packet_reg = 2'b00; +reg error_bad_frame_reg = 1'b0, error_bad_frame_next; +reg error_bad_fcs_reg = 1'b0, error_bad_fcs_next; + +reg [PTP_TS_WIDTH-1:0] ptp_ts_reg = 0; +reg [PTP_TS_WIDTH-1:0] ptp_ts_adj_reg = 0; +reg ptp_ts_borrow_reg = 0; + +reg [31:0] crc_state = 32'hFFFFFFFF; + +wire [31:0] crc_next; + +wire [7:0] crc_valid; +reg [7:0] crc_valid_save; + +assign crc_valid[7] = crc_next == ~32'h2144df1c; +assign crc_valid[6] = crc_next == ~32'hc622f71d; +assign crc_valid[5] = crc_next == ~32'hb1c2a1a3; +assign crc_valid[4] = crc_next == ~32'h9d6cdf7e; +assign crc_valid[3] = crc_next == ~32'h6522df69; +assign crc_valid[2] = crc_next == ~32'he60914ae; +assign crc_valid[1] = crc_next == ~32'he38a6876; +assign crc_valid[0] = crc_next == ~32'h6b87b1ec; + +reg [4+16-1:0] last_ts_reg = 0; +reg [4+16-1:0] ts_inc_reg = 0; + +assign m_axis_tdata = m_axis_tdata_reg; +assign m_axis_tkeep = m_axis_tkeep_reg; +assign m_axis_tvalid = m_axis_tvalid_reg; +assign m_axis_tlast = m_axis_tlast_reg; +assign m_axis_tuser = m_axis_tuser_reg; + +assign start_packet = start_packet_reg; +assign error_bad_frame = error_bad_frame_reg; +assign error_bad_fcs = error_bad_fcs_reg; + +lfsr #( + .LFSR_WIDTH(32), + .LFSR_POLY(32'h4c11db7), + .LFSR_CONFIG("GALOIS"), + .LFSR_FEED_FORWARD(0), + .REVERSE(1), + .DATA_WIDTH(64), + .STYLE("AUTO") +) +eth_crc ( + .data_in(xgmii_rxd_d0), + .state_in(crc_state), + .data_out(), + .state_out(crc_next) +); + +// Mask input data +integer j; + +always @* begin + for (j = 0; j < 8; j = j + 1) begin + xgmii_rxd_masked[j*8 +: 8] = xgmii_rxc[j] ? 8'd0 : xgmii_rxd[j*8 +: 8]; + xgmii_term[j] = xgmii_rxc[j] && (xgmii_rxd[j*8 +: 8] == XGMII_TERM); + end +end + +always @* begin + state_next = STATE_IDLE; + + reset_crc = 1'b0; + + m_axis_tdata_next = xgmii_rxd_d1; + m_axis_tkeep_next = {KEEP_WIDTH{1'b1}}; + m_axis_tvalid_next = 1'b0; + m_axis_tlast_next = 1'b0; + m_axis_tuser_next = m_axis_tuser_reg; + m_axis_tuser_next[0] = 1'b0; + + error_bad_frame_next = 1'b0; + error_bad_fcs_next = 1'b0; + + case (state_reg) + STATE_IDLE: begin + // idle state - wait for packet + reset_crc = 1'b1; + + if (xgmii_start_d1 && cfg_rx_enable) begin + // start condition + + reset_crc = 1'b0; + state_next = STATE_PAYLOAD; + end else begin + state_next = STATE_IDLE; + end + end + STATE_PAYLOAD: begin + // read payload + m_axis_tdata_next = xgmii_rxd_d1; + m_axis_tkeep_next = {KEEP_WIDTH{1'b1}}; + m_axis_tvalid_next = 1'b1; + m_axis_tlast_next = 1'b0; + m_axis_tuser_next[0] = 1'b0; + + if (PTP_TS_ENABLE) begin + m_axis_tuser_next[1 +: PTP_TS_WIDTH] = (!PTP_TS_FMT_TOD || ptp_ts_borrow_reg) ? ptp_ts_reg : ptp_ts_adj_reg; + end + + if (framing_error_reg || framing_error_d0_reg) begin + // control or error characters in packet + m_axis_tlast_next = 1'b1; + m_axis_tuser_next[0] = 1'b1; + error_bad_frame_next = 1'b1; + reset_crc = 1'b1; + state_next = STATE_IDLE; + end else if (term_present_reg) begin + reset_crc = 1'b1; + if (term_lane_reg <= 4) begin + // end this cycle + m_axis_tkeep_next = {KEEP_WIDTH{1'b1}} >> (CTRL_WIDTH-4-term_lane_reg); + m_axis_tlast_next = 1'b1; + if ((term_lane_reg == 0 && crc_valid_save[7]) || + (term_lane_reg == 1 && crc_valid[0]) || + (term_lane_reg == 2 && crc_valid[1]) || + (term_lane_reg == 3 && crc_valid[2]) || + (term_lane_reg == 4 && crc_valid[3])) begin + // CRC valid + end else begin + m_axis_tuser_next[0] = 1'b1; + error_bad_frame_next = 1'b1; + error_bad_fcs_next = 1'b1; + end + state_next = STATE_IDLE; + end else begin + // need extra cycle + state_next = STATE_LAST; + end + end else begin + state_next = STATE_PAYLOAD; + end + end + STATE_LAST: begin + // last cycle of packet + m_axis_tdata_next = xgmii_rxd_d1; + m_axis_tkeep_next = {KEEP_WIDTH{1'b1}} >> (CTRL_WIDTH+4-term_lane_d0_reg); + m_axis_tvalid_next = 1'b1; + m_axis_tlast_next = 1'b1; + m_axis_tuser_next[0] = 1'b0; + + reset_crc = 1'b1; + + if ((term_lane_d0_reg == 5 && crc_valid_save[4]) || + (term_lane_d0_reg == 6 && crc_valid_save[5]) || + (term_lane_d0_reg == 7 && crc_valid_save[6])) begin + // CRC valid + end else begin + m_axis_tuser_next[0] = 1'b1; + error_bad_frame_next = 1'b1; + error_bad_fcs_next = 1'b1; + end + + if (xgmii_start_d1 && cfg_rx_enable) begin + // start condition + + reset_crc = 1'b0; + state_next = STATE_PAYLOAD; + end else begin + state_next = STATE_IDLE; + end + end + endcase +end + +integer i; + +always @(posedge clk) begin + state_reg <= state_next; + + m_axis_tdata_reg <= m_axis_tdata_next; + m_axis_tkeep_reg <= m_axis_tkeep_next; + m_axis_tvalid_reg <= m_axis_tvalid_next; + m_axis_tlast_reg <= m_axis_tlast_next; + m_axis_tuser_reg <= m_axis_tuser_next; + + start_packet_reg <= 2'b00; + error_bad_frame_reg <= error_bad_frame_next; + error_bad_fcs_reg <= error_bad_fcs_next; + + swap_rxd <= xgmii_rxd_masked[63:32]; + swap_rxc <= xgmii_rxc[7:4]; + swap_rxc_term <= xgmii_term[7:4]; + + xgmii_start_swap <= 1'b0; + xgmii_start_d0 <= xgmii_start_swap; + + if (PTP_TS_ENABLE && PTP_TS_FMT_TOD) begin + // ns field rollover + ptp_ts_adj_reg[15:0] <= ptp_ts_reg[15:0]; + {ptp_ts_borrow_reg, ptp_ts_adj_reg[45:16]} <= $signed({1'b0, ptp_ts_reg[45:16]}) - $signed(31'd1000000000); + ptp_ts_adj_reg[47:46] <= 0; + ptp_ts_adj_reg[95:48] <= ptp_ts_reg[95:48] + 1; + end + + // lane swapping and termination character detection + if (lanes_swapped) begin + xgmii_rxd_d0 <= {xgmii_rxd_masked[31:0], swap_rxd}; + xgmii_rxc_d0 <= {xgmii_rxc[3:0], swap_rxc}; + + term_lane_reg <= 0; + term_present_reg <= 1'b0; + framing_error_reg <= {xgmii_rxc[3:0], swap_rxc} != 0; + + for (i = CTRL_WIDTH-1; i >= 0; i = i - 1) begin + if ({xgmii_term[3:0], swap_rxc_term} & (1 << i)) begin + term_lane_reg <= i; + term_present_reg <= 1'b1; + framing_error_reg <= ({xgmii_rxc[3:0], swap_rxc} & ({CTRL_WIDTH{1'b1}} >> (CTRL_WIDTH-i))) != 0; + lanes_swapped <= 1'b0; + end + end + end else begin + xgmii_rxd_d0 <= xgmii_rxd_masked; + xgmii_rxc_d0 <= xgmii_rxc; + + term_lane_reg <= 0; + term_present_reg <= 1'b0; + framing_error_reg <= xgmii_rxc != 0; + + for (i = CTRL_WIDTH-1; i >= 0; i = i - 1) begin + if (xgmii_rxc[i] && (xgmii_rxd[i*8 +: 8] == XGMII_TERM)) begin + term_lane_reg <= i; + term_present_reg <= 1'b1; + framing_error_reg <= (xgmii_rxc & ({CTRL_WIDTH{1'b1}} >> (CTRL_WIDTH-i))) != 0; + lanes_swapped <= 1'b0; + end + end + end + + // start control character detection + if (xgmii_rxc[0] && xgmii_rxd[7:0] == XGMII_START) begin + lanes_swapped <= 1'b0; + + xgmii_start_d0 <= 1'b1; + + term_lane_reg <= 0; + term_present_reg <= 1'b0; + framing_error_reg <= xgmii_rxc[7:1] != 0; + end else if (xgmii_rxc[4] && xgmii_rxd[39:32] == XGMII_START) begin + lanes_swapped <= 1'b1; + + xgmii_start_swap <= 1'b1; + + term_lane_reg <= 0; + term_present_reg <= 1'b0; + framing_error_reg <= xgmii_rxc[7:5] != 0; + end + + // capture timestamps + if (xgmii_start_swap) begin + start_packet_reg <= 2'b10; + if (PTP_TS_FMT_TOD) begin + ptp_ts_reg[45:0] <= ptp_ts[45:0] + (ts_inc_reg >> 1); + ptp_ts_reg[95:48] <= ptp_ts[95:48]; + end else begin + ptp_ts_reg <= ptp_ts + (ts_inc_reg >> 1); + end + end + + if (xgmii_start_d0) begin + if (!lanes_swapped) begin + start_packet_reg <= 2'b01; + ptp_ts_reg <= ptp_ts; + end + end + + term_lane_d0_reg <= term_lane_reg; + framing_error_d0_reg <= framing_error_reg; + + if (reset_crc) begin + crc_state <= 32'hFFFFFFFF; + end else begin + crc_state <= crc_next; + end + + crc_valid_save <= crc_valid; + + xgmii_rxd_d1 <= xgmii_rxd_d0; + xgmii_start_d1 <= xgmii_start_d0; + + last_ts_reg <= ptp_ts; + ts_inc_reg <= ptp_ts - last_ts_reg; + + if (rst) begin + state_reg <= STATE_IDLE; + + m_axis_tvalid_reg <= 1'b0; + + start_packet_reg <= 2'b00; + error_bad_frame_reg <= 1'b0; + error_bad_fcs_reg <= 1'b0; + + xgmii_rxc_d0 <= {CTRL_WIDTH{1'b0}}; + + xgmii_start_swap <= 1'b0; + xgmii_start_d0 <= 1'b0; + xgmii_start_d1 <= 1'b0; + + lanes_swapped <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_tx_32.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_tx_32.v new file mode 100755 index 0000000..b147f5a --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_tx_32.v @@ -0,0 +1,563 @@ +/* + +Copyright (c) 2015-2017 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4-Stream XGMII frame transmitter (AXI in, XGMII out) + */ +module axis_xgmii_tx_32 # +( + parameter DATA_WIDTH = 32, + parameter KEEP_WIDTH = (DATA_WIDTH/8), + parameter CTRL_WIDTH = (DATA_WIDTH/8), + parameter ENABLE_PADDING = 1, + parameter ENABLE_DIC = 1, + parameter MIN_FRAME_LENGTH = 64, + parameter PTP_TS_ENABLE = 0, + parameter PTP_TS_WIDTH = 96, + parameter PTP_TS_CTRL_IN_TUSER = 0, + parameter PTP_TAG_ENABLE = PTP_TS_ENABLE, + parameter PTP_TAG_WIDTH = 16, + parameter USER_WIDTH = (PTP_TS_ENABLE ? (PTP_TAG_ENABLE ? PTP_TAG_WIDTH : 0) + (PTP_TS_CTRL_IN_TUSER ? 1 : 0) : 0) + 1 +) +( + input wire clk, + input wire rst, + + /* + * AXI input + */ + input wire [DATA_WIDTH-1:0] s_axis_tdata, + input wire [KEEP_WIDTH-1:0] s_axis_tkeep, + input wire s_axis_tvalid, + output wire s_axis_tready, + input wire s_axis_tlast, + input wire [USER_WIDTH-1:0] s_axis_tuser, + + /* + * XGMII output + */ + output wire [DATA_WIDTH-1:0] xgmii_txd, + output wire [CTRL_WIDTH-1:0] xgmii_txc, + + /* + * PTP + */ + input wire [PTP_TS_WIDTH-1:0] ptp_ts, + output wire [PTP_TS_WIDTH-1:0] m_axis_ptp_ts, + output wire [PTP_TAG_WIDTH-1:0] m_axis_ptp_ts_tag, + output wire m_axis_ptp_ts_valid, + + /* + * Configuration + */ + input wire [7:0] cfg_ifg, + input wire cfg_tx_enable, + + /* + * Status + */ + output wire start_packet, + output wire error_underflow +); + +parameter EMPTY_WIDTH = $clog2(KEEP_WIDTH); +parameter MIN_LEN_WIDTH = $clog2(MIN_FRAME_LENGTH-4-CTRL_WIDTH+1); + +// bus width assertions +initial begin + if (DATA_WIDTH != 32) begin + $error("Error: Interface width must be 32"); + $finish; + end + + if (KEEP_WIDTH * 8 != DATA_WIDTH || CTRL_WIDTH * 8 != DATA_WIDTH) begin + $error("Error: Interface requires byte (8-bit) granularity"); + $finish; + end +end + +localparam [7:0] + ETH_PRE = 8'h55, + ETH_SFD = 8'hD5; + +localparam [7:0] + XGMII_IDLE = 8'h07, + XGMII_START = 8'hfb, + XGMII_TERM = 8'hfd, + XGMII_ERROR = 8'hfe; + +localparam [3:0] + STATE_IDLE = 4'd0, + STATE_PREAMBLE = 4'd1, + STATE_PAYLOAD = 4'd2, + STATE_PAD = 4'd3, + STATE_FCS_1 = 4'd4, + STATE_FCS_2 = 4'd5, + STATE_FCS_3 = 4'd6, + STATE_ERR = 4'd7, + STATE_IFG = 4'd8; + +reg [3:0] state_reg = STATE_IDLE, state_next; + +// datapath control signals +reg reset_crc; +reg update_crc; + +reg [DATA_WIDTH-1:0] s_axis_tdata_masked; + +reg [DATA_WIDTH-1:0] s_tdata_reg = 0, s_tdata_next; +reg [EMPTY_WIDTH-1:0] s_empty_reg = 0, s_empty_next; + +reg [DATA_WIDTH-1:0] fcs_output_txd_0; +reg [DATA_WIDTH-1:0] fcs_output_txd_1; +reg [CTRL_WIDTH-1:0] fcs_output_txc_0; +reg [CTRL_WIDTH-1:0] fcs_output_txc_1; + +reg [7:0] ifg_offset; + +reg extra_cycle; + +reg frame_reg = 1'b0, frame_next; +reg frame_error_reg = 1'b0, frame_error_next; +reg [MIN_LEN_WIDTH-1:0] frame_min_count_reg = 0, frame_min_count_next; + +reg [7:0] ifg_count_reg = 8'd0, ifg_count_next; +reg [1:0] deficit_idle_count_reg = 2'd0, deficit_idle_count_next; + +reg s_axis_tready_reg = 1'b0, s_axis_tready_next; + +reg [PTP_TS_WIDTH-1:0] m_axis_ptp_ts_reg = 0, m_axis_ptp_ts_next; +reg [PTP_TAG_WIDTH-1:0] m_axis_ptp_ts_tag_reg = 0, m_axis_ptp_ts_tag_next; +reg m_axis_ptp_ts_valid_reg = 1'b0, m_axis_ptp_ts_valid_next; + +reg [31:0] crc_state_reg[3:0]; +wire [31:0] crc_state_next[3:0]; + +reg [DATA_WIDTH-1:0] xgmii_txd_reg = {CTRL_WIDTH{XGMII_IDLE}}, xgmii_txd_next; +reg [CTRL_WIDTH-1:0] xgmii_txc_reg = {CTRL_WIDTH{1'b1}}, xgmii_txc_next; + +reg start_packet_reg = 1'b0, start_packet_next; +reg error_underflow_reg = 1'b0, error_underflow_next; + +assign s_axis_tready = s_axis_tready_reg; + +assign xgmii_txd = xgmii_txd_reg; +assign xgmii_txc = xgmii_txc_reg; + +assign m_axis_ptp_ts = PTP_TS_ENABLE ? m_axis_ptp_ts_reg : 0; +assign m_axis_ptp_ts_tag = PTP_TAG_ENABLE ? m_axis_ptp_ts_tag_reg : 0; +assign m_axis_ptp_ts_valid = PTP_TS_ENABLE || PTP_TAG_ENABLE ? m_axis_ptp_ts_valid_reg : 1'b0; + +assign start_packet = start_packet_reg; +assign error_underflow = error_underflow_reg; + +generate + genvar n; + + for (n = 0; n < 4; n = n + 1) begin : crc + lfsr #( + .LFSR_WIDTH(32), + .LFSR_POLY(32'h4c11db7), + .LFSR_CONFIG("GALOIS"), + .LFSR_FEED_FORWARD(0), + .REVERSE(1), + .DATA_WIDTH(8*(n+1)), + .STYLE("AUTO") + ) + eth_crc ( + .data_in(s_tdata_reg[0 +: 8*(n+1)]), + .state_in(crc_state_reg[3]), + .data_out(), + .state_out(crc_state_next[n]) + ); + end + +endgenerate + +function [1:0] keep2empty; + input [3:0] k; + casez (k) + 4'bzzz0: keep2empty = 2'd3; + 4'bzz01: keep2empty = 2'd3; + 4'bz011: keep2empty = 2'd2; + 4'b0111: keep2empty = 2'd1; + 4'b1111: keep2empty = 2'd0; + endcase +endfunction + +// Mask input data +integer j; + +always @* begin + for (j = 0; j < 4; j = j + 1) begin + s_axis_tdata_masked[j*8 +: 8] = s_axis_tkeep[j] ? s_axis_tdata[j*8 +: 8] : 8'd0; + end +end + +// FCS cycle calculation +always @* begin + casez (s_empty_reg) + 2'd3: begin + fcs_output_txd_0 = {~crc_state_next[0][23:0], s_tdata_reg[7:0]}; + fcs_output_txd_1 = {{2{XGMII_IDLE}}, XGMII_TERM, ~crc_state_reg[0][31:24]}; + fcs_output_txc_0 = 4'b0000; + fcs_output_txc_1 = 4'b1110; + ifg_offset = 8'd3; + extra_cycle = 1'b0; + end + 2'd2: begin + fcs_output_txd_0 = {~crc_state_next[1][15:0], s_tdata_reg[15:0]}; + fcs_output_txd_1 = {XGMII_IDLE, XGMII_TERM, ~crc_state_reg[1][31:16]}; + fcs_output_txc_0 = 4'b0000; + fcs_output_txc_1 = 4'b1100; + ifg_offset = 8'd2; + extra_cycle = 1'b0; + end + 2'd1: begin + fcs_output_txd_0 = {~crc_state_next[2][7:0], s_tdata_reg[23:0]}; + fcs_output_txd_1 = {XGMII_TERM, ~crc_state_reg[2][31:8]}; + fcs_output_txc_0 = 4'b0000; + fcs_output_txc_1 = 4'b1000; + ifg_offset = 8'd1; + extra_cycle = 1'b0; + end + 2'd0: begin + fcs_output_txd_0 = s_tdata_reg; + fcs_output_txd_1 = ~crc_state_reg[3]; + fcs_output_txc_0 = 4'b0000; + fcs_output_txc_1 = 4'b0000; + ifg_offset = 8'd4; + extra_cycle = 1'b1; + end + endcase +end + +always @* begin + state_next = STATE_IDLE; + + reset_crc = 1'b0; + update_crc = 1'b0; + + frame_next = frame_reg; + frame_error_next = frame_error_reg; + frame_min_count_next = frame_min_count_reg; + + ifg_count_next = ifg_count_reg; + deficit_idle_count_next = deficit_idle_count_reg; + + s_axis_tready_next = 1'b0; + + s_tdata_next = s_tdata_reg; + s_empty_next = s_empty_reg; + + m_axis_ptp_ts_next = m_axis_ptp_ts_reg; + m_axis_ptp_ts_tag_next = m_axis_ptp_ts_tag_reg; + m_axis_ptp_ts_valid_next = 1'b0; + + if (start_packet_reg && PTP_TS_ENABLE) begin + m_axis_ptp_ts_next = ptp_ts; + if (PTP_TS_CTRL_IN_TUSER) begin + m_axis_ptp_ts_tag_next = s_axis_tuser >> 2; + m_axis_ptp_ts_valid_next = s_axis_tuser[1]; + end else begin + m_axis_ptp_ts_tag_next = s_axis_tuser >> 1; + m_axis_ptp_ts_valid_next = 1'b1; + end + end + + // XGMII idle + xgmii_txd_next = {CTRL_WIDTH{XGMII_IDLE}}; + xgmii_txc_next = {CTRL_WIDTH{1'b1}}; + + start_packet_next = 1'b0; + error_underflow_next = 1'b0; + + if (s_axis_tvalid && s_axis_tready) begin + frame_next = !s_axis_tlast; + end + + case (state_reg) + STATE_IDLE: begin + // idle state - wait for data + frame_error_next = 1'b0; + frame_min_count_next = MIN_FRAME_LENGTH-4-CTRL_WIDTH; + reset_crc = 1'b1; + + // XGMII idle + xgmii_txd_next = {CTRL_WIDTH{XGMII_IDLE}}; + xgmii_txc_next = {CTRL_WIDTH{1'b1}}; + + s_tdata_next = s_axis_tdata_masked; + s_empty_next = keep2empty(s_axis_tkeep); + + if (s_axis_tvalid && cfg_tx_enable) begin + // XGMII start and preamble + xgmii_txd_next = {{3{ETH_PRE}}, XGMII_START}; + xgmii_txc_next = 4'b0001; + s_axis_tready_next = 1'b1; + state_next = STATE_PREAMBLE; + end else begin + ifg_count_next = 8'd0; + deficit_idle_count_next = 2'd0; + state_next = STATE_IDLE; + end + end + STATE_PREAMBLE: begin + // send preamble + reset_crc = 1'b1; + + s_tdata_next = s_axis_tdata_masked; + s_empty_next = keep2empty(s_axis_tkeep); + + xgmii_txd_next = {ETH_SFD, {3{ETH_PRE}}}; + xgmii_txc_next = {CTRL_WIDTH{1'b0}}; + + s_axis_tready_next = 1'b1; + start_packet_next = 1'b1; + state_next = STATE_PAYLOAD; + end + STATE_PAYLOAD: begin + // transfer payload + update_crc = 1'b1; + s_axis_tready_next = 1'b1; + + if (frame_min_count_reg > CTRL_WIDTH) begin + frame_min_count_next = frame_min_count_reg - CTRL_WIDTH; + end else begin + frame_min_count_next = 0; + end + + xgmii_txd_next = s_tdata_reg; + xgmii_txc_next = {CTRL_WIDTH{1'b0}}; + + s_tdata_next = s_axis_tdata_masked; + s_empty_next = keep2empty(s_axis_tkeep); + + if (!s_axis_tvalid || s_axis_tlast) begin + s_axis_tready_next = frame_next; // drop frame + frame_error_next = !s_axis_tvalid || s_axis_tuser[0]; + error_underflow_next = !s_axis_tvalid; + + if (ENABLE_PADDING && frame_min_count_reg) begin + if (frame_min_count_reg > CTRL_WIDTH) begin + s_empty_next = 0; + state_next = STATE_PAD; + end else begin + if (keep2empty(s_axis_tkeep) > CTRL_WIDTH-frame_min_count_reg) begin + s_empty_next = CTRL_WIDTH-frame_min_count_reg; + end + state_next = STATE_FCS_1; + end + end else begin + state_next = STATE_FCS_1; + end + end else begin + state_next = STATE_PAYLOAD; + end + end + STATE_PAD: begin + // pad frame to MIN_FRAME_LENGTH + s_axis_tready_next = frame_next; // drop frame + + xgmii_txd_next = s_tdata_reg; + xgmii_txc_next = {CTRL_WIDTH{1'b0}}; + + s_tdata_next = 32'd0; + s_empty_next = 0; + + update_crc = 1'b1; + + if (frame_min_count_reg > CTRL_WIDTH) begin + frame_min_count_next = frame_min_count_reg - CTRL_WIDTH; + state_next = STATE_PAD; + end else begin + frame_min_count_next = 0; + s_empty_next = CTRL_WIDTH-frame_min_count_reg; + state_next = STATE_FCS_1; + end + end + STATE_FCS_1: begin + // last cycle + s_axis_tready_next = frame_next; // drop frame + + xgmii_txd_next = fcs_output_txd_0; + xgmii_txc_next = fcs_output_txc_0; + + update_crc = 1'b1; + + ifg_count_next = (cfg_ifg > 8'd12 ? cfg_ifg : 8'd12) - ifg_offset + deficit_idle_count_reg; + if (frame_error_reg) begin + state_next = STATE_ERR; + end else begin + state_next = STATE_FCS_2; + end + end + STATE_FCS_2: begin + // last cycle + s_axis_tready_next = frame_next; // drop frame + + xgmii_txd_next = fcs_output_txd_1; + xgmii_txc_next = fcs_output_txc_1; + + if (extra_cycle) begin + state_next = STATE_FCS_3; + end else begin + state_next = STATE_IFG; + end + end + STATE_FCS_3: begin + // last cycle + s_axis_tready_next = frame_next; // drop frame + + xgmii_txd_next = {{3{XGMII_IDLE}}, XGMII_TERM}; + xgmii_txc_next = {CTRL_WIDTH{1'b1}}; + + if (ENABLE_DIC) begin + if (ifg_count_next > 8'd3) begin + state_next = STATE_IFG; + end else begin + deficit_idle_count_next = ifg_count_next; + ifg_count_next = 8'd0; + s_axis_tready_next = 1'b1; + state_next = STATE_IDLE; + end + end else begin + if (ifg_count_next > 8'd0) begin + state_next = STATE_IFG; + end else begin + state_next = STATE_IDLE; + end + end + end + STATE_ERR: begin + // terminate packet with error + s_axis_tready_next = frame_next; // drop frame + + // XGMII error + xgmii_txd_next = {XGMII_TERM, {3{XGMII_ERROR}}}; + xgmii_txc_next = {CTRL_WIDTH{1'b1}}; + + ifg_count_next = 8'd12; + + state_next = STATE_IFG; + end + STATE_IFG: begin + // send IFG + s_axis_tready_next = frame_next; // drop frame + + // XGMII idle + xgmii_txd_next = {CTRL_WIDTH{XGMII_IDLE}}; + xgmii_txc_next = {CTRL_WIDTH{1'b1}}; + + if (ifg_count_reg > 8'd4) begin + ifg_count_next = ifg_count_reg - 8'd4; + end else begin + ifg_count_next = 8'd0; + end + + if (ENABLE_DIC) begin + if (ifg_count_next > 8'd3 || frame_reg) begin + state_next = STATE_IFG; + end else begin + deficit_idle_count_next = ifg_count_next; + ifg_count_next = 8'd0; + state_next = STATE_IDLE; + end + end else begin + if (ifg_count_next > 8'd0 || frame_reg) begin + state_next = STATE_IFG; + end else begin + state_next = STATE_IDLE; + end + end + end + endcase +end + +always @(posedge clk) begin + state_reg <= state_next; + + frame_reg <= frame_next; + frame_error_reg <= frame_error_next; + frame_min_count_reg <= frame_min_count_next; + + ifg_count_reg <= ifg_count_next; + deficit_idle_count_reg <= deficit_idle_count_next; + + s_tdata_reg <= s_tdata_next; + s_empty_reg <= s_empty_next; + + s_axis_tready_reg <= s_axis_tready_next; + + m_axis_ptp_ts_reg <= m_axis_ptp_ts_next; + m_axis_ptp_ts_tag_reg <= m_axis_ptp_ts_tag_next; + m_axis_ptp_ts_valid_reg <= m_axis_ptp_ts_valid_next; + + crc_state_reg[0] <= crc_state_next[0]; + crc_state_reg[1] <= crc_state_next[1]; + crc_state_reg[2] <= crc_state_next[2]; + + if (update_crc) begin + crc_state_reg[3] <= crc_state_next[3]; + end + + if (reset_crc) begin + crc_state_reg[3] <= 32'hFFFFFFFF; + end + + xgmii_txd_reg <= xgmii_txd_next; + xgmii_txc_reg <= xgmii_txc_next; + + start_packet_reg <= start_packet_next; + error_underflow_reg <= error_underflow_next; + + if (rst) begin + state_reg <= STATE_IDLE; + + frame_reg <= 1'b0; + + ifg_count_reg <= 8'd0; + deficit_idle_count_reg <= 2'd0; + + s_axis_tready_reg <= 1'b0; + + m_axis_ptp_ts_valid_reg <= 1'b0; + + xgmii_txd_reg <= {CTRL_WIDTH{XGMII_IDLE}}; + xgmii_txc_reg <= {CTRL_WIDTH{1'b1}}; + + start_packet_reg <= 1'b0; + error_underflow_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_tx_64.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_tx_64.v new file mode 100755 index 0000000..269e2fa --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/axis_xgmii_tx_64.v @@ -0,0 +1,656 @@ +/* + +Copyright (c) 2015-2017 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4-Stream XGMII frame transmitter (AXI in, XGMII out) + */ +module axis_xgmii_tx_64 # +( + parameter DATA_WIDTH = 64, + parameter KEEP_WIDTH = (DATA_WIDTH/8), + parameter CTRL_WIDTH = (DATA_WIDTH/8), + parameter ENABLE_PADDING = 1, + parameter ENABLE_DIC = 1, + parameter MIN_FRAME_LENGTH = 64, + parameter PTP_TS_ENABLE = 0, + parameter PTP_TS_FMT_TOD = 1, + parameter PTP_TS_WIDTH = PTP_TS_FMT_TOD ? 96 : 64, + parameter PTP_TS_CTRL_IN_TUSER = 0, + parameter PTP_TAG_ENABLE = PTP_TS_ENABLE, + parameter PTP_TAG_WIDTH = 16, + parameter USER_WIDTH = (PTP_TS_ENABLE ? (PTP_TAG_ENABLE ? PTP_TAG_WIDTH : 0) + (PTP_TS_CTRL_IN_TUSER ? 1 : 0) : 0) + 1 +) +( + input wire clk, + input wire rst, + + /* + * AXI input + */ + input wire [DATA_WIDTH-1:0] s_axis_tdata, + input wire [KEEP_WIDTH-1:0] s_axis_tkeep, + input wire s_axis_tvalid, + output wire s_axis_tready, + input wire s_axis_tlast, + input wire [USER_WIDTH-1:0] s_axis_tuser, + + /* + * XGMII output + */ + output wire [DATA_WIDTH-1:0] xgmii_txd, + output wire [CTRL_WIDTH-1:0] xgmii_txc, + + /* + * PTP + */ + input wire [PTP_TS_WIDTH-1:0] ptp_ts, + output wire [PTP_TS_WIDTH-1:0] m_axis_ptp_ts, + output wire [PTP_TAG_WIDTH-1:0] m_axis_ptp_ts_tag, + output wire m_axis_ptp_ts_valid, + + /* + * Configuration + */ + input wire [7:0] cfg_ifg, + input wire cfg_tx_enable, + + /* + * Status + */ + output wire [1:0] start_packet, + output wire error_underflow +); + +parameter EMPTY_WIDTH = $clog2(KEEP_WIDTH); +parameter MIN_LEN_WIDTH = $clog2(MIN_FRAME_LENGTH-4-CTRL_WIDTH+1); + +// bus width assertions +initial begin + if (DATA_WIDTH != 64) begin + $error("Error: Interface width must be 64"); + $finish; + end + + if (KEEP_WIDTH * 8 != DATA_WIDTH || CTRL_WIDTH * 8 != DATA_WIDTH) begin + $error("Error: Interface requires byte (8-bit) granularity"); + $finish; + end +end + +localparam [7:0] + ETH_PRE = 8'h55, + ETH_SFD = 8'hD5; + +localparam [7:0] + XGMII_IDLE = 8'h07, + XGMII_START = 8'hfb, + XGMII_TERM = 8'hfd, + XGMII_ERROR = 8'hfe; + +localparam [2:0] + STATE_IDLE = 3'd0, + STATE_PAYLOAD = 3'd1, + STATE_PAD = 3'd2, + STATE_FCS_1 = 3'd3, + STATE_FCS_2 = 3'd4, + STATE_ERR = 3'd5, + STATE_IFG = 3'd6; + +reg [2:0] state_reg = STATE_IDLE, state_next; + +// datapath control signals +reg reset_crc; +reg update_crc; + +reg swap_lanes_reg = 1'b0, swap_lanes_next; +reg [31:0] swap_txd = 32'd0; +reg [3:0] swap_txc = 4'd0; + +reg [DATA_WIDTH-1:0] s_axis_tdata_masked; + +reg [DATA_WIDTH-1:0] s_tdata_reg = 0, s_tdata_next; +reg [EMPTY_WIDTH-1:0] s_empty_reg = 0, s_empty_next; + +reg [DATA_WIDTH-1:0] fcs_output_txd_0; +reg [DATA_WIDTH-1:0] fcs_output_txd_1; +reg [CTRL_WIDTH-1:0] fcs_output_txc_0; +reg [CTRL_WIDTH-1:0] fcs_output_txc_1; + +reg [7:0] ifg_offset; + +reg frame_start_reg = 1'b0, frame_start_next; +reg frame_reg = 1'b0, frame_next; +reg frame_error_reg = 1'b0, frame_error_next; +reg [MIN_LEN_WIDTH-1:0] frame_min_count_reg = 0, frame_min_count_next; + +reg [7:0] ifg_count_reg = 8'd0, ifg_count_next; +reg [1:0] deficit_idle_count_reg = 2'd0, deficit_idle_count_next; + +reg s_axis_tready_reg = 1'b0, s_axis_tready_next; + +reg [PTP_TS_WIDTH-1:0] m_axis_ptp_ts_reg = 0; +reg [PTP_TS_WIDTH-1:0] m_axis_ptp_ts_adj_reg = 0; +reg [PTP_TAG_WIDTH-1:0] m_axis_ptp_ts_tag_reg = 0; +reg m_axis_ptp_ts_valid_reg = 1'b0; +reg m_axis_ptp_ts_valid_int_reg = 1'b0; +reg m_axis_ptp_ts_borrow_reg = 1'b0; + +reg [31:0] crc_state_reg[7:0]; +wire [31:0] crc_state_next[7:0]; + +reg [4+16-1:0] last_ts_reg = 0; +reg [4+16-1:0] ts_inc_reg = 0; + +reg [DATA_WIDTH-1:0] xgmii_txd_reg = {CTRL_WIDTH{XGMII_IDLE}}, xgmii_txd_next; +reg [CTRL_WIDTH-1:0] xgmii_txc_reg = {CTRL_WIDTH{1'b1}}, xgmii_txc_next; + +reg start_packet_reg = 2'b00; +reg error_underflow_reg = 1'b0, error_underflow_next; + +assign s_axis_tready = s_axis_tready_reg; + +assign xgmii_txd = xgmii_txd_reg; +assign xgmii_txc = xgmii_txc_reg; + +assign m_axis_ptp_ts = PTP_TS_ENABLE ? ((!PTP_TS_FMT_TOD || m_axis_ptp_ts_borrow_reg) ? m_axis_ptp_ts_reg : m_axis_ptp_ts_adj_reg) : 0; +assign m_axis_ptp_ts_tag = PTP_TAG_ENABLE ? m_axis_ptp_ts_tag_reg : 0; +assign m_axis_ptp_ts_valid = PTP_TS_ENABLE || PTP_TAG_ENABLE ? m_axis_ptp_ts_valid_reg : 1'b0; + +assign start_packet = start_packet_reg; +assign error_underflow = error_underflow_reg; + +generate + genvar n; + + for (n = 0; n < 8; n = n + 1) begin : crc + lfsr #( + .LFSR_WIDTH(32), + .LFSR_POLY(32'h4c11db7), + .LFSR_CONFIG("GALOIS"), + .LFSR_FEED_FORWARD(0), + .REVERSE(1), + .DATA_WIDTH(8*(n+1)), + .STYLE("AUTO") + ) + eth_crc ( + .data_in(s_tdata_reg[0 +: 8*(n+1)]), + .state_in(crc_state_reg[7]), + .data_out(), + .state_out(crc_state_next[n]) + ); + end + +endgenerate + +function [2:0] keep2empty; + input [7:0] k; + casez (k) + 8'bzzzzzzz0: keep2empty = 3'd7; + 8'bzzzzzz01: keep2empty = 3'd7; + 8'bzzzzz011: keep2empty = 3'd6; + 8'bzzzz0111: keep2empty = 3'd5; + 8'bzzz01111: keep2empty = 3'd4; + 8'bzz011111: keep2empty = 3'd3; + 8'bz0111111: keep2empty = 3'd2; + 8'b01111111: keep2empty = 3'd1; + 8'b11111111: keep2empty = 3'd0; + endcase +endfunction + +// Mask input data +integer j; + +always @* begin + for (j = 0; j < 8; j = j + 1) begin + s_axis_tdata_masked[j*8 +: 8] = s_axis_tkeep[j] ? s_axis_tdata[j*8 +: 8] : 8'd0; + end +end + +// FCS cycle calculation +always @* begin + casez (s_empty_reg) + 3'd7: begin + fcs_output_txd_0 = {{2{XGMII_IDLE}}, XGMII_TERM, ~crc_state_next[0][31:0], s_tdata_reg[7:0]}; + fcs_output_txd_1 = {8{XGMII_IDLE}}; + fcs_output_txc_0 = 8'b11100000; + fcs_output_txc_1 = 8'b11111111; + ifg_offset = 8'd3; + end + 3'd6: begin + fcs_output_txd_0 = {XGMII_IDLE, XGMII_TERM, ~crc_state_next[1][31:0], s_tdata_reg[15:0]}; + fcs_output_txd_1 = {8{XGMII_IDLE}}; + fcs_output_txc_0 = 8'b11000000; + fcs_output_txc_1 = 8'b11111111; + ifg_offset = 8'd2; + end + 3'd5: begin + fcs_output_txd_0 = {XGMII_TERM, ~crc_state_next[2][31:0], s_tdata_reg[23:0]}; + fcs_output_txd_1 = {8{XGMII_IDLE}}; + fcs_output_txc_0 = 8'b10000000; + fcs_output_txc_1 = 8'b11111111; + ifg_offset = 8'd1; + end + 3'd4: begin + fcs_output_txd_0 = {~crc_state_next[3][31:0], s_tdata_reg[31:0]}; + fcs_output_txd_1 = {{7{XGMII_IDLE}}, XGMII_TERM}; + fcs_output_txc_0 = 8'b00000000; + fcs_output_txc_1 = 8'b11111111; + ifg_offset = 8'd8; + end + 3'd3: begin + fcs_output_txd_0 = {~crc_state_next[4][23:0], s_tdata_reg[39:0]}; + fcs_output_txd_1 = {{6{XGMII_IDLE}}, XGMII_TERM, ~crc_state_reg[4][31:24]}; + fcs_output_txc_0 = 8'b00000000; + fcs_output_txc_1 = 8'b11111110; + ifg_offset = 8'd7; + end + 3'd2: begin + fcs_output_txd_0 = {~crc_state_next[5][15:0], s_tdata_reg[47:0]}; + fcs_output_txd_1 = {{5{XGMII_IDLE}}, XGMII_TERM, ~crc_state_reg[5][31:16]}; + fcs_output_txc_0 = 8'b00000000; + fcs_output_txc_1 = 8'b11111100; + ifg_offset = 8'd6; + end + 3'd1: begin + fcs_output_txd_0 = {~crc_state_next[6][7:0], s_tdata_reg[55:0]}; + fcs_output_txd_1 = {{4{XGMII_IDLE}}, XGMII_TERM, ~crc_state_reg[6][31:8]}; + fcs_output_txc_0 = 8'b00000000; + fcs_output_txc_1 = 8'b11111000; + ifg_offset = 8'd5; + end + 3'd0: begin + fcs_output_txd_0 = s_tdata_reg; + fcs_output_txd_1 = {{3{XGMII_IDLE}}, XGMII_TERM, ~crc_state_reg[7][31:0]}; + fcs_output_txc_0 = 8'b00000000; + fcs_output_txc_1 = 8'b11110000; + ifg_offset = 8'd4; + end + endcase +end + +always @* begin + state_next = STATE_IDLE; + + reset_crc = 1'b0; + update_crc = 1'b0; + + swap_lanes_next = swap_lanes_reg; + + frame_start_next = 1'b0; + frame_next = frame_reg; + frame_error_next = frame_error_reg; + frame_min_count_next = frame_min_count_reg; + + ifg_count_next = ifg_count_reg; + deficit_idle_count_next = deficit_idle_count_reg; + + s_axis_tready_next = 1'b0; + + s_tdata_next = s_tdata_reg; + s_empty_next = s_empty_reg; + + // XGMII idle + xgmii_txd_next = {CTRL_WIDTH{XGMII_IDLE}}; + xgmii_txc_next = {CTRL_WIDTH{1'b1}}; + + error_underflow_next = 1'b0; + + if (s_axis_tvalid && s_axis_tready) begin + frame_next = !s_axis_tlast; + end + + case (state_reg) + STATE_IDLE: begin + // idle state - wait for data + frame_error_next = 1'b0; + frame_min_count_next = MIN_FRAME_LENGTH-4-CTRL_WIDTH; + reset_crc = 1'b1; + s_axis_tready_next = cfg_tx_enable; + + // XGMII idle + xgmii_txd_next = {CTRL_WIDTH{XGMII_IDLE}}; + xgmii_txc_next = {CTRL_WIDTH{1'b1}}; + + s_tdata_next = s_axis_tdata_masked; + s_empty_next = keep2empty(s_axis_tkeep); + + if (s_axis_tvalid && s_axis_tready) begin + // XGMII start, preamble, and SFD + xgmii_txd_next = {ETH_SFD, {6{ETH_PRE}}, XGMII_START}; + xgmii_txc_next = 8'b00000001; + frame_start_next = 1'b1; + s_axis_tready_next = 1'b1; + state_next = STATE_PAYLOAD; + end else begin + swap_lanes_next = 1'b0; + ifg_count_next = 8'd0; + deficit_idle_count_next = 2'd0; + state_next = STATE_IDLE; + end + end + STATE_PAYLOAD: begin + // transfer payload + update_crc = 1'b1; + s_axis_tready_next = 1'b1; + + if (frame_min_count_reg > CTRL_WIDTH) begin + frame_min_count_next = frame_min_count_reg - CTRL_WIDTH; + end else begin + frame_min_count_next = 0; + end + + xgmii_txd_next = s_tdata_reg; + xgmii_txc_next = {CTRL_WIDTH{1'b0}}; + + s_tdata_next = s_axis_tdata_masked; + s_empty_next = keep2empty(s_axis_tkeep); + + if (!s_axis_tvalid || s_axis_tlast) begin + s_axis_tready_next = frame_next; // drop frame + frame_error_next = !s_axis_tvalid || s_axis_tuser[0]; + error_underflow_next = !s_axis_tvalid; + + if (ENABLE_PADDING && frame_min_count_reg) begin + if (frame_min_count_reg > CTRL_WIDTH) begin + s_empty_next = 0; + state_next = STATE_PAD; + end else begin + if (keep2empty(s_axis_tkeep) > CTRL_WIDTH-frame_min_count_reg) begin + s_empty_next = CTRL_WIDTH-frame_min_count_reg; + end + if (frame_error_next) begin + state_next = STATE_ERR; + end else begin + state_next = STATE_FCS_1; + end + end + end else begin + if (frame_error_next) begin + state_next = STATE_ERR; + end else begin + state_next = STATE_FCS_1; + end + end + end else begin + state_next = STATE_PAYLOAD; + end + end + STATE_PAD: begin + // pad frame to MIN_FRAME_LENGTH + s_axis_tready_next = frame_next; // drop frame + + xgmii_txd_next = s_tdata_reg; + xgmii_txc_next = {CTRL_WIDTH{1'b0}}; + + s_tdata_next = 64'd0; + s_empty_next = 0; + + update_crc = 1'b1; + + if (frame_min_count_reg > CTRL_WIDTH) begin + frame_min_count_next = frame_min_count_reg - CTRL_WIDTH; + state_next = STATE_PAD; + end else begin + frame_min_count_next = 0; + s_empty_next = CTRL_WIDTH-frame_min_count_reg; + if (frame_error_reg) begin + state_next = STATE_ERR; + end else begin + state_next = STATE_FCS_1; + end + end + end + STATE_FCS_1: begin + // last cycle + s_axis_tready_next = frame_next; // drop frame + + xgmii_txd_next = fcs_output_txd_0; + xgmii_txc_next = fcs_output_txc_0; + + update_crc = 1'b1; + + ifg_count_next = (cfg_ifg > 8'd12 ? cfg_ifg : 8'd12) - ifg_offset + (swap_lanes_reg ? 8'd4 : 8'd0) + deficit_idle_count_reg; + if (s_empty_reg <= 4) begin + state_next = STATE_FCS_2; + end else begin + state_next = STATE_IFG; + end + end + STATE_FCS_2: begin + // last cycle + s_axis_tready_next = frame_next; // drop frame + + xgmii_txd_next = fcs_output_txd_1; + xgmii_txc_next = fcs_output_txc_1; + + if (ENABLE_DIC) begin + if (ifg_count_next > 8'd7) begin + state_next = STATE_IFG; + end else begin + if (ifg_count_next >= 8'd4) begin + deficit_idle_count_next = ifg_count_next - 8'd4; + swap_lanes_next = 1'b1; + end else begin + deficit_idle_count_next = ifg_count_next; + ifg_count_next = 8'd0; + swap_lanes_next = 1'b0; + end + s_axis_tready_next = cfg_tx_enable; + state_next = STATE_IDLE; + end + end else begin + if (ifg_count_next > 8'd4) begin + state_next = STATE_IFG; + end else begin + s_axis_tready_next = cfg_tx_enable; + swap_lanes_next = ifg_count_next != 0; + state_next = STATE_IDLE; + end + end + end + STATE_ERR: begin + // terminate packet with error + s_axis_tready_next = frame_next; // drop frame + + // XGMII error + xgmii_txd_next = {XGMII_TERM, {7{XGMII_ERROR}}}; + xgmii_txc_next = {CTRL_WIDTH{1'b1}}; + + ifg_count_next = 8'd12; + + state_next = STATE_IFG; + end + STATE_IFG: begin + // send IFG + s_axis_tready_next = frame_next; // drop frame + + // XGMII idle + xgmii_txd_next = {CTRL_WIDTH{XGMII_IDLE}}; + xgmii_txc_next = {CTRL_WIDTH{1'b1}}; + + if (ifg_count_reg > 8'd8) begin + ifg_count_next = ifg_count_reg - 8'd8; + end else begin + ifg_count_next = 8'd0; + end + + if (ENABLE_DIC) begin + if (ifg_count_next > 8'd7 || frame_reg) begin + state_next = STATE_IFG; + end else begin + if (ifg_count_next >= 8'd4) begin + deficit_idle_count_next = ifg_count_next - 8'd4; + swap_lanes_next = 1'b1; + end else begin + deficit_idle_count_next = ifg_count_next; + ifg_count_next = 8'd0; + swap_lanes_next = 1'b0; + end + s_axis_tready_next = cfg_tx_enable; + state_next = STATE_IDLE; + end + end else begin + if (ifg_count_next > 8'd4 || frame_reg) begin + state_next = STATE_IFG; + end else begin + s_axis_tready_next = cfg_tx_enable; + swap_lanes_next = ifg_count_next != 0; + state_next = STATE_IDLE; + end + end + end + endcase +end + +always @(posedge clk) begin + state_reg <= state_next; + + swap_lanes_reg <= swap_lanes_next; + + frame_start_reg <= frame_start_next; + frame_reg <= frame_next; + frame_error_reg <= frame_error_next; + frame_min_count_reg <= frame_min_count_next; + + ifg_count_reg <= ifg_count_next; + deficit_idle_count_reg <= deficit_idle_count_next; + + s_tdata_reg <= s_tdata_next; + s_empty_reg <= s_empty_next; + + s_axis_tready_reg <= s_axis_tready_next; + + m_axis_ptp_ts_valid_reg <= 1'b0; + m_axis_ptp_ts_valid_int_reg <= 1'b0; + + start_packet_reg <= 2'b00; + error_underflow_reg <= error_underflow_next; + + if (PTP_TS_ENABLE && PTP_TS_FMT_TOD) begin + m_axis_ptp_ts_valid_reg <= m_axis_ptp_ts_valid_int_reg; + m_axis_ptp_ts_adj_reg[15:0] <= m_axis_ptp_ts_reg[15:0]; + {m_axis_ptp_ts_borrow_reg, m_axis_ptp_ts_adj_reg[45:16]} <= $signed({1'b0, m_axis_ptp_ts_reg[45:16]}) - $signed(31'd1000000000); + m_axis_ptp_ts_adj_reg[47:46] <= 0; + m_axis_ptp_ts_adj_reg[95:48] <= m_axis_ptp_ts_reg[95:48] + 1; + end + + if (frame_start_reg) begin + if (swap_lanes_reg) begin + if (PTP_TS_ENABLE) begin + if (PTP_TS_FMT_TOD) begin + m_axis_ptp_ts_reg[45:0] <= ptp_ts[45:0] + (ts_inc_reg >> 1); + m_axis_ptp_ts_reg[95:48] <= ptp_ts[95:48]; + end else begin + m_axis_ptp_ts_reg <= ptp_ts + (ts_inc_reg >> 1); + end + end + start_packet_reg <= 2'b10; + end else begin + if (PTP_TS_ENABLE) begin + m_axis_ptp_ts_reg <= ptp_ts; + end + start_packet_reg <= 2'b01; + end + if (PTP_TS_ENABLE) begin + if (PTP_TS_CTRL_IN_TUSER) begin + m_axis_ptp_ts_tag_reg <= s_axis_tuser >> 2; + if (PTP_TS_FMT_TOD) begin + m_axis_ptp_ts_valid_int_reg <= s_axis_tuser[1]; + end else begin + m_axis_ptp_ts_valid_reg <= s_axis_tuser[1]; + end + end else begin + m_axis_ptp_ts_tag_reg <= s_axis_tuser >> 1; + if (PTP_TS_FMT_TOD) begin + m_axis_ptp_ts_valid_int_reg <= 1'b1; + end else begin + m_axis_ptp_ts_valid_reg <= 1'b1; + end + end + end + end + + crc_state_reg[0] <= crc_state_next[0]; + crc_state_reg[1] <= crc_state_next[1]; + crc_state_reg[2] <= crc_state_next[2]; + crc_state_reg[3] <= crc_state_next[3]; + crc_state_reg[4] <= crc_state_next[4]; + crc_state_reg[5] <= crc_state_next[5]; + crc_state_reg[6] <= crc_state_next[6]; + + if (update_crc) begin + crc_state_reg[7] <= crc_state_next[7]; + end + + if (reset_crc) begin + crc_state_reg[7] <= 32'hFFFFFFFF; + end + + swap_txd <= xgmii_txd_next[63:32]; + swap_txc <= xgmii_txc_next[7:4]; + + if (swap_lanes_reg) begin + xgmii_txd_reg <= {xgmii_txd_next[31:0], swap_txd}; + xgmii_txc_reg <= {xgmii_txc_next[3:0], swap_txc}; + end else begin + xgmii_txd_reg <= xgmii_txd_next; + xgmii_txc_reg <= xgmii_txc_next; + end + + last_ts_reg <= ptp_ts; + ts_inc_reg <= ptp_ts - last_ts_reg; + + if (rst) begin + state_reg <= STATE_IDLE; + + frame_start_reg <= 1'b0; + frame_reg <= 1'b0; + + swap_lanes_reg <= 1'b0; + + ifg_count_reg <= 8'd0; + deficit_idle_count_reg <= 2'd0; + + s_axis_tready_reg <= 1'b0; + + m_axis_ptp_ts_valid_reg <= 1'b0; + m_axis_ptp_ts_valid_int_reg <= 1'b0; + + xgmii_txd_reg <= {CTRL_WIDTH{XGMII_IDLE}}; + xgmii_txc_reg <= {CTRL_WIDTH{1'b1}}; + + start_packet_reg <= 2'b00; + error_underflow_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_arb_mux.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_arb_mux.v new file mode 100755 index 0000000..7c60422 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_arb_mux.v @@ -0,0 +1,315 @@ +/* + +Copyright (c) 2014-2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * Ethernet arbitrated multiplexer + */ +module eth_arb_mux # +( + parameter S_COUNT = 4, + parameter DATA_WIDTH = 8, + parameter KEEP_ENABLE = (DATA_WIDTH>8), + parameter KEEP_WIDTH = (DATA_WIDTH/8), + parameter ID_ENABLE = 0, + parameter ID_WIDTH = 8, + parameter DEST_ENABLE = 0, + parameter DEST_WIDTH = 8, + parameter USER_ENABLE = 1, + parameter USER_WIDTH = 1, + // select round robin arbitration + parameter ARB_TYPE_ROUND_ROBIN = 0, + // LSB priority selection + parameter ARB_LSB_HIGH_PRIORITY = 1 +) +( + input wire clk, + input wire rst, + + /* + * Ethernet frame inputs + */ + input wire [S_COUNT-1:0] s_eth_hdr_valid, + output wire [S_COUNT-1:0] s_eth_hdr_ready, + input wire [S_COUNT*48-1:0] s_eth_dest_mac, + input wire [S_COUNT*48-1:0] s_eth_src_mac, + input wire [S_COUNT*16-1:0] s_eth_type, + input wire [S_COUNT*DATA_WIDTH-1:0] s_eth_payload_axis_tdata, + input wire [S_COUNT*KEEP_WIDTH-1:0] s_eth_payload_axis_tkeep, + input wire [S_COUNT-1:0] s_eth_payload_axis_tvalid, + output wire [S_COUNT-1:0] s_eth_payload_axis_tready, + input wire [S_COUNT-1:0] s_eth_payload_axis_tlast, + input wire [S_COUNT*ID_WIDTH-1:0] s_eth_payload_axis_tid, + input wire [S_COUNT*DEST_WIDTH-1:0] s_eth_payload_axis_tdest, + input wire [S_COUNT*USER_WIDTH-1:0] s_eth_payload_axis_tuser, + + /* + * Ethernet frame output + */ + output wire m_eth_hdr_valid, + input wire m_eth_hdr_ready, + output wire [47:0] m_eth_dest_mac, + output wire [47:0] m_eth_src_mac, + output wire [15:0] m_eth_type, + output wire [DATA_WIDTH-1:0] m_eth_payload_axis_tdata, + output wire [KEEP_WIDTH-1:0] m_eth_payload_axis_tkeep, + output wire m_eth_payload_axis_tvalid, + input wire m_eth_payload_axis_tready, + output wire m_eth_payload_axis_tlast, + output wire [ID_WIDTH-1:0] m_eth_payload_axis_tid, + output wire [DEST_WIDTH-1:0] m_eth_payload_axis_tdest, + output wire [USER_WIDTH-1:0] m_eth_payload_axis_tuser +); + +parameter CL_S_COUNT = $clog2(S_COUNT); + +reg frame_reg = 1'b0, frame_next; + +reg [S_COUNT-1:0] s_eth_hdr_ready_reg = {S_COUNT{1'b0}}, s_eth_hdr_ready_next; + +reg m_eth_hdr_valid_reg = 1'b0, m_eth_hdr_valid_next; +reg [47:0] m_eth_dest_mac_reg = 48'd0, m_eth_dest_mac_next; +reg [47:0] m_eth_src_mac_reg = 48'd0, m_eth_src_mac_next; +reg [15:0] m_eth_type_reg = 16'd0, m_eth_type_next; + +wire [S_COUNT-1:0] request; +wire [S_COUNT-1:0] acknowledge; +wire [S_COUNT-1:0] grant; +wire grant_valid; +wire [CL_S_COUNT-1:0] grant_encoded; + +// internal datapath +reg [DATA_WIDTH-1:0] m_eth_payload_axis_tdata_int; +reg [KEEP_WIDTH-1:0] m_eth_payload_axis_tkeep_int; +reg m_eth_payload_axis_tvalid_int; +reg m_eth_payload_axis_tready_int_reg = 1'b0; +reg m_eth_payload_axis_tlast_int; +reg [ID_WIDTH-1:0] m_eth_payload_axis_tid_int; +reg [DEST_WIDTH-1:0] m_eth_payload_axis_tdest_int; +reg [USER_WIDTH-1:0] m_eth_payload_axis_tuser_int; +wire m_eth_payload_axis_tready_int_early; + +assign s_eth_hdr_ready = s_eth_hdr_ready_reg; + +assign s_eth_payload_axis_tready = (m_eth_payload_axis_tready_int_reg && grant_valid) << grant_encoded; + +assign m_eth_hdr_valid = m_eth_hdr_valid_reg; +assign m_eth_dest_mac = m_eth_dest_mac_reg; +assign m_eth_src_mac = m_eth_src_mac_reg; +assign m_eth_type = m_eth_type_reg; + +// mux for incoming packet +wire [DATA_WIDTH-1:0] current_s_tdata = s_eth_payload_axis_tdata[grant_encoded*DATA_WIDTH +: DATA_WIDTH]; +wire [KEEP_WIDTH-1:0] current_s_tkeep = s_eth_payload_axis_tkeep[grant_encoded*KEEP_WIDTH +: KEEP_WIDTH]; +wire current_s_tvalid = s_eth_payload_axis_tvalid[grant_encoded]; +wire current_s_tready = s_eth_payload_axis_tready[grant_encoded]; +wire current_s_tlast = s_eth_payload_axis_tlast[grant_encoded]; +wire [ID_WIDTH-1:0] current_s_tid = s_eth_payload_axis_tid[grant_encoded*ID_WIDTH +: ID_WIDTH]; +wire [DEST_WIDTH-1:0] current_s_tdest = s_eth_payload_axis_tdest[grant_encoded*DEST_WIDTH +: DEST_WIDTH]; +wire [USER_WIDTH-1:0] current_s_tuser = s_eth_payload_axis_tuser[grant_encoded*USER_WIDTH +: USER_WIDTH]; + +// arbiter instance +arbiter #( + .PORTS(S_COUNT), + .ARB_TYPE_ROUND_ROBIN(ARB_TYPE_ROUND_ROBIN), + .ARB_BLOCK(1), + .ARB_BLOCK_ACK(1), + .ARB_LSB_HIGH_PRIORITY(ARB_LSB_HIGH_PRIORITY) +) +arb_inst ( + .clk(clk), + .rst(rst), + .request(request), + .acknowledge(acknowledge), + .grant(grant), + .grant_valid(grant_valid), + .grant_encoded(grant_encoded) +); + +assign request = s_eth_hdr_valid & ~grant; +assign acknowledge = grant & s_eth_payload_axis_tvalid & s_eth_payload_axis_tready & s_eth_payload_axis_tlast; + +always @* begin + frame_next = frame_reg; + + s_eth_hdr_ready_next = {S_COUNT{1'b0}}; + + m_eth_hdr_valid_next = m_eth_hdr_valid_reg && !m_eth_hdr_ready; + m_eth_dest_mac_next = m_eth_dest_mac_reg; + m_eth_src_mac_next = m_eth_src_mac_reg; + m_eth_type_next = m_eth_type_reg; + + if (s_eth_payload_axis_tvalid[grant_encoded] && s_eth_payload_axis_tready[grant_encoded]) begin + // end of frame detection + if (s_eth_payload_axis_tlast[grant_encoded]) begin + frame_next = 1'b0; + end + end + + if (!frame_reg && grant_valid && (m_eth_hdr_ready || !m_eth_hdr_valid)) begin + // start of frame + frame_next = 1'b1; + + s_eth_hdr_ready_next = grant; + + m_eth_hdr_valid_next = 1'b1; + m_eth_dest_mac_next = s_eth_dest_mac[grant_encoded*48 +: 48]; + m_eth_src_mac_next = s_eth_src_mac[grant_encoded*48 +: 48]; + m_eth_type_next = s_eth_type[grant_encoded*16 +: 16]; + end + + // pass through selected packet data + m_eth_payload_axis_tdata_int = current_s_tdata; + m_eth_payload_axis_tkeep_int = current_s_tkeep; + m_eth_payload_axis_tvalid_int = current_s_tvalid && m_eth_payload_axis_tready_int_reg && grant_valid; + m_eth_payload_axis_tlast_int = current_s_tlast; + m_eth_payload_axis_tid_int = current_s_tid; + m_eth_payload_axis_tdest_int = current_s_tdest; + m_eth_payload_axis_tuser_int = current_s_tuser; +end + +always @(posedge clk) begin + frame_reg <= frame_next; + + s_eth_hdr_ready_reg <= s_eth_hdr_ready_next; + + m_eth_hdr_valid_reg <= m_eth_hdr_valid_next; + m_eth_dest_mac_reg <= m_eth_dest_mac_next; + m_eth_src_mac_reg <= m_eth_src_mac_next; + m_eth_type_reg <= m_eth_type_next; + + if (rst) begin + frame_reg <= 1'b0; + s_eth_hdr_ready_reg <= {S_COUNT{1'b0}}; + m_eth_hdr_valid_reg <= 1'b0; + end +end + +// output datapath logic +reg [DATA_WIDTH-1:0] m_eth_payload_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] m_eth_payload_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg m_eth_payload_axis_tvalid_reg = 1'b0, m_eth_payload_axis_tvalid_next; +reg m_eth_payload_axis_tlast_reg = 1'b0; +reg [ID_WIDTH-1:0] m_eth_payload_axis_tid_reg = {ID_WIDTH{1'b0}}; +reg [DEST_WIDTH-1:0] m_eth_payload_axis_tdest_reg = {DEST_WIDTH{1'b0}}; +reg [USER_WIDTH-1:0] m_eth_payload_axis_tuser_reg = {USER_WIDTH{1'b0}}; + +reg [DATA_WIDTH-1:0] temp_m_eth_payload_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] temp_m_eth_payload_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg temp_m_eth_payload_axis_tvalid_reg = 1'b0, temp_m_eth_payload_axis_tvalid_next; +reg temp_m_eth_payload_axis_tlast_reg = 1'b0; +reg [ID_WIDTH-1:0] temp_m_eth_payload_axis_tid_reg = {ID_WIDTH{1'b0}}; +reg [DEST_WIDTH-1:0] temp_m_eth_payload_axis_tdest_reg = {DEST_WIDTH{1'b0}}; +reg [USER_WIDTH-1:0] temp_m_eth_payload_axis_tuser_reg = {USER_WIDTH{1'b0}}; + +// datapath control +reg store_axis_int_to_output; +reg store_axis_int_to_temp; +reg store_eth_payload_axis_temp_to_output; + +assign m_eth_payload_axis_tdata = m_eth_payload_axis_tdata_reg; +assign m_eth_payload_axis_tkeep = KEEP_ENABLE ? m_eth_payload_axis_tkeep_reg : {KEEP_WIDTH{1'b1}}; +assign m_eth_payload_axis_tvalid = m_eth_payload_axis_tvalid_reg; +assign m_eth_payload_axis_tlast = m_eth_payload_axis_tlast_reg; +assign m_eth_payload_axis_tid = ID_ENABLE ? m_eth_payload_axis_tid_reg : {ID_WIDTH{1'b0}}; +assign m_eth_payload_axis_tdest = DEST_ENABLE ? m_eth_payload_axis_tdest_reg : {DEST_WIDTH{1'b0}}; +assign m_eth_payload_axis_tuser = USER_ENABLE ? m_eth_payload_axis_tuser_reg : {USER_WIDTH{1'b0}}; + +// enable ready input next cycle if output is ready or if both output registers are empty +assign m_eth_payload_axis_tready_int_early = m_eth_payload_axis_tready || (!temp_m_eth_payload_axis_tvalid_reg && !m_eth_payload_axis_tvalid_reg); + +always @* begin + // transfer sink ready state to source + m_eth_payload_axis_tvalid_next = m_eth_payload_axis_tvalid_reg; + temp_m_eth_payload_axis_tvalid_next = temp_m_eth_payload_axis_tvalid_reg; + + store_axis_int_to_output = 1'b0; + store_axis_int_to_temp = 1'b0; + store_eth_payload_axis_temp_to_output = 1'b0; + + if (m_eth_payload_axis_tready_int_reg) begin + // input is ready + if (m_eth_payload_axis_tready || !m_eth_payload_axis_tvalid_reg) begin + // output is ready or currently not valid, transfer data to output + m_eth_payload_axis_tvalid_next = m_eth_payload_axis_tvalid_int; + store_axis_int_to_output = 1'b1; + end else begin + // output is not ready, store input in temp + temp_m_eth_payload_axis_tvalid_next = m_eth_payload_axis_tvalid_int; + store_axis_int_to_temp = 1'b1; + end + end else if (m_eth_payload_axis_tready) begin + // input is not ready, but output is ready + m_eth_payload_axis_tvalid_next = temp_m_eth_payload_axis_tvalid_reg; + temp_m_eth_payload_axis_tvalid_next = 1'b0; + store_eth_payload_axis_temp_to_output = 1'b1; + end +end + +always @(posedge clk) begin + m_eth_payload_axis_tvalid_reg <= m_eth_payload_axis_tvalid_next; + m_eth_payload_axis_tready_int_reg <= m_eth_payload_axis_tready_int_early; + temp_m_eth_payload_axis_tvalid_reg <= temp_m_eth_payload_axis_tvalid_next; + + // datapath + if (store_axis_int_to_output) begin + m_eth_payload_axis_tdata_reg <= m_eth_payload_axis_tdata_int; + m_eth_payload_axis_tkeep_reg <= m_eth_payload_axis_tkeep_int; + m_eth_payload_axis_tlast_reg <= m_eth_payload_axis_tlast_int; + m_eth_payload_axis_tid_reg <= m_eth_payload_axis_tid_int; + m_eth_payload_axis_tdest_reg <= m_eth_payload_axis_tdest_int; + m_eth_payload_axis_tuser_reg <= m_eth_payload_axis_tuser_int; + end else if (store_eth_payload_axis_temp_to_output) begin + m_eth_payload_axis_tdata_reg <= temp_m_eth_payload_axis_tdata_reg; + m_eth_payload_axis_tkeep_reg <= temp_m_eth_payload_axis_tkeep_reg; + m_eth_payload_axis_tlast_reg <= temp_m_eth_payload_axis_tlast_reg; + m_eth_payload_axis_tid_reg <= temp_m_eth_payload_axis_tid_reg; + m_eth_payload_axis_tdest_reg <= temp_m_eth_payload_axis_tdest_reg; + m_eth_payload_axis_tuser_reg <= temp_m_eth_payload_axis_tuser_reg; + end + + if (store_axis_int_to_temp) begin + temp_m_eth_payload_axis_tdata_reg <= m_eth_payload_axis_tdata_int; + temp_m_eth_payload_axis_tkeep_reg <= m_eth_payload_axis_tkeep_int; + temp_m_eth_payload_axis_tlast_reg <= m_eth_payload_axis_tlast_int; + temp_m_eth_payload_axis_tid_reg <= m_eth_payload_axis_tid_int; + temp_m_eth_payload_axis_tdest_reg <= m_eth_payload_axis_tdest_int; + temp_m_eth_payload_axis_tuser_reg <= m_eth_payload_axis_tuser_int; + end + + if (rst) begin + m_eth_payload_axis_tvalid_reg <= 1'b0; + m_eth_payload_axis_tready_int_reg <= 1'b0; + temp_m_eth_payload_axis_tvalid_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_axis_rx.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_axis_rx.v new file mode 100755 index 0000000..bd56e28 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_axis_rx.v @@ -0,0 +1,405 @@ +/* + +Copyright (c) 2014-2020 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4-Stream ethernet frame receiver (AXI in, Ethernet frame out) + */ +module eth_axis_rx # +( + // Width of AXI stream interfaces in bits + parameter DATA_WIDTH = 8, + // Propagate tkeep signal + // If disabled, tkeep assumed to be 1'b1 + parameter KEEP_ENABLE = (DATA_WIDTH>8), + // tkeep signal width (words per cycle) + parameter KEEP_WIDTH = (DATA_WIDTH/8) +) +( + input wire clk, + input wire rst, + + /* + * AXI input + */ + input wire [DATA_WIDTH-1:0] s_axis_tdata, + input wire [KEEP_WIDTH-1:0] s_axis_tkeep, + input wire s_axis_tvalid, + output wire s_axis_tready, + input wire s_axis_tlast, + input wire s_axis_tuser, + + /* + * Ethernet frame output + */ + output wire m_eth_hdr_valid, + input wire m_eth_hdr_ready, + output wire [47:0] m_eth_dest_mac, + output wire [47:0] m_eth_src_mac, + output wire [15:0] m_eth_type, + output wire [DATA_WIDTH-1:0] m_eth_payload_axis_tdata, + output wire [KEEP_WIDTH-1:0] m_eth_payload_axis_tkeep, + output wire m_eth_payload_axis_tvalid, + input wire m_eth_payload_axis_tready, + output wire m_eth_payload_axis_tlast, + output wire m_eth_payload_axis_tuser, + + /* + * Status signals + */ + output wire busy, + output wire error_header_early_termination +); + +parameter BYTE_LANES = KEEP_ENABLE ? KEEP_WIDTH : 1; + +parameter HDR_SIZE = 14; + +parameter CYCLE_COUNT = (HDR_SIZE+BYTE_LANES-1)/BYTE_LANES; + +parameter PTR_WIDTH = $clog2(CYCLE_COUNT); + +parameter OFFSET = HDR_SIZE % BYTE_LANES; + +// bus width assertions +initial begin + if (BYTE_LANES * 8 != DATA_WIDTH) begin + $error("Error: AXI stream interface requires byte (8-bit) granularity (instance %m)"); + $finish; + end +end + +/* + +Ethernet frame + + Field Length + Destination MAC address 6 octets + Source MAC address 6 octets + Ethertype 2 octets + +This module receives an Ethernet frame on an AXI stream interface, decodes +and strips the headers, then produces the header fields in parallel along +with the payload in a separate AXI stream. + +*/ + +reg read_eth_header_reg = 1'b1, read_eth_header_next; +reg read_eth_payload_reg = 1'b0, read_eth_payload_next; +reg [PTR_WIDTH-1:0] ptr_reg = 0, ptr_next; + +reg flush_save; +reg transfer_in_save; + +reg s_axis_tready_reg = 1'b0, s_axis_tready_next; + +reg m_eth_hdr_valid_reg = 1'b0, m_eth_hdr_valid_next; +reg [47:0] m_eth_dest_mac_reg = 48'd0, m_eth_dest_mac_next; +reg [47:0] m_eth_src_mac_reg = 48'd0, m_eth_src_mac_next; +reg [15:0] m_eth_type_reg = 16'd0, m_eth_type_next; + +reg busy_reg = 1'b0; +reg error_header_early_termination_reg = 1'b0, error_header_early_termination_next; + +reg [DATA_WIDTH-1:0] save_axis_tdata_reg = 64'd0; +reg [KEEP_WIDTH-1:0] save_axis_tkeep_reg = 8'd0; +reg save_axis_tlast_reg = 1'b0; +reg save_axis_tuser_reg = 1'b0; + +reg [DATA_WIDTH-1:0] shift_axis_tdata; +reg [KEEP_WIDTH-1:0] shift_axis_tkeep; +reg shift_axis_tvalid; +reg shift_axis_tlast; +reg shift_axis_tuser; +reg shift_axis_input_tready; +reg shift_axis_extra_cycle_reg = 1'b0; + +// internal datapath +reg [DATA_WIDTH-1:0] m_eth_payload_axis_tdata_int; +reg [KEEP_WIDTH-1:0] m_eth_payload_axis_tkeep_int; +reg m_eth_payload_axis_tvalid_int; +reg m_eth_payload_axis_tready_int_reg = 1'b0; +reg m_eth_payload_axis_tlast_int; +reg m_eth_payload_axis_tuser_int; +wire m_eth_payload_axis_tready_int_early; + +assign s_axis_tready = s_axis_tready_reg; + +assign m_eth_hdr_valid = m_eth_hdr_valid_reg; +assign m_eth_dest_mac = m_eth_dest_mac_reg; +assign m_eth_src_mac = m_eth_src_mac_reg; +assign m_eth_type = m_eth_type_reg; + +assign busy = busy_reg; +assign error_header_early_termination = error_header_early_termination_reg; + +always @* begin + if (OFFSET == 0) begin + // passthrough if no overlap + shift_axis_tdata = s_axis_tdata; + shift_axis_tkeep = s_axis_tkeep; + shift_axis_tvalid = s_axis_tvalid; + shift_axis_tlast = s_axis_tlast; + shift_axis_tuser = s_axis_tuser; + shift_axis_input_tready = 1'b1; + end else if (shift_axis_extra_cycle_reg) begin + shift_axis_tdata = {s_axis_tdata, save_axis_tdata_reg} >> (OFFSET*8); + shift_axis_tkeep = {{KEEP_WIDTH{1'b0}}, save_axis_tkeep_reg} >> OFFSET; + shift_axis_tvalid = 1'b1; + shift_axis_tlast = save_axis_tlast_reg; + shift_axis_tuser = save_axis_tuser_reg; + shift_axis_input_tready = flush_save; + end else begin + shift_axis_tdata = {s_axis_tdata, save_axis_tdata_reg} >> (OFFSET*8); + shift_axis_tkeep = {s_axis_tkeep, save_axis_tkeep_reg} >> OFFSET; + shift_axis_tvalid = s_axis_tvalid; + shift_axis_tlast = (s_axis_tlast && ((s_axis_tkeep & ({KEEP_WIDTH{1'b1}} << OFFSET)) == 0)); + shift_axis_tuser = (s_axis_tuser && ((s_axis_tkeep & ({KEEP_WIDTH{1'b1}} << OFFSET)) == 0)); + shift_axis_input_tready = !(s_axis_tlast && s_axis_tready && s_axis_tvalid); + end +end + +always @* begin + read_eth_header_next = read_eth_header_reg; + read_eth_payload_next = read_eth_payload_reg; + ptr_next = ptr_reg; + + s_axis_tready_next = m_eth_payload_axis_tready_int_early && shift_axis_input_tready && (!m_eth_hdr_valid || m_eth_hdr_ready); + + flush_save = 1'b0; + transfer_in_save = 1'b0; + + m_eth_hdr_valid_next = m_eth_hdr_valid_reg && !m_eth_hdr_ready; + + m_eth_dest_mac_next = m_eth_dest_mac_reg; + m_eth_src_mac_next = m_eth_src_mac_reg; + m_eth_type_next = m_eth_type_reg; + + error_header_early_termination_next = 1'b0; + + m_eth_payload_axis_tdata_int = shift_axis_tdata; + m_eth_payload_axis_tkeep_int = shift_axis_tkeep; + m_eth_payload_axis_tvalid_int = 1'b0; + m_eth_payload_axis_tlast_int = shift_axis_tlast; + m_eth_payload_axis_tuser_int = shift_axis_tuser; + + if ((s_axis_tready && s_axis_tvalid) || (m_eth_payload_axis_tready_int_reg && shift_axis_extra_cycle_reg)) begin + transfer_in_save = 1'b1; + + if (read_eth_header_reg) begin + // word transfer in - store it + ptr_next = ptr_reg + 1; + + `define _HEADER_FIELD_(offset, field) \ + if (ptr_reg == offset/BYTE_LANES && (!KEEP_ENABLE || s_axis_tkeep[offset%BYTE_LANES])) begin \ + field = s_axis_tdata[(offset%BYTE_LANES)*8 +: 8]; \ + end + + `_HEADER_FIELD_(0, m_eth_dest_mac_next[5*8 +: 8]) + `_HEADER_FIELD_(1, m_eth_dest_mac_next[4*8 +: 8]) + `_HEADER_FIELD_(2, m_eth_dest_mac_next[3*8 +: 8]) + `_HEADER_FIELD_(3, m_eth_dest_mac_next[2*8 +: 8]) + `_HEADER_FIELD_(4, m_eth_dest_mac_next[1*8 +: 8]) + `_HEADER_FIELD_(5, m_eth_dest_mac_next[0*8 +: 8]) + `_HEADER_FIELD_(6, m_eth_src_mac_next[5*8 +: 8]) + `_HEADER_FIELD_(7, m_eth_src_mac_next[4*8 +: 8]) + `_HEADER_FIELD_(8, m_eth_src_mac_next[3*8 +: 8]) + `_HEADER_FIELD_(9, m_eth_src_mac_next[2*8 +: 8]) + `_HEADER_FIELD_(10, m_eth_src_mac_next[1*8 +: 8]) + `_HEADER_FIELD_(11, m_eth_src_mac_next[0*8 +: 8]) + `_HEADER_FIELD_(12, m_eth_type_next[1*8 +: 8]) + `_HEADER_FIELD_(13, m_eth_type_next[0*8 +: 8]) + + if (ptr_reg == 13/BYTE_LANES && (!KEEP_ENABLE || s_axis_tkeep[13%BYTE_LANES])) begin + if (!shift_axis_tlast) begin + m_eth_hdr_valid_next = 1'b1; + read_eth_header_next = 1'b0; + read_eth_payload_next = 1'b1; + end + end + + `undef _HEADER_FIELD_ + end + + if (read_eth_payload_reg) begin + // transfer payload + m_eth_payload_axis_tdata_int = shift_axis_tdata; + m_eth_payload_axis_tkeep_int = shift_axis_tkeep; + m_eth_payload_axis_tvalid_int = 1'b1; + m_eth_payload_axis_tlast_int = shift_axis_tlast; + m_eth_payload_axis_tuser_int = shift_axis_tuser; + end + + if (shift_axis_tlast) begin + if (read_eth_header_next) begin + // don't have the whole header + error_header_early_termination_next = 1'b1; + end + + flush_save = 1'b1; + ptr_next = 1'b0; + read_eth_header_next = 1'b1; + read_eth_payload_next = 1'b0; + end + end +end + +always @(posedge clk) begin + read_eth_header_reg <= read_eth_header_next; + read_eth_payload_reg <= read_eth_payload_next; + ptr_reg <= ptr_next; + + s_axis_tready_reg <= s_axis_tready_next; + + m_eth_hdr_valid_reg <= m_eth_hdr_valid_next; + m_eth_dest_mac_reg <= m_eth_dest_mac_next; + m_eth_src_mac_reg <= m_eth_src_mac_next; + m_eth_type_reg <= m_eth_type_next; + + error_header_early_termination_reg <= error_header_early_termination_next; + + busy_reg <= (read_eth_payload_next || ptr_next != 0); + + if (transfer_in_save) begin + save_axis_tdata_reg <= s_axis_tdata; + save_axis_tkeep_reg <= s_axis_tkeep; + save_axis_tuser_reg <= s_axis_tuser; + end + + if (flush_save) begin + save_axis_tlast_reg <= 1'b0; + shift_axis_extra_cycle_reg <= 1'b0; + end else if (transfer_in_save) begin + save_axis_tlast_reg <= s_axis_tlast; + shift_axis_extra_cycle_reg <= OFFSET ? s_axis_tlast && ((s_axis_tkeep & ({KEEP_WIDTH{1'b1}} << OFFSET)) != 0) : 1'b0; + end + + if (rst) begin + read_eth_header_reg <= 1'b1; + read_eth_payload_reg <= 1'b0; + ptr_reg <= 0; + s_axis_tready_reg <= 1'b0; + m_eth_hdr_valid_reg <= 1'b0; + save_axis_tlast_reg <= 1'b0; + shift_axis_extra_cycle_reg <= 1'b0; + busy_reg <= 1'b0; + error_header_early_termination_reg <= 1'b0; + end +end + +// output datapath logic +reg [DATA_WIDTH-1:0] m_eth_payload_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] m_eth_payload_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg m_eth_payload_axis_tvalid_reg = 1'b0, m_eth_payload_axis_tvalid_next; +reg m_eth_payload_axis_tlast_reg = 1'b0; +reg m_eth_payload_axis_tuser_reg = 1'b0; + +reg [DATA_WIDTH-1:0] temp_m_eth_payload_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] temp_m_eth_payload_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg temp_m_eth_payload_axis_tvalid_reg = 1'b0, temp_m_eth_payload_axis_tvalid_next; +reg temp_m_eth_payload_axis_tlast_reg = 1'b0; +reg temp_m_eth_payload_axis_tuser_reg = 1'b0; + +// datapath control +reg store_eth_payload_int_to_output; +reg store_eth_payload_int_to_temp; +reg store_eth_payload_axis_temp_to_output; + +assign m_eth_payload_axis_tdata = m_eth_payload_axis_tdata_reg; +assign m_eth_payload_axis_tkeep = KEEP_ENABLE ? m_eth_payload_axis_tkeep_reg : {KEEP_WIDTH{1'b1}}; +assign m_eth_payload_axis_tvalid = m_eth_payload_axis_tvalid_reg; +assign m_eth_payload_axis_tlast = m_eth_payload_axis_tlast_reg; +assign m_eth_payload_axis_tuser = m_eth_payload_axis_tuser_reg; + +// enable ready input next cycle if output is ready or if both output registers are empty +assign m_eth_payload_axis_tready_int_early = m_eth_payload_axis_tready || (!temp_m_eth_payload_axis_tvalid_reg && !m_eth_payload_axis_tvalid_reg); + +always @* begin + // transfer sink ready state to source + m_eth_payload_axis_tvalid_next = m_eth_payload_axis_tvalid_reg; + temp_m_eth_payload_axis_tvalid_next = temp_m_eth_payload_axis_tvalid_reg; + + store_eth_payload_int_to_output = 1'b0; + store_eth_payload_int_to_temp = 1'b0; + store_eth_payload_axis_temp_to_output = 1'b0; + + if (m_eth_payload_axis_tready_int_reg) begin + // input is ready + if (m_eth_payload_axis_tready || !m_eth_payload_axis_tvalid_reg) begin + // output is ready or currently not valid, transfer data to output + m_eth_payload_axis_tvalid_next = m_eth_payload_axis_tvalid_int; + store_eth_payload_int_to_output = 1'b1; + end else begin + // output is not ready, store input in temp + temp_m_eth_payload_axis_tvalid_next = m_eth_payload_axis_tvalid_int; + store_eth_payload_int_to_temp = 1'b1; + end + end else if (m_eth_payload_axis_tready) begin + // input is not ready, but output is ready + m_eth_payload_axis_tvalid_next = temp_m_eth_payload_axis_tvalid_reg; + temp_m_eth_payload_axis_tvalid_next = 1'b0; + store_eth_payload_axis_temp_to_output = 1'b1; + end +end + +always @(posedge clk) begin + m_eth_payload_axis_tvalid_reg <= m_eth_payload_axis_tvalid_next; + m_eth_payload_axis_tready_int_reg <= m_eth_payload_axis_tready_int_early; + temp_m_eth_payload_axis_tvalid_reg <= temp_m_eth_payload_axis_tvalid_next; + + // datapath + if (store_eth_payload_int_to_output) begin + m_eth_payload_axis_tdata_reg <= m_eth_payload_axis_tdata_int; + m_eth_payload_axis_tkeep_reg <= m_eth_payload_axis_tkeep_int; + m_eth_payload_axis_tlast_reg <= m_eth_payload_axis_tlast_int; + m_eth_payload_axis_tuser_reg <= m_eth_payload_axis_tuser_int; + end else if (store_eth_payload_axis_temp_to_output) begin + m_eth_payload_axis_tdata_reg <= temp_m_eth_payload_axis_tdata_reg; + m_eth_payload_axis_tkeep_reg <= temp_m_eth_payload_axis_tkeep_reg; + m_eth_payload_axis_tlast_reg <= temp_m_eth_payload_axis_tlast_reg; + m_eth_payload_axis_tuser_reg <= temp_m_eth_payload_axis_tuser_reg; + end + + if (store_eth_payload_int_to_temp) begin + temp_m_eth_payload_axis_tdata_reg <= m_eth_payload_axis_tdata_int; + temp_m_eth_payload_axis_tkeep_reg <= m_eth_payload_axis_tkeep_int; + temp_m_eth_payload_axis_tlast_reg <= m_eth_payload_axis_tlast_int; + temp_m_eth_payload_axis_tuser_reg <= m_eth_payload_axis_tuser_int; + end + + if (rst) begin + m_eth_payload_axis_tvalid_reg <= 1'b0; + m_eth_payload_axis_tready_int_reg <= 1'b0; + temp_m_eth_payload_axis_tvalid_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_axis_tx.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_axis_tx.v new file mode 100755 index 0000000..28c73b7 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_axis_tx.v @@ -0,0 +1,409 @@ +/* + +Copyright (c) 2014-2020 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4-Stream ethernet frame transmitter (Ethernet frame in, AXI out) + */ +module eth_axis_tx # +( + // Width of AXI stream interfaces in bits + parameter DATA_WIDTH = 8, + // Propagate tkeep signal + // If disabled, tkeep assumed to be 1'b1 + parameter KEEP_ENABLE = (DATA_WIDTH>8), + // tkeep signal width (words per cycle) + parameter KEEP_WIDTH = (DATA_WIDTH/8) +) +( + input wire clk, + input wire rst, + + /* + * Ethernet frame input + */ + input wire s_eth_hdr_valid, + output wire s_eth_hdr_ready, + input wire [47:0] s_eth_dest_mac, + input wire [47:0] s_eth_src_mac, + input wire [15:0] s_eth_type, + input wire [DATA_WIDTH-1:0] s_eth_payload_axis_tdata, + input wire [KEEP_WIDTH-1:0] s_eth_payload_axis_tkeep, + input wire s_eth_payload_axis_tvalid, + output wire s_eth_payload_axis_tready, + input wire s_eth_payload_axis_tlast, + input wire s_eth_payload_axis_tuser, + + /* + * AXI output + */ + output wire [DATA_WIDTH-1:0] m_axis_tdata, + output wire [KEEP_WIDTH-1:0] m_axis_tkeep, + output wire m_axis_tvalid, + input wire m_axis_tready, + output wire m_axis_tlast, + output wire m_axis_tuser, + + /* + * Status signals + */ + output wire busy +); + +parameter BYTE_LANES = KEEP_ENABLE ? KEEP_WIDTH : 1; + +parameter HDR_SIZE = 14; + +parameter CYCLE_COUNT = (HDR_SIZE+BYTE_LANES-1)/BYTE_LANES; + +parameter PTR_WIDTH = $clog2(CYCLE_COUNT); + +parameter OFFSET = HDR_SIZE % BYTE_LANES; + +// bus width assertions +initial begin + if (BYTE_LANES * 8 != DATA_WIDTH) begin + $error("Error: AXI stream interface requires byte (8-bit) granularity (instance %m)"); + $finish; + end +end + +/* + +Ethernet frame + + Field Length + Destination MAC address 6 octets + Source MAC address 6 octets + Ethertype 2 octets + +This module receives an Ethernet frame with header fields in parallel along +with the payload in an AXI stream, combines the header with the payload, and +transmits the complete Ethernet frame on the output AXI stream interface. + +*/ + +// datapath control signals +reg store_eth_hdr; + +reg send_eth_header_reg = 1'b0, send_eth_header_next; +reg send_eth_payload_reg = 1'b0, send_eth_payload_next; +reg [PTR_WIDTH-1:0] ptr_reg = 0, ptr_next; + +reg flush_save; +reg transfer_in_save; + +reg [47:0] eth_dest_mac_reg = 48'd0; +reg [47:0] eth_src_mac_reg = 48'd0; +reg [15:0] eth_type_reg = 16'd0; + +reg s_eth_hdr_ready_reg = 1'b0, s_eth_hdr_ready_next; +reg s_eth_payload_axis_tready_reg = 1'b0, s_eth_payload_axis_tready_next; + +reg busy_reg = 1'b0; + +reg [DATA_WIDTH-1:0] save_eth_payload_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] save_eth_payload_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg save_eth_payload_axis_tlast_reg = 1'b0; +reg save_eth_payload_axis_tuser_reg = 1'b0; + +reg [DATA_WIDTH-1:0] shift_eth_payload_axis_tdata; +reg [KEEP_WIDTH-1:0] shift_eth_payload_axis_tkeep; +reg shift_eth_payload_axis_tvalid; +reg shift_eth_payload_axis_tlast; +reg shift_eth_payload_axis_tuser; +reg shift_eth_payload_axis_input_tready; +reg shift_eth_payload_axis_extra_cycle_reg = 1'b0; + +// internal datapath +reg [DATA_WIDTH-1:0] m_axis_tdata_int; +reg [KEEP_WIDTH-1:0] m_axis_tkeep_int; +reg m_axis_tvalid_int; +reg m_axis_tready_int_reg = 1'b0; +reg m_axis_tlast_int; +reg m_axis_tuser_int; +wire m_axis_tready_int_early; + +assign s_eth_hdr_ready = s_eth_hdr_ready_reg; +assign s_eth_payload_axis_tready = s_eth_payload_axis_tready_reg; + +assign busy = busy_reg; + +always @* begin + if (OFFSET == 0) begin + // passthrough if no overlap + shift_eth_payload_axis_tdata = s_eth_payload_axis_tdata; + shift_eth_payload_axis_tkeep = s_eth_payload_axis_tkeep; + shift_eth_payload_axis_tvalid = s_eth_payload_axis_tvalid; + shift_eth_payload_axis_tlast = s_eth_payload_axis_tlast; + shift_eth_payload_axis_tuser = s_eth_payload_axis_tuser; + shift_eth_payload_axis_input_tready = 1'b1; + end else if (shift_eth_payload_axis_extra_cycle_reg) begin + shift_eth_payload_axis_tdata = {s_eth_payload_axis_tdata, save_eth_payload_axis_tdata_reg} >> ((KEEP_WIDTH-OFFSET)*8); + shift_eth_payload_axis_tkeep = {{KEEP_WIDTH{1'b0}}, save_eth_payload_axis_tkeep_reg} >> (KEEP_WIDTH-OFFSET); + shift_eth_payload_axis_tvalid = 1'b1; + shift_eth_payload_axis_tlast = save_eth_payload_axis_tlast_reg; + shift_eth_payload_axis_tuser = save_eth_payload_axis_tuser_reg; + shift_eth_payload_axis_input_tready = flush_save; + end else begin + shift_eth_payload_axis_tdata = {s_eth_payload_axis_tdata, save_eth_payload_axis_tdata_reg} >> ((KEEP_WIDTH-OFFSET)*8); + shift_eth_payload_axis_tkeep = {s_eth_payload_axis_tkeep, save_eth_payload_axis_tkeep_reg} >> (KEEP_WIDTH-OFFSET); + shift_eth_payload_axis_tvalid = s_eth_payload_axis_tvalid; + shift_eth_payload_axis_tlast = (s_eth_payload_axis_tlast && ((s_eth_payload_axis_tkeep & ({KEEP_WIDTH{1'b1}} << (KEEP_WIDTH-OFFSET))) == 0)); + shift_eth_payload_axis_tuser = (s_eth_payload_axis_tuser && ((s_eth_payload_axis_tkeep & ({KEEP_WIDTH{1'b1}} << (KEEP_WIDTH-OFFSET))) == 0)); + shift_eth_payload_axis_input_tready = !(s_eth_payload_axis_tlast && s_eth_payload_axis_tready && s_eth_payload_axis_tvalid); + end +end + +always @* begin + send_eth_header_next = send_eth_header_reg; + send_eth_payload_next = send_eth_payload_reg; + ptr_next = ptr_reg; + + s_eth_hdr_ready_next = 1'b0; + s_eth_payload_axis_tready_next = 1'b0; + + store_eth_hdr = 1'b0; + + flush_save = 1'b0; + transfer_in_save = 1'b0; + + m_axis_tdata_int = {DATA_WIDTH{1'b0}}; + m_axis_tkeep_int = {KEEP_WIDTH{1'b0}}; + m_axis_tvalid_int = 1'b0; + m_axis_tlast_int = 1'b0; + m_axis_tuser_int = 1'b0; + + if (s_eth_hdr_ready && s_eth_hdr_valid) begin + store_eth_hdr = 1'b1; + ptr_next = 0; + send_eth_header_next = 1'b1; + send_eth_payload_next = (OFFSET != 0) && (CYCLE_COUNT == 1); + s_eth_payload_axis_tready_next = send_eth_payload_next && m_axis_tready_int_early; + end + + if (send_eth_payload_reg) begin + s_eth_payload_axis_tready_next = m_axis_tready_int_early && shift_eth_payload_axis_input_tready; + + m_axis_tdata_int = shift_eth_payload_axis_tdata; + m_axis_tkeep_int = shift_eth_payload_axis_tkeep; + m_axis_tlast_int = shift_eth_payload_axis_tlast; + m_axis_tuser_int = shift_eth_payload_axis_tuser; + + if ((s_eth_payload_axis_tready && s_eth_payload_axis_tvalid) || (m_axis_tready_int_reg && shift_eth_payload_axis_extra_cycle_reg)) begin + transfer_in_save = 1'b1; + + m_axis_tvalid_int = 1'b1; + + if (shift_eth_payload_axis_tlast) begin + flush_save = 1'b1; + s_eth_payload_axis_tready_next = 1'b0; + ptr_next = 0; + send_eth_payload_next = 1'b0; + end + end + end + + if (m_axis_tready_int_reg && (!OFFSET || !send_eth_payload_reg || m_axis_tvalid_int)) begin + if (send_eth_header_reg) begin + ptr_next = ptr_reg + 1; + + if ((OFFSET != 0) && (CYCLE_COUNT == 1 || ptr_next == CYCLE_COUNT-1) && !send_eth_payload_reg) begin + send_eth_payload_next = 1'b1; + s_eth_payload_axis_tready_next = m_axis_tready_int_early && shift_eth_payload_axis_input_tready; + end + + m_axis_tvalid_int = 1'b1; + + `define _HEADER_FIELD_(offset, field) \ + if (ptr_reg == offset/BYTE_LANES) begin \ + m_axis_tdata_int[(offset%BYTE_LANES)*8 +: 8] = field; \ + m_axis_tkeep_int[offset%BYTE_LANES] = 1'b1; \ + end + + `_HEADER_FIELD_(0, eth_dest_mac_reg[5*8 +: 8]) + `_HEADER_FIELD_(1, eth_dest_mac_reg[4*8 +: 8]) + `_HEADER_FIELD_(2, eth_dest_mac_reg[3*8 +: 8]) + `_HEADER_FIELD_(3, eth_dest_mac_reg[2*8 +: 8]) + `_HEADER_FIELD_(4, eth_dest_mac_reg[1*8 +: 8]) + `_HEADER_FIELD_(5, eth_dest_mac_reg[0*8 +: 8]) + `_HEADER_FIELD_(6, eth_src_mac_reg[5*8 +: 8]) + `_HEADER_FIELD_(7, eth_src_mac_reg[4*8 +: 8]) + `_HEADER_FIELD_(8, eth_src_mac_reg[3*8 +: 8]) + `_HEADER_FIELD_(9, eth_src_mac_reg[2*8 +: 8]) + `_HEADER_FIELD_(10, eth_src_mac_reg[1*8 +: 8]) + `_HEADER_FIELD_(11, eth_src_mac_reg[0*8 +: 8]) + `_HEADER_FIELD_(12, eth_type_reg[1*8 +: 8]) + `_HEADER_FIELD_(13, eth_type_reg[0*8 +: 8]) + + if (ptr_reg == 13/BYTE_LANES) begin + if (!send_eth_payload_reg) begin + s_eth_payload_axis_tready_next = m_axis_tready_int_early; + send_eth_payload_next = 1'b1; + end + send_eth_header_next = 1'b0; + end + + `undef _HEADER_FIELD_ + end + end + + s_eth_hdr_ready_next = !(send_eth_header_next || send_eth_payload_next); +end + +always @(posedge clk) begin + send_eth_header_reg <= send_eth_header_next; + send_eth_payload_reg <= send_eth_payload_next; + ptr_reg <= ptr_next; + + s_eth_hdr_ready_reg <= s_eth_hdr_ready_next; + s_eth_payload_axis_tready_reg <= s_eth_payload_axis_tready_next; + + busy_reg <= send_eth_header_next || send_eth_payload_next; + + if (store_eth_hdr) begin + eth_dest_mac_reg <= s_eth_dest_mac; + eth_src_mac_reg <= s_eth_src_mac; + eth_type_reg <= s_eth_type; + end + + if (transfer_in_save) begin + save_eth_payload_axis_tdata_reg <= s_eth_payload_axis_tdata; + save_eth_payload_axis_tkeep_reg <= s_eth_payload_axis_tkeep; + save_eth_payload_axis_tuser_reg <= s_eth_payload_axis_tuser; + end + + if (flush_save) begin + save_eth_payload_axis_tlast_reg <= 1'b0; + shift_eth_payload_axis_extra_cycle_reg <= 1'b0; + end else if (transfer_in_save) begin + save_eth_payload_axis_tlast_reg <= s_eth_payload_axis_tlast; + shift_eth_payload_axis_extra_cycle_reg <= OFFSET ? s_eth_payload_axis_tlast && ((s_eth_payload_axis_tkeep & ({KEEP_WIDTH{1'b1}} << (KEEP_WIDTH-OFFSET))) != 0) : 1'b0; + end + + if (rst) begin + send_eth_header_reg <= 1'b0; + send_eth_payload_reg <= 1'b0; + ptr_reg <= 0; + s_eth_hdr_ready_reg <= 1'b0; + s_eth_payload_axis_tready_reg <= 1'b0; + busy_reg <= 1'b0; + end +end + +// output datapath logic +reg [DATA_WIDTH-1:0] m_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] m_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg m_axis_tvalid_reg = 1'b0, m_axis_tvalid_next; +reg m_axis_tlast_reg = 1'b0; +reg m_axis_tuser_reg = 1'b0; + +reg [DATA_WIDTH-1:0] temp_m_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] temp_m_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg temp_m_axis_tvalid_reg = 1'b0, temp_m_axis_tvalid_next; +reg temp_m_axis_tlast_reg = 1'b0; +reg temp_m_axis_tuser_reg = 1'b0; + +// datapath control +reg store_axis_int_to_output; +reg store_axis_int_to_temp; +reg store_axis_temp_to_output; + +assign m_axis_tdata = m_axis_tdata_reg; +assign m_axis_tkeep = KEEP_ENABLE ? m_axis_tkeep_reg : {KEEP_WIDTH{1'b1}}; +assign m_axis_tvalid = m_axis_tvalid_reg; +assign m_axis_tlast = m_axis_tlast_reg; +assign m_axis_tuser = m_axis_tuser_reg; + +// enable ready input next cycle if output is ready or if both output registers are empty +assign m_axis_tready_int_early = m_axis_tready || (!temp_m_axis_tvalid_reg && !m_axis_tvalid_reg); + +always @* begin + // transfer sink ready state to source + m_axis_tvalid_next = m_axis_tvalid_reg; + temp_m_axis_tvalid_next = temp_m_axis_tvalid_reg; + + store_axis_int_to_output = 1'b0; + store_axis_int_to_temp = 1'b0; + store_axis_temp_to_output = 1'b0; + + if (m_axis_tready_int_reg) begin + // input is ready + if (m_axis_tready || !m_axis_tvalid_reg) begin + // output is ready or currently not valid, transfer data to output + m_axis_tvalid_next = m_axis_tvalid_int; + store_axis_int_to_output = 1'b1; + end else begin + // output is not ready, store input in temp + temp_m_axis_tvalid_next = m_axis_tvalid_int; + store_axis_int_to_temp = 1'b1; + end + end else if (m_axis_tready) begin + // input is not ready, but output is ready + m_axis_tvalid_next = temp_m_axis_tvalid_reg; + temp_m_axis_tvalid_next = 1'b0; + store_axis_temp_to_output = 1'b1; + end +end + +always @(posedge clk) begin + m_axis_tvalid_reg <= m_axis_tvalid_next; + m_axis_tready_int_reg <= m_axis_tready_int_early; + temp_m_axis_tvalid_reg <= temp_m_axis_tvalid_next; + + // datapath + if (store_axis_int_to_output) begin + m_axis_tdata_reg <= m_axis_tdata_int; + m_axis_tkeep_reg <= m_axis_tkeep_int; + m_axis_tlast_reg <= m_axis_tlast_int; + m_axis_tuser_reg <= m_axis_tuser_int; + end else if (store_axis_temp_to_output) begin + m_axis_tdata_reg <= temp_m_axis_tdata_reg; + m_axis_tkeep_reg <= temp_m_axis_tkeep_reg; + m_axis_tlast_reg <= temp_m_axis_tlast_reg; + m_axis_tuser_reg <= temp_m_axis_tuser_reg; + end + + if (store_axis_int_to_temp) begin + temp_m_axis_tdata_reg <= m_axis_tdata_int; + temp_m_axis_tkeep_reg <= m_axis_tkeep_int; + temp_m_axis_tlast_reg <= m_axis_tlast_int; + temp_m_axis_tuser_reg <= m_axis_tuser_int; + end + + if (rst) begin + m_axis_tvalid_reg <= 1'b0; + m_axis_tready_int_reg <= 1'b0; + temp_m_axis_tvalid_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_mac_10g.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_mac_10g.v new file mode 100755 index 0000000..54c0e20 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_mac_10g.v @@ -0,0 +1,731 @@ +/* + +Copyright (c) 2015-2023 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * 10G Ethernet MAC + */ +module eth_mac_10g # +( + parameter DATA_WIDTH = 64, + parameter KEEP_WIDTH = (DATA_WIDTH/8), + parameter CTRL_WIDTH = (DATA_WIDTH/8), + parameter ENABLE_PADDING = 1, + parameter ENABLE_DIC = 1, + parameter MIN_FRAME_LENGTH = 64, + parameter PTP_TS_ENABLE = 0, + parameter PTP_TS_FMT_TOD = 1, + parameter PTP_TS_WIDTH = PTP_TS_FMT_TOD ? 96 : 64, + parameter TX_PTP_TS_CTRL_IN_TUSER = 0, + parameter TX_PTP_TAG_ENABLE = PTP_TS_ENABLE, + parameter TX_PTP_TAG_WIDTH = 16, + parameter TX_USER_WIDTH = (PTP_TS_ENABLE ? (TX_PTP_TAG_ENABLE ? TX_PTP_TAG_WIDTH : 0) + (TX_PTP_TS_CTRL_IN_TUSER ? 1 : 0) : 0) + 1, + parameter RX_USER_WIDTH = (PTP_TS_ENABLE ? PTP_TS_WIDTH : 0) + 1, + parameter PFC_ENABLE = 0, + parameter PAUSE_ENABLE = PFC_ENABLE +) +( + input wire rx_clk, + input wire rx_rst, + input wire tx_clk, + input wire tx_rst, + + /* + * AXI input + */ + input wire [DATA_WIDTH-1:0] tx_axis_tdata, + input wire [KEEP_WIDTH-1:0] tx_axis_tkeep, + input wire tx_axis_tvalid, + output wire tx_axis_tready, + input wire tx_axis_tlast, + input wire [TX_USER_WIDTH-1:0] tx_axis_tuser, + + /* + * AXI output + */ + output wire [DATA_WIDTH-1:0] rx_axis_tdata, + output wire [KEEP_WIDTH-1:0] rx_axis_tkeep, + output wire rx_axis_tvalid, + output wire rx_axis_tlast, + output wire [RX_USER_WIDTH-1:0] rx_axis_tuser, + + /* + * XGMII interface + */ + input wire [DATA_WIDTH-1:0] xgmii_rxd, + input wire [CTRL_WIDTH-1:0] xgmii_rxc, + output wire [DATA_WIDTH-1:0] xgmii_txd, + output wire [CTRL_WIDTH-1:0] xgmii_txc, + + /* + * PTP + */ + input wire [PTP_TS_WIDTH-1:0] tx_ptp_ts, + input wire [PTP_TS_WIDTH-1:0] rx_ptp_ts, + output wire [PTP_TS_WIDTH-1:0] tx_axis_ptp_ts, + output wire [TX_PTP_TAG_WIDTH-1:0] tx_axis_ptp_ts_tag, + output wire tx_axis_ptp_ts_valid, + + /* + * Link-level Flow Control (LFC) (IEEE 802.3 annex 31B PAUSE) + */ + input wire tx_lfc_req, + input wire tx_lfc_resend, + input wire rx_lfc_en, + output wire rx_lfc_req, + input wire rx_lfc_ack, + + /* + * Priority Flow Control (PFC) (IEEE 802.3 annex 31D PFC) + */ + input wire [7:0] tx_pfc_req, + input wire tx_pfc_resend, + input wire [7:0] rx_pfc_en, + output wire [7:0] rx_pfc_req, + input wire [7:0] rx_pfc_ack, + + /* + * Pause interface + */ + input wire tx_lfc_pause_en, + input wire tx_pause_req, + output wire tx_pause_ack, + + /* + * Status + */ + output wire [1:0] tx_start_packet, + output wire tx_error_underflow, + output wire [1:0] rx_start_packet, + output wire rx_error_bad_frame, + output wire rx_error_bad_fcs, + output wire stat_tx_mcf, + output wire stat_rx_mcf, + output wire stat_tx_lfc_pkt, + output wire stat_tx_lfc_xon, + output wire stat_tx_lfc_xoff, + output wire stat_tx_lfc_paused, + output wire stat_tx_pfc_pkt, + output wire [7:0] stat_tx_pfc_xon, + output wire [7:0] stat_tx_pfc_xoff, + output wire [7:0] stat_tx_pfc_paused, + output wire stat_rx_lfc_pkt, + output wire stat_rx_lfc_xon, + output wire stat_rx_lfc_xoff, + output wire stat_rx_lfc_paused, + output wire stat_rx_pfc_pkt, + output wire [7:0] stat_rx_pfc_xon, + output wire [7:0] stat_rx_pfc_xoff, + output wire [7:0] stat_rx_pfc_paused, + + /* + * Configuration + */ + input wire [7:0] cfg_ifg, + input wire cfg_tx_enable, + input wire cfg_rx_enable, + input wire [47:0] cfg_mcf_rx_eth_dst_mcast, + input wire cfg_mcf_rx_check_eth_dst_mcast, + input wire [47:0] cfg_mcf_rx_eth_dst_ucast, + input wire cfg_mcf_rx_check_eth_dst_ucast, + input wire [47:0] cfg_mcf_rx_eth_src, + input wire cfg_mcf_rx_check_eth_src, + input wire [15:0] cfg_mcf_rx_eth_type, + input wire [15:0] cfg_mcf_rx_opcode_lfc, + input wire cfg_mcf_rx_check_opcode_lfc, + input wire [15:0] cfg_mcf_rx_opcode_pfc, + input wire cfg_mcf_rx_check_opcode_pfc, + input wire cfg_mcf_rx_forward, + input wire cfg_mcf_rx_enable, + input wire [47:0] cfg_tx_lfc_eth_dst, + input wire [47:0] cfg_tx_lfc_eth_src, + input wire [15:0] cfg_tx_lfc_eth_type, + input wire [15:0] cfg_tx_lfc_opcode, + input wire cfg_tx_lfc_en, + input wire [15:0] cfg_tx_lfc_quanta, + input wire [15:0] cfg_tx_lfc_refresh, + input wire [47:0] cfg_tx_pfc_eth_dst, + input wire [47:0] cfg_tx_pfc_eth_src, + input wire [15:0] cfg_tx_pfc_eth_type, + input wire [15:0] cfg_tx_pfc_opcode, + input wire cfg_tx_pfc_en, + input wire [8*16-1:0] cfg_tx_pfc_quanta, + input wire [8*16-1:0] cfg_tx_pfc_refresh, + input wire [15:0] cfg_rx_lfc_opcode, + input wire cfg_rx_lfc_en, + input wire [15:0] cfg_rx_pfc_opcode, + input wire cfg_rx_pfc_en +); + +parameter MAC_CTRL_ENABLE = PAUSE_ENABLE || PFC_ENABLE; +parameter TX_USER_WIDTH_INT = MAC_CTRL_ENABLE ? (PTP_TS_ENABLE ? (TX_PTP_TAG_ENABLE ? TX_PTP_TAG_WIDTH : 0) + 1 : 0) + 1 : TX_USER_WIDTH; + +// bus width assertions +initial begin + if (DATA_WIDTH != 32 && DATA_WIDTH != 64) begin + $error("Error: Interface width must be 32 or 64"); + $finish; + end + + if (KEEP_WIDTH * 8 != DATA_WIDTH || CTRL_WIDTH * 8 != DATA_WIDTH) begin + $error("Error: Interface requires byte (8-bit) granularity"); + $finish; + end +end + +wire [DATA_WIDTH-1:0] tx_axis_tdata_int; +wire [KEEP_WIDTH-1:0] tx_axis_tkeep_int; +wire tx_axis_tvalid_int; +wire tx_axis_tready_int; +wire tx_axis_tlast_int; +wire [TX_USER_WIDTH_INT-1:0] tx_axis_tuser_int; + +wire [DATA_WIDTH-1:0] rx_axis_tdata_int; +wire [KEEP_WIDTH-1:0] rx_axis_tkeep_int; +wire rx_axis_tvalid_int; +wire rx_axis_tlast_int; +wire [RX_USER_WIDTH-1:0] rx_axis_tuser_int; + +generate + +if (DATA_WIDTH == 64) begin + +axis_xgmii_rx_64 #( + .DATA_WIDTH(DATA_WIDTH), + .KEEP_WIDTH(KEEP_WIDTH), + .CTRL_WIDTH(CTRL_WIDTH), + .PTP_TS_ENABLE(PTP_TS_ENABLE), + .PTP_TS_FMT_TOD(PTP_TS_FMT_TOD), + .PTP_TS_WIDTH(PTP_TS_WIDTH), + .USER_WIDTH(RX_USER_WIDTH) +) +axis_xgmii_rx_inst ( + .clk(rx_clk), + .rst(rx_rst), + .xgmii_rxd(xgmii_rxd), + .xgmii_rxc(xgmii_rxc), + .m_axis_tdata(rx_axis_tdata_int), + .m_axis_tkeep(rx_axis_tkeep_int), + .m_axis_tvalid(rx_axis_tvalid_int), + .m_axis_tlast(rx_axis_tlast_int), + .m_axis_tuser(rx_axis_tuser_int), + .ptp_ts(rx_ptp_ts), + .cfg_rx_enable(cfg_rx_enable), + .start_packet(rx_start_packet), + .error_bad_frame(rx_error_bad_frame), + .error_bad_fcs(rx_error_bad_fcs) +); + +axis_xgmii_tx_64 #( + .DATA_WIDTH(DATA_WIDTH), + .KEEP_WIDTH(KEEP_WIDTH), + .CTRL_WIDTH(CTRL_WIDTH), + .ENABLE_PADDING(ENABLE_PADDING), + .ENABLE_DIC(ENABLE_DIC), + .MIN_FRAME_LENGTH(MIN_FRAME_LENGTH), + .PTP_TS_ENABLE(PTP_TS_ENABLE), + .PTP_TS_FMT_TOD(PTP_TS_FMT_TOD), + .PTP_TS_WIDTH(PTP_TS_WIDTH), + .PTP_TS_CTRL_IN_TUSER(MAC_CTRL_ENABLE ? PTP_TS_ENABLE : TX_PTP_TS_CTRL_IN_TUSER), + .PTP_TAG_ENABLE(TX_PTP_TAG_ENABLE), + .PTP_TAG_WIDTH(TX_PTP_TAG_WIDTH), + .USER_WIDTH(TX_USER_WIDTH_INT) +) +axis_xgmii_tx_inst ( + .clk(tx_clk), + .rst(tx_rst), + .s_axis_tdata(tx_axis_tdata_int), + .s_axis_tkeep(tx_axis_tkeep_int), + .s_axis_tvalid(tx_axis_tvalid_int), + .s_axis_tready(tx_axis_tready_int), + .s_axis_tlast(tx_axis_tlast_int), + .s_axis_tuser(tx_axis_tuser_int), + .xgmii_txd(xgmii_txd), + .xgmii_txc(xgmii_txc), + .ptp_ts(tx_ptp_ts), + .m_axis_ptp_ts(tx_axis_ptp_ts), + .m_axis_ptp_ts_tag(tx_axis_ptp_ts_tag), + .m_axis_ptp_ts_valid(tx_axis_ptp_ts_valid), + .cfg_ifg(cfg_ifg), + .cfg_tx_enable(cfg_tx_enable), + .start_packet(tx_start_packet), + .error_underflow(tx_error_underflow) +); + +end else begin + +axis_xgmii_rx_32 #( + .DATA_WIDTH(DATA_WIDTH), + .KEEP_WIDTH(KEEP_WIDTH), + .CTRL_WIDTH(CTRL_WIDTH), + .PTP_TS_ENABLE(PTP_TS_ENABLE), + .PTP_TS_WIDTH(PTP_TS_WIDTH), + .USER_WIDTH(RX_USER_WIDTH) +) +axis_xgmii_rx_inst ( + .clk(rx_clk), + .rst(rx_rst), + .xgmii_rxd(xgmii_rxd), + .xgmii_rxc(xgmii_rxc), + .m_axis_tdata(rx_axis_tdata_int), + .m_axis_tkeep(rx_axis_tkeep_int), + .m_axis_tvalid(rx_axis_tvalid_int), + .m_axis_tlast(rx_axis_tlast_int), + .m_axis_tuser(rx_axis_tuser_int), + .ptp_ts(rx_ptp_ts), + .cfg_rx_enable(cfg_rx_enable), + .start_packet(rx_start_packet[0]), + .error_bad_frame(rx_error_bad_frame), + .error_bad_fcs(rx_error_bad_fcs) +); + +assign rx_start_packet[1] = 1'b0; + +axis_xgmii_tx_32 #( + .DATA_WIDTH(DATA_WIDTH), + .KEEP_WIDTH(KEEP_WIDTH), + .CTRL_WIDTH(CTRL_WIDTH), + .ENABLE_PADDING(ENABLE_PADDING), + .ENABLE_DIC(ENABLE_DIC), + .MIN_FRAME_LENGTH(MIN_FRAME_LENGTH), + .PTP_TS_ENABLE(PTP_TS_ENABLE), + .PTP_TS_WIDTH(PTP_TS_WIDTH), + .PTP_TS_CTRL_IN_TUSER(MAC_CTRL_ENABLE ? PTP_TS_ENABLE : TX_PTP_TS_CTRL_IN_TUSER), + .PTP_TAG_ENABLE(TX_PTP_TAG_ENABLE), + .PTP_TAG_WIDTH(TX_PTP_TAG_WIDTH), + .USER_WIDTH(TX_USER_WIDTH_INT) +) +axis_xgmii_tx_inst ( + .clk(tx_clk), + .rst(tx_rst), + .s_axis_tdata(tx_axis_tdata_int), + .s_axis_tkeep(tx_axis_tkeep_int), + .s_axis_tvalid(tx_axis_tvalid_int), + .s_axis_tready(tx_axis_tready_int), + .s_axis_tlast(tx_axis_tlast_int), + .s_axis_tuser(tx_axis_tuser_int), + .xgmii_txd(xgmii_txd), + .xgmii_txc(xgmii_txc), + .ptp_ts(tx_ptp_ts), + .m_axis_ptp_ts(tx_axis_ptp_ts), + .m_axis_ptp_ts_tag(tx_axis_ptp_ts_tag), + .m_axis_ptp_ts_valid(tx_axis_ptp_ts_valid), + .cfg_ifg(cfg_ifg), + .cfg_tx_enable(cfg_tx_enable), + .start_packet(tx_start_packet[0]), + .error_underflow(tx_error_underflow) +); + +assign tx_start_packet[1] = 1'b0; + +end + +if (MAC_CTRL_ENABLE) begin : mac_ctrl + + localparam MCF_PARAMS_SIZE = PFC_ENABLE ? 18 : 2; + + wire tx_mcf_valid; + wire tx_mcf_ready; + wire [47:0] tx_mcf_eth_dst; + wire [47:0] tx_mcf_eth_src; + wire [15:0] tx_mcf_eth_type; + wire [15:0] tx_mcf_opcode; + wire [MCF_PARAMS_SIZE*8-1:0] tx_mcf_params; + + wire rx_mcf_valid; + wire [47:0] rx_mcf_eth_dst; + wire [47:0] rx_mcf_eth_src; + wire [15:0] rx_mcf_eth_type; + wire [15:0] rx_mcf_opcode; + wire [MCF_PARAMS_SIZE*8-1:0] rx_mcf_params; + + // terminate LFC pause requests from RX internally on TX side + wire tx_pause_req_int; + wire rx_lfc_ack_int; + + reg tx_lfc_req_sync_reg_1 = 1'b0; + reg tx_lfc_req_sync_reg_2 = 1'b0; + reg tx_lfc_req_sync_reg_3 = 1'b0; + + always @(posedge rx_clk or posedge rx_rst) begin + if (rx_rst) begin + tx_lfc_req_sync_reg_1 <= 1'b0; + end else begin + tx_lfc_req_sync_reg_1 <= rx_lfc_req; + end + end + + always @(posedge tx_clk or posedge tx_rst) begin + if (tx_rst) begin + tx_lfc_req_sync_reg_2 <= 1'b0; + tx_lfc_req_sync_reg_3 <= 1'b0; + end else begin + tx_lfc_req_sync_reg_2 <= tx_lfc_req_sync_reg_1; + tx_lfc_req_sync_reg_3 <= tx_lfc_req_sync_reg_2; + end + end + + reg rx_lfc_ack_sync_reg_1 = 1'b0; + reg rx_lfc_ack_sync_reg_2 = 1'b0; + reg rx_lfc_ack_sync_reg_3 = 1'b0; + + always @(posedge tx_clk or posedge tx_rst) begin + if (tx_rst) begin + rx_lfc_ack_sync_reg_1 <= 1'b0; + end else begin + rx_lfc_ack_sync_reg_1 <= tx_lfc_pause_en ? tx_pause_ack : 0; + end + end + + always @(posedge rx_clk or posedge rx_rst) begin + if (rx_rst) begin + rx_lfc_ack_sync_reg_2 <= 1'b0; + rx_lfc_ack_sync_reg_3 <= 1'b0; + end else begin + rx_lfc_ack_sync_reg_2 <= rx_lfc_ack_sync_reg_1; + rx_lfc_ack_sync_reg_3 <= rx_lfc_ack_sync_reg_2; + end + end + + assign tx_pause_req_int = tx_pause_req || (tx_lfc_pause_en ? tx_lfc_req_sync_reg_3 : 0); + + assign rx_lfc_ack_int = rx_lfc_ack || rx_lfc_ack_sync_reg_3; + + // handle PTP TS enable bit in tuser + wire [TX_USER_WIDTH_INT-1:0] tx_axis_tuser_in; + + if (PTP_TS_ENABLE && !TX_PTP_TS_CTRL_IN_TUSER) begin + assign tx_axis_tuser_in = {tx_axis_tuser[TX_USER_WIDTH-1:1], 1'b1, tx_axis_tuser[0]}; + end else begin + assign tx_axis_tuser_in = tx_axis_tuser; + end + + mac_ctrl_tx #( + .DATA_WIDTH(DATA_WIDTH), + .KEEP_ENABLE(1), + .KEEP_WIDTH(KEEP_WIDTH), + .ID_ENABLE(0), + .DEST_ENABLE(0), + .USER_ENABLE(1), + .USER_WIDTH(TX_USER_WIDTH_INT), + .MCF_PARAMS_SIZE(MCF_PARAMS_SIZE) + ) + mac_ctrl_tx_inst ( + .clk(tx_clk), + .rst(tx_rst), + + /* + * AXI stream input + */ + .s_axis_tdata(tx_axis_tdata), + .s_axis_tkeep(tx_axis_tkeep), + .s_axis_tvalid(tx_axis_tvalid), + .s_axis_tready(tx_axis_tready), + .s_axis_tlast(tx_axis_tlast), + .s_axis_tid(0), + .s_axis_tdest(0), + .s_axis_tuser(tx_axis_tuser_in), + + /* + * AXI stream output + */ + .m_axis_tdata(tx_axis_tdata_int), + .m_axis_tkeep(tx_axis_tkeep_int), + .m_axis_tvalid(tx_axis_tvalid_int), + .m_axis_tready(tx_axis_tready_int), + .m_axis_tlast(tx_axis_tlast_int), + .m_axis_tid(), + .m_axis_tdest(), + .m_axis_tuser(tx_axis_tuser_int), + + /* + * MAC control frame interface + */ + .mcf_valid(tx_mcf_valid), + .mcf_ready(tx_mcf_ready), + .mcf_eth_dst(tx_mcf_eth_dst), + .mcf_eth_src(tx_mcf_eth_src), + .mcf_eth_type(tx_mcf_eth_type), + .mcf_opcode(tx_mcf_opcode), + .mcf_params(tx_mcf_params), + .mcf_id(0), + .mcf_dest(0), + .mcf_user(0), + + /* + * Pause interface + */ + .tx_pause_req(tx_pause_req_int), + .tx_pause_ack(tx_pause_ack), + + /* + * Status + */ + .stat_tx_mcf(stat_tx_mcf) + ); + + mac_ctrl_rx #( + .DATA_WIDTH(DATA_WIDTH), + .KEEP_ENABLE(1), + .KEEP_WIDTH(KEEP_WIDTH), + .ID_ENABLE(0), + .DEST_ENABLE(0), + .USER_ENABLE(1), + .USER_WIDTH(RX_USER_WIDTH), + .USE_READY(0), + .MCF_PARAMS_SIZE(MCF_PARAMS_SIZE) + ) + mac_ctrl_rx_inst ( + .clk(rx_clk), + .rst(rx_rst), + + /* + * AXI stream input + */ + .s_axis_tdata(rx_axis_tdata_int), + .s_axis_tkeep(rx_axis_tkeep_int), + .s_axis_tvalid(rx_axis_tvalid_int), + .s_axis_tready(), + .s_axis_tlast(rx_axis_tlast_int), + .s_axis_tid(0), + .s_axis_tdest(0), + .s_axis_tuser(rx_axis_tuser_int), + + /* + * AXI stream output + */ + .m_axis_tdata(rx_axis_tdata), + .m_axis_tkeep(rx_axis_tkeep), + .m_axis_tvalid(rx_axis_tvalid), + .m_axis_tready(1'b1), + .m_axis_tlast(rx_axis_tlast), + .m_axis_tid(), + .m_axis_tdest(), + .m_axis_tuser(rx_axis_tuser), + + /* + * MAC control frame interface + */ + .mcf_valid(rx_mcf_valid), + .mcf_eth_dst(rx_mcf_eth_dst), + .mcf_eth_src(rx_mcf_eth_src), + .mcf_eth_type(rx_mcf_eth_type), + .mcf_opcode(rx_mcf_opcode), + .mcf_params(rx_mcf_params), + .mcf_id(), + .mcf_dest(), + .mcf_user(), + + /* + * Configuration + */ + .cfg_mcf_rx_eth_dst_mcast(cfg_mcf_rx_eth_dst_mcast), + .cfg_mcf_rx_check_eth_dst_mcast(cfg_mcf_rx_check_eth_dst_mcast), + .cfg_mcf_rx_eth_dst_ucast(cfg_mcf_rx_eth_dst_ucast), + .cfg_mcf_rx_check_eth_dst_ucast(cfg_mcf_rx_check_eth_dst_ucast), + .cfg_mcf_rx_eth_src(cfg_mcf_rx_eth_src), + .cfg_mcf_rx_check_eth_src(cfg_mcf_rx_check_eth_src), + .cfg_mcf_rx_eth_type(cfg_mcf_rx_eth_type), + .cfg_mcf_rx_opcode_lfc(cfg_mcf_rx_opcode_lfc), + .cfg_mcf_rx_check_opcode_lfc(cfg_mcf_rx_check_opcode_lfc), + .cfg_mcf_rx_opcode_pfc(cfg_mcf_rx_opcode_pfc), + .cfg_mcf_rx_check_opcode_pfc(cfg_mcf_rx_check_opcode_pfc && PFC_ENABLE), + .cfg_mcf_rx_forward(cfg_mcf_rx_forward), + .cfg_mcf_rx_enable(cfg_mcf_rx_enable), + + /* + * Status + */ + .stat_rx_mcf(stat_rx_mcf) + ); + + mac_pause_ctrl_tx #( + .MCF_PARAMS_SIZE(MCF_PARAMS_SIZE), + .PFC_ENABLE(PFC_ENABLE) + ) + mac_pause_ctrl_tx_inst ( + .clk(tx_clk), + .rst(tx_rst), + + /* + * MAC control frame interface + */ + .mcf_valid(tx_mcf_valid), + .mcf_ready(tx_mcf_ready), + .mcf_eth_dst(tx_mcf_eth_dst), + .mcf_eth_src(tx_mcf_eth_src), + .mcf_eth_type(tx_mcf_eth_type), + .mcf_opcode(tx_mcf_opcode), + .mcf_params(tx_mcf_params), + + /* + * Pause (IEEE 802.3 annex 31B) + */ + .tx_lfc_req(tx_lfc_req), + .tx_lfc_resend(tx_lfc_resend), + + /* + * Priority Flow Control (PFC) (IEEE 802.3 annex 31D) + */ + .tx_pfc_req(tx_pfc_req), + .tx_pfc_resend(tx_pfc_resend), + + /* + * Configuration + */ + .cfg_tx_lfc_eth_dst(cfg_tx_lfc_eth_dst), + .cfg_tx_lfc_eth_src(cfg_tx_lfc_eth_src), + .cfg_tx_lfc_eth_type(cfg_tx_lfc_eth_type), + .cfg_tx_lfc_opcode(cfg_tx_lfc_opcode), + .cfg_tx_lfc_en(cfg_tx_lfc_en), + .cfg_tx_lfc_quanta(cfg_tx_lfc_quanta), + .cfg_tx_lfc_refresh(cfg_tx_lfc_refresh), + .cfg_tx_pfc_eth_dst(cfg_tx_pfc_eth_dst), + .cfg_tx_pfc_eth_src(cfg_tx_pfc_eth_src), + .cfg_tx_pfc_eth_type(cfg_tx_pfc_eth_type), + .cfg_tx_pfc_opcode(cfg_tx_pfc_opcode), + .cfg_tx_pfc_en(cfg_tx_pfc_en), + .cfg_tx_pfc_quanta(cfg_tx_pfc_quanta), + .cfg_tx_pfc_refresh(cfg_tx_pfc_refresh), + .cfg_quanta_step((DATA_WIDTH*256)/512), + .cfg_quanta_clk_en(1'b1), + + /* + * Status + */ + .stat_tx_lfc_pkt(stat_tx_lfc_pkt), + .stat_tx_lfc_xon(stat_tx_lfc_xon), + .stat_tx_lfc_xoff(stat_tx_lfc_xoff), + .stat_tx_lfc_paused(stat_tx_lfc_paused), + .stat_tx_pfc_pkt(stat_tx_pfc_pkt), + .stat_tx_pfc_xon(stat_tx_pfc_xon), + .stat_tx_pfc_xoff(stat_tx_pfc_xoff), + .stat_tx_pfc_paused(stat_tx_pfc_paused) + ); + + mac_pause_ctrl_rx #( + .MCF_PARAMS_SIZE(18), + .PFC_ENABLE(PFC_ENABLE) + ) + mac_pause_ctrl_rx_inst ( + .clk(rx_clk), + .rst(rx_rst), + + /* + * MAC control frame interface + */ + .mcf_valid(rx_mcf_valid), + .mcf_eth_dst(rx_mcf_eth_dst), + .mcf_eth_src(rx_mcf_eth_src), + .mcf_eth_type(rx_mcf_eth_type), + .mcf_opcode(rx_mcf_opcode), + .mcf_params(rx_mcf_params), + + /* + * Pause (IEEE 802.3 annex 31B) + */ + .rx_lfc_en(rx_lfc_en), + .rx_lfc_req(rx_lfc_req), + .rx_lfc_ack(rx_lfc_ack_int), + + /* + * Priority Flow Control (PFC) (IEEE 802.3 annex 31D) + */ + .rx_pfc_en(rx_pfc_en), + .rx_pfc_req(rx_pfc_req), + .rx_pfc_ack(rx_pfc_ack), + + /* + * Configuration + */ + .cfg_rx_lfc_opcode(cfg_rx_lfc_opcode), + .cfg_rx_lfc_en(cfg_rx_lfc_en), + .cfg_rx_pfc_opcode(cfg_rx_pfc_opcode), + .cfg_rx_pfc_en(cfg_rx_pfc_en), + .cfg_quanta_step((DATA_WIDTH*256)/512), + .cfg_quanta_clk_en(1'b1), + + /* + * Status + */ + .stat_rx_lfc_pkt(stat_rx_lfc_pkt), + .stat_rx_lfc_xon(stat_rx_lfc_xon), + .stat_rx_lfc_xoff(stat_rx_lfc_xoff), + .stat_rx_lfc_paused(stat_rx_lfc_paused), + .stat_rx_pfc_pkt(stat_rx_pfc_pkt), + .stat_rx_pfc_xon(stat_rx_pfc_xon), + .stat_rx_pfc_xoff(stat_rx_pfc_xoff), + .stat_rx_pfc_paused(stat_rx_pfc_paused) + ); + +end else begin + + assign tx_axis_tdata_int = tx_axis_tdata; + assign tx_axis_tkeep_int = tx_axis_tkeep; + assign tx_axis_tvalid_int = tx_axis_tvalid; + assign tx_axis_tready = tx_axis_tready_int; + assign tx_axis_tlast_int = tx_axis_tlast; + assign tx_axis_tuser_int = tx_axis_tuser; + + assign rx_axis_tdata = rx_axis_tdata_int; + assign rx_axis_tkeep = rx_axis_tkeep_int; + assign rx_axis_tvalid = rx_axis_tvalid_int; + assign rx_axis_tlast = rx_axis_tlast_int; + assign rx_axis_tuser = rx_axis_tuser_int; + + assign rx_lfc_req = 0; + assign rx_pfc_req = 0; + assign tx_pause_ack = 0; + + assign stat_tx_mcf = 0; + assign stat_rx_mcf = 0; + assign stat_tx_lfc_pkt = 0; + assign stat_tx_lfc_xon = 0; + assign stat_tx_lfc_xoff = 0; + assign stat_tx_lfc_paused = 0; + assign stat_tx_pfc_pkt = 0; + assign stat_tx_pfc_xon = 0; + assign stat_tx_pfc_xoff = 0; + assign stat_tx_pfc_paused = 0; + assign stat_rx_lfc_pkt = 0; + assign stat_rx_lfc_xon = 0; + assign stat_rx_lfc_xoff = 0; + assign stat_rx_lfc_paused = 0; + assign stat_rx_pfc_pkt = 0; + assign stat_rx_pfc_xon = 0; + assign stat_rx_pfc_xoff = 0; + assign stat_rx_pfc_paused = 0; + +end + +endgenerate + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_mac_10g_fifo.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_mac_10g_fifo.v new file mode 100755 index 0000000..21c5e38 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_mac_10g_fifo.v @@ -0,0 +1,488 @@ +/* + +Copyright (c) 2015-2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * 10G Ethernet MAC with TX and RX FIFOs + */ +module eth_mac_10g_fifo # +( + parameter DATA_WIDTH = 64, + parameter CTRL_WIDTH = (DATA_WIDTH/8), + parameter AXIS_DATA_WIDTH = DATA_WIDTH, + parameter AXIS_KEEP_ENABLE = (AXIS_DATA_WIDTH>8), + parameter AXIS_KEEP_WIDTH = (AXIS_DATA_WIDTH/8), + parameter ENABLE_PADDING = 1, + parameter ENABLE_DIC = 1, + parameter MIN_FRAME_LENGTH = 64, + parameter TX_FIFO_DEPTH = 4096, + parameter TX_FIFO_RAM_PIPELINE = 1, + parameter TX_FRAME_FIFO = 1, + parameter TX_DROP_OVERSIZE_FRAME = TX_FRAME_FIFO, + parameter TX_DROP_BAD_FRAME = TX_DROP_OVERSIZE_FRAME, + parameter TX_DROP_WHEN_FULL = 0, + parameter RX_FIFO_DEPTH = 4096, + parameter RX_FIFO_RAM_PIPELINE = 1, + parameter RX_FRAME_FIFO = 1, + parameter RX_DROP_OVERSIZE_FRAME = RX_FRAME_FIFO, + parameter RX_DROP_BAD_FRAME = RX_DROP_OVERSIZE_FRAME, + parameter RX_DROP_WHEN_FULL = RX_DROP_OVERSIZE_FRAME, + parameter PTP_TS_ENABLE = 0, + parameter PTP_TS_FMT_TOD = 1, + parameter PTP_TS_WIDTH = PTP_TS_FMT_TOD ? 96 : 64, + parameter TX_PTP_TS_CTRL_IN_TUSER = 0, + parameter TX_PTP_TS_FIFO_DEPTH = 64, + parameter TX_PTP_TAG_ENABLE = PTP_TS_ENABLE, + parameter PTP_TAG_WIDTH = 16, + parameter TX_USER_WIDTH = (PTP_TS_ENABLE ? (TX_PTP_TAG_ENABLE ? PTP_TAG_WIDTH : 0) + (TX_PTP_TS_CTRL_IN_TUSER ? 1 : 0) : 0) + 1, + parameter RX_USER_WIDTH = (PTP_TS_ENABLE ? PTP_TS_WIDTH : 0) + 1 +) +( + input wire rx_clk, + input wire rx_rst, + input wire tx_clk, + input wire tx_rst, + input wire logic_clk, + input wire logic_rst, + input wire ptp_sample_clk, + + /* + * AXI input + */ + input wire [AXIS_DATA_WIDTH-1:0] tx_axis_tdata, + input wire [AXIS_KEEP_WIDTH-1:0] tx_axis_tkeep, + input wire tx_axis_tvalid, + output wire tx_axis_tready, + input wire tx_axis_tlast, + input wire [TX_USER_WIDTH-1:0] tx_axis_tuser, + + /* + * Transmit timestamp output + */ + output wire [PTP_TS_WIDTH-1:0] m_axis_tx_ptp_ts_96, + output wire [PTP_TAG_WIDTH-1:0] m_axis_tx_ptp_ts_tag, + output wire m_axis_tx_ptp_ts_valid, + input wire m_axis_tx_ptp_ts_ready, + + /* + * AXI output + */ + output wire [AXIS_DATA_WIDTH-1:0] rx_axis_tdata, + output wire [AXIS_KEEP_WIDTH-1:0] rx_axis_tkeep, + output wire rx_axis_tvalid, + input wire rx_axis_tready, + output wire rx_axis_tlast, + output wire [RX_USER_WIDTH-1:0] rx_axis_tuser, + + /* + * XGMII interface + */ + input wire [DATA_WIDTH-1:0] xgmii_rxd, + input wire [CTRL_WIDTH-1:0] xgmii_rxc, + output wire [DATA_WIDTH-1:0] xgmii_txd, + output wire [CTRL_WIDTH-1:0] xgmii_txc, + + /* + * Status + */ + output wire tx_error_underflow, + output wire tx_fifo_overflow, + output wire tx_fifo_bad_frame, + output wire tx_fifo_good_frame, + output wire rx_error_bad_frame, + output wire rx_error_bad_fcs, + output wire rx_fifo_overflow, + output wire rx_fifo_bad_frame, + output wire rx_fifo_good_frame, + + /* + * PTP clock + */ + input wire [PTP_TS_WIDTH-1:0] ptp_ts_96, + input wire ptp_ts_step, + + /* + * Configuration + */ + input wire [7:0] cfg_ifg, + input wire cfg_tx_enable, + input wire cfg_rx_enable +); + +parameter KEEP_WIDTH = DATA_WIDTH/8; + +wire [DATA_WIDTH-1:0] tx_fifo_axis_tdata; +wire [KEEP_WIDTH-1:0] tx_fifo_axis_tkeep; +wire tx_fifo_axis_tvalid; +wire tx_fifo_axis_tready; +wire tx_fifo_axis_tlast; +wire [TX_USER_WIDTH-1:0] tx_fifo_axis_tuser; + +wire [DATA_WIDTH-1:0] rx_fifo_axis_tdata; +wire [KEEP_WIDTH-1:0] rx_fifo_axis_tkeep; +wire rx_fifo_axis_tvalid; +wire rx_fifo_axis_tlast; +wire [RX_USER_WIDTH-1:0] rx_fifo_axis_tuser; + +wire [PTP_TS_WIDTH-1:0] tx_ptp_ts_96; +wire [PTP_TS_WIDTH-1:0] rx_ptp_ts_96; + +wire [PTP_TS_WIDTH-1:0] tx_axis_ptp_ts_96; +wire [PTP_TAG_WIDTH-1:0] tx_axis_ptp_ts_tag; +wire tx_axis_ptp_ts_valid; + +// synchronize MAC status signals into logic clock domain +wire tx_error_underflow_int; + +reg [0:0] tx_sync_reg_1 = 1'b0; +reg [0:0] tx_sync_reg_2 = 1'b0; +reg [0:0] tx_sync_reg_3 = 1'b0; +reg [0:0] tx_sync_reg_4 = 1'b0; + +assign tx_error_underflow = tx_sync_reg_3[0] ^ tx_sync_reg_4[0]; + +always @(posedge tx_clk or posedge tx_rst) begin + if (tx_rst) begin + tx_sync_reg_1 <= 1'b0; + end else begin + tx_sync_reg_1 <= tx_sync_reg_1 ^ {tx_error_underflow_int}; + end +end + +always @(posedge logic_clk or posedge logic_rst) begin + if (logic_rst) begin + tx_sync_reg_2 <= 1'b0; + tx_sync_reg_3 <= 1'b0; + tx_sync_reg_4 <= 1'b0; + end else begin + tx_sync_reg_2 <= tx_sync_reg_1; + tx_sync_reg_3 <= tx_sync_reg_2; + tx_sync_reg_4 <= tx_sync_reg_3; + end +end + +wire rx_error_bad_frame_int; +wire rx_error_bad_fcs_int; + +reg [1:0] rx_sync_reg_1 = 2'd0; +reg [1:0] rx_sync_reg_2 = 2'd0; +reg [1:0] rx_sync_reg_3 = 2'd0; +reg [1:0] rx_sync_reg_4 = 2'd0; + +assign rx_error_bad_frame = rx_sync_reg_3[0] ^ rx_sync_reg_4[0]; +assign rx_error_bad_fcs = rx_sync_reg_3[1] ^ rx_sync_reg_4[1]; + +always @(posedge rx_clk or posedge rx_rst) begin + if (rx_rst) begin + rx_sync_reg_1 <= 2'd0; + end else begin + rx_sync_reg_1 <= rx_sync_reg_1 ^ {rx_error_bad_fcs_int, rx_error_bad_frame_int}; + end +end + +always @(posedge logic_clk or posedge logic_rst) begin + if (logic_rst) begin + rx_sync_reg_2 <= 2'd0; + rx_sync_reg_3 <= 2'd0; + rx_sync_reg_4 <= 2'd0; + end else begin + rx_sync_reg_2 <= rx_sync_reg_1; + rx_sync_reg_3 <= rx_sync_reg_2; + rx_sync_reg_4 <= rx_sync_reg_3; + end +end + +// PTP timestamping +generate + +if (PTP_TS_ENABLE) begin : tx_ptp + + ptp_clock_cdc #( + .TS_WIDTH(PTP_TS_WIDTH), + .NS_WIDTH(6) + ) + tx_ptp_cdc ( + .input_clk(logic_clk), + .input_rst(logic_rst), + .output_clk(tx_clk), + .output_rst(tx_rst), + .sample_clk(ptp_sample_clk), + .input_ts(ptp_ts_96), + .input_ts_step(ptp_ts_step), + .output_ts(tx_ptp_ts_96), + .output_ts_step(), + .output_pps(), + .locked() + ); + + axis_async_fifo #( + .DEPTH(TX_PTP_TS_FIFO_DEPTH), + .DATA_WIDTH(PTP_TS_WIDTH), + .KEEP_ENABLE(0), + .LAST_ENABLE(0), + .ID_ENABLE(TX_PTP_TAG_ENABLE), + .ID_WIDTH(PTP_TAG_WIDTH), + .DEST_ENABLE(0), + .USER_ENABLE(0), + .FRAME_FIFO(0) + ) + tx_ptp_ts_fifo ( + // AXI input + .s_clk(tx_clk), + .s_rst(tx_rst), + .s_axis_tdata(tx_axis_ptp_ts_96), + .s_axis_tkeep(0), + .s_axis_tvalid(tx_axis_ptp_ts_valid), + .s_axis_tready(), + .s_axis_tlast(0), + .s_axis_tid(tx_axis_ptp_ts_tag), + .s_axis_tdest(0), + .s_axis_tuser(0), + + // AXI output + .m_clk(logic_clk), + .m_rst(logic_rst), + .m_axis_tdata(m_axis_tx_ptp_ts_96), + .m_axis_tkeep(), + .m_axis_tvalid(m_axis_tx_ptp_ts_valid), + .m_axis_tready(m_axis_tx_ptp_ts_ready), + .m_axis_tlast(), + .m_axis_tid(m_axis_tx_ptp_ts_tag), + .m_axis_tdest(), + .m_axis_tuser(), + + // Status + .s_status_overflow(), + .s_status_bad_frame(), + .s_status_good_frame(), + .m_status_overflow(), + .m_status_bad_frame(), + .m_status_good_frame() + ); + +end else begin + + assign m_axis_tx_ptp_ts_96 = {PTP_TS_WIDTH{1'b0}}; + assign m_axis_tx_ptp_ts_tag = {PTP_TAG_WIDTH{1'b0}}; + assign m_axis_tx_ptp_ts_valid = 1'b0; + + assign tx_ptp_ts_96 = {PTP_TS_WIDTH{1'b0}}; + +end + +if (PTP_TS_ENABLE) begin : rx_ptp + + ptp_clock_cdc #( + .TS_WIDTH(PTP_TS_WIDTH), + .NS_WIDTH(6) + ) + rx_ptp_cdc ( + .input_clk(logic_clk), + .input_rst(logic_rst), + .output_clk(rx_clk), + .output_rst(rx_rst), + .sample_clk(ptp_sample_clk), + .input_ts(ptp_ts_96), + .input_ts_step(ptp_ts_step), + .output_ts(rx_ptp_ts_96), + .output_ts_step(), + .output_pps(), + .locked() + ); + +end else begin + + assign rx_ptp_ts_96 = {PTP_TS_WIDTH{1'b0}}; + +end + +endgenerate + +eth_mac_10g #( + .DATA_WIDTH(DATA_WIDTH), + .KEEP_WIDTH(KEEP_WIDTH), + .CTRL_WIDTH(CTRL_WIDTH), + .ENABLE_PADDING(ENABLE_PADDING), + .ENABLE_DIC(ENABLE_DIC), + .MIN_FRAME_LENGTH(MIN_FRAME_LENGTH), + .PTP_TS_ENABLE(PTP_TS_ENABLE), + .PTP_TS_FMT_TOD(PTP_TS_FMT_TOD), + .PTP_TS_WIDTH(PTP_TS_WIDTH), + .TX_PTP_TS_CTRL_IN_TUSER(TX_PTP_TS_CTRL_IN_TUSER), + .TX_PTP_TAG_ENABLE(TX_PTP_TAG_ENABLE), + .TX_PTP_TAG_WIDTH(PTP_TAG_WIDTH), + .TX_USER_WIDTH(TX_USER_WIDTH), + .RX_USER_WIDTH(RX_USER_WIDTH) +) +eth_mac_10g_inst ( + .tx_clk(tx_clk), + .tx_rst(tx_rst), + .rx_clk(rx_clk), + .rx_rst(rx_rst), + + .tx_axis_tdata(tx_fifo_axis_tdata), + .tx_axis_tkeep(tx_fifo_axis_tkeep), + .tx_axis_tvalid(tx_fifo_axis_tvalid), + .tx_axis_tready(tx_fifo_axis_tready), + .tx_axis_tlast(tx_fifo_axis_tlast), + .tx_axis_tuser(tx_fifo_axis_tuser), + + .rx_axis_tdata(rx_fifo_axis_tdata), + .rx_axis_tkeep(rx_fifo_axis_tkeep), + .rx_axis_tvalid(rx_fifo_axis_tvalid), + .rx_axis_tlast(rx_fifo_axis_tlast), + .rx_axis_tuser(rx_fifo_axis_tuser), + + .xgmii_rxd(xgmii_rxd), + .xgmii_rxc(xgmii_rxc), + .xgmii_txd(xgmii_txd), + .xgmii_txc(xgmii_txc), + + .tx_ptp_ts(tx_ptp_ts_96), + .rx_ptp_ts(rx_ptp_ts_96), + .tx_axis_ptp_ts(tx_axis_ptp_ts_96), + .tx_axis_ptp_ts_tag(tx_axis_ptp_ts_tag), + .tx_axis_ptp_ts_valid(tx_axis_ptp_ts_valid), + + .tx_error_underflow(tx_error_underflow_int), + .rx_error_bad_frame(rx_error_bad_frame_int), + .rx_error_bad_fcs(rx_error_bad_fcs_int), + + .cfg_ifg(cfg_ifg), + .cfg_tx_enable(cfg_tx_enable), + .cfg_rx_enable(cfg_rx_enable) +); + +axis_async_fifo_adapter #( + .DEPTH(TX_FIFO_DEPTH), + .S_DATA_WIDTH(AXIS_DATA_WIDTH), + .S_KEEP_ENABLE(AXIS_KEEP_ENABLE), + .S_KEEP_WIDTH(AXIS_KEEP_WIDTH), + .M_DATA_WIDTH(DATA_WIDTH), + .M_KEEP_ENABLE(1), + .M_KEEP_WIDTH(KEEP_WIDTH), + .ID_ENABLE(0), + .DEST_ENABLE(0), + .USER_ENABLE(1), + .USER_WIDTH(TX_USER_WIDTH), + .RAM_PIPELINE(TX_FIFO_RAM_PIPELINE), + .FRAME_FIFO(TX_FRAME_FIFO), + .USER_BAD_FRAME_VALUE(1'b1), + .USER_BAD_FRAME_MASK(1'b1), + .DROP_OVERSIZE_FRAME(TX_DROP_OVERSIZE_FRAME), + .DROP_BAD_FRAME(TX_DROP_BAD_FRAME), + .DROP_WHEN_FULL(TX_DROP_WHEN_FULL) +) +tx_fifo ( + // AXI input + .s_clk(logic_clk), + .s_rst(logic_rst), + .s_axis_tdata(tx_axis_tdata), + .s_axis_tkeep(tx_axis_tkeep), + .s_axis_tvalid(tx_axis_tvalid), + .s_axis_tready(tx_axis_tready), + .s_axis_tlast(tx_axis_tlast), + .s_axis_tid(0), + .s_axis_tdest(0), + .s_axis_tuser(tx_axis_tuser), + // AXI output + .m_clk(tx_clk), + .m_rst(tx_rst), + .m_axis_tdata(tx_fifo_axis_tdata), + .m_axis_tkeep(tx_fifo_axis_tkeep), + .m_axis_tvalid(tx_fifo_axis_tvalid), + .m_axis_tready(tx_fifo_axis_tready), + .m_axis_tlast(tx_fifo_axis_tlast), + .m_axis_tid(), + .m_axis_tdest(), + .m_axis_tuser(tx_fifo_axis_tuser), + // Status + .s_status_overflow(tx_fifo_overflow), + .s_status_bad_frame(tx_fifo_bad_frame), + .s_status_good_frame(tx_fifo_good_frame), + .m_status_overflow(), + .m_status_bad_frame(), + .m_status_good_frame() +); + +axis_async_fifo_adapter #( + .DEPTH(RX_FIFO_DEPTH), + .S_DATA_WIDTH(DATA_WIDTH), + .S_KEEP_ENABLE(1), + .S_KEEP_WIDTH(KEEP_WIDTH), + .M_DATA_WIDTH(AXIS_DATA_WIDTH), + .M_KEEP_ENABLE(AXIS_KEEP_ENABLE), + .M_KEEP_WIDTH(AXIS_KEEP_WIDTH), + .ID_ENABLE(0), + .DEST_ENABLE(0), + .USER_ENABLE(1), + .USER_WIDTH(RX_USER_WIDTH), + .RAM_PIPELINE(RX_FIFO_RAM_PIPELINE), + .FRAME_FIFO(RX_FRAME_FIFO), + .USER_BAD_FRAME_VALUE(1'b1), + .USER_BAD_FRAME_MASK(1'b1), + .DROP_OVERSIZE_FRAME(RX_DROP_OVERSIZE_FRAME), + .DROP_BAD_FRAME(RX_DROP_BAD_FRAME), + .DROP_WHEN_FULL(RX_DROP_WHEN_FULL) +) +rx_fifo ( + // AXI input + .s_clk(rx_clk), + .s_rst(rx_rst), + .s_axis_tdata(rx_fifo_axis_tdata), + .s_axis_tkeep(rx_fifo_axis_tkeep), + .s_axis_tvalid(rx_fifo_axis_tvalid), + .s_axis_tready(), + .s_axis_tlast(rx_fifo_axis_tlast), + .s_axis_tid(0), + .s_axis_tdest(0), + .s_axis_tuser(rx_fifo_axis_tuser), + // AXI output + .m_clk(logic_clk), + .m_rst(logic_rst), + .m_axis_tdata(rx_axis_tdata), + .m_axis_tkeep(rx_axis_tkeep), + .m_axis_tvalid(rx_axis_tvalid), + .m_axis_tready(rx_axis_tready), + .m_axis_tlast(rx_axis_tlast), + .m_axis_tid(), + .m_axis_tdest(), + .m_axis_tuser(rx_axis_tuser), + // Status + .s_status_overflow(), + .s_status_bad_frame(), + .s_status_good_frame(), + .m_status_overflow(rx_fifo_overflow), + .m_status_bad_frame(rx_fifo_bad_frame), + .m_status_good_frame(rx_fifo_good_frame) +); + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g.v new file mode 100755 index 0000000..c26af21 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g.v @@ -0,0 +1,142 @@ +/* + +Copyright (c) 2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * 10G Ethernet PHY + */ +module eth_phy_10g # +( + parameter DATA_WIDTH = 64, + parameter CTRL_WIDTH = (DATA_WIDTH/8), + parameter HDR_WIDTH = 2, + parameter BIT_REVERSE = 0, + parameter SCRAMBLER_DISABLE = 0, + parameter PRBS31_ENABLE = 0, + parameter TX_SERDES_PIPELINE = 0, + parameter RX_SERDES_PIPELINE = 0, + parameter BITSLIP_HIGH_CYCLES = 1, + parameter BITSLIP_LOW_CYCLES = 8, + parameter COUNT_125US = 125000/6.4 +) +( + input wire rx_clk, + input wire rx_rst, + input wire tx_clk, + input wire tx_rst, + + /* + * XGMII interface + */ + input wire [DATA_WIDTH-1:0] xgmii_txd, + input wire [CTRL_WIDTH-1:0] xgmii_txc, + output wire [DATA_WIDTH-1:0] xgmii_rxd, + output wire [CTRL_WIDTH-1:0] xgmii_rxc, + + /* + * SERDES interface + */ + output wire [DATA_WIDTH-1:0] serdes_tx_data, + output wire [HDR_WIDTH-1:0] serdes_tx_hdr, + input wire [DATA_WIDTH-1:0] serdes_rx_data, + input wire [HDR_WIDTH-1:0] serdes_rx_hdr, + output wire serdes_rx_bitslip, + output wire serdes_rx_reset_req, + + /* + * Status + */ + output wire tx_bad_block, + output wire [6:0] rx_error_count, + output wire rx_bad_block, + output wire rx_sequence_error, + output wire rx_block_lock, + output wire rx_high_ber, + output wire rx_status, + + /* + * Configuration + */ + input wire cfg_tx_prbs31_enable, + input wire cfg_rx_prbs31_enable +); + +eth_phy_10g_rx #( + .DATA_WIDTH(DATA_WIDTH), + .CTRL_WIDTH(CTRL_WIDTH), + .HDR_WIDTH(HDR_WIDTH), + .BIT_REVERSE(BIT_REVERSE), + .SCRAMBLER_DISABLE(SCRAMBLER_DISABLE), + .PRBS31_ENABLE(PRBS31_ENABLE), + .SERDES_PIPELINE(RX_SERDES_PIPELINE), + .BITSLIP_HIGH_CYCLES(BITSLIP_HIGH_CYCLES), + .BITSLIP_LOW_CYCLES(BITSLIP_LOW_CYCLES), + .COUNT_125US(COUNT_125US) +) +eth_phy_10g_rx_inst ( + .clk(rx_clk), + .rst(rx_rst), + .xgmii_rxd(xgmii_rxd), + .xgmii_rxc(xgmii_rxc), + .serdes_rx_data(serdes_rx_data), + .serdes_rx_hdr(serdes_rx_hdr), + .serdes_rx_bitslip(serdes_rx_bitslip), + .serdes_rx_reset_req(serdes_rx_reset_req), + .rx_error_count(rx_error_count), + .rx_bad_block(rx_bad_block), + .rx_sequence_error(rx_sequence_error), + .rx_block_lock(rx_block_lock), + .rx_high_ber(rx_high_ber), + .rx_status(rx_status), + .cfg_rx_prbs31_enable(cfg_rx_prbs31_enable) +); + +eth_phy_10g_tx #( + .DATA_WIDTH(DATA_WIDTH), + .CTRL_WIDTH(CTRL_WIDTH), + .HDR_WIDTH(HDR_WIDTH), + .BIT_REVERSE(BIT_REVERSE), + .SCRAMBLER_DISABLE(SCRAMBLER_DISABLE), + .PRBS31_ENABLE(PRBS31_ENABLE), + .SERDES_PIPELINE(TX_SERDES_PIPELINE) +) +eth_phy_10g_tx_inst ( + .clk(tx_clk), + .rst(tx_rst), + .xgmii_txd(xgmii_txd), + .xgmii_txc(xgmii_txc), + .serdes_tx_data(serdes_tx_data), + .serdes_tx_hdr(serdes_tx_hdr), + .tx_bad_block(tx_bad_block), + .cfg_tx_prbs31_enable(cfg_tx_prbs31_enable) +); + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx.v new file mode 100755 index 0000000..f9030dd --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx.v @@ -0,0 +1,149 @@ +/* + +Copyright (c) 2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * 10G Ethernet PHY RX + */ +module eth_phy_10g_rx # +( + parameter DATA_WIDTH = 64, + parameter CTRL_WIDTH = (DATA_WIDTH/8), + parameter HDR_WIDTH = 2, + parameter BIT_REVERSE = 0, + parameter SCRAMBLER_DISABLE = 0, + parameter PRBS31_ENABLE = 0, + parameter SERDES_PIPELINE = 0, + parameter BITSLIP_HIGH_CYCLES = 1, + parameter BITSLIP_LOW_CYCLES = 8, + parameter COUNT_125US = 125000/6.4 +) +( + input wire clk, + input wire rst, + + /* + * XGMII interface + */ + output wire [DATA_WIDTH-1:0] xgmii_rxd, + output wire [CTRL_WIDTH-1:0] xgmii_rxc, + + /* + * SERDES interface + */ + input wire [DATA_WIDTH-1:0] serdes_rx_data, + input wire [HDR_WIDTH-1:0] serdes_rx_hdr, + output wire serdes_rx_bitslip, + output wire serdes_rx_reset_req, + + /* + * Status + */ + output wire [6:0] rx_error_count, + output wire rx_bad_block, + output wire rx_sequence_error, + output wire rx_block_lock, + output wire rx_high_ber, + output wire rx_status, + + /* + * Configuration + */ + input wire cfg_rx_prbs31_enable +); + +// bus width assertions +initial begin + if (DATA_WIDTH != 64) begin + $error("Error: Interface width must be 64"); + $finish; + end + + if (CTRL_WIDTH * 8 != DATA_WIDTH) begin + $error("Error: Interface requires byte (8-bit) granularity"); + $finish; + end + + if (HDR_WIDTH != 2) begin + $error("Error: HDR_WIDTH must be 2"); + $finish; + end +end + +wire [DATA_WIDTH-1:0] encoded_rx_data; +wire [HDR_WIDTH-1:0] encoded_rx_hdr; + +eth_phy_10g_rx_if #( + .DATA_WIDTH(DATA_WIDTH), + .HDR_WIDTH(HDR_WIDTH), + .BIT_REVERSE(BIT_REVERSE), + .SCRAMBLER_DISABLE(SCRAMBLER_DISABLE), + .PRBS31_ENABLE(PRBS31_ENABLE), + .SERDES_PIPELINE(SERDES_PIPELINE), + .BITSLIP_HIGH_CYCLES(BITSLIP_HIGH_CYCLES), + .BITSLIP_LOW_CYCLES(BITSLIP_LOW_CYCLES), + .COUNT_125US(COUNT_125US) +) +eth_phy_10g_rx_if_inst ( + .clk(clk), + .rst(rst), + .encoded_rx_data(encoded_rx_data), + .encoded_rx_hdr(encoded_rx_hdr), + .serdes_rx_data(serdes_rx_data), + .serdes_rx_hdr(serdes_rx_hdr), + .serdes_rx_bitslip(serdes_rx_bitslip), + .serdes_rx_reset_req(serdes_rx_reset_req), + .rx_bad_block(rx_bad_block), + .rx_sequence_error(rx_sequence_error), + .rx_error_count(rx_error_count), + .rx_block_lock(rx_block_lock), + .rx_high_ber(rx_high_ber), + .rx_status(rx_status), + .cfg_rx_prbs31_enable(cfg_rx_prbs31_enable) +); + +xgmii_baser_dec_64 #( + .DATA_WIDTH(DATA_WIDTH), + .CTRL_WIDTH(CTRL_WIDTH), + .HDR_WIDTH(HDR_WIDTH) +) +xgmii_baser_dec_inst ( + .clk(clk), + .rst(rst), + .encoded_rx_data(encoded_rx_data), + .encoded_rx_hdr(encoded_rx_hdr), + .xgmii_rxd(xgmii_rxd), + .xgmii_rxc(xgmii_rxc), + .rx_bad_block(rx_bad_block), + .rx_sequence_error(rx_sequence_error) +); + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_ber_mon.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_ber_mon.v new file mode 100755 index 0000000..4850f8d --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_ber_mon.v @@ -0,0 +1,124 @@ +/* + +Copyright (c) 2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * 10G Ethernet PHY BER monitor + */ +module eth_phy_10g_rx_ber_mon # +( + parameter HDR_WIDTH = 2, + parameter COUNT_125US = 125000/6.4 +) +( + input wire clk, + input wire rst, + + /* + * SERDES interface + */ + input wire [HDR_WIDTH-1:0] serdes_rx_hdr, + + /* + * Status + */ + output wire rx_high_ber +); + +// bus width assertions +initial begin + if (HDR_WIDTH != 2) begin + $error("Error: HDR_WIDTH must be 2"); + $finish; + end +end + +parameter COUNT_WIDTH = $clog2($rtoi(COUNT_125US)); + +localparam [1:0] + SYNC_DATA = 2'b10, + SYNC_CTRL = 2'b01; + +reg [COUNT_WIDTH-1:0] time_count_reg = COUNT_125US, time_count_next; +reg [3:0] ber_count_reg = 4'd0, ber_count_next; + +reg rx_high_ber_reg = 1'b0, rx_high_ber_next; + +assign rx_high_ber = rx_high_ber_reg; + +always @* begin + if (time_count_reg > 0) begin + time_count_next = time_count_reg-1; + end else begin + time_count_next = time_count_reg; + end + ber_count_next = ber_count_reg; + + rx_high_ber_next = rx_high_ber_reg; + + if (serdes_rx_hdr == SYNC_CTRL || serdes_rx_hdr == SYNC_DATA) begin + // valid header + if (ber_count_reg != 4'd15) begin + if (time_count_reg == 0) begin + rx_high_ber_next = 1'b0; + end + end + end else begin + // invalid header + if (ber_count_reg == 4'd15) begin + rx_high_ber_next = 1'b1; + end else begin + ber_count_next = ber_count_reg + 1; + if (time_count_reg == 0) begin + rx_high_ber_next = 1'b0; + end + end + end + if (time_count_reg == 0) begin + // 125 us timer expired + ber_count_next = 4'd0; + time_count_next = COUNT_125US; + end +end + +always @(posedge clk) begin + time_count_reg <= time_count_next; + ber_count_reg <= ber_count_next; + rx_high_ber_reg <= rx_high_ber_next; + + if (rst) begin + time_count_reg <= COUNT_125US; + ber_count_reg <= 4'd0; + rx_high_ber_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_frame_sync.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_frame_sync.v new file mode 100755 index 0000000..5b851c0 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_frame_sync.v @@ -0,0 +1,146 @@ +/* + +Copyright (c) 2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * 10G Ethernet PHY frame sync + */ +module eth_phy_10g_rx_frame_sync # +( + parameter HDR_WIDTH = 2, + parameter BITSLIP_HIGH_CYCLES = 1, + parameter BITSLIP_LOW_CYCLES = 8 +) +( + input wire clk, + input wire rst, + + /* + * SERDES interface + */ + input wire [HDR_WIDTH-1:0] serdes_rx_hdr, + output wire serdes_rx_bitslip, + + /* + * Status + */ + output wire rx_block_lock +); + +parameter BITSLIP_MAX_CYCLES = BITSLIP_HIGH_CYCLES > BITSLIP_LOW_CYCLES ? BITSLIP_HIGH_CYCLES : BITSLIP_LOW_CYCLES; +parameter BITSLIP_COUNT_WIDTH = $clog2(BITSLIP_MAX_CYCLES); + +// bus width assertions +initial begin + if (HDR_WIDTH != 2) begin + $error("Error: HDR_WIDTH must be 2"); + $finish; + end +end + +localparam [1:0] + SYNC_DATA = 2'b10, + SYNC_CTRL = 2'b01; + +reg [5:0] sh_count_reg = 6'd0, sh_count_next; +reg [3:0] sh_invalid_count_reg = 4'd0, sh_invalid_count_next; +reg [BITSLIP_COUNT_WIDTH-1:0] bitslip_count_reg = 0, bitslip_count_next; + +reg serdes_rx_bitslip_reg = 1'b0, serdes_rx_bitslip_next; + +reg rx_block_lock_reg = 1'b0, rx_block_lock_next; + +assign serdes_rx_bitslip = serdes_rx_bitslip_reg; +assign rx_block_lock = rx_block_lock_reg; + +always @* begin + sh_count_next = sh_count_reg; + sh_invalid_count_next = sh_invalid_count_reg; + bitslip_count_next = bitslip_count_reg; + + serdes_rx_bitslip_next = serdes_rx_bitslip_reg; + + rx_block_lock_next = rx_block_lock_reg; + + if (bitslip_count_reg) begin + bitslip_count_next = bitslip_count_reg-1; + end else if (serdes_rx_bitslip_reg) begin + serdes_rx_bitslip_next = 1'b0; + bitslip_count_next = BITSLIP_LOW_CYCLES > 0 ? BITSLIP_LOW_CYCLES-1 : 0; + end else if (serdes_rx_hdr == SYNC_CTRL || serdes_rx_hdr == SYNC_DATA) begin + // valid header + sh_count_next = sh_count_reg + 1; + if (&sh_count_reg) begin + // valid count overflow, reset + sh_count_next = 0; + sh_invalid_count_next = 0; + if (!sh_invalid_count_reg) begin + rx_block_lock_next = 1'b1; + end + end + end else begin + // invalid header + sh_count_next = sh_count_reg + 1; + sh_invalid_count_next = sh_invalid_count_reg + 1; + if (!rx_block_lock_reg || &sh_invalid_count_reg) begin + // invalid count overflow, lost block lock + sh_count_next = 0; + sh_invalid_count_next = 0; + rx_block_lock_next = 1'b0; + + // slip one bit + serdes_rx_bitslip_next = 1'b1; + bitslip_count_next = BITSLIP_HIGH_CYCLES > 0 ? BITSLIP_HIGH_CYCLES-1 : 0; + end else if (&sh_count_reg) begin + // valid count overflow, reset + sh_count_next = 0; + sh_invalid_count_next = 0; + end + end +end + +always @(posedge clk) begin + sh_count_reg <= sh_count_next; + sh_invalid_count_reg <= sh_invalid_count_next; + bitslip_count_reg <= bitslip_count_next; + serdes_rx_bitslip_reg <= serdes_rx_bitslip_next; + rx_block_lock_reg <= rx_block_lock_next; + + if (rst) begin + sh_count_reg <= 6'd0; + sh_invalid_count_reg <= 4'd0; + bitslip_count_reg <= 0; + serdes_rx_bitslip_reg <= 1'b0; + rx_block_lock_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_if.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_if.v new file mode 100755 index 0000000..f9e0e95 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_if.v @@ -0,0 +1,278 @@ +/* + +Copyright (c) 2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * 10G Ethernet PHY RX IF + */ +module eth_phy_10g_rx_if # +( + parameter DATA_WIDTH = 64, + parameter HDR_WIDTH = 2, + parameter BIT_REVERSE = 0, + parameter SCRAMBLER_DISABLE = 0, + parameter PRBS31_ENABLE = 0, + parameter SERDES_PIPELINE = 0, + parameter BITSLIP_HIGH_CYCLES = 1, + parameter BITSLIP_LOW_CYCLES = 8, + parameter COUNT_125US = 125000/6.4 +) +( + input wire clk, + input wire rst, + + /* + * 10GBASE-R encoded interface + */ + output wire [DATA_WIDTH-1:0] encoded_rx_data, + output wire [HDR_WIDTH-1:0] encoded_rx_hdr, + + /* + * SERDES interface + */ + input wire [DATA_WIDTH-1:0] serdes_rx_data, + input wire [HDR_WIDTH-1:0] serdes_rx_hdr, + output wire serdes_rx_bitslip, + output wire serdes_rx_reset_req, + + /* + * Status + */ + input wire rx_bad_block, + input wire rx_sequence_error, + output wire [6:0] rx_error_count, + output wire rx_block_lock, + output wire rx_high_ber, + output wire rx_status, + + /* + * Configuration + */ + input wire cfg_rx_prbs31_enable +); + +// bus width assertions +initial begin + if (DATA_WIDTH != 64) begin + $error("Error: Interface width must be 64"); + $finish; + end + + if (HDR_WIDTH != 2) begin + $error("Error: HDR_WIDTH must be 2"); + $finish; + end +end + +wire [DATA_WIDTH-1:0] serdes_rx_data_rev, serdes_rx_data_int; +wire [HDR_WIDTH-1:0] serdes_rx_hdr_rev, serdes_rx_hdr_int; + +generate + genvar n; + + if (BIT_REVERSE) begin + for (n = 0; n < DATA_WIDTH; n = n + 1) begin + assign serdes_rx_data_rev[n] = serdes_rx_data[DATA_WIDTH-n-1]; + end + + for (n = 0; n < HDR_WIDTH; n = n + 1) begin + assign serdes_rx_hdr_rev[n] = serdes_rx_hdr[HDR_WIDTH-n-1]; + end + end else begin + assign serdes_rx_data_rev = serdes_rx_data; + assign serdes_rx_hdr_rev = serdes_rx_hdr; + end + + if (SERDES_PIPELINE > 0) begin + (* srl_style = "register" *) + reg [DATA_WIDTH-1:0] serdes_rx_data_pipe_reg[SERDES_PIPELINE-1:0]; + (* srl_style = "register" *) + reg [HDR_WIDTH-1:0] serdes_rx_hdr_pipe_reg[SERDES_PIPELINE-1:0]; + + for (n = 0; n < SERDES_PIPELINE; n = n + 1) begin + initial begin + serdes_rx_data_pipe_reg[n] <= {DATA_WIDTH{1'b0}}; + serdes_rx_hdr_pipe_reg[n] <= {HDR_WIDTH{1'b0}}; + end + + always @(posedge clk) begin + serdes_rx_data_pipe_reg[n] <= n == 0 ? serdes_rx_data_rev : serdes_rx_data_pipe_reg[n-1]; + serdes_rx_hdr_pipe_reg[n] <= n == 0 ? serdes_rx_hdr_rev : serdes_rx_hdr_pipe_reg[n-1]; + end + end + + assign serdes_rx_data_int = serdes_rx_data_pipe_reg[SERDES_PIPELINE-1]; + assign serdes_rx_hdr_int = serdes_rx_hdr_pipe_reg[SERDES_PIPELINE-1]; + end else begin + assign serdes_rx_data_int = serdes_rx_data_rev; + assign serdes_rx_hdr_int = serdes_rx_hdr_rev; + end + +endgenerate + +wire [DATA_WIDTH-1:0] descrambled_rx_data; + +reg [DATA_WIDTH-1:0] encoded_rx_data_reg = {DATA_WIDTH{1'b0}}; +reg [HDR_WIDTH-1:0] encoded_rx_hdr_reg = {HDR_WIDTH{1'b0}}; + +reg [57:0] scrambler_state_reg = {58{1'b1}}; +wire [57:0] scrambler_state; + +reg [30:0] prbs31_state_reg = 31'h7fffffff; +wire [30:0] prbs31_state; +wire [DATA_WIDTH+HDR_WIDTH-1:0] prbs31_data; +reg [DATA_WIDTH+HDR_WIDTH-1:0] prbs31_data_reg = 0; + +reg [6:0] rx_error_count_reg = 0; +reg [5:0] rx_error_count_1_reg = 0; +reg [5:0] rx_error_count_2_reg = 0; +reg [5:0] rx_error_count_1_temp = 0; +reg [5:0] rx_error_count_2_temp = 0; + +lfsr #( + .LFSR_WIDTH(58), + .LFSR_POLY(58'h8000000001), + .LFSR_CONFIG("FIBONACCI"), + .LFSR_FEED_FORWARD(1), + .REVERSE(1), + .DATA_WIDTH(DATA_WIDTH), + .STYLE("AUTO") +) +descrambler_inst ( + .data_in(serdes_rx_data_int), + .state_in(scrambler_state_reg), + .data_out(descrambled_rx_data), + .state_out(scrambler_state) +); + +lfsr #( + .LFSR_WIDTH(31), + .LFSR_POLY(31'h10000001), + .LFSR_CONFIG("FIBONACCI"), + .LFSR_FEED_FORWARD(1), + .REVERSE(1), + .DATA_WIDTH(DATA_WIDTH+HDR_WIDTH), + .STYLE("AUTO") +) +prbs31_check_inst ( + .data_in(~{serdes_rx_data_int, serdes_rx_hdr_int}), + .state_in(prbs31_state_reg), + .data_out(prbs31_data), + .state_out(prbs31_state) +); + +integer i; + +always @* begin + rx_error_count_1_temp = 0; + rx_error_count_2_temp = 0; + for (i = 0; i < DATA_WIDTH+HDR_WIDTH; i = i + 1) begin + if (i & 1) begin + rx_error_count_1_temp = rx_error_count_1_temp + prbs31_data_reg[i]; + end else begin + rx_error_count_2_temp = rx_error_count_2_temp + prbs31_data_reg[i]; + end + end +end + +always @(posedge clk) begin + scrambler_state_reg <= scrambler_state; + + encoded_rx_data_reg <= SCRAMBLER_DISABLE ? serdes_rx_data_int : descrambled_rx_data; + encoded_rx_hdr_reg <= serdes_rx_hdr_int; + + if (PRBS31_ENABLE) begin + if (cfg_rx_prbs31_enable) begin + prbs31_state_reg <= prbs31_state; + prbs31_data_reg <= prbs31_data; + end else begin + prbs31_data_reg <= 0; + end + + rx_error_count_1_reg <= rx_error_count_1_temp; + rx_error_count_2_reg <= rx_error_count_2_temp; + rx_error_count_reg <= rx_error_count_1_reg + rx_error_count_2_reg; + end else begin + rx_error_count_reg <= 0; + end +end + +assign encoded_rx_data = encoded_rx_data_reg; +assign encoded_rx_hdr = encoded_rx_hdr_reg; + +assign rx_error_count = rx_error_count_reg; + +wire serdes_rx_bitslip_int; +wire serdes_rx_reset_req_int; +assign serdes_rx_bitslip = serdes_rx_bitslip_int && !(PRBS31_ENABLE && cfg_rx_prbs31_enable); +assign serdes_rx_reset_req = serdes_rx_reset_req_int && !(PRBS31_ENABLE && cfg_rx_prbs31_enable); + +eth_phy_10g_rx_frame_sync #( + .HDR_WIDTH(HDR_WIDTH), + .BITSLIP_HIGH_CYCLES(BITSLIP_HIGH_CYCLES), + .BITSLIP_LOW_CYCLES(BITSLIP_LOW_CYCLES) +) +eth_phy_10g_rx_frame_sync_inst ( + .clk(clk), + .rst(rst), + .serdes_rx_hdr(serdes_rx_hdr_int), + .serdes_rx_bitslip(serdes_rx_bitslip_int), + .rx_block_lock(rx_block_lock) +); + +eth_phy_10g_rx_ber_mon #( + .HDR_WIDTH(HDR_WIDTH), + .COUNT_125US(COUNT_125US) +) +eth_phy_10g_rx_ber_mon_inst ( + .clk(clk), + .rst(rst), + .serdes_rx_hdr(serdes_rx_hdr_int), + .rx_high_ber(rx_high_ber) +); + +eth_phy_10g_rx_watchdog #( + .HDR_WIDTH(HDR_WIDTH), + .COUNT_125US(COUNT_125US) +) +eth_phy_10g_rx_watchdog_inst ( + .clk(clk), + .rst(rst), + .serdes_rx_hdr(serdes_rx_hdr_int), + .serdes_rx_reset_req(serdes_rx_reset_req_int), + .rx_bad_block(rx_bad_block), + .rx_sequence_error(rx_sequence_error), + .rx_block_lock(rx_block_lock), + .rx_high_ber(rx_high_ber), + .rx_status(rx_status) +); + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_watchdog.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_watchdog.v new file mode 100755 index 0000000..bbf1b6a --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_rx_watchdog.v @@ -0,0 +1,172 @@ +/* + +Copyright (c) 2021 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * 10G Ethernet PHY serdes watchdog + */ +module eth_phy_10g_rx_watchdog # +( + parameter HDR_WIDTH = 2, + parameter COUNT_125US = 125000/6.4 +) +( + input wire clk, + input wire rst, + + /* + * SERDES interface + */ + input wire [HDR_WIDTH-1:0] serdes_rx_hdr, + output wire serdes_rx_reset_req, + + /* + * Monitor inputs + */ + input wire rx_bad_block, + input wire rx_sequence_error, + input wire rx_block_lock, + input wire rx_high_ber, + + /* + * Status + */ + output wire rx_status +); + +// bus width assertions +initial begin + if (HDR_WIDTH != 2) begin + $error("Error: HDR_WIDTH must be 2"); + $finish; + end +end + +parameter COUNT_WIDTH = $clog2($rtoi(COUNT_125US)); + +localparam [1:0] + SYNC_DATA = 2'b10, + SYNC_CTRL = 2'b01; + +reg [COUNT_WIDTH-1:0] time_count_reg = 0, time_count_next; +reg [3:0] error_count_reg = 0, error_count_next; +reg [3:0] status_count_reg = 0, status_count_next; + +reg saw_ctrl_sh_reg = 1'b0, saw_ctrl_sh_next; +reg [9:0] block_error_count_reg = 0, block_error_count_next; + +reg serdes_rx_reset_req_reg = 1'b0, serdes_rx_reset_req_next; + +reg rx_status_reg = 1'b0, rx_status_next; + +assign serdes_rx_reset_req = serdes_rx_reset_req_reg; + +assign rx_status = rx_status_reg; + +always @* begin + error_count_next = error_count_reg; + status_count_next = status_count_reg; + + saw_ctrl_sh_next = saw_ctrl_sh_reg; + block_error_count_next = block_error_count_reg; + + serdes_rx_reset_req_next = 1'b0; + + rx_status_next = rx_status_reg; + + if (rx_block_lock) begin + if (serdes_rx_hdr == SYNC_CTRL) begin + saw_ctrl_sh_next = 1'b1; + end + if ((rx_bad_block || rx_sequence_error) && !(&block_error_count_reg)) begin + block_error_count_next = block_error_count_reg + 1; + end + end else begin + rx_status_next = 1'b0; + status_count_next = 0; + end + + if (time_count_reg != 0) begin + time_count_next = time_count_reg-1; + end else begin + time_count_next = COUNT_125US; + + if (!saw_ctrl_sh_reg || &block_error_count_reg) begin + error_count_next = error_count_reg + 1; + status_count_next = 0; + end else begin + error_count_next = 0; + if (!(&status_count_reg)) begin + status_count_next = status_count_reg + 1; + end + end + + if (&error_count_reg) begin + error_count_next = 0; + serdes_rx_reset_req_next = 1'b1; + end + + if (&status_count_reg) begin + rx_status_next = 1'b1; + end + + saw_ctrl_sh_next = 1'b0; + block_error_count_next = 0; + end +end + +always @(posedge clk) begin + time_count_reg <= time_count_next; + error_count_reg <= error_count_next; + status_count_reg <= status_count_next; + saw_ctrl_sh_reg <= saw_ctrl_sh_next; + block_error_count_reg <= block_error_count_next; + rx_status_reg <= rx_status_next; + + if (rst) begin + time_count_reg <= COUNT_125US; + error_count_reg <= 0; + status_count_reg <= 0; + saw_ctrl_sh_reg <= 1'b0; + block_error_count_reg <= 0; + rx_status_reg <= 1'b0; + end +end + +always @(posedge clk or posedge rst) begin + if (rst) begin + serdes_rx_reset_req_reg <= 1'b0; + end else begin + serdes_rx_reset_req_reg <= serdes_rx_reset_req_next; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_tx.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_tx.v new file mode 100755 index 0000000..43d7a6c --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_tx.v @@ -0,0 +1,127 @@ +/* + +Copyright (c) 2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * 10G Ethernet PHY TX + */ +module eth_phy_10g_tx # +( + parameter DATA_WIDTH = 64, + parameter CTRL_WIDTH = (DATA_WIDTH/8), + parameter HDR_WIDTH = 2, + parameter BIT_REVERSE = 0, + parameter SCRAMBLER_DISABLE = 0, + parameter PRBS31_ENABLE = 0, + parameter SERDES_PIPELINE = 0 +) +( + input wire clk, + input wire rst, + + /* + * XGMII interface + */ + input wire [DATA_WIDTH-1:0] xgmii_txd, + input wire [CTRL_WIDTH-1:0] xgmii_txc, + + /* + * SERDES interface + */ + output wire [DATA_WIDTH-1:0] serdes_tx_data, + output wire [HDR_WIDTH-1:0] serdes_tx_hdr, + + /* + * Status + */ + output wire tx_bad_block, + + /* + * Configuration + */ + input wire cfg_tx_prbs31_enable +); + +// bus width assertions +initial begin + if (DATA_WIDTH != 64) begin + $error("Error: Interface width must be 64"); + $finish; + end + + if (CTRL_WIDTH * 8 != DATA_WIDTH) begin + $error("Error: Interface requires byte (8-bit) granularity"); + $finish; + end + + if (HDR_WIDTH != 2) begin + $error("Error: HDR_WIDTH must be 2"); + $finish; + end +end + +wire [DATA_WIDTH-1:0] encoded_tx_data; +wire [HDR_WIDTH-1:0] encoded_tx_hdr; + +xgmii_baser_enc_64 #( + .DATA_WIDTH(DATA_WIDTH), + .CTRL_WIDTH(CTRL_WIDTH), + .HDR_WIDTH(HDR_WIDTH) +) +xgmii_baser_enc_inst ( + .clk(clk), + .rst(rst), + .xgmii_txd(xgmii_txd), + .xgmii_txc(xgmii_txc), + .encoded_tx_data(encoded_tx_data), + .encoded_tx_hdr(encoded_tx_hdr), + .tx_bad_block(tx_bad_block) +); + +eth_phy_10g_tx_if #( + .DATA_WIDTH(DATA_WIDTH), + .HDR_WIDTH(HDR_WIDTH), + .BIT_REVERSE(BIT_REVERSE), + .SCRAMBLER_DISABLE(SCRAMBLER_DISABLE), + .PRBS31_ENABLE(PRBS31_ENABLE), + .SERDES_PIPELINE(SERDES_PIPELINE) +) +eth_phy_10g_tx_if_inst ( + .clk(clk), + .rst(rst), + .encoded_tx_data(encoded_tx_data), + .encoded_tx_hdr(encoded_tx_hdr), + .serdes_tx_data(serdes_tx_data), + .serdes_tx_hdr(serdes_tx_hdr), + .cfg_tx_prbs31_enable(cfg_tx_prbs31_enable) +); + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_tx_if.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_tx_if.v new file mode 100755 index 0000000..2c53143 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_phy_10g_tx_if.v @@ -0,0 +1,183 @@ +/* + +Copyright (c) 2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * 10G Ethernet PHY TX IF + */ +module eth_phy_10g_tx_if # +( + parameter DATA_WIDTH = 64, + parameter HDR_WIDTH = 2, + parameter BIT_REVERSE = 0, + parameter SCRAMBLER_DISABLE = 0, + parameter PRBS31_ENABLE = 0, + parameter SERDES_PIPELINE = 0 +) +( + input wire clk, + input wire rst, + + /* + * 10GBASE-R encoded interface + */ + input wire [DATA_WIDTH-1:0] encoded_tx_data, + input wire [HDR_WIDTH-1:0] encoded_tx_hdr, + + /* + * SERDES interface + */ + output wire [DATA_WIDTH-1:0] serdes_tx_data, + output wire [HDR_WIDTH-1:0] serdes_tx_hdr, + + /* + * Configuration + */ + input wire cfg_tx_prbs31_enable +); + +// bus width assertions +initial begin + if (DATA_WIDTH != 64) begin + $error("Error: Interface width must be 64"); + $finish; + end + + if (HDR_WIDTH != 2) begin + $error("Error: HDR_WIDTH must be 2"); + $finish; + end +end + +reg [57:0] scrambler_state_reg = {58{1'b1}}; +wire [57:0] scrambler_state; +wire [DATA_WIDTH-1:0] scrambled_data; + +reg [30:0] prbs31_state_reg = 31'h7fffffff; +wire [30:0] prbs31_state; +wire [DATA_WIDTH+HDR_WIDTH-1:0] prbs31_data; + +reg [DATA_WIDTH-1:0] serdes_tx_data_reg = {DATA_WIDTH{1'b0}}; +reg [HDR_WIDTH-1:0] serdes_tx_hdr_reg = {HDR_WIDTH{1'b0}}; + +wire [DATA_WIDTH-1:0] serdes_tx_data_int; +wire [HDR_WIDTH-1:0] serdes_tx_hdr_int; + +generate + genvar n; + + if (BIT_REVERSE) begin + for (n = 0; n < DATA_WIDTH; n = n + 1) begin + assign serdes_tx_data_int[n] = serdes_tx_data_reg[DATA_WIDTH-n-1]; + end + + for (n = 0; n < HDR_WIDTH; n = n + 1) begin + assign serdes_tx_hdr_int[n] = serdes_tx_hdr_reg[HDR_WIDTH-n-1]; + end + end else begin + assign serdes_tx_data_int = serdes_tx_data_reg; + assign serdes_tx_hdr_int = serdes_tx_hdr_reg; + end + + if (SERDES_PIPELINE > 0) begin + (* srl_style = "register" *) + reg [DATA_WIDTH-1:0] serdes_tx_data_pipe_reg[SERDES_PIPELINE-1:0]; + (* srl_style = "register" *) + reg [HDR_WIDTH-1:0] serdes_tx_hdr_pipe_reg[SERDES_PIPELINE-1:0]; + + for (n = 0; n < SERDES_PIPELINE; n = n + 1) begin + initial begin + serdes_tx_data_pipe_reg[n] <= {DATA_WIDTH{1'b0}}; + serdes_tx_hdr_pipe_reg[n] <= {HDR_WIDTH{1'b0}}; + end + + always @(posedge clk) begin + serdes_tx_data_pipe_reg[n] <= n == 0 ? serdes_tx_data_int : serdes_tx_data_pipe_reg[n-1]; + serdes_tx_hdr_pipe_reg[n] <= n == 0 ? serdes_tx_hdr_int : serdes_tx_hdr_pipe_reg[n-1]; + end + end + + assign serdes_tx_data = serdes_tx_data_pipe_reg[SERDES_PIPELINE-1]; + assign serdes_tx_hdr = serdes_tx_hdr_pipe_reg[SERDES_PIPELINE-1]; + end else begin + assign serdes_tx_data = serdes_tx_data_int; + assign serdes_tx_hdr = serdes_tx_hdr_int; + end + +endgenerate + +lfsr #( + .LFSR_WIDTH(58), + .LFSR_POLY(58'h8000000001), + .LFSR_CONFIG("FIBONACCI"), + .LFSR_FEED_FORWARD(0), + .REVERSE(1), + .DATA_WIDTH(DATA_WIDTH), + .STYLE("AUTO") +) +scrambler_inst ( + .data_in(encoded_tx_data), + .state_in(scrambler_state_reg), + .data_out(scrambled_data), + .state_out(scrambler_state) +); + +lfsr #( + .LFSR_WIDTH(31), + .LFSR_POLY(31'h10000001), + .LFSR_CONFIG("FIBONACCI"), + .LFSR_FEED_FORWARD(0), + .REVERSE(1), + .DATA_WIDTH(DATA_WIDTH+HDR_WIDTH), + .STYLE("AUTO") +) +prbs31_gen_inst ( + .data_in({DATA_WIDTH+HDR_WIDTH{1'b0}}), + .state_in(prbs31_state_reg), + .data_out(prbs31_data), + .state_out(prbs31_state) +); + +always @(posedge clk) begin + scrambler_state_reg <= scrambler_state; + + if (PRBS31_ENABLE && cfg_tx_prbs31_enable) begin + prbs31_state_reg <= prbs31_state; + + serdes_tx_data_reg <= ~prbs31_data[DATA_WIDTH+HDR_WIDTH-1:HDR_WIDTH]; + serdes_tx_hdr_reg <= ~prbs31_data[HDR_WIDTH-1:0]; + end else begin + serdes_tx_data_reg <= SCRAMBLER_DISABLE ? encoded_tx_data : scrambled_data; + serdes_tx_hdr_reg <= encoded_tx_hdr; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_xcvr_phy_quad_wrapper.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_xcvr_phy_quad_wrapper.v new file mode 100755 index 0000000..c910d79 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_xcvr_phy_quad_wrapper.v @@ -0,0 +1,395 @@ +/* + +Copyright (c) 2023 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * Transceiver and PHY quad wrapper + */ +module eth_xcvr_phy_quad_wrapper # +( + parameter COUNT = 4, + parameter DATA_WIDTH = 64, + parameter CTRL_WIDTH = (DATA_WIDTH/8), + parameter HDR_WIDTH = 2, + parameter PRBS31_ENABLE = 0, + parameter TX_SERDES_PIPELINE = 0, + parameter RX_SERDES_PIPELINE = 0, + parameter BITSLIP_HIGH_CYCLES = 1, + parameter BITSLIP_LOW_CYCLES = 8, + parameter COUNT_125US = 125000/6.4 +) +( + input wire xcvr_ctrl_clk, + input wire xcvr_ctrl_rst, + + /* + * Common + */ + output wire xcvr_gtpowergood_out, + + /* + * PLL + */ + input wire xcvr_gtrefclk00_in, + + /* + * Serial data + */ + output wire [COUNT-1:0] xcvr_txp, + output wire [COUNT-1:0] xcvr_txn, + input wire [COUNT-1:0] xcvr_rxp, + input wire [COUNT-1:0] xcvr_rxn, + + /* + * PHY connections + */ + output wire phy_1_tx_clk, + output wire phy_1_tx_rst, + input wire [DATA_WIDTH-1:0] phy_1_xgmii_txd, + input wire [CTRL_WIDTH-1:0] phy_1_xgmii_txc, + output wire phy_1_rx_clk, + output wire phy_1_rx_rst, + output wire [DATA_WIDTH-1:0] phy_1_xgmii_rxd, + output wire [CTRL_WIDTH-1:0] phy_1_xgmii_rxc, + output wire phy_1_tx_bad_block, + output wire [6:0] phy_1_rx_error_count, + output wire phy_1_rx_bad_block, + output wire phy_1_rx_sequence_error, + output wire phy_1_rx_block_lock, + output wire phy_1_rx_high_ber, + output wire phy_1_rx_status, + input wire phy_1_cfg_tx_prbs31_enable, + input wire phy_1_cfg_rx_prbs31_enable, + + output wire phy_2_tx_clk, + output wire phy_2_tx_rst, + input wire [DATA_WIDTH-1:0] phy_2_xgmii_txd, + input wire [CTRL_WIDTH-1:0] phy_2_xgmii_txc, + output wire phy_2_rx_clk, + output wire phy_2_rx_rst, + output wire [DATA_WIDTH-1:0] phy_2_xgmii_rxd, + output wire [CTRL_WIDTH-1:0] phy_2_xgmii_rxc, + output wire phy_2_tx_bad_block, + output wire [6:0] phy_2_rx_error_count, + output wire phy_2_rx_bad_block, + output wire phy_2_rx_sequence_error, + output wire phy_2_rx_block_lock, + output wire phy_2_rx_high_ber, + output wire phy_2_rx_status, + input wire phy_2_cfg_tx_prbs31_enable, + input wire phy_2_cfg_rx_prbs31_enable, + + output wire phy_3_tx_clk, + output wire phy_3_tx_rst, + input wire [DATA_WIDTH-1:0] phy_3_xgmii_txd, + input wire [CTRL_WIDTH-1:0] phy_3_xgmii_txc, + output wire phy_3_rx_clk, + output wire phy_3_rx_rst, + output wire [DATA_WIDTH-1:0] phy_3_xgmii_rxd, + output wire [CTRL_WIDTH-1:0] phy_3_xgmii_rxc, + output wire phy_3_tx_bad_block, + output wire [6:0] phy_3_rx_error_count, + output wire phy_3_rx_bad_block, + output wire phy_3_rx_sequence_error, + output wire phy_3_rx_block_lock, + output wire phy_3_rx_high_ber, + output wire phy_3_rx_status, + input wire phy_3_cfg_tx_prbs31_enable, + input wire phy_3_cfg_rx_prbs31_enable, + + output wire phy_4_tx_clk, + output wire phy_4_tx_rst, + input wire [DATA_WIDTH-1:0] phy_4_xgmii_txd, + input wire [CTRL_WIDTH-1:0] phy_4_xgmii_txc, + output wire phy_4_rx_clk, + output wire phy_4_rx_rst, + output wire [DATA_WIDTH-1:0] phy_4_xgmii_rxd, + output wire [CTRL_WIDTH-1:0] phy_4_xgmii_rxc, + output wire phy_4_tx_bad_block, + output wire [6:0] phy_4_rx_error_count, + output wire phy_4_rx_bad_block, + output wire phy_4_rx_sequence_error, + output wire phy_4_rx_block_lock, + output wire phy_4_rx_high_ber, + output wire phy_4_rx_status, + input wire phy_4_cfg_tx_prbs31_enable, + input wire phy_4_cfg_rx_prbs31_enable +); + +generate + +wire xcvr_qpll0lock; +wire xcvr_qpll0clk; +wire xcvr_qpll0refclk; + +if (COUNT > 0) begin : phy1 + + eth_xcvr_phy_wrapper #( + .HAS_COMMON(1), + .DATA_WIDTH(DATA_WIDTH), + .CTRL_WIDTH(CTRL_WIDTH), + .HDR_WIDTH(HDR_WIDTH), + .PRBS31_ENABLE(PRBS31_ENABLE), + .TX_SERDES_PIPELINE(TX_SERDES_PIPELINE), + .RX_SERDES_PIPELINE(RX_SERDES_PIPELINE), + .BITSLIP_HIGH_CYCLES(BITSLIP_HIGH_CYCLES), + .BITSLIP_LOW_CYCLES(BITSLIP_LOW_CYCLES), + .COUNT_125US(COUNT_125US) + ) + eth_xcvr_phy_1 ( + .xcvr_ctrl_clk(xcvr_ctrl_clk), + .xcvr_ctrl_rst(xcvr_ctrl_rst), + + // Common + .xcvr_gtpowergood_out(xcvr_gtpowergood_out), + + // PLL out + .xcvr_gtrefclk00_in(xcvr_gtrefclk00_in), + .xcvr_qpll0lock_out(xcvr_qpll0lock), + .xcvr_qpll0clk_out(xcvr_qpll0clk), + .xcvr_qpll0refclk_out(xcvr_qpll0refclk), + + // PLL in + .xcvr_qpll0lock_in(1'b0), + .xcvr_qpll0clk_in(1'b0), + .xcvr_qpll0refclk_in(1'b0), + + // Serial data + .xcvr_txp(xcvr_txp[0]), + .xcvr_txn(xcvr_txn[0]), + .xcvr_rxp(xcvr_rxp[0]), + .xcvr_rxn(xcvr_rxn[0]), + + // PHY connections + .phy_tx_clk(phy_1_tx_clk), + .phy_tx_rst(phy_1_tx_rst), + .phy_xgmii_txd(phy_1_xgmii_txd), + .phy_xgmii_txc(phy_1_xgmii_txc), + .phy_rx_clk(phy_1_rx_clk), + .phy_rx_rst(phy_1_rx_rst), + .phy_xgmii_rxd(phy_1_xgmii_rxd), + .phy_xgmii_rxc(phy_1_xgmii_rxc), + .phy_tx_bad_block(phy_1_tx_bad_block), + .phy_rx_error_count(phy_1_rx_error_count), + .phy_rx_bad_block(phy_1_rx_bad_block), + .phy_rx_sequence_error(phy_1_rx_sequence_error), + .phy_rx_block_lock(phy_1_rx_block_lock), + .phy_rx_high_ber(phy_1_rx_high_ber), + .phy_rx_status(phy_1_rx_status), + .phy_cfg_tx_prbs31_enable(phy_1_cfg_tx_prbs31_enable), + .phy_cfg_rx_prbs31_enable(phy_1_cfg_rx_prbs31_enable) + ); + +end + +if (COUNT > 1) begin : phy2 + + eth_xcvr_phy_wrapper #( + .HAS_COMMON(0), + .DATA_WIDTH(DATA_WIDTH), + .CTRL_WIDTH(CTRL_WIDTH), + .HDR_WIDTH(HDR_WIDTH), + .PRBS31_ENABLE(PRBS31_ENABLE), + .TX_SERDES_PIPELINE(TX_SERDES_PIPELINE), + .RX_SERDES_PIPELINE(RX_SERDES_PIPELINE), + .BITSLIP_HIGH_CYCLES(BITSLIP_HIGH_CYCLES), + .BITSLIP_LOW_CYCLES(BITSLIP_LOW_CYCLES), + .COUNT_125US(COUNT_125US) + ) + eth_xcvr_phy_2 ( + .xcvr_ctrl_clk(xcvr_ctrl_clk), + .xcvr_ctrl_rst(xcvr_ctrl_rst), + + // Common + .xcvr_gtpowergood_out(), + + // PLL out + .xcvr_gtrefclk00_in(1'b0), + .xcvr_qpll0lock_out(), + .xcvr_qpll0clk_out(), + .xcvr_qpll0refclk_out(), + + // PLL in + .xcvr_qpll0lock_in(xcvr_qpll0lock), + .xcvr_qpll0clk_in(xcvr_qpll0clk), + .xcvr_qpll0refclk_in(xcvr_qpll0refclk), + + // Serial data + .xcvr_txp(xcvr_txp[1]), + .xcvr_txn(xcvr_txn[1]), + .xcvr_rxp(xcvr_rxp[1]), + .xcvr_rxn(xcvr_rxn[1]), + + // PHY connections + .phy_tx_clk(phy_2_tx_clk), + .phy_tx_rst(phy_2_tx_rst), + .phy_xgmii_txd(phy_2_xgmii_txd), + .phy_xgmii_txc(phy_2_xgmii_txc), + .phy_rx_clk(phy_2_rx_clk), + .phy_rx_rst(phy_2_rx_rst), + .phy_xgmii_rxd(phy_2_xgmii_rxd), + .phy_xgmii_rxc(phy_2_xgmii_rxc), + .phy_tx_bad_block(phy_2_tx_bad_block), + .phy_rx_error_count(phy_2_rx_error_count), + .phy_rx_bad_block(phy_2_rx_bad_block), + .phy_rx_sequence_error(phy_2_rx_sequence_error), + .phy_rx_block_lock(phy_2_rx_block_lock), + .phy_rx_high_ber(phy_2_rx_high_ber), + .phy_rx_status(phy_2_rx_status), + .phy_cfg_tx_prbs31_enable(phy_2_cfg_tx_prbs31_enable), + .phy_cfg_rx_prbs31_enable(phy_2_cfg_rx_prbs31_enable) + ); + +end + +if (COUNT > 2) begin : phy3 + + eth_xcvr_phy_wrapper #( + .HAS_COMMON(0), + .DATA_WIDTH(DATA_WIDTH), + .CTRL_WIDTH(CTRL_WIDTH), + .HDR_WIDTH(HDR_WIDTH), + .PRBS31_ENABLE(PRBS31_ENABLE), + .TX_SERDES_PIPELINE(TX_SERDES_PIPELINE), + .RX_SERDES_PIPELINE(RX_SERDES_PIPELINE), + .BITSLIP_HIGH_CYCLES(BITSLIP_HIGH_CYCLES), + .BITSLIP_LOW_CYCLES(BITSLIP_LOW_CYCLES), + .COUNT_125US(COUNT_125US) + ) + eth_xcvr_phy_3 ( + .xcvr_ctrl_clk(xcvr_ctrl_clk), + .xcvr_ctrl_rst(xcvr_ctrl_rst), + + // Common + .xcvr_gtpowergood_out(), + + // PLL out + .xcvr_gtrefclk00_in(1'b0), + .xcvr_qpll0lock_out(), + .xcvr_qpll0clk_out(), + .xcvr_qpll0refclk_out(), + + // PLL in + .xcvr_qpll0lock_in(xcvr_qpll0lock), + .xcvr_qpll0clk_in(xcvr_qpll0clk), + .xcvr_qpll0refclk_in(xcvr_qpll0refclk), + + // Serial data + .xcvr_txp(xcvr_txp[2]), + .xcvr_txn(xcvr_txn[2]), + .xcvr_rxp(xcvr_rxp[2]), + .xcvr_rxn(xcvr_rxn[2]), + + // PHY connections + .phy_tx_clk(phy_3_tx_clk), + .phy_tx_rst(phy_3_tx_rst), + .phy_xgmii_txd(phy_3_xgmii_txd), + .phy_xgmii_txc(phy_3_xgmii_txc), + .phy_rx_clk(phy_3_rx_clk), + .phy_rx_rst(phy_3_rx_rst), + .phy_xgmii_rxd(phy_3_xgmii_rxd), + .phy_xgmii_rxc(phy_3_xgmii_rxc), + .phy_tx_bad_block(phy_3_tx_bad_block), + .phy_rx_error_count(phy_3_rx_error_count), + .phy_rx_bad_block(phy_3_rx_bad_block), + .phy_rx_sequence_error(phy_3_rx_sequence_error), + .phy_rx_block_lock(phy_3_rx_block_lock), + .phy_rx_high_ber(phy_3_rx_high_ber), + .phy_rx_status(phy_3_rx_status), + .phy_cfg_tx_prbs31_enable(phy_3_cfg_tx_prbs31_enable), + .phy_cfg_rx_prbs31_enable(phy_3_cfg_rx_prbs31_enable) + ); + +end + +if (COUNT > 3) begin : phy4 + + eth_xcvr_phy_wrapper #( + .HAS_COMMON(0), + .DATA_WIDTH(DATA_WIDTH), + .CTRL_WIDTH(CTRL_WIDTH), + .HDR_WIDTH(HDR_WIDTH), + .PRBS31_ENABLE(PRBS31_ENABLE), + .TX_SERDES_PIPELINE(TX_SERDES_PIPELINE), + .RX_SERDES_PIPELINE(RX_SERDES_PIPELINE), + .BITSLIP_HIGH_CYCLES(BITSLIP_HIGH_CYCLES), + .BITSLIP_LOW_CYCLES(BITSLIP_LOW_CYCLES), + .COUNT_125US(COUNT_125US) + ) + eth_xcvr_phy_4 ( + .xcvr_ctrl_clk(xcvr_ctrl_clk), + .xcvr_ctrl_rst(xcvr_ctrl_rst), + + // Common + .xcvr_gtpowergood_out(), + + // PLL out + .xcvr_gtrefclk00_in(1'b0), + .xcvr_qpll0lock_out(), + .xcvr_qpll0clk_out(), + .xcvr_qpll0refclk_out(), + + // PLL in + .xcvr_qpll0lock_in(xcvr_qpll0lock), + .xcvr_qpll0clk_in(xcvr_qpll0clk), + .xcvr_qpll0refclk_in(xcvr_qpll0refclk), + + // Serial data + .xcvr_txp(xcvr_txp[3]), + .xcvr_txn(xcvr_txn[3]), + .xcvr_rxp(xcvr_rxp[3]), + .xcvr_rxn(xcvr_rxn[3]), + + // PHY connections + .phy_tx_clk(phy_4_tx_clk), + .phy_tx_rst(phy_4_tx_rst), + .phy_xgmii_txd(phy_4_xgmii_txd), + .phy_xgmii_txc(phy_4_xgmii_txc), + .phy_rx_clk(phy_4_rx_clk), + .phy_rx_rst(phy_4_rx_rst), + .phy_xgmii_rxd(phy_4_xgmii_rxd), + .phy_xgmii_rxc(phy_4_xgmii_rxc), + .phy_tx_bad_block(phy_4_tx_bad_block), + .phy_rx_error_count(phy_4_rx_error_count), + .phy_rx_bad_block(phy_4_rx_bad_block), + .phy_rx_sequence_error(phy_4_rx_sequence_error), + .phy_rx_block_lock(phy_4_rx_block_lock), + .phy_rx_high_ber(phy_4_rx_high_ber), + .phy_rx_status(phy_4_rx_status), + .phy_cfg_tx_prbs31_enable(phy_4_cfg_tx_prbs31_enable), + .phy_cfg_rx_prbs31_enable(phy_4_cfg_rx_prbs31_enable) + ); + +end + +endgenerate + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_xcvr_phy_wrapper.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_xcvr_phy_wrapper.v new file mode 100755 index 0000000..d986312 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/eth_xcvr_phy_wrapper.v @@ -0,0 +1,307 @@ +/* + +Copyright (c) 2021-2023 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * Transceiver and PHY wrapper + */ +module eth_xcvr_phy_wrapper # +( + parameter HAS_COMMON = 1, + parameter DATA_WIDTH = 64, + parameter CTRL_WIDTH = (DATA_WIDTH/8), + parameter HDR_WIDTH = 2, + parameter PRBS31_ENABLE = 0, + parameter TX_SERDES_PIPELINE = 0, + parameter RX_SERDES_PIPELINE = 0, + parameter BITSLIP_HIGH_CYCLES = 1, + parameter BITSLIP_LOW_CYCLES = 8, + parameter COUNT_125US = 125000/6.4 +) +( + input wire xcvr_ctrl_clk, + input wire xcvr_ctrl_rst, + + /* + * Common + */ + output wire xcvr_gtpowergood_out, + + /* + * PLL out + */ + input wire xcvr_gtrefclk00_in, + output wire xcvr_qpll0lock_out, + output wire xcvr_qpll0clk_out, + output wire xcvr_qpll0refclk_out, + + /* + * PLL in + */ + input wire xcvr_qpll0lock_in, + output wire xcvr_qpll0reset_out, + input wire xcvr_qpll0clk_in, + input wire xcvr_qpll0refclk_in, + + /* + * Serial data + */ + output wire xcvr_txp, + output wire xcvr_txn, + input wire xcvr_rxp, + input wire xcvr_rxn, + + /* + * PHY connections + */ + output wire phy_tx_clk, + output wire phy_tx_rst, + input wire [DATA_WIDTH-1:0] phy_xgmii_txd, + input wire [CTRL_WIDTH-1:0] phy_xgmii_txc, + output wire phy_rx_clk, + output wire phy_rx_rst, + output wire [DATA_WIDTH-1:0] phy_xgmii_rxd, + output wire [CTRL_WIDTH-1:0] phy_xgmii_rxc, + output wire phy_tx_bad_block, + output wire [6:0] phy_rx_error_count, + output wire phy_rx_bad_block, + output wire phy_rx_sequence_error, + output wire phy_rx_block_lock, + output wire phy_rx_high_ber, + output wire phy_rx_status, + input wire phy_cfg_tx_prbs31_enable, + input wire phy_cfg_rx_prbs31_enable +); + +wire phy_rx_reset_req; + +wire gt_reset_tx_datapath = 1'b0; +wire gt_reset_rx_datapath = phy_rx_reset_req; + +wire gt_reset_tx_done; +wire gt_reset_rx_done; + +wire [5:0] gt_txheader; +wire [63:0] gt_txdata; +wire gt_rxgearboxslip; +wire [5:0] gt_rxheader; +wire [1:0] gt_rxheadervalid; +wire [63:0] gt_rxdata; +wire [1:0] gt_rxdatavalid; + +generate + +if (HAS_COMMON) begin : xcvr + + eth_xcvr_gt_full + eth_xcvr_gt_full_inst ( + // Common + .gtwiz_reset_clk_freerun_in(xcvr_ctrl_clk), + .gtwiz_reset_all_in(xcvr_ctrl_rst), + .gtpowergood_out(xcvr_gtpowergood_out), + + // PLL + .gtrefclk00_in(xcvr_gtrefclk00_in), + .qpll0lock_out(xcvr_qpll0lock_out), + .qpll0outclk_out(xcvr_qpll0clk_out), + .qpll0outrefclk_out(xcvr_qpll0refclk_out), + + // Serial data + .gthtxp_out(xcvr_txp), + .gthtxn_out(xcvr_txn), + .gthrxp_in(xcvr_rxp), + .gthrxn_in(xcvr_rxn), + + // Transmit + .gtwiz_userclk_tx_reset_in(1'b0), + .gtwiz_userclk_tx_srcclk_out(), + .gtwiz_userclk_tx_usrclk_out(), + .gtwiz_userclk_tx_usrclk2_out(phy_tx_clk), + .gtwiz_userclk_tx_active_out(), + .gtwiz_reset_tx_pll_and_datapath_in(1'b0), + .gtwiz_reset_tx_datapath_in(gt_reset_tx_datapath), + .gtwiz_reset_tx_done_out(gt_reset_tx_done), + .txpmaresetdone_out(), + .txprgdivresetdone_out(), + + .gtwiz_userdata_tx_in(gt_txdata), + .txheader_in(gt_txheader), + .txsequence_in(7'b0), + + // Receive + .gtwiz_userclk_rx_reset_in(1'b0), + .gtwiz_userclk_rx_srcclk_out(), + .gtwiz_userclk_rx_usrclk_out(), + .gtwiz_userclk_rx_usrclk2_out(phy_rx_clk), + .gtwiz_userclk_rx_active_out(), + .gtwiz_reset_rx_pll_and_datapath_in(1'b0), + .gtwiz_reset_rx_datapath_in(gt_reset_rx_datapath), + .gtwiz_reset_rx_cdr_stable_out(), + .gtwiz_reset_rx_done_out(gt_reset_rx_done), + .rxpmaresetdone_out(), + .rxprgdivresetdone_out(), + + .rxgearboxslip_in(gt_rxgearboxslip), + .gtwiz_userdata_rx_out(gt_rxdata), + .rxdatavalid_out(gt_rxdatavalid), + .rxheader_out(gt_rxheader), + .rxheadervalid_out(gt_rxheadervalid), + .rxstartofseq_out() + ); + + assign xcvr_qpll0reset_out = 1'b0; + +end else begin : xcvr + + eth_xcvr_gt_channel + eth_xcvr_gt_channel_inst ( + // Common + .gtwiz_reset_clk_freerun_in(xcvr_ctrl_clk), + .gtwiz_reset_all_in(xcvr_ctrl_rst), + .gtpowergood_out(xcvr_gtpowergood_out), + + // PLL + .gtwiz_reset_qpll0lock_in(xcvr_qpll0lock_in), + .gtwiz_reset_qpll0reset_out(xcvr_qpll0reset_out), + .qpll0clk_in(xcvr_qpll0clk_in), + .qpll0refclk_in(xcvr_qpll0refclk_in), + .qpll1clk_in(1'b0), + .qpll1refclk_in(1'b0), + + // Serial data + .gthtxp_out(xcvr_txp), + .gthtxn_out(xcvr_txn), + .gthrxp_in(xcvr_rxp), + .gthrxn_in(xcvr_rxn), + + // Transmit + .gtwiz_userclk_tx_reset_in(1'b0), + .gtwiz_userclk_tx_srcclk_out(), + .gtwiz_userclk_tx_usrclk_out(), + .gtwiz_userclk_tx_usrclk2_out(phy_tx_clk), + .gtwiz_userclk_tx_active_out(), + .gtwiz_reset_tx_pll_and_datapath_in(1'b0), + .gtwiz_reset_tx_datapath_in(gt_reset_tx_datapath), + .gtwiz_reset_tx_done_out(gt_reset_tx_done), + .txpmaresetdone_out(), + .txprgdivresetdone_out(), + + .gtwiz_userdata_tx_in(gt_txdata), + .txheader_in(gt_txheader), + .txsequence_in(7'b0), + + // Receive + .gtwiz_userclk_rx_reset_in(1'b0), + .gtwiz_userclk_rx_srcclk_out(), + .gtwiz_userclk_rx_usrclk_out(), + .gtwiz_userclk_rx_usrclk2_out(phy_rx_clk), + .gtwiz_userclk_rx_active_out(), + .gtwiz_reset_rx_pll_and_datapath_in(1'b0), + .gtwiz_reset_rx_datapath_in(gt_reset_rx_datapath), + .gtwiz_reset_rx_cdr_stable_out(), + .gtwiz_reset_rx_done_out(gt_reset_rx_done), + .rxpmaresetdone_out(), + .rxprgdivresetdone_out(), + + .rxgearboxslip_in(gt_rxgearboxslip), + .gtwiz_userdata_rx_out(gt_rxdata), + .rxdatavalid_out(gt_rxdatavalid), + .rxheader_out(gt_rxheader), + .rxheadervalid_out(gt_rxheadervalid), + .rxstartofseq_out() + ); + + assign xcvr_qpll0lock_out = 1'b0; + assign xcvr_qpll0clk_out = 1'b0; + assign xcvr_qpll0refclk_out = 1'b0; + +end + +endgenerate + +sync_reset #( + .N(4) +) +tx_reset_sync_inst ( + .clk(phy_tx_clk), + .rst(!gt_reset_tx_done), + .out(phy_tx_rst) +); + +sync_reset #( + .N(4) +) +rx_reset_sync_inst ( + .clk(phy_rx_clk), + .rst(!gt_reset_rx_done), + .out(phy_rx_rst) +); + +eth_phy_10g #( + .DATA_WIDTH(DATA_WIDTH), + .CTRL_WIDTH(CTRL_WIDTH), + .HDR_WIDTH(HDR_WIDTH), + .BIT_REVERSE(1), + .SCRAMBLER_DISABLE(0), + .PRBS31_ENABLE(PRBS31_ENABLE), + .TX_SERDES_PIPELINE(TX_SERDES_PIPELINE), + .RX_SERDES_PIPELINE(RX_SERDES_PIPELINE), + .BITSLIP_HIGH_CYCLES(BITSLIP_HIGH_CYCLES), + .BITSLIP_LOW_CYCLES(BITSLIP_LOW_CYCLES), + .COUNT_125US(COUNT_125US) +) +phy_inst ( + .tx_clk(phy_tx_clk), + .tx_rst(phy_tx_rst), + .rx_clk(phy_rx_clk), + .rx_rst(phy_rx_rst), + .xgmii_txd(phy_xgmii_txd), + .xgmii_txc(phy_xgmii_txc), + .xgmii_rxd(phy_xgmii_rxd), + .xgmii_rxc(phy_xgmii_rxc), + .serdes_tx_data(gt_txdata), + .serdes_tx_hdr(gt_txheader), + .serdes_rx_data(gt_rxdata), + .serdes_rx_hdr(gt_rxheader), + .serdes_rx_bitslip(gt_rxgearboxslip), + .serdes_rx_reset_req(phy_rx_reset_req), + .tx_bad_block(phy_tx_bad_block), + .rx_error_count(phy_rx_error_count), + .rx_bad_block(phy_rx_bad_block), + .rx_sequence_error(phy_rx_sequence_error), + .rx_block_lock(phy_rx_block_lock), + .rx_high_ber(phy_rx_high_ber), + .rx_status(phy_rx_status), + .cfg_tx_prbs31_enable(phy_cfg_tx_prbs31_enable), + .cfg_rx_prbs31_enable(phy_cfg_rx_prbs31_enable) +); + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/fpga_core.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/fpga_core.v new file mode 100755 index 0000000..acbf398 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/fpga_core.v @@ -0,0 +1,602 @@ +/* + +Copyright (c) 2020-2021 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * FPGA core logic + */ +module fpga_core # +( + parameter integer IP_ADDR = 128, + parameter integer PORT_IN = 1234, + parameter [47:0] MAC_ADDR = 48'h02_00_00_00_00_00 +) +( + /* + * Clock: 156.25MHz + * Synchronous reset + */ + input wire clk, + input wire rst, + input wire [15:0] packet_size, + + output wire [63:0] rx_fifo_udp_payload_axis_tdata, + output wire [7:0] rx_fifo_udp_payload_axis_tkeep, + output wire rx_fifo_udp_payload_axis_tvalid, + input wire rx_fifo_udp_payload_axis_tready, + output wire rx_fifo_udp_payload_axis_tlast, + output wire rx_fifo_udp_payload_axis_tuser, + + input wire [63:0] tx_fifo_udp_payload_axis_tdata, + input wire [7:0] tx_fifo_udp_payload_axis_tkeep, + input wire tx_fifo_udp_payload_axis_tvalid, + output wire tx_fifo_udp_payload_axis_tready, + input wire tx_fifo_udp_payload_axis_tlast, + input wire tx_fifo_udp_payload_axis_tuser, + input wire [3:0] tx_fifo_udp_payload_axis_tdest, + + /* + * Ethernet: SFP+ + */ + input wire sfp_tx_clk, + input wire sfp_tx_rst, + output wire [63:0] sfp_txd, + output wire [7:0] sfp_txc, + input wire sfp_rx_clk, + input wire sfp_rx_rst, + input wire [63:0] sfp_rxd, + input wire [7:0] sfp_rxc +); + +// AXI between MAC and Ethernet modules +wire [63:0] rx_axis_tdata; +wire [7:0] rx_axis_tkeep; +wire rx_axis_tvalid; +wire rx_axis_tready; +wire rx_axis_tlast; +wire rx_axis_tuser; + +wire [63:0] tx_axis_tdata; +wire [7:0] tx_axis_tkeep; +wire tx_axis_tvalid; +wire tx_axis_tready; +wire tx_axis_tlast; +wire tx_axis_tuser; + +// Ethernet frame between Ethernet modules and UDP stack +wire rx_eth_hdr_ready; +wire rx_eth_hdr_valid; +wire [47:0] rx_eth_dest_mac; +wire [47:0] rx_eth_src_mac; +wire [15:0] rx_eth_type; +wire [63:0] rx_eth_payload_axis_tdata; +wire [7:0] rx_eth_payload_axis_tkeep; +wire rx_eth_payload_axis_tvalid; +wire rx_eth_payload_axis_tready; +wire rx_eth_payload_axis_tlast; +wire rx_eth_payload_axis_tuser; + +wire tx_eth_hdr_ready; +wire tx_eth_hdr_valid; +wire [47:0] tx_eth_dest_mac; +wire [47:0] tx_eth_src_mac; +wire [15:0] tx_eth_type; +wire [63:0] tx_eth_payload_axis_tdata; +wire [7:0] tx_eth_payload_axis_tkeep; +wire tx_eth_payload_axis_tvalid; +wire tx_eth_payload_axis_tready; +wire tx_eth_payload_axis_tlast; +wire tx_eth_payload_axis_tuser; + +// IP frame connections +wire rx_ip_hdr_valid; +wire rx_ip_hdr_ready; +wire [47:0] rx_ip_eth_dest_mac; +wire [47:0] rx_ip_eth_src_mac; +wire [15:0] rx_ip_eth_type; +wire [3:0] rx_ip_version; +wire [3:0] rx_ip_ihl; +wire [5:0] rx_ip_dscp; +wire [1:0] rx_ip_ecn; +wire [15:0] rx_ip_length; +wire [15:0] rx_ip_identification; +wire [2:0] rx_ip_flags; +wire [12:0] rx_ip_fragment_offset; +wire [7:0] rx_ip_ttl; +wire [7:0] rx_ip_protocol; +wire [15:0] rx_ip_header_checksum; +wire [31:0] rx_ip_source_ip; +wire [31:0] rx_ip_dest_ip; +wire [63:0] rx_ip_payload_axis_tdata; +wire [7:0] rx_ip_payload_axis_tkeep; +wire rx_ip_payload_axis_tvalid; +wire rx_ip_payload_axis_tready; +wire rx_ip_payload_axis_tlast; +wire rx_ip_payload_axis_tuser; + +wire tx_ip_hdr_valid; +wire tx_ip_hdr_ready; +wire [5:0] tx_ip_dscp; +wire [1:0] tx_ip_ecn; +wire [15:0] tx_ip_length; +wire [7:0] tx_ip_ttl; +wire [7:0] tx_ip_protocol; +wire [31:0] tx_ip_source_ip; +wire [31:0] tx_ip_dest_ip; +wire [63:0] tx_ip_payload_axis_tdata; +wire [7:0] tx_ip_payload_axis_tkeep; +wire tx_ip_payload_axis_tvalid; +wire tx_ip_payload_axis_tready; +wire tx_ip_payload_axis_tlast; +wire tx_ip_payload_axis_tuser; + +// UDP frame connections +wire rx_udp_hdr_valid; +wire rx_udp_hdr_ready; +wire [47:0] rx_udp_eth_dest_mac; +wire [47:0] rx_udp_eth_src_mac; +wire [15:0] rx_udp_eth_type; +wire [3:0] rx_udp_ip_version; +wire [3:0] rx_udp_ip_ihl; +wire [5:0] rx_udp_ip_dscp; +wire [1:0] rx_udp_ip_ecn; +wire [15:0] rx_udp_ip_length; +wire [15:0] rx_udp_ip_identification; +wire [2:0] rx_udp_ip_flags; +wire [12:0] rx_udp_ip_fragment_offset; +wire [7:0] rx_udp_ip_ttl; +wire [7:0] rx_udp_ip_protocol; +wire [15:0] rx_udp_ip_header_checksum; +wire [31:0] rx_udp_ip_source_ip; +wire [31:0] rx_udp_ip_dest_ip; +wire [15:0] rx_udp_source_port; +wire [15:0] rx_udp_dest_port; +wire [15:0] rx_udp_length; +wire [15:0] rx_udp_checksum; +wire [63:0] rx_udp_payload_axis_tdata; +wire [7:0] rx_udp_payload_axis_tkeep; +wire rx_udp_payload_axis_tvalid; +wire rx_udp_payload_axis_tready; +wire rx_udp_payload_axis_tlast; +wire rx_udp_payload_axis_tuser; + +reg tx_udp_hdr_valid; +wire tx_udp_hdr_ready; +wire [5:0] tx_udp_ip_dscp; +wire [1:0] tx_udp_ip_ecn; +wire [7:0] tx_udp_ip_ttl; +wire [31:0] tx_udp_ip_source_ip; +wire [31:0] tx_udp_ip_dest_ip; +wire [15:0] tx_udp_source_port; +reg [15:0] tx_udp_dest_port; +reg [15:0] tx_udp_length; +wire [15:0] tx_udp_checksum; +wire [63:0] tx_udp_payload_axis_tdata; +wire [7:0] tx_udp_payload_axis_tkeep; +wire tx_udp_payload_axis_tvalid; +wire tx_udp_payload_axis_tready; +wire tx_udp_payload_axis_tlast; +wire tx_udp_payload_axis_tuser; + +// Configuration +// wire [47:0] local_mac = 48'h02_00_00_00_00_00; +wire [47:0] local_mac = MAC_ADDR; +// wire [31:0] local_ip = {8'd192, 8'd168, 8'd2, 8'd128}; +// wire [31:0] gateway_ip = {8'd192, 8'd168, 8'd2, 8'd1}; +wire [31:0] local_ip = {8'd192, 8'd168, IP_ADDR[7:0], 8'd128}; +wire [31:0] gateway_ip = {8'd192, 8'd168, IP_ADDR[7:0], 8'd1}; +wire [31:0] subnet_mask = {8'd255, 8'd255, 8'd255, 8'd0}; + +// wire [15:0] port = 16'd1234; +wire [15:0] port = PORT_IN; +wire [15:0] control_port = 16'd1235; +wire [15:0] control_packet_size = 16'd512; + +// IP ports not used +assign rx_ip_hdr_ready = 1; +assign rx_ip_payload_axis_tready = 1; + +assign tx_ip_hdr_valid = 0; +assign tx_ip_dscp = 0; +assign tx_ip_ecn = 0; +assign tx_ip_length = 0; +assign tx_ip_ttl = 0; +assign tx_ip_protocol = 0; +assign tx_ip_source_ip = 0; +assign tx_ip_dest_ip = 0; +assign tx_ip_payload_axis_tdata = 0; +assign tx_ip_payload_axis_tkeep = 0; +assign tx_ip_payload_axis_tvalid = 0; +assign tx_ip_payload_axis_tlast = 0; +assign tx_ip_payload_axis_tuser = 0; + +// Loop back UDP +wire match_cond = rx_udp_dest_port == PORT_IN; +wire no_match = ~match_cond; + +reg match_cond_reg = 0; +reg no_match_reg = 0; + +always @(posedge clk) begin + if (rst) begin + match_cond_reg <= 0; + no_match_reg <= 0; + end else begin + if (rx_udp_payload_axis_tvalid) begin + if ((~match_cond_reg & ~no_match_reg) | + (rx_udp_payload_axis_tvalid & rx_udp_payload_axis_tready & rx_udp_payload_axis_tlast)) begin + match_cond_reg <= match_cond; + no_match_reg <= no_match; + end + end else begin + match_cond_reg <= 0; + no_match_reg <= 0; + end + end +end + +assign rx_udp_hdr_ready = (tx_eth_hdr_ready & match_cond) | no_match; + +assign rx_fifo_udp_payload_axis_tdata = rx_udp_payload_axis_tdata; +assign rx_fifo_udp_payload_axis_tkeep = rx_udp_payload_axis_tkeep; +assign rx_fifo_udp_payload_axis_tvalid = rx_udp_payload_axis_tvalid & match_cond_reg; +assign rx_udp_payload_axis_tready = (rx_fifo_udp_payload_axis_tready & match_cond_reg) | no_match_reg; +assign rx_fifo_udp_payload_axis_tlast = rx_udp_payload_axis_tlast; +assign rx_fifo_udp_payload_axis_tuser = rx_udp_payload_axis_tuser; + +assign tx_udp_ip_dscp = 0; +assign tx_udp_ip_ecn = 0; +assign tx_udp_ip_ttl = 64; +assign tx_udp_ip_source_ip = local_ip; +assign tx_udp_ip_dest_ip = rx_udp_ip_source_ip; +// assign tx_udp_source_port = 16'd1234; +assign tx_udp_source_port = PORT_IN; +assign tx_udp_checksum = 0; + +assign tx_udp_payload_axis_tdata = tx_fifo_udp_payload_axis_tdata; +assign tx_udp_payload_axis_tkeep = tx_fifo_udp_payload_axis_tkeep; +assign tx_udp_payload_axis_tvalid = tx_fifo_udp_payload_axis_tvalid; +assign tx_fifo_udp_payload_axis_tready = tx_udp_payload_axis_tready; +assign tx_udp_payload_axis_tlast = tx_fifo_udp_payload_axis_tlast || tlast_udp; // what happens if tlast comes before payload length ends +// assign tx_udp_payload_axis_tuser = tx_fifo_udp_payload_axis_tuser; +assign tx_udp_payload_axis_tuser = 0; + +reg [12:0] packet_size_div_8; +// assign packet_size_div_8 = packet_size[15:3]; + +// Need to inject additional TLAST signals on UDP packet boundaries, incoming data from +// DMA will only have TLAST at very end +reg [15:0] tlast_cnt; +reg tlast_udp; +always @(posedge clk) begin + if (rst) begin + tlast_cnt <= 0; + tlast_udp <= 0; + tx_udp_hdr_valid <= 0; + // next_packet_ready <= 1; + tx_udp_length <= 1024; + packet_size_div_8 <= 128; + end else begin + if (tx_fifo_udp_payload_axis_tready && tx_fifo_udp_payload_axis_tvalid) begin + if (tlast_cnt == (packet_size_div_8-2)) begin + tlast_udp <= 1; + tlast_cnt <= tlast_cnt + 1; + end else if (tlast_cnt == (packet_size_div_8-1)) begin + tlast_udp <= 0; + tlast_cnt <= 0; +// next_packet_ready <= 1; + end else begin + tlast_cnt <= tlast_cnt + 1; + tlast_udp <= 0; + end + end else if (tx_fifo_udp_payload_axis_tready && tx_fifo_udp_payload_axis_tlast) begin + tlast_cnt <= 0; + end + + if (tx_udp_hdr_ready) begin + if (tx_fifo_udp_payload_axis_tvalid) begin + tx_udp_hdr_valid <= 1; + // next_packet_ready <= 0; + if (tx_fifo_udp_payload_axis_tdest == 15) begin + // Control Traffic + tx_udp_dest_port <= control_port; + tx_udp_length <= control_packet_size+8; + packet_size_div_8 <= (control_packet_size >> 3); + end else if (tx_fifo_udp_payload_axis_tdest == 0) begin + // Header Packet + tx_udp_dest_port <= port; + tx_udp_length <= 1024+8; + packet_size_div_8 <= (1024 >> 3); + end else begin + // Data Traffic + tx_udp_dest_port <= port; + tx_udp_length <= packet_size+8; + packet_size_div_8 <= (packet_size >> 3); + end + end + end else begin + tx_udp_hdr_valid = 0; + end + + + end +end + +eth_mac_10g_fifo #( + .ENABLE_PADDING(1), + .ENABLE_DIC(1), + .MIN_FRAME_LENGTH(64), + .TX_FIFO_DEPTH(8192), + .TX_FRAME_FIFO(1), + .RX_FIFO_DEPTH(8192), + .RX_FRAME_FIFO(1) +) +eth_mac_10g_fifo_inst ( + .rx_clk(sfp_rx_clk), + .rx_rst(sfp_rx_rst), + .tx_clk(sfp_tx_clk), + .tx_rst(sfp_tx_rst), + .logic_clk(clk), + .logic_rst(rst), + + .tx_axis_tdata(tx_axis_tdata), + .tx_axis_tkeep(tx_axis_tkeep), + .tx_axis_tvalid(tx_axis_tvalid), + .tx_axis_tready(tx_axis_tready), + .tx_axis_tlast(tx_axis_tlast), + .tx_axis_tuser(tx_axis_tuser), + + .rx_axis_tdata(rx_axis_tdata), + .rx_axis_tkeep(rx_axis_tkeep), + .rx_axis_tvalid(rx_axis_tvalid), + .rx_axis_tready(rx_axis_tready), + .rx_axis_tlast(rx_axis_tlast), + .rx_axis_tuser(rx_axis_tuser), + + .xgmii_rxd(sfp_rxd), + .xgmii_rxc(sfp_rxc), + .xgmii_txd(sfp_txd), + .xgmii_txc(sfp_txc), + + .tx_fifo_overflow(), + .tx_fifo_bad_frame(), + .tx_fifo_good_frame(), + .rx_error_bad_frame(), + .rx_error_bad_fcs(), + .rx_fifo_overflow(), + .rx_fifo_bad_frame(), + .rx_fifo_good_frame(), + + .cfg_ifg(8'd12), + .cfg_tx_enable(1'b1), + .cfg_rx_enable(1'b1) +); + +eth_axis_rx #( + .DATA_WIDTH(64) +) +eth_axis_rx_inst ( + .clk(clk), + .rst(rst), + // AXI input + .s_axis_tdata(rx_axis_tdata), + .s_axis_tkeep(rx_axis_tkeep), + .s_axis_tvalid(rx_axis_tvalid), + .s_axis_tready(rx_axis_tready), + .s_axis_tlast(rx_axis_tlast), + .s_axis_tuser(rx_axis_tuser), + // Ethernet frame output + .m_eth_hdr_valid(rx_eth_hdr_valid), + .m_eth_hdr_ready(rx_eth_hdr_ready), + .m_eth_dest_mac(rx_eth_dest_mac), + .m_eth_src_mac(rx_eth_src_mac), + .m_eth_type(rx_eth_type), + .m_eth_payload_axis_tdata(rx_eth_payload_axis_tdata), + .m_eth_payload_axis_tkeep(rx_eth_payload_axis_tkeep), + .m_eth_payload_axis_tvalid(rx_eth_payload_axis_tvalid), + .m_eth_payload_axis_tready(rx_eth_payload_axis_tready), + .m_eth_payload_axis_tlast(rx_eth_payload_axis_tlast), + .m_eth_payload_axis_tuser(rx_eth_payload_axis_tuser), + // Status signals + .busy(), + .error_header_early_termination() +); + +eth_axis_tx #( + .DATA_WIDTH(64) +) +eth_axis_tx_inst ( + .clk(clk), + .rst(rst), + // Ethernet frame input + .s_eth_hdr_valid(tx_eth_hdr_valid), + .s_eth_hdr_ready(tx_eth_hdr_ready), + .s_eth_dest_mac(tx_eth_dest_mac), + .s_eth_src_mac(tx_eth_src_mac), + .s_eth_type(tx_eth_type), + .s_eth_payload_axis_tdata(tx_eth_payload_axis_tdata), + .s_eth_payload_axis_tkeep(tx_eth_payload_axis_tkeep), + .s_eth_payload_axis_tvalid(tx_eth_payload_axis_tvalid), + .s_eth_payload_axis_tready(tx_eth_payload_axis_tready), + .s_eth_payload_axis_tlast(tx_eth_payload_axis_tlast), + .s_eth_payload_axis_tuser(tx_eth_payload_axis_tuser), + // AXI output + .m_axis_tdata(tx_axis_tdata), + .m_axis_tkeep(tx_axis_tkeep), + .m_axis_tvalid(tx_axis_tvalid), + .m_axis_tready(tx_axis_tready), + .m_axis_tlast(tx_axis_tlast), + .m_axis_tuser(tx_axis_tuser), + // Status signals + .busy() +); + +udp_complete_64 #( + .UDP_CHECKSUM_PAYLOAD_FIFO_DEPTH(4096) +) +udp_complete_inst ( + .clk(clk), + .rst(rst), + // Ethernet frame input + .s_eth_hdr_valid(rx_eth_hdr_valid), + .s_eth_hdr_ready(rx_eth_hdr_ready), + .s_eth_dest_mac(rx_eth_dest_mac), + .s_eth_src_mac(rx_eth_src_mac), + .s_eth_type(rx_eth_type), + .s_eth_payload_axis_tdata(rx_eth_payload_axis_tdata), + .s_eth_payload_axis_tkeep(rx_eth_payload_axis_tkeep), + .s_eth_payload_axis_tvalid(rx_eth_payload_axis_tvalid), + .s_eth_payload_axis_tready(rx_eth_payload_axis_tready), + .s_eth_payload_axis_tlast(rx_eth_payload_axis_tlast), + .s_eth_payload_axis_tuser(rx_eth_payload_axis_tuser), + // Ethernet frame output + .m_eth_hdr_valid(tx_eth_hdr_valid), + .m_eth_hdr_ready(tx_eth_hdr_ready), + .m_eth_dest_mac(tx_eth_dest_mac), + .m_eth_src_mac(tx_eth_src_mac), + .m_eth_type(tx_eth_type), + .m_eth_payload_axis_tdata(tx_eth_payload_axis_tdata), + .m_eth_payload_axis_tkeep(tx_eth_payload_axis_tkeep), + .m_eth_payload_axis_tvalid(tx_eth_payload_axis_tvalid), + .m_eth_payload_axis_tready(tx_eth_payload_axis_tready), + .m_eth_payload_axis_tlast(tx_eth_payload_axis_tlast), + .m_eth_payload_axis_tuser(tx_eth_payload_axis_tuser), + // IP frame input + .s_ip_hdr_valid(tx_ip_hdr_valid), + .s_ip_hdr_ready(tx_ip_hdr_ready), + .s_ip_dscp(tx_ip_dscp), + .s_ip_ecn(tx_ip_ecn), + .s_ip_length(tx_ip_length), + .s_ip_ttl(tx_ip_ttl), + .s_ip_protocol(tx_ip_protocol), + .s_ip_source_ip(tx_ip_source_ip), + .s_ip_dest_ip(tx_ip_dest_ip), + .s_ip_payload_axis_tdata(tx_ip_payload_axis_tdata), + .s_ip_payload_axis_tkeep(tx_ip_payload_axis_tkeep), + .s_ip_payload_axis_tvalid(tx_ip_payload_axis_tvalid), + .s_ip_payload_axis_tready(tx_ip_payload_axis_tready), + .s_ip_payload_axis_tlast(tx_ip_payload_axis_tlast), + .s_ip_payload_axis_tuser(tx_ip_payload_axis_tuser), + // IP frame output + .m_ip_hdr_valid(rx_ip_hdr_valid), + .m_ip_hdr_ready(rx_ip_hdr_ready), + .m_ip_eth_dest_mac(rx_ip_eth_dest_mac), + .m_ip_eth_src_mac(rx_ip_eth_src_mac), + .m_ip_eth_type(rx_ip_eth_type), + .m_ip_version(rx_ip_version), + .m_ip_ihl(rx_ip_ihl), + .m_ip_dscp(rx_ip_dscp), + .m_ip_ecn(rx_ip_ecn), + .m_ip_length(rx_ip_length), + .m_ip_identification(rx_ip_identification), + .m_ip_flags(rx_ip_flags), + .m_ip_fragment_offset(rx_ip_fragment_offset), + .m_ip_ttl(rx_ip_ttl), + .m_ip_protocol(rx_ip_protocol), + .m_ip_header_checksum(rx_ip_header_checksum), + .m_ip_source_ip(rx_ip_source_ip), + .m_ip_dest_ip(rx_ip_dest_ip), + .m_ip_payload_axis_tdata(rx_ip_payload_axis_tdata), + .m_ip_payload_axis_tkeep(rx_ip_payload_axis_tkeep), + .m_ip_payload_axis_tvalid(rx_ip_payload_axis_tvalid), + .m_ip_payload_axis_tready(rx_ip_payload_axis_tready), + .m_ip_payload_axis_tlast(rx_ip_payload_axis_tlast), + .m_ip_payload_axis_tuser(rx_ip_payload_axis_tuser), + // UDP frame input + .s_udp_hdr_valid(tx_udp_hdr_valid), + .s_udp_hdr_ready(tx_udp_hdr_ready), + .s_udp_ip_dscp(tx_udp_ip_dscp), + .s_udp_ip_ecn(tx_udp_ip_ecn), + .s_udp_ip_ttl(tx_udp_ip_ttl), + .s_udp_ip_source_ip(tx_udp_ip_source_ip), + .s_udp_ip_dest_ip(tx_udp_ip_dest_ip), + .s_udp_source_port(tx_udp_source_port), + .s_udp_dest_port(tx_udp_dest_port), + .s_udp_length(tx_udp_length), + .s_udp_checksum(tx_udp_checksum), + .s_udp_payload_axis_tdata(tx_udp_payload_axis_tdata), + .s_udp_payload_axis_tkeep(tx_udp_payload_axis_tkeep), + .s_udp_payload_axis_tvalid(tx_udp_payload_axis_tvalid), + .s_udp_payload_axis_tready(tx_udp_payload_axis_tready), + .s_udp_payload_axis_tlast(tx_udp_payload_axis_tlast), + .s_udp_payload_axis_tuser(tx_udp_payload_axis_tuser), + // UDP frame output + .m_udp_hdr_valid(rx_udp_hdr_valid), + .m_udp_hdr_ready(rx_udp_hdr_ready), + .m_udp_eth_dest_mac(rx_udp_eth_dest_mac), + .m_udp_eth_src_mac(rx_udp_eth_src_mac), + .m_udp_eth_type(rx_udp_eth_type), + .m_udp_ip_version(rx_udp_ip_version), + .m_udp_ip_ihl(rx_udp_ip_ihl), + .m_udp_ip_dscp(rx_udp_ip_dscp), + .m_udp_ip_ecn(rx_udp_ip_ecn), + .m_udp_ip_length(rx_udp_ip_length), + .m_udp_ip_identification(rx_udp_ip_identification), + .m_udp_ip_flags(rx_udp_ip_flags), + .m_udp_ip_fragment_offset(rx_udp_ip_fragment_offset), + .m_udp_ip_ttl(rx_udp_ip_ttl), + .m_udp_ip_protocol(rx_udp_ip_protocol), + .m_udp_ip_header_checksum(rx_udp_ip_header_checksum), + .m_udp_ip_source_ip(rx_udp_ip_source_ip), + .m_udp_ip_dest_ip(rx_udp_ip_dest_ip), + .m_udp_source_port(rx_udp_source_port), + .m_udp_dest_port(rx_udp_dest_port), + .m_udp_length(rx_udp_length), + .m_udp_checksum(rx_udp_checksum), + .m_udp_payload_axis_tdata(rx_udp_payload_axis_tdata), + .m_udp_payload_axis_tkeep(rx_udp_payload_axis_tkeep), + .m_udp_payload_axis_tvalid(rx_udp_payload_axis_tvalid), + .m_udp_payload_axis_tready(rx_udp_payload_axis_tready), + .m_udp_payload_axis_tlast(rx_udp_payload_axis_tlast), + .m_udp_payload_axis_tuser(rx_udp_payload_axis_tuser), + // Status signals + .ip_rx_busy(), + .ip_tx_busy(), + .udp_rx_busy(), + .udp_tx_busy(), + .ip_rx_error_header_early_termination(), + .ip_rx_error_payload_early_termination(), + .ip_rx_error_invalid_header(), + .ip_rx_error_invalid_checksum(), + .ip_tx_error_payload_early_termination(), + .ip_tx_error_arp_failed(), + .udp_rx_error_header_early_termination(), + .udp_rx_error_payload_early_termination(), + .udp_tx_error_payload_early_termination(), + // Configuration + .local_mac(local_mac), + .local_ip(local_ip), + .gateway_ip(gateway_ip), + .subnet_mask(subnet_mask), + .clear_arp_cache(1'b0) +); + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_64.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_64.v new file mode 100755 index 0000000..d4cb8ff --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_64.v @@ -0,0 +1,353 @@ +/* + +Copyright (c) 2014-2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * IPv4 block, ethernet frame interface (64 bit datapath) + */ +module ip_64 +( + input wire clk, + input wire rst, + + /* + * Ethernet frame input + */ + input wire s_eth_hdr_valid, + output wire s_eth_hdr_ready, + input wire [47:0] s_eth_dest_mac, + input wire [47:0] s_eth_src_mac, + input wire [15:0] s_eth_type, + input wire [63:0] s_eth_payload_axis_tdata, + input wire [7:0] s_eth_payload_axis_tkeep, + input wire s_eth_payload_axis_tvalid, + output wire s_eth_payload_axis_tready, + input wire s_eth_payload_axis_tlast, + input wire s_eth_payload_axis_tuser, + + /* + * Ethernet frame output + */ + output wire m_eth_hdr_valid, + input wire m_eth_hdr_ready, + output wire [47:0] m_eth_dest_mac, + output wire [47:0] m_eth_src_mac, + output wire [15:0] m_eth_type, + output wire [63:0] m_eth_payload_axis_tdata, + output wire [7:0] m_eth_payload_axis_tkeep, + output wire m_eth_payload_axis_tvalid, + input wire m_eth_payload_axis_tready, + output wire m_eth_payload_axis_tlast, + output wire m_eth_payload_axis_tuser, + + /* + * ARP requests + */ + output wire arp_request_valid, + input wire arp_request_ready, + output wire [31:0] arp_request_ip, + input wire arp_response_valid, + output wire arp_response_ready, + input wire arp_response_error, + input wire [47:0] arp_response_mac, + + /* + * IP input + */ + input wire s_ip_hdr_valid, + output wire s_ip_hdr_ready, + input wire [5:0] s_ip_dscp, + input wire [1:0] s_ip_ecn, + input wire [15:0] s_ip_length, + input wire [7:0] s_ip_ttl, + input wire [7:0] s_ip_protocol, + input wire [31:0] s_ip_source_ip, + input wire [31:0] s_ip_dest_ip, + input wire [63:0] s_ip_payload_axis_tdata, + input wire [7:0] s_ip_payload_axis_tkeep, + input wire s_ip_payload_axis_tvalid, + output wire s_ip_payload_axis_tready, + input wire s_ip_payload_axis_tlast, + input wire s_ip_payload_axis_tuser, + + /* + * IP output + */ + output wire m_ip_hdr_valid, + input wire m_ip_hdr_ready, + output wire [47:0] m_ip_eth_dest_mac, + output wire [47:0] m_ip_eth_src_mac, + output wire [15:0] m_ip_eth_type, + output wire [3:0] m_ip_version, + output wire [3:0] m_ip_ihl, + output wire [5:0] m_ip_dscp, + output wire [1:0] m_ip_ecn, + output wire [15:0] m_ip_length, + output wire [15:0] m_ip_identification, + output wire [2:0] m_ip_flags, + output wire [12:0] m_ip_fragment_offset, + output wire [7:0] m_ip_ttl, + output wire [7:0] m_ip_protocol, + output wire [15:0] m_ip_header_checksum, + output wire [31:0] m_ip_source_ip, + output wire [31:0] m_ip_dest_ip, + output wire [63:0] m_ip_payload_axis_tdata, + output wire [7:0] m_ip_payload_axis_tkeep, + output wire m_ip_payload_axis_tvalid, + input wire m_ip_payload_axis_tready, + output wire m_ip_payload_axis_tlast, + output wire m_ip_payload_axis_tuser, + + /* + * Status + */ + output wire rx_busy, + output wire tx_busy, + output wire rx_error_header_early_termination, + output wire rx_error_payload_early_termination, + output wire rx_error_invalid_header, + output wire rx_error_invalid_checksum, + output wire tx_error_payload_early_termination, + output wire tx_error_arp_failed, + + /* + * Configuration + */ + input wire [47:0] local_mac, + input wire [31:0] local_ip +); + +localparam [1:0] + STATE_IDLE = 2'd0, + STATE_ARP_QUERY = 2'd1, + STATE_WAIT_PACKET = 2'd2; + +reg [1:0] state_reg = STATE_IDLE, state_next; + +reg outgoing_ip_hdr_valid_reg = 1'b0, outgoing_ip_hdr_valid_next; +wire outgoing_ip_hdr_ready; +reg [47:0] outgoing_eth_dest_mac_reg = 48'h000000000000, outgoing_eth_dest_mac_next; +wire outgoing_ip_payload_axis_tready; + +/* + * IP frame processing + */ +ip_eth_rx_64 +ip_eth_rx_64_inst ( + .clk(clk), + .rst(rst), + // Ethernet frame input + .s_eth_hdr_valid(s_eth_hdr_valid), + .s_eth_hdr_ready(s_eth_hdr_ready), + .s_eth_dest_mac(s_eth_dest_mac), + .s_eth_src_mac(s_eth_src_mac), + .s_eth_type(s_eth_type), + .s_eth_payload_axis_tdata(s_eth_payload_axis_tdata), + .s_eth_payload_axis_tkeep(s_eth_payload_axis_tkeep), + .s_eth_payload_axis_tvalid(s_eth_payload_axis_tvalid), + .s_eth_payload_axis_tready(s_eth_payload_axis_tready), + .s_eth_payload_axis_tlast(s_eth_payload_axis_tlast), + .s_eth_payload_axis_tuser(s_eth_payload_axis_tuser), + // IP frame output + .m_ip_hdr_valid(m_ip_hdr_valid), + .m_ip_hdr_ready(m_ip_hdr_ready), + .m_eth_dest_mac(m_ip_eth_dest_mac), + .m_eth_src_mac(m_ip_eth_src_mac), + .m_eth_type(m_ip_eth_type), + .m_ip_version(m_ip_version), + .m_ip_ihl(m_ip_ihl), + .m_ip_dscp(m_ip_dscp), + .m_ip_ecn(m_ip_ecn), + .m_ip_length(m_ip_length), + .m_ip_identification(m_ip_identification), + .m_ip_flags(m_ip_flags), + .m_ip_fragment_offset(m_ip_fragment_offset), + .m_ip_ttl(m_ip_ttl), + .m_ip_protocol(m_ip_protocol), + .m_ip_header_checksum(m_ip_header_checksum), + .m_ip_source_ip(m_ip_source_ip), + .m_ip_dest_ip(m_ip_dest_ip), + .m_ip_payload_axis_tdata(m_ip_payload_axis_tdata), + .m_ip_payload_axis_tkeep(m_ip_payload_axis_tkeep), + .m_ip_payload_axis_tvalid(m_ip_payload_axis_tvalid), + .m_ip_payload_axis_tready(m_ip_payload_axis_tready), + .m_ip_payload_axis_tlast(m_ip_payload_axis_tlast), + .m_ip_payload_axis_tuser(m_ip_payload_axis_tuser), + // Status signals + .busy(rx_busy), + .error_header_early_termination(rx_error_header_early_termination), + .error_payload_early_termination(rx_error_payload_early_termination), + .error_invalid_header(rx_error_invalid_header), + .error_invalid_checksum(rx_error_invalid_checksum) +); + +ip_eth_tx_64 +ip_eth_tx_64_inst ( + .clk(clk), + .rst(rst), + // IP frame input + .s_ip_hdr_valid(outgoing_ip_hdr_valid_reg), + .s_ip_hdr_ready(outgoing_ip_hdr_ready), + .s_eth_dest_mac(outgoing_eth_dest_mac_reg), + .s_eth_src_mac(local_mac), + .s_eth_type(16'h0800), + .s_ip_dscp(s_ip_dscp), + .s_ip_ecn(s_ip_ecn), + .s_ip_length(s_ip_length), + .s_ip_identification(16'd0), + .s_ip_flags(3'b010), + .s_ip_fragment_offset(13'd0), + .s_ip_ttl(s_ip_ttl), + .s_ip_protocol(s_ip_protocol), + .s_ip_source_ip(s_ip_source_ip), + .s_ip_dest_ip(s_ip_dest_ip), + .s_ip_payload_axis_tdata(s_ip_payload_axis_tdata), + .s_ip_payload_axis_tkeep(s_ip_payload_axis_tkeep), + .s_ip_payload_axis_tvalid(s_ip_payload_axis_tvalid), + .s_ip_payload_axis_tready(outgoing_ip_payload_axis_tready), + .s_ip_payload_axis_tlast(s_ip_payload_axis_tlast), + .s_ip_payload_axis_tuser(s_ip_payload_axis_tuser), + // Ethernet frame output + .m_eth_hdr_valid(m_eth_hdr_valid), + .m_eth_hdr_ready(m_eth_hdr_ready), + .m_eth_dest_mac(m_eth_dest_mac), + .m_eth_src_mac(m_eth_src_mac), + .m_eth_type(m_eth_type), + .m_eth_payload_axis_tdata(m_eth_payload_axis_tdata), + .m_eth_payload_axis_tkeep(m_eth_payload_axis_tkeep), + .m_eth_payload_axis_tvalid(m_eth_payload_axis_tvalid), + .m_eth_payload_axis_tready(m_eth_payload_axis_tready), + .m_eth_payload_axis_tlast(m_eth_payload_axis_tlast), + .m_eth_payload_axis_tuser(m_eth_payload_axis_tuser), + // Status signals + .busy(tx_busy), + .error_payload_early_termination(tx_error_payload_early_termination) +); + +reg s_ip_hdr_ready_reg = 1'b0, s_ip_hdr_ready_next; + +reg arp_request_valid_reg = 1'b0, arp_request_valid_next; + +reg arp_response_ready_reg = 1'b0, arp_response_ready_next; + +reg drop_packet_reg = 1'b0, drop_packet_next; + +assign s_ip_hdr_ready = s_ip_hdr_ready_reg; +assign s_ip_payload_axis_tready = outgoing_ip_payload_axis_tready || drop_packet_reg; + +assign arp_request_valid = arp_request_valid_reg; +assign arp_request_ip = s_ip_dest_ip; +assign arp_response_ready = arp_response_ready_reg; + +assign tx_error_arp_failed = arp_response_error; + +always @* begin + state_next = STATE_IDLE; + + arp_request_valid_next = arp_request_valid_reg && !arp_request_ready; + arp_response_ready_next = 1'b0; + drop_packet_next = 1'b0; + + s_ip_hdr_ready_next = 1'b0; + + outgoing_ip_hdr_valid_next = outgoing_ip_hdr_valid_reg && !outgoing_ip_hdr_ready; + outgoing_eth_dest_mac_next = outgoing_eth_dest_mac_reg; + + case (state_reg) + STATE_IDLE: begin + // wait for outgoing packet + if (s_ip_hdr_valid) begin + // initiate ARP request + arp_request_valid_next = 1'b1; + arp_response_ready_next = 1'b1; + state_next = STATE_ARP_QUERY; + end else begin + state_next = STATE_IDLE; + end + end + STATE_ARP_QUERY: begin + arp_response_ready_next = 1'b1; + + if (arp_response_valid) begin + // wait for ARP reponse + if (arp_response_error) begin + // did not get MAC address; drop packet + s_ip_hdr_ready_next = 1'b1; + drop_packet_next = 1'b1; + state_next = STATE_WAIT_PACKET; + end else begin + // got MAC address; send packet + s_ip_hdr_ready_next = 1'b1; + outgoing_ip_hdr_valid_next = 1'b1; + outgoing_eth_dest_mac_next = arp_response_mac; + state_next = STATE_WAIT_PACKET; + end + end else begin + state_next = STATE_ARP_QUERY; + end + end + STATE_WAIT_PACKET: begin + drop_packet_next = drop_packet_reg; + + // wait for packet transfer to complete + if (s_ip_payload_axis_tlast && s_ip_payload_axis_tready && s_ip_payload_axis_tvalid) begin + state_next = STATE_IDLE; + end else begin + state_next = STATE_WAIT_PACKET; + end + end + endcase +end + +always @(posedge clk) begin + if (rst) begin + state_reg <= STATE_IDLE; + arp_request_valid_reg <= 1'b0; + arp_response_ready_reg <= 1'b0; + drop_packet_reg <= 1'b0; + s_ip_hdr_ready_reg <= 1'b0; + outgoing_ip_hdr_valid_reg <= 1'b0; + end else begin + state_reg <= state_next; + + arp_request_valid_reg <= arp_request_valid_next; + arp_response_ready_reg <= arp_response_ready_next; + drop_packet_reg <= drop_packet_next; + + s_ip_hdr_ready_reg <= s_ip_hdr_ready_next; + + outgoing_ip_hdr_valid_reg <= outgoing_ip_hdr_valid_next; + end + + outgoing_eth_dest_mac_reg <= outgoing_eth_dest_mac_next; +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_arb_mux.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_arb_mux.v new file mode 100755 index 0000000..fbda910 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_arb_mux.v @@ -0,0 +1,406 @@ +/* + +Copyright (c) 2014-2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * IP arbitrated multiplexer + */ +module ip_arb_mux # +( + parameter S_COUNT = 4, + parameter DATA_WIDTH = 8, + parameter KEEP_ENABLE = (DATA_WIDTH>8), + parameter KEEP_WIDTH = (DATA_WIDTH/8), + parameter ID_ENABLE = 0, + parameter ID_WIDTH = 8, + parameter DEST_ENABLE = 0, + parameter DEST_WIDTH = 8, + parameter USER_ENABLE = 1, + parameter USER_WIDTH = 1, + // select round robin arbitration + parameter ARB_TYPE_ROUND_ROBIN = 0, + // LSB priority selection + parameter ARB_LSB_HIGH_PRIORITY = 1 +) +( + input wire clk, + input wire rst, + + /* + * IP frame inputs + */ + input wire [S_COUNT-1:0] s_ip_hdr_valid, + output wire [S_COUNT-1:0] s_ip_hdr_ready, + input wire [S_COUNT*48-1:0] s_eth_dest_mac, + input wire [S_COUNT*48-1:0] s_eth_src_mac, + input wire [S_COUNT*16-1:0] s_eth_type, + input wire [S_COUNT*4-1:0] s_ip_version, + input wire [S_COUNT*4-1:0] s_ip_ihl, + input wire [S_COUNT*6-1:0] s_ip_dscp, + input wire [S_COUNT*2-1:0] s_ip_ecn, + input wire [S_COUNT*16-1:0] s_ip_length, + input wire [S_COUNT*16-1:0] s_ip_identification, + input wire [S_COUNT*3-1:0] s_ip_flags, + input wire [S_COUNT*13-1:0] s_ip_fragment_offset, + input wire [S_COUNT*8-1:0] s_ip_ttl, + input wire [S_COUNT*8-1:0] s_ip_protocol, + input wire [S_COUNT*16-1:0] s_ip_header_checksum, + input wire [S_COUNT*32-1:0] s_ip_source_ip, + input wire [S_COUNT*32-1:0] s_ip_dest_ip, + input wire [S_COUNT*DATA_WIDTH-1:0] s_ip_payload_axis_tdata, + input wire [S_COUNT*KEEP_WIDTH-1:0] s_ip_payload_axis_tkeep, + input wire [S_COUNT-1:0] s_ip_payload_axis_tvalid, + output wire [S_COUNT-1:0] s_ip_payload_axis_tready, + input wire [S_COUNT-1:0] s_ip_payload_axis_tlast, + input wire [S_COUNT*ID_WIDTH-1:0] s_ip_payload_axis_tid, + input wire [S_COUNT*DEST_WIDTH-1:0] s_ip_payload_axis_tdest, + input wire [S_COUNT*USER_WIDTH-1:0] s_ip_payload_axis_tuser, + + /* + * IP frame output + */ + output wire m_ip_hdr_valid, + input wire m_ip_hdr_ready, + output wire [47:0] m_eth_dest_mac, + output wire [47:0] m_eth_src_mac, + output wire [15:0] m_eth_type, + output wire [3:0] m_ip_version, + output wire [3:0] m_ip_ihl, + output wire [5:0] m_ip_dscp, + output wire [1:0] m_ip_ecn, + output wire [15:0] m_ip_length, + output wire [15:0] m_ip_identification, + output wire [2:0] m_ip_flags, + output wire [12:0] m_ip_fragment_offset, + output wire [7:0] m_ip_ttl, + output wire [7:0] m_ip_protocol, + output wire [15:0] m_ip_header_checksum, + output wire [31:0] m_ip_source_ip, + output wire [31:0] m_ip_dest_ip, + output wire [DATA_WIDTH-1:0] m_ip_payload_axis_tdata, + output wire [KEEP_WIDTH-1:0] m_ip_payload_axis_tkeep, + output wire m_ip_payload_axis_tvalid, + input wire m_ip_payload_axis_tready, + output wire m_ip_payload_axis_tlast, + output wire [ID_WIDTH-1:0] m_ip_payload_axis_tid, + output wire [DEST_WIDTH-1:0] m_ip_payload_axis_tdest, + output wire [USER_WIDTH-1:0] m_ip_payload_axis_tuser +); + +parameter CL_S_COUNT = $clog2(S_COUNT); + +reg frame_reg = 1'b0, frame_next; + +reg [S_COUNT-1:0] s_ip_hdr_ready_reg = {S_COUNT{1'b0}}, s_ip_hdr_ready_next; + +reg m_ip_hdr_valid_reg = 1'b0, m_ip_hdr_valid_next; +reg [47:0] m_eth_dest_mac_reg = 48'd0, m_eth_dest_mac_next; +reg [47:0] m_eth_src_mac_reg = 48'd0, m_eth_src_mac_next; +reg [15:0] m_eth_type_reg = 16'd0, m_eth_type_next; +reg [3:0] m_ip_version_reg = 4'd0, m_ip_version_next; +reg [3:0] m_ip_ihl_reg = 4'd0, m_ip_ihl_next; +reg [5:0] m_ip_dscp_reg = 6'd0, m_ip_dscp_next; +reg [1:0] m_ip_ecn_reg = 2'd0, m_ip_ecn_next; +reg [15:0] m_ip_length_reg = 16'd0, m_ip_length_next; +reg [15:0] m_ip_identification_reg = 16'd0, m_ip_identification_next; +reg [2:0] m_ip_flags_reg = 3'd0, m_ip_flags_next; +reg [12:0] m_ip_fragment_offset_reg = 13'd0, m_ip_fragment_offset_next; +reg [7:0] m_ip_ttl_reg = 8'd0, m_ip_ttl_next; +reg [7:0] m_ip_protocol_reg = 8'd0, m_ip_protocol_next; +reg [15:0] m_ip_header_checksum_reg = 16'd0, m_ip_header_checksum_next; +reg [31:0] m_ip_source_ip_reg = 32'd0, m_ip_source_ip_next; +reg [31:0] m_ip_dest_ip_reg = 32'd0, m_ip_dest_ip_next; + +wire [S_COUNT-1:0] request; +wire [S_COUNT-1:0] acknowledge; +wire [S_COUNT-1:0] grant; +wire grant_valid; +wire [CL_S_COUNT-1:0] grant_encoded; + +// internal datapath +reg [DATA_WIDTH-1:0] m_ip_payload_axis_tdata_int; +reg [KEEP_WIDTH-1:0] m_ip_payload_axis_tkeep_int; +reg m_ip_payload_axis_tvalid_int; +reg m_ip_payload_axis_tready_int_reg = 1'b0; +reg m_ip_payload_axis_tlast_int; +reg [ID_WIDTH-1:0] m_ip_payload_axis_tid_int; +reg [DEST_WIDTH-1:0] m_ip_payload_axis_tdest_int; +reg [USER_WIDTH-1:0] m_ip_payload_axis_tuser_int; +wire m_ip_payload_axis_tready_int_early; + +assign s_ip_hdr_ready = s_ip_hdr_ready_reg; + +assign s_ip_payload_axis_tready = (m_ip_payload_axis_tready_int_reg && grant_valid) << grant_encoded; + +assign m_ip_hdr_valid = m_ip_hdr_valid_reg; +assign m_eth_dest_mac = m_eth_dest_mac_reg; +assign m_eth_src_mac = m_eth_src_mac_reg; +assign m_eth_type = m_eth_type_reg; +assign m_ip_version = m_ip_version_reg; +assign m_ip_ihl = m_ip_ihl_reg; +assign m_ip_dscp = m_ip_dscp_reg; +assign m_ip_ecn = m_ip_ecn_reg; +assign m_ip_length = m_ip_length_reg; +assign m_ip_identification = m_ip_identification_reg; +assign m_ip_flags = m_ip_flags_reg; +assign m_ip_fragment_offset = m_ip_fragment_offset_reg; +assign m_ip_ttl = m_ip_ttl_reg; +assign m_ip_protocol = m_ip_protocol_reg; +assign m_ip_header_checksum = m_ip_header_checksum_reg; +assign m_ip_source_ip = m_ip_source_ip_reg; +assign m_ip_dest_ip = m_ip_dest_ip_reg; + +// mux for incoming packet +wire [DATA_WIDTH-1:0] current_s_tdata = s_ip_payload_axis_tdata[grant_encoded*DATA_WIDTH +: DATA_WIDTH]; +wire [KEEP_WIDTH-1:0] current_s_tkeep = s_ip_payload_axis_tkeep[grant_encoded*KEEP_WIDTH +: KEEP_WIDTH]; +wire current_s_tvalid = s_ip_payload_axis_tvalid[grant_encoded]; +wire current_s_tready = s_ip_payload_axis_tready[grant_encoded]; +wire current_s_tlast = s_ip_payload_axis_tlast[grant_encoded]; +wire [ID_WIDTH-1:0] current_s_tid = s_ip_payload_axis_tid[grant_encoded*ID_WIDTH +: ID_WIDTH]; +wire [DEST_WIDTH-1:0] current_s_tdest = s_ip_payload_axis_tdest[grant_encoded*DEST_WIDTH +: DEST_WIDTH]; +wire [USER_WIDTH-1:0] current_s_tuser = s_ip_payload_axis_tuser[grant_encoded*USER_WIDTH +: USER_WIDTH]; + +// arbiter instance +arbiter #( + .PORTS(S_COUNT), + .ARB_TYPE_ROUND_ROBIN(ARB_TYPE_ROUND_ROBIN), + .ARB_BLOCK(1), + .ARB_BLOCK_ACK(1), + .ARB_LSB_HIGH_PRIORITY(ARB_LSB_HIGH_PRIORITY) +) +arb_inst ( + .clk(clk), + .rst(rst), + .request(request), + .acknowledge(acknowledge), + .grant(grant), + .grant_valid(grant_valid), + .grant_encoded(grant_encoded) +); + +assign request = s_ip_hdr_valid & ~grant; +assign acknowledge = grant & s_ip_payload_axis_tvalid & s_ip_payload_axis_tready & s_ip_payload_axis_tlast; + +always @* begin + frame_next = frame_reg; + + s_ip_hdr_ready_next = {S_COUNT{1'b0}}; + + m_ip_hdr_valid_next = m_ip_hdr_valid_reg && !m_ip_hdr_ready; + m_eth_dest_mac_next = m_eth_dest_mac_reg; + m_eth_src_mac_next = m_eth_src_mac_reg; + m_eth_type_next = m_eth_type_reg; + m_ip_version_next = m_ip_version_reg; + m_ip_ihl_next = m_ip_ihl_reg; + m_ip_dscp_next = m_ip_dscp_reg; + m_ip_ecn_next = m_ip_ecn_reg; + m_ip_length_next = m_ip_length_reg; + m_ip_identification_next = m_ip_identification_reg; + m_ip_flags_next = m_ip_flags_reg; + m_ip_fragment_offset_next = m_ip_fragment_offset_reg; + m_ip_ttl_next = m_ip_ttl_reg; + m_ip_protocol_next = m_ip_protocol_reg; + m_ip_header_checksum_next = m_ip_header_checksum_reg; + m_ip_source_ip_next = m_ip_source_ip_reg; + m_ip_dest_ip_next = m_ip_dest_ip_reg; + + if (s_ip_payload_axis_tvalid[grant_encoded] && s_ip_payload_axis_tready[grant_encoded]) begin + // end of frame detection + if (s_ip_payload_axis_tlast[grant_encoded]) begin + frame_next = 1'b0; + end + end + + if (!frame_reg && grant_valid && (m_ip_hdr_ready || !m_ip_hdr_valid)) begin + // start of frame + frame_next = 1'b1; + + s_ip_hdr_ready_next = grant; + + m_ip_hdr_valid_next = 1'b1; + m_eth_dest_mac_next = s_eth_dest_mac[grant_encoded*48 +: 48]; + m_eth_src_mac_next = s_eth_src_mac[grant_encoded*48 +: 48]; + m_eth_type_next = s_eth_type[grant_encoded*16 +: 16]; + m_ip_version_next = s_ip_version[grant_encoded*4 +: 4]; + m_ip_ihl_next = s_ip_ihl[grant_encoded*4 +: 4]; + m_ip_dscp_next = s_ip_dscp[grant_encoded*6 +: 6]; + m_ip_ecn_next = s_ip_ecn[grant_encoded*2 +: 2]; + m_ip_length_next = s_ip_length[grant_encoded*16 +: 16]; + m_ip_identification_next = s_ip_identification[grant_encoded*16 +: 16]; + m_ip_flags_next = s_ip_flags[grant_encoded*3 +: 3]; + m_ip_fragment_offset_next = s_ip_fragment_offset[grant_encoded*13 +: 13]; + m_ip_ttl_next = s_ip_ttl[grant_encoded*8 +: 8]; + m_ip_protocol_next = s_ip_protocol[grant_encoded*8 +: 8]; + m_ip_header_checksum_next = s_ip_header_checksum[grant_encoded*16 +: 16]; + m_ip_source_ip_next = s_ip_source_ip[grant_encoded*32 +: 32]; + m_ip_dest_ip_next = s_ip_dest_ip[grant_encoded*32 +: 32]; + end + + // pass through selected packet data + m_ip_payload_axis_tdata_int = current_s_tdata; + m_ip_payload_axis_tkeep_int = current_s_tkeep; + m_ip_payload_axis_tvalid_int = current_s_tvalid && m_ip_payload_axis_tready_int_reg && grant_valid; + m_ip_payload_axis_tlast_int = current_s_tlast; + m_ip_payload_axis_tid_int = current_s_tid; + m_ip_payload_axis_tdest_int = current_s_tdest; + m_ip_payload_axis_tuser_int = current_s_tuser; +end + +always @(posedge clk) begin + frame_reg <= frame_next; + + s_ip_hdr_ready_reg <= s_ip_hdr_ready_next; + + m_ip_hdr_valid_reg <= m_ip_hdr_valid_next; + m_eth_dest_mac_reg <= m_eth_dest_mac_next; + m_eth_src_mac_reg <= m_eth_src_mac_next; + m_eth_type_reg <= m_eth_type_next; + m_ip_version_reg <= m_ip_version_next; + m_ip_ihl_reg <= m_ip_ihl_next; + m_ip_dscp_reg <= m_ip_dscp_next; + m_ip_ecn_reg <= m_ip_ecn_next; + m_ip_length_reg <= m_ip_length_next; + m_ip_identification_reg <= m_ip_identification_next; + m_ip_flags_reg <= m_ip_flags_next; + m_ip_fragment_offset_reg <= m_ip_fragment_offset_next; + m_ip_ttl_reg <= m_ip_ttl_next; + m_ip_protocol_reg <= m_ip_protocol_next; + m_ip_header_checksum_reg <= m_ip_header_checksum_next; + m_ip_source_ip_reg <= m_ip_source_ip_next; + m_ip_dest_ip_reg <= m_ip_dest_ip_next; + + if (rst) begin + frame_reg <= 1'b0; + s_ip_hdr_ready_reg <= {S_COUNT{1'b0}}; + m_ip_hdr_valid_reg <= 1'b0; + end +end + +// output datapath logic +reg [DATA_WIDTH-1:0] m_ip_payload_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] m_ip_payload_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg m_ip_payload_axis_tvalid_reg = 1'b0, m_ip_payload_axis_tvalid_next; +reg m_ip_payload_axis_tlast_reg = 1'b0; +reg [ID_WIDTH-1:0] m_ip_payload_axis_tid_reg = {ID_WIDTH{1'b0}}; +reg [DEST_WIDTH-1:0] m_ip_payload_axis_tdest_reg = {DEST_WIDTH{1'b0}}; +reg [USER_WIDTH-1:0] m_ip_payload_axis_tuser_reg = {USER_WIDTH{1'b0}}; + +reg [DATA_WIDTH-1:0] temp_m_ip_payload_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] temp_m_ip_payload_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg temp_m_ip_payload_axis_tvalid_reg = 1'b0, temp_m_ip_payload_axis_tvalid_next; +reg temp_m_ip_payload_axis_tlast_reg = 1'b0; +reg [ID_WIDTH-1:0] temp_m_ip_payload_axis_tid_reg = {ID_WIDTH{1'b0}}; +reg [DEST_WIDTH-1:0] temp_m_ip_payload_axis_tdest_reg = {DEST_WIDTH{1'b0}}; +reg [USER_WIDTH-1:0] temp_m_ip_payload_axis_tuser_reg = {USER_WIDTH{1'b0}}; + +// datapath control +reg store_axis_int_to_output; +reg store_axis_int_to_temp; +reg store_ip_payload_axis_temp_to_output; + +assign m_ip_payload_axis_tdata = m_ip_payload_axis_tdata_reg; +assign m_ip_payload_axis_tkeep = KEEP_ENABLE ? m_ip_payload_axis_tkeep_reg : {KEEP_WIDTH{1'b1}}; +assign m_ip_payload_axis_tvalid = m_ip_payload_axis_tvalid_reg; +assign m_ip_payload_axis_tlast = m_ip_payload_axis_tlast_reg; +assign m_ip_payload_axis_tid = ID_ENABLE ? m_ip_payload_axis_tid_reg : {ID_WIDTH{1'b0}}; +assign m_ip_payload_axis_tdest = DEST_ENABLE ? m_ip_payload_axis_tdest_reg : {DEST_WIDTH{1'b0}}; +assign m_ip_payload_axis_tuser = USER_ENABLE ? m_ip_payload_axis_tuser_reg : {USER_WIDTH{1'b0}}; + +// enable ready input next cycle if output is ready or if both output registers are empty +assign m_ip_payload_axis_tready_int_early = m_ip_payload_axis_tready || (!temp_m_ip_payload_axis_tvalid_reg && !m_ip_payload_axis_tvalid_reg); + +always @* begin + // transfer sink ready state to source + m_ip_payload_axis_tvalid_next = m_ip_payload_axis_tvalid_reg; + temp_m_ip_payload_axis_tvalid_next = temp_m_ip_payload_axis_tvalid_reg; + + store_axis_int_to_output = 1'b0; + store_axis_int_to_temp = 1'b0; + store_ip_payload_axis_temp_to_output = 1'b0; + + if (m_ip_payload_axis_tready_int_reg) begin + // input is ready + if (m_ip_payload_axis_tready || !m_ip_payload_axis_tvalid_reg) begin + // output is ready or currently not valid, transfer data to output + m_ip_payload_axis_tvalid_next = m_ip_payload_axis_tvalid_int; + store_axis_int_to_output = 1'b1; + end else begin + // output is not ready, store input in temp + temp_m_ip_payload_axis_tvalid_next = m_ip_payload_axis_tvalid_int; + store_axis_int_to_temp = 1'b1; + end + end else if (m_ip_payload_axis_tready) begin + // input is not ready, but output is ready + m_ip_payload_axis_tvalid_next = temp_m_ip_payload_axis_tvalid_reg; + temp_m_ip_payload_axis_tvalid_next = 1'b0; + store_ip_payload_axis_temp_to_output = 1'b1; + end +end + +always @(posedge clk) begin + m_ip_payload_axis_tvalid_reg <= m_ip_payload_axis_tvalid_next; + m_ip_payload_axis_tready_int_reg <= m_ip_payload_axis_tready_int_early; + temp_m_ip_payload_axis_tvalid_reg <= temp_m_ip_payload_axis_tvalid_next; + + // datapath + if (store_axis_int_to_output) begin + m_ip_payload_axis_tdata_reg <= m_ip_payload_axis_tdata_int; + m_ip_payload_axis_tkeep_reg <= m_ip_payload_axis_tkeep_int; + m_ip_payload_axis_tlast_reg <= m_ip_payload_axis_tlast_int; + m_ip_payload_axis_tid_reg <= m_ip_payload_axis_tid_int; + m_ip_payload_axis_tdest_reg <= m_ip_payload_axis_tdest_int; + m_ip_payload_axis_tuser_reg <= m_ip_payload_axis_tuser_int; + end else if (store_ip_payload_axis_temp_to_output) begin + m_ip_payload_axis_tdata_reg <= temp_m_ip_payload_axis_tdata_reg; + m_ip_payload_axis_tkeep_reg <= temp_m_ip_payload_axis_tkeep_reg; + m_ip_payload_axis_tlast_reg <= temp_m_ip_payload_axis_tlast_reg; + m_ip_payload_axis_tid_reg <= temp_m_ip_payload_axis_tid_reg; + m_ip_payload_axis_tdest_reg <= temp_m_ip_payload_axis_tdest_reg; + m_ip_payload_axis_tuser_reg <= temp_m_ip_payload_axis_tuser_reg; + end + + if (store_axis_int_to_temp) begin + temp_m_ip_payload_axis_tdata_reg <= m_ip_payload_axis_tdata_int; + temp_m_ip_payload_axis_tkeep_reg <= m_ip_payload_axis_tkeep_int; + temp_m_ip_payload_axis_tlast_reg <= m_ip_payload_axis_tlast_int; + temp_m_ip_payload_axis_tid_reg <= m_ip_payload_axis_tid_int; + temp_m_ip_payload_axis_tdest_reg <= m_ip_payload_axis_tdest_int; + temp_m_ip_payload_axis_tuser_reg <= m_ip_payload_axis_tuser_int; + end + + if (rst) begin + m_ip_payload_axis_tvalid_reg <= 1'b0; + m_ip_payload_axis_tready_int_reg <= 1'b0; + temp_m_ip_payload_axis_tvalid_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_complete_64.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_complete_64.v new file mode 100755 index 0000000..95cec13 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_complete_64.v @@ -0,0 +1,463 @@ +/* + +Copyright (c) 2014-2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * IPv4 and ARP block, ethernet frame interface (64 bit datapath) + */ +module ip_complete_64 #( + parameter ARP_CACHE_ADDR_WIDTH = 9, + parameter ARP_REQUEST_RETRY_COUNT = 4, + parameter ARP_REQUEST_RETRY_INTERVAL = 156250000*2, + parameter ARP_REQUEST_TIMEOUT = 156250000*30 +) +( + input wire clk, + input wire rst, + + /* + * Ethernet frame input + */ + input wire s_eth_hdr_valid, + output wire s_eth_hdr_ready, + input wire [47:0] s_eth_dest_mac, + input wire [47:0] s_eth_src_mac, + input wire [15:0] s_eth_type, + input wire [63:0] s_eth_payload_axis_tdata, + input wire [7:0] s_eth_payload_axis_tkeep, + input wire s_eth_payload_axis_tvalid, + output wire s_eth_payload_axis_tready, + input wire s_eth_payload_axis_tlast, + input wire s_eth_payload_axis_tuser, + + /* + * Ethernet frame output + */ + output wire m_eth_hdr_valid, + input wire m_eth_hdr_ready, + output wire [47:0] m_eth_dest_mac, + output wire [47:0] m_eth_src_mac, + output wire [15:0] m_eth_type, + output wire [63:0] m_eth_payload_axis_tdata, + output wire [7:0] m_eth_payload_axis_tkeep, + output wire m_eth_payload_axis_tvalid, + input wire m_eth_payload_axis_tready, + output wire m_eth_payload_axis_tlast, + output wire m_eth_payload_axis_tuser, + + /* + * IP input + */ + input wire s_ip_hdr_valid, + output wire s_ip_hdr_ready, + input wire [5:0] s_ip_dscp, + input wire [1:0] s_ip_ecn, + input wire [15:0] s_ip_length, + input wire [7:0] s_ip_ttl, + input wire [7:0] s_ip_protocol, + input wire [31:0] s_ip_source_ip, + input wire [31:0] s_ip_dest_ip, + input wire [63:0] s_ip_payload_axis_tdata, + input wire [7:0] s_ip_payload_axis_tkeep, + input wire s_ip_payload_axis_tvalid, + output wire s_ip_payload_axis_tready, + input wire s_ip_payload_axis_tlast, + input wire s_ip_payload_axis_tuser, + + /* + * IP output + */ + output wire m_ip_hdr_valid, + input wire m_ip_hdr_ready, + output wire [47:0] m_ip_eth_dest_mac, + output wire [47:0] m_ip_eth_src_mac, + output wire [15:0] m_ip_eth_type, + output wire [3:0] m_ip_version, + output wire [3:0] m_ip_ihl, + output wire [5:0] m_ip_dscp, + output wire [1:0] m_ip_ecn, + output wire [15:0] m_ip_length, + output wire [15:0] m_ip_identification, + output wire [2:0] m_ip_flags, + output wire [12:0] m_ip_fragment_offset, + output wire [7:0] m_ip_ttl, + output wire [7:0] m_ip_protocol, + output wire [15:0] m_ip_header_checksum, + output wire [31:0] m_ip_source_ip, + output wire [31:0] m_ip_dest_ip, + output wire [63:0] m_ip_payload_axis_tdata, + output wire [7:0] m_ip_payload_axis_tkeep, + output wire m_ip_payload_axis_tvalid, + input wire m_ip_payload_axis_tready, + output wire m_ip_payload_axis_tlast, + output wire m_ip_payload_axis_tuser, + + /* + * Status + */ + output wire rx_busy, + output wire tx_busy, + output wire rx_error_header_early_termination, + output wire rx_error_payload_early_termination, + output wire rx_error_invalid_header, + output wire rx_error_invalid_checksum, + output wire tx_error_payload_early_termination, + output wire tx_error_arp_failed, + + /* + * Configuration + */ + input wire [47:0] local_mac, + input wire [31:0] local_ip, + input wire [31:0] gateway_ip, + input wire [31:0] subnet_mask, + input wire clear_arp_cache +); + +/* + +This module integrates the IP and ARP modules for a complete IP stack + +*/ + +wire arp_request_valid; +wire arp_request_ready; +wire [31:0] arp_request_ip; +wire arp_response_valid; +wire arp_response_ready; +wire arp_response_error; +wire [47:0] arp_response_mac; + +wire ip_rx_eth_hdr_valid; +wire ip_rx_eth_hdr_ready; +wire [47:0] ip_rx_eth_dest_mac; +wire [47:0] ip_rx_eth_src_mac; +wire [15:0] ip_rx_eth_type; +wire [63:0] ip_rx_eth_payload_axis_tdata; +wire [7:0] ip_rx_eth_payload_axis_tkeep; +wire ip_rx_eth_payload_axis_tvalid; +wire ip_rx_eth_payload_axis_tready; +wire ip_rx_eth_payload_axis_tlast; +wire ip_rx_eth_payload_axis_tuser; + +wire ip_tx_eth_hdr_valid; +wire ip_tx_eth_hdr_ready; +wire [47:0] ip_tx_eth_dest_mac; +wire [47:0] ip_tx_eth_src_mac; +wire [15:0] ip_tx_eth_type; +wire [63:0] ip_tx_eth_payload_axis_tdata; +wire [7:0] ip_tx_eth_payload_axis_tkeep; +wire ip_tx_eth_payload_axis_tvalid; +wire ip_tx_eth_payload_axis_tready; +wire ip_tx_eth_payload_axis_tlast; +wire ip_tx_eth_payload_axis_tuser; + +wire arp_rx_eth_hdr_valid; +wire arp_rx_eth_hdr_ready; +wire [47:0] arp_rx_eth_dest_mac; +wire [47:0] arp_rx_eth_src_mac; +wire [15:0] arp_rx_eth_type; +wire [63:0] arp_rx_eth_payload_axis_tdata; +wire [7:0] arp_rx_eth_payload_axis_tkeep; +wire arp_rx_eth_payload_axis_tvalid; +wire arp_rx_eth_payload_axis_tready; +wire arp_rx_eth_payload_axis_tlast; +wire arp_rx_eth_payload_axis_tuser; + +wire arp_tx_eth_hdr_valid; +wire arp_tx_eth_hdr_ready; +wire [47:0] arp_tx_eth_dest_mac; +wire [47:0] arp_tx_eth_src_mac; +wire [15:0] arp_tx_eth_type; +wire [63:0] arp_tx_eth_payload_axis_tdata; +wire [7:0] arp_tx_eth_payload_axis_tkeep; +wire arp_tx_eth_payload_axis_tvalid; +wire arp_tx_eth_payload_axis_tready; +wire arp_tx_eth_payload_axis_tlast; +wire arp_tx_eth_payload_axis_tuser; + +/* + * Input classifier (eth_type) + */ +wire s_select_ip = (s_eth_type == 16'h0800); +wire s_select_arp = (s_eth_type == 16'h0806); +wire s_select_none = !(s_select_ip || s_select_arp); + +reg s_select_ip_reg = 1'b0; +reg s_select_arp_reg = 1'b0; +reg s_select_none_reg = 1'b0; + +always @(posedge clk) begin + if (rst) begin + s_select_ip_reg <= 1'b0; + s_select_arp_reg <= 1'b0; + s_select_none_reg <= 1'b0; + end else begin + if (s_eth_payload_axis_tvalid) begin + if ((!s_select_ip_reg && !s_select_arp_reg && !s_select_none_reg) || + (s_eth_payload_axis_tvalid && s_eth_payload_axis_tready && s_eth_payload_axis_tlast)) begin + s_select_ip_reg <= s_select_ip; + s_select_arp_reg <= s_select_arp; + s_select_none_reg <= s_select_none; + end + end else begin + s_select_ip_reg <= 1'b0; + s_select_arp_reg <= 1'b0; + s_select_none_reg <= 1'b0; + end + end +end + +assign ip_rx_eth_hdr_valid = s_select_ip && s_eth_hdr_valid; +assign ip_rx_eth_dest_mac = s_eth_dest_mac; +assign ip_rx_eth_src_mac = s_eth_src_mac; +assign ip_rx_eth_type = 16'h0800; +assign ip_rx_eth_payload_axis_tdata = s_eth_payload_axis_tdata; +assign ip_rx_eth_payload_axis_tkeep = s_eth_payload_axis_tkeep; +assign ip_rx_eth_payload_axis_tvalid = s_select_ip_reg && s_eth_payload_axis_tvalid; +assign ip_rx_eth_payload_axis_tlast = s_eth_payload_axis_tlast; +assign ip_rx_eth_payload_axis_tuser = s_eth_payload_axis_tuser; + +assign arp_rx_eth_hdr_valid = s_select_arp && s_eth_hdr_valid; +assign arp_rx_eth_dest_mac = s_eth_dest_mac; +assign arp_rx_eth_src_mac = s_eth_src_mac; +assign arp_rx_eth_type = 16'h0806; +assign arp_rx_eth_payload_axis_tdata = s_eth_payload_axis_tdata; +assign arp_rx_eth_payload_axis_tkeep = s_eth_payload_axis_tkeep; +assign arp_rx_eth_payload_axis_tvalid = s_select_arp_reg && s_eth_payload_axis_tvalid; +assign arp_rx_eth_payload_axis_tlast = s_eth_payload_axis_tlast; +assign arp_rx_eth_payload_axis_tuser = s_eth_payload_axis_tuser; + +assign s_eth_hdr_ready = (s_select_ip && ip_rx_eth_hdr_ready) || + (s_select_arp && arp_rx_eth_hdr_ready) || + (s_select_none); + +assign s_eth_payload_axis_tready = (s_select_ip_reg && ip_rx_eth_payload_axis_tready) || + (s_select_arp_reg && arp_rx_eth_payload_axis_tready) || + s_select_none_reg; + +/* + * Output arbiter + */ +eth_arb_mux #( + .S_COUNT(2), + .DATA_WIDTH(64), + .KEEP_ENABLE(1), + .ID_ENABLE(0), + .DEST_ENABLE(0), + .USER_ENABLE(1), + .USER_WIDTH(1), + .ARB_TYPE_ROUND_ROBIN(0), + .ARB_LSB_HIGH_PRIORITY(1) +) +eth_arb_mux_inst ( + .clk(clk), + .rst(rst), + // Ethernet frame inputs + .s_eth_hdr_valid({ip_tx_eth_hdr_valid, arp_tx_eth_hdr_valid}), + .s_eth_hdr_ready({ip_tx_eth_hdr_ready, arp_tx_eth_hdr_ready}), + .s_eth_dest_mac({ip_tx_eth_dest_mac, arp_tx_eth_dest_mac}), + .s_eth_src_mac({ip_tx_eth_src_mac, arp_tx_eth_src_mac}), + .s_eth_type({ip_tx_eth_type, arp_tx_eth_type}), + .s_eth_payload_axis_tdata({ip_tx_eth_payload_axis_tdata, arp_tx_eth_payload_axis_tdata}), + .s_eth_payload_axis_tkeep({ip_tx_eth_payload_axis_tkeep, arp_tx_eth_payload_axis_tkeep}), + .s_eth_payload_axis_tvalid({ip_tx_eth_payload_axis_tvalid, arp_tx_eth_payload_axis_tvalid}), + .s_eth_payload_axis_tready({ip_tx_eth_payload_axis_tready, arp_tx_eth_payload_axis_tready}), + .s_eth_payload_axis_tlast({ip_tx_eth_payload_axis_tlast, arp_tx_eth_payload_axis_tlast}), + .s_eth_payload_axis_tid(0), + .s_eth_payload_axis_tdest(0), + .s_eth_payload_axis_tuser({ip_tx_eth_payload_axis_tuser, arp_tx_eth_payload_axis_tuser}), + // Ethernet frame output + .m_eth_hdr_valid(m_eth_hdr_valid), + .m_eth_hdr_ready(m_eth_hdr_ready), + .m_eth_dest_mac(m_eth_dest_mac), + .m_eth_src_mac(m_eth_src_mac), + .m_eth_type(m_eth_type), + .m_eth_payload_axis_tdata(m_eth_payload_axis_tdata), + .m_eth_payload_axis_tkeep(m_eth_payload_axis_tkeep), + .m_eth_payload_axis_tvalid(m_eth_payload_axis_tvalid), + .m_eth_payload_axis_tready(m_eth_payload_axis_tready), + .m_eth_payload_axis_tlast(m_eth_payload_axis_tlast), + .m_eth_payload_axis_tid(), + .m_eth_payload_axis_tdest(), + .m_eth_payload_axis_tuser(m_eth_payload_axis_tuser) +); + +/* + * IP module + */ +ip_64 +ip_inst ( + .clk(clk), + .rst(rst), + // Ethernet frame input + .s_eth_hdr_valid(ip_rx_eth_hdr_valid), + .s_eth_hdr_ready(ip_rx_eth_hdr_ready), + .s_eth_dest_mac(ip_rx_eth_dest_mac), + .s_eth_src_mac(ip_rx_eth_src_mac), + .s_eth_type(ip_rx_eth_type), + .s_eth_payload_axis_tdata(ip_rx_eth_payload_axis_tdata), + .s_eth_payload_axis_tkeep(ip_rx_eth_payload_axis_tkeep), + .s_eth_payload_axis_tvalid(ip_rx_eth_payload_axis_tvalid), + .s_eth_payload_axis_tready(ip_rx_eth_payload_axis_tready), + .s_eth_payload_axis_tlast(ip_rx_eth_payload_axis_tlast), + .s_eth_payload_axis_tuser(ip_rx_eth_payload_axis_tuser), + // Ethernet frame output + .m_eth_hdr_valid(ip_tx_eth_hdr_valid), + .m_eth_hdr_ready(ip_tx_eth_hdr_ready), + .m_eth_dest_mac(ip_tx_eth_dest_mac), + .m_eth_src_mac(ip_tx_eth_src_mac), + .m_eth_type(ip_tx_eth_type), + .m_eth_payload_axis_tdata(ip_tx_eth_payload_axis_tdata), + .m_eth_payload_axis_tkeep(ip_tx_eth_payload_axis_tkeep), + .m_eth_payload_axis_tvalid(ip_tx_eth_payload_axis_tvalid), + .m_eth_payload_axis_tready(ip_tx_eth_payload_axis_tready), + .m_eth_payload_axis_tlast(ip_tx_eth_payload_axis_tlast), + .m_eth_payload_axis_tuser(ip_tx_eth_payload_axis_tuser), + // IP frame output + .m_ip_hdr_valid(m_ip_hdr_valid), + .m_ip_hdr_ready(m_ip_hdr_ready), + .m_ip_eth_dest_mac(m_ip_eth_dest_mac), + .m_ip_eth_src_mac(m_ip_eth_src_mac), + .m_ip_eth_type(m_ip_eth_type), + .m_ip_version(m_ip_version), + .m_ip_ihl(m_ip_ihl), + .m_ip_dscp(m_ip_dscp), + .m_ip_ecn(m_ip_ecn), + .m_ip_length(m_ip_length), + .m_ip_identification(m_ip_identification), + .m_ip_flags(m_ip_flags), + .m_ip_fragment_offset(m_ip_fragment_offset), + .m_ip_ttl(m_ip_ttl), + .m_ip_protocol(m_ip_protocol), + .m_ip_header_checksum(m_ip_header_checksum), + .m_ip_source_ip(m_ip_source_ip), + .m_ip_dest_ip(m_ip_dest_ip), + .m_ip_payload_axis_tdata(m_ip_payload_axis_tdata), + .m_ip_payload_axis_tkeep(m_ip_payload_axis_tkeep), + .m_ip_payload_axis_tvalid(m_ip_payload_axis_tvalid), + .m_ip_payload_axis_tready(m_ip_payload_axis_tready), + .m_ip_payload_axis_tlast(m_ip_payload_axis_tlast), + .m_ip_payload_axis_tuser(m_ip_payload_axis_tuser), + // IP frame input + .s_ip_hdr_valid(s_ip_hdr_valid), + .s_ip_hdr_ready(s_ip_hdr_ready), + .s_ip_dscp(s_ip_dscp), + .s_ip_ecn(s_ip_ecn), + .s_ip_length(s_ip_length), + .s_ip_ttl(s_ip_ttl), + .s_ip_protocol(s_ip_protocol), + .s_ip_source_ip(s_ip_source_ip), + .s_ip_dest_ip(s_ip_dest_ip), + .s_ip_payload_axis_tdata(s_ip_payload_axis_tdata), + .s_ip_payload_axis_tkeep(s_ip_payload_axis_tkeep), + .s_ip_payload_axis_tvalid(s_ip_payload_axis_tvalid), + .s_ip_payload_axis_tready(s_ip_payload_axis_tready), + .s_ip_payload_axis_tlast(s_ip_payload_axis_tlast), + .s_ip_payload_axis_tuser(s_ip_payload_axis_tuser), + // ARP requests + .arp_request_valid(arp_request_valid), + .arp_request_ready(arp_request_ready), + .arp_request_ip(arp_request_ip), + .arp_response_valid(arp_response_valid), + .arp_response_ready(arp_response_ready), + .arp_response_error(arp_response_error), + .arp_response_mac(arp_response_mac), + // Status + .rx_busy(rx_busy), + .tx_busy(tx_busy), + .rx_error_header_early_termination(rx_error_header_early_termination), + .rx_error_payload_early_termination(rx_error_payload_early_termination), + .rx_error_invalid_header(rx_error_invalid_header), + .rx_error_invalid_checksum(rx_error_invalid_checksum), + .tx_error_payload_early_termination(tx_error_payload_early_termination), + .tx_error_arp_failed(tx_error_arp_failed), + // Configuration + .local_mac(local_mac), + .local_ip(local_ip) +); + +/* + * ARP module + */ +arp #( + .DATA_WIDTH(64), + .KEEP_ENABLE(1), + .KEEP_WIDTH(8), + .CACHE_ADDR_WIDTH(ARP_CACHE_ADDR_WIDTH), + .REQUEST_RETRY_COUNT(ARP_REQUEST_RETRY_COUNT), + .REQUEST_RETRY_INTERVAL(ARP_REQUEST_RETRY_INTERVAL), + .REQUEST_TIMEOUT(ARP_REQUEST_TIMEOUT) +) +arp_inst ( + .clk(clk), + .rst(rst), + // Ethernet frame input + .s_eth_hdr_valid(arp_rx_eth_hdr_valid), + .s_eth_hdr_ready(arp_rx_eth_hdr_ready), + .s_eth_dest_mac(arp_rx_eth_dest_mac), + .s_eth_src_mac(arp_rx_eth_src_mac), + .s_eth_type(arp_rx_eth_type), + .s_eth_payload_axis_tdata(arp_rx_eth_payload_axis_tdata), + .s_eth_payload_axis_tkeep(arp_rx_eth_payload_axis_tkeep), + .s_eth_payload_axis_tvalid(arp_rx_eth_payload_axis_tvalid), + .s_eth_payload_axis_tready(arp_rx_eth_payload_axis_tready), + .s_eth_payload_axis_tlast(arp_rx_eth_payload_axis_tlast), + .s_eth_payload_axis_tuser(arp_rx_eth_payload_axis_tuser), + // Ethernet frame output + .m_eth_hdr_valid(arp_tx_eth_hdr_valid), + .m_eth_hdr_ready(arp_tx_eth_hdr_ready), + .m_eth_dest_mac(arp_tx_eth_dest_mac), + .m_eth_src_mac(arp_tx_eth_src_mac), + .m_eth_type(arp_tx_eth_type), + .m_eth_payload_axis_tdata(arp_tx_eth_payload_axis_tdata), + .m_eth_payload_axis_tkeep(arp_tx_eth_payload_axis_tkeep), + .m_eth_payload_axis_tvalid(arp_tx_eth_payload_axis_tvalid), + .m_eth_payload_axis_tready(arp_tx_eth_payload_axis_tready), + .m_eth_payload_axis_tlast(arp_tx_eth_payload_axis_tlast), + .m_eth_payload_axis_tuser(arp_tx_eth_payload_axis_tuser), + // ARP requests + .arp_request_valid(arp_request_valid), + .arp_request_ready(arp_request_ready), + .arp_request_ip(arp_request_ip), + .arp_response_valid(arp_response_valid), + .arp_response_ready(arp_response_ready), + .arp_response_error(arp_response_error), + .arp_response_mac(arp_response_mac), + // Configuration + .local_mac(local_mac), + .local_ip(local_ip), + .gateway_ip(gateway_ip), + .subnet_mask(subnet_mask), + .clear_cache(clear_arp_cache) +); + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_eth_rx_64.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_eth_rx_64.v new file mode 100755 index 0000000..46429cc --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_eth_rx_64.v @@ -0,0 +1,690 @@ +/* + +Copyright (c) 2014-2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * IP ethernet frame receiver (Ethernet frame in, IP frame out, 64 bit datapath) + */ +module ip_eth_rx_64 +( + input wire clk, + input wire rst, + + /* + * Ethernet frame input + */ + input wire s_eth_hdr_valid, + output wire s_eth_hdr_ready, + input wire [47:0] s_eth_dest_mac, + input wire [47:0] s_eth_src_mac, + input wire [15:0] s_eth_type, + input wire [63:0] s_eth_payload_axis_tdata, + input wire [7:0] s_eth_payload_axis_tkeep, + input wire s_eth_payload_axis_tvalid, + output wire s_eth_payload_axis_tready, + input wire s_eth_payload_axis_tlast, + input wire s_eth_payload_axis_tuser, + + /* + * IP frame output + */ + output wire m_ip_hdr_valid, + input wire m_ip_hdr_ready, + output wire [47:0] m_eth_dest_mac, + output wire [47:0] m_eth_src_mac, + output wire [15:0] m_eth_type, + output wire [3:0] m_ip_version, + output wire [3:0] m_ip_ihl, + output wire [5:0] m_ip_dscp, + output wire [1:0] m_ip_ecn, + output wire [15:0] m_ip_length, + output wire [15:0] m_ip_identification, + output wire [2:0] m_ip_flags, + output wire [12:0] m_ip_fragment_offset, + output wire [7:0] m_ip_ttl, + output wire [7:0] m_ip_protocol, + output wire [15:0] m_ip_header_checksum, + output wire [31:0] m_ip_source_ip, + output wire [31:0] m_ip_dest_ip, + output wire [63:0] m_ip_payload_axis_tdata, + output wire [7:0] m_ip_payload_axis_tkeep, + output wire m_ip_payload_axis_tvalid, + input wire m_ip_payload_axis_tready, + output wire m_ip_payload_axis_tlast, + output wire m_ip_payload_axis_tuser, + + /* + * Status signals + */ + output wire busy, + output wire error_header_early_termination, + output wire error_payload_early_termination, + output wire error_invalid_header, + output wire error_invalid_checksum +); + +/* + +IP Frame + + Field Length + Destination MAC address 6 octets + Source MAC address 6 octets + Ethertype (0x0800) 2 octets + Version (4) 4 bits + IHL (5-15) 4 bits + DSCP (0) 6 bits + ECN (0) 2 bits + length 2 octets + identification (0?) 2 octets + flags (010) 3 bits + fragment offset (0) 13 bits + time to live (64?) 1 octet + protocol 1 octet + header checksum 2 octets + source IP 4 octets + destination IP 4 octets + options (IHL-5)*4 octets + payload length octets + +This module receives an Ethernet frame with header fields in parallel and +payload on an AXI stream interface, decodes and strips the IP header fields, +then produces the header fields in parallel along with the IP payload in a +separate AXI stream. + +*/ + +localparam [2:0] + STATE_IDLE = 3'd0, + STATE_READ_HEADER = 3'd1, + STATE_READ_PAYLOAD = 3'd2, + STATE_READ_PAYLOAD_LAST = 3'd3, + STATE_WAIT_LAST = 3'd4; + +reg [2:0] state_reg = STATE_IDLE, state_next; + +// datapath control signals +reg store_eth_hdr; +reg store_hdr_word_0; +reg store_hdr_word_1; +reg store_hdr_word_2; +reg store_last_word; + +reg flush_save; +reg transfer_in_save; + +reg [5:0] hdr_ptr_reg = 6'd0, hdr_ptr_next; +reg [15:0] word_count_reg = 16'd0, word_count_next; + +reg [16:0] hdr_sum_high_reg = 17'd0; +reg [16:0] hdr_sum_low_reg = 17'd0; +reg [19:0] hdr_sum_temp; +reg [19:0] hdr_sum_reg = 20'd0, hdr_sum_next; +reg check_hdr_reg = 1'b0, check_hdr_next; + +reg [63:0] last_word_data_reg = 64'd0; +reg [7:0] last_word_keep_reg = 8'd0; + +reg s_eth_hdr_ready_reg = 1'b0, s_eth_hdr_ready_next; +reg s_eth_payload_axis_tready_reg = 1'b0, s_eth_payload_axis_tready_next; + +reg m_ip_hdr_valid_reg = 1'b0, m_ip_hdr_valid_next; +reg [47:0] m_eth_dest_mac_reg = 48'd0; +reg [47:0] m_eth_src_mac_reg = 48'd0; +reg [15:0] m_eth_type_reg = 16'd0; +reg [3:0] m_ip_version_reg = 4'd0; +reg [3:0] m_ip_ihl_reg = 4'd0; +reg [5:0] m_ip_dscp_reg = 6'd0; +reg [1:0] m_ip_ecn_reg = 2'd0; +reg [15:0] m_ip_length_reg = 16'd0; +reg [15:0] m_ip_identification_reg = 16'd0; +reg [2:0] m_ip_flags_reg = 3'd0; +reg [12:0] m_ip_fragment_offset_reg = 13'd0; +reg [7:0] m_ip_ttl_reg = 8'd0; +reg [7:0] m_ip_protocol_reg = 8'd0; +reg [15:0] m_ip_header_checksum_reg = 16'd0; +reg [31:0] m_ip_source_ip_reg = 32'd0; +reg [31:0] m_ip_dest_ip_reg = 32'd0; + +reg busy_reg = 1'b0; +reg error_header_early_termination_reg = 1'b0, error_header_early_termination_next; +reg error_payload_early_termination_reg = 1'b0, error_payload_early_termination_next; +reg error_invalid_header_reg = 1'b0, error_invalid_header_next; +reg error_invalid_checksum_reg = 1'b0, error_invalid_checksum_next; + +reg [63:0] save_eth_payload_axis_tdata_reg = 64'd0; +reg [7:0] save_eth_payload_axis_tkeep_reg = 8'd0; +reg save_eth_payload_axis_tlast_reg = 1'b0; +reg save_eth_payload_axis_tuser_reg = 1'b0; + +reg [63:0] shift_eth_payload_axis_tdata; +reg [7:0] shift_eth_payload_axis_tkeep; +reg shift_eth_payload_axis_tvalid; +reg shift_eth_payload_axis_tlast; +reg shift_eth_payload_axis_tuser; +reg shift_eth_payload_s_tready; +reg shift_eth_payload_extra_cycle_reg = 1'b0; + +// internal datapath +reg [63:0] m_ip_payload_axis_tdata_int; +reg [7:0] m_ip_payload_axis_tkeep_int; +reg m_ip_payload_axis_tvalid_int; +reg m_ip_payload_axis_tready_int_reg = 1'b0; +reg m_ip_payload_axis_tlast_int; +reg m_ip_payload_axis_tuser_int; +wire m_ip_payload_axis_tready_int_early; + +assign s_eth_hdr_ready = s_eth_hdr_ready_reg; +assign s_eth_payload_axis_tready = s_eth_payload_axis_tready_reg; + +assign m_ip_hdr_valid = m_ip_hdr_valid_reg; +assign m_eth_dest_mac = m_eth_dest_mac_reg; +assign m_eth_src_mac = m_eth_src_mac_reg; +assign m_eth_type = m_eth_type_reg; +assign m_ip_version = m_ip_version_reg; +assign m_ip_ihl = m_ip_ihl_reg; +assign m_ip_dscp = m_ip_dscp_reg; +assign m_ip_ecn = m_ip_ecn_reg; +assign m_ip_length = m_ip_length_reg; +assign m_ip_identification = m_ip_identification_reg; +assign m_ip_flags = m_ip_flags_reg; +assign m_ip_fragment_offset = m_ip_fragment_offset_reg; +assign m_ip_ttl = m_ip_ttl_reg; +assign m_ip_protocol = m_ip_protocol_reg; +assign m_ip_header_checksum = m_ip_header_checksum_reg; +assign m_ip_source_ip = m_ip_source_ip_reg; +assign m_ip_dest_ip = m_ip_dest_ip_reg; + +assign busy = busy_reg; +assign error_header_early_termination = error_header_early_termination_reg; +assign error_payload_early_termination = error_payload_early_termination_reg; +assign error_invalid_header = error_invalid_header_reg; +assign error_invalid_checksum = error_invalid_checksum_reg; + +function [3:0] keep2count; + input [7:0] k; + casez (k) + 8'bzzzzzzz0: keep2count = 4'd0; + 8'bzzzzzz01: keep2count = 4'd1; + 8'bzzzzz011: keep2count = 4'd2; + 8'bzzzz0111: keep2count = 4'd3; + 8'bzzz01111: keep2count = 4'd4; + 8'bzz011111: keep2count = 4'd5; + 8'bz0111111: keep2count = 4'd6; + 8'b01111111: keep2count = 4'd7; + 8'b11111111: keep2count = 4'd8; + endcase +endfunction + +function [7:0] count2keep; + input [3:0] k; + case (k) + 4'd0: count2keep = 8'b00000000; + 4'd1: count2keep = 8'b00000001; + 4'd2: count2keep = 8'b00000011; + 4'd3: count2keep = 8'b00000111; + 4'd4: count2keep = 8'b00001111; + 4'd5: count2keep = 8'b00011111; + 4'd6: count2keep = 8'b00111111; + 4'd7: count2keep = 8'b01111111; + 4'd8: count2keep = 8'b11111111; + endcase +endfunction + +always @* begin + shift_eth_payload_axis_tdata[31:0] = save_eth_payload_axis_tdata_reg[63:32]; + shift_eth_payload_axis_tkeep[3:0] = save_eth_payload_axis_tkeep_reg[7:4]; + + if (shift_eth_payload_extra_cycle_reg) begin + shift_eth_payload_axis_tdata[63:32] = 32'd0; + shift_eth_payload_axis_tkeep[7:4] = 4'd0; + shift_eth_payload_axis_tvalid = 1'b1; + shift_eth_payload_axis_tlast = save_eth_payload_axis_tlast_reg; + shift_eth_payload_axis_tuser = save_eth_payload_axis_tuser_reg; + shift_eth_payload_s_tready = flush_save; + end else begin + shift_eth_payload_axis_tdata[63:32] = s_eth_payload_axis_tdata[31:0]; + shift_eth_payload_axis_tkeep[7:4] = s_eth_payload_axis_tkeep[3:0]; + shift_eth_payload_axis_tvalid = s_eth_payload_axis_tvalid; + shift_eth_payload_axis_tlast = (s_eth_payload_axis_tlast && (s_eth_payload_axis_tkeep[7:4] == 0)); + shift_eth_payload_axis_tuser = (s_eth_payload_axis_tuser && (s_eth_payload_axis_tkeep[7:4] == 0)); + shift_eth_payload_s_tready = !(s_eth_payload_axis_tlast && s_eth_payload_axis_tvalid && transfer_in_save); + end +end + +always @* begin + state_next = STATE_IDLE; + + flush_save = 1'b0; + transfer_in_save = 1'b0; + + s_eth_hdr_ready_next = 1'b0; + s_eth_payload_axis_tready_next = 1'b0; + + store_eth_hdr = 1'b0; + store_hdr_word_0 = 1'b0; + store_hdr_word_1 = 1'b0; + store_hdr_word_2 = 1'b0; + + store_last_word = 1'b0; + + hdr_ptr_next = hdr_ptr_reg; + word_count_next = word_count_reg; + + hdr_sum_temp = 32'd0; + hdr_sum_next = hdr_sum_reg; + check_hdr_next = check_hdr_reg; + + m_ip_hdr_valid_next = m_ip_hdr_valid_reg && !m_ip_hdr_ready; + + error_header_early_termination_next = 1'b0; + error_payload_early_termination_next = 1'b0; + error_invalid_header_next = 1'b0; + error_invalid_checksum_next = 1'b0; + + m_ip_payload_axis_tdata_int = 64'd0; + m_ip_payload_axis_tkeep_int = 8'd0; + m_ip_payload_axis_tvalid_int = 1'b0; + m_ip_payload_axis_tlast_int = 1'b0; + m_ip_payload_axis_tuser_int = 1'b0; + + case (state_reg) + STATE_IDLE: begin + // idle state - wait for header + hdr_ptr_next = 6'd0; + hdr_sum_next = 32'd0; + flush_save = 1'b1; + s_eth_hdr_ready_next = !m_ip_hdr_valid_next; + + if (s_eth_hdr_ready && s_eth_hdr_valid) begin + s_eth_hdr_ready_next = 1'b0; + s_eth_payload_axis_tready_next = 1'b1; + store_eth_hdr = 1'b1; + state_next = STATE_READ_HEADER; + end else begin + state_next = STATE_IDLE; + end + end + STATE_READ_HEADER: begin + // read header + s_eth_payload_axis_tready_next = shift_eth_payload_s_tready; + word_count_next = m_ip_length_reg - 5*4; + + if (s_eth_payload_axis_tvalid) begin + // word transfer in - store it + hdr_ptr_next = hdr_ptr_reg + 6'd8; + transfer_in_save = 1'b1; + state_next = STATE_READ_HEADER; + + case (hdr_ptr_reg) + 6'h00: begin + store_hdr_word_0 = 1'b1; + end + 6'h08: begin + store_hdr_word_1 = 1'b1; + hdr_sum_next = hdr_sum_high_reg + hdr_sum_low_reg; + end + 6'h10: begin + store_hdr_word_2 = 1'b1; + hdr_sum_next = hdr_sum_reg + hdr_sum_high_reg + hdr_sum_low_reg; + + // check header checksum on next cycle for improved timing + check_hdr_next = 1'b1; + + if (m_ip_version_reg != 4'd4 || m_ip_ihl_reg != 4'd5) begin + error_invalid_header_next = 1'b1; + s_eth_payload_axis_tready_next = shift_eth_payload_s_tready; + state_next = STATE_WAIT_LAST; + end else begin + s_eth_payload_axis_tready_next = m_ip_payload_axis_tready_int_early && shift_eth_payload_s_tready; + state_next = STATE_READ_PAYLOAD; + end + end + endcase + + if (shift_eth_payload_axis_tlast) begin + error_header_early_termination_next = 1'b1; + error_invalid_header_next = 1'b0; + error_invalid_checksum_next = 1'b0; + m_ip_hdr_valid_next = 1'b0; + s_eth_hdr_ready_next = !m_ip_hdr_valid_next; + s_eth_payload_axis_tready_next = 1'b0; + state_next = STATE_IDLE; + end + + end else begin + state_next = STATE_READ_HEADER; + end + end + STATE_READ_PAYLOAD: begin + // read payload + s_eth_payload_axis_tready_next = m_ip_payload_axis_tready_int_early && shift_eth_payload_s_tready; + + m_ip_payload_axis_tdata_int = shift_eth_payload_axis_tdata; + m_ip_payload_axis_tkeep_int = shift_eth_payload_axis_tkeep; + m_ip_payload_axis_tlast_int = shift_eth_payload_axis_tlast; + m_ip_payload_axis_tuser_int = shift_eth_payload_axis_tuser; + + store_last_word = 1'b1; + + if (m_ip_payload_axis_tready_int_reg && shift_eth_payload_axis_tvalid) begin + // word transfer through + word_count_next = word_count_reg - 16'd8; + transfer_in_save = 1'b1; + m_ip_payload_axis_tvalid_int = 1'b1; + if (word_count_reg <= 8) begin + // have entire payload + m_ip_payload_axis_tkeep_int = shift_eth_payload_axis_tkeep & count2keep(word_count_reg); + if (shift_eth_payload_axis_tlast) begin + if (keep2count(shift_eth_payload_axis_tkeep) < word_count_reg[4:0]) begin + // end of frame, but length does not match + error_payload_early_termination_next = 1'b1; + m_ip_payload_axis_tuser_int = 1'b1; + end + s_eth_payload_axis_tready_next = 1'b0; + flush_save = 1'b1; + s_eth_hdr_ready_next = !m_ip_hdr_valid_reg && !check_hdr_reg; + state_next = STATE_IDLE; + end else begin + m_ip_payload_axis_tvalid_int = 1'b0; + state_next = STATE_READ_PAYLOAD_LAST; + end + end else begin + if (shift_eth_payload_axis_tlast) begin + // end of frame, but length does not match + error_payload_early_termination_next = 1'b1; + m_ip_payload_axis_tuser_int = 1'b1; + s_eth_payload_axis_tready_next = 1'b0; + flush_save = 1'b1; + s_eth_hdr_ready_next = !m_ip_hdr_valid_reg && !check_hdr_reg; + state_next = STATE_IDLE; + end else begin + state_next = STATE_READ_PAYLOAD; + end + end + end else begin + state_next = STATE_READ_PAYLOAD; + end + + if (check_hdr_reg) begin + check_hdr_next = 1'b0; + + hdr_sum_temp = hdr_sum_reg[15:0] + hdr_sum_reg[19:16] + hdr_sum_low_reg; + + if (hdr_sum_temp != 19'h0ffff && hdr_sum_temp != 19'h1fffe) begin + // bad checksum + error_invalid_checksum_next = 1'b1; + m_ip_payload_axis_tvalid_int = 1'b0; + if (shift_eth_payload_axis_tlast && shift_eth_payload_axis_tvalid) begin + // only one payload cycle; return to idle now + s_eth_hdr_ready_next = !m_ip_hdr_valid_reg && !check_hdr_reg; + state_next = STATE_IDLE; + end else begin + // drop payload + s_eth_payload_axis_tready_next = shift_eth_payload_s_tready; + state_next = STATE_WAIT_LAST; + end + end else begin + // good checksum; transfer header + m_ip_hdr_valid_next = 1'b1; + end + end + end + STATE_READ_PAYLOAD_LAST: begin + // read and discard until end of frame + s_eth_payload_axis_tready_next = m_ip_payload_axis_tready_int_early && shift_eth_payload_s_tready; + + m_ip_payload_axis_tdata_int = last_word_data_reg; + m_ip_payload_axis_tkeep_int = last_word_keep_reg; + m_ip_payload_axis_tlast_int = shift_eth_payload_axis_tlast; + m_ip_payload_axis_tuser_int = shift_eth_payload_axis_tuser; + + if (m_ip_payload_axis_tready_int_reg && shift_eth_payload_axis_tvalid) begin + transfer_in_save = 1'b1; + if (shift_eth_payload_axis_tlast) begin + s_eth_payload_axis_tready_next = 1'b0; + flush_save = 1'b1; + s_eth_hdr_ready_next = !m_ip_hdr_valid_next; + m_ip_payload_axis_tvalid_int = 1'b1; + state_next = STATE_IDLE; + end else begin + state_next = STATE_READ_PAYLOAD_LAST; + end + end else begin + state_next = STATE_READ_PAYLOAD_LAST; + end + end + STATE_WAIT_LAST: begin + // read and discard until end of frame + s_eth_payload_axis_tready_next = shift_eth_payload_s_tready; + + if (shift_eth_payload_axis_tvalid) begin + transfer_in_save = 1'b1; + if (shift_eth_payload_axis_tlast) begin + s_eth_payload_axis_tready_next = 1'b0; + flush_save = 1'b1; + s_eth_hdr_ready_next = !m_ip_hdr_valid_next; + state_next = STATE_IDLE; + end else begin + state_next = STATE_WAIT_LAST; + end + end else begin + state_next = STATE_WAIT_LAST; + end + end + endcase +end + +always @(posedge clk) begin + if (rst) begin + state_reg <= STATE_IDLE; + s_eth_hdr_ready_reg <= 1'b0; + s_eth_payload_axis_tready_reg <= 1'b0; + m_ip_hdr_valid_reg <= 1'b0; + save_eth_payload_axis_tlast_reg <= 1'b0; + shift_eth_payload_extra_cycle_reg <= 1'b0; + busy_reg <= 1'b0; + error_header_early_termination_reg <= 1'b0; + error_payload_early_termination_reg <= 1'b0; + error_invalid_header_reg <= 1'b0; + error_invalid_checksum_reg <= 1'b0; + end else begin + state_reg <= state_next; + + s_eth_hdr_ready_reg <= s_eth_hdr_ready_next; + s_eth_payload_axis_tready_reg <= s_eth_payload_axis_tready_next; + + m_ip_hdr_valid_reg <= m_ip_hdr_valid_next; + + error_header_early_termination_reg <= error_header_early_termination_next; + error_payload_early_termination_reg <= error_payload_early_termination_next; + error_invalid_header_reg <= error_invalid_header_next; + error_invalid_checksum_reg <= error_invalid_checksum_next; + + busy_reg <= state_next != STATE_IDLE; + + // datapath + if (flush_save) begin + save_eth_payload_axis_tlast_reg <= 1'b0; + shift_eth_payload_extra_cycle_reg <= 1'b0; + end else if (transfer_in_save) begin + save_eth_payload_axis_tlast_reg <= s_eth_payload_axis_tlast; + shift_eth_payload_extra_cycle_reg <= s_eth_payload_axis_tlast && (s_eth_payload_axis_tkeep[7:4] != 0); + end + end + + hdr_ptr_reg <= hdr_ptr_next; + word_count_reg <= word_count_next; + + hdr_sum_reg <= hdr_sum_next; + check_hdr_reg <= check_hdr_next; + + if (s_eth_payload_axis_tvalid) begin + hdr_sum_low_reg <= s_eth_payload_axis_tdata[15:0] + s_eth_payload_axis_tdata[31:16]; + hdr_sum_high_reg <= s_eth_payload_axis_tdata[47:32] + s_eth_payload_axis_tdata[63:48]; + end + + // datapath + if (store_eth_hdr) begin + m_eth_dest_mac_reg <= s_eth_dest_mac; + m_eth_src_mac_reg <= s_eth_src_mac; + m_eth_type_reg <= s_eth_type; + end + + if (store_last_word) begin + last_word_data_reg <= m_ip_payload_axis_tdata_int; + last_word_keep_reg <= m_ip_payload_axis_tkeep_int; + end + + if (store_hdr_word_0) begin + {m_ip_version_reg, m_ip_ihl_reg} <= s_eth_payload_axis_tdata[ 7: 0]; + {m_ip_dscp_reg, m_ip_ecn_reg} <= s_eth_payload_axis_tdata[15: 8]; + m_ip_length_reg[15: 8] <= s_eth_payload_axis_tdata[23:16]; + m_ip_length_reg[ 7: 0] <= s_eth_payload_axis_tdata[31:24]; + m_ip_identification_reg[15: 8] <= s_eth_payload_axis_tdata[39:32]; + m_ip_identification_reg[ 7: 0] <= s_eth_payload_axis_tdata[47:40]; + {m_ip_flags_reg, m_ip_fragment_offset_reg[12:8]} <= s_eth_payload_axis_tdata[55:48]; + m_ip_fragment_offset_reg[ 7:0] <= s_eth_payload_axis_tdata[63:56]; + end + + if (store_hdr_word_1) begin + m_ip_ttl_reg <= s_eth_payload_axis_tdata[ 7: 0]; + m_ip_protocol_reg <= s_eth_payload_axis_tdata[15: 8]; + m_ip_header_checksum_reg[15: 8] <= s_eth_payload_axis_tdata[23:16]; + m_ip_header_checksum_reg[ 7: 0] <= s_eth_payload_axis_tdata[31:24]; + m_ip_source_ip_reg[31:24] <= s_eth_payload_axis_tdata[39:32]; + m_ip_source_ip_reg[23:16] <= s_eth_payload_axis_tdata[47:40]; + m_ip_source_ip_reg[15: 8] <= s_eth_payload_axis_tdata[55:48]; + m_ip_source_ip_reg[ 7: 0] <= s_eth_payload_axis_tdata[63:56]; + end + + if (store_hdr_word_2) begin + m_ip_dest_ip_reg[31:24] <= s_eth_payload_axis_tdata[ 7: 0]; + m_ip_dest_ip_reg[23:16] <= s_eth_payload_axis_tdata[15: 8]; + m_ip_dest_ip_reg[15: 8] <= s_eth_payload_axis_tdata[23:16]; + m_ip_dest_ip_reg[ 7: 0] <= s_eth_payload_axis_tdata[31:24]; + end + + if (transfer_in_save) begin + save_eth_payload_axis_tdata_reg <= s_eth_payload_axis_tdata; + save_eth_payload_axis_tkeep_reg <= s_eth_payload_axis_tkeep; + save_eth_payload_axis_tuser_reg <= s_eth_payload_axis_tuser; + end +end + +// output datapath logic +reg [63:0] m_ip_payload_axis_tdata_reg = 64'd0; +reg [7:0] m_ip_payload_axis_tkeep_reg = 8'd0; +reg m_ip_payload_axis_tvalid_reg = 1'b0, m_ip_payload_axis_tvalid_next; +reg m_ip_payload_axis_tlast_reg = 1'b0; +reg m_ip_payload_axis_tuser_reg = 1'b0; + +reg [63:0] temp_m_ip_payload_axis_tdata_reg = 64'd0; +reg [7:0] temp_m_ip_payload_axis_tkeep_reg = 8'd0; +reg temp_m_ip_payload_axis_tvalid_reg = 1'b0, temp_m_ip_payload_axis_tvalid_next; +reg temp_m_ip_payload_axis_tlast_reg = 1'b0; +reg temp_m_ip_payload_axis_tuser_reg = 1'b0; + +// datapath control +reg store_ip_payload_int_to_output; +reg store_ip_payload_int_to_temp; +reg store_ip_payload_axis_temp_to_output; + +assign m_ip_payload_axis_tdata = m_ip_payload_axis_tdata_reg; +assign m_ip_payload_axis_tkeep = m_ip_payload_axis_tkeep_reg; +assign m_ip_payload_axis_tvalid = m_ip_payload_axis_tvalid_reg; +assign m_ip_payload_axis_tlast = m_ip_payload_axis_tlast_reg; +assign m_ip_payload_axis_tuser = m_ip_payload_axis_tuser_reg; + +// enable ready input next cycle if output is ready or if both output registers are empty +assign m_ip_payload_axis_tready_int_early = m_ip_payload_axis_tready || (!temp_m_ip_payload_axis_tvalid_reg && !m_ip_payload_axis_tvalid_reg); + +always @* begin + // transfer sink ready state to source + m_ip_payload_axis_tvalid_next = m_ip_payload_axis_tvalid_reg; + temp_m_ip_payload_axis_tvalid_next = temp_m_ip_payload_axis_tvalid_reg; + + store_ip_payload_int_to_output = 1'b0; + store_ip_payload_int_to_temp = 1'b0; + store_ip_payload_axis_temp_to_output = 1'b0; + + if (m_ip_payload_axis_tready_int_reg) begin + // input is ready + if (m_ip_payload_axis_tready || !m_ip_payload_axis_tvalid_reg) begin + // output is ready or currently not valid, transfer data to output + m_ip_payload_axis_tvalid_next = m_ip_payload_axis_tvalid_int; + store_ip_payload_int_to_output = 1'b1; + end else begin + // output is not ready, store input in temp + temp_m_ip_payload_axis_tvalid_next = m_ip_payload_axis_tvalid_int; + store_ip_payload_int_to_temp = 1'b1; + end + end else if (m_ip_payload_axis_tready) begin + // input is not ready, but output is ready + m_ip_payload_axis_tvalid_next = temp_m_ip_payload_axis_tvalid_reg; + temp_m_ip_payload_axis_tvalid_next = 1'b0; + store_ip_payload_axis_temp_to_output = 1'b1; + end +end + +always @(posedge clk) begin + m_ip_payload_axis_tvalid_reg <= m_ip_payload_axis_tvalid_next; + m_ip_payload_axis_tready_int_reg <= m_ip_payload_axis_tready_int_early; + temp_m_ip_payload_axis_tvalid_reg <= temp_m_ip_payload_axis_tvalid_next; + + // datapath + if (store_ip_payload_int_to_output) begin + m_ip_payload_axis_tdata_reg <= m_ip_payload_axis_tdata_int; + m_ip_payload_axis_tkeep_reg <= m_ip_payload_axis_tkeep_int; + m_ip_payload_axis_tlast_reg <= m_ip_payload_axis_tlast_int; + m_ip_payload_axis_tuser_reg <= m_ip_payload_axis_tuser_int; + end else if (store_ip_payload_axis_temp_to_output) begin + m_ip_payload_axis_tdata_reg <= temp_m_ip_payload_axis_tdata_reg; + m_ip_payload_axis_tkeep_reg <= temp_m_ip_payload_axis_tkeep_reg; + m_ip_payload_axis_tlast_reg <= temp_m_ip_payload_axis_tlast_reg; + m_ip_payload_axis_tuser_reg <= temp_m_ip_payload_axis_tuser_reg; + end + + if (store_ip_payload_int_to_temp) begin + temp_m_ip_payload_axis_tdata_reg <= m_ip_payload_axis_tdata_int; + temp_m_ip_payload_axis_tkeep_reg <= m_ip_payload_axis_tkeep_int; + temp_m_ip_payload_axis_tlast_reg <= m_ip_payload_axis_tlast_int; + temp_m_ip_payload_axis_tuser_reg <= m_ip_payload_axis_tuser_int; + end + + if (rst) begin + m_ip_payload_axis_tvalid_reg <= 1'b0; + m_ip_payload_axis_tready_int_reg <= 1'b0; + temp_m_ip_payload_axis_tvalid_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_eth_tx_64.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_eth_tx_64.v new file mode 100755 index 0000000..6525197 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ip_eth_tx_64.v @@ -0,0 +1,652 @@ +/* + +Copyright (c) 2014-2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * IP ethernet frame transmitter (IP frame in, Ethernet frame out, 64 bit datapath) + */ +module ip_eth_tx_64 +( + input wire clk, + input wire rst, + + /* + * IP frame input + */ + input wire s_ip_hdr_valid, + output wire s_ip_hdr_ready, + input wire [47:0] s_eth_dest_mac, + input wire [47:0] s_eth_src_mac, + input wire [15:0] s_eth_type, + input wire [5:0] s_ip_dscp, + input wire [1:0] s_ip_ecn, + input wire [15:0] s_ip_length, + input wire [15:0] s_ip_identification, + input wire [2:0] s_ip_flags, + input wire [12:0] s_ip_fragment_offset, + input wire [7:0] s_ip_ttl, + input wire [7:0] s_ip_protocol, + input wire [31:0] s_ip_source_ip, + input wire [31:0] s_ip_dest_ip, + input wire [63:0] s_ip_payload_axis_tdata, + input wire [7:0] s_ip_payload_axis_tkeep, + input wire s_ip_payload_axis_tvalid, + output wire s_ip_payload_axis_tready, + input wire s_ip_payload_axis_tlast, + input wire s_ip_payload_axis_tuser, + + /* + * Ethernet frame output + */ + output wire m_eth_hdr_valid, + input wire m_eth_hdr_ready, + output wire [47:0] m_eth_dest_mac, + output wire [47:0] m_eth_src_mac, + output wire [15:0] m_eth_type, + output wire [63:0] m_eth_payload_axis_tdata, + output wire [7:0] m_eth_payload_axis_tkeep, + output wire m_eth_payload_axis_tvalid, + input wire m_eth_payload_axis_tready, + output wire m_eth_payload_axis_tlast, + output wire m_eth_payload_axis_tuser, + + /* + * Status signals + */ + output wire busy, + output wire error_payload_early_termination +); + +/* + +IP Frame + + Field Length + Destination MAC address 6 octets + Source MAC address 6 octets + Ethertype (0x0800) 2 octets + Version (4) 4 bits + IHL (5-15) 4 bits + DSCP (0) 6 bits + ECN (0) 2 bits + length 2 octets + identification (0?) 2 octets + flags (010) 3 bits + fragment offset (0) 13 bits + time to live (64?) 1 octet + protocol 1 octet + header checksum 2 octets + source IP 4 octets + destination IP 4 octets + options (IHL-5)*4 octets + payload length octets + +This module receives an IP frame with header fields in parallel along with the +payload in an AXI stream, combines the header with the payload, passes through +the Ethernet headers, and transmits the complete Ethernet payload on an AXI +interface. + +*/ + +localparam [2:0] + STATE_IDLE = 3'd0, + STATE_WRITE_HEADER = 3'd1, + STATE_WRITE_HEADER_LAST = 3'd2, + STATE_WRITE_PAYLOAD = 3'd3, + STATE_WRITE_PAYLOAD_LAST = 3'd4, + STATE_WAIT_LAST = 3'd5; + +reg [2:0] state_reg = STATE_IDLE, state_next; + +// datapath control signals +reg store_ip_hdr; +reg store_last_word; + +reg [5:0] hdr_ptr_reg = 6'd0, hdr_ptr_next; +reg [15:0] word_count_reg = 16'd0, word_count_next; + +reg flush_save; +reg transfer_in_save; + +reg [19:0] hdr_sum_temp; +reg [19:0] hdr_sum_reg = 20'd0, hdr_sum_next; + +reg [63:0] last_word_data_reg = 64'd0; +reg [7:0] last_word_keep_reg = 8'd0; + +reg [5:0] ip_dscp_reg = 6'd0; +reg [1:0] ip_ecn_reg = 2'd0; +reg [15:0] ip_length_reg = 16'd0; +reg [15:0] ip_identification_reg = 16'd0; +reg [2:0] ip_flags_reg = 3'd0; +reg [12:0] ip_fragment_offset_reg = 13'd0; +reg [7:0] ip_ttl_reg = 8'd0; +reg [7:0] ip_protocol_reg = 8'd0; +reg [31:0] ip_source_ip_reg = 32'd0; +reg [31:0] ip_dest_ip_reg = 32'd0; + +reg s_ip_hdr_ready_reg = 1'b0, s_ip_hdr_ready_next; +reg s_ip_payload_axis_tready_reg = 1'b0, s_ip_payload_axis_tready_next; + +reg m_eth_hdr_valid_reg = 1'b0, m_eth_hdr_valid_next; +reg [47:0] m_eth_dest_mac_reg = 48'd0; +reg [47:0] m_eth_src_mac_reg = 48'd0; +reg [15:0] m_eth_type_reg = 16'd0; + +reg busy_reg = 1'b0; +reg error_payload_early_termination_reg = 1'b0, error_payload_early_termination_next; + +reg [63:0] save_ip_payload_axis_tdata_reg = 64'd0; +reg [7:0] save_ip_payload_axis_tkeep_reg = 8'd0; +reg save_ip_payload_axis_tlast_reg = 1'b0; +reg save_ip_payload_axis_tuser_reg = 1'b0; + +reg [63:0] shift_ip_payload_axis_tdata; +reg [7:0] shift_ip_payload_axis_tkeep; +reg shift_ip_payload_axis_tvalid; +reg shift_ip_payload_axis_tlast; +reg shift_ip_payload_axis_tuser; +reg shift_ip_payload_s_tready; +reg shift_ip_payload_extra_cycle_reg = 1'b0; + +// internal datapath +reg [63:0] m_eth_payload_axis_tdata_int; +reg [7:0] m_eth_payload_axis_tkeep_int; +reg m_eth_payload_axis_tvalid_int; +reg m_eth_payload_axis_tready_int_reg = 1'b0; +reg m_eth_payload_axis_tlast_int; +reg m_eth_payload_axis_tuser_int; +wire m_eth_payload_axis_tready_int_early; + +assign s_ip_hdr_ready = s_ip_hdr_ready_reg; +assign s_ip_payload_axis_tready = s_ip_payload_axis_tready_reg; + +assign m_eth_hdr_valid = m_eth_hdr_valid_reg; +assign m_eth_dest_mac = m_eth_dest_mac_reg; +assign m_eth_src_mac = m_eth_src_mac_reg; +assign m_eth_type = m_eth_type_reg; + +assign busy = busy_reg; +assign error_payload_early_termination = error_payload_early_termination_reg; + +function [3:0] keep2count; + input [7:0] k; + casez (k) + 8'bzzzzzzz0: keep2count = 4'd0; + 8'bzzzzzz01: keep2count = 4'd1; + 8'bzzzzz011: keep2count = 4'd2; + 8'bzzzz0111: keep2count = 4'd3; + 8'bzzz01111: keep2count = 4'd4; + 8'bzz011111: keep2count = 4'd5; + 8'bz0111111: keep2count = 4'd6; + 8'b01111111: keep2count = 4'd7; + 8'b11111111: keep2count = 4'd8; + endcase +endfunction + +function [7:0] count2keep; + input [3:0] k; + case (k) + 4'd0: count2keep = 8'b00000000; + 4'd1: count2keep = 8'b00000001; + 4'd2: count2keep = 8'b00000011; + 4'd3: count2keep = 8'b00000111; + 4'd4: count2keep = 8'b00001111; + 4'd5: count2keep = 8'b00011111; + 4'd6: count2keep = 8'b00111111; + 4'd7: count2keep = 8'b01111111; + 4'd8: count2keep = 8'b11111111; + endcase +endfunction + +always @* begin + shift_ip_payload_axis_tdata[31:0] = save_ip_payload_axis_tdata_reg[63:32]; + shift_ip_payload_axis_tkeep[3:0] = save_ip_payload_axis_tkeep_reg[7:4]; + + if (shift_ip_payload_extra_cycle_reg) begin + shift_ip_payload_axis_tdata[63:32] = 32'd0; + shift_ip_payload_axis_tkeep[7:4] = 4'd0; + shift_ip_payload_axis_tvalid = 1'b1; + shift_ip_payload_axis_tlast = save_ip_payload_axis_tlast_reg; + shift_ip_payload_axis_tuser = save_ip_payload_axis_tuser_reg; + shift_ip_payload_s_tready = flush_save; + end else begin + shift_ip_payload_axis_tdata[63:32] = s_ip_payload_axis_tdata[31:0]; + shift_ip_payload_axis_tkeep[7:4] = s_ip_payload_axis_tkeep[3:0]; + shift_ip_payload_axis_tvalid = s_ip_payload_axis_tvalid; + shift_ip_payload_axis_tlast = (s_ip_payload_axis_tlast && (s_ip_payload_axis_tkeep[7:4] == 0)); + shift_ip_payload_axis_tuser = (s_ip_payload_axis_tuser && (s_ip_payload_axis_tkeep[7:4] == 0)); + shift_ip_payload_s_tready = !(s_ip_payload_axis_tlast && s_ip_payload_axis_tvalid && transfer_in_save) && !save_ip_payload_axis_tlast_reg; + end +end + +always @* begin + state_next = STATE_IDLE; + + s_ip_hdr_ready_next = 1'b0; + s_ip_payload_axis_tready_next = 1'b0; + + store_ip_hdr = 1'b0; + + store_last_word = 1'b0; + + flush_save = 1'b0; + transfer_in_save = 1'b0; + + hdr_ptr_next = hdr_ptr_reg; + word_count_next = word_count_reg; + + hdr_sum_temp = 20'd0; + hdr_sum_next = hdr_sum_reg; + + m_eth_hdr_valid_next = m_eth_hdr_valid_reg && !m_eth_hdr_ready; + + error_payload_early_termination_next = 1'b0; + + m_eth_payload_axis_tdata_int = 1'b0; + m_eth_payload_axis_tkeep_int = 1'b0; + m_eth_payload_axis_tvalid_int = 1'b0; + m_eth_payload_axis_tlast_int = 1'b0; + m_eth_payload_axis_tuser_int = 1'b0; + + case (state_reg) + STATE_IDLE: begin + // idle state - wait for data + hdr_ptr_next = 6'd0; + flush_save = 1'b1; + s_ip_hdr_ready_next = !m_eth_hdr_valid_next; + + if (s_ip_hdr_ready && s_ip_hdr_valid) begin + store_ip_hdr = 1'b1; + hdr_sum_next = {4'd4, 4'd5, s_ip_dscp, s_ip_ecn} + + s_ip_length + + s_ip_identification + + {s_ip_flags, s_ip_fragment_offset} + + {s_ip_ttl, s_ip_protocol} + + s_ip_source_ip[31:16] + + s_ip_source_ip[15: 0] + + s_ip_dest_ip[31:16] + + s_ip_dest_ip[15: 0]; + s_ip_hdr_ready_next = 1'b0; + m_eth_hdr_valid_next = 1'b1; + if (m_eth_payload_axis_tready_int_reg) begin + m_eth_payload_axis_tvalid_int = 1'b1; + m_eth_payload_axis_tdata_int[ 7: 0] = {4'd4, 4'd5}; // ip_version, ip_ihl + m_eth_payload_axis_tdata_int[15: 8] = {s_ip_dscp, s_ip_ecn}; + m_eth_payload_axis_tdata_int[23:16] = s_ip_length[15: 8]; + m_eth_payload_axis_tdata_int[31:24] = s_ip_length[ 7: 0]; + m_eth_payload_axis_tdata_int[39:32] = s_ip_identification[15: 8]; + m_eth_payload_axis_tdata_int[47:40] = s_ip_identification[ 7: 0]; + m_eth_payload_axis_tdata_int[55:48] = {s_ip_flags, s_ip_fragment_offset[12: 8]}; + m_eth_payload_axis_tdata_int[63:56] = s_ip_fragment_offset[ 7: 0]; + m_eth_payload_axis_tkeep_int = 8'hff; + hdr_ptr_next = 6'd8; + end + state_next = STATE_WRITE_HEADER; + end else begin + state_next = STATE_IDLE; + end + end + STATE_WRITE_HEADER: begin + // write header + word_count_next = ip_length_reg - 5*4 + 4; + + if (m_eth_payload_axis_tready_int_reg) begin + hdr_ptr_next = hdr_ptr_reg + 6'd8; + m_eth_payload_axis_tvalid_int = 1'b1; + state_next = STATE_WRITE_HEADER; + case (hdr_ptr_reg) + 6'h00: begin + m_eth_payload_axis_tdata_int[ 7: 0] = {4'd4, 4'd5}; // ip_version, ip_ihl + m_eth_payload_axis_tdata_int[15: 8] = {ip_dscp_reg, ip_ecn_reg}; + m_eth_payload_axis_tdata_int[23:16] = ip_length_reg[15: 8]; + m_eth_payload_axis_tdata_int[31:24] = ip_length_reg[ 7: 0]; + m_eth_payload_axis_tdata_int[39:32] = ip_identification_reg[15: 8]; + m_eth_payload_axis_tdata_int[47:40] = ip_identification_reg[ 7: 0]; + m_eth_payload_axis_tdata_int[55:48] = {ip_flags_reg, ip_fragment_offset_reg[12: 8]}; + m_eth_payload_axis_tdata_int[63:56] = ip_fragment_offset_reg[ 7: 0]; + m_eth_payload_axis_tkeep_int = 8'hff; + end + 6'h08: begin + hdr_sum_temp = hdr_sum_reg[15:0] + hdr_sum_reg[19:16]; + hdr_sum_temp = hdr_sum_temp[15:0] + hdr_sum_temp[16]; + m_eth_payload_axis_tdata_int[ 7: 0] = ip_ttl_reg; + m_eth_payload_axis_tdata_int[15: 8] = ip_protocol_reg; + m_eth_payload_axis_tdata_int[23:16] = ~hdr_sum_temp[15: 8]; + m_eth_payload_axis_tdata_int[31:24] = ~hdr_sum_temp[ 7: 0]; + m_eth_payload_axis_tdata_int[39:32] = ip_source_ip_reg[31:24]; + m_eth_payload_axis_tdata_int[47:40] = ip_source_ip_reg[23:16]; + m_eth_payload_axis_tdata_int[55:48] = ip_source_ip_reg[15: 8]; + m_eth_payload_axis_tdata_int[63:56] = ip_source_ip_reg[ 7: 0]; + m_eth_payload_axis_tkeep_int = 8'hff; + s_ip_payload_axis_tready_next = m_eth_payload_axis_tready_int_early; + state_next = STATE_WRITE_HEADER_LAST; + end + endcase + end else begin + state_next = STATE_WRITE_HEADER; + end + end + STATE_WRITE_HEADER_LAST: begin + // last header word requires first payload word; process accordingly + s_ip_payload_axis_tready_next = m_eth_payload_axis_tready_int_early && shift_ip_payload_s_tready; + + if (s_ip_payload_axis_tready && s_ip_payload_axis_tvalid) begin + m_eth_payload_axis_tvalid_int = 1'b1; + transfer_in_save = 1'b1; + + m_eth_payload_axis_tdata_int[ 7: 0] = ip_dest_ip_reg[31:24]; + m_eth_payload_axis_tdata_int[15: 8] = ip_dest_ip_reg[23:16]; + m_eth_payload_axis_tdata_int[23:16] = ip_dest_ip_reg[15: 8]; + m_eth_payload_axis_tdata_int[31:24] = ip_dest_ip_reg[ 7: 0]; + m_eth_payload_axis_tdata_int[39:32] = shift_ip_payload_axis_tdata[39:32]; + m_eth_payload_axis_tdata_int[47:40] = shift_ip_payload_axis_tdata[47:40]; + m_eth_payload_axis_tdata_int[55:48] = shift_ip_payload_axis_tdata[55:48]; + m_eth_payload_axis_tdata_int[63:56] = shift_ip_payload_axis_tdata[63:56]; + m_eth_payload_axis_tkeep_int = {shift_ip_payload_axis_tkeep[7:4], 4'hF}; + m_eth_payload_axis_tlast_int = shift_ip_payload_axis_tlast; + m_eth_payload_axis_tuser_int = shift_ip_payload_axis_tuser; + word_count_next = word_count_reg - 16'd8; + + if (keep2count(m_eth_payload_axis_tkeep_int) >= word_count_reg) begin + // have entire payload + m_eth_payload_axis_tkeep_int = count2keep(word_count_reg); + if (shift_ip_payload_axis_tlast) begin + s_ip_hdr_ready_next = !m_eth_hdr_valid_next; + s_ip_payload_axis_tready_next = 1'b0; + state_next = STATE_IDLE; + end else begin + store_last_word = 1'b1; + s_ip_payload_axis_tready_next = shift_ip_payload_s_tready; + m_eth_payload_axis_tvalid_int = 1'b0; + state_next = STATE_WRITE_PAYLOAD_LAST; + end + end else begin + if (shift_ip_payload_axis_tlast) begin + // end of frame, but length does not match + error_payload_early_termination_next = 1'b1; + s_ip_payload_axis_tready_next = shift_ip_payload_s_tready; + m_eth_payload_axis_tuser_int = 1'b1; + state_next = STATE_WAIT_LAST; + end else begin + state_next = STATE_WRITE_PAYLOAD; + end + end + end else begin + state_next = STATE_WRITE_HEADER_LAST; + end + end + STATE_WRITE_PAYLOAD: begin + // write payload + s_ip_payload_axis_tready_next = m_eth_payload_axis_tready_int_early && shift_ip_payload_s_tready; + + m_eth_payload_axis_tdata_int = shift_ip_payload_axis_tdata; + m_eth_payload_axis_tkeep_int = shift_ip_payload_axis_tkeep; + m_eth_payload_axis_tlast_int = shift_ip_payload_axis_tlast; + m_eth_payload_axis_tuser_int = shift_ip_payload_axis_tuser; + + store_last_word = 1'b1; + + if (m_eth_payload_axis_tready_int_reg && shift_ip_payload_axis_tvalid) begin + // word transfer through + word_count_next = word_count_reg - 16'd8; + transfer_in_save = 1'b1; + m_eth_payload_axis_tvalid_int = 1'b1; + if (word_count_reg <= 8) begin + // have entire payload + m_eth_payload_axis_tkeep_int = count2keep(word_count_reg); + if (shift_ip_payload_axis_tlast) begin + if (keep2count(shift_ip_payload_axis_tkeep) < word_count_reg[4:0]) begin + // end of frame, but length does not match + error_payload_early_termination_next = 1'b1; + m_eth_payload_axis_tuser_int = 1'b1; + end + s_ip_payload_axis_tready_next = 1'b0; + flush_save = 1'b1; + s_ip_hdr_ready_next = !m_eth_hdr_valid_next; + state_next = STATE_IDLE; + end else begin + m_eth_payload_axis_tvalid_int = 1'b0; + state_next = STATE_WRITE_PAYLOAD_LAST; + end + end else begin + if (shift_ip_payload_axis_tlast) begin + // end of frame, but length does not match + error_payload_early_termination_next = 1'b1; + m_eth_payload_axis_tuser_int = 1'b1; + s_ip_payload_axis_tready_next = 1'b0; + flush_save = 1'b1; + s_ip_hdr_ready_next = !m_eth_hdr_valid_next; + state_next = STATE_IDLE; + end else begin + state_next = STATE_WRITE_PAYLOAD; + end + end + end else begin + state_next = STATE_WRITE_PAYLOAD; + end + end + STATE_WRITE_PAYLOAD_LAST: begin + // read and discard until end of frame + s_ip_payload_axis_tready_next = m_eth_payload_axis_tready_int_early && shift_ip_payload_s_tready; + + m_eth_payload_axis_tdata_int = last_word_data_reg; + m_eth_payload_axis_tkeep_int = last_word_keep_reg; + m_eth_payload_axis_tlast_int = shift_ip_payload_axis_tlast; + m_eth_payload_axis_tuser_int = shift_ip_payload_axis_tuser; + + if (m_eth_payload_axis_tready_int_reg && shift_ip_payload_axis_tvalid) begin + transfer_in_save = 1'b1; + if (shift_ip_payload_axis_tlast) begin + s_ip_hdr_ready_next = !m_eth_hdr_valid_next; + s_ip_payload_axis_tready_next = 1'b0; + m_eth_payload_axis_tvalid_int = 1'b1; + state_next = STATE_IDLE; + end else begin + state_next = STATE_WRITE_PAYLOAD_LAST; + end + end else begin + state_next = STATE_WRITE_PAYLOAD_LAST; + end + end + STATE_WAIT_LAST: begin + // read and discard until end of frame + s_ip_payload_axis_tready_next = shift_ip_payload_s_tready; + + if (shift_ip_payload_axis_tvalid) begin + transfer_in_save = 1'b1; + if (shift_ip_payload_axis_tlast) begin + s_ip_hdr_ready_next = !m_eth_hdr_valid_next; + s_ip_payload_axis_tready_next = 1'b0; + state_next = STATE_IDLE; + end else begin + state_next = STATE_WAIT_LAST; + end + end else begin + state_next = STATE_WAIT_LAST; + end + end + endcase +end + +always @(posedge clk) begin + if (rst) begin + state_reg <= STATE_IDLE; + s_ip_hdr_ready_reg <= 1'b0; + s_ip_payload_axis_tready_reg <= 1'b0; + m_eth_hdr_valid_reg <= 1'b0; + save_ip_payload_axis_tlast_reg <= 1'b0; + shift_ip_payload_extra_cycle_reg <= 1'b0; + busy_reg <= 1'b0; + error_payload_early_termination_reg <= 1'b0; + end else begin + state_reg <= state_next; + + s_ip_hdr_ready_reg <= s_ip_hdr_ready_next; + s_ip_payload_axis_tready_reg <= s_ip_payload_axis_tready_next; + + m_eth_hdr_valid_reg <= m_eth_hdr_valid_next; + + busy_reg <= state_next != STATE_IDLE; + + error_payload_early_termination_reg <= error_payload_early_termination_next; + + if (flush_save) begin + save_ip_payload_axis_tlast_reg <= 1'b0; + shift_ip_payload_extra_cycle_reg <= 1'b0; + end else if (transfer_in_save) begin + save_ip_payload_axis_tlast_reg <= s_ip_payload_axis_tlast; + shift_ip_payload_extra_cycle_reg <= s_ip_payload_axis_tlast && (s_ip_payload_axis_tkeep[7:4] != 0); + end + end + + hdr_ptr_reg <= hdr_ptr_next; + word_count_reg <= word_count_next; + + hdr_sum_reg <= hdr_sum_next; + + // datapath + if (store_ip_hdr) begin + m_eth_dest_mac_reg <= s_eth_dest_mac; + m_eth_src_mac_reg <= s_eth_src_mac; + m_eth_type_reg <= s_eth_type; + ip_dscp_reg <= s_ip_dscp; + ip_ecn_reg <= s_ip_ecn; + ip_length_reg <= s_ip_length; + ip_identification_reg <= s_ip_identification; + ip_flags_reg <= s_ip_flags; + ip_fragment_offset_reg <= s_ip_fragment_offset; + ip_ttl_reg <= s_ip_ttl; + ip_protocol_reg <= s_ip_protocol; + ip_source_ip_reg <= s_ip_source_ip; + ip_dest_ip_reg <= s_ip_dest_ip; + end + + if (store_last_word) begin + last_word_data_reg <= m_eth_payload_axis_tdata_int; + last_word_keep_reg <= m_eth_payload_axis_tkeep_int; + end + + if (transfer_in_save) begin + save_ip_payload_axis_tdata_reg <= s_ip_payload_axis_tdata; + save_ip_payload_axis_tkeep_reg <= s_ip_payload_axis_tkeep; + save_ip_payload_axis_tuser_reg <= s_ip_payload_axis_tuser; + end +end + +// output datapath logic +reg [63:0] m_eth_payload_axis_tdata_reg = 64'd0; +reg [7:0] m_eth_payload_axis_tkeep_reg = 8'd0; +reg m_eth_payload_axis_tvalid_reg = 1'b0, m_eth_payload_axis_tvalid_next; +reg m_eth_payload_axis_tlast_reg = 1'b0; +reg m_eth_payload_axis_tuser_reg = 1'b0; + +reg [63:0] temp_m_eth_payload_axis_tdata_reg = 64'd0; +reg [7:0] temp_m_eth_payload_axis_tkeep_reg = 8'd0; +reg temp_m_eth_payload_axis_tvalid_reg = 1'b0, temp_m_eth_payload_axis_tvalid_next; +reg temp_m_eth_payload_axis_tlast_reg = 1'b0; +reg temp_m_eth_payload_axis_tuser_reg = 1'b0; + +// datapath control +reg store_eth_payload_int_to_output; +reg store_eth_payload_int_to_temp; +reg store_eth_payload_axis_temp_to_output; + +assign m_eth_payload_axis_tdata = m_eth_payload_axis_tdata_reg; +assign m_eth_payload_axis_tkeep = m_eth_payload_axis_tkeep_reg; +assign m_eth_payload_axis_tvalid = m_eth_payload_axis_tvalid_reg; +assign m_eth_payload_axis_tlast = m_eth_payload_axis_tlast_reg; +assign m_eth_payload_axis_tuser = m_eth_payload_axis_tuser_reg; + +// enable ready input next cycle if output is ready or if both output registers are empty +assign m_eth_payload_axis_tready_int_early = m_eth_payload_axis_tready || (!temp_m_eth_payload_axis_tvalid_reg && !m_eth_payload_axis_tvalid_reg); + +always @* begin + // transfer sink ready state to source + m_eth_payload_axis_tvalid_next = m_eth_payload_axis_tvalid_reg; + temp_m_eth_payload_axis_tvalid_next = temp_m_eth_payload_axis_tvalid_reg; + + store_eth_payload_int_to_output = 1'b0; + store_eth_payload_int_to_temp = 1'b0; + store_eth_payload_axis_temp_to_output = 1'b0; + + if (m_eth_payload_axis_tready_int_reg) begin + // input is ready + if (m_eth_payload_axis_tready | !m_eth_payload_axis_tvalid_reg) begin + // output is ready or currently not valid, transfer data to output + m_eth_payload_axis_tvalid_next = m_eth_payload_axis_tvalid_int; + store_eth_payload_int_to_output = 1'b1; + end else begin + // output is not ready, store input in temp + temp_m_eth_payload_axis_tvalid_next = m_eth_payload_axis_tvalid_int; + store_eth_payload_int_to_temp = 1'b1; + end + end else if (m_eth_payload_axis_tready) begin + // input is not ready, but output is ready + m_eth_payload_axis_tvalid_next = temp_m_eth_payload_axis_tvalid_reg; + temp_m_eth_payload_axis_tvalid_next = 1'b0; + store_eth_payload_axis_temp_to_output = 1'b1; + end +end + +always @(posedge clk) begin + m_eth_payload_axis_tvalid_reg <= m_eth_payload_axis_tvalid_next; + m_eth_payload_axis_tready_int_reg <= m_eth_payload_axis_tready_int_early; + temp_m_eth_payload_axis_tvalid_reg <= temp_m_eth_payload_axis_tvalid_next; + + // datapath + if (store_eth_payload_int_to_output) begin + m_eth_payload_axis_tdata_reg <= m_eth_payload_axis_tdata_int; + m_eth_payload_axis_tkeep_reg <= m_eth_payload_axis_tkeep_int; + m_eth_payload_axis_tlast_reg <= m_eth_payload_axis_tlast_int; + m_eth_payload_axis_tuser_reg <= m_eth_payload_axis_tuser_int; + end else if (store_eth_payload_axis_temp_to_output) begin + m_eth_payload_axis_tdata_reg <= temp_m_eth_payload_axis_tdata_reg; + m_eth_payload_axis_tkeep_reg <= temp_m_eth_payload_axis_tkeep_reg; + m_eth_payload_axis_tlast_reg <= temp_m_eth_payload_axis_tlast_reg; + m_eth_payload_axis_tuser_reg <= temp_m_eth_payload_axis_tuser_reg; + end + + if (store_eth_payload_int_to_temp) begin + temp_m_eth_payload_axis_tdata_reg <= m_eth_payload_axis_tdata_int; + temp_m_eth_payload_axis_tkeep_reg <= m_eth_payload_axis_tkeep_int; + temp_m_eth_payload_axis_tlast_reg <= m_eth_payload_axis_tlast_int; + temp_m_eth_payload_axis_tuser_reg <= m_eth_payload_axis_tuser_int; + end + + if (rst) begin + m_eth_payload_axis_tvalid_reg <= 1'b0; + m_eth_payload_axis_tready_int_reg <= 1'b0; + temp_m_eth_payload_axis_tvalid_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/lfsr.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/lfsr.v new file mode 100755 index 0000000..e3a472e --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/lfsr.v @@ -0,0 +1,447 @@ +/* + +Copyright (c) 2016-2023 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * Parametrizable combinatorial parallel LFSR/CRC + */ +module lfsr # +( + // width of LFSR + parameter LFSR_WIDTH = 31, + // LFSR polynomial + parameter LFSR_POLY = 31'h10000001, + // LFSR configuration: "GALOIS", "FIBONACCI" + parameter LFSR_CONFIG = "FIBONACCI", + // LFSR feed forward enable + parameter LFSR_FEED_FORWARD = 0, + // bit-reverse input and output + parameter REVERSE = 0, + // width of data input + parameter DATA_WIDTH = 8, + // implementation style: "AUTO", "LOOP", "REDUCTION" + parameter STYLE = "AUTO" +) +( + input wire [DATA_WIDTH-1:0] data_in, + input wire [LFSR_WIDTH-1:0] state_in, + output wire [DATA_WIDTH-1:0] data_out, + output wire [LFSR_WIDTH-1:0] state_out +); + +/* + +Fully parametrizable combinatorial parallel LFSR/CRC module. Implements an unrolled LFSR +next state computation, shifting DATA_WIDTH bits per pass through the module. Input data +is XORed with LFSR feedback path, tie data_in to zero if this is not required. + +Works in two parts: statically computes a set of bit masks, then uses these bit masks to +select bits for XORing to compute the next state. + +Ports: + +data_in + +Data bits to be shifted through the LFSR (DATA_WIDTH bits) + +state_in + +LFSR/CRC current state input (LFSR_WIDTH bits) + +data_out + +Data bits shifted out of LFSR (DATA_WIDTH bits) + +state_out + +LFSR/CRC next state output (LFSR_WIDTH bits) + +Parameters: + +LFSR_WIDTH + +Specify width of LFSR/CRC register + +LFSR_POLY + +Specify the LFSR/CRC polynomial in hex format. For example, the polynomial + +x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 + +would be represented as + +32'h04c11db7 + +Note that the largest term (x^32) is suppressed. This term is generated automatically based +on LFSR_WIDTH. + +LFSR_CONFIG + +Specify the LFSR configuration, either Fibonacci or Galois. Fibonacci is generally used +for linear-feedback shift registers (LFSR) for pseudorandom binary sequence (PRBS) generators, +scramblers, and descrambers, while Galois is generally used for cyclic redundancy check +generators and checkers. + +Fibonacci style (example for 64b66b scrambler, 0x8000000001) + + DIN (LSB first) + | + V + (+)<---------------------------(+)<-----------------------------. + | ^ | + | .----. .----. .----. | .----. .----. .----. | + +->| 0 |->| 1 |->...->| 38 |-+->| 39 |->...->| 56 |->| 57 |--' + | '----' '----' '----' '----' '----' '----' + V + DOUT + +Galois style (example for CRC16, 0x8005) + + ,-------------------+-------------------------+----------(+)<-- DIN (MSB first) + | | | ^ + | .----. .----. V .----. .----. V .----. | + `->| 0 |->| 1 |->(+)->| 2 |->...->| 14 |->(+)->| 15 |--+---> DOUT + '----' '----' '----' '----' '----' + +LFSR_FEED_FORWARD + +Generate feed forward instead of feed back LFSR. Enable this for PRBS checking and self- +synchronous descrambling. + +Fibonacci feed-forward style (example for 64b66b descrambler, 0x8000000001) + + DIN (LSB first) + | + | .----. .----. .----. .----. .----. .----. + +->| 0 |->| 1 |->...->| 38 |-+->| 39 |->...->| 56 |->| 57 |--. + | '----' '----' '----' | '----' '----' '----' | + | V | + (+)<---------------------------(+)------------------------------' + | + V + DOUT + +Galois feed-forward style + + ,-------------------+-------------------------+------------+--- DIN (MSB first) + | | | | + | .----. .----. V .----. .----. V .----. V + `->| 0 |->| 1 |->(+)->| 2 |->...->| 14 |->(+)->| 15 |->(+)-> DOUT + '----' '----' '----' '----' '----' + +REVERSE + +Bit-reverse LFSR input and output. Shifts MSB first by default, set REVERSE for LSB first. + +DATA_WIDTH + +Specify width of input and output data bus. The module will perform one shift per input +data bit, so if the input data bus is not required tie data_in to zero and set DATA_WIDTH +to the required number of shifts per clock cycle. + +STYLE + +Specify implementation style. Can be "AUTO", "LOOP", or "REDUCTION". When "AUTO" +is selected, implemenation will be "LOOP" or "REDUCTION" based on synthesis translate +directives. "REDUCTION" and "LOOP" are functionally identical, however they simulate +and synthesize differently. "REDUCTION" is implemented with a loop over a Verilog +reduction operator. "LOOP" is implemented as a doubly-nested loop with no reduction +operator. "REDUCTION" is very fast for simulation in iverilog and synthesizes well in +Quartus but synthesizes poorly in ISE, likely due to large inferred XOR gates causing +problems with the optimizer. "LOOP" synthesizes will in both ISE and Quartus. "AUTO" +will default to "REDUCTION" when simulating and "LOOP" for synthesizers that obey +synthesis translate directives. + +Settings for common LFSR/CRC implementations: + +Name Configuration Length Polynomial Initial value Notes +CRC16-IBM Galois, bit-reverse 16 16'h8005 16'hffff +CRC16-CCITT Galois 16 16'h1021 16'h1d0f +CRC32 Galois, bit-reverse 32 32'h04c11db7 32'hffffffff Ethernet FCS; invert final output +CRC32C Galois, bit-reverse 32 32'h1edc6f41 32'hffffffff iSCSI, Intel CRC32 instruction; invert final output +PRBS6 Fibonacci 6 6'h21 any +PRBS7 Fibonacci 7 7'h41 any +PRBS9 Fibonacci 9 9'h021 any ITU V.52 +PRBS10 Fibonacci 10 10'h081 any ITU +PRBS11 Fibonacci 11 11'h201 any ITU O.152 +PRBS15 Fibonacci, inverted 15 15'h4001 any ITU O.152 +PRBS17 Fibonacci 17 17'h04001 any +PRBS20 Fibonacci 20 20'h00009 any ITU V.57 +PRBS23 Fibonacci, inverted 23 23'h040001 any ITU O.151 +PRBS29 Fibonacci, inverted 29 29'h08000001 any +PRBS31 Fibonacci, inverted 31 31'h10000001 any +64b66b Fibonacci, bit-reverse 58 58'h8000000001 any 10G Ethernet +128b130b Galois, bit-reverse 23 23'h210125 any PCIe gen 3 + +*/ + +function [LFSR_WIDTH+DATA_WIDTH-1:0] lfsr_mask(input [31:0] index); + reg [LFSR_WIDTH-1:0] lfsr_mask_state[LFSR_WIDTH-1:0]; + reg [DATA_WIDTH-1:0] lfsr_mask_data[LFSR_WIDTH-1:0]; + reg [LFSR_WIDTH-1:0] output_mask_state[DATA_WIDTH-1:0]; + reg [DATA_WIDTH-1:0] output_mask_data[DATA_WIDTH-1:0]; + + reg [LFSR_WIDTH-1:0] state_val; + reg [DATA_WIDTH-1:0] data_val; + + reg [DATA_WIDTH-1:0] data_mask; + + integer i, j; + + begin + // init bit masks + for (i = 0; i < LFSR_WIDTH; i = i + 1) begin + lfsr_mask_state[i] = 0; + lfsr_mask_state[i][i] = 1'b1; + lfsr_mask_data[i] = 0; + end + for (i = 0; i < DATA_WIDTH; i = i + 1) begin + output_mask_state[i] = 0; + if (i < LFSR_WIDTH) begin + output_mask_state[i][i] = 1'b1; + end + output_mask_data[i] = 0; + end + + // simulate shift register + if (LFSR_CONFIG == "FIBONACCI") begin + // Fibonacci configuration + for (data_mask = {1'b1, {DATA_WIDTH-1{1'b0}}}; data_mask != 0; data_mask = data_mask >> 1) begin + // determine shift in value + // current value in last FF, XOR with input data bit (MSB first) + state_val = lfsr_mask_state[LFSR_WIDTH-1]; + data_val = lfsr_mask_data[LFSR_WIDTH-1]; + data_val = data_val ^ data_mask; + + // add XOR inputs from correct indicies + for (j = 1; j < LFSR_WIDTH; j = j + 1) begin + if ((LFSR_POLY >> j) & 1) begin + state_val = lfsr_mask_state[j-1] ^ state_val; + data_val = lfsr_mask_data[j-1] ^ data_val; + end + end + + // shift + for (j = LFSR_WIDTH-1; j > 0; j = j - 1) begin + lfsr_mask_state[j] = lfsr_mask_state[j-1]; + lfsr_mask_data[j] = lfsr_mask_data[j-1]; + end + for (j = DATA_WIDTH-1; j > 0; j = j - 1) begin + output_mask_state[j] = output_mask_state[j-1]; + output_mask_data[j] = output_mask_data[j-1]; + end + output_mask_state[0] = state_val; + output_mask_data[0] = data_val; + if (LFSR_FEED_FORWARD) begin + // only shift in new input data + state_val = {LFSR_WIDTH{1'b0}}; + data_val = data_mask; + end + lfsr_mask_state[0] = state_val; + lfsr_mask_data[0] = data_val; + end + end else if (LFSR_CONFIG == "GALOIS") begin + // Galois configuration + for (data_mask = {1'b1, {DATA_WIDTH-1{1'b0}}}; data_mask != 0; data_mask = data_mask >> 1) begin + // determine shift in value + // current value in last FF, XOR with input data bit (MSB first) + state_val = lfsr_mask_state[LFSR_WIDTH-1]; + data_val = lfsr_mask_data[LFSR_WIDTH-1]; + data_val = data_val ^ data_mask; + + // shift + for (j = LFSR_WIDTH-1; j > 0; j = j - 1) begin + lfsr_mask_state[j] = lfsr_mask_state[j-1]; + lfsr_mask_data[j] = lfsr_mask_data[j-1]; + end + for (j = DATA_WIDTH-1; j > 0; j = j - 1) begin + output_mask_state[j] = output_mask_state[j-1]; + output_mask_data[j] = output_mask_data[j-1]; + end + output_mask_state[0] = state_val; + output_mask_data[0] = data_val; + if (LFSR_FEED_FORWARD) begin + // only shift in new input data + state_val = {LFSR_WIDTH{1'b0}}; + data_val = data_mask; + end + lfsr_mask_state[0] = state_val; + lfsr_mask_data[0] = data_val; + + // add XOR inputs at correct indicies + for (j = 1; j < LFSR_WIDTH; j = j + 1) begin + if ((LFSR_POLY >> j) & 1) begin + lfsr_mask_state[j] = lfsr_mask_state[j] ^ state_val; + lfsr_mask_data[j] = lfsr_mask_data[j] ^ data_val; + end + end + end + end else begin + $error("Error: unknown configuration setting!"); + $finish; + end + + // reverse bits if selected + if (REVERSE) begin + if (index < LFSR_WIDTH) begin + state_val = 0; + for (i = 0; i < LFSR_WIDTH; i = i + 1) begin + state_val[i] = lfsr_mask_state[LFSR_WIDTH-index-1][LFSR_WIDTH-i-1]; + end + + data_val = 0; + for (i = 0; i < DATA_WIDTH; i = i + 1) begin + data_val[i] = lfsr_mask_data[LFSR_WIDTH-index-1][DATA_WIDTH-i-1]; + end + end else begin + state_val = 0; + for (i = 0; i < LFSR_WIDTH; i = i + 1) begin + state_val[i] = output_mask_state[DATA_WIDTH-(index-LFSR_WIDTH)-1][LFSR_WIDTH-i-1]; + end + + data_val = 0; + for (i = 0; i < DATA_WIDTH; i = i + 1) begin + data_val[i] = output_mask_data[DATA_WIDTH-(index-LFSR_WIDTH)-1][DATA_WIDTH-i-1]; + end + end + end else begin + if (index < LFSR_WIDTH) begin + state_val = lfsr_mask_state[index]; + data_val = lfsr_mask_data[index]; + end else begin + state_val = output_mask_state[index-LFSR_WIDTH]; + data_val = output_mask_data[index-LFSR_WIDTH]; + end + end + lfsr_mask = {data_val, state_val}; + end +endfunction + +// synthesis translate_off +`define SIMULATION +// synthesis translate_on + +`ifdef SIMULATION +// "AUTO" style is "REDUCTION" for faster simulation +parameter STYLE_INT = (STYLE == "AUTO") ? "REDUCTION" : STYLE; +`else +// "AUTO" style is "LOOP" for better synthesis result +parameter STYLE_INT = (STYLE == "AUTO") ? "LOOP" : STYLE; +`endif + +genvar n; + +generate + +if (STYLE_INT == "REDUCTION") begin + + // use Verilog reduction operator + // fast in iverilog + // significantly larger than generated code with ISE (inferred wide XORs may be tripping up optimizer) + // slightly smaller than generated code with Quartus + // --> better for simulation + + for (n = 0; n < LFSR_WIDTH; n = n + 1) begin : lfsr_state + wire [LFSR_WIDTH+DATA_WIDTH-1:0] mask = lfsr_mask(n); + assign state_out[n] = ^({data_in, state_in} & mask); + end + for (n = 0; n < DATA_WIDTH; n = n + 1) begin : lfsr_data + wire [LFSR_WIDTH+DATA_WIDTH-1:0] mask = lfsr_mask(n+LFSR_WIDTH); + assign data_out[n] = ^({data_in, state_in} & mask); + end + +end else if (STYLE_INT == "LOOP") begin + + // use nested loops + // very slow in iverilog + // slightly smaller than generated code with ISE + // same size as generated code with Quartus + // --> better for synthesis + + for (n = 0; n < LFSR_WIDTH; n = n + 1) begin : lfsr_state + wire [LFSR_WIDTH+DATA_WIDTH-1:0] mask = lfsr_mask(n); + + reg state_reg; + + assign state_out[n] = state_reg; + + integer i; + + always @* begin + state_reg = 1'b0; + for (i = 0; i < LFSR_WIDTH; i = i + 1) begin + if (mask[i]) begin + state_reg = state_reg ^ state_in[i]; + end + end + for (i = 0; i < DATA_WIDTH; i = i + 1) begin + if (mask[i+LFSR_WIDTH]) begin + state_reg = state_reg ^ data_in[i]; + end + end + end + end + for (n = 0; n < DATA_WIDTH; n = n + 1) begin : lfsr_data + wire [LFSR_WIDTH+DATA_WIDTH-1:0] mask = lfsr_mask(n+LFSR_WIDTH); + + reg data_reg; + + assign data_out[n] = data_reg; + + integer i; + + always @* begin + data_reg = 1'b0; + for (i = 0; i < LFSR_WIDTH; i = i + 1) begin + if (mask[i]) begin + data_reg = data_reg ^ state_in[i]; + end + end + for (i = 0; i < DATA_WIDTH; i = i + 1) begin + if (mask[i+LFSR_WIDTH]) begin + data_reg = data_reg ^ data_in[i]; + end + end + end + end + +end else begin + + initial begin + $error("Error: unknown style setting!"); + $finish; + end + +end + +endgenerate + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_ctrl_rx.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_ctrl_rx.v new file mode 100755 index 0000000..d0de0da --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_ctrl_rx.v @@ -0,0 +1,448 @@ +/* + +Copyright (c) 2023 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * MAC control receive + */ +module mac_ctrl_rx # +( + parameter DATA_WIDTH = 8, + parameter KEEP_ENABLE = DATA_WIDTH>8, + parameter KEEP_WIDTH = DATA_WIDTH/8, + parameter ID_ENABLE = 0, + parameter ID_WIDTH = 8, + parameter DEST_ENABLE = 0, + parameter DEST_WIDTH = 8, + parameter USER_ENABLE = 1, + parameter USER_WIDTH = 1, + parameter USE_READY = 0, + parameter MCF_PARAMS_SIZE = 18 +) +( + input wire clk, + input wire rst, + + /* + * AXI stream input + */ + input wire [DATA_WIDTH-1:0] s_axis_tdata, + input wire [KEEP_WIDTH-1:0] s_axis_tkeep, + input wire s_axis_tvalid, + output wire s_axis_tready, + input wire s_axis_tlast, + input wire [ID_WIDTH-1:0] s_axis_tid, + input wire [DEST_WIDTH-1:0] s_axis_tdest, + input wire [USER_WIDTH-1:0] s_axis_tuser, + + /* + * AXI stream output + */ + output wire [DATA_WIDTH-1:0] m_axis_tdata, + output wire [KEEP_WIDTH-1:0] m_axis_tkeep, + output wire m_axis_tvalid, + input wire m_axis_tready, + output wire m_axis_tlast, + output wire [ID_WIDTH-1:0] m_axis_tid, + output wire [DEST_WIDTH-1:0] m_axis_tdest, + output wire [USER_WIDTH-1:0] m_axis_tuser, + + /* + * MAC control frame interface + */ + output wire mcf_valid, + output wire [47:0] mcf_eth_dst, + output wire [47:0] mcf_eth_src, + output wire [15:0] mcf_eth_type, + output wire [15:0] mcf_opcode, + output wire [MCF_PARAMS_SIZE*8-1:0] mcf_params, + output wire [ID_WIDTH-1:0] mcf_id, + output wire [DEST_WIDTH-1:0] mcf_dest, + output wire [USER_WIDTH-1:0] mcf_user, + + /* + * Configuration + */ + input wire [47:0] cfg_mcf_rx_eth_dst_mcast, + input wire cfg_mcf_rx_check_eth_dst_mcast, + input wire [47:0] cfg_mcf_rx_eth_dst_ucast, + input wire cfg_mcf_rx_check_eth_dst_ucast, + input wire [47:0] cfg_mcf_rx_eth_src, + input wire cfg_mcf_rx_check_eth_src, + input wire [15:0] cfg_mcf_rx_eth_type, + input wire [15:0] cfg_mcf_rx_opcode_lfc, + input wire cfg_mcf_rx_check_opcode_lfc, + input wire [15:0] cfg_mcf_rx_opcode_pfc, + input wire cfg_mcf_rx_check_opcode_pfc, + input wire cfg_mcf_rx_forward, + input wire cfg_mcf_rx_enable, + + /* + * Status + */ + output wire stat_rx_mcf +); + +parameter BYTE_LANES = KEEP_ENABLE ? KEEP_WIDTH : 1; + +parameter HDR_SIZE = 60; + +parameter CYCLE_COUNT = (HDR_SIZE+BYTE_LANES-1)/BYTE_LANES; + +parameter PTR_WIDTH = $clog2(CYCLE_COUNT); + +parameter OFFSET = HDR_SIZE % BYTE_LANES; + +// check configuration +initial begin + if (BYTE_LANES * 8 != DATA_WIDTH) begin + $error("Error: AXI stream interface requires byte (8-bit) granularity (instance %m)"); + $finish; + end + + if (MCF_PARAMS_SIZE > 44) begin + $error("Error: Maximum MCF_PARAMS_SIZE is 44 bytes (instance %m)"); + $finish; + end +end + +/* + +MAC control frame + + Field Length + Destination MAC address 6 octets [01:80:C2:00:00:01] + Source MAC address 6 octets + Ethertype 2 octets [0x8808] + Opcode 2 octets + Parameters 0-44 octets + +This module manages the reception of MAC control frames. Incoming frames are +checked based on the ethertype and (optionally) MAC addresses. Matching control +frames are marked by setting tuser[0] on the data output and forwarded through +a separate interface for processing. + +*/ + +reg read_mcf_reg = 1'b1, read_mcf_next; +reg mcf_frame_reg = 1'b0, mcf_frame_next; +reg [PTR_WIDTH-1:0] ptr_reg = 0, ptr_next; + +reg s_axis_tready_reg = 1'b0, s_axis_tready_next; + +// internal datapath +reg [DATA_WIDTH-1:0] m_axis_tdata_int; +reg [KEEP_WIDTH-1:0] m_axis_tkeep_int; +reg m_axis_tvalid_int; +reg m_axis_tready_int_reg = 1'b0; +reg m_axis_tlast_int; +reg [ID_WIDTH-1:0] m_axis_tid_int; +reg [DEST_WIDTH-1:0] m_axis_tdest_int; +reg [USER_WIDTH-1:0] m_axis_tuser_int; +wire m_axis_tready_int_early; + +reg mcf_valid_reg = 0, mcf_valid_next; +reg [47:0] mcf_eth_dst_reg = 0, mcf_eth_dst_next; +reg [47:0] mcf_eth_src_reg = 0, mcf_eth_src_next; +reg [15:0] mcf_eth_type_reg = 0, mcf_eth_type_next; +reg [15:0] mcf_opcode_reg = 0, mcf_opcode_next; +reg [MCF_PARAMS_SIZE*8-1:0] mcf_params_reg = 0, mcf_params_next; +reg [ID_WIDTH-1:0] mcf_id_reg = 0, mcf_id_next; +reg [DEST_WIDTH-1:0] mcf_dest_reg = 0, mcf_dest_next; +reg [USER_WIDTH-1:0] mcf_user_reg = 0, mcf_user_next; + +reg stat_rx_mcf_reg = 1'b0, stat_rx_mcf_next; + +assign s_axis_tready = s_axis_tready_reg; + +assign mcf_valid = mcf_valid_reg; +assign mcf_eth_dst = mcf_eth_dst_reg; +assign mcf_eth_src = mcf_eth_src_reg; +assign mcf_eth_type = mcf_eth_type_reg; +assign mcf_opcode = mcf_opcode_reg; +assign mcf_params = mcf_params_reg; +assign mcf_id = mcf_id_reg; +assign mcf_dest = mcf_dest_reg; +assign mcf_user = mcf_user_reg; + +assign stat_rx_mcf = stat_rx_mcf_reg; + +wire mcf_eth_dst_mcast_match = mcf_eth_dst_next == cfg_mcf_rx_eth_dst_mcast; +wire mcf_eth_dst_ucast_match = mcf_eth_dst_next == cfg_mcf_rx_eth_dst_ucast; +wire mcf_eth_src_match = mcf_eth_src_next == cfg_mcf_rx_eth_src; +wire mcf_eth_type_match = mcf_eth_type_next == cfg_mcf_rx_eth_type; +wire mcf_opcode_lfc_match = mcf_opcode_next == cfg_mcf_rx_opcode_lfc; +wire mcf_opcode_pfc_match = mcf_opcode_next == cfg_mcf_rx_opcode_pfc; + +wire mcf_eth_dst_match = ((mcf_eth_dst_mcast_match && cfg_mcf_rx_check_eth_dst_mcast) || + (mcf_eth_dst_ucast_match && cfg_mcf_rx_check_eth_dst_ucast) || + (!cfg_mcf_rx_check_eth_dst_mcast && !cfg_mcf_rx_check_eth_dst_ucast)); + +wire mcf_opcode_match = ((mcf_opcode_lfc_match && cfg_mcf_rx_check_opcode_lfc) || + (mcf_opcode_pfc_match && cfg_mcf_rx_check_opcode_pfc) || + (!cfg_mcf_rx_check_opcode_lfc && !cfg_mcf_rx_check_opcode_pfc)); + +wire mcf_match = (mcf_eth_dst_match && + (mcf_eth_src_match || !cfg_mcf_rx_check_eth_src) && + mcf_eth_type_match && mcf_opcode_match); + +integer k; + +always @* begin + read_mcf_next = read_mcf_reg; + mcf_frame_next = mcf_frame_reg; + ptr_next = ptr_reg; + + // pass through data + m_axis_tdata_int = s_axis_tdata; + m_axis_tkeep_int = s_axis_tkeep; + m_axis_tvalid_int = s_axis_tvalid; + m_axis_tlast_int = s_axis_tlast; + m_axis_tid_int = s_axis_tid; + m_axis_tdest_int = s_axis_tdest; + m_axis_tuser_int = s_axis_tuser; + + s_axis_tready_next = m_axis_tready_int_early || !USE_READY; + + mcf_valid_next = 1'b0; + mcf_eth_dst_next = mcf_eth_dst_reg; + mcf_eth_src_next = mcf_eth_src_reg; + mcf_eth_type_next = mcf_eth_type_reg; + mcf_opcode_next = mcf_opcode_reg; + mcf_params_next = mcf_params_reg; + mcf_id_next = mcf_id_reg; + mcf_dest_next = mcf_dest_reg; + mcf_user_next = mcf_user_reg; + + stat_rx_mcf_next = 1'b0; + + if ((s_axis_tready || !USE_READY) && s_axis_tvalid) begin + if (read_mcf_reg) begin + ptr_next = ptr_reg + 1; + + mcf_id_next = s_axis_tid; + mcf_dest_next = s_axis_tdest; + mcf_user_next = s_axis_tuser; + + `define _HEADER_FIELD_(offset, field) \ + if (ptr_reg == offset/BYTE_LANES) begin \ + field = s_axis_tdata[(offset%BYTE_LANES)*8 +: 8]; \ + end + + `_HEADER_FIELD_(0, mcf_eth_dst_next[5*8 +: 8]) + `_HEADER_FIELD_(1, mcf_eth_dst_next[4*8 +: 8]) + `_HEADER_FIELD_(2, mcf_eth_dst_next[3*8 +: 8]) + `_HEADER_FIELD_(3, mcf_eth_dst_next[2*8 +: 8]) + `_HEADER_FIELD_(4, mcf_eth_dst_next[1*8 +: 8]) + `_HEADER_FIELD_(5, mcf_eth_dst_next[0*8 +: 8]) + `_HEADER_FIELD_(6, mcf_eth_src_next[5*8 +: 8]) + `_HEADER_FIELD_(7, mcf_eth_src_next[4*8 +: 8]) + `_HEADER_FIELD_(8, mcf_eth_src_next[3*8 +: 8]) + `_HEADER_FIELD_(9, mcf_eth_src_next[2*8 +: 8]) + `_HEADER_FIELD_(10, mcf_eth_src_next[1*8 +: 8]) + `_HEADER_FIELD_(11, mcf_eth_src_next[0*8 +: 8]) + `_HEADER_FIELD_(12, mcf_eth_type_next[1*8 +: 8]) + `_HEADER_FIELD_(13, mcf_eth_type_next[0*8 +: 8]) + `_HEADER_FIELD_(14, mcf_opcode_next[1*8 +: 8]) + `_HEADER_FIELD_(15, mcf_opcode_next[0*8 +: 8]) + + if (ptr_reg == 0/BYTE_LANES) begin + // ensure params field gets cleared + mcf_params_next = 0; + end + + for (k = 0; k < MCF_PARAMS_SIZE; k = k + 1) begin + if (ptr_reg == (16+k)/BYTE_LANES) begin + mcf_params_next[k*8 +: 8] = s_axis_tdata[((16+k)%BYTE_LANES)*8 +: 8]; + end + end + + if (ptr_reg == 15/BYTE_LANES && (!KEEP_ENABLE || s_axis_tkeep[13%BYTE_LANES])) begin + // record match at end of opcode field + mcf_frame_next = mcf_match && cfg_mcf_rx_enable; + end + + if (ptr_reg == (HDR_SIZE-1)/BYTE_LANES) begin + read_mcf_next = 1'b0; + end + + `undef _HEADER_FIELD_ + end + + if (s_axis_tlast) begin + if (s_axis_tuser[0]) begin + // frame marked invalid + end else if (mcf_frame_next) begin + if (!cfg_mcf_rx_forward) begin + // mark frame invalid + m_axis_tuser_int[0] = 1'b1; + end + // transfer out MAC control frame + mcf_valid_next = 1'b1; + stat_rx_mcf_next = 1'b1; + end + + read_mcf_next = 1'b1; + mcf_frame_next = 1'b0; + ptr_next = 0; + end + end +end + +always @(posedge clk) begin + read_mcf_reg <= read_mcf_next; + mcf_frame_reg <= mcf_frame_next; + ptr_reg <= ptr_next; + + s_axis_tready_reg <= s_axis_tready_next; + + mcf_valid_reg <= mcf_valid_next; + mcf_eth_dst_reg <= mcf_eth_dst_next; + mcf_eth_src_reg <= mcf_eth_src_next; + mcf_eth_type_reg <= mcf_eth_type_next; + mcf_opcode_reg <= mcf_opcode_next; + mcf_params_reg <= mcf_params_next; + mcf_id_reg <= mcf_id_next; + mcf_dest_reg <= mcf_dest_next; + mcf_user_reg <= mcf_user_next; + + stat_rx_mcf_reg <= stat_rx_mcf_next; + + if (rst) begin + read_mcf_reg <= 1'b1; + mcf_frame_reg <= 1'b0; + ptr_reg <= 0; + s_axis_tready_reg <= 1'b0; + mcf_valid_reg <= 1'b0; + stat_rx_mcf_reg <= 1'b0; + end +end + +// output datapath logic +reg [DATA_WIDTH-1:0] m_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] m_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg m_axis_tvalid_reg = 1'b0, m_axis_tvalid_next; +reg m_axis_tlast_reg = 1'b0; +reg [ID_WIDTH-1:0] m_axis_tid_reg = {ID_WIDTH{1'b0}}; +reg [DEST_WIDTH-1:0] m_axis_tdest_reg = {DEST_WIDTH{1'b0}}; +reg [USER_WIDTH-1:0] m_axis_tuser_reg = {USER_WIDTH{1'b0}}; + +reg [DATA_WIDTH-1:0] temp_m_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] temp_m_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg temp_m_axis_tvalid_reg = 1'b0, temp_m_axis_tvalid_next; +reg temp_m_axis_tlast_reg = 1'b0; +reg [ID_WIDTH-1:0] temp_m_axis_tid_reg = {ID_WIDTH{1'b0}}; +reg [DEST_WIDTH-1:0] temp_m_axis_tdest_reg = {DEST_WIDTH{1'b0}}; +reg [USER_WIDTH-1:0] temp_m_axis_tuser_reg = {USER_WIDTH{1'b0}}; + +// datapath control +reg store_axis_int_to_output; +reg store_axis_int_to_temp; +reg store_axis_temp_to_output; + +assign m_axis_tdata = m_axis_tdata_reg; +assign m_axis_tkeep = KEEP_ENABLE ? m_axis_tkeep_reg : {KEEP_WIDTH{1'b1}}; +assign m_axis_tvalid = m_axis_tvalid_reg; +assign m_axis_tlast = m_axis_tlast_reg; +assign m_axis_tid = ID_ENABLE ? m_axis_tid_reg : {ID_WIDTH{1'b0}}; +assign m_axis_tdest = DEST_ENABLE ? m_axis_tdest_reg : {DEST_WIDTH{1'b0}}; +assign m_axis_tuser = USER_ENABLE ? m_axis_tuser_reg : {USER_WIDTH{1'b0}}; + +// enable ready input next cycle if output is ready or the temp reg will not be filled on the next cycle (output reg empty or no input) +assign m_axis_tready_int_early = m_axis_tready || !USE_READY || (!temp_m_axis_tvalid_reg && (!m_axis_tvalid_reg || !m_axis_tvalid_int)); + +always @* begin + // transfer sink ready state to source + m_axis_tvalid_next = m_axis_tvalid_reg; + temp_m_axis_tvalid_next = temp_m_axis_tvalid_reg; + + store_axis_int_to_output = 1'b0; + store_axis_int_to_temp = 1'b0; + store_axis_temp_to_output = 1'b0; + + if (m_axis_tready_int_reg) begin + // input is ready + if (m_axis_tready || !USE_READY || !m_axis_tvalid_reg) begin + // output is ready or currently not valid, transfer data to output + m_axis_tvalid_next = m_axis_tvalid_int; + store_axis_int_to_output = 1'b1; + end else begin + // output is not ready, store input in temp + temp_m_axis_tvalid_next = m_axis_tvalid_int; + store_axis_int_to_temp = 1'b1; + end + end else if (m_axis_tready || !USE_READY) begin + // input is not ready, but output is ready + m_axis_tvalid_next = temp_m_axis_tvalid_reg; + temp_m_axis_tvalid_next = 1'b0; + store_axis_temp_to_output = 1'b1; + end +end + +always @(posedge clk) begin + m_axis_tvalid_reg <= m_axis_tvalid_next; + m_axis_tready_int_reg <= m_axis_tready_int_early; + temp_m_axis_tvalid_reg <= temp_m_axis_tvalid_next; + + // datapath + if (store_axis_int_to_output) begin + m_axis_tdata_reg <= m_axis_tdata_int; + m_axis_tkeep_reg <= m_axis_tkeep_int; + m_axis_tlast_reg <= m_axis_tlast_int; + m_axis_tid_reg <= m_axis_tid_int; + m_axis_tdest_reg <= m_axis_tdest_int; + m_axis_tuser_reg <= m_axis_tuser_int; + end else if (store_axis_temp_to_output) begin + m_axis_tdata_reg <= temp_m_axis_tdata_reg; + m_axis_tkeep_reg <= temp_m_axis_tkeep_reg; + m_axis_tlast_reg <= temp_m_axis_tlast_reg; + m_axis_tid_reg <= temp_m_axis_tid_reg; + m_axis_tdest_reg <= temp_m_axis_tdest_reg; + m_axis_tuser_reg <= temp_m_axis_tuser_reg; + end + + if (store_axis_int_to_temp) begin + temp_m_axis_tdata_reg <= m_axis_tdata_int; + temp_m_axis_tkeep_reg <= m_axis_tkeep_int; + temp_m_axis_tlast_reg <= m_axis_tlast_int; + temp_m_axis_tid_reg <= m_axis_tid_int; + temp_m_axis_tdest_reg <= m_axis_tdest_int; + temp_m_axis_tuser_reg <= m_axis_tuser_int; + end + + if (rst) begin + m_axis_tvalid_reg <= 1'b0; + m_axis_tready_int_reg <= 1'b0; + temp_m_axis_tvalid_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_ctrl_tx.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_ctrl_tx.v new file mode 100755 index 0000000..c06d50a --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_ctrl_tx.v @@ -0,0 +1,421 @@ +/* + +Copyright (c) 2023 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * MAC control transmit + */ +module mac_ctrl_tx # +( + parameter DATA_WIDTH = 8, + parameter KEEP_ENABLE = DATA_WIDTH>8, + parameter KEEP_WIDTH = DATA_WIDTH/8, + parameter ID_ENABLE = 0, + parameter ID_WIDTH = 8, + parameter DEST_ENABLE = 0, + parameter DEST_WIDTH = 8, + parameter USER_ENABLE = 1, + parameter USER_WIDTH = 1, + parameter MCF_PARAMS_SIZE = 18 +) +( + input wire clk, + input wire rst, + + /* + * AXI stream input + */ + input wire [DATA_WIDTH-1:0] s_axis_tdata, + input wire [KEEP_WIDTH-1:0] s_axis_tkeep, + input wire s_axis_tvalid, + output wire s_axis_tready, + input wire s_axis_tlast, + input wire [ID_WIDTH-1:0] s_axis_tid, + input wire [DEST_WIDTH-1:0] s_axis_tdest, + input wire [USER_WIDTH-1:0] s_axis_tuser, + + /* + * AXI stream output + */ + output wire [DATA_WIDTH-1:0] m_axis_tdata, + output wire [KEEP_WIDTH-1:0] m_axis_tkeep, + output wire m_axis_tvalid, + input wire m_axis_tready, + output wire m_axis_tlast, + output wire [ID_WIDTH-1:0] m_axis_tid, + output wire [DEST_WIDTH-1:0] m_axis_tdest, + output wire [USER_WIDTH-1:0] m_axis_tuser, + + /* + * MAC control frame interface + */ + input wire mcf_valid, + output wire mcf_ready, + input wire [47:0] mcf_eth_dst, + input wire [47:0] mcf_eth_src, + input wire [15:0] mcf_eth_type, + input wire [15:0] mcf_opcode, + input wire [MCF_PARAMS_SIZE*8-1:0] mcf_params, + input wire [ID_WIDTH-1:0] mcf_id, + input wire [DEST_WIDTH-1:0] mcf_dest, + input wire [USER_WIDTH-1:0] mcf_user, + + /* + * Pause interface + */ + input wire tx_pause_req, + output wire tx_pause_ack, + + /* + * Status + */ + output wire stat_tx_mcf +); + +parameter BYTE_LANES = KEEP_ENABLE ? KEEP_WIDTH : 1; + +parameter HDR_SIZE = 60; + +parameter CYCLE_COUNT = (HDR_SIZE+BYTE_LANES-1)/BYTE_LANES; + +parameter PTR_WIDTH = $clog2(CYCLE_COUNT); + +parameter OFFSET = HDR_SIZE % BYTE_LANES; + +// check configuration +initial begin + if (BYTE_LANES * 8 != DATA_WIDTH) begin + $error("Error: AXI stream interface requires byte (8-bit) granularity (instance %m)"); + $finish; + end + + if (MCF_PARAMS_SIZE > 44) begin + $error("Error: Maximum MCF_PARAMS_SIZE is 44 bytes (instance %m)"); + $finish; + end +end + +/* + +MAC control frame + + Field Length + Destination MAC address 6 octets [01:80:C2:00:00:01] + Source MAC address 6 octets + Ethertype 2 octets [0x8808] + Opcode 2 octets + Parameters 0-44 octets + +This module manages the transmission of MAC control frames. Control frames +are accepted in parallel, serialized, and merged at a higher priority with +data traffic. + +*/ + +reg send_data_reg = 1'b0, send_data_next; +reg send_mcf_reg = 1'b0, send_mcf_next; +reg [PTR_WIDTH-1:0] ptr_reg = 0, ptr_next; + +reg s_axis_tready_reg = 1'b0, s_axis_tready_next; +reg mcf_ready_reg = 1'b0, mcf_ready_next; +reg tx_pause_ack_reg = 1'b0, tx_pause_ack_next; +reg stat_tx_mcf_reg = 1'b0, stat_tx_mcf_next; + +// internal datapath +reg [DATA_WIDTH-1:0] m_axis_tdata_int; +reg [KEEP_WIDTH-1:0] m_axis_tkeep_int; +reg m_axis_tvalid_int; +reg m_axis_tready_int_reg = 1'b0; +reg m_axis_tlast_int; +reg [ID_WIDTH-1:0] m_axis_tid_int; +reg [DEST_WIDTH-1:0] m_axis_tdest_int; +reg [USER_WIDTH-1:0] m_axis_tuser_int; +wire m_axis_tready_int_early; + +assign s_axis_tready = s_axis_tready_reg; +assign mcf_ready = mcf_ready_reg; +assign tx_pause_ack = tx_pause_ack_reg; +assign stat_tx_mcf = stat_tx_mcf_reg; + +integer k; + +always @* begin + send_data_next = send_data_reg; + send_mcf_next = send_mcf_reg; + ptr_next = ptr_reg; + + s_axis_tready_next = 1'b0; + mcf_ready_next = 1'b0; + tx_pause_ack_next = tx_pause_ack_reg; + stat_tx_mcf_next = 1'b0; + + m_axis_tdata_int = 0; + m_axis_tkeep_int = 0; + m_axis_tvalid_int = 1'b0; + m_axis_tlast_int = 1'b0; + m_axis_tid_int = 0; + m_axis_tdest_int = 0; + m_axis_tuser_int = 0; + + if (!send_data_reg && !send_mcf_reg) begin + m_axis_tdata_int = s_axis_tdata; + m_axis_tkeep_int = s_axis_tkeep; + m_axis_tvalid_int = 1'b0; + m_axis_tlast_int = s_axis_tlast; + m_axis_tid_int = s_axis_tid; + m_axis_tdest_int = s_axis_tdest; + m_axis_tuser_int = s_axis_tuser; + s_axis_tready_next = m_axis_tready_int_early && !tx_pause_req; + tx_pause_ack_next = tx_pause_req; + if (s_axis_tvalid && s_axis_tready) begin + s_axis_tready_next = m_axis_tready_int_early; + tx_pause_ack_next = 1'b0; + m_axis_tvalid_int = 1'b1; + if (s_axis_tlast) begin + s_axis_tready_next = m_axis_tready_int_early && !mcf_valid && !mcf_ready; + send_data_next = 1'b0; + end else begin + send_data_next = 1'b1; + end + end else if (mcf_valid) begin + s_axis_tready_next = 1'b0; + ptr_next = 0; + send_mcf_next = 1'b1; + mcf_ready_next = (CYCLE_COUNT == 1) && m_axis_tready_int_early; + end + end + + if (send_data_reg) begin + m_axis_tdata_int = s_axis_tdata; + m_axis_tkeep_int = s_axis_tkeep; + m_axis_tvalid_int = 1'b0; + m_axis_tlast_int = s_axis_tlast; + m_axis_tid_int = s_axis_tid; + m_axis_tdest_int = s_axis_tdest; + m_axis_tuser_int = s_axis_tuser; + s_axis_tready_next = m_axis_tready_int_early; + if (s_axis_tvalid && s_axis_tready) begin + m_axis_tvalid_int = 1'b1; + if (s_axis_tlast) begin + s_axis_tready_next = m_axis_tready_int_early && !tx_pause_req; + send_data_next = 1'b0; + if (mcf_valid) begin + s_axis_tready_next = 1'b0; + ptr_next = 0; + send_mcf_next = 1'b1; + mcf_ready_next = (CYCLE_COUNT == 1) && m_axis_tready_int_early; + end + end else begin + send_data_next = 1'b1; + end + end + end + + if (send_mcf_reg) begin + mcf_ready_next = (CYCLE_COUNT == 1 || ptr_reg == CYCLE_COUNT-1) && m_axis_tready_int_early; + if (m_axis_tready_int_reg) begin + ptr_next = ptr_reg + 1; + + m_axis_tvalid_int = 1'b1; + m_axis_tid_int = mcf_id; + m_axis_tdest_int = mcf_dest; + m_axis_tuser_int = mcf_user; + + `define _HEADER_FIELD_(offset, field) \ + if (ptr_reg == offset/BYTE_LANES) begin \ + m_axis_tdata_int[(offset%BYTE_LANES)*8 +: 8] = field; \ + m_axis_tkeep_int[offset%BYTE_LANES] = 1'b1; \ + end + + `_HEADER_FIELD_(0, mcf_eth_dst[5*8 +: 8]) + `_HEADER_FIELD_(1, mcf_eth_dst[4*8 +: 8]) + `_HEADER_FIELD_(2, mcf_eth_dst[3*8 +: 8]) + `_HEADER_FIELD_(3, mcf_eth_dst[2*8 +: 8]) + `_HEADER_FIELD_(4, mcf_eth_dst[1*8 +: 8]) + `_HEADER_FIELD_(5, mcf_eth_dst[0*8 +: 8]) + `_HEADER_FIELD_(6, mcf_eth_src[5*8 +: 8]) + `_HEADER_FIELD_(7, mcf_eth_src[4*8 +: 8]) + `_HEADER_FIELD_(8, mcf_eth_src[3*8 +: 8]) + `_HEADER_FIELD_(9, mcf_eth_src[2*8 +: 8]) + `_HEADER_FIELD_(10, mcf_eth_src[1*8 +: 8]) + `_HEADER_FIELD_(11, mcf_eth_src[0*8 +: 8]) + `_HEADER_FIELD_(12, mcf_eth_type[1*8 +: 8]) + `_HEADER_FIELD_(13, mcf_eth_type[0*8 +: 8]) + `_HEADER_FIELD_(14, mcf_opcode[1*8 +: 8]) + `_HEADER_FIELD_(15, mcf_opcode[0*8 +: 8]) + + for (k = 0; k < HDR_SIZE-16; k = k + 1) begin + if (ptr_reg == (16+k)/BYTE_LANES) begin + if (k < MCF_PARAMS_SIZE) begin + m_axis_tdata_int[((16+k)%BYTE_LANES)*8 +: 8] = mcf_params[k*8 +: 8]; + end else begin + m_axis_tdata_int[((16+k)%BYTE_LANES)*8 +: 8] = 0; + end + m_axis_tkeep_int[(16+k)%BYTE_LANES] = 1'b1; + end + end + + if (ptr_reg == (HDR_SIZE-1)/BYTE_LANES) begin + s_axis_tready_next = m_axis_tready_int_early && !tx_pause_req; + mcf_ready_next = 1'b0; + m_axis_tlast_int = 1'b1; + send_mcf_next = 1'b0; + stat_tx_mcf_next = 1'b1; + end else begin + mcf_ready_next = (ptr_next == CYCLE_COUNT-1) && m_axis_tready_int_early; + end + + `undef _HEADER_FIELD_ + end + end +end + +always @(posedge clk) begin + send_data_reg <= send_data_next; + send_mcf_reg <= send_mcf_next; + ptr_reg <= ptr_next; + + s_axis_tready_reg <= s_axis_tready_next; + mcf_ready_reg <= mcf_ready_next; + tx_pause_ack_reg <= tx_pause_ack_next; + stat_tx_mcf_reg <= stat_tx_mcf_next; + + if (rst) begin + send_data_reg <= 1'b0; + send_mcf_reg <= 1'b0; + ptr_reg <= 0; + s_axis_tready_reg <= 1'b0; + mcf_ready_reg <= 1'b0; + tx_pause_ack_reg <= 1'b0; + stat_tx_mcf_reg <= 1'b0; + end +end + +// output datapath logic +reg [DATA_WIDTH-1:0] m_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] m_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg m_axis_tvalid_reg = 1'b0, m_axis_tvalid_next; +reg m_axis_tlast_reg = 1'b0; +reg [ID_WIDTH-1:0] m_axis_tid_reg = {ID_WIDTH{1'b0}}; +reg [DEST_WIDTH-1:0] m_axis_tdest_reg = {DEST_WIDTH{1'b0}}; +reg [USER_WIDTH-1:0] m_axis_tuser_reg = {USER_WIDTH{1'b0}}; + +reg [DATA_WIDTH-1:0] temp_m_axis_tdata_reg = {DATA_WIDTH{1'b0}}; +reg [KEEP_WIDTH-1:0] temp_m_axis_tkeep_reg = {KEEP_WIDTH{1'b0}}; +reg temp_m_axis_tvalid_reg = 1'b0, temp_m_axis_tvalid_next; +reg temp_m_axis_tlast_reg = 1'b0; +reg [ID_WIDTH-1:0] temp_m_axis_tid_reg = {ID_WIDTH{1'b0}}; +reg [DEST_WIDTH-1:0] temp_m_axis_tdest_reg = {DEST_WIDTH{1'b0}}; +reg [USER_WIDTH-1:0] temp_m_axis_tuser_reg = {USER_WIDTH{1'b0}}; + +// datapath control +reg store_axis_int_to_output; +reg store_axis_int_to_temp; +reg store_axis_temp_to_output; + +assign m_axis_tdata = m_axis_tdata_reg; +assign m_axis_tkeep = KEEP_ENABLE ? m_axis_tkeep_reg : {KEEP_WIDTH{1'b1}}; +assign m_axis_tvalid = m_axis_tvalid_reg; +assign m_axis_tlast = m_axis_tlast_reg; +assign m_axis_tid = ID_ENABLE ? m_axis_tid_reg : {ID_WIDTH{1'b0}}; +assign m_axis_tdest = DEST_ENABLE ? m_axis_tdest_reg : {DEST_WIDTH{1'b0}}; +assign m_axis_tuser = USER_ENABLE ? m_axis_tuser_reg : {USER_WIDTH{1'b0}}; + +// enable ready input next cycle if output is ready or the temp reg will not be filled on the next cycle (output reg empty or no input) +assign m_axis_tready_int_early = m_axis_tready || (!temp_m_axis_tvalid_reg && (!m_axis_tvalid_reg || !m_axis_tvalid_int)); + +always @* begin + // transfer sink ready state to source + m_axis_tvalid_next = m_axis_tvalid_reg; + temp_m_axis_tvalid_next = temp_m_axis_tvalid_reg; + + store_axis_int_to_output = 1'b0; + store_axis_int_to_temp = 1'b0; + store_axis_temp_to_output = 1'b0; + + if (m_axis_tready_int_reg) begin + // input is ready + if (m_axis_tready || !m_axis_tvalid_reg) begin + // output is ready or currently not valid, transfer data to output + m_axis_tvalid_next = m_axis_tvalid_int; + store_axis_int_to_output = 1'b1; + end else begin + // output is not ready, store input in temp + temp_m_axis_tvalid_next = m_axis_tvalid_int; + store_axis_int_to_temp = 1'b1; + end + end else if (m_axis_tready) begin + // input is not ready, but output is ready + m_axis_tvalid_next = temp_m_axis_tvalid_reg; + temp_m_axis_tvalid_next = 1'b0; + store_axis_temp_to_output = 1'b1; + end +end + +always @(posedge clk) begin + m_axis_tvalid_reg <= m_axis_tvalid_next; + m_axis_tready_int_reg <= m_axis_tready_int_early; + temp_m_axis_tvalid_reg <= temp_m_axis_tvalid_next; + + // datapath + if (store_axis_int_to_output) begin + m_axis_tdata_reg <= m_axis_tdata_int; + m_axis_tkeep_reg <= m_axis_tkeep_int; + m_axis_tlast_reg <= m_axis_tlast_int; + m_axis_tid_reg <= m_axis_tid_int; + m_axis_tdest_reg <= m_axis_tdest_int; + m_axis_tuser_reg <= m_axis_tuser_int; + end else if (store_axis_temp_to_output) begin + m_axis_tdata_reg <= temp_m_axis_tdata_reg; + m_axis_tkeep_reg <= temp_m_axis_tkeep_reg; + m_axis_tlast_reg <= temp_m_axis_tlast_reg; + m_axis_tid_reg <= temp_m_axis_tid_reg; + m_axis_tdest_reg <= temp_m_axis_tdest_reg; + m_axis_tuser_reg <= temp_m_axis_tuser_reg; + end + + if (store_axis_int_to_temp) begin + temp_m_axis_tdata_reg <= m_axis_tdata_int; + temp_m_axis_tkeep_reg <= m_axis_tkeep_int; + temp_m_axis_tlast_reg <= m_axis_tlast_int; + temp_m_axis_tid_reg <= m_axis_tid_int; + temp_m_axis_tdest_reg <= m_axis_tdest_int; + temp_m_axis_tuser_reg <= m_axis_tuser_int; + end + + if (rst) begin + m_axis_tvalid_reg <= 1'b0; + m_axis_tready_int_reg <= 1'b0; + temp_m_axis_tvalid_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_pause_ctrl_rx.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_pause_ctrl_rx.v new file mode 100755 index 0000000..5bff45f --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_pause_ctrl_rx.v @@ -0,0 +1,221 @@ +/* + +Copyright (c) 2023 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * PFC and pause frame receive handling + */ +module mac_pause_ctrl_rx # +( + parameter MCF_PARAMS_SIZE = 18, + parameter PFC_ENABLE = 1 +) +( + input wire clk, + input wire rst, + + /* + * MAC control frame interface + */ + input wire mcf_valid, + input wire [47:0] mcf_eth_dst, + input wire [47:0] mcf_eth_src, + input wire [15:0] mcf_eth_type, + input wire [15:0] mcf_opcode, + input wire [MCF_PARAMS_SIZE*8-1:0] mcf_params, + + /* + * Link-level Flow Control (LFC) (IEEE 802.3 annex 31B PAUSE) + */ + input wire rx_lfc_en, + output wire rx_lfc_req, + input wire rx_lfc_ack, + + /* + * Priority Flow Control (PFC) (IEEE 802.3 annex 31D PFC) + */ + input wire [7:0] rx_pfc_en, + output wire [7:0] rx_pfc_req, + input wire [7:0] rx_pfc_ack, + + /* + * Configuration + */ + input wire [15:0] cfg_rx_lfc_opcode, + input wire cfg_rx_lfc_en, + input wire [15:0] cfg_rx_pfc_opcode, + input wire cfg_rx_pfc_en, + input wire [9:0] cfg_quanta_step, + input wire cfg_quanta_clk_en, + + /* + * Status + */ + output wire stat_rx_lfc_pkt, + output wire stat_rx_lfc_xon, + output wire stat_rx_lfc_xoff, + output wire stat_rx_lfc_paused, + output wire stat_rx_pfc_pkt, + output wire [7:0] stat_rx_pfc_xon, + output wire [7:0] stat_rx_pfc_xoff, + output wire [7:0] stat_rx_pfc_paused +); + +localparam QFB = 8; + +// check configuration +initial begin + if (MCF_PARAMS_SIZE < (PFC_ENABLE ? 18 : 2)) begin + $error("Error: MCF_PARAMS_SIZE too small for requested configuration (instance %m)"); + $finish; + end +end + +reg lfc_req_reg = 1'b0, lfc_req_next; +reg [7:0] pfc_req_reg = 8'd0, pfc_req_next; + +reg [16+QFB-1:0] lfc_quanta_reg = 0, lfc_quanta_next; +reg [16+QFB-1:0] pfc_quanta_reg[0:7], pfc_quanta_next[0:7]; + +reg stat_rx_lfc_pkt_reg = 1'b0, stat_rx_lfc_pkt_next; +reg stat_rx_lfc_xon_reg = 1'b0, stat_rx_lfc_xon_next; +reg stat_rx_lfc_xoff_reg = 1'b0, stat_rx_lfc_xoff_next; +reg stat_rx_pfc_pkt_reg = 1'b0, stat_rx_pfc_pkt_next; +reg [7:0] stat_rx_pfc_xon_reg = 0, stat_rx_pfc_xon_next; +reg [7:0] stat_rx_pfc_xoff_reg = 0, stat_rx_pfc_xoff_next; + +assign rx_lfc_req = lfc_req_reg; +assign rx_pfc_req = pfc_req_reg; + +assign stat_rx_lfc_pkt = stat_rx_lfc_pkt_reg; +assign stat_rx_lfc_xon = stat_rx_lfc_xon_reg; +assign stat_rx_lfc_xoff = stat_rx_lfc_xoff_reg; +assign stat_rx_lfc_paused = lfc_req_reg; +assign stat_rx_pfc_pkt = stat_rx_pfc_pkt_reg; +assign stat_rx_pfc_xon = stat_rx_pfc_xon_reg; +assign stat_rx_pfc_xoff = stat_rx_pfc_xoff_reg; +assign stat_rx_pfc_paused = pfc_req_reg; + +integer k; + +initial begin + for (k = 0; k < 8; k = k + 1) begin + pfc_quanta_reg[k] = 0; + end +end + +always @* begin + stat_rx_lfc_pkt_next = 1'b0; + stat_rx_lfc_xon_next = 1'b0; + stat_rx_lfc_xoff_next = 1'b0; + stat_rx_pfc_pkt_next = 1'b0; + stat_rx_pfc_xon_next = 0; + stat_rx_pfc_xoff_next = 0; + + if (cfg_quanta_clk_en && rx_lfc_ack) begin + if (lfc_quanta_reg > cfg_quanta_step) begin + lfc_quanta_next = lfc_quanta_reg - cfg_quanta_step; + end else begin + lfc_quanta_next = 0; + end + end else begin + lfc_quanta_next = lfc_quanta_reg; + end + + lfc_req_next = (lfc_quanta_reg != 0) && rx_lfc_en && cfg_rx_lfc_en; + + for (k = 0; k < 8; k = k + 1) begin + if (cfg_quanta_clk_en && rx_pfc_ack[k]) begin + if (pfc_quanta_reg[k] > cfg_quanta_step) begin + pfc_quanta_next[k] = pfc_quanta_reg[k] - cfg_quanta_step; + end else begin + pfc_quanta_next[k] = 0; + end + end else begin + pfc_quanta_next[k] = pfc_quanta_reg[k]; + end + + pfc_req_next[k] = (pfc_quanta_reg[k] != 0) && rx_pfc_en[k] && cfg_rx_pfc_en; + end + + if (mcf_valid) begin + if (mcf_opcode == cfg_rx_lfc_opcode && cfg_rx_lfc_en) begin + stat_rx_lfc_pkt_next = 1'b1; + stat_rx_lfc_xon_next = {mcf_params[7:0], mcf_params[15:8]} == 0; + stat_rx_lfc_xoff_next = {mcf_params[7:0], mcf_params[15:8]} != 0; + lfc_quanta_next = {mcf_params[7:0], mcf_params[15:8], {QFB{1'b0}}}; + end else if (PFC_ENABLE && mcf_opcode == cfg_rx_pfc_opcode && cfg_rx_pfc_en) begin + stat_rx_pfc_pkt_next = 1'b1; + for (k = 0; k < 8; k = k + 1) begin + if (mcf_params[k+8]) begin + stat_rx_pfc_xon_next[k] = {mcf_params[16+(k*16)+0 +: 8], mcf_params[16+(k*16)+8 +: 8]} == 0; + stat_rx_pfc_xoff_next[k] = {mcf_params[16+(k*16)+0 +: 8], mcf_params[16+(k*16)+8 +: 8]} != 0; + pfc_quanta_next[k] = {mcf_params[16+(k*16)+0 +: 8], mcf_params[16+(k*16)+8 +: 8], {QFB{1'b0}}}; + end + end + end + end +end + +always @(posedge clk) begin + lfc_req_reg <= lfc_req_next; + pfc_req_reg <= pfc_req_next; + + lfc_quanta_reg <= lfc_quanta_next; + for (k = 0; k < 8; k = k + 1) begin + pfc_quanta_reg[k] <= pfc_quanta_next[k]; + end + + stat_rx_lfc_pkt_reg <= stat_rx_lfc_pkt_next; + stat_rx_lfc_xon_reg <= stat_rx_lfc_xon_next; + stat_rx_lfc_xoff_reg <= stat_rx_lfc_xoff_next; + stat_rx_pfc_pkt_reg <= stat_rx_pfc_pkt_next; + stat_rx_pfc_xon_reg <= stat_rx_pfc_xon_next; + stat_rx_pfc_xoff_reg <= stat_rx_pfc_xoff_next; + + if (rst) begin + lfc_req_reg <= 1'b0; + pfc_req_reg <= 8'd0; + lfc_quanta_reg <= 0; + for (k = 0; k < 8; k = k + 1) begin + pfc_quanta_reg[k] <= 0; + end + + stat_rx_lfc_pkt_reg <= 1'b0; + stat_rx_lfc_xon_reg <= 1'b0; + stat_rx_lfc_xoff_reg <= 1'b0; + stat_rx_pfc_pkt_reg <= 1'b0; + stat_rx_pfc_xon_reg <= 0; + stat_rx_pfc_xoff_reg <= 0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_pause_ctrl_tx.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_pause_ctrl_tx.v new file mode 100755 index 0000000..7a56f59 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/mac_pause_ctrl_tx.v @@ -0,0 +1,313 @@ +/* + +Copyright (c) 2023 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * PFC and pause frame transmit handling + */ +module mac_pause_ctrl_tx # +( + parameter MCF_PARAMS_SIZE = 18, + parameter PFC_ENABLE = 1 +) +( + input wire clk, + input wire rst, + + /* + * MAC control frame interface + */ + output wire mcf_valid, + input wire mcf_ready, + output wire [47:0] mcf_eth_dst, + output wire [47:0] mcf_eth_src, + output wire [15:0] mcf_eth_type, + output wire [15:0] mcf_opcode, + output wire [MCF_PARAMS_SIZE*8-1:0] mcf_params, + + /* + * Link-level Flow Control (LFC) (IEEE 802.3 annex 31B PAUSE) + */ + input wire tx_lfc_req, + input wire tx_lfc_resend, + + /* + * Priority Flow Control (PFC) (IEEE 802.3 annex 31D) + */ + input wire [7:0] tx_pfc_req, + input wire tx_pfc_resend, + + /* + * Configuration + */ + input wire [47:0] cfg_tx_lfc_eth_dst, + input wire [47:0] cfg_tx_lfc_eth_src, + input wire [15:0] cfg_tx_lfc_eth_type, + input wire [15:0] cfg_tx_lfc_opcode, + input wire cfg_tx_lfc_en, + input wire [15:0] cfg_tx_lfc_quanta, + input wire [15:0] cfg_tx_lfc_refresh, + input wire [47:0] cfg_tx_pfc_eth_dst, + input wire [47:0] cfg_tx_pfc_eth_src, + input wire [15:0] cfg_tx_pfc_eth_type, + input wire [15:0] cfg_tx_pfc_opcode, + input wire cfg_tx_pfc_en, + input wire [8*16-1:0] cfg_tx_pfc_quanta, + input wire [8*16-1:0] cfg_tx_pfc_refresh, + input wire [9:0] cfg_quanta_step, + input wire cfg_quanta_clk_en, + + /* + * Status + */ + output wire stat_tx_lfc_pkt, + output wire stat_tx_lfc_xon, + output wire stat_tx_lfc_xoff, + output wire stat_tx_lfc_paused, + output wire stat_tx_pfc_pkt, + output wire [7:0] stat_tx_pfc_xon, + output wire [7:0] stat_tx_pfc_xoff, + output wire [7:0] stat_tx_pfc_paused +); + +localparam QFB = 8; + +// check configuration +initial begin + if (MCF_PARAMS_SIZE < (PFC_ENABLE ? 18 : 2)) begin + $error("Error: MCF_PARAMS_SIZE too small for requested configuration (instance %m)"); + $finish; + end +end + +reg lfc_req_reg = 1'b0, lfc_req_next; +reg lfc_act_reg = 1'b0, lfc_act_next; +reg lfc_send_reg = 1'b0, lfc_send_next; +reg [7:0] pfc_req_reg = 8'd0, pfc_req_next; +reg [7:0] pfc_act_reg = 8'd0, pfc_act_next; +reg [7:0] pfc_en_reg = 8'd0, pfc_en_next; +reg pfc_send_reg = 1'b0, pfc_send_next; + +reg [16+QFB-1:0] lfc_refresh_reg = 0, lfc_refresh_next; +reg [16+QFB-1:0] pfc_refresh_reg[0:7], pfc_refresh_next[0:7]; + +reg stat_tx_lfc_pkt_reg = 1'b0, stat_tx_lfc_pkt_next; +reg stat_tx_lfc_xon_reg = 1'b0, stat_tx_lfc_xon_next; +reg stat_tx_lfc_xoff_reg = 1'b0, stat_tx_lfc_xoff_next; +reg stat_tx_pfc_pkt_reg = 1'b0, stat_tx_pfc_pkt_next; +reg [7:0] stat_tx_pfc_xon_reg = 0, stat_tx_pfc_xon_next; +reg [7:0] stat_tx_pfc_xoff_reg = 0, stat_tx_pfc_xoff_next; + +// MAC control interface +reg mcf_pfc_sel_reg = PFC_ENABLE != 0, mcf_pfc_sel_next; +reg mcf_valid_reg = 1'b0, mcf_valid_next; + +wire [2*8-1:0] mcf_lfc_params; +assign mcf_lfc_params[16*0 +: 16] = lfc_req_reg ? {cfg_tx_lfc_quanta[0 +: 8], cfg_tx_lfc_quanta[8 +: 8]} : 0; + +wire [18*8-1:0] mcf_pfc_params; +assign mcf_pfc_params[16*0 +: 16] = {pfc_en_reg, 8'd0}; +assign mcf_pfc_params[16*1 +: 16] = pfc_req_reg[0] ? {cfg_tx_pfc_quanta[16*0+0 +: 8], cfg_tx_pfc_quanta[16*0+8 +: 8]} : 0; +assign mcf_pfc_params[16*2 +: 16] = pfc_req_reg[1] ? {cfg_tx_pfc_quanta[16*1+0 +: 8], cfg_tx_pfc_quanta[16*1+8 +: 8]} : 0; +assign mcf_pfc_params[16*3 +: 16] = pfc_req_reg[2] ? {cfg_tx_pfc_quanta[16*2+0 +: 8], cfg_tx_pfc_quanta[16*2+8 +: 8]} : 0; +assign mcf_pfc_params[16*4 +: 16] = pfc_req_reg[3] ? {cfg_tx_pfc_quanta[16*3+0 +: 8], cfg_tx_pfc_quanta[16*3+8 +: 8]} : 0; +assign mcf_pfc_params[16*5 +: 16] = pfc_req_reg[4] ? {cfg_tx_pfc_quanta[16*4+0 +: 8], cfg_tx_pfc_quanta[16*4+8 +: 8]} : 0; +assign mcf_pfc_params[16*6 +: 16] = pfc_req_reg[5] ? {cfg_tx_pfc_quanta[16*5+0 +: 8], cfg_tx_pfc_quanta[16*5+8 +: 8]} : 0; +assign mcf_pfc_params[16*7 +: 16] = pfc_req_reg[6] ? {cfg_tx_pfc_quanta[16*6+0 +: 8], cfg_tx_pfc_quanta[16*6+8 +: 8]} : 0; +assign mcf_pfc_params[16*8 +: 16] = pfc_req_reg[7] ? {cfg_tx_pfc_quanta[16*7+0 +: 8], cfg_tx_pfc_quanta[16*7+8 +: 8]} : 0; + +assign mcf_valid = mcf_valid_reg; +assign mcf_eth_dst = (PFC_ENABLE && mcf_pfc_sel_reg) ? cfg_tx_pfc_eth_dst : cfg_tx_lfc_eth_dst; +assign mcf_eth_src = (PFC_ENABLE && mcf_pfc_sel_reg) ? cfg_tx_pfc_eth_src : cfg_tx_lfc_eth_src; +assign mcf_eth_type = (PFC_ENABLE && mcf_pfc_sel_reg) ? cfg_tx_pfc_eth_type : cfg_tx_lfc_eth_type; +assign mcf_opcode = (PFC_ENABLE && mcf_pfc_sel_reg) ? cfg_tx_pfc_opcode : cfg_tx_lfc_opcode; +assign mcf_params = (PFC_ENABLE && mcf_pfc_sel_reg) ? mcf_pfc_params : mcf_lfc_params; + +assign stat_tx_lfc_pkt = stat_tx_lfc_pkt_reg; +assign stat_tx_lfc_xon = stat_tx_lfc_xon_reg; +assign stat_tx_lfc_xoff = stat_tx_lfc_xoff_reg; +assign stat_tx_lfc_paused = lfc_req_reg; +assign stat_tx_pfc_pkt = stat_tx_pfc_pkt_reg; +assign stat_tx_pfc_xon = stat_tx_pfc_xon_reg; +assign stat_tx_pfc_xoff = stat_tx_pfc_xoff_reg; +assign stat_tx_pfc_paused = pfc_req_reg; + +integer k; + +initial begin + for (k = 0; k < 8; k = k + 1) begin + pfc_refresh_reg[k] = 0; + end +end + +always @* begin + lfc_req_next = lfc_req_reg; + lfc_act_next = lfc_act_reg; + lfc_send_next = lfc_send_reg | tx_lfc_resend; + pfc_req_next = pfc_req_reg; + pfc_act_next = pfc_act_reg; + pfc_en_next = pfc_en_reg; + pfc_send_next = pfc_send_reg | tx_pfc_resend; + + mcf_pfc_sel_next = mcf_pfc_sel_reg; + mcf_valid_next = mcf_valid_reg && !mcf_ready; + + stat_tx_lfc_pkt_next = 1'b0; + stat_tx_lfc_xon_next = 1'b0; + stat_tx_lfc_xoff_next = 1'b0; + stat_tx_pfc_pkt_next = 1'b0; + stat_tx_pfc_xon_next = 0; + stat_tx_pfc_xoff_next = 0; + + if (cfg_quanta_clk_en) begin + if (lfc_refresh_reg > cfg_quanta_step) begin + lfc_refresh_next = lfc_refresh_reg - cfg_quanta_step; + end else begin + lfc_refresh_next = 0; + if (lfc_req_reg) begin + lfc_send_next = 1'b1; + end + end + end else begin + lfc_refresh_next = lfc_refresh_reg; + end + + for (k = 0; k < 8; k = k + 1) begin + if (cfg_quanta_clk_en) begin + if (pfc_refresh_reg[k] > cfg_quanta_step) begin + pfc_refresh_next[k] = pfc_refresh_reg[k] - cfg_quanta_step; + end else begin + pfc_refresh_next[k] = 0; + if (pfc_req_reg[k]) begin + pfc_send_next = 1'b1; + end + end + end else begin + pfc_refresh_next[k] = pfc_refresh_reg[k]; + end + end + + if (cfg_tx_lfc_en) begin + if (!mcf_valid_reg) begin + if (lfc_req_reg != tx_lfc_req) begin + lfc_req_next = tx_lfc_req; + lfc_act_next = lfc_act_reg | tx_lfc_req; + lfc_send_next = 1'b1; + end + + if (lfc_send_reg && !(PFC_ENABLE && cfg_tx_pfc_en && pfc_send_reg)) begin + mcf_pfc_sel_next = 1'b0; + mcf_valid_next = lfc_act_reg; + lfc_act_next = lfc_req_reg; + lfc_refresh_next = lfc_req_reg ? {cfg_tx_lfc_refresh, {QFB{1'b0}}} : 0; + lfc_send_next = 1'b0; + + stat_tx_lfc_pkt_next = lfc_act_reg; + stat_tx_lfc_xon_next = lfc_act_reg && !lfc_req_reg; + stat_tx_lfc_xoff_next = lfc_act_reg && lfc_req_reg; + end + end + end + + if (PFC_ENABLE && cfg_tx_pfc_en) begin + if (!mcf_valid_reg) begin + if (pfc_req_reg != tx_pfc_req) begin + pfc_req_next = tx_pfc_req; + pfc_act_next = pfc_act_reg | tx_pfc_req; + pfc_send_next = 1'b1; + end + + if (pfc_send_reg) begin + mcf_pfc_sel_next = 1'b1; + mcf_valid_next = pfc_act_reg != 0; + pfc_en_next = pfc_act_reg; + pfc_act_next = pfc_req_reg; + for (k = 0; k < 8; k = k + 1) begin + pfc_refresh_next[k] = pfc_req_reg[k] ? {cfg_tx_pfc_refresh[16*k +: 16], {QFB{1'b0}}} : 0; + end + pfc_send_next = 1'b0; + + stat_tx_pfc_pkt_next = pfc_act_reg != 0; + stat_tx_pfc_xon_next = pfc_act_reg & ~pfc_req_reg; + stat_tx_pfc_xoff_next = pfc_act_reg & pfc_req_reg; + end + end + end +end + +always @(posedge clk) begin + lfc_req_reg <= lfc_req_next; + lfc_act_reg <= lfc_act_next; + lfc_send_reg <= lfc_send_next; + pfc_req_reg <= pfc_req_next; + pfc_act_reg <= pfc_act_next; + pfc_en_reg <= pfc_en_next; + pfc_send_reg <= pfc_send_next; + + mcf_pfc_sel_reg <= mcf_pfc_sel_next; + mcf_valid_reg <= mcf_valid_next; + + lfc_refresh_reg <= lfc_refresh_next; + for (k = 0; k < 8; k = k + 1) begin + pfc_refresh_reg[k] <= pfc_refresh_next[k]; + end + + stat_tx_lfc_pkt_reg <= stat_tx_lfc_pkt_next; + stat_tx_lfc_xon_reg <= stat_tx_lfc_xon_next; + stat_tx_lfc_xoff_reg <= stat_tx_lfc_xoff_next; + stat_tx_pfc_pkt_reg <= stat_tx_pfc_pkt_next; + stat_tx_pfc_xon_reg <= stat_tx_pfc_xon_next; + stat_tx_pfc_xoff_reg <= stat_tx_pfc_xoff_next; + + if (rst) begin + lfc_req_reg <= 1'b0; + lfc_act_reg <= 1'b0; + lfc_send_reg <= 1'b0; + pfc_req_reg <= 0; + pfc_act_reg <= 0; + pfc_send_reg <= 0; + mcf_pfc_sel_reg <= PFC_ENABLE != 0; + mcf_valid_reg <= 1'b0; + lfc_refresh_reg <= 0; + for (k = 0; k < 8; k = k + 1) begin + pfc_refresh_reg[k] <= 0; + end + + stat_tx_lfc_pkt_reg <= 1'b0; + stat_tx_lfc_xon_reg <= 1'b0; + stat_tx_lfc_xoff_reg <= 1'b0; + stat_tx_pfc_pkt_reg <= 1'b0; + stat_tx_pfc_xon_reg <= 0; + stat_tx_pfc_xoff_reg <= 0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/priority_encoder.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/priority_encoder.v new file mode 100755 index 0000000..cf82512 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/priority_encoder.v @@ -0,0 +1,92 @@ +/* + +Copyright (c) 2014-2021 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * Priority encoder module + */ +module priority_encoder # +( + parameter WIDTH = 4, + // LSB priority selection + parameter LSB_HIGH_PRIORITY = 0 +) +( + input wire [WIDTH-1:0] input_unencoded, + output wire output_valid, + output wire [$clog2(WIDTH)-1:0] output_encoded, + output wire [WIDTH-1:0] output_unencoded +); + +parameter LEVELS = WIDTH > 2 ? $clog2(WIDTH) : 1; +parameter W = 2**LEVELS; + +// pad input to even power of two +wire [W-1:0] input_padded = {{W-WIDTH{1'b0}}, input_unencoded}; + +wire [W/2-1:0] stage_valid[LEVELS-1:0]; +wire [W/2-1:0] stage_enc[LEVELS-1:0]; + +generate + genvar l, n; + + // process input bits; generate valid bit and encoded bit for each pair + for (n = 0; n < W/2; n = n + 1) begin : loop_in + assign stage_valid[0][n] = |input_padded[n*2+1:n*2]; + if (LSB_HIGH_PRIORITY) begin + // bit 0 is highest priority + assign stage_enc[0][n] = !input_padded[n*2+0]; + end else begin + // bit 0 is lowest priority + assign stage_enc[0][n] = input_padded[n*2+1]; + end + end + + // compress down to single valid bit and encoded bus + for (l = 1; l < LEVELS; l = l + 1) begin : loop_levels + for (n = 0; n < W/(2*2**l); n = n + 1) begin : loop_compress + assign stage_valid[l][n] = |stage_valid[l-1][n*2+1:n*2]; + if (LSB_HIGH_PRIORITY) begin + // bit 0 is highest priority + assign stage_enc[l][(n+1)*(l+1)-1:n*(l+1)] = stage_valid[l-1][n*2+0] ? {1'b0, stage_enc[l-1][(n*2+1)*l-1:(n*2+0)*l]} : {1'b1, stage_enc[l-1][(n*2+2)*l-1:(n*2+1)*l]}; + end else begin + // bit 0 is lowest priority + assign stage_enc[l][(n+1)*(l+1)-1:n*(l+1)] = stage_valid[l-1][n*2+1] ? {1'b1, stage_enc[l-1][(n*2+2)*l-1:(n*2+1)*l]} : {1'b0, stage_enc[l-1][(n*2+1)*l-1:(n*2+0)*l]}; + end + end + end +endgenerate + +assign output_valid = stage_valid[LEVELS-1]; +assign output_encoded = stage_enc[LEVELS-1]; +assign output_unencoded = 1 << output_encoded; + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ptp_clock_cdc.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ptp_clock_cdc.v new file mode 100755 index 0000000..cef27ae --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/ptp_clock_cdc.v @@ -0,0 +1,830 @@ +/* + +Copyright (c) 2019-2023 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1fs +`default_nettype none + +/* + * PTP clock CDC (clock domain crossing) module + */ +module ptp_clock_cdc # +( + parameter TS_WIDTH = 96, + parameter NS_WIDTH = 4, + parameter LOG_RATE = 3, + parameter PIPELINE_OUTPUT = 0 +) +( + input wire input_clk, + input wire input_rst, + input wire output_clk, + input wire output_rst, + input wire sample_clk, + + /* + * Timestamp inputs from source PTP clock + */ + input wire [TS_WIDTH-1:0] input_ts, + input wire input_ts_step, + + /* + * Timestamp outputs + */ + output wire [TS_WIDTH-1:0] output_ts, + output wire output_ts_step, + + /* + * PPS output + */ + output wire output_pps, + + /* + * Status + */ + output wire locked +); + +// bus width assertions +initial begin + if (TS_WIDTH != 64 && TS_WIDTH != 96) begin + $error("Error: Timestamp width must be 64 or 96"); + $finish; + end +end + +localparam FNS_WIDTH = 16; + +localparam TS_NS_WIDTH = TS_WIDTH == 96 ? 30 : 48; +localparam TS_FNS_WIDTH = FNS_WIDTH > 16 ? 16 : FNS_WIDTH; + +localparam CMP_FNS_WIDTH = 4; + +localparam PHASE_CNT_WIDTH = LOG_RATE; +localparam PHASE_ACC_WIDTH = PHASE_CNT_WIDTH+16; + +localparam LOG_SAMPLE_SYNC_RATE = LOG_RATE; +localparam SAMPLE_ACC_WIDTH = LOG_SAMPLE_SYNC_RATE+2; + +localparam LOG_PHASE_ERR_RATE = 4; +localparam PHASE_ERR_ACC_WIDTH = LOG_PHASE_ERR_RATE+2; + +localparam DEST_SYNC_LOCK_WIDTH = 7; +localparam FREQ_LOCK_WIDTH = 8; +localparam PTP_LOCK_WIDTH = 8; + +localparam TIME_ERR_INT_WIDTH = NS_WIDTH+FNS_WIDTH; + +localparam [30:0] NS_PER_S = 31'd1_000_000_000; + +reg [NS_WIDTH+FNS_WIDTH-1:0] period_ns_reg = 0, period_ns_next = 0; +reg [NS_WIDTH+FNS_WIDTH-1:0] period_ns_delay_reg = 0, period_ns_delay_next = 0; +reg [31+FNS_WIDTH-1:0] period_ns_ovf_reg = 0, period_ns_ovf_next = 0; + +reg [47:0] src_ts_s_capt_reg = 0; +reg [TS_NS_WIDTH+CMP_FNS_WIDTH-1:0] src_ts_ns_capt_reg = 0; +reg src_ts_step_capt_reg = 0; + +reg [47:0] dest_ts_s_capt_reg = 0; +reg [TS_NS_WIDTH+CMP_FNS_WIDTH-1:0] dest_ts_ns_capt_reg = 0; + +reg [47:0] src_ts_s_sync_reg = 0; +reg [TS_NS_WIDTH+CMP_FNS_WIDTH-1:0] src_ts_ns_sync_reg = 0; +reg src_ts_step_sync_reg = 0; + +reg [47:0] ts_s_reg = 0, ts_s_next = 0; +reg [TS_NS_WIDTH+FNS_WIDTH-1:0] ts_ns_reg = 0, ts_ns_next = 0; +reg [TS_NS_WIDTH+FNS_WIDTH-1:0] ts_ns_inc_reg = 0, ts_ns_inc_next = 0; +reg [TS_NS_WIDTH+FNS_WIDTH+1-1:0] ts_ns_ovf_reg = {TS_NS_WIDTH+FNS_WIDTH+1{1'b1}}, ts_ns_ovf_next = 0; + +reg ts_step_reg = 1'b0, ts_step_next; + +reg pps_reg = 1'b0; + +reg [47:0] ts_s_pipe_reg[0:PIPELINE_OUTPUT-1]; +reg [TS_NS_WIDTH+CMP_FNS_WIDTH-1:0] ts_ns_pipe_reg[0:PIPELINE_OUTPUT-1]; +reg ts_step_pipe_reg[0:PIPELINE_OUTPUT-1]; +reg pps_pipe_reg[0:PIPELINE_OUTPUT-1]; + +reg [PHASE_CNT_WIDTH-1:0] src_phase_reg = {PHASE_CNT_WIDTH{1'b0}}; +reg [PHASE_ACC_WIDTH-1:0] dest_phase_reg = {PHASE_ACC_WIDTH{1'b0}}, dest_phase_next; +reg [PHASE_ACC_WIDTH-1:0] dest_phase_inc_reg = {PHASE_ACC_WIDTH{1'b0}}, dest_phase_inc_next; + +reg src_sync_reg = 1'b0; +reg src_update_reg = 1'b0; +reg src_phase_sync_reg = 1'b0; +reg dest_sync_reg = 1'b0; +reg dest_update_reg = 1'b0, dest_update_next = 1'b0; +reg dest_phase_sync_reg = 1'b0; + +reg src_sync_sync1_reg = 1'b0; +reg src_sync_sync2_reg = 1'b0; +reg src_sync_sync3_reg = 1'b0; +reg src_phase_sync_sync1_reg = 1'b0; +reg src_phase_sync_sync2_reg = 1'b0; +reg src_phase_sync_sync3_reg = 1'b0; +reg dest_phase_sync_sync1_reg = 1'b0; +reg dest_phase_sync_sync2_reg = 1'b0; +reg dest_phase_sync_sync3_reg = 1'b0; + +reg src_sync_sample_sync1_reg = 1'b0; +reg src_sync_sample_sync2_reg = 1'b0; +reg src_sync_sample_sync3_reg = 1'b0; +reg dest_sync_sample_sync1_reg = 1'b0; +reg dest_sync_sample_sync2_reg = 1'b0; +reg dest_sync_sample_sync3_reg = 1'b0; + +reg [SAMPLE_ACC_WIDTH-1:0] sample_acc_reg = 0; +reg [SAMPLE_ACC_WIDTH-1:0] sample_acc_out_reg = 0; +reg [LOG_SAMPLE_SYNC_RATE-1:0] sample_cnt_reg = 0; +reg sample_update_reg = 1'b0; +reg sample_update_sync1_reg = 1'b0; +reg sample_update_sync2_reg = 1'b0; +reg sample_update_sync3_reg = 1'b0; + +generate + +if (PIPELINE_OUTPUT > 0) begin + + // pipeline + (* shreg_extract = "no" *) + reg [TS_WIDTH-1:0] output_ts_reg[0:PIPELINE_OUTPUT-1]; + (* shreg_extract = "no" *) + reg output_ts_step_reg[0:PIPELINE_OUTPUT-1]; + (* shreg_extract = "no" *) + reg output_pps_reg[0:PIPELINE_OUTPUT-1]; + + assign output_ts = output_ts_reg[PIPELINE_OUTPUT-1]; + assign output_ts_step = output_ts_step_reg[PIPELINE_OUTPUT-1]; + assign output_pps = output_pps_reg[PIPELINE_OUTPUT-1]; + + integer i; + + initial begin + for (i = 0; i < PIPELINE_OUTPUT; i = i + 1) begin + output_ts_reg[i] = 0; + output_ts_step_reg[i] = 1'b0; + output_pps_reg[i] = 1'b0; + end + end + + always @(posedge output_clk) begin + if (TS_WIDTH == 96) begin + output_ts_reg[0][95:48] <= ts_s_reg; + output_ts_reg[0][47:46] <= 2'b00; + output_ts_reg[0][45:0] <= {ts_ns_reg, 16'd0} >> FNS_WIDTH; + end else if (TS_WIDTH == 64) begin + output_ts_reg[0] <= {ts_ns_reg, 16'd0} >> FNS_WIDTH; + end + + output_ts_step_reg[0] <= ts_step_reg; + output_pps_reg[0] <= pps_reg; + + for (i = 0; i < PIPELINE_OUTPUT-1; i = i + 1) begin + output_ts_reg[i+1] <= output_ts_reg[i]; + output_ts_step_reg[i+1] <= output_ts_step_reg[i]; + output_pps_reg[i+1] <= output_pps_reg[i]; + end + + if (output_rst) begin + for (i = 0; i < PIPELINE_OUTPUT; i = i + 1) begin + output_ts_reg[i] <= 0; + output_ts_step_reg[i] <= 1'b0; + output_pps_reg[i] <= 1'b0; + end + end + end + +end else begin + + if (TS_WIDTH == 96) begin + assign output_ts[95:48] = ts_s_reg; + assign output_ts[47:46] = 2'b00; + assign output_ts[45:0] = {ts_ns_reg, 16'd0} >> FNS_WIDTH; + end else if (TS_WIDTH == 64) begin + assign output_ts = {ts_ns_reg, 16'd0} >> FNS_WIDTH; + end + + assign output_ts_step = ts_step_reg; + + assign output_pps = pps_reg; + +end + +endgenerate + +integer i; + +initial begin + for (i = 0; i < PIPELINE_OUTPUT; i = i + 1) begin + ts_s_pipe_reg[i] = 0; + ts_ns_pipe_reg[i] = 0; + ts_step_pipe_reg[i] = 1'b0; + pps_pipe_reg[i] = 1'b0; + end +end + +// source PTP clock capture and sync logic +reg input_ts_step_reg = 1'b0; + +always @(posedge input_clk) begin + input_ts_step_reg <= input_ts_step || input_ts_step_reg; + + src_phase_sync_reg <= input_ts[16+8]; + + {src_update_reg, src_phase_reg} <= src_phase_reg+1; + + if (src_update_reg) begin + // capture source TS + if (TS_WIDTH == 96) begin + src_ts_s_capt_reg <= input_ts[95:48]; + src_ts_ns_capt_reg <= input_ts[45:0] >> (16-CMP_FNS_WIDTH); + end else begin + src_ts_ns_capt_reg <= input_ts >> (16-CMP_FNS_WIDTH); + end + src_ts_step_capt_reg <= input_ts_step || input_ts_step_reg; + input_ts_step_reg <= 1'b0; + src_sync_reg <= !src_sync_reg; + end + + if (input_rst) begin + input_ts_step_reg <= 1'b0; + + src_phase_reg <= {PHASE_CNT_WIDTH{1'b0}}; + src_sync_reg <= 1'b0; + src_update_reg <= 1'b0; + end +end + +// CDC logic +always @(posedge output_clk) begin + src_sync_sync1_reg <= src_sync_reg; + src_sync_sync2_reg <= src_sync_sync1_reg; + src_sync_sync3_reg <= src_sync_sync2_reg; + src_phase_sync_sync1_reg <= src_phase_sync_reg; + src_phase_sync_sync2_reg <= src_phase_sync_sync1_reg; + src_phase_sync_sync3_reg <= src_phase_sync_sync2_reg; + dest_phase_sync_sync1_reg <= dest_phase_sync_reg; + dest_phase_sync_sync2_reg <= dest_phase_sync_sync1_reg; + dest_phase_sync_sync3_reg <= dest_phase_sync_sync2_reg; +end + +always @(posedge sample_clk) begin + src_sync_sample_sync1_reg <= src_sync_reg; + src_sync_sample_sync2_reg <= src_sync_sample_sync1_reg; + src_sync_sample_sync3_reg <= src_sync_sample_sync2_reg; + dest_sync_sample_sync1_reg <= dest_sync_reg; + dest_sync_sample_sync2_reg <= dest_sync_sample_sync1_reg; + dest_sync_sample_sync3_reg <= dest_sync_sample_sync2_reg; +end + +reg edge_1_reg = 1'b0; +reg edge_2_reg = 1'b0; + +reg [3:0] active_reg = 0; + +always @(posedge sample_clk) begin + // phase and frequency detector + if (dest_sync_sample_sync2_reg && !dest_sync_sample_sync3_reg) begin + if (src_sync_sample_sync2_reg && !src_sync_sample_sync3_reg) begin + edge_1_reg <= 1'b0; + edge_2_reg <= 1'b0; + end else begin + edge_1_reg <= !edge_2_reg; + edge_2_reg <= 1'b0; + end + end else if (src_sync_sample_sync2_reg && !src_sync_sample_sync3_reg) begin + edge_1_reg <= 1'b0; + edge_2_reg <= !edge_1_reg; + end + + // accumulator + sample_acc_reg <= $signed(sample_acc_reg) + $signed({1'b0, edge_2_reg}) - $signed({1'b0, edge_1_reg}); + + sample_cnt_reg <= sample_cnt_reg + 1; + + if (src_sync_sample_sync2_reg && !src_sync_sample_sync3_reg) begin + active_reg[0] <= 1'b1; + end + + if (sample_cnt_reg == 0) begin + active_reg <= {active_reg, src_sync_sample_sync2_reg && !src_sync_sample_sync3_reg}; + sample_acc_reg <= $signed({1'b0, edge_2_reg}) - $signed({1'b0, edge_1_reg}); + sample_acc_out_reg <= sample_acc_reg; + if (active_reg != 0) begin + sample_update_reg <= !sample_update_reg; + end + end +end + +always @(posedge output_clk) begin + sample_update_sync1_reg <= sample_update_reg; + sample_update_sync2_reg <= sample_update_sync1_reg; + sample_update_sync3_reg <= sample_update_sync2_reg; +end + +reg [SAMPLE_ACC_WIDTH-1:0] sample_acc_sync_reg = 0; +reg sample_acc_sync_valid_reg = 0; + +reg [PHASE_ACC_WIDTH-1:0] dest_err_int_reg = 0, dest_err_int_next = 0; +reg [1:0] dest_ovf; + +reg [DEST_SYNC_LOCK_WIDTH-1:0] dest_sync_lock_count_reg = 0, dest_sync_lock_count_next; +reg dest_sync_locked_reg = 1'b0, dest_sync_locked_next; + +always @* begin + {dest_update_next, dest_phase_next} = dest_phase_reg + dest_phase_inc_reg; + dest_phase_inc_next = dest_phase_inc_reg; + + dest_err_int_next = dest_err_int_reg; + + dest_sync_lock_count_next = dest_sync_lock_count_reg; + dest_sync_locked_next = dest_sync_locked_reg; + + if (sample_acc_sync_valid_reg) begin + // updated sampled dest_phase error + + // time integral of error + if (dest_sync_locked_reg) begin + {dest_ovf, dest_err_int_next} = $signed({1'b0, dest_err_int_reg}) + $signed(sample_acc_sync_reg); + end else begin + {dest_ovf, dest_err_int_next} = $signed({1'b0, dest_err_int_reg}) + ($signed(sample_acc_sync_reg) * 2**6); + end + + // saturate + if (dest_ovf[1]) begin + // sign bit set indicating underflow across zero; saturate to zero + dest_err_int_next = {PHASE_ACC_WIDTH{1'b0}}; + end else if (dest_ovf[0]) begin + // sign bit clear but carry bit set indicating overflow; saturate to all 1 + dest_err_int_next = {PHASE_ACC_WIDTH{1'b1}}; + end + + // compute output + if (dest_sync_locked_reg) begin + {dest_ovf, dest_phase_inc_next} = $signed({1'b0, dest_err_int_reg}) + ($signed(sample_acc_sync_reg) * 2**4); + end else begin + {dest_ovf, dest_phase_inc_next} = $signed({1'b0, dest_err_int_reg}) + ($signed(sample_acc_sync_reg) * 2**10); + end + + // saturate + if (dest_ovf[1]) begin + // sign bit set indicating underflow across zero; saturate to zero + dest_phase_inc_next = {PHASE_ACC_WIDTH{1'b0}}; + end else if (dest_ovf[0]) begin + // sign bit clear but carry bit set indicating overflow; saturate to all 1 + dest_phase_inc_next = {PHASE_ACC_WIDTH{1'b1}}; + end + + // locked status + if ($signed(sample_acc_sync_reg[SAMPLE_ACC_WIDTH-1:2]) == 0 || $signed(sample_acc_sync_reg[SAMPLE_ACC_WIDTH-1:1]) == -1) begin + if (dest_sync_lock_count_reg == {DEST_SYNC_LOCK_WIDTH{1'b1}}) begin + dest_sync_locked_next = 1'b1; + end else begin + dest_sync_lock_count_next = dest_sync_lock_count_reg + 1; + end + end else begin + dest_sync_lock_count_next = 0; + dest_sync_locked_next = 1'b0; + end + end +end + +reg [PHASE_ERR_ACC_WIDTH-1:0] phase_err_acc_reg = 0; +reg [PHASE_ERR_ACC_WIDTH-1:0] phase_err_out_reg = 0; +reg [LOG_PHASE_ERR_RATE-1:0] phase_err_cnt_reg = 0; +reg phase_err_out_valid_reg = 0; + +reg phase_edge_1_reg = 1'b0; +reg phase_edge_2_reg = 1'b0; + +reg [5:0] phase_active_reg = 0; + +reg ts_sync_valid_reg = 1'b0; +reg ts_capt_valid_reg = 1'b0; + +always @(posedge output_clk) begin + dest_phase_reg <= dest_phase_next; + dest_phase_inc_reg <= dest_phase_inc_next; + dest_update_reg <= dest_update_next; + + sample_acc_sync_valid_reg <= 1'b0; + if (sample_update_sync2_reg ^ sample_update_sync3_reg) begin + // latch in synchronized counts from phase detector + sample_acc_sync_reg <= sample_acc_out_reg; + sample_acc_sync_valid_reg <= 1'b1; + end + + if (PIPELINE_OUTPUT > 0) begin + dest_phase_sync_reg <= ts_ns_pipe_reg[PIPELINE_OUTPUT-1][8+FNS_WIDTH]; + end else begin + dest_phase_sync_reg <= ts_ns_reg[8+FNS_WIDTH]; + end + + // phase and frequency detector + if (dest_phase_sync_sync2_reg && !dest_phase_sync_sync3_reg) begin + if (src_phase_sync_sync2_reg && !src_phase_sync_sync3_reg) begin + phase_edge_1_reg <= 1'b0; + phase_edge_2_reg <= 1'b0; + end else begin + phase_edge_1_reg <= !phase_edge_2_reg; + phase_edge_2_reg <= 1'b0; + end + end else if (src_phase_sync_sync2_reg && !src_phase_sync_sync3_reg) begin + phase_edge_1_reg <= 1'b0; + phase_edge_2_reg <= !phase_edge_1_reg; + end + + // accumulator + phase_err_acc_reg <= $signed(phase_err_acc_reg) + $signed({1'b0, phase_edge_2_reg}) - $signed({1'b0, phase_edge_1_reg}); + + phase_err_cnt_reg <= phase_err_cnt_reg + 1; + + if (src_phase_sync_sync2_reg && !src_phase_sync_sync3_reg) begin + phase_active_reg[0] <= 1'b1; + end + + phase_err_out_valid_reg <= 1'b0; + if (phase_err_cnt_reg == 0) begin + phase_active_reg <= {phase_active_reg, src_phase_sync_sync2_reg && !src_phase_sync_sync3_reg}; + phase_err_acc_reg <= $signed({1'b0, phase_edge_2_reg}) - $signed({1'b0, phase_edge_1_reg}); + phase_err_out_reg <= phase_err_acc_reg; + if (phase_active_reg != 0) begin + phase_err_out_valid_reg <= 1'b1; + end + end + + if (dest_update_reg) begin + // capture local TS + if (PIPELINE_OUTPUT > 0) begin + dest_ts_s_capt_reg <= ts_s_pipe_reg[PIPELINE_OUTPUT-1]; + dest_ts_ns_capt_reg <= ts_ns_pipe_reg[PIPELINE_OUTPUT-1]; + end else begin + dest_ts_s_capt_reg <= ts_s_reg; + dest_ts_ns_capt_reg <= ts_ns_reg >> FNS_WIDTH-CMP_FNS_WIDTH; + end + + dest_sync_reg <= !dest_sync_reg; + ts_capt_valid_reg <= 1'b1; + end + + if (src_sync_sync2_reg ^ src_sync_sync3_reg) begin + // store captured source TS + if (TS_WIDTH == 96) begin + src_ts_s_sync_reg <= src_ts_s_capt_reg; + end + src_ts_ns_sync_reg <= src_ts_ns_capt_reg; + src_ts_step_sync_reg <= src_ts_step_capt_reg; + + ts_sync_valid_reg <= 1'b1; + end + + if (ts_sync_valid_reg && ts_capt_valid_reg) begin + ts_sync_valid_reg <= 1'b0; + ts_capt_valid_reg <= 1'b0; + end + + dest_err_int_reg <= dest_err_int_next; + + dest_sync_lock_count_reg <= dest_sync_lock_count_next; + dest_sync_locked_reg <= dest_sync_locked_next; + + if (output_rst) begin + dest_phase_reg <= {PHASE_ACC_WIDTH{1'b0}}; + dest_phase_inc_reg <= {PHASE_ACC_WIDTH{1'b0}}; + dest_sync_reg <= 1'b0; + dest_update_reg <= 1'b0; + + dest_err_int_reg <= 0; + + dest_sync_lock_count_reg <= 0; + dest_sync_locked_reg <= 1'b0; + + ts_sync_valid_reg <= 1'b0; + ts_capt_valid_reg <= 1'b0; + end +end + +reg ts_diff_reg = 1'b0, ts_diff_next; +reg ts_diff_valid_reg = 1'b0, ts_diff_valid_next; +reg [3:0] mismatch_cnt_reg = 0, mismatch_cnt_next; +reg load_ts_reg = 1'b0, load_ts_next; + +reg [9+CMP_FNS_WIDTH-1:0] ts_ns_diff_reg = 0, ts_ns_diff_next; + +reg [TIME_ERR_INT_WIDTH-1:0] time_err_int_reg = 0, time_err_int_next; + +reg [1:0] ptp_ovf; + +reg [FREQ_LOCK_WIDTH-1:0] freq_lock_count_reg = 0, freq_lock_count_next; +reg freq_locked_reg = 1'b0, freq_locked_next; +reg [PTP_LOCK_WIDTH-1:0] ptp_lock_count_reg = 0, ptp_lock_count_next; +reg ptp_locked_reg = 1'b0, ptp_locked_next; + +reg gain_sel_reg = 0, gain_sel_next; + +assign locked = ptp_locked_reg && freq_locked_reg && dest_sync_locked_reg; + +always @* begin + period_ns_next = period_ns_reg; + + ts_s_next = ts_s_reg; + ts_ns_next = ts_ns_reg; + ts_ns_inc_next = ts_ns_inc_reg; + ts_ns_ovf_next = ts_ns_ovf_reg; + + ts_step_next = 0; + + ts_diff_next = 1'b0; + ts_diff_valid_next = 1'b0; + mismatch_cnt_next = mismatch_cnt_reg; + load_ts_next = load_ts_reg; + + ts_ns_diff_next = ts_ns_diff_reg; + + time_err_int_next = time_err_int_reg; + + freq_lock_count_next = freq_lock_count_reg; + freq_locked_next = freq_locked_reg; + ptp_lock_count_next = ptp_lock_count_reg; + ptp_locked_next = ptp_locked_reg; + + gain_sel_next = gain_sel_reg; + + // PTP clock + period_ns_delay_next = period_ns_reg; + period_ns_ovf_next = {NS_PER_S, {FNS_WIDTH{1'b0}}} - period_ns_reg; + + if (TS_WIDTH == 96) begin + // 96 bit timestamp + ts_ns_inc_next = ts_ns_inc_reg + period_ns_delay_reg; + ts_ns_ovf_next = ts_ns_inc_reg - period_ns_ovf_reg; + ts_ns_next = ts_ns_inc_reg; + + if (!ts_ns_ovf_reg[30+FNS_WIDTH]) begin + // if the overflow lookahead did not borrow, one second has elapsed + // increment seconds field, pre-compute normal increment, force overflow lookahead borrow bit set + ts_ns_inc_next = ts_ns_ovf_reg + period_ns_delay_reg; + ts_ns_ovf_next[30+FNS_WIDTH] = 1'b1; + ts_ns_next = ts_ns_ovf_reg; + ts_s_next = ts_s_reg + 1; + end + end else if (TS_WIDTH == 64) begin + // 64 bit timestamp + ts_ns_next = ts_ns_reg + period_ns_reg; + end + + if (ts_sync_valid_reg && ts_capt_valid_reg) begin + // Read new value + if (TS_WIDTH == 96) begin + if (src_ts_step_sync_reg || load_ts_reg) begin + // input stepped + load_ts_next = 1'b0; + + ts_s_next = src_ts_s_sync_reg; + ts_ns_next[TS_NS_WIDTH+FNS_WIDTH-1:9+FNS_WIDTH] = src_ts_ns_sync_reg[TS_NS_WIDTH+CMP_FNS_WIDTH-1:9+CMP_FNS_WIDTH]; + ts_ns_inc_next[TS_NS_WIDTH+FNS_WIDTH-1:9+FNS_WIDTH] = src_ts_ns_sync_reg[TS_NS_WIDTH+CMP_FNS_WIDTH-1:9+CMP_FNS_WIDTH]; + ts_ns_ovf_next[30+FNS_WIDTH] = 1'b1; + ts_step_next = 1; + end else begin + // input did not step + load_ts_next = 1'b0; + ts_diff_valid_next = freq_locked_reg; + end + // compute difference + ts_ns_diff_next = src_ts_ns_sync_reg - dest_ts_ns_capt_reg; + ts_diff_next = src_ts_s_sync_reg != dest_ts_s_capt_reg || src_ts_ns_sync_reg[TS_NS_WIDTH+CMP_FNS_WIDTH-1:9+CMP_FNS_WIDTH] != dest_ts_ns_capt_reg[TS_NS_WIDTH+CMP_FNS_WIDTH-1:9+CMP_FNS_WIDTH]; + end else if (TS_WIDTH == 64) begin + if (src_ts_step_sync_reg || load_ts_reg) begin + // input stepped + load_ts_next = 1'b0; + + ts_ns_next[TS_NS_WIDTH+FNS_WIDTH-1:9+FNS_WIDTH] = src_ts_ns_sync_reg[TS_NS_WIDTH+CMP_FNS_WIDTH-1:9+CMP_FNS_WIDTH]; + ts_step_next = 1; + end else begin + // input did not step + load_ts_next = 1'b0; + ts_diff_valid_next = freq_locked_reg; + end + // compute difference + ts_ns_diff_next = src_ts_ns_sync_reg - dest_ts_ns_capt_reg; + ts_diff_next = src_ts_ns_sync_reg[TS_NS_WIDTH+CMP_FNS_WIDTH-1:9+CMP_FNS_WIDTH] != dest_ts_ns_capt_reg[TS_NS_WIDTH+CMP_FNS_WIDTH-1:9+CMP_FNS_WIDTH]; + end + end + + if (ts_diff_valid_reg) begin + if (ts_diff_reg) begin + if (&mismatch_cnt_reg) begin + load_ts_next = 1'b1; + mismatch_cnt_next = 0; + end else begin + mismatch_cnt_next = mismatch_cnt_reg + 1; + end + end else begin + mismatch_cnt_next = 0; + end + end + + if (phase_err_out_valid_reg) begin + // coarse phase/frequency lock of PTP clock + if ($signed(phase_err_out_reg) > 4 || $signed(phase_err_out_reg) < -4) begin + if (freq_lock_count_reg) begin + freq_lock_count_next = freq_lock_count_reg - 1; + end else begin + freq_locked_next = 1'b0; + end + end else begin + if (&freq_lock_count_reg) begin + freq_locked_next = 1'b1; + end else begin + freq_lock_count_next = freq_lock_count_reg + 1; + end + end + + if (!freq_locked_reg) begin + ts_ns_diff_next = $signed(phase_err_out_reg) * 8 * 2**CMP_FNS_WIDTH; + ts_diff_valid_next = 1'b1; + end + end + + if (ts_diff_valid_reg) begin + // PI control + + // gain scheduling + casez (ts_ns_diff_reg[9+CMP_FNS_WIDTH-5 +: 5]) + 5'b01zzz: gain_sel_next = 1'b1; + 5'b001zz: gain_sel_next = 1'b1; + 5'b0001z: gain_sel_next = 1'b1; + 5'b00001: gain_sel_next = 1'b1; + 5'b00000: gain_sel_next = 1'b0; + 5'b11111: gain_sel_next = 1'b0; + 5'b11110: gain_sel_next = 1'b1; + 5'b1110z: gain_sel_next = 1'b1; + 5'b110zz: gain_sel_next = 1'b1; + 5'b10zzz: gain_sel_next = 1'b1; + default: gain_sel_next = 1'b0; + endcase + + // time integral of error + case (gain_sel_reg) + 1'b0: {ptp_ovf, time_err_int_next} = $signed({1'b0, time_err_int_reg}) + ($signed(ts_ns_diff_reg) / 2**4); + 1'b1: {ptp_ovf, time_err_int_next} = $signed({1'b0, time_err_int_reg}) + ($signed(ts_ns_diff_reg) * 2**2); + endcase + + // saturate + if (ptp_ovf[1]) begin + // sign bit set indicating underflow across zero; saturate to zero + time_err_int_next = {TIME_ERR_INT_WIDTH{1'b0}}; + end else if (ptp_ovf[0]) begin + // sign bit clear but carry bit set indicating overflow; saturate to all 1 + time_err_int_next = {TIME_ERR_INT_WIDTH{1'b1}}; + end + + // compute output + case (gain_sel_reg) + 1'b0: {ptp_ovf, period_ns_next} = $signed({1'b0, time_err_int_reg}) + ($signed(ts_ns_diff_reg) * 2**2); + 1'b1: {ptp_ovf, period_ns_next} = $signed({1'b0, time_err_int_reg}) + ($signed(ts_ns_diff_reg) * 2**6); + endcase + + // saturate + if (ptp_ovf[1]) begin + // sign bit set indicating underflow across zero; saturate to zero + period_ns_next = {NS_WIDTH+FNS_WIDTH{1'b0}}; + end else if (ptp_ovf[0]) begin + // sign bit clear but carry bit set indicating overflow; saturate to all 1 + period_ns_next = {NS_WIDTH+FNS_WIDTH{1'b1}}; + end + + // adjust period if integrator is saturated + if (time_err_int_reg == 0) begin + period_ns_next = {NS_WIDTH+FNS_WIDTH{1'b0}}; + end else if (~time_err_int_reg == 0) begin + period_ns_next = {NS_WIDTH+FNS_WIDTH{1'b1}}; + end + + // locked status + if (!freq_locked_reg) begin + ptp_lock_count_next = 0; + ptp_locked_next = 1'b0; + end else if (gain_sel_reg == 1'b0) begin + if (&ptp_lock_count_reg) begin + ptp_locked_next = 1'b1; + end else begin + ptp_lock_count_next = ptp_lock_count_reg + 1; + end + end else begin + if (ptp_lock_count_reg) begin + ptp_lock_count_next = ptp_lock_count_reg - 1; + end else begin + ptp_locked_next = 1'b0; + end + end + end +end + +always @(posedge output_clk) begin + period_ns_reg <= period_ns_next; + period_ns_delay_reg <= period_ns_delay_next; + period_ns_ovf_reg <= period_ns_ovf_next; + + ts_s_reg <= ts_s_next; + ts_ns_reg <= ts_ns_next; + ts_ns_inc_reg <= ts_ns_inc_next; + ts_ns_ovf_reg <= ts_ns_ovf_next; + + ts_step_reg <= ts_step_next; + + ts_diff_reg <= ts_diff_next; + ts_diff_valid_reg <= ts_diff_valid_next; + mismatch_cnt_reg <= mismatch_cnt_next; + load_ts_reg <= load_ts_next; + + ts_ns_diff_reg <= ts_ns_diff_next; + + time_err_int_reg <= time_err_int_next; + + freq_lock_count_reg <= freq_lock_count_next; + freq_locked_reg <= freq_locked_next; + ptp_lock_count_reg <= ptp_lock_count_next; + ptp_locked_reg <= ptp_locked_next; + + gain_sel_reg <= gain_sel_next; + + // PPS output + if (TS_WIDTH == 96) begin + pps_reg <= !ts_ns_ovf_reg[30+FNS_WIDTH]; + end else if (TS_WIDTH == 64) begin + pps_reg <= 1'b0; // not currently implemented for 64 bit timestamp format + end + + // pipeline + if (PIPELINE_OUTPUT > 0) begin + ts_s_pipe_reg[0] <= ts_s_reg; + ts_ns_pipe_reg[0] <= ts_ns_reg >> FNS_WIDTH-TS_FNS_WIDTH; + ts_step_pipe_reg[0] <= ts_step_reg; + pps_pipe_reg[0] <= pps_reg; + + for (i = 0; i < PIPELINE_OUTPUT-1; i = i + 1) begin + ts_s_pipe_reg[i+1] <= ts_s_pipe_reg[i]; + ts_ns_pipe_reg[i+1] <= ts_ns_pipe_reg[i]; + ts_step_pipe_reg[i+1] <= ts_step_pipe_reg[i]; + pps_pipe_reg[i+1] <= pps_pipe_reg[i]; + end + end + + if (output_rst) begin + period_ns_reg <= 0; + ts_s_reg <= 0; + ts_ns_reg <= 0; + ts_ns_inc_reg <= 0; + ts_ns_ovf_reg[30+FNS_WIDTH] <= 1'b1; + ts_step_reg <= 0; + pps_reg <= 0; + + ts_diff_reg <= 1'b0; + ts_diff_valid_reg <= 1'b0; + mismatch_cnt_reg <= 0; + load_ts_reg <= 0; + + time_err_int_reg <= 0; + + freq_lock_count_reg <= 0; + freq_locked_reg <= 1'b0; + ptp_lock_count_reg <= 0; + ptp_locked_reg <= 1'b0; + + for (i = 0; i < PIPELINE_OUTPUT; i = i + 1) begin + ts_s_pipe_reg[i] <= 0; + ts_ns_pipe_reg[i] <= 0; + ts_step_pipe_reg[i] <= 1'b0; + pps_pipe_reg[i] <= 1'b0; + end + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/sync_reset.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/sync_reset.v new file mode 100755 index 0000000..8c2dd52 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/sync_reset.v @@ -0,0 +1,61 @@ +/* + +Copyright (c) 2014-2020 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog-2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * Synchronizes an active-high asynchronous reset signal to a given clock by + * using a pipeline of N registers. + */ +module sync_reset # +( + // depth of synchronizer + parameter N = 2 +) +( + input wire clk, + input wire rst, + output wire out +); + +(* srl_style = "register" *) +reg [N-1:0] sync_reg = {N{1'b1}}; + +assign out = sync_reg[N-1]; + +always @(posedge clk or posedge rst) begin + if (rst) begin + sync_reg <= {N{1'b1}}; + end else begin + sync_reg <= {sync_reg[N-2:0], 1'b0}; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_64.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_64.v new file mode 100755 index 0000000..6dc2eee --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_64.v @@ -0,0 +1,428 @@ +/* + +Copyright (c) 2014-2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * UDP block, IP interface (64 bit datapath) + */ +module udp_64 # +( + parameter CHECKSUM_GEN_ENABLE = 1, + parameter CHECKSUM_PAYLOAD_FIFO_DEPTH = 2048, + parameter CHECKSUM_HEADER_FIFO_DEPTH = 8 +) +( + input wire clk, + input wire rst, + + /* + * IP frame input + */ + input wire s_ip_hdr_valid, + output wire s_ip_hdr_ready, + input wire [47:0] s_ip_eth_dest_mac, + input wire [47:0] s_ip_eth_src_mac, + input wire [15:0] s_ip_eth_type, + input wire [3:0] s_ip_version, + input wire [3:0] s_ip_ihl, + input wire [5:0] s_ip_dscp, + input wire [1:0] s_ip_ecn, + input wire [15:0] s_ip_length, + input wire [15:0] s_ip_identification, + input wire [2:0] s_ip_flags, + input wire [12:0] s_ip_fragment_offset, + input wire [7:0] s_ip_ttl, + input wire [7:0] s_ip_protocol, + input wire [15:0] s_ip_header_checksum, + input wire [31:0] s_ip_source_ip, + input wire [31:0] s_ip_dest_ip, + input wire [63:0] s_ip_payload_axis_tdata, + input wire [7:0] s_ip_payload_axis_tkeep, + input wire s_ip_payload_axis_tvalid, + output wire s_ip_payload_axis_tready, + input wire s_ip_payload_axis_tlast, + input wire s_ip_payload_axis_tuser, + + /* + * IP frame output + */ + output wire m_ip_hdr_valid, + input wire m_ip_hdr_ready, + output wire [47:0] m_ip_eth_dest_mac, + output wire [47:0] m_ip_eth_src_mac, + output wire [15:0] m_ip_eth_type, + output wire [3:0] m_ip_version, + output wire [3:0] m_ip_ihl, + output wire [5:0] m_ip_dscp, + output wire [1:0] m_ip_ecn, + output wire [15:0] m_ip_length, + output wire [15:0] m_ip_identification, + output wire [2:0] m_ip_flags, + output wire [12:0] m_ip_fragment_offset, + output wire [7:0] m_ip_ttl, + output wire [7:0] m_ip_protocol, + output wire [15:0] m_ip_header_checksum, + output wire [31:0] m_ip_source_ip, + output wire [31:0] m_ip_dest_ip, + output wire [63:0] m_ip_payload_axis_tdata, + output wire [7:0] m_ip_payload_axis_tkeep, + output wire m_ip_payload_axis_tvalid, + input wire m_ip_payload_axis_tready, + output wire m_ip_payload_axis_tlast, + output wire m_ip_payload_axis_tuser, + + /* + * UDP frame input + */ + input wire s_udp_hdr_valid, + output wire s_udp_hdr_ready, + input wire [47:0] s_udp_eth_dest_mac, + input wire [47:0] s_udp_eth_src_mac, + input wire [15:0] s_udp_eth_type, + input wire [3:0] s_udp_ip_version, + input wire [3:0] s_udp_ip_ihl, + input wire [5:0] s_udp_ip_dscp, + input wire [1:0] s_udp_ip_ecn, + input wire [15:0] s_udp_ip_identification, + input wire [2:0] s_udp_ip_flags, + input wire [12:0] s_udp_ip_fragment_offset, + input wire [7:0] s_udp_ip_ttl, + input wire [15:0] s_udp_ip_header_checksum, + input wire [31:0] s_udp_ip_source_ip, + input wire [31:0] s_udp_ip_dest_ip, + input wire [15:0] s_udp_source_port, + input wire [15:0] s_udp_dest_port, + input wire [15:0] s_udp_length, + input wire [15:0] s_udp_checksum, + input wire [63:0] s_udp_payload_axis_tdata, + input wire [7:0] s_udp_payload_axis_tkeep, + input wire s_udp_payload_axis_tvalid, + output wire s_udp_payload_axis_tready, + input wire s_udp_payload_axis_tlast, + input wire s_udp_payload_axis_tuser, + + /* + * UDP frame output + */ + output wire m_udp_hdr_valid, + input wire m_udp_hdr_ready, + output wire [47:0] m_udp_eth_dest_mac, + output wire [47:0] m_udp_eth_src_mac, + output wire [15:0] m_udp_eth_type, + output wire [3:0] m_udp_ip_version, + output wire [3:0] m_udp_ip_ihl, + output wire [5:0] m_udp_ip_dscp, + output wire [1:0] m_udp_ip_ecn, + output wire [15:0] m_udp_ip_length, + output wire [15:0] m_udp_ip_identification, + output wire [2:0] m_udp_ip_flags, + output wire [12:0] m_udp_ip_fragment_offset, + output wire [7:0] m_udp_ip_ttl, + output wire [7:0] m_udp_ip_protocol, + output wire [15:0] m_udp_ip_header_checksum, + output wire [31:0] m_udp_ip_source_ip, + output wire [31:0] m_udp_ip_dest_ip, + output wire [15:0] m_udp_source_port, + output wire [15:0] m_udp_dest_port, + output wire [15:0] m_udp_length, + output wire [15:0] m_udp_checksum, + output wire [63:0] m_udp_payload_axis_tdata, + output wire [7:0] m_udp_payload_axis_tkeep, + output wire m_udp_payload_axis_tvalid, + input wire m_udp_payload_axis_tready, + output wire m_udp_payload_axis_tlast, + output wire m_udp_payload_axis_tuser, + + /* + * Status signals + */ + output wire rx_busy, + output wire tx_busy, + output wire rx_error_header_early_termination, + output wire rx_error_payload_early_termination, + output wire tx_error_payload_early_termination +); + +wire tx_udp_hdr_valid; +wire tx_udp_hdr_ready; +wire [47:0] tx_udp_eth_dest_mac; +wire [47:0] tx_udp_eth_src_mac; +wire [15:0] tx_udp_eth_type; +wire [3:0] tx_udp_ip_version; +wire [3:0] tx_udp_ip_ihl; +wire [5:0] tx_udp_ip_dscp; +wire [1:0] tx_udp_ip_ecn; +wire [15:0] tx_udp_ip_identification; +wire [2:0] tx_udp_ip_flags; +wire [12:0] tx_udp_ip_fragment_offset; +wire [7:0] tx_udp_ip_ttl; +wire [15:0] tx_udp_ip_header_checksum; +wire [31:0] tx_udp_ip_source_ip; +wire [31:0] tx_udp_ip_dest_ip; +wire [15:0] tx_udp_source_port; +wire [15:0] tx_udp_dest_port; +wire [15:0] tx_udp_length; +wire [15:0] tx_udp_checksum; +wire [63:0] tx_udp_payload_axis_tdata; +wire [7:0] tx_udp_payload_axis_tkeep; +wire tx_udp_payload_axis_tvalid; +wire tx_udp_payload_axis_tready; +wire tx_udp_payload_axis_tlast; +wire tx_udp_payload_axis_tuser; + +udp_ip_rx_64 +udp_ip_rx_64_inst ( + .clk(clk), + .rst(rst), + // IP frame input + .s_ip_hdr_valid(s_ip_hdr_valid), + .s_ip_hdr_ready(s_ip_hdr_ready), + .s_eth_dest_mac(s_ip_eth_dest_mac), + .s_eth_src_mac(s_ip_eth_src_mac), + .s_eth_type(s_ip_eth_type), + .s_ip_version(s_ip_version), + .s_ip_ihl(s_ip_ihl), + .s_ip_dscp(s_ip_dscp), + .s_ip_ecn(s_ip_ecn), + .s_ip_length(s_ip_length), + .s_ip_identification(s_ip_identification), + .s_ip_flags(s_ip_flags), + .s_ip_fragment_offset(s_ip_fragment_offset), + .s_ip_ttl(s_ip_ttl), + .s_ip_protocol(s_ip_protocol), + .s_ip_header_checksum(s_ip_header_checksum), + .s_ip_source_ip(s_ip_source_ip), + .s_ip_dest_ip(s_ip_dest_ip), + .s_ip_payload_axis_tdata(s_ip_payload_axis_tdata), + .s_ip_payload_axis_tkeep(s_ip_payload_axis_tkeep), + .s_ip_payload_axis_tvalid(s_ip_payload_axis_tvalid), + .s_ip_payload_axis_tready(s_ip_payload_axis_tready), + .s_ip_payload_axis_tlast(s_ip_payload_axis_tlast), + .s_ip_payload_axis_tuser(s_ip_payload_axis_tuser), + // UDP frame output + .m_udp_hdr_valid(m_udp_hdr_valid), + .m_udp_hdr_ready(m_udp_hdr_ready), + .m_eth_dest_mac(m_udp_eth_dest_mac), + .m_eth_src_mac(m_udp_eth_src_mac), + .m_eth_type(m_udp_eth_type), + .m_ip_version(m_udp_ip_version), + .m_ip_ihl(m_udp_ip_ihl), + .m_ip_dscp(m_udp_ip_dscp), + .m_ip_ecn(m_udp_ip_ecn), + .m_ip_length(m_udp_ip_length), + .m_ip_identification(m_udp_ip_identification), + .m_ip_flags(m_udp_ip_flags), + .m_ip_fragment_offset(m_udp_ip_fragment_offset), + .m_ip_ttl(m_udp_ip_ttl), + .m_ip_protocol(m_udp_ip_protocol), + .m_ip_header_checksum(m_udp_ip_header_checksum), + .m_ip_source_ip(m_udp_ip_source_ip), + .m_ip_dest_ip(m_udp_ip_dest_ip), + .m_udp_source_port(m_udp_source_port), + .m_udp_dest_port(m_udp_dest_port), + .m_udp_length(m_udp_length), + .m_udp_checksum(m_udp_checksum), + .m_udp_payload_axis_tdata(m_udp_payload_axis_tdata), + .m_udp_payload_axis_tkeep(m_udp_payload_axis_tkeep), + .m_udp_payload_axis_tvalid(m_udp_payload_axis_tvalid), + .m_udp_payload_axis_tready(m_udp_payload_axis_tready), + .m_udp_payload_axis_tlast(m_udp_payload_axis_tlast), + .m_udp_payload_axis_tuser(m_udp_payload_axis_tuser), + // Status signals + .busy(rx_busy), + .error_header_early_termination(rx_error_header_early_termination), + .error_payload_early_termination(rx_error_payload_early_termination) +); + +generate + +if (CHECKSUM_GEN_ENABLE) begin + + udp_checksum_gen_64 #( + .PAYLOAD_FIFO_DEPTH(CHECKSUM_PAYLOAD_FIFO_DEPTH), + .HEADER_FIFO_DEPTH(CHECKSUM_HEADER_FIFO_DEPTH) + ) + udp_checksum_gen_64_inst ( + .clk(clk), + .rst(rst), + // UDP frame input + .s_udp_hdr_valid(s_udp_hdr_valid), + .s_udp_hdr_ready(s_udp_hdr_ready), + .s_eth_dest_mac(s_udp_eth_dest_mac), + .s_eth_src_mac(s_udp_eth_src_mac), + .s_eth_type(s_udp_eth_type), + .s_ip_version(s_udp_ip_version), + .s_ip_ihl(s_udp_ip_ihl), + .s_ip_dscp(s_udp_ip_dscp), + .s_ip_ecn(s_udp_ip_ecn), + .s_ip_identification(s_udp_ip_identification), + .s_ip_flags(s_udp_ip_flags), + .s_ip_fragment_offset(s_udp_ip_fragment_offset), + .s_ip_ttl(s_udp_ip_ttl), + .s_ip_header_checksum(s_udp_ip_header_checksum), + .s_ip_source_ip(s_udp_ip_source_ip), + .s_ip_dest_ip(s_udp_ip_dest_ip), + .s_udp_source_port(s_udp_source_port), + .s_udp_dest_port(s_udp_dest_port), + .s_udp_payload_axis_tdata(s_udp_payload_axis_tdata), + .s_udp_payload_axis_tkeep(s_udp_payload_axis_tkeep), + .s_udp_payload_axis_tvalid(s_udp_payload_axis_tvalid), + .s_udp_payload_axis_tready(s_udp_payload_axis_tready), + .s_udp_payload_axis_tlast(s_udp_payload_axis_tlast), + .s_udp_payload_axis_tuser(s_udp_payload_axis_tuser), + // UDP frame output + .m_udp_hdr_valid(tx_udp_hdr_valid), + .m_udp_hdr_ready(tx_udp_hdr_ready), + .m_eth_dest_mac(tx_udp_eth_dest_mac), + .m_eth_src_mac(tx_udp_eth_src_mac), + .m_eth_type(tx_udp_eth_type), + .m_ip_version(tx_udp_ip_version), + .m_ip_ihl(tx_udp_ip_ihl), + .m_ip_dscp(tx_udp_ip_dscp), + .m_ip_ecn(tx_udp_ip_ecn), + .m_ip_length(), + .m_ip_identification(tx_udp_ip_identification), + .m_ip_flags(tx_udp_ip_flags), + .m_ip_fragment_offset(tx_udp_ip_fragment_offset), + .m_ip_ttl(tx_udp_ip_ttl), + .m_ip_header_checksum(tx_udp_ip_header_checksum), + .m_ip_source_ip(tx_udp_ip_source_ip), + .m_ip_dest_ip(tx_udp_ip_dest_ip), + .m_udp_source_port(tx_udp_source_port), + .m_udp_dest_port(tx_udp_dest_port), + .m_udp_length(tx_udp_length), + .m_udp_checksum(tx_udp_checksum), + .m_udp_payload_axis_tdata(tx_udp_payload_axis_tdata), + .m_udp_payload_axis_tkeep(tx_udp_payload_axis_tkeep), + .m_udp_payload_axis_tvalid(tx_udp_payload_axis_tvalid), + .m_udp_payload_axis_tready(tx_udp_payload_axis_tready), + .m_udp_payload_axis_tlast(tx_udp_payload_axis_tlast), + .m_udp_payload_axis_tuser(tx_udp_payload_axis_tuser), + // Status signals + .busy() + ); + +end else begin + + assign tx_udp_hdr_valid = s_udp_hdr_valid; + assign s_udp_hdr_ready = tx_udp_hdr_ready; + assign tx_udp_eth_dest_mac = s_udp_eth_dest_mac; + assign tx_udp_eth_src_mac = s_udp_eth_src_mac; + assign tx_udp_eth_type = s_udp_eth_type; + assign tx_udp_ip_version = s_udp_ip_version; + assign tx_udp_ip_ihl = s_udp_ip_ihl; + assign tx_udp_ip_dscp = s_udp_ip_dscp; + assign tx_udp_ip_ecn = s_udp_ip_ecn; + assign tx_udp_ip_identification = s_udp_ip_identification; + assign tx_udp_ip_flags = s_udp_ip_flags; + assign tx_udp_ip_fragment_offset = s_udp_ip_fragment_offset; + assign tx_udp_ip_ttl = s_udp_ip_ttl; + assign tx_udp_ip_header_checksum = s_udp_ip_header_checksum; + assign tx_udp_ip_source_ip = s_udp_ip_source_ip; + assign tx_udp_ip_dest_ip = s_udp_ip_dest_ip; + assign tx_udp_source_port = s_udp_source_port; + assign tx_udp_dest_port = s_udp_dest_port; + assign tx_udp_length = s_udp_length; + assign tx_udp_checksum = s_udp_checksum; + assign tx_udp_payload_axis_tdata = s_udp_payload_axis_tdata; + assign tx_udp_payload_axis_tkeep = s_udp_payload_axis_tkeep; + assign tx_udp_payload_axis_tvalid = s_udp_payload_axis_tvalid; + assign s_udp_payload_axis_tready = tx_udp_payload_axis_tready; + assign tx_udp_payload_axis_tlast = s_udp_payload_axis_tlast; + assign tx_udp_payload_axis_tuser = s_udp_payload_axis_tuser; + +end + +endgenerate + +udp_ip_tx_64 +udp_ip_tx_64_inst ( + .clk(clk), + .rst(rst), + // UDP frame input + .s_udp_hdr_valid(tx_udp_hdr_valid), + .s_udp_hdr_ready(tx_udp_hdr_ready), + .s_eth_dest_mac(tx_udp_eth_dest_mac), + .s_eth_src_mac(tx_udp_eth_src_mac), + .s_eth_type(tx_udp_eth_type), + .s_ip_version(tx_udp_ip_version), + .s_ip_ihl(tx_udp_ip_ihl), + .s_ip_dscp(tx_udp_ip_dscp), + .s_ip_ecn(tx_udp_ip_ecn), + .s_ip_identification(tx_udp_ip_identification), + .s_ip_flags(tx_udp_ip_flags), + .s_ip_fragment_offset(tx_udp_ip_fragment_offset), + .s_ip_ttl(tx_udp_ip_ttl), + .s_ip_protocol(8'h11), + .s_ip_header_checksum(tx_udp_ip_header_checksum), + .s_ip_source_ip(tx_udp_ip_source_ip), + .s_ip_dest_ip(tx_udp_ip_dest_ip), + .s_udp_source_port(tx_udp_source_port), + .s_udp_dest_port(tx_udp_dest_port), + .s_udp_length(tx_udp_length), + .s_udp_checksum(tx_udp_checksum), + .s_udp_payload_axis_tdata(tx_udp_payload_axis_tdata), + .s_udp_payload_axis_tkeep(tx_udp_payload_axis_tkeep), + .s_udp_payload_axis_tvalid(tx_udp_payload_axis_tvalid), + .s_udp_payload_axis_tready(tx_udp_payload_axis_tready), + .s_udp_payload_axis_tlast(tx_udp_payload_axis_tlast), + .s_udp_payload_axis_tuser(tx_udp_payload_axis_tuser), + // IP frame output + .m_ip_hdr_valid(m_ip_hdr_valid), + .m_ip_hdr_ready(m_ip_hdr_ready), + .m_eth_dest_mac(m_ip_eth_dest_mac), + .m_eth_src_mac(m_ip_eth_src_mac), + .m_eth_type(m_ip_eth_type), + .m_ip_version(m_ip_version), + .m_ip_ihl(m_ip_ihl), + .m_ip_dscp(m_ip_dscp), + .m_ip_ecn(m_ip_ecn), + .m_ip_length(m_ip_length), + .m_ip_identification(m_ip_identification), + .m_ip_flags(m_ip_flags), + .m_ip_fragment_offset(m_ip_fragment_offset), + .m_ip_ttl(m_ip_ttl), + .m_ip_protocol(m_ip_protocol), + .m_ip_header_checksum(m_ip_header_checksum), + .m_ip_source_ip(m_ip_source_ip), + .m_ip_dest_ip(m_ip_dest_ip), + .m_ip_payload_axis_tdata(m_ip_payload_axis_tdata), + .m_ip_payload_axis_tkeep(m_ip_payload_axis_tkeep), + .m_ip_payload_axis_tvalid(m_ip_payload_axis_tvalid), + .m_ip_payload_axis_tready(m_ip_payload_axis_tready), + .m_ip_payload_axis_tlast(m_ip_payload_axis_tlast), + .m_ip_payload_axis_tuser(m_ip_payload_axis_tuser), + // Status signals + .busy(tx_busy), + .error_payload_early_termination(tx_error_payload_early_termination) +); + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_checksum_gen_64.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_checksum_gen_64.v new file mode 100755 index 0000000..ecc91e6 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_checksum_gen_64.v @@ -0,0 +1,597 @@ +/* + +Copyright (c) 2016-2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * UDP checksum calculation module (64 bit datapath) + */ +module udp_checksum_gen_64 # +( + parameter PAYLOAD_FIFO_DEPTH = 2048, + parameter HEADER_FIFO_DEPTH = 8 +) +( + input wire clk, + input wire rst, + + /* + * UDP frame input + */ + input wire s_udp_hdr_valid, + output wire s_udp_hdr_ready, + input wire [47:0] s_eth_dest_mac, + input wire [47:0] s_eth_src_mac, + input wire [15:0] s_eth_type, + input wire [3:0] s_ip_version, + input wire [3:0] s_ip_ihl, + input wire [5:0] s_ip_dscp, + input wire [1:0] s_ip_ecn, + input wire [15:0] s_ip_identification, + input wire [2:0] s_ip_flags, + input wire [12:0] s_ip_fragment_offset, + input wire [7:0] s_ip_ttl, + input wire [15:0] s_ip_header_checksum, + input wire [31:0] s_ip_source_ip, + input wire [31:0] s_ip_dest_ip, + input wire [15:0] s_udp_source_port, + input wire [15:0] s_udp_dest_port, + input wire [63:0] s_udp_payload_axis_tdata, + input wire [7:0] s_udp_payload_axis_tkeep, + input wire s_udp_payload_axis_tvalid, + output wire s_udp_payload_axis_tready, + input wire s_udp_payload_axis_tlast, + input wire s_udp_payload_axis_tuser, + + /* + * UDP frame output + */ + output wire m_udp_hdr_valid, + input wire m_udp_hdr_ready, + output wire [47:0] m_eth_dest_mac, + output wire [47:0] m_eth_src_mac, + output wire [15:0] m_eth_type, + output wire [3:0] m_ip_version, + output wire [3:0] m_ip_ihl, + output wire [5:0] m_ip_dscp, + output wire [1:0] m_ip_ecn, + output wire [15:0] m_ip_length, + output wire [15:0] m_ip_identification, + output wire [2:0] m_ip_flags, + output wire [12:0] m_ip_fragment_offset, + output wire [7:0] m_ip_ttl, + output wire [7:0] m_ip_protocol, + output wire [15:0] m_ip_header_checksum, + output wire [31:0] m_ip_source_ip, + output wire [31:0] m_ip_dest_ip, + output wire [15:0] m_udp_source_port, + output wire [15:0] m_udp_dest_port, + output wire [15:0] m_udp_length, + output wire [15:0] m_udp_checksum, + output wire [63:0] m_udp_payload_axis_tdata, + output wire [7:0] m_udp_payload_axis_tkeep, + output wire m_udp_payload_axis_tvalid, + input wire m_udp_payload_axis_tready, + output wire m_udp_payload_axis_tlast, + output wire m_udp_payload_axis_tuser, + + /* + * Status signals + */ + output wire busy +); + +/* + +UDP Frame + + Field Length + Destination MAC address 6 octets + Source MAC address 6 octets + Ethertype (0x0800) 2 octets + Version (4) 4 bits + IHL (5-15) 4 bits + DSCP (0) 6 bits + ECN (0) 2 bits + length 2 octets + identification (0?) 2 octets + flags (010) 3 bits + fragment offset (0) 13 bits + time to live (64?) 1 octet + protocol 1 octet + header checksum 2 octets + source IP 4 octets + destination IP 4 octets + options (IHL-5)*4 octets + + source port 2 octets + desination port 2 octets + length 2 octets + checksum 2 octets + + payload length octets + +This module receives a UDP frame with header fields in parallel and payload on +an AXI stream interface, calculates the length and checksum, then produces the +header fields in parallel along with the UDP payload in a separate AXI stream. + +*/ + +parameter HEADER_FIFO_ADDR_WIDTH = $clog2(HEADER_FIFO_DEPTH); + +localparam [2:0] + STATE_IDLE = 3'd0, + STATE_SUM_HEADER = 3'd1, + STATE_SUM_PAYLOAD = 3'd2, + STATE_FINISH_SUM_1 = 3'd3, + STATE_FINISH_SUM_2 = 3'd4; + +reg [2:0] state_reg = STATE_IDLE, state_next; + +// datapath control signals +reg store_udp_hdr; +reg shift_payload_in; +reg [31:0] checksum_part; + +reg [15:0] frame_ptr_reg = 16'd0, frame_ptr_next; + +reg [31:0] checksum_reg = 32'd0, checksum_next; +reg [16:0] checksum_temp1_reg = 17'd0, checksum_temp1_next; +reg [16:0] checksum_temp2_reg = 17'd0, checksum_temp2_next; + +reg [47:0] eth_dest_mac_reg = 48'd0; +reg [47:0] eth_src_mac_reg = 48'd0; +reg [15:0] eth_type_reg = 16'd0; +reg [3:0] ip_version_reg = 4'd0; +reg [3:0] ip_ihl_reg = 4'd0; +reg [5:0] ip_dscp_reg = 6'd0; +reg [1:0] ip_ecn_reg = 2'd0; +reg [15:0] ip_identification_reg = 16'd0; +reg [2:0] ip_flags_reg = 3'd0; +reg [12:0] ip_fragment_offset_reg = 13'd0; +reg [7:0] ip_ttl_reg = 8'd0; +reg [15:0] ip_header_checksum_reg = 16'd0; +reg [31:0] ip_source_ip_reg = 32'd0; +reg [31:0] ip_dest_ip_reg = 32'd0; +reg [15:0] udp_source_port_reg = 16'd0; +reg [15:0] udp_dest_port_reg = 16'd0; + +reg hdr_valid_reg = 0, hdr_valid_next; + +reg s_udp_hdr_ready_reg = 1'b0, s_udp_hdr_ready_next; +reg s_udp_payload_axis_tready_reg = 1'b0, s_udp_payload_axis_tready_next; + +reg busy_reg = 1'b0; + +/* + * UDP Payload FIFO + */ +wire [63:0] s_udp_payload_fifo_tdata; +wire [7:0] s_udp_payload_fifo_tkeep; +wire s_udp_payload_fifo_tvalid; +wire s_udp_payload_fifo_tready; +wire s_udp_payload_fifo_tlast; +wire s_udp_payload_fifo_tuser; + +wire [63:0] m_udp_payload_fifo_tdata; +wire [7:0] m_udp_payload_fifo_tkeep; +wire m_udp_payload_fifo_tvalid; +wire m_udp_payload_fifo_tready; +wire m_udp_payload_fifo_tlast; +wire m_udp_payload_fifo_tuser; + +axis_fifo #( + .DEPTH(PAYLOAD_FIFO_DEPTH), + .DATA_WIDTH(64), + .KEEP_ENABLE(1), + .KEEP_WIDTH(8), + .LAST_ENABLE(1), + .ID_ENABLE(0), + .DEST_ENABLE(0), + .USER_ENABLE(1), + .USER_WIDTH(1), + .FRAME_FIFO(0) +) +payload_fifo ( + .clk(clk), + .rst(rst), + // AXI input + .s_axis_tdata(s_udp_payload_fifo_tdata), + .s_axis_tkeep(s_udp_payload_fifo_tkeep), + .s_axis_tvalid(s_udp_payload_fifo_tvalid), + .s_axis_tready(s_udp_payload_fifo_tready), + .s_axis_tlast(s_udp_payload_fifo_tlast), + .s_axis_tid(0), + .s_axis_tdest(0), + .s_axis_tuser(s_udp_payload_fifo_tuser), + // AXI output + .m_axis_tdata(m_udp_payload_fifo_tdata), + .m_axis_tkeep(m_udp_payload_fifo_tkeep), + .m_axis_tvalid(m_udp_payload_fifo_tvalid), + .m_axis_tready(m_udp_payload_fifo_tready), + .m_axis_tlast(m_udp_payload_fifo_tlast), + .m_axis_tid(), + .m_axis_tdest(), + .m_axis_tuser(m_udp_payload_fifo_tuser), + // Status + .status_overflow(), + .status_bad_frame(), + .status_good_frame() +); + +assign s_udp_payload_fifo_tdata = s_udp_payload_axis_tdata; +assign s_udp_payload_fifo_tkeep = s_udp_payload_axis_tkeep; +assign s_udp_payload_fifo_tvalid = s_udp_payload_axis_tvalid && shift_payload_in; +assign s_udp_payload_axis_tready = s_udp_payload_fifo_tready && shift_payload_in; +assign s_udp_payload_fifo_tlast = s_udp_payload_axis_tlast; +assign s_udp_payload_fifo_tuser = s_udp_payload_axis_tuser; + +assign m_udp_payload_axis_tdata = m_udp_payload_fifo_tdata; +assign m_udp_payload_axis_tkeep = m_udp_payload_fifo_tkeep; +assign m_udp_payload_axis_tvalid = m_udp_payload_fifo_tvalid; +assign m_udp_payload_fifo_tready = m_udp_payload_axis_tready; +assign m_udp_payload_axis_tlast = m_udp_payload_fifo_tlast; +assign m_udp_payload_axis_tuser = m_udp_payload_fifo_tuser; + +/* + * UDP Header FIFO + */ +reg [HEADER_FIFO_ADDR_WIDTH:0] header_fifo_wr_ptr_reg = {HEADER_FIFO_ADDR_WIDTH+1{1'b0}}, header_fifo_wr_ptr_next; +reg [HEADER_FIFO_ADDR_WIDTH:0] header_fifo_rd_ptr_reg = {HEADER_FIFO_ADDR_WIDTH+1{1'b0}}, header_fifo_rd_ptr_next; + +reg [47:0] eth_dest_mac_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [47:0] eth_src_mac_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [15:0] eth_type_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [3:0] ip_version_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [3:0] ip_ihl_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [5:0] ip_dscp_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [1:0] ip_ecn_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [15:0] ip_identification_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [2:0] ip_flags_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [12:0] ip_fragment_offset_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [7:0] ip_ttl_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [15:0] ip_header_checksum_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [31:0] ip_source_ip_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [31:0] ip_dest_ip_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [15:0] udp_source_port_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [15:0] udp_dest_port_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [15:0] udp_length_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; +reg [15:0] udp_checksum_mem[(2**HEADER_FIFO_ADDR_WIDTH)-1:0]; + +reg [47:0] m_eth_dest_mac_reg = 48'd0; +reg [47:0] m_eth_src_mac_reg = 48'd0; +reg [15:0] m_eth_type_reg = 16'd0; +reg [3:0] m_ip_version_reg = 4'd0; +reg [3:0] m_ip_ihl_reg = 4'd0; +reg [5:0] m_ip_dscp_reg = 6'd0; +reg [1:0] m_ip_ecn_reg = 2'd0; +reg [15:0] m_ip_identification_reg = 16'd0; +reg [2:0] m_ip_flags_reg = 3'd0; +reg [12:0] m_ip_fragment_offset_reg = 13'd0; +reg [7:0] m_ip_ttl_reg = 8'd0; +reg [15:0] m_ip_header_checksum_reg = 16'd0; +reg [31:0] m_ip_source_ip_reg = 32'd0; +reg [31:0] m_ip_dest_ip_reg = 32'd0; +reg [15:0] m_udp_source_port_reg = 16'd0; +reg [15:0] m_udp_dest_port_reg = 16'd0; +reg [15:0] m_udp_length_reg = 16'd0; +reg [15:0] m_udp_checksum_reg = 16'd0; + +reg m_udp_hdr_valid_reg = 1'b0, m_udp_hdr_valid_next; + +// full when first MSB different but rest same +wire header_fifo_full = ((header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH] != header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH]) && + (header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0] == header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0])); +// empty when pointers match exactly +wire header_fifo_empty = header_fifo_wr_ptr_reg == header_fifo_rd_ptr_reg; + +// control signals +reg header_fifo_write; +reg header_fifo_read; + +wire header_fifo_ready = !header_fifo_full; + +assign m_udp_hdr_valid = m_udp_hdr_valid_reg; + +assign m_eth_dest_mac = m_eth_dest_mac_reg; +assign m_eth_src_mac = m_eth_src_mac_reg; +assign m_eth_type = m_eth_type_reg; +assign m_ip_version = m_ip_version_reg; +assign m_ip_ihl = m_ip_ihl_reg; +assign m_ip_dscp = m_ip_dscp_reg; +assign m_ip_ecn = m_ip_ecn_reg; +assign m_ip_length = m_udp_length_reg + 16'd20; +assign m_ip_identification = m_ip_identification_reg; +assign m_ip_flags = m_ip_flags_reg; +assign m_ip_fragment_offset = m_ip_fragment_offset_reg; +assign m_ip_ttl = m_ip_ttl_reg; +assign m_ip_protocol = 8'h11; +assign m_ip_header_checksum = m_ip_header_checksum_reg; +assign m_ip_source_ip = m_ip_source_ip_reg; +assign m_ip_dest_ip = m_ip_dest_ip_reg; +assign m_udp_source_port = m_udp_source_port_reg; +assign m_udp_dest_port = m_udp_dest_port_reg; +assign m_udp_length = m_udp_length_reg; +assign m_udp_checksum = m_udp_checksum_reg; + +// Write logic +always @* begin + header_fifo_write = 1'b0; + + header_fifo_wr_ptr_next = header_fifo_wr_ptr_reg; + + if (hdr_valid_reg) begin + // input data valid + if (~header_fifo_full) begin + // not full, perform write + header_fifo_write = 1'b1; + header_fifo_wr_ptr_next = header_fifo_wr_ptr_reg + 1; + end + end +end + +always @(posedge clk) begin + if (rst) begin + header_fifo_wr_ptr_reg <= {HEADER_FIFO_ADDR_WIDTH+1{1'b0}}; + end else begin + header_fifo_wr_ptr_reg <= header_fifo_wr_ptr_next; + end + + if (header_fifo_write) begin + eth_dest_mac_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= eth_dest_mac_reg; + eth_src_mac_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= eth_src_mac_reg; + eth_type_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= eth_type_reg; + ip_version_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= ip_version_reg; + ip_ihl_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= ip_ihl_reg; + ip_dscp_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= ip_dscp_reg; + ip_ecn_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= ip_ecn_reg; + ip_identification_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= ip_identification_reg; + ip_flags_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= ip_flags_reg; + ip_fragment_offset_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= ip_fragment_offset_reg; + ip_ttl_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= ip_ttl_reg; + ip_header_checksum_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= ip_header_checksum_reg; + ip_source_ip_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= ip_source_ip_reg; + ip_dest_ip_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= ip_dest_ip_reg; + udp_source_port_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= udp_source_port_reg; + udp_dest_port_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= udp_dest_port_reg; + udp_length_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= frame_ptr_reg; + udp_checksum_mem[header_fifo_wr_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]] <= checksum_reg[15:0]; + end +end + +// Read logic +always @* begin + header_fifo_read = 1'b0; + + header_fifo_rd_ptr_next = header_fifo_rd_ptr_reg; + + m_udp_hdr_valid_next = m_udp_hdr_valid_reg; + + if (m_udp_hdr_ready || !m_udp_hdr_valid) begin + // output data not valid OR currently being transferred + if (!header_fifo_empty) begin + // not empty, perform read + header_fifo_read = 1'b1; + m_udp_hdr_valid_next = 1'b1; + header_fifo_rd_ptr_next = header_fifo_rd_ptr_reg + 1; + end else begin + // empty, invalidate + m_udp_hdr_valid_next = 1'b0; + end + end +end + +always @(posedge clk) begin + if (rst) begin + header_fifo_rd_ptr_reg <= {HEADER_FIFO_ADDR_WIDTH+1{1'b0}}; + m_udp_hdr_valid_reg <= 1'b0; + end else begin + header_fifo_rd_ptr_reg <= header_fifo_rd_ptr_next; + m_udp_hdr_valid_reg <= m_udp_hdr_valid_next; + end + + if (header_fifo_read) begin + m_eth_dest_mac_reg <= eth_dest_mac_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_eth_src_mac_reg <= eth_src_mac_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_eth_type_reg <= eth_type_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_ip_version_reg <= ip_version_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_ip_ihl_reg <= ip_ihl_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_ip_dscp_reg <= ip_dscp_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_ip_ecn_reg <= ip_ecn_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_ip_identification_reg <= ip_identification_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_ip_flags_reg <= ip_flags_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_ip_fragment_offset_reg <= ip_fragment_offset_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_ip_ttl_reg <= ip_ttl_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_ip_header_checksum_reg <= ip_header_checksum_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_ip_source_ip_reg <= ip_source_ip_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_ip_dest_ip_reg <= ip_dest_ip_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_udp_source_port_reg <= udp_source_port_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_udp_dest_port_reg <= udp_dest_port_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_udp_length_reg <= udp_length_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + m_udp_checksum_reg <= udp_checksum_mem[header_fifo_rd_ptr_reg[HEADER_FIFO_ADDR_WIDTH-1:0]]; + end +end + +assign s_udp_hdr_ready = s_udp_hdr_ready_reg; + +assign busy = busy_reg; + +integer i, word_cnt; + +always @* begin + state_next = STATE_IDLE; + + s_udp_hdr_ready_next = 1'b0; + s_udp_payload_axis_tready_next = 1'b0; + + store_udp_hdr = 1'b0; + shift_payload_in = 1'b0; + + frame_ptr_next = frame_ptr_reg; + checksum_next = checksum_reg; + checksum_temp1_next = checksum_temp1_reg; + checksum_temp2_next = checksum_temp2_reg; + + hdr_valid_next = 1'b0; + + case (state_reg) + STATE_IDLE: begin + // idle state + s_udp_hdr_ready_next = header_fifo_ready; + + if (s_udp_hdr_ready && s_udp_hdr_valid) begin + store_udp_hdr = 1'b1; + frame_ptr_next = 0; + // 16'h0011 = zero padded type field + // 16'h0010 = header length times two + checksum_next = 16'h0011 + 16'h0010; + checksum_temp1_next = s_ip_source_ip[31:16]; + checksum_temp2_next = s_ip_source_ip[15:0]; + s_udp_hdr_ready_next = 1'b0; + state_next = STATE_SUM_HEADER; + end else begin + state_next = STATE_IDLE; + end + end + STATE_SUM_HEADER: begin + // sum pseudo header and header + checksum_next = checksum_reg + checksum_temp1_reg + checksum_temp2_reg; + checksum_temp1_next = ip_dest_ip_reg[31:16] + ip_dest_ip_reg[15:0]; + checksum_temp2_next = udp_source_port_reg + udp_dest_port_reg; + frame_ptr_next = 8; + state_next = STATE_SUM_PAYLOAD; + end + STATE_SUM_PAYLOAD: begin + // sum payload + shift_payload_in = 1'b1; + + if (s_udp_payload_axis_tready && s_udp_payload_axis_tvalid) begin + word_cnt = 1; + for (i = 1; i <= 8; i = i + 1) begin + if (s_udp_payload_axis_tkeep == 8'hff >> (8-i)) word_cnt = i; + end + + checksum_temp1_next = 0; + checksum_temp2_next = 0; + + for (i = 0; i < 4; i = i + 1) begin + if (s_udp_payload_axis_tkeep[i]) begin + if (i & 1) begin + checksum_temp1_next = checksum_temp1_next + {8'h00, s_udp_payload_axis_tdata[i*8 +: 8]}; + end else begin + checksum_temp1_next = checksum_temp1_next + {s_udp_payload_axis_tdata[i*8 +: 8], 8'h00}; + end + end + end + + for (i = 4; i < 8; i = i + 1) begin + if (s_udp_payload_axis_tkeep[i]) begin + if (i & 1) begin + checksum_temp2_next = checksum_temp2_next + {8'h00, s_udp_payload_axis_tdata[i*8 +: 8]}; + end else begin + checksum_temp2_next = checksum_temp2_next + {s_udp_payload_axis_tdata[i*8 +: 8], 8'h00}; + end + end + end + + // add length * 2 (two copies of length field in pseudo header) + checksum_next = checksum_reg + checksum_temp1_reg + checksum_temp2_reg + (word_cnt << 1); + + frame_ptr_next = frame_ptr_reg + word_cnt; + + if (s_udp_payload_axis_tlast) begin + state_next = STATE_FINISH_SUM_1; + end else begin + state_next = STATE_SUM_PAYLOAD; + end + end else begin + state_next = STATE_SUM_PAYLOAD; + end + end + STATE_FINISH_SUM_1: begin + // empty pipeline + checksum_next = checksum_reg + checksum_temp1_reg + checksum_temp2_reg; + state_next = STATE_FINISH_SUM_2; + end + STATE_FINISH_SUM_2: begin + // add MSW (twice!) for proper ones complement sum + checksum_part = checksum_reg[15:0] + checksum_reg[31:16]; + checksum_next = ~(checksum_part[15:0] + checksum_part[16]); + hdr_valid_next = 1; + state_next = STATE_IDLE; + end + endcase +end + +always @(posedge clk) begin + if (rst) begin + state_reg <= STATE_IDLE; + s_udp_hdr_ready_reg <= 1'b0; + s_udp_payload_axis_tready_reg <= 1'b0; + hdr_valid_reg <= 1'b0; + busy_reg <= 1'b0; + end else begin + state_reg <= state_next; + + s_udp_hdr_ready_reg <= s_udp_hdr_ready_next; + s_udp_payload_axis_tready_reg <= s_udp_payload_axis_tready_next; + + hdr_valid_reg <= hdr_valid_next; + + busy_reg <= state_next != STATE_IDLE; + end + + frame_ptr_reg <= frame_ptr_next; + checksum_reg <= checksum_next; + checksum_temp1_reg <= checksum_temp1_next; + checksum_temp2_reg <= checksum_temp2_next; + + // datapath + if (store_udp_hdr) begin + eth_dest_mac_reg <= s_eth_dest_mac; + eth_src_mac_reg <= s_eth_src_mac; + eth_type_reg <= s_eth_type; + ip_version_reg <= s_ip_version; + ip_ihl_reg <= s_ip_ihl; + ip_dscp_reg <= s_ip_dscp; + ip_ecn_reg <= s_ip_ecn; + ip_identification_reg <= s_ip_identification; + ip_flags_reg <= s_ip_flags; + ip_fragment_offset_reg <= s_ip_fragment_offset; + ip_ttl_reg <= s_ip_ttl; + ip_header_checksum_reg <= s_ip_header_checksum; + ip_source_ip_reg <= s_ip_source_ip; + ip_dest_ip_reg <= s_ip_dest_ip; + udp_source_port_reg <= s_udp_source_port; + udp_dest_port_reg <= s_udp_dest_port; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_complete_64.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_complete_64.v new file mode 100755 index 0000000..cb8e3a9 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_complete_64.v @@ -0,0 +1,661 @@ +/* + +Copyright (c) 2014-2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * IPv4 and ARP block with UDP support, ethernet frame interface (64 bit datapath) + */ +module udp_complete_64 #( + parameter ARP_CACHE_ADDR_WIDTH = 9, + parameter ARP_REQUEST_RETRY_COUNT = 4, + parameter ARP_REQUEST_RETRY_INTERVAL = 125000000*2, + parameter ARP_REQUEST_TIMEOUT = 125000000*30, + parameter UDP_CHECKSUM_GEN_ENABLE = 1, + parameter UDP_CHECKSUM_PAYLOAD_FIFO_DEPTH = 2048, + parameter UDP_CHECKSUM_HEADER_FIFO_DEPTH = 8 +) +( + input wire clk, + input wire rst, + + /* + * Ethernet frame input + */ + input wire s_eth_hdr_valid, + output wire s_eth_hdr_ready, + input wire [47:0] s_eth_dest_mac, + input wire [47:0] s_eth_src_mac, + input wire [15:0] s_eth_type, + input wire [63:0] s_eth_payload_axis_tdata, + input wire [7:0] s_eth_payload_axis_tkeep, + input wire s_eth_payload_axis_tvalid, + output wire s_eth_payload_axis_tready, + input wire s_eth_payload_axis_tlast, + input wire s_eth_payload_axis_tuser, + + /* + * Ethernet frame output + */ + output wire m_eth_hdr_valid, + input wire m_eth_hdr_ready, + output wire [47:0] m_eth_dest_mac, + output wire [47:0] m_eth_src_mac, + output wire [15:0] m_eth_type, + output wire [63:0] m_eth_payload_axis_tdata, + output wire [7:0] m_eth_payload_axis_tkeep, + output wire m_eth_payload_axis_tvalid, + input wire m_eth_payload_axis_tready, + output wire m_eth_payload_axis_tlast, + output wire m_eth_payload_axis_tuser, + + /* + * IP input + */ + input wire s_ip_hdr_valid, + output wire s_ip_hdr_ready, + input wire [5:0] s_ip_dscp, + input wire [1:0] s_ip_ecn, + input wire [15:0] s_ip_length, + input wire [7:0] s_ip_ttl, + input wire [7:0] s_ip_protocol, + input wire [31:0] s_ip_source_ip, + input wire [31:0] s_ip_dest_ip, + input wire [63:0] s_ip_payload_axis_tdata, + input wire [7:0] s_ip_payload_axis_tkeep, + input wire s_ip_payload_axis_tvalid, + output wire s_ip_payload_axis_tready, + input wire s_ip_payload_axis_tlast, + input wire s_ip_payload_axis_tuser, + + /* + * IP output + */ + output wire m_ip_hdr_valid, + input wire m_ip_hdr_ready, + output wire [47:0] m_ip_eth_dest_mac, + output wire [47:0] m_ip_eth_src_mac, + output wire [15:0] m_ip_eth_type, + output wire [3:0] m_ip_version, + output wire [3:0] m_ip_ihl, + output wire [5:0] m_ip_dscp, + output wire [1:0] m_ip_ecn, + output wire [15:0] m_ip_length, + output wire [15:0] m_ip_identification, + output wire [2:0] m_ip_flags, + output wire [12:0] m_ip_fragment_offset, + output wire [7:0] m_ip_ttl, + output wire [7:0] m_ip_protocol, + output wire [15:0] m_ip_header_checksum, + output wire [31:0] m_ip_source_ip, + output wire [31:0] m_ip_dest_ip, + output wire [63:0] m_ip_payload_axis_tdata, + output wire [7:0] m_ip_payload_axis_tkeep, + output wire m_ip_payload_axis_tvalid, + input wire m_ip_payload_axis_tready, + output wire m_ip_payload_axis_tlast, + output wire m_ip_payload_axis_tuser, + + /* + * UDP input + */ + input wire s_udp_hdr_valid, + output wire s_udp_hdr_ready, + input wire [5:0] s_udp_ip_dscp, + input wire [1:0] s_udp_ip_ecn, + input wire [7:0] s_udp_ip_ttl, + input wire [31:0] s_udp_ip_source_ip, + input wire [31:0] s_udp_ip_dest_ip, + input wire [15:0] s_udp_source_port, + input wire [15:0] s_udp_dest_port, + input wire [15:0] s_udp_length, + input wire [15:0] s_udp_checksum, + input wire [63:0] s_udp_payload_axis_tdata, + input wire [7:0] s_udp_payload_axis_tkeep, + input wire s_udp_payload_axis_tvalid, + output wire s_udp_payload_axis_tready, + input wire s_udp_payload_axis_tlast, + input wire s_udp_payload_axis_tuser, + + /* + * UDP output + */ + output wire m_udp_hdr_valid, + input wire m_udp_hdr_ready, + output wire [47:0] m_udp_eth_dest_mac, + output wire [47:0] m_udp_eth_src_mac, + output wire [15:0] m_udp_eth_type, + output wire [3:0] m_udp_ip_version, + output wire [3:0] m_udp_ip_ihl, + output wire [5:0] m_udp_ip_dscp, + output wire [1:0] m_udp_ip_ecn, + output wire [15:0] m_udp_ip_length, + output wire [15:0] m_udp_ip_identification, + output wire [2:0] m_udp_ip_flags, + output wire [12:0] m_udp_ip_fragment_offset, + output wire [7:0] m_udp_ip_ttl, + output wire [7:0] m_udp_ip_protocol, + output wire [15:0] m_udp_ip_header_checksum, + output wire [31:0] m_udp_ip_source_ip, + output wire [31:0] m_udp_ip_dest_ip, + output wire [15:0] m_udp_source_port, + output wire [15:0] m_udp_dest_port, + output wire [15:0] m_udp_length, + output wire [15:0] m_udp_checksum, + output wire [63:0] m_udp_payload_axis_tdata, + output wire [7:0] m_udp_payload_axis_tkeep, + output wire m_udp_payload_axis_tvalid, + input wire m_udp_payload_axis_tready, + output wire m_udp_payload_axis_tlast, + output wire m_udp_payload_axis_tuser, + + /* + * Status + */ + output wire ip_rx_busy, + output wire ip_tx_busy, + output wire udp_rx_busy, + output wire udp_tx_busy, + output wire ip_rx_error_header_early_termination, + output wire ip_rx_error_payload_early_termination, + output wire ip_rx_error_invalid_header, + output wire ip_rx_error_invalid_checksum, + output wire ip_tx_error_payload_early_termination, + output wire ip_tx_error_arp_failed, + output wire udp_rx_error_header_early_termination, + output wire udp_rx_error_payload_early_termination, + output wire udp_tx_error_payload_early_termination, + + /* + * Configuration + */ + input wire [47:0] local_mac, + input wire [31:0] local_ip, + input wire [31:0] gateway_ip, + input wire [31:0] subnet_mask, + input wire clear_arp_cache +); + +wire ip_rx_ip_hdr_valid; +wire ip_rx_ip_hdr_ready; +wire [47:0] ip_rx_ip_eth_dest_mac; +wire [47:0] ip_rx_ip_eth_src_mac; +wire [15:0] ip_rx_ip_eth_type; +wire [3:0] ip_rx_ip_version; +wire [3:0] ip_rx_ip_ihl; +wire [5:0] ip_rx_ip_dscp; +wire [1:0] ip_rx_ip_ecn; +wire [15:0] ip_rx_ip_length; +wire [15:0] ip_rx_ip_identification; +wire [2:0] ip_rx_ip_flags; +wire [12:0] ip_rx_ip_fragment_offset; +wire [7:0] ip_rx_ip_ttl; +wire [7:0] ip_rx_ip_protocol; +wire [15:0] ip_rx_ip_header_checksum; +wire [31:0] ip_rx_ip_source_ip; +wire [31:0] ip_rx_ip_dest_ip; +wire [63:0] ip_rx_ip_payload_axis_tdata; +wire [7:0] ip_rx_ip_payload_axis_tkeep; +wire ip_rx_ip_payload_axis_tvalid; +wire ip_rx_ip_payload_axis_tlast; +wire ip_rx_ip_payload_axis_tuser; +wire ip_rx_ip_payload_axis_tready; + +wire ip_tx_ip_hdr_valid; +wire ip_tx_ip_hdr_ready; +wire [5:0] ip_tx_ip_dscp; +wire [1:0] ip_tx_ip_ecn; +wire [15:0] ip_tx_ip_length; +wire [7:0] ip_tx_ip_ttl; +wire [7:0] ip_tx_ip_protocol; +wire [31:0] ip_tx_ip_source_ip; +wire [31:0] ip_tx_ip_dest_ip; +wire [63:0] ip_tx_ip_payload_axis_tdata; +wire [7:0] ip_tx_ip_payload_axis_tkeep; +wire ip_tx_ip_payload_axis_tvalid; +wire ip_tx_ip_payload_axis_tlast; +wire ip_tx_ip_payload_axis_tuser; +wire ip_tx_ip_payload_axis_tready; + +wire udp_rx_ip_hdr_valid; +wire udp_rx_ip_hdr_ready; +wire [47:0] udp_rx_ip_eth_dest_mac; +wire [47:0] udp_rx_ip_eth_src_mac; +wire [15:0] udp_rx_ip_eth_type; +wire [3:0] udp_rx_ip_version; +wire [3:0] udp_rx_ip_ihl; +wire [5:0] udp_rx_ip_dscp; +wire [1:0] udp_rx_ip_ecn; +wire [15:0] udp_rx_ip_length; +wire [15:0] udp_rx_ip_identification; +wire [2:0] udp_rx_ip_flags; +wire [12:0] udp_rx_ip_fragment_offset; +wire [7:0] udp_rx_ip_ttl; +wire [7:0] udp_rx_ip_protocol; +wire [15:0] udp_rx_ip_header_checksum; +wire [31:0] udp_rx_ip_source_ip; +wire [31:0] udp_rx_ip_dest_ip; +wire [63:0] udp_rx_ip_payload_axis_tdata; +wire [7:0] udp_rx_ip_payload_axis_tkeep; +wire udp_rx_ip_payload_axis_tvalid; +wire udp_rx_ip_payload_axis_tlast; +wire udp_rx_ip_payload_axis_tuser; +wire udp_rx_ip_payload_axis_tready; + +wire udp_tx_ip_hdr_valid; +wire udp_tx_ip_hdr_ready; +wire [5:0] udp_tx_ip_dscp; +wire [1:0] udp_tx_ip_ecn; +wire [15:0] udp_tx_ip_length; +wire [7:0] udp_tx_ip_ttl; +wire [7:0] udp_tx_ip_protocol; +wire [31:0] udp_tx_ip_source_ip; +wire [31:0] udp_tx_ip_dest_ip; +wire [63:0] udp_tx_ip_payload_axis_tdata; +wire [7:0] udp_tx_ip_payload_axis_tkeep; +wire udp_tx_ip_payload_axis_tvalid; +wire udp_tx_ip_payload_axis_tlast; +wire udp_tx_ip_payload_axis_tuser; +wire udp_tx_ip_payload_axis_tready; + +/* + * Input classifier (ip_protocol) + */ +wire s_select_udp = (ip_rx_ip_protocol == 8'h11); +wire s_select_ip = !s_select_udp; + +reg s_select_udp_reg = 1'b0; +reg s_select_ip_reg = 1'b0; + +always @(posedge clk) begin + if (rst) begin + s_select_udp_reg <= 1'b0; + s_select_ip_reg <= 1'b0; + end else begin + if (ip_rx_ip_payload_axis_tvalid) begin + if ((!s_select_udp_reg && !s_select_ip_reg) || + (ip_rx_ip_payload_axis_tvalid && ip_rx_ip_payload_axis_tready && ip_rx_ip_payload_axis_tlast)) begin + s_select_udp_reg <= s_select_udp; + s_select_ip_reg <= s_select_ip; + end + end else begin + s_select_udp_reg <= 1'b0; + s_select_ip_reg <= 1'b0; + end + end +end + +// IP frame to UDP module +assign udp_rx_ip_hdr_valid = s_select_udp && ip_rx_ip_hdr_valid; +assign udp_rx_ip_eth_dest_mac = ip_rx_ip_eth_dest_mac; +assign udp_rx_ip_eth_src_mac = ip_rx_ip_eth_src_mac; +assign udp_rx_ip_eth_type = ip_rx_ip_eth_type; +assign udp_rx_ip_version = ip_rx_ip_version; +assign udp_rx_ip_ihl = ip_rx_ip_ihl; +assign udp_rx_ip_dscp = ip_rx_ip_dscp; +assign udp_rx_ip_ecn = ip_rx_ip_ecn; +assign udp_rx_ip_length = ip_rx_ip_length; +assign udp_rx_ip_identification = ip_rx_ip_identification; +assign udp_rx_ip_flags = ip_rx_ip_flags; +assign udp_rx_ip_fragment_offset = ip_rx_ip_fragment_offset; +assign udp_rx_ip_ttl = ip_rx_ip_ttl; +assign udp_rx_ip_protocol = 8'h11; +assign udp_rx_ip_header_checksum = ip_rx_ip_header_checksum; +assign udp_rx_ip_source_ip = ip_rx_ip_source_ip; +assign udp_rx_ip_dest_ip = ip_rx_ip_dest_ip; +assign udp_rx_ip_payload_axis_tdata = ip_rx_ip_payload_axis_tdata; +assign udp_rx_ip_payload_axis_tkeep = ip_rx_ip_payload_axis_tkeep; +assign udp_rx_ip_payload_axis_tvalid = s_select_udp_reg && ip_rx_ip_payload_axis_tvalid; +assign udp_rx_ip_payload_axis_tlast = ip_rx_ip_payload_axis_tlast; +assign udp_rx_ip_payload_axis_tuser = ip_rx_ip_payload_axis_tuser; + +// External IP frame output +assign m_ip_hdr_valid = s_select_ip && ip_rx_ip_hdr_valid; +assign m_ip_eth_dest_mac = ip_rx_ip_eth_dest_mac; +assign m_ip_eth_src_mac = ip_rx_ip_eth_src_mac; +assign m_ip_eth_type = ip_rx_ip_eth_type; +assign m_ip_version = ip_rx_ip_version; +assign m_ip_ihl = ip_rx_ip_ihl; +assign m_ip_dscp = ip_rx_ip_dscp; +assign m_ip_ecn = ip_rx_ip_ecn; +assign m_ip_length = ip_rx_ip_length; +assign m_ip_identification = ip_rx_ip_identification; +assign m_ip_flags = ip_rx_ip_flags; +assign m_ip_fragment_offset = ip_rx_ip_fragment_offset; +assign m_ip_ttl = ip_rx_ip_ttl; +assign m_ip_protocol = ip_rx_ip_protocol; +assign m_ip_header_checksum = ip_rx_ip_header_checksum; +assign m_ip_source_ip = ip_rx_ip_source_ip; +assign m_ip_dest_ip = ip_rx_ip_dest_ip; +assign m_ip_payload_axis_tdata = ip_rx_ip_payload_axis_tdata; +assign m_ip_payload_axis_tkeep = ip_rx_ip_payload_axis_tkeep; +assign m_ip_payload_axis_tvalid = s_select_ip_reg && ip_rx_ip_payload_axis_tvalid; +assign m_ip_payload_axis_tlast = ip_rx_ip_payload_axis_tlast; +assign m_ip_payload_axis_tuser = ip_rx_ip_payload_axis_tuser; + +assign ip_rx_ip_hdr_ready = (s_select_udp && udp_rx_ip_hdr_ready) || + (s_select_ip && m_ip_hdr_ready); + +assign ip_rx_ip_payload_axis_tready = (s_select_udp_reg && udp_rx_ip_payload_axis_tready) || + (s_select_ip_reg && m_ip_payload_axis_tready); + +/* + * Output arbiter + */ +ip_arb_mux #( + .S_COUNT(2), + .DATA_WIDTH(64), + .KEEP_ENABLE(1), + .ID_ENABLE(0), + .DEST_ENABLE(0), + .USER_ENABLE(1), + .USER_WIDTH(1), + .ARB_TYPE_ROUND_ROBIN(0), + .ARB_LSB_HIGH_PRIORITY(1) +) +ip_arb_mux_inst ( + .clk(clk), + .rst(rst), + // IP frame inputs + .s_ip_hdr_valid({s_ip_hdr_valid, udp_tx_ip_hdr_valid}), + .s_ip_hdr_ready({s_ip_hdr_ready, udp_tx_ip_hdr_ready}), + .s_eth_dest_mac(0), + .s_eth_src_mac(0), + .s_eth_type(0), + .s_ip_version(0), + .s_ip_ihl(0), + .s_ip_dscp({s_ip_dscp, udp_tx_ip_dscp}), + .s_ip_ecn({s_ip_ecn, udp_tx_ip_ecn}), + .s_ip_length({s_ip_length, udp_tx_ip_length}), + .s_ip_identification(0), + .s_ip_flags(0), + .s_ip_fragment_offset(0), + .s_ip_ttl({s_ip_ttl, udp_tx_ip_ttl}), + .s_ip_protocol({s_ip_protocol, udp_tx_ip_protocol}), + .s_ip_header_checksum(0), + .s_ip_source_ip({s_ip_source_ip, udp_tx_ip_source_ip}), + .s_ip_dest_ip({s_ip_dest_ip, udp_tx_ip_dest_ip}), + .s_ip_payload_axis_tdata({s_ip_payload_axis_tdata, udp_tx_ip_payload_axis_tdata}), + .s_ip_payload_axis_tkeep({s_ip_payload_axis_tkeep, udp_tx_ip_payload_axis_tkeep}), + .s_ip_payload_axis_tvalid({s_ip_payload_axis_tvalid, udp_tx_ip_payload_axis_tvalid}), + .s_ip_payload_axis_tready({s_ip_payload_axis_tready, udp_tx_ip_payload_axis_tready}), + .s_ip_payload_axis_tlast({s_ip_payload_axis_tlast, udp_tx_ip_payload_axis_tlast}), + .s_ip_payload_axis_tid(0), + .s_ip_payload_axis_tdest(0), + .s_ip_payload_axis_tuser({s_ip_payload_axis_tuser, udp_tx_ip_payload_axis_tuser}), + // IP frame output + .m_ip_hdr_valid(ip_tx_ip_hdr_valid), + .m_ip_hdr_ready(ip_tx_ip_hdr_ready), + .m_eth_dest_mac(), + .m_eth_src_mac(), + .m_eth_type(), + .m_ip_version(), + .m_ip_ihl(), + .m_ip_dscp(ip_tx_ip_dscp), + .m_ip_ecn(ip_tx_ip_ecn), + .m_ip_length(ip_tx_ip_length), + .m_ip_identification(), + .m_ip_flags(), + .m_ip_fragment_offset(), + .m_ip_ttl(ip_tx_ip_ttl), + .m_ip_protocol(ip_tx_ip_protocol), + .m_ip_header_checksum(), + .m_ip_source_ip(ip_tx_ip_source_ip), + .m_ip_dest_ip(ip_tx_ip_dest_ip), + .m_ip_payload_axis_tdata(ip_tx_ip_payload_axis_tdata), + .m_ip_payload_axis_tkeep(ip_tx_ip_payload_axis_tkeep), + .m_ip_payload_axis_tvalid(ip_tx_ip_payload_axis_tvalid), + .m_ip_payload_axis_tready(ip_tx_ip_payload_axis_tready), + .m_ip_payload_axis_tlast(ip_tx_ip_payload_axis_tlast), + .m_ip_payload_axis_tid(), + .m_ip_payload_axis_tdest(), + .m_ip_payload_axis_tuser(ip_tx_ip_payload_axis_tuser) +); + +/* + * IP stack + */ +ip_complete_64 #( + .ARP_CACHE_ADDR_WIDTH(ARP_CACHE_ADDR_WIDTH), + .ARP_REQUEST_RETRY_COUNT(ARP_REQUEST_RETRY_COUNT), + .ARP_REQUEST_RETRY_INTERVAL(ARP_REQUEST_RETRY_INTERVAL), + .ARP_REQUEST_TIMEOUT(ARP_REQUEST_TIMEOUT) +) +ip_complete_64_inst ( + .clk(clk), + .rst(rst), + // Ethernet frame input + .s_eth_hdr_valid(s_eth_hdr_valid), + .s_eth_hdr_ready(s_eth_hdr_ready), + .s_eth_dest_mac(s_eth_dest_mac), + .s_eth_src_mac(s_eth_src_mac), + .s_eth_type(s_eth_type), + .s_eth_payload_axis_tdata(s_eth_payload_axis_tdata), + .s_eth_payload_axis_tkeep(s_eth_payload_axis_tkeep), + .s_eth_payload_axis_tvalid(s_eth_payload_axis_tvalid), + .s_eth_payload_axis_tready(s_eth_payload_axis_tready), + .s_eth_payload_axis_tlast(s_eth_payload_axis_tlast), + .s_eth_payload_axis_tuser(s_eth_payload_axis_tuser), + // Ethernet frame output + .m_eth_hdr_valid(m_eth_hdr_valid), + .m_eth_hdr_ready(m_eth_hdr_ready), + .m_eth_dest_mac(m_eth_dest_mac), + .m_eth_src_mac(m_eth_src_mac), + .m_eth_type(m_eth_type), + .m_eth_payload_axis_tdata(m_eth_payload_axis_tdata), + .m_eth_payload_axis_tkeep(m_eth_payload_axis_tkeep), + .m_eth_payload_axis_tvalid(m_eth_payload_axis_tvalid), + .m_eth_payload_axis_tready(m_eth_payload_axis_tready), + .m_eth_payload_axis_tlast(m_eth_payload_axis_tlast), + .m_eth_payload_axis_tuser(m_eth_payload_axis_tuser), + // IP frame input + .s_ip_hdr_valid(ip_tx_ip_hdr_valid), + .s_ip_hdr_ready(ip_tx_ip_hdr_ready), + .s_ip_dscp(ip_tx_ip_dscp), + .s_ip_ecn(ip_tx_ip_ecn), + .s_ip_length(ip_tx_ip_length), + .s_ip_ttl(ip_tx_ip_ttl), + .s_ip_protocol(ip_tx_ip_protocol), + .s_ip_source_ip(ip_tx_ip_source_ip), + .s_ip_dest_ip(ip_tx_ip_dest_ip), + .s_ip_payload_axis_tdata(ip_tx_ip_payload_axis_tdata), + .s_ip_payload_axis_tkeep(ip_tx_ip_payload_axis_tkeep), + .s_ip_payload_axis_tvalid(ip_tx_ip_payload_axis_tvalid), + .s_ip_payload_axis_tready(ip_tx_ip_payload_axis_tready), + .s_ip_payload_axis_tlast(ip_tx_ip_payload_axis_tlast), + .s_ip_payload_axis_tuser(ip_tx_ip_payload_axis_tuser), + // IP frame output + .m_ip_hdr_valid(ip_rx_ip_hdr_valid), + .m_ip_hdr_ready(ip_rx_ip_hdr_ready), + .m_ip_eth_dest_mac(ip_rx_ip_eth_dest_mac), + .m_ip_eth_src_mac(ip_rx_ip_eth_src_mac), + .m_ip_eth_type(ip_rx_ip_eth_type), + .m_ip_version(ip_rx_ip_version), + .m_ip_ihl(ip_rx_ip_ihl), + .m_ip_dscp(ip_rx_ip_dscp), + .m_ip_ecn(ip_rx_ip_ecn), + .m_ip_length(ip_rx_ip_length), + .m_ip_identification(ip_rx_ip_identification), + .m_ip_flags(ip_rx_ip_flags), + .m_ip_fragment_offset(ip_rx_ip_fragment_offset), + .m_ip_ttl(ip_rx_ip_ttl), + .m_ip_protocol(ip_rx_ip_protocol), + .m_ip_header_checksum(ip_rx_ip_header_checksum), + .m_ip_source_ip(ip_rx_ip_source_ip), + .m_ip_dest_ip(ip_rx_ip_dest_ip), + .m_ip_payload_axis_tdata(ip_rx_ip_payload_axis_tdata), + .m_ip_payload_axis_tkeep(ip_rx_ip_payload_axis_tkeep), + .m_ip_payload_axis_tvalid(ip_rx_ip_payload_axis_tvalid), + .m_ip_payload_axis_tready(ip_rx_ip_payload_axis_tready), + .m_ip_payload_axis_tlast(ip_rx_ip_payload_axis_tlast), + .m_ip_payload_axis_tuser(ip_rx_ip_payload_axis_tuser), + // Status + .rx_busy(ip_rx_busy), + .tx_busy(ip_tx_busy), + .rx_error_header_early_termination(ip_rx_error_header_early_termination), + .rx_error_payload_early_termination(ip_rx_error_payload_early_termination), + .rx_error_invalid_header(ip_rx_error_invalid_header), + .rx_error_invalid_checksum(ip_rx_error_invalid_checksum), + .tx_error_payload_early_termination(ip_tx_error_payload_early_termination), + .tx_error_arp_failed(ip_tx_error_arp_failed), + // Configuration + .local_mac(local_mac), + .local_ip(local_ip), + .gateway_ip(gateway_ip), + .subnet_mask(subnet_mask), + .clear_arp_cache(clear_arp_cache) +); + +/* + * UDP interface + */ +udp_64 #( + .CHECKSUM_GEN_ENABLE(UDP_CHECKSUM_GEN_ENABLE), + .CHECKSUM_PAYLOAD_FIFO_DEPTH(UDP_CHECKSUM_PAYLOAD_FIFO_DEPTH), + .CHECKSUM_HEADER_FIFO_DEPTH(UDP_CHECKSUM_HEADER_FIFO_DEPTH) +) +udp_64_inst ( + .clk(clk), + .rst(rst), + // IP frame input + .s_ip_hdr_valid(udp_rx_ip_hdr_valid), + .s_ip_hdr_ready(udp_rx_ip_hdr_ready), + .s_ip_eth_dest_mac(udp_rx_ip_eth_dest_mac), + .s_ip_eth_src_mac(udp_rx_ip_eth_src_mac), + .s_ip_eth_type(udp_rx_ip_eth_type), + .s_ip_version(udp_rx_ip_version), + .s_ip_ihl(udp_rx_ip_ihl), + .s_ip_dscp(udp_rx_ip_dscp), + .s_ip_ecn(udp_rx_ip_ecn), + .s_ip_length(udp_rx_ip_length), + .s_ip_identification(udp_rx_ip_identification), + .s_ip_flags(udp_rx_ip_flags), + .s_ip_fragment_offset(udp_rx_ip_fragment_offset), + .s_ip_ttl(udp_rx_ip_ttl), + .s_ip_protocol(udp_rx_ip_protocol), + .s_ip_header_checksum(udp_rx_ip_header_checksum), + .s_ip_source_ip(udp_rx_ip_source_ip), + .s_ip_dest_ip(udp_rx_ip_dest_ip), + .s_ip_payload_axis_tdata(udp_rx_ip_payload_axis_tdata), + .s_ip_payload_axis_tkeep(udp_rx_ip_payload_axis_tkeep), + .s_ip_payload_axis_tvalid(udp_rx_ip_payload_axis_tvalid), + .s_ip_payload_axis_tready(udp_rx_ip_payload_axis_tready), + .s_ip_payload_axis_tlast(udp_rx_ip_payload_axis_tlast), + .s_ip_payload_axis_tuser(udp_rx_ip_payload_axis_tuser), + // IP frame output + .m_ip_hdr_valid(udp_tx_ip_hdr_valid), + .m_ip_hdr_ready(udp_tx_ip_hdr_ready), + .m_ip_eth_dest_mac(), + .m_ip_eth_src_mac(), + .m_ip_eth_type(), + .m_ip_version(), + .m_ip_ihl(), + .m_ip_dscp(udp_tx_ip_dscp), + .m_ip_ecn(udp_tx_ip_ecn), + .m_ip_length(udp_tx_ip_length), + .m_ip_identification(), + .m_ip_flags(), + .m_ip_fragment_offset(), + .m_ip_ttl(udp_tx_ip_ttl), + .m_ip_protocol(udp_tx_ip_protocol), + .m_ip_header_checksum(), + .m_ip_source_ip(udp_tx_ip_source_ip), + .m_ip_dest_ip(udp_tx_ip_dest_ip), + .m_ip_payload_axis_tdata(udp_tx_ip_payload_axis_tdata), + .m_ip_payload_axis_tkeep(udp_tx_ip_payload_axis_tkeep), + .m_ip_payload_axis_tvalid(udp_tx_ip_payload_axis_tvalid), + .m_ip_payload_axis_tready(udp_tx_ip_payload_axis_tready), + .m_ip_payload_axis_tlast(udp_tx_ip_payload_axis_tlast), + .m_ip_payload_axis_tuser(udp_tx_ip_payload_axis_tuser), + // UDP frame input + .s_udp_hdr_valid(s_udp_hdr_valid), + .s_udp_hdr_ready(s_udp_hdr_ready), + .s_udp_eth_dest_mac(48'd0), + .s_udp_eth_src_mac(48'd0), + .s_udp_eth_type(16'd0), + .s_udp_ip_version(4'd0), + .s_udp_ip_ihl(4'd0), + .s_udp_ip_dscp(s_udp_ip_dscp), + .s_udp_ip_ecn(s_udp_ip_ecn), + .s_udp_ip_identification(16'd0), + .s_udp_ip_flags(3'd0), + .s_udp_ip_fragment_offset(13'd0), + .s_udp_ip_ttl(s_udp_ip_ttl), + .s_udp_ip_header_checksum(16'd0), + .s_udp_ip_source_ip(s_udp_ip_source_ip), + .s_udp_ip_dest_ip(s_udp_ip_dest_ip), + .s_udp_source_port(s_udp_source_port), + .s_udp_dest_port(s_udp_dest_port), + .s_udp_length(s_udp_length), + .s_udp_checksum(s_udp_checksum), + .s_udp_payload_axis_tdata(s_udp_payload_axis_tdata), + .s_udp_payload_axis_tkeep(s_udp_payload_axis_tkeep), + .s_udp_payload_axis_tvalid(s_udp_payload_axis_tvalid), + .s_udp_payload_axis_tready(s_udp_payload_axis_tready), + .s_udp_payload_axis_tlast(s_udp_payload_axis_tlast), + .s_udp_payload_axis_tuser(s_udp_payload_axis_tuser), + // UDP frame output + .m_udp_hdr_valid(m_udp_hdr_valid), + .m_udp_hdr_ready(m_udp_hdr_ready), + .m_udp_eth_dest_mac(m_udp_eth_dest_mac), + .m_udp_eth_src_mac(m_udp_eth_src_mac), + .m_udp_eth_type(m_udp_eth_type), + .m_udp_ip_version(m_udp_ip_version), + .m_udp_ip_ihl(m_udp_ip_ihl), + .m_udp_ip_dscp(m_udp_ip_dscp), + .m_udp_ip_ecn(m_udp_ip_ecn), + .m_udp_ip_length(m_udp_ip_length), + .m_udp_ip_identification(m_udp_ip_identification), + .m_udp_ip_flags(m_udp_ip_flags), + .m_udp_ip_fragment_offset(m_udp_ip_fragment_offset), + .m_udp_ip_ttl(m_udp_ip_ttl), + .m_udp_ip_protocol(m_udp_ip_protocol), + .m_udp_ip_header_checksum(m_udp_ip_header_checksum), + .m_udp_ip_source_ip(m_udp_ip_source_ip), + .m_udp_ip_dest_ip(m_udp_ip_dest_ip), + .m_udp_source_port(m_udp_source_port), + .m_udp_dest_port(m_udp_dest_port), + .m_udp_length(m_udp_length), + .m_udp_checksum(m_udp_checksum), + .m_udp_payload_axis_tdata(m_udp_payload_axis_tdata), + .m_udp_payload_axis_tkeep(m_udp_payload_axis_tkeep), + .m_udp_payload_axis_tvalid(m_udp_payload_axis_tvalid), + .m_udp_payload_axis_tready(m_udp_payload_axis_tready), + .m_udp_payload_axis_tlast(m_udp_payload_axis_tlast), + .m_udp_payload_axis_tuser(m_udp_payload_axis_tuser), + // Status + .rx_busy(udp_rx_busy), + .tx_busy(udp_tx_busy), + .rx_error_header_early_termination(udp_rx_error_header_early_termination), + .rx_error_payload_early_termination(udp_rx_error_payload_early_termination), + .tx_error_payload_early_termination(udp_tx_error_payload_early_termination) +); + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_ip_rx_64.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_ip_rx_64.v new file mode 100755 index 0000000..5c583d9 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_ip_rx_64.v @@ -0,0 +1,564 @@ +/* + +Copyright (c) 2014-2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * UDP ethernet frame receiver (IP frame in, UDP frame out, 64 bit datapath) + */ +module udp_ip_rx_64 +( + input wire clk, + input wire rst, + + /* + * IP frame input + */ + input wire s_ip_hdr_valid, + output wire s_ip_hdr_ready, + input wire [47:0] s_eth_dest_mac, + input wire [47:0] s_eth_src_mac, + input wire [15:0] s_eth_type, + input wire [3:0] s_ip_version, + input wire [3:0] s_ip_ihl, + input wire [5:0] s_ip_dscp, + input wire [1:0] s_ip_ecn, + input wire [15:0] s_ip_length, + input wire [15:0] s_ip_identification, + input wire [2:0] s_ip_flags, + input wire [12:0] s_ip_fragment_offset, + input wire [7:0] s_ip_ttl, + input wire [7:0] s_ip_protocol, + input wire [15:0] s_ip_header_checksum, + input wire [31:0] s_ip_source_ip, + input wire [31:0] s_ip_dest_ip, + input wire [63:0] s_ip_payload_axis_tdata, + input wire [7:0] s_ip_payload_axis_tkeep, + input wire s_ip_payload_axis_tvalid, + output wire s_ip_payload_axis_tready, + input wire s_ip_payload_axis_tlast, + input wire s_ip_payload_axis_tuser, + + /* + * UDP frame output + */ + output wire m_udp_hdr_valid, + input wire m_udp_hdr_ready, + output wire [47:0] m_eth_dest_mac, + output wire [47:0] m_eth_src_mac, + output wire [15:0] m_eth_type, + output wire [3:0] m_ip_version, + output wire [3:0] m_ip_ihl, + output wire [5:0] m_ip_dscp, + output wire [1:0] m_ip_ecn, + output wire [15:0] m_ip_length, + output wire [15:0] m_ip_identification, + output wire [2:0] m_ip_flags, + output wire [12:0] m_ip_fragment_offset, + output wire [7:0] m_ip_ttl, + output wire [7:0] m_ip_protocol, + output wire [15:0] m_ip_header_checksum, + output wire [31:0] m_ip_source_ip, + output wire [31:0] m_ip_dest_ip, + output wire [15:0] m_udp_source_port, + output wire [15:0] m_udp_dest_port, + output wire [15:0] m_udp_length, + output wire [15:0] m_udp_checksum, + output wire [63:0] m_udp_payload_axis_tdata, + output wire [7:0] m_udp_payload_axis_tkeep, + output wire m_udp_payload_axis_tvalid, + input wire m_udp_payload_axis_tready, + output wire m_udp_payload_axis_tlast, + output wire m_udp_payload_axis_tuser, + + /* + * Status signals + */ + output wire busy, + output wire error_header_early_termination, + output wire error_payload_early_termination +); + +/* + +UDP Frame + + Field Length + Destination MAC address 6 octets + Source MAC address 6 octets + Ethertype (0x0800) 2 octets + Version (4) 4 bits + IHL (5-15) 4 bits + DSCP (0) 6 bits + ECN (0) 2 bits + length 2 octets + identification (0?) 2 octets + flags (010) 3 bits + fragment offset (0) 13 bits + time to live (64?) 1 octet + protocol 1 octet + header checksum 2 octets + source IP 4 octets + destination IP 4 octets + options (IHL-5)*4 octets + + source port 2 octets + desination port 2 octets + length 2 octets + checksum 2 octets + + payload length octets + +This module receives an IP frame with header fields in parallel and payload on +an AXI stream interface, decodes and strips the UDP header fields, then +produces the header fields in parallel along with the UDP payload in a +separate AXI stream. + +*/ + +localparam [2:0] + STATE_IDLE = 3'd0, + STATE_READ_HEADER = 3'd1, + STATE_READ_PAYLOAD = 3'd2, + STATE_READ_PAYLOAD_LAST = 3'd3, + STATE_WAIT_LAST = 3'd4; + +reg [2:0] state_reg = STATE_IDLE, state_next; + +// datapath control signals +reg store_ip_hdr; +reg store_hdr_word_0; +reg store_last_word; + +reg [15:0] word_count_reg = 16'd0, word_count_next; + +reg [63:0] last_word_data_reg = 64'd0; +reg [7:0] last_word_keep_reg = 8'd0; + +reg m_udp_hdr_valid_reg = 1'b0, m_udp_hdr_valid_next; +reg [47:0] m_eth_dest_mac_reg = 48'd0; +reg [47:0] m_eth_src_mac_reg = 48'd0; +reg [15:0] m_eth_type_reg = 16'd0; +reg [3:0] m_ip_version_reg = 4'd0; +reg [3:0] m_ip_ihl_reg = 4'd0; +reg [5:0] m_ip_dscp_reg = 6'd0; +reg [1:0] m_ip_ecn_reg = 2'd0; +reg [15:0] m_ip_length_reg = 16'd0; +reg [15:0] m_ip_identification_reg = 16'd0; +reg [2:0] m_ip_flags_reg = 3'd0; +reg [12:0] m_ip_fragment_offset_reg = 13'd0; +reg [7:0] m_ip_ttl_reg = 8'd0; +reg [7:0] m_ip_protocol_reg = 8'd0; +reg [15:0] m_ip_header_checksum_reg = 16'd0; +reg [31:0] m_ip_source_ip_reg = 32'd0; +reg [31:0] m_ip_dest_ip_reg = 32'd0; +reg [15:0] m_udp_source_port_reg = 16'd0; +reg [15:0] m_udp_dest_port_reg = 16'd0; +reg [15:0] m_udp_length_reg = 16'd0; +reg [15:0] m_udp_checksum_reg = 16'd0; + +reg s_ip_hdr_ready_reg = 1'b0, s_ip_hdr_ready_next; +reg s_ip_payload_axis_tready_reg = 1'b0, s_ip_payload_axis_tready_next; + +reg busy_reg = 1'b0; +reg error_header_early_termination_reg = 1'b0, error_header_early_termination_next; +reg error_payload_early_termination_reg = 1'b0, error_payload_early_termination_next; + +// internal datapath +reg [63:0] m_udp_payload_axis_tdata_int; +reg [7:0] m_udp_payload_axis_tkeep_int; +reg m_udp_payload_axis_tvalid_int; +reg m_udp_payload_axis_tready_int_reg = 1'b0; +reg m_udp_payload_axis_tlast_int; +reg m_udp_payload_axis_tuser_int; +wire m_udp_payload_axis_tready_int_early; + +assign s_ip_hdr_ready = s_ip_hdr_ready_reg; +assign s_ip_payload_axis_tready = s_ip_payload_axis_tready_reg; + +assign m_udp_hdr_valid = m_udp_hdr_valid_reg; +assign m_eth_dest_mac = m_eth_dest_mac_reg; +assign m_eth_src_mac = m_eth_src_mac_reg; +assign m_eth_type = m_eth_type_reg; +assign m_ip_version = m_ip_version_reg; +assign m_ip_ihl = m_ip_ihl_reg; +assign m_ip_dscp = m_ip_dscp_reg; +assign m_ip_ecn = m_ip_ecn_reg; +assign m_ip_length = m_ip_length_reg; +assign m_ip_identification = m_ip_identification_reg; +assign m_ip_flags = m_ip_flags_reg; +assign m_ip_fragment_offset = m_ip_fragment_offset_reg; +assign m_ip_ttl = m_ip_ttl_reg; +assign m_ip_protocol = m_ip_protocol_reg; +assign m_ip_header_checksum = m_ip_header_checksum_reg; +assign m_ip_source_ip = m_ip_source_ip_reg; +assign m_ip_dest_ip = m_ip_dest_ip_reg; +assign m_udp_source_port = m_udp_source_port_reg; +assign m_udp_dest_port = m_udp_dest_port_reg; +assign m_udp_length = m_udp_length_reg; +assign m_udp_checksum = m_udp_checksum_reg; + +assign busy = busy_reg; +assign error_header_early_termination = error_header_early_termination_reg; +assign error_payload_early_termination = error_payload_early_termination_reg; + +function [3:0] keep2count; + input [7:0] k; + casez (k) + 8'bzzzzzzz0: keep2count = 4'd0; + 8'bzzzzzz01: keep2count = 4'd1; + 8'bzzzzz011: keep2count = 4'd2; + 8'bzzzz0111: keep2count = 4'd3; + 8'bzzz01111: keep2count = 4'd4; + 8'bzz011111: keep2count = 4'd5; + 8'bz0111111: keep2count = 4'd6; + 8'b01111111: keep2count = 4'd7; + 8'b11111111: keep2count = 4'd8; + endcase +endfunction + +function [7:0] count2keep; + input [3:0] k; + case (k) + 4'd0: count2keep = 8'b00000000; + 4'd1: count2keep = 8'b00000001; + 4'd2: count2keep = 8'b00000011; + 4'd3: count2keep = 8'b00000111; + 4'd4: count2keep = 8'b00001111; + 4'd5: count2keep = 8'b00011111; + 4'd6: count2keep = 8'b00111111; + 4'd7: count2keep = 8'b01111111; + 4'd8: count2keep = 8'b11111111; + endcase +endfunction + +always @* begin + state_next = STATE_IDLE; + + s_ip_hdr_ready_next = 1'b0; + s_ip_payload_axis_tready_next = 1'b0; + + store_ip_hdr = 1'b0; + store_hdr_word_0 = 1'b0; + + store_last_word = 1'b0; + + word_count_next = word_count_reg; + + m_udp_hdr_valid_next = m_udp_hdr_valid_reg && !m_udp_hdr_ready; + + error_header_early_termination_next = 1'b0; + error_payload_early_termination_next = 1'b0; + + m_udp_payload_axis_tdata_int = 64'd0; + m_udp_payload_axis_tkeep_int = 8'd0; + m_udp_payload_axis_tvalid_int = 1'b0; + m_udp_payload_axis_tlast_int = 1'b0; + m_udp_payload_axis_tuser_int = 1'b0; + + case (state_reg) + STATE_IDLE: begin + // idle state - wait for header + s_ip_hdr_ready_next = !m_udp_hdr_valid_next; + + if (s_ip_hdr_ready && s_ip_hdr_valid) begin + s_ip_hdr_ready_next = 1'b0; + s_ip_payload_axis_tready_next = 1'b1; + store_ip_hdr = 1'b1; + state_next = STATE_READ_HEADER; + end else begin + state_next = STATE_IDLE; + end + end + STATE_READ_HEADER: begin + // read header state + s_ip_payload_axis_tready_next = 1'b1; + + word_count_next = {s_ip_payload_axis_tdata[39:32], s_ip_payload_axis_tdata[47:40]} - 16'd8; + + if (s_ip_payload_axis_tready && s_ip_payload_axis_tvalid) begin + // word transfer in - store it + state_next = STATE_READ_HEADER; + + store_hdr_word_0 = 1'b1; + m_udp_hdr_valid_next = 1'b1; + s_ip_payload_axis_tready_next = m_udp_payload_axis_tready_int_early; + state_next = STATE_READ_PAYLOAD; + + if (s_ip_payload_axis_tlast) begin + error_header_early_termination_next = 1'b1; + m_udp_hdr_valid_next = 1'b0; + s_ip_hdr_ready_next = !m_udp_hdr_valid_next; + s_ip_payload_axis_tready_next = 1'b0; + state_next = STATE_IDLE; + end + + end else begin + state_next = STATE_READ_HEADER; + end + end + STATE_READ_PAYLOAD: begin + // read payload + s_ip_payload_axis_tready_next = m_udp_payload_axis_tready_int_early; + + m_udp_payload_axis_tdata_int = s_ip_payload_axis_tdata; + m_udp_payload_axis_tkeep_int = s_ip_payload_axis_tkeep; + m_udp_payload_axis_tlast_int = s_ip_payload_axis_tlast; + m_udp_payload_axis_tuser_int = s_ip_payload_axis_tuser; + + store_last_word = 1'b1; + + if (s_ip_payload_axis_tready && s_ip_payload_axis_tvalid) begin + // word transfer through + word_count_next = word_count_reg - 16'd8; + m_udp_payload_axis_tvalid_int = 1'b1; + if (word_count_reg <= 8) begin + // have entire payload + m_udp_payload_axis_tkeep_int = s_ip_payload_axis_tkeep & count2keep(word_count_reg); + if (s_ip_payload_axis_tlast) begin + if (keep2count(s_ip_payload_axis_tkeep) < word_count_reg[4:0]) begin + // end of frame, but length does not match + error_payload_early_termination_next = 1'b1; + m_udp_payload_axis_tuser_int = 1'b1; + end + s_ip_payload_axis_tready_next = 1'b0; + s_ip_hdr_ready_next = !m_udp_hdr_valid_next; + state_next = STATE_IDLE; + end else begin + m_udp_payload_axis_tvalid_int = 1'b0; + state_next = STATE_READ_PAYLOAD_LAST; + end + end else begin + if (s_ip_payload_axis_tlast) begin + // end of frame, but length does not match + error_payload_early_termination_next = 1'b1; + m_udp_payload_axis_tuser_int = 1'b1; + s_ip_payload_axis_tready_next = 1'b0; + s_ip_hdr_ready_next = !m_udp_hdr_valid_next; + state_next = STATE_IDLE; + end else begin + state_next = STATE_READ_PAYLOAD; + end + end + end else begin + state_next = STATE_READ_PAYLOAD; + end + end + STATE_READ_PAYLOAD_LAST: begin + // read and discard until end of frame + s_ip_payload_axis_tready_next = m_udp_payload_axis_tready_int_early; + + m_udp_payload_axis_tdata_int = last_word_data_reg; + m_udp_payload_axis_tkeep_int = last_word_keep_reg; + m_udp_payload_axis_tlast_int = s_ip_payload_axis_tlast; + m_udp_payload_axis_tuser_int = s_ip_payload_axis_tuser; + + if (s_ip_payload_axis_tready && s_ip_payload_axis_tvalid) begin + if (s_ip_payload_axis_tlast) begin + s_ip_hdr_ready_next = !m_udp_hdr_valid_next; + s_ip_payload_axis_tready_next = 1'b0; + m_udp_payload_axis_tvalid_int = 1'b1; + state_next = STATE_IDLE; + end else begin + state_next = STATE_READ_PAYLOAD_LAST; + end + end else begin + state_next = STATE_READ_PAYLOAD_LAST; + end + end + STATE_WAIT_LAST: begin + // wait for end of frame; read and discard + s_ip_payload_axis_tready_next = 1'b1; + + if (s_ip_payload_axis_tready && s_ip_payload_axis_tvalid) begin + if (s_ip_payload_axis_tlast) begin + s_ip_hdr_ready_next = !m_udp_hdr_valid_next; + s_ip_payload_axis_tready_next = 1'b0; + state_next = STATE_IDLE; + end else begin + state_next = STATE_WAIT_LAST; + end + end else begin + state_next = STATE_WAIT_LAST; + end + end + endcase +end + +always @(posedge clk) begin + if (rst) begin + state_reg <= STATE_IDLE; + s_ip_hdr_ready_reg <= 1'b0; + s_ip_payload_axis_tready_reg <= 1'b0; + m_udp_hdr_valid_reg <= 1'b0; + busy_reg <= 1'b0; + error_header_early_termination_reg <= 1'b0; + error_payload_early_termination_reg <= 1'b0; + end else begin + state_reg <= state_next; + + s_ip_hdr_ready_reg <= s_ip_hdr_ready_next; + s_ip_payload_axis_tready_reg <= s_ip_payload_axis_tready_next; + + m_udp_hdr_valid_reg <= m_udp_hdr_valid_next; + + error_header_early_termination_reg <= error_header_early_termination_next; + error_payload_early_termination_reg <= error_payload_early_termination_next; + + busy_reg <= state_next != STATE_IDLE; + end + + word_count_reg <= word_count_next; + + // datapath + if (store_ip_hdr) begin + m_eth_dest_mac_reg <= s_eth_dest_mac; + m_eth_src_mac_reg <= s_eth_src_mac; + m_eth_type_reg <= s_eth_type; + m_ip_version_reg <= s_ip_version; + m_ip_ihl_reg <= s_ip_ihl; + m_ip_dscp_reg <= s_ip_dscp; + m_ip_ecn_reg <= s_ip_ecn; + m_ip_length_reg <= s_ip_length; + m_ip_identification_reg <= s_ip_identification; + m_ip_flags_reg <= s_ip_flags; + m_ip_fragment_offset_reg <= s_ip_fragment_offset; + m_ip_ttl_reg <= s_ip_ttl; + m_ip_protocol_reg <= s_ip_protocol; + m_ip_header_checksum_reg <= s_ip_header_checksum; + m_ip_source_ip_reg <= s_ip_source_ip; + m_ip_dest_ip_reg <= s_ip_dest_ip; + end + + if (store_last_word) begin + last_word_data_reg <= m_udp_payload_axis_tdata_int; + last_word_keep_reg <= m_udp_payload_axis_tkeep_int; + end + + if (store_hdr_word_0) begin + m_udp_source_port_reg[15: 8] <= s_ip_payload_axis_tdata[ 7: 0]; + m_udp_source_port_reg[ 7: 0] <= s_ip_payload_axis_tdata[15: 8]; + m_udp_dest_port_reg[15: 8] <= s_ip_payload_axis_tdata[23:16]; + m_udp_dest_port_reg[ 7: 0] <= s_ip_payload_axis_tdata[31:24]; + m_udp_length_reg[15: 8] <= s_ip_payload_axis_tdata[39:32]; + m_udp_length_reg[ 7: 0] <= s_ip_payload_axis_tdata[47:40]; + m_udp_checksum_reg[15: 8] <= s_ip_payload_axis_tdata[55:48]; + m_udp_checksum_reg[ 7: 0] <= s_ip_payload_axis_tdata[63:56]; + end +end + +// output datapath logic +reg [63:0] m_udp_payload_axis_tdata_reg = 64'd0; +reg [7:0] m_udp_payload_axis_tkeep_reg = 8'd0; +reg m_udp_payload_axis_tvalid_reg = 1'b0, m_udp_payload_axis_tvalid_next; +reg m_udp_payload_axis_tlast_reg = 1'b0; +reg m_udp_payload_axis_tuser_reg = 1'b0; + +reg [63:0] temp_m_udp_payload_axis_tdata_reg = 64'd0; +reg [7:0] temp_m_udp_payload_axis_tkeep_reg = 8'd0; +reg temp_m_udp_payload_axis_tvalid_reg = 1'b0, temp_m_udp_payload_axis_tvalid_next; +reg temp_m_udp_payload_axis_tlast_reg = 1'b0; +reg temp_m_udp_payload_axis_tuser_reg = 1'b0; + +// datapath control +reg store_udp_payload_int_to_output; +reg store_udp_payload_int_to_temp; +reg store_udp_payload_axis_temp_to_output; + +assign m_udp_payload_axis_tdata = m_udp_payload_axis_tdata_reg; +assign m_udp_payload_axis_tkeep = m_udp_payload_axis_tkeep_reg; +assign m_udp_payload_axis_tvalid = m_udp_payload_axis_tvalid_reg; +assign m_udp_payload_axis_tlast = m_udp_payload_axis_tlast_reg; +assign m_udp_payload_axis_tuser = m_udp_payload_axis_tuser_reg; + +// enable ready input next cycle if output is ready or if both output registers are empty +assign m_udp_payload_axis_tready_int_early = m_udp_payload_axis_tready || (!temp_m_udp_payload_axis_tvalid_reg && !m_udp_payload_axis_tvalid_reg); + +always @* begin + // transfer sink ready state to source + m_udp_payload_axis_tvalid_next = m_udp_payload_axis_tvalid_reg; + temp_m_udp_payload_axis_tvalid_next = temp_m_udp_payload_axis_tvalid_reg; + + store_udp_payload_int_to_output = 1'b0; + store_udp_payload_int_to_temp = 1'b0; + store_udp_payload_axis_temp_to_output = 1'b0; + + if (m_udp_payload_axis_tready_int_reg) begin + // input is ready + if (m_udp_payload_axis_tready || !m_udp_payload_axis_tvalid_reg) begin + // output is ready or currently not valid, transfer data to output + m_udp_payload_axis_tvalid_next = m_udp_payload_axis_tvalid_int; + store_udp_payload_int_to_output = 1'b1; + end else begin + // output is not ready, store input in temp + temp_m_udp_payload_axis_tvalid_next = m_udp_payload_axis_tvalid_int; + store_udp_payload_int_to_temp = 1'b1; + end + end else if (m_udp_payload_axis_tready) begin + // input is not ready, but output is ready + m_udp_payload_axis_tvalid_next = temp_m_udp_payload_axis_tvalid_reg; + temp_m_udp_payload_axis_tvalid_next = 1'b0; + store_udp_payload_axis_temp_to_output = 1'b1; + end +end + +always @(posedge clk) begin + m_udp_payload_axis_tvalid_reg <= m_udp_payload_axis_tvalid_next; + m_udp_payload_axis_tready_int_reg <= m_udp_payload_axis_tready_int_early; + temp_m_udp_payload_axis_tvalid_reg <= temp_m_udp_payload_axis_tvalid_next; + + // datapath + if (store_udp_payload_int_to_output) begin + m_udp_payload_axis_tdata_reg <= m_udp_payload_axis_tdata_int; + m_udp_payload_axis_tkeep_reg <= m_udp_payload_axis_tkeep_int; + m_udp_payload_axis_tlast_reg <= m_udp_payload_axis_tlast_int; + m_udp_payload_axis_tuser_reg <= m_udp_payload_axis_tuser_int; + end else if (store_udp_payload_axis_temp_to_output) begin + m_udp_payload_axis_tdata_reg <= temp_m_udp_payload_axis_tdata_reg; + m_udp_payload_axis_tkeep_reg <= temp_m_udp_payload_axis_tkeep_reg; + m_udp_payload_axis_tlast_reg <= temp_m_udp_payload_axis_tlast_reg; + m_udp_payload_axis_tuser_reg <= temp_m_udp_payload_axis_tuser_reg; + end + + if (store_udp_payload_int_to_temp) begin + temp_m_udp_payload_axis_tdata_reg <= m_udp_payload_axis_tdata_int; + temp_m_udp_payload_axis_tkeep_reg <= m_udp_payload_axis_tkeep_int; + temp_m_udp_payload_axis_tlast_reg <= m_udp_payload_axis_tlast_int; + temp_m_udp_payload_axis_tuser_reg <= m_udp_payload_axis_tuser_int; + end + + if (rst) begin + m_udp_payload_axis_tvalid_reg <= 1'b0; + m_udp_payload_axis_tready_int_reg <= 1'b0; + temp_m_udp_payload_axis_tvalid_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_ip_tx_64.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_ip_tx_64.v new file mode 100755 index 0000000..5a77e94 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/udp_ip_tx_64.v @@ -0,0 +1,553 @@ +/* + +Copyright (c) 2014-2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * UDP ethernet frame transmitter (UDP frame in, IP frame out, 64-bit datapath) + */ +module udp_ip_tx_64 +( + input wire clk, + input wire rst, + + /* + * UDP frame input + */ + input wire s_udp_hdr_valid, + output wire s_udp_hdr_ready, + input wire [47:0] s_eth_dest_mac, + input wire [47:0] s_eth_src_mac, + input wire [15:0] s_eth_type, + input wire [3:0] s_ip_version, + input wire [3:0] s_ip_ihl, + input wire [5:0] s_ip_dscp, + input wire [1:0] s_ip_ecn, + input wire [15:0] s_ip_identification, + input wire [2:0] s_ip_flags, + input wire [12:0] s_ip_fragment_offset, + input wire [7:0] s_ip_ttl, + input wire [7:0] s_ip_protocol, + input wire [15:0] s_ip_header_checksum, + input wire [31:0] s_ip_source_ip, + input wire [31:0] s_ip_dest_ip, + input wire [15:0] s_udp_source_port, + input wire [15:0] s_udp_dest_port, + input wire [15:0] s_udp_length, + input wire [15:0] s_udp_checksum, + input wire [63:0] s_udp_payload_axis_tdata, + input wire [7:0] s_udp_payload_axis_tkeep, + input wire s_udp_payload_axis_tvalid, + output wire s_udp_payload_axis_tready, + input wire s_udp_payload_axis_tlast, + input wire s_udp_payload_axis_tuser, + + /* + * IP frame output + */ + output wire m_ip_hdr_valid, + input wire m_ip_hdr_ready, + output wire [47:0] m_eth_dest_mac, + output wire [47:0] m_eth_src_mac, + output wire [15:0] m_eth_type, + output wire [3:0] m_ip_version, + output wire [3:0] m_ip_ihl, + output wire [5:0] m_ip_dscp, + output wire [1:0] m_ip_ecn, + output wire [15:0] m_ip_length, + output wire [15:0] m_ip_identification, + output wire [2:0] m_ip_flags, + output wire [12:0] m_ip_fragment_offset, + output wire [7:0] m_ip_ttl, + output wire [7:0] m_ip_protocol, + output wire [15:0] m_ip_header_checksum, + output wire [31:0] m_ip_source_ip, + output wire [31:0] m_ip_dest_ip, + output wire [63:0] m_ip_payload_axis_tdata, + output wire [7:0] m_ip_payload_axis_tkeep, + output wire m_ip_payload_axis_tvalid, + input wire m_ip_payload_axis_tready, + output wire m_ip_payload_axis_tlast, + output wire m_ip_payload_axis_tuser, + + /* + * Status signals + */ + output wire busy, + output wire error_payload_early_termination +); + +/* + +UDP Frame + + Field Length + Destination MAC address 6 octets + Source MAC address 6 octets + Ethertype (0x0800) 2 octets + Version (4) 4 bits + IHL (5-15) 4 bits + DSCP (0) 6 bits + ECN (0) 2 bits + length 2 octets + identification (0?) 2 octets + flags (010) 3 bits + fragment offset (0) 13 bits + time to live (64?) 1 octet + protocol 1 octet + header checksum 2 octets + source IP 4 octets + destination IP 4 octets + options (IHL-5)*4 octets + + source port 2 octets + desination port 2 octets + length 2 octets + checksum 2 octets + + payload length octets + +This module receives a UDP frame with header fields in parallel along with the +payload in an AXI stream, combines the header with the payload, passes through +the IP headers, and transmits the complete IP payload on an AXI interface. + +*/ + +localparam [2:0] + STATE_IDLE = 3'd0, + STATE_WRITE_HEADER = 3'd1, + STATE_WRITE_PAYLOAD = 3'd2, + STATE_WRITE_PAYLOAD_LAST = 3'd3, + STATE_WAIT_LAST = 3'd4; + +reg [2:0] state_reg = STATE_IDLE, state_next; + +// datapath control signals +reg store_udp_hdr; +reg store_last_word; + +reg [15:0] word_count_reg = 16'd0, word_count_next; + +reg [63:0] last_word_data_reg = 64'd0; +reg [7:0] last_word_keep_reg = 8'd0; + +reg [15:0] udp_source_port_reg = 16'd0; +reg [15:0] udp_dest_port_reg = 16'd0; +reg [15:0] udp_length_reg = 16'd0; +reg [15:0] udp_checksum_reg = 16'd0; + +reg s_udp_hdr_ready_reg = 1'b0, s_udp_hdr_ready_next; +reg s_udp_payload_axis_tready_reg = 1'b0, s_udp_payload_axis_tready_next; + +reg m_ip_hdr_valid_reg = 1'b0, m_ip_hdr_valid_next; +reg [47:0] m_eth_dest_mac_reg = 48'd0; +reg [47:0] m_eth_src_mac_reg = 48'd0; +reg [15:0] m_eth_type_reg = 16'd0; +reg [3:0] m_ip_version_reg = 4'd0; +reg [3:0] m_ip_ihl_reg = 4'd0; +reg [5:0] m_ip_dscp_reg = 6'd0; +reg [1:0] m_ip_ecn_reg = 2'd0; +reg [15:0] m_ip_length_reg = 16'd0; +reg [15:0] m_ip_identification_reg = 16'd0; +reg [2:0] m_ip_flags_reg = 3'd0; +reg [12:0] m_ip_fragment_offset_reg = 13'd0; +reg [7:0] m_ip_ttl_reg = 8'd0; +reg [7:0] m_ip_protocol_reg = 8'd0; +reg [15:0] m_ip_header_checksum_reg = 16'd0; +reg [31:0] m_ip_source_ip_reg = 32'd0; +reg [31:0] m_ip_dest_ip_reg = 32'd0; + +reg busy_reg = 1'b0; +reg error_payload_early_termination_reg = 1'b0, error_payload_early_termination_next; + +// internal datapath +reg [63:0] m_ip_payload_axis_tdata_int; +reg [7:0] m_ip_payload_axis_tkeep_int; +reg m_ip_payload_axis_tvalid_int; +reg m_ip_payload_axis_tready_int_reg = 1'b0; +reg m_ip_payload_axis_tlast_int; +reg m_ip_payload_axis_tuser_int; +wire m_ip_payload_axis_tready_int_early; + +assign s_udp_hdr_ready = s_udp_hdr_ready_reg; +assign s_udp_payload_axis_tready = s_udp_payload_axis_tready_reg; + +assign m_ip_hdr_valid = m_ip_hdr_valid_reg; +assign m_eth_dest_mac = m_eth_dest_mac_reg; +assign m_eth_src_mac = m_eth_src_mac_reg; +assign m_eth_type = m_eth_type_reg; +assign m_ip_version = m_ip_version_reg; +assign m_ip_ihl = m_ip_ihl_reg; +assign m_ip_dscp = m_ip_dscp_reg; +assign m_ip_ecn = m_ip_ecn_reg; +assign m_ip_length = m_ip_length_reg; +assign m_ip_identification = m_ip_identification_reg; +assign m_ip_flags = m_ip_flags_reg; +assign m_ip_fragment_offset = m_ip_fragment_offset_reg; +assign m_ip_ttl = m_ip_ttl_reg; +assign m_ip_protocol = m_ip_protocol_reg; +assign m_ip_header_checksum = m_ip_header_checksum_reg; +assign m_ip_source_ip = m_ip_source_ip_reg; +assign m_ip_dest_ip = m_ip_dest_ip_reg; + +assign busy = busy_reg; +assign error_payload_early_termination = error_payload_early_termination_reg; + +function [3:0] keep2count; + input [7:0] k; + casez (k) + 8'bzzzzzzz0: keep2count = 4'd0; + 8'bzzzzzz01: keep2count = 4'd1; + 8'bzzzzz011: keep2count = 4'd2; + 8'bzzzz0111: keep2count = 4'd3; + 8'bzzz01111: keep2count = 4'd4; + 8'bzz011111: keep2count = 4'd5; + 8'bz0111111: keep2count = 4'd6; + 8'b01111111: keep2count = 4'd7; + 8'b11111111: keep2count = 4'd8; + endcase +endfunction + +function [7:0] count2keep; + input [3:0] k; + case (k) + 4'd0: count2keep = 8'b00000000; + 4'd1: count2keep = 8'b00000001; + 4'd2: count2keep = 8'b00000011; + 4'd3: count2keep = 8'b00000111; + 4'd4: count2keep = 8'b00001111; + 4'd5: count2keep = 8'b00011111; + 4'd6: count2keep = 8'b00111111; + 4'd7: count2keep = 8'b01111111; + 4'd8: count2keep = 8'b11111111; + endcase +endfunction + +always @* begin + state_next = STATE_IDLE; + + s_udp_hdr_ready_next = 1'b0; + s_udp_payload_axis_tready_next = 1'b0; + + store_udp_hdr = 1'b0; + + store_last_word = 1'b0; + + word_count_next = word_count_reg; + + m_ip_hdr_valid_next = m_ip_hdr_valid_reg && !m_ip_hdr_ready; + + error_payload_early_termination_next = 1'b0; + + m_ip_payload_axis_tdata_int = 64'd0; + m_ip_payload_axis_tkeep_int = 8'd0; + m_ip_payload_axis_tvalid_int = 1'b0; + m_ip_payload_axis_tlast_int = 1'b0; + m_ip_payload_axis_tuser_int = 1'b0; + + case (state_reg) + STATE_IDLE: begin + // idle state - wait for data + s_udp_hdr_ready_next = !m_ip_hdr_valid_next; + word_count_next = s_udp_length - 16'd8; + + if (s_udp_hdr_ready && s_udp_hdr_valid) begin + store_udp_hdr = 1'b1; + s_udp_hdr_ready_next = 1'b0; + m_ip_hdr_valid_next = 1'b1; + state_next = STATE_WRITE_HEADER; + if (m_ip_payload_axis_tready_int_reg) begin + m_ip_payload_axis_tvalid_int = 1'b1; + m_ip_payload_axis_tdata_int[ 7: 0] = s_udp_source_port[15: 8]; + m_ip_payload_axis_tdata_int[15: 8] = s_udp_source_port[ 7: 0]; + m_ip_payload_axis_tdata_int[23:16] = s_udp_dest_port[15: 8]; + m_ip_payload_axis_tdata_int[31:24] = s_udp_dest_port[ 7: 0]; + m_ip_payload_axis_tdata_int[39:32] = s_udp_length[15: 8]; + m_ip_payload_axis_tdata_int[47:40] = s_udp_length[ 7: 0]; + m_ip_payload_axis_tdata_int[55:48] = s_udp_checksum[15: 8]; + m_ip_payload_axis_tdata_int[63:56] = s_udp_checksum[ 7: 0]; + m_ip_payload_axis_tkeep_int = 8'hff; + s_udp_payload_axis_tready_next = m_ip_payload_axis_tready_int_early; + state_next = STATE_WRITE_PAYLOAD; + end + end else begin + state_next = STATE_IDLE; + end + end + STATE_WRITE_HEADER: begin + // write header state + if (m_ip_payload_axis_tready_int_reg) begin + // word transfer out + m_ip_payload_axis_tvalid_int = 1'b1; + m_ip_payload_axis_tdata_int[ 7: 0] = udp_source_port_reg[15: 8]; + m_ip_payload_axis_tdata_int[15: 8] = udp_source_port_reg[ 7: 0]; + m_ip_payload_axis_tdata_int[23:16] = udp_dest_port_reg[15: 8]; + m_ip_payload_axis_tdata_int[31:24] = udp_dest_port_reg[ 7: 0]; + m_ip_payload_axis_tdata_int[39:32] = udp_length_reg[15: 8]; + m_ip_payload_axis_tdata_int[47:40] = udp_length_reg[ 7: 0]; + m_ip_payload_axis_tdata_int[55:48] = udp_checksum_reg[15: 8]; + m_ip_payload_axis_tdata_int[63:56] = udp_checksum_reg[ 7: 0]; + m_ip_payload_axis_tkeep_int = 8'hff; + s_udp_payload_axis_tready_next = m_ip_payload_axis_tready_int_early; + state_next = STATE_WRITE_PAYLOAD; + end else begin + state_next = STATE_WRITE_HEADER; + end + end + STATE_WRITE_PAYLOAD: begin + // write payload + s_udp_payload_axis_tready_next = m_ip_payload_axis_tready_int_early; + + m_ip_payload_axis_tdata_int = s_udp_payload_axis_tdata; + m_ip_payload_axis_tkeep_int = s_udp_payload_axis_tkeep; + m_ip_payload_axis_tlast_int = s_udp_payload_axis_tlast; + m_ip_payload_axis_tuser_int = s_udp_payload_axis_tuser; + + store_last_word = 1'b1; + + if (m_ip_payload_axis_tready_int_reg && s_udp_payload_axis_tvalid) begin + // word transfer through + word_count_next = word_count_reg - 16'd8; + m_ip_payload_axis_tvalid_int = 1'b1; + if (word_count_reg <= 8) begin + // have entire payload + m_ip_payload_axis_tkeep_int = count2keep(word_count_reg); + if (s_udp_payload_axis_tlast) begin + if (keep2count(s_udp_payload_axis_tkeep) < word_count_reg[4:0]) begin + // end of frame, but length does not match + error_payload_early_termination_next = 1'b1; + m_ip_payload_axis_tuser_int = 1'b1; + end + s_udp_payload_axis_tready_next = 1'b0; + s_udp_hdr_ready_next = !m_ip_hdr_valid_next; + state_next = STATE_IDLE; + end else begin + m_ip_payload_axis_tvalid_int = 1'b0; + state_next = STATE_WRITE_PAYLOAD_LAST; + end + end else begin + if (s_udp_payload_axis_tlast) begin + // end of frame, but length does not match + error_payload_early_termination_next = 1'b1; + m_ip_payload_axis_tuser_int = 1'b1; + s_udp_payload_axis_tready_next = 1'b0; + s_udp_hdr_ready_next = !m_ip_hdr_valid_next; + state_next = STATE_IDLE; + end else begin + state_next = STATE_WRITE_PAYLOAD; + end + end + end else begin + state_next = STATE_WRITE_PAYLOAD; + end + end + STATE_WRITE_PAYLOAD_LAST: begin + // read and discard until end of frame + s_udp_payload_axis_tready_next = m_ip_payload_axis_tready_int_early; + + m_ip_payload_axis_tdata_int = last_word_data_reg; + m_ip_payload_axis_tkeep_int = last_word_keep_reg; + m_ip_payload_axis_tlast_int = s_udp_payload_axis_tlast; + m_ip_payload_axis_tuser_int = s_udp_payload_axis_tuser; + + if (s_udp_payload_axis_tready && s_udp_payload_axis_tvalid) begin + if (s_udp_payload_axis_tlast) begin + s_udp_hdr_ready_next = !m_ip_hdr_valid_next; + s_udp_payload_axis_tready_next = 1'b0; + m_ip_payload_axis_tvalid_int = 1'b1; + state_next = STATE_IDLE; + end else begin + state_next = STATE_WRITE_PAYLOAD_LAST; + end + end else begin + state_next = STATE_WRITE_PAYLOAD_LAST; + end + end + STATE_WAIT_LAST: begin + // wait for end of frame; read and discard + s_udp_payload_axis_tready_next = 1'b1; + + if (s_udp_payload_axis_tvalid) begin + if (s_udp_payload_axis_tlast) begin + s_udp_hdr_ready_next = !m_ip_hdr_valid_next; + s_udp_payload_axis_tready_next = 1'b0; + state_next = STATE_IDLE; + end else begin + state_next = STATE_WAIT_LAST; + end + end else begin + state_next = STATE_WAIT_LAST; + end + end + endcase +end + +always @(posedge clk) begin + if (rst) begin + state_reg <= STATE_IDLE; + s_udp_hdr_ready_reg <= 1'b0; + s_udp_payload_axis_tready_reg <= 1'b0; + m_ip_hdr_valid_reg <= 1'b0; + busy_reg <= 1'b0; + error_payload_early_termination_reg <= 1'b0; + end else begin + state_reg <= state_next; + + + s_udp_hdr_ready_reg <= s_udp_hdr_ready_next; + s_udp_payload_axis_tready_reg <= s_udp_payload_axis_tready_next; + + m_ip_hdr_valid_reg <= m_ip_hdr_valid_next; + + busy_reg <= state_next != STATE_IDLE; + + error_payload_early_termination_reg <= error_payload_early_termination_next; + end + + word_count_reg <= word_count_next; + + // datapath + if (store_udp_hdr) begin + m_eth_dest_mac_reg <= s_eth_dest_mac; + m_eth_src_mac_reg <= s_eth_src_mac; + m_eth_type_reg <= s_eth_type; + m_ip_version_reg <= s_ip_version; + m_ip_ihl_reg <= s_ip_ihl; + m_ip_dscp_reg <= s_ip_dscp; + m_ip_ecn_reg <= s_ip_ecn; + m_ip_length_reg <= s_udp_length + 20; + m_ip_identification_reg <= s_ip_identification; + m_ip_flags_reg <= s_ip_flags; + m_ip_fragment_offset_reg <= s_ip_fragment_offset; + m_ip_ttl_reg <= s_ip_ttl; + m_ip_protocol_reg <= s_ip_protocol; + m_ip_header_checksum_reg <= s_ip_header_checksum; + m_ip_source_ip_reg <= s_ip_source_ip; + m_ip_dest_ip_reg <= s_ip_dest_ip; + udp_source_port_reg <= s_udp_source_port; + udp_dest_port_reg <= s_udp_dest_port; + udp_length_reg <= s_udp_length; + udp_checksum_reg <= s_udp_checksum; + end + + if (store_last_word) begin + last_word_data_reg <= m_ip_payload_axis_tdata_int; + last_word_keep_reg <= m_ip_payload_axis_tkeep_int; + end +end + +// output datapath logic +reg [63:0] m_ip_payload_axis_tdata_reg = 64'd0; +reg [7:0] m_ip_payload_axis_tkeep_reg = 8'd0; +reg m_ip_payload_axis_tvalid_reg = 1'b0, m_ip_payload_axis_tvalid_next; +reg m_ip_payload_axis_tlast_reg = 1'b0; +reg m_ip_payload_axis_tuser_reg = 1'b0; + +reg [63:0] temp_m_ip_payload_axis_tdata_reg = 64'd0; +reg [7:0] temp_m_ip_payload_axis_tkeep_reg = 8'd0; +reg temp_m_ip_payload_axis_tvalid_reg = 1'b0, temp_m_ip_payload_axis_tvalid_next; +reg temp_m_ip_payload_axis_tlast_reg = 1'b0; +reg temp_m_ip_payload_axis_tuser_reg = 1'b0; + +// datapath control +reg store_ip_payload_int_to_output; +reg store_ip_payload_int_to_temp; +reg store_ip_payload_axis_temp_to_output; + +assign m_ip_payload_axis_tdata = m_ip_payload_axis_tdata_reg; +assign m_ip_payload_axis_tkeep = m_ip_payload_axis_tkeep_reg; +assign m_ip_payload_axis_tvalid = m_ip_payload_axis_tvalid_reg; +assign m_ip_payload_axis_tlast = m_ip_payload_axis_tlast_reg; +assign m_ip_payload_axis_tuser = m_ip_payload_axis_tuser_reg; + +// enable ready input next cycle if output is ready or if both output registers are empty +assign m_ip_payload_axis_tready_int_early = m_ip_payload_axis_tready || (!temp_m_ip_payload_axis_tvalid_reg && !m_ip_payload_axis_tvalid_reg); + +always @* begin + // transfer sink ready state to source + m_ip_payload_axis_tvalid_next = m_ip_payload_axis_tvalid_reg; + temp_m_ip_payload_axis_tvalid_next = temp_m_ip_payload_axis_tvalid_reg; + + store_ip_payload_int_to_output = 1'b0; + store_ip_payload_int_to_temp = 1'b0; + store_ip_payload_axis_temp_to_output = 1'b0; + + if (m_ip_payload_axis_tready_int_reg) begin + // input is ready + if (m_ip_payload_axis_tready || !m_ip_payload_axis_tvalid_reg) begin + // output is ready or currently not valid, transfer data to output + m_ip_payload_axis_tvalid_next = m_ip_payload_axis_tvalid_int; + store_ip_payload_int_to_output = 1'b1; + end else begin + // output is not ready, store input in temp + temp_m_ip_payload_axis_tvalid_next = m_ip_payload_axis_tvalid_int; + store_ip_payload_int_to_temp = 1'b1; + end + end else if (m_ip_payload_axis_tready) begin + // input is not ready, but output is ready + m_ip_payload_axis_tvalid_next = temp_m_ip_payload_axis_tvalid_reg; + temp_m_ip_payload_axis_tvalid_next = 1'b0; + store_ip_payload_axis_temp_to_output = 1'b1; + end +end + +always @(posedge clk) begin + m_ip_payload_axis_tvalid_reg <= m_ip_payload_axis_tvalid_next; + m_ip_payload_axis_tready_int_reg <= m_ip_payload_axis_tready_int_early; + temp_m_ip_payload_axis_tvalid_reg <= temp_m_ip_payload_axis_tvalid_next; + + // datapath + if (store_ip_payload_int_to_output) begin + m_ip_payload_axis_tdata_reg <= m_ip_payload_axis_tdata_int; + m_ip_payload_axis_tkeep_reg <= m_ip_payload_axis_tkeep_int; + m_ip_payload_axis_tlast_reg <= m_ip_payload_axis_tlast_int; + m_ip_payload_axis_tuser_reg <= m_ip_payload_axis_tuser_int; + end else if (store_ip_payload_axis_temp_to_output) begin + m_ip_payload_axis_tdata_reg <= temp_m_ip_payload_axis_tdata_reg; + m_ip_payload_axis_tkeep_reg <= temp_m_ip_payload_axis_tkeep_reg; + m_ip_payload_axis_tlast_reg <= temp_m_ip_payload_axis_tlast_reg; + m_ip_payload_axis_tuser_reg <= temp_m_ip_payload_axis_tuser_reg; + end + + if (store_ip_payload_int_to_temp) begin + temp_m_ip_payload_axis_tdata_reg <= m_ip_payload_axis_tdata_int; + temp_m_ip_payload_axis_tkeep_reg <= m_ip_payload_axis_tkeep_int; + temp_m_ip_payload_axis_tlast_reg <= m_ip_payload_axis_tlast_int; + temp_m_ip_payload_axis_tuser_reg <= m_ip_payload_axis_tuser_int; + end + + if (rst) begin + m_ip_payload_axis_tvalid_reg <= 1'b0; + m_ip_payload_axis_tready_int_reg <= 1'b0; + temp_m_ip_payload_axis_tvalid_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/xgmii_baser_dec_64.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/xgmii_baser_dec_64.v new file mode 100755 index 0000000..4d8e1fa --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/xgmii_baser_dec_64.v @@ -0,0 +1,417 @@ +/* + +Copyright (c) 2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * XGMII 10GBASE-R decoder + */ +module xgmii_baser_dec_64 # +( + parameter DATA_WIDTH = 64, + parameter CTRL_WIDTH = (DATA_WIDTH/8), + parameter HDR_WIDTH = 2 +) +( + input wire clk, + input wire rst, + + /* + * 10GBASE-R encoded input + */ + input wire [DATA_WIDTH-1:0] encoded_rx_data, + input wire [HDR_WIDTH-1:0] encoded_rx_hdr, + + /* + * XGMII interface + */ + output wire [DATA_WIDTH-1:0] xgmii_rxd, + output wire [CTRL_WIDTH-1:0] xgmii_rxc, + + /* + * Status + */ + output wire rx_bad_block, + output wire rx_sequence_error +); + +// bus width assertions +initial begin + if (DATA_WIDTH != 64) begin + $error("Error: Interface width must be 64"); + $finish; + end + + if (CTRL_WIDTH * 8 != DATA_WIDTH) begin + $error("Error: Interface requires byte (8-bit) granularity"); + $finish; + end + + if (HDR_WIDTH != 2) begin + $error("Error: HDR_WIDTH must be 2"); + $finish; + end +end + +localparam [7:0] + XGMII_IDLE = 8'h07, + XGMII_LPI = 8'h06, + XGMII_START = 8'hfb, + XGMII_TERM = 8'hfd, + XGMII_ERROR = 8'hfe, + XGMII_SEQ_OS = 8'h9c, + XGMII_RES_0 = 8'h1c, + XGMII_RES_1 = 8'h3c, + XGMII_RES_2 = 8'h7c, + XGMII_RES_3 = 8'hbc, + XGMII_RES_4 = 8'hdc, + XGMII_RES_5 = 8'hf7, + XGMII_SIG_OS = 8'h5c; + +localparam [6:0] + CTRL_IDLE = 7'h00, + CTRL_LPI = 7'h06, + CTRL_ERROR = 7'h1e, + CTRL_RES_0 = 7'h2d, + CTRL_RES_1 = 7'h33, + CTRL_RES_2 = 7'h4b, + CTRL_RES_3 = 7'h55, + CTRL_RES_4 = 7'h66, + CTRL_RES_5 = 7'h78; + +localparam [3:0] + O_SEQ_OS = 4'h0, + O_SIG_OS = 4'hf; + +localparam [1:0] + SYNC_DATA = 2'b10, + SYNC_CTRL = 2'b01; + +localparam [7:0] + BLOCK_TYPE_CTRL = 8'h1e, // C7 C6 C5 C4 C3 C2 C1 C0 BT + BLOCK_TYPE_OS_4 = 8'h2d, // D7 D6 D5 O4 C3 C2 C1 C0 BT + BLOCK_TYPE_START_4 = 8'h33, // D7 D6 D5 C3 C2 C1 C0 BT + BLOCK_TYPE_OS_START = 8'h66, // D7 D6 D5 O0 D3 D2 D1 BT + BLOCK_TYPE_OS_04 = 8'h55, // D7 D6 D5 O4 O0 D3 D2 D1 BT + BLOCK_TYPE_START_0 = 8'h78, // D7 D6 D5 D4 D3 D2 D1 BT + BLOCK_TYPE_OS_0 = 8'h4b, // C7 C6 C5 C4 O0 D3 D2 D1 BT + BLOCK_TYPE_TERM_0 = 8'h87, // C7 C6 C5 C4 C3 C2 C1 BT + BLOCK_TYPE_TERM_1 = 8'h99, // C7 C6 C5 C4 C3 C2 D0 BT + BLOCK_TYPE_TERM_2 = 8'haa, // C7 C6 C5 C4 C3 D1 D0 BT + BLOCK_TYPE_TERM_3 = 8'hb4, // C7 C6 C5 C4 D2 D1 D0 BT + BLOCK_TYPE_TERM_4 = 8'hcc, // C7 C6 C5 D3 D2 D1 D0 BT + BLOCK_TYPE_TERM_5 = 8'hd2, // C7 C6 D4 D3 D2 D1 D0 BT + BLOCK_TYPE_TERM_6 = 8'he1, // C7 D5 D4 D3 D2 D1 D0 BT + BLOCK_TYPE_TERM_7 = 8'hff; // D6 D5 D4 D3 D2 D1 D0 BT + +reg [DATA_WIDTH-1:0] decoded_ctrl; +reg [CTRL_WIDTH-1:0] decode_err; + +reg [DATA_WIDTH-1:0] xgmii_rxd_reg = {DATA_WIDTH{1'b0}}, xgmii_rxd_next; +reg [CTRL_WIDTH-1:0] xgmii_rxc_reg = {CTRL_WIDTH{1'b0}}, xgmii_rxc_next; + +reg rx_bad_block_reg = 1'b0, rx_bad_block_next; +reg rx_sequence_error_reg = 1'b0, rx_sequence_error_next; +reg frame_reg = 1'b0, frame_next; + +assign xgmii_rxd = xgmii_rxd_reg; +assign xgmii_rxc = xgmii_rxc_reg; + +assign rx_bad_block = rx_bad_block_reg; +assign rx_sequence_error = rx_sequence_error_reg; + +integer i; + +always @* begin + xgmii_rxd_next = {8{XGMII_ERROR}}; + xgmii_rxc_next = 8'hff; + rx_bad_block_next = 1'b0; + rx_sequence_error_next = 1'b0; + frame_next = frame_reg; + + for (i = 0; i < CTRL_WIDTH; i = i + 1) begin + case (encoded_rx_data[7*i+8 +: 7]) + CTRL_IDLE: begin + decoded_ctrl[8*i +: 8] = XGMII_IDLE; + decode_err[i] = 1'b0; + end + CTRL_LPI: begin + decoded_ctrl[8*i +: 8] = XGMII_LPI; + decode_err[i] = 1'b0; + end + CTRL_ERROR: begin + decoded_ctrl[8*i +: 8] = XGMII_ERROR; + decode_err[i] = 1'b0; + end + CTRL_RES_0: begin + decoded_ctrl[8*i +: 8] = XGMII_RES_0; + decode_err[i] = 1'b0; + end + CTRL_RES_1: begin + decoded_ctrl[8*i +: 8] = XGMII_RES_1; + decode_err[i] = 1'b0; + end + CTRL_RES_2: begin + decoded_ctrl[8*i +: 8] = XGMII_RES_2; + decode_err[i] = 1'b0; + end + CTRL_RES_3: begin + decoded_ctrl[8*i +: 8] = XGMII_RES_3; + decode_err[i] = 1'b0; + end + CTRL_RES_4: begin + decoded_ctrl[8*i +: 8] = XGMII_RES_4; + decode_err[i] = 1'b0; + end + CTRL_RES_5: begin + decoded_ctrl[8*i +: 8] = XGMII_RES_5; + decode_err[i] = 1'b0; + end + default: begin + decoded_ctrl[8*i +: 8] = XGMII_ERROR; + decode_err[i] = 1'b1; + end + endcase + end + + // use only four bits of block type for reduced fanin + if (encoded_rx_hdr[0] == 0) begin + xgmii_rxd_next = encoded_rx_data; + xgmii_rxc_next = 8'h00; + rx_bad_block_next = 1'b0; + end else begin + case (encoded_rx_data[7:4]) + BLOCK_TYPE_CTRL[7:4]: begin + // C7 C6 C5 C4 C3 C2 C1 C0 BT + xgmii_rxd_next = decoded_ctrl; + xgmii_rxc_next = 8'hff; + rx_bad_block_next = decode_err != 0; + end + BLOCK_TYPE_OS_4[7:4]: begin + // D7 D6 D5 O4 C3 C2 C1 C0 BT + xgmii_rxd_next[31:0] = decoded_ctrl[31:0]; + xgmii_rxc_next[3:0] = 4'hf; + xgmii_rxd_next[63:40] = encoded_rx_data[63:40]; + xgmii_rxc_next[7:4] = 4'h1; + if (encoded_rx_data[39:36] == O_SEQ_OS) begin + xgmii_rxd_next[39:32] = XGMII_SEQ_OS; + rx_bad_block_next = decode_err[3:0] != 0; + end else begin + xgmii_rxd_next[39:32] = XGMII_ERROR; + rx_bad_block_next = 1'b1; + end + end + BLOCK_TYPE_START_4[7:4]: begin + // D7 D6 D5 C3 C2 C1 C0 BT + xgmii_rxd_next = {encoded_rx_data[63:40], XGMII_START, decoded_ctrl[31:0]}; + xgmii_rxc_next = 8'h1f; + rx_bad_block_next = decode_err[3:0] != 0; + rx_sequence_error_next = frame_reg; + frame_next = 1'b1; + end + BLOCK_TYPE_OS_START[7:4]: begin + // D7 D6 D5 O0 D3 D2 D1 BT + xgmii_rxd_next[31:8] = encoded_rx_data[31:8]; + xgmii_rxc_next[3:0] = 4'hf; + if (encoded_rx_data[35:32] == O_SEQ_OS) begin + xgmii_rxd_next[7:0] = XGMII_SEQ_OS; + rx_bad_block_next = 1'b0; + end else begin + xgmii_rxd_next[7:0] = XGMII_ERROR; + rx_bad_block_next = 1'b1; + end + xgmii_rxd_next[63:32] = {encoded_rx_data[63:40], XGMII_START}; + xgmii_rxc_next[7:4] = 4'h1; + rx_sequence_error_next = frame_reg; + frame_next = 1'b1; + end + BLOCK_TYPE_OS_04[7:4]: begin + // D7 D6 D5 O4 O0 D3 D2 D1 BT + rx_bad_block_next = 1'b0; + xgmii_rxd_next[31:8] = encoded_rx_data[31:8]; + xgmii_rxc_next[3:0] = 4'h1; + if (encoded_rx_data[35:32] == O_SEQ_OS) begin + xgmii_rxd_next[7:0] = XGMII_SEQ_OS; + end else begin + xgmii_rxd_next[7:0] = XGMII_ERROR; + rx_bad_block_next = 1'b1; + end + xgmii_rxd_next[63:40] = encoded_rx_data[63:40]; + xgmii_rxc_next[7:4] = 4'h1; + if (encoded_rx_data[39:36] == O_SEQ_OS) begin + xgmii_rxd_next[39:32] = XGMII_SEQ_OS; + end else begin + xgmii_rxd_next[39:32] = XGMII_ERROR; + rx_bad_block_next = 1'b1; + end + end + BLOCK_TYPE_START_0[7:4]: begin + // D7 D6 D5 D4 D3 D2 D1 BT + xgmii_rxd_next = {encoded_rx_data[63:8], XGMII_START}; + xgmii_rxc_next = 8'h01; + rx_bad_block_next = 1'b0; + rx_sequence_error_next = frame_reg; + frame_next = 1'b1; + end + BLOCK_TYPE_OS_0[7:4]: begin + // C7 C6 C5 C4 O0 D3 D2 D1 BT + xgmii_rxd_next[31:8] = encoded_rx_data[31:8]; + xgmii_rxc_next[3:0] = 4'h1; + if (encoded_rx_data[35:32] == O_SEQ_OS) begin + xgmii_rxd_next[7:0] = XGMII_SEQ_OS; + rx_bad_block_next = decode_err[7:4] != 0; + end else begin + xgmii_rxd_next[7:0] = XGMII_ERROR; + rx_bad_block_next = 1'b1; + end + xgmii_rxd_next[63:32] = decoded_ctrl[63:32]; + xgmii_rxc_next[7:4] = 4'hf; + end + BLOCK_TYPE_TERM_0[7:4]: begin + // C7 C6 C5 C4 C3 C2 C1 BT + xgmii_rxd_next = {decoded_ctrl[63:8], XGMII_TERM}; + xgmii_rxc_next = 8'hff; + rx_bad_block_next = decode_err[7:1] != 0; + rx_sequence_error_next = !frame_reg; + frame_next = 1'b0; + end + BLOCK_TYPE_TERM_1[7:4]: begin + // C7 C6 C5 C4 C3 C2 D0 BT + xgmii_rxd_next = {decoded_ctrl[63:16], XGMII_TERM, encoded_rx_data[15:8]}; + xgmii_rxc_next = 8'hfe; + rx_bad_block_next = decode_err[7:2] != 0; + rx_sequence_error_next = !frame_reg; + frame_next = 1'b0; + end + BLOCK_TYPE_TERM_2[7:4]: begin + // C7 C6 C5 C4 C3 D1 D0 BT + xgmii_rxd_next = {decoded_ctrl[63:24], XGMII_TERM, encoded_rx_data[23:8]}; + xgmii_rxc_next = 8'hfc; + rx_bad_block_next = decode_err[7:3] != 0; + rx_sequence_error_next = !frame_reg; + frame_next = 1'b0; + end + BLOCK_TYPE_TERM_3[7:4]: begin + // C7 C6 C5 C4 D2 D1 D0 BT + xgmii_rxd_next = {decoded_ctrl[63:32], XGMII_TERM, encoded_rx_data[31:8]}; + xgmii_rxc_next = 8'hf8; + rx_bad_block_next = decode_err[7:4] != 0; + rx_sequence_error_next = !frame_reg; + frame_next = 1'b0; + end + BLOCK_TYPE_TERM_4[7:4]: begin + // C7 C6 C5 D3 D2 D1 D0 BT + xgmii_rxd_next = {decoded_ctrl[63:40], XGMII_TERM, encoded_rx_data[39:8]}; + xgmii_rxc_next = 8'hf0; + rx_bad_block_next = decode_err[7:5] != 0; + rx_sequence_error_next = !frame_reg; + frame_next = 1'b0; + end + BLOCK_TYPE_TERM_5[7:4]: begin + // C7 C6 D4 D3 D2 D1 D0 BT + xgmii_rxd_next = {decoded_ctrl[63:48], XGMII_TERM, encoded_rx_data[47:8]}; + xgmii_rxc_next = 8'he0; + rx_bad_block_next = decode_err[7:6] != 0; + rx_sequence_error_next = !frame_reg; + frame_next = 1'b0; + end + BLOCK_TYPE_TERM_6[7:4]: begin + // C7 D5 D4 D3 D2 D1 D0 BT + xgmii_rxd_next = {decoded_ctrl[63:56], XGMII_TERM, encoded_rx_data[55:8]}; + xgmii_rxc_next = 8'hc0; + rx_bad_block_next = decode_err[7] != 0; + rx_sequence_error_next = !frame_reg; + frame_next = 1'b0; + end + BLOCK_TYPE_TERM_7[7:4]: begin + // D6 D5 D4 D3 D2 D1 D0 BT + xgmii_rxd_next = {XGMII_TERM, encoded_rx_data[63:8]}; + xgmii_rxc_next = 8'h80; + rx_bad_block_next = 1'b0; + rx_sequence_error_next = !frame_reg; + frame_next = 1'b0; + end + default: begin + // invalid block type + xgmii_rxd_next = {8{XGMII_ERROR}}; + xgmii_rxc_next = 8'hff; + rx_bad_block_next = 1'b1; + end + endcase + end + + // check all block type bits to detect bad encodings + if (encoded_rx_hdr == SYNC_DATA) begin + end else if (encoded_rx_hdr == SYNC_CTRL) begin + case (encoded_rx_data[7:0]) + BLOCK_TYPE_CTRL: begin end + BLOCK_TYPE_OS_4: begin end + BLOCK_TYPE_START_4: begin end + BLOCK_TYPE_OS_START: begin end + BLOCK_TYPE_OS_04: begin end + BLOCK_TYPE_START_0: begin end + BLOCK_TYPE_OS_0: begin end + BLOCK_TYPE_TERM_0: begin end + BLOCK_TYPE_TERM_1: begin end + BLOCK_TYPE_TERM_2: begin end + BLOCK_TYPE_TERM_3: begin end + BLOCK_TYPE_TERM_4: begin end + BLOCK_TYPE_TERM_5: begin end + BLOCK_TYPE_TERM_6: begin end + BLOCK_TYPE_TERM_7: begin end + default: begin + // invalid block type + xgmii_rxd_next = {8{XGMII_ERROR}}; + xgmii_rxc_next = 8'hff; + rx_bad_block_next = 1'b1; + end + endcase + end else begin + // invalid header + xgmii_rxd_next = {8{XGMII_ERROR}}; + xgmii_rxc_next = 8'hff; + rx_bad_block_next = 1'b1; + end +end + +always @(posedge clk) begin + xgmii_rxd_reg <= xgmii_rxd_next; + xgmii_rxc_reg <= xgmii_rxc_next; + + rx_bad_block_reg <= rx_bad_block_next; + rx_sequence_error_reg <= rx_sequence_error_next; + frame_reg <= frame_next; + + if (rst) begin + frame_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/xgmii_baser_enc_64.v b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/xgmii_baser_enc_64.v new file mode 100755 index 0000000..7436fd2 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/verilog_ethernet/xgmii_baser_enc_64.v @@ -0,0 +1,284 @@ +/* + +Copyright (c) 2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * XGMII 10GBASE-R encoder + */ +module xgmii_baser_enc_64 # +( + parameter DATA_WIDTH = 64, + parameter CTRL_WIDTH = (DATA_WIDTH/8), + parameter HDR_WIDTH = 2 +) +( + input wire clk, + input wire rst, + + /* + * XGMII interface + */ + input wire [DATA_WIDTH-1:0] xgmii_txd, + input wire [CTRL_WIDTH-1:0] xgmii_txc, + + /* + * 10GBASE-R encoded interface + */ + output wire [DATA_WIDTH-1:0] encoded_tx_data, + output wire [HDR_WIDTH-1:0] encoded_tx_hdr, + + /* + * Status + */ + output wire tx_bad_block +); + +// bus width assertions +initial begin + if (DATA_WIDTH != 64) begin + $error("Error: Interface width must be 64"); + $finish; + end + + if (CTRL_WIDTH * 8 != DATA_WIDTH) begin + $error("Error: Interface requires byte (8-bit) granularity"); + $finish; + end + + if (HDR_WIDTH != 2) begin + $error("Error: HDR_WIDTH must be 2"); + $finish; + end +end + +localparam [7:0] + XGMII_IDLE = 8'h07, + XGMII_LPI = 8'h06, + XGMII_START = 8'hfb, + XGMII_TERM = 8'hfd, + XGMII_ERROR = 8'hfe, + XGMII_SEQ_OS = 8'h9c, + XGMII_RES_0 = 8'h1c, + XGMII_RES_1 = 8'h3c, + XGMII_RES_2 = 8'h7c, + XGMII_RES_3 = 8'hbc, + XGMII_RES_4 = 8'hdc, + XGMII_RES_5 = 8'hf7, + XGMII_SIG_OS = 8'h5c; + +localparam [6:0] + CTRL_IDLE = 7'h00, + CTRL_LPI = 7'h06, + CTRL_ERROR = 7'h1e, + CTRL_RES_0 = 7'h2d, + CTRL_RES_1 = 7'h33, + CTRL_RES_2 = 7'h4b, + CTRL_RES_3 = 7'h55, + CTRL_RES_4 = 7'h66, + CTRL_RES_5 = 7'h78; + +localparam [3:0] + O_SEQ_OS = 4'h0, + O_SIG_OS = 4'hf; + +localparam [1:0] + SYNC_DATA = 2'b10, + SYNC_CTRL = 2'b01; + +localparam [7:0] + BLOCK_TYPE_CTRL = 8'h1e, // C7 C6 C5 C4 C3 C2 C1 C0 BT + BLOCK_TYPE_OS_4 = 8'h2d, // D7 D6 D5 O4 C3 C2 C1 C0 BT + BLOCK_TYPE_START_4 = 8'h33, // D7 D6 D5 C3 C2 C1 C0 BT + BLOCK_TYPE_OS_START = 8'h66, // D7 D6 D5 O0 D3 D2 D1 BT + BLOCK_TYPE_OS_04 = 8'h55, // D7 D6 D5 O4 O0 D3 D2 D1 BT + BLOCK_TYPE_START_0 = 8'h78, // D7 D6 D5 D4 D3 D2 D1 BT + BLOCK_TYPE_OS_0 = 8'h4b, // C7 C6 C5 C4 O0 D3 D2 D1 BT + BLOCK_TYPE_TERM_0 = 8'h87, // C7 C6 C5 C4 C3 C2 C1 BT + BLOCK_TYPE_TERM_1 = 8'h99, // C7 C6 C5 C4 C3 C2 D0 BT + BLOCK_TYPE_TERM_2 = 8'haa, // C7 C6 C5 C4 C3 D1 D0 BT + BLOCK_TYPE_TERM_3 = 8'hb4, // C7 C6 C5 C4 D2 D1 D0 BT + BLOCK_TYPE_TERM_4 = 8'hcc, // C7 C6 C5 D3 D2 D1 D0 BT + BLOCK_TYPE_TERM_5 = 8'hd2, // C7 C6 D4 D3 D2 D1 D0 BT + BLOCK_TYPE_TERM_6 = 8'he1, // C7 D5 D4 D3 D2 D1 D0 BT + BLOCK_TYPE_TERM_7 = 8'hff; // D6 D5 D4 D3 D2 D1 D0 BT + +reg [DATA_WIDTH*7/8-1:0] encoded_ctrl; +reg [CTRL_WIDTH-1:0] encode_err; + +reg [DATA_WIDTH-1:0] encoded_tx_data_reg = {DATA_WIDTH{1'b0}}, encoded_tx_data_next; +reg [HDR_WIDTH-1:0] encoded_tx_hdr_reg = {HDR_WIDTH{1'b0}}, encoded_tx_hdr_next; + +reg tx_bad_block_reg = 1'b0, tx_bad_block_next; + +assign encoded_tx_data = encoded_tx_data_reg; +assign encoded_tx_hdr = encoded_tx_hdr_reg; + +assign tx_bad_block = tx_bad_block_reg; + +integer i; + +always @* begin + tx_bad_block_next = 1'b0; + + for (i = 0; i < CTRL_WIDTH; i = i + 1) begin + if (xgmii_txc[i]) begin + // control + case (xgmii_txd[8*i +: 8]) + XGMII_IDLE: begin + encoded_ctrl[7*i +: 7] = CTRL_IDLE; + encode_err[i] = 1'b0; + end + XGMII_LPI: begin + encoded_ctrl[7*i +: 7] = CTRL_LPI; + encode_err[i] = 1'b0; + end + XGMII_ERROR: begin + encoded_ctrl[7*i +: 7] = CTRL_ERROR; + encode_err[i] = 1'b0; + end + XGMII_RES_0: begin + encoded_ctrl[7*i +: 7] = CTRL_RES_0; + encode_err[i] = 1'b0; + end + XGMII_RES_1: begin + encoded_ctrl[7*i +: 7] = CTRL_RES_1; + encode_err[i] = 1'b0; + end + XGMII_RES_2: begin + encoded_ctrl[7*i +: 7] = CTRL_RES_2; + encode_err[i] = 1'b0; + end + XGMII_RES_3: begin + encoded_ctrl[7*i +: 7] = CTRL_RES_3; + encode_err[i] = 1'b0; + end + XGMII_RES_4: begin + encoded_ctrl[7*i +: 7] = CTRL_RES_4; + encode_err[i] = 1'b0; + end + XGMII_RES_5: begin + encoded_ctrl[7*i +: 7] = CTRL_RES_5; + encode_err[i] = 1'b0; + end + default: begin + encoded_ctrl[7*i +: 7] = CTRL_ERROR; + encode_err[i] = 1'b1; + end + endcase + end else begin + // data (always invalid as control) + encoded_ctrl[7*i +: 7] = CTRL_ERROR; + encode_err[i] = 1'b1; + end + end + + if (xgmii_txc == 8'h00) begin + encoded_tx_data_next = xgmii_txd; + encoded_tx_hdr_next = SYNC_DATA; + tx_bad_block_next = 1'b0; + end else begin + if (xgmii_txc == 8'h1f && xgmii_txd[39:32] == XGMII_SEQ_OS) begin + // ordered set in lane 4 + encoded_tx_data_next = {xgmii_txd[63:40], O_SEQ_OS, encoded_ctrl[27:0], BLOCK_TYPE_OS_4}; + tx_bad_block_next = encode_err[3:0] != 0; + end else if (xgmii_txc == 8'h1f && xgmii_txd[39:32] == XGMII_START) begin + // start in lane 4 + encoded_tx_data_next = {xgmii_txd[63:40], 4'd0, encoded_ctrl[27:0], BLOCK_TYPE_START_4}; + tx_bad_block_next = encode_err[3:0] != 0; + end else if (xgmii_txc == 8'h11 && xgmii_txd[7:0] == XGMII_SEQ_OS && xgmii_txd[39:32] == XGMII_START) begin + // ordered set in lane 0, start in lane 4 + encoded_tx_data_next = {xgmii_txd[63:40], 4'd0, O_SEQ_OS, xgmii_txd[31:8], BLOCK_TYPE_OS_START}; + tx_bad_block_next = 1'b0; + end else if (xgmii_txc == 8'h11 && xgmii_txd[7:0] == XGMII_SEQ_OS && xgmii_txd[39:32] == XGMII_SEQ_OS) begin + // ordered set in lane 0 and lane 4 + encoded_tx_data_next = {xgmii_txd[63:40], O_SEQ_OS, O_SEQ_OS, xgmii_txd[31:8], BLOCK_TYPE_OS_04}; + tx_bad_block_next = 1'b0; + end else if (xgmii_txc == 8'h01 && xgmii_txd[7:0] == XGMII_START) begin + // start in lane 0 + encoded_tx_data_next = {xgmii_txd[63:8], BLOCK_TYPE_START_0}; + tx_bad_block_next = 1'b0; + end else if (xgmii_txc == 8'hf1 && xgmii_txd[7:0] == XGMII_SEQ_OS) begin + // ordered set in lane 0 + encoded_tx_data_next = {encoded_ctrl[55:28], O_SEQ_OS, xgmii_txd[31:8], BLOCK_TYPE_OS_0}; + tx_bad_block_next = encode_err[7:4] != 0; + end else if (xgmii_txc == 8'hff && xgmii_txd[7:0] == XGMII_TERM) begin + // terminate in lane 0 + encoded_tx_data_next = {encoded_ctrl[55:7], 7'd0, BLOCK_TYPE_TERM_0}; + tx_bad_block_next = encode_err[7:1] != 0; + end else if (xgmii_txc == 8'hfe && xgmii_txd[15:8] == XGMII_TERM) begin + // terminate in lane 1 + encoded_tx_data_next = {encoded_ctrl[55:14], 6'd0, xgmii_txd[7:0], BLOCK_TYPE_TERM_1}; + tx_bad_block_next = encode_err[7:2] != 0; + end else if (xgmii_txc == 8'hfc && xgmii_txd[23:16] == XGMII_TERM) begin + // terminate in lane 2 + encoded_tx_data_next = {encoded_ctrl[55:21], 5'd0, xgmii_txd[15:0], BLOCK_TYPE_TERM_2}; + tx_bad_block_next = encode_err[7:3] != 0; + end else if (xgmii_txc == 8'hf8 && xgmii_txd[31:24] == XGMII_TERM) begin + // terminate in lane 3 + encoded_tx_data_next = {encoded_ctrl[55:28], 4'd0, xgmii_txd[23:0], BLOCK_TYPE_TERM_3}; + tx_bad_block_next = encode_err[7:4] != 0; + end else if (xgmii_txc == 8'hf0 && xgmii_txd[39:32] == XGMII_TERM) begin + // terminate in lane 4 + encoded_tx_data_next = {encoded_ctrl[55:35], 3'd0, xgmii_txd[31:0], BLOCK_TYPE_TERM_4}; + tx_bad_block_next = encode_err[7:5] != 0; + end else if (xgmii_txc == 8'he0 && xgmii_txd[47:40] == XGMII_TERM) begin + // terminate in lane 5 + encoded_tx_data_next = {encoded_ctrl[55:42], 2'd0, xgmii_txd[39:0], BLOCK_TYPE_TERM_5}; + tx_bad_block_next = encode_err[7:6] != 0; + end else if (xgmii_txc == 8'hc0 && xgmii_txd[55:48] == XGMII_TERM) begin + // terminate in lane 6 + encoded_tx_data_next = {encoded_ctrl[55:49], 1'd0, xgmii_txd[47:0], BLOCK_TYPE_TERM_6}; + tx_bad_block_next = encode_err[7] != 0; + end else if (xgmii_txc == 8'h80 && xgmii_txd[63:56] == XGMII_TERM) begin + // terminate in lane 7 + encoded_tx_data_next = {xgmii_txd[55:0], BLOCK_TYPE_TERM_7}; + tx_bad_block_next = 1'b0; + end else if (xgmii_txc == 8'hff) begin + // all control + encoded_tx_data_next = {encoded_ctrl, BLOCK_TYPE_CTRL}; + tx_bad_block_next = encode_err != 0; + end else begin + // no corresponding block format + encoded_tx_data_next = {{8{CTRL_ERROR}}, BLOCK_TYPE_CTRL}; + tx_bad_block_next = 1'b1; + end + encoded_tx_hdr_next = SYNC_CTRL; + end +end + +always @(posedge clk) begin + encoded_tx_data_reg <= encoded_tx_data_next; + encoded_tx_hdr_reg <= encoded_tx_hdr_next; + + tx_bad_block_reg <= tx_bad_block_next; +end + +endmodule + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/hdl/waveform_gen.v b/radar_alinx_kintex.srcs/sources_1/hdl/waveform_gen.v new file mode 100755 index 0000000..1302040 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/hdl/waveform_gen.v @@ -0,0 +1,367 @@ +`resetall +`timescale 1ns / 1ps +`default_nettype none + +module waveform_gen # +( + parameter CTRL_REG_ADDR = 32'h00000000, + parameter NUM_SAMPLES_REG_ADDR = 32'h00000004, + parameter START_SAMPLE_REG_ADDR = 32'h00000008, + + parameter integer AXI_ADDR_WIDTH = 32, + parameter integer AXI_DATA_WIDTH = 32 +) +( + input wire clk, + + // AXI4L Config Interface + axi4l_intf.slave ctrl_if, + + input wire start_of_pulse, + + input wire [14:0] dac0_wf_bram_addr, + input wire dac0_wf_bram_clk, + input wire [31:0] dac0_wf_bram_din, + output wire [31:0] dac0_wf_bram_dout, + input wire dac0_wf_bram_en, + input wire dac0_wf_bram_rst, + input wire [3:0] dac0_wf_bram_we, + + input wire [14:0] dac1_wf_bram_addr, + input wire dac1_wf_bram_clk, + input wire [31:0] dac1_wf_bram_din, + output wire [31:0] dac1_wf_bram_dout, + input wire dac1_wf_bram_en, + input wire dac1_wf_bram_rst, + input wire [3:0] dac1_wf_bram_we, + + input wire [14:0] dac2_wf_bram_addr, + input wire dac2_wf_bram_clk, + input wire [31:0] dac2_wf_bram_din, + output wire [31:0] dac2_wf_bram_dout, + input wire dac2_wf_bram_en, + input wire dac2_wf_bram_rst, + input wire [3:0] dac2_wf_bram_we, + + input wire [14:0] dac3_wf_bram_addr, + input wire dac3_wf_bram_clk, + input wire [31:0] dac3_wf_bram_din, + output wire [31:0] dac3_wf_bram_dout, + input wire dac3_wf_bram_en, + input wire dac3_wf_bram_rst, + input wire [3:0] dac3_wf_bram_we, + + + output wire [511:0] jesd_tx +); + + + +reg [15:0] dac0_bram_addr; +wire [127:0] dac0_bram_dout; +reg [15:0] dac1_bram_addr; +wire [127:0] dac1_bram_dout; +reg [15:0] dac2_bram_addr; +wire [127:0] dac2_bram_dout; +reg [15:0] dac3_bram_addr; +wire [127:0] dac3_bram_dout; + + +// ------------------------------ +// AXIL Decode +// ------------------------------ +wire [AXI_ADDR_WIDTH-1 : 0] raddr; +wire [AXI_ADDR_WIDTH-1 : 0] waddr; +wire rden; +wire wren; +wire [AXI_DATA_WIDTH-1 : 0] wdata; +reg [AXI_DATA_WIDTH-1 : 0] rdata; + + +axil_slave +# ( + .DATA_WIDTH(AXI_DATA_WIDTH), + .ADDR_WIDTH(AXI_ADDR_WIDTH) +) axil_slave_i +( + // AXIL Slave + .S_AXI_ACLK(ctrl_if.clk), + .S_AXI_ARESETN(ctrl_if.resetn), + .S_AXI_AWADDR(ctrl_if.awaddr), + .S_AXI_AWPROT(ctrl_if.awprot), + .S_AXI_AWVALID(ctrl_if.awvalid), + .S_AXI_AWREADY(ctrl_if.awready), + .S_AXI_WDATA(ctrl_if.wdata), + .S_AXI_WSTRB(ctrl_if.wstrb), + .S_AXI_WVALID(ctrl_if.wvalid), + .S_AXI_WREADY(ctrl_if.wready), + .S_AXI_BRESP(ctrl_if.bresp), + .S_AXI_BVALID(ctrl_if.bvalid), + .S_AXI_BREADY(ctrl_if.bready), + .S_AXI_ARADDR(ctrl_if.araddr), + .S_AXI_ARPROT(ctrl_if.arprot), + .S_AXI_ARVALID(ctrl_if.arvalid), + .S_AXI_ARREADY(ctrl_if.arready), + .S_AXI_RDATA(ctrl_if.rdata), + .S_AXI_RRESP(ctrl_if.rresp), + .S_AXI_RVALID(ctrl_if.rvalid), + .S_AXI_RREADY(ctrl_if.rready), + + .raddr(raddr), + .waddr(waddr), + .wren(wren), + .rden(rden), + .wdata(wdata), + .rdata(rdata) +); + +// ------------------------------ +// Config Registers +// ------------------------------ +wire reset; +reg [31:0] reg_ctrl; +reg [15:0] reg_num_samples; +reg [27:0] reg_start_sample; + +always @ (posedge ctrl_if.clk) begin + if (~ctrl_if.resetn) begin + reg_ctrl <= 0; + end else if (wren && waddr[11:0] == CTRL_REG_ADDR) begin + reg_ctrl <= wdata[15:0]; + end +end + +always @ (posedge ctrl_if.clk) begin + if (~ctrl_if.resetn) begin + reg_num_samples <= 0; + end else if (wren && waddr[11:0] == NUM_SAMPLES_REG_ADDR) begin + reg_num_samples <= wdata[15:0]; + end +end + +always @ (posedge ctrl_if.clk) begin + if (~ctrl_if.resetn) begin + reg_start_sample <= 0; + end else if (wren && waddr[11:0] == START_SAMPLE_REG_ADDR) begin + reg_start_sample <= wdata; + end +end + +always @ (posedge ctrl_if.clk) begin + if (rden) begin + if ( raddr[11:0] == CTRL_REG_ADDR ) + rdata <= reg_ctrl; + if ( raddr[11:0] == NUM_SAMPLES_REG_ADDR ) + rdata <= reg_num_samples; + if ( raddr[11:0] == START_SAMPLE_REG_ADDR ) + rdata <= reg_start_sample; + end +end + +assign reset = reg_ctrl[0]; + +// ------------------------------ +// Sample gating +// ------------------------------ +reg [16:0] sample_cnt; +reg pulse_active; +reg pulse_active_q; +reg pulse_active_q2; + + +// Delay event pulse by start sample +reg [27:0] start_sample_cnt; +reg [27:0] start_sample_this_pulse; +reg delay_active; +reg delay_active_q; +reg delay_active_fed; + + +reg [255:0] jesd_out_reg; +reg [255:0] all_brams_out; + +always @ (posedge clk) begin + if (reset == 1'b1) begin + start_sample_cnt <= 0; + delay_active <= 0; + end else begin + + delay_active_q <= delay_active; + delay_active_fed <= ~delay_active && delay_active_q; + + if (start_of_pulse) begin + start_sample_cnt <= reg_start_sample; + start_sample_this_pulse <= reg_start_sample; + delay_active <= 1; + end + + if (delay_active) begin + start_sample_cnt <= start_sample_cnt - 1; + if (start_sample_cnt == 0) begin + delay_active <= 0; + end + end + + end +end + +always @ (posedge clk) begin + if (reset == 1'b1) begin + sample_cnt <= 0; + pulse_active <= 0; + pulse_active_q <= 0; + pulse_active_q2 <= 0; + + end else begin + + pulse_active_q <= pulse_active; + pulse_active_q2 <= pulse_active_q; + + if (delay_active_fed) begin + sample_cnt <= 0; + pulse_active <= 1; + end; + + if (pulse_active) begin + sample_cnt <= sample_cnt + 1; + if (sample_cnt == reg_num_samples-1) begin + sample_cnt <= 0; + pulse_active <= 0; + end + end + + if (pulse_active_q2) begin + jesd_out_reg <= all_brams_out; + end else begin + jesd_out_reg <= 0; + end + + end +end + +always @ (posedge clk) begin + if (pulse_active) begin + dac0_bram_addr <= dac0_bram_addr + 1; + end else begin + dac0_bram_addr <= 0; + end +end + + +//assign all_brams_out[16*0+15 + 384 : 16*0 + 384] = dac3_bram_dout[16*6+15:16*6]; +//assign all_brams_out[16*1+15 + 384 : 16*1 + 384] = dac3_bram_dout[16*4+15:16*4]; +//assign all_brams_out[16*2+15 + 384 : 16*2 + 384] = dac3_bram_dout[16*2+15:16*2]; +//assign all_brams_out[16*3+15 + 384 : 16*3 + 384] = dac3_bram_dout[16*0+15:16*0]; +//assign all_brams_out[16*4+15 + 384 : 16*4 + 384] = dac3_bram_dout[16*7+15:16*7]; +//assign all_brams_out[16*5+15 + 384 : 16*5 + 384] = dac3_bram_dout[16*5+15:16*5]; +//assign all_brams_out[16*6+15 + 384 : 16*6 + 384] = dac3_bram_dout[16*3+15:16*3]; +//assign all_brams_out[16*7+15 + 384 : 16*7 + 384] = dac3_bram_dout[16*1+15:16*1]; + +//assign all_brams_out[16*0+15 + 256 : 16*0 + 256] = dac2_bram_dout[16*6+15:16*6]; +//assign all_brams_out[16*1+15 + 256 : 16*1 + 256] = dac2_bram_dout[16*4+15:16*4]; +//assign all_brams_out[16*2+15 + 256 : 16*2 + 256] = dac2_bram_dout[16*2+15:16*2]; +//assign all_brams_out[16*3+15 + 256 : 16*3 + 256] = dac2_bram_dout[16*0+15:16*0]; +//assign all_brams_out[16*4+15 + 256 : 16*4 + 256] = dac2_bram_dout[16*7+15:16*7]; +//assign all_brams_out[16*5+15 + 256 : 16*5 + 256] = dac2_bram_dout[16*5+15:16*5]; +//assign all_brams_out[16*6+15 + 256 : 16*6 + 256] = dac2_bram_dout[16*3+15:16*3]; +//assign all_brams_out[16*7+15 + 256 : 16*7 + 256] = dac2_bram_dout[16*1+15:16*1]; + +assign all_brams_out[16*0+15 + 128 : 16*0 + 128] = dac1_bram_dout[16*6+15:16*6]; +assign all_brams_out[16*1+15 + 128 : 16*1 + 128] = dac1_bram_dout[16*4+15:16*4]; +assign all_brams_out[16*2+15 + 128 : 16*2 + 128] = dac1_bram_dout[16*2+15:16*2]; +assign all_brams_out[16*3+15 + 128 : 16*3 + 128] = dac1_bram_dout[16*0+15:16*0]; +assign all_brams_out[16*4+15 + 128 : 16*4 + 128] = dac1_bram_dout[16*7+15:16*7]; +assign all_brams_out[16*5+15 + 128 : 16*5 + 128] = dac1_bram_dout[16*5+15:16*5]; +assign all_brams_out[16*6+15 + 128 : 16*6 + 128] = dac1_bram_dout[16*3+15:16*3]; +assign all_brams_out[16*7+15 + 128 : 16*7 + 128] = dac1_bram_dout[16*1+15:16*1]; + +assign all_brams_out[16*0+15 + 0 : 16*0 + 0] = dac0_bram_dout[16*6+15:16*6]; +assign all_brams_out[16*1+15 + 0 : 16*1 + 0] = dac0_bram_dout[16*4+15:16*4]; +assign all_brams_out[16*2+15 + 0 : 16*2 + 0] = dac0_bram_dout[16*2+15:16*2]; +assign all_brams_out[16*3+15 + 0 : 16*3 + 0] = dac0_bram_dout[16*0+15:16*0]; +assign all_brams_out[16*4+15 + 0 : 16*4 + 0] = dac0_bram_dout[16*7+15:16*7]; +assign all_brams_out[16*5+15 + 0 : 16*5 + 0] = dac0_bram_dout[16*5+15:16*5]; +assign all_brams_out[16*6+15 + 0 : 16*6 + 0] = dac0_bram_dout[16*3+15:16*3]; +assign all_brams_out[16*7+15 + 0 : 16*7 + 0] = dac0_bram_dout[16*1+15:16*1]; + +assign dac1_bram_addr = dac0_bram_addr; +//assign dac2_bram_addr = dac0_bram_addr; +//assign dac3_bram_addr = dac0_bram_addr; + + +// dac2 and dac3 are used for LOs, so just need a constant 1 + j0 output. The NCO +// inside the AD9081 will be used to turn this into a tone + +assign jesd_tx[511:384] = {16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h7FFF, 16'h7FFF, 16'h7FFF, 16'h7FFF}; +assign jesd_tx[383:256] = {16'h0000, 16'h0000, 16'h0000, 16'h0000, 16'h7FFF, 16'h7FFF, 16'h7FFF, 16'h7FFF}; +assign jesd_tx[255:0] = jesd_out_reg; + +wf_memory dac0_wf_mem ( + .clka(dac0_wf_bram_clk), + .ena(dac0_wf_bram_en), + .wea(dac0_wf_bram_we), + .addra(dac0_wf_bram_addr[14:2]), + .dina(dac0_wf_bram_din), + .douta(dac0_wf_bram_dout), + + .clkb(clk), + .enb(1'b1), + .web(1'b0), + .addrb(dac0_bram_addr), + .dinb(0), + .doutb(dac0_bram_dout) +); + +wf_memory dac1_wf_mem ( + .clka(dac1_wf_bram_clk), + .ena(dac1_wf_bram_en), + .wea(dac1_wf_bram_we), + .addra(dac1_wf_bram_addr[14:2]), + .dina(dac1_wf_bram_din), + .douta(dac1_wf_bram_dout), + + .clkb(clk), + .enb(1'b1), + .web(1'b0), + .addrb(dac1_bram_addr), + .dinb(0), + .doutb(dac1_bram_dout) +); + +//wf_memory dac2_wf_mem ( +// .clka(dac2_wf_bram_clk), +// .ena(dac2_wf_bram_en), +// .wea(dac2_wf_bram_we), +// .addra(dac2_wf_bram_addr[14:2]), +// .dina(dac2_wf_bram_din), +// .douta(dac2_wf_bram_dout), + +// .clkb(clk), +// .enb(1'b1), +// .web(1'b0), +// .addrb(dac2_bram_addr), +// .dinb(0), +// .doutb(dac2_bram_dout) +//); + +//wf_memory dac3_wf_mem ( +// .clka(dac3_wf_bram_clk), +// .ena(dac3_wf_bram_en), +// .wea(dac3_wf_bram_we), +// .addra(dac3_wf_bram_addr[14:2]), +// .dina(dac3_wf_bram_din), +// .douta(dac3_wf_bram_dout), + +// .clkb(clk), +// .enb(1'b1), +// .web(1'b0), +// .addrb(dac3_bram_addr), +// .dinb(0), +// .doutb(dac3_bram_dout) +//); + + +endmodule + + +`resetall diff --git a/radar_alinx_kintex.srcs/sources_1/ip/axis_switch_0/axis_switch_0.xci b/radar_alinx_kintex.srcs/sources_1/ip/axis_switch_0/axis_switch_0.xci new file mode 100755 index 0000000..34c7ca9 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/ip/axis_switch_0/axis_switch_0.xci @@ -0,0 +1,507 @@ +{ + "schema": "xilinx.com:schema:json_instance:1.0", + "ip_inst": { + "xci_name": "axis_switch_0", + "component_reference": "xilinx.com:ip:axis_switch:1.1", + "ip_revision": "27", + "gen_directory": "../../../../radar_alinx_kintex.gen/sources_1/ip/axis_switch_0", + "parameters": { + "component_parameters": { + "NUM_SI": [ { "value": "2", "resolve_type": "user", "format": "long", "usage": "all" } ], + "NUM_MI": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "ROUTING_MODE": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "TDATA_NUM_BYTES": [ { "value": "8", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TLAST": [ { "value": "1", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TDEST_WIDTH": [ { "value": "4", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TUSER_WIDTH": [ { "value": "16", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_ACLKEN": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "ARB_ON_MAX_XFERS": [ { "value": "0", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "ARB_ON_NUM_CYCLES": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "ARB_ON_TLAST": [ { "value": "1", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "ARB_ALGORITHM": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "DECODER_REG": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "OUTPUT_REG": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "COMMON_CLOCK": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_AXIS_BASETDEST": [ { "value": "0x00000000", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M01_AXIS_BASETDEST": [ { "value": "0x00000001", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M02_AXIS_BASETDEST": [ { "value": "0x00000002", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M03_AXIS_BASETDEST": [ { "value": "0x00000003", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M04_AXIS_BASETDEST": [ { "value": "0x00000004", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M05_AXIS_BASETDEST": [ { "value": "0x00000005", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M06_AXIS_BASETDEST": [ { "value": "0x00000006", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M07_AXIS_BASETDEST": [ { "value": "0x00000007", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M08_AXIS_BASETDEST": [ { "value": "0x00000008", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M09_AXIS_BASETDEST": [ { "value": "0x00000009", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M10_AXIS_BASETDEST": [ { "value": "0x0000000a", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M11_AXIS_BASETDEST": [ { "value": "0x0000000b", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M12_AXIS_BASETDEST": [ { "value": "0x0000000c", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M13_AXIS_BASETDEST": [ { "value": "0x0000000d", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M14_AXIS_BASETDEST": [ { "value": "0x0000000e", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M15_AXIS_BASETDEST": [ { "value": "0x0000000f", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M00_AXIS_HIGHTDEST": [ { "value": "0x0000000F", "value_src": "user", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M01_AXIS_HIGHTDEST": [ { "value": "0x00000001", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M02_AXIS_HIGHTDEST": [ { "value": "0x00000002", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M03_AXIS_HIGHTDEST": [ { "value": "0x00000003", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M04_AXIS_HIGHTDEST": [ { "value": "0x00000004", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M05_AXIS_HIGHTDEST": [ { "value": "0x00000005", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M06_AXIS_HIGHTDEST": [ { "value": "0x00000006", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M07_AXIS_HIGHTDEST": [ { "value": "0x00000007", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M08_AXIS_HIGHTDEST": [ { "value": "0x00000008", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M09_AXIS_HIGHTDEST": [ { "value": "0x00000009", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M10_AXIS_HIGHTDEST": [ { "value": "0x0000000a", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M11_AXIS_HIGHTDEST": [ { "value": "0x0000000b", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M12_AXIS_HIGHTDEST": [ { "value": "0x0000000c", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M13_AXIS_HIGHTDEST": [ { "value": "0x0000000d", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M14_AXIS_HIGHTDEST": [ { "value": "0x0000000e", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M15_AXIS_HIGHTDEST": [ { "value": "0x0000000f", "resolve_type": "user", "format": "bitString", "usage": "all" } ], + "M00_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M00_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M01_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M02_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M03_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M04_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M05_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M06_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M07_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M08_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M09_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M10_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M11_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M12_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M13_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M14_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S00_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S01_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S02_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S03_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S04_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S05_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S06_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S07_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S08_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S09_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S10_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S11_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S12_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S13_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S14_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M15_S15_CONNECTIVITY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Component_Name": [ { "value": "axis_switch_0", "resolve_type": "user", "usage": "all" } ] + }, + "model_parameters": { + "C_FAMILY": [ { "value": "kintexu", "resolve_type": "generated", "usage": "all" } ], + "C_NUM_SI_SLOTS": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOG_SI_SLOTS": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_NUM_MI_SLOTS": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TDATA_WIDTH": [ { "value": "64", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TID_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TDEST_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TUSER_WIDTH": [ { "value": "16", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_SIGNAL_SET": [ { "value": "0b00000000000000000000000011010011", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_ARB_ON_MAX_XFERS": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ARB_ON_NUM_CYCLES": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ARB_ON_TLAST": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_INCLUDE_ARBITER": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ARB_ALGORITHM": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_OUTPUT_REG": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_DECODER_REG": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_M_AXIS_CONNECTIVITY_ARRAY": [ { "value": "\"11\"", "resolve_type": "dependent", "format": "bitString", "usage": "all" } ], + "C_M_AXIS_BASETDEST_ARRAY": [ { "value": "0b0000", "resolve_type": "dependent", "format": "bitString", "usage": "all" } ], + "C_M_AXIS_HIGHTDEST_ARRAY": [ { "value": "0b1111", "resolve_type": "dependent", "format": "bitString", "usage": "all" } ], + "C_ROUTING_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_S_AXI_CTRL_ADDR_WIDTH": [ { "value": "7", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_S_AXI_CTRL_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_COMMON_CLOCK": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ] + }, + "project_parameters": { + "ARCHITECTURE": [ { "value": "kintexu" } ], + "BASE_BOARD_PART": [ { "value": "" } ], + "BOARD_CONNECTIONS": [ { "value": "" } ], + "DEVICE": [ { "value": "xcku040" } ], + "PACKAGE": [ { "value": "ffva1156" } ], + "PREFHDL": [ { "value": "VERILOG" } ], + "SILICON_REVISION": [ { "value": "" } ], + "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], + "SPEEDGRADE": [ { "value": "-2" } ], + "STATIC_POWER": [ { "value": "" } ], + "TEMPERATURE_GRADE": [ { "value": "I" } ], + "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], + "USE_RDI_GENERATION": [ { "value": "TRUE" } ] + }, + "runtime_parameters": { + "IPCONTEXT": [ { "value": "IP_Flow" } ], + "IPREVISION": [ { "value": "27" } ], + "MANAGED": [ { "value": "TRUE" } ], + "OUTPUTDIR": [ { "value": "../../../../radar_alinx_kintex.gen/sources_1/ip/axis_switch_0" } ], + "SELECTEDSIMMODEL": [ { "value": "" } ], + "SHAREDDIR": [ { "value": "." } ], + "SWVERSION": [ { "value": "2022.2" } ], + "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] + } + }, + "boundary": { + "ports": { + "aclk": [ { "direction": "in" } ], + "aresetn": [ { "direction": "in" } ], + "s_axis_tvalid": [ { "direction": "in", "size_left": "1", "size_right": "0", "driver_value": "0x0" } ], + "s_axis_tready": [ { "direction": "out", "size_left": "1", "size_right": "0" } ], + "s_axis_tdata": [ { "direction": "in", "size_left": "127", "size_right": "0", "driver_value": "0x00000000000000000000000000000000" } ], + "s_axis_tlast": [ { "direction": "in", "size_left": "1", "size_right": "0", "driver_value": "0x3" } ], + "s_axis_tdest": [ { "direction": "in", "size_left": "7", "size_right": "0", "driver_value": "0x00" } ], + "s_axis_tuser": [ { "direction": "in", "size_left": "31", "size_right": "0", "driver_value": "0x00000000" } ], + "m_axis_tvalid": [ { "direction": "out", "size_left": "0", "size_right": "0" } ], + "m_axis_tready": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0x1" } ], + "m_axis_tdata": [ { "direction": "out", "size_left": "63", "size_right": "0" } ], + "m_axis_tlast": [ { "direction": "out", "size_left": "0", "size_right": "0" } ], + "m_axis_tdest": [ { "direction": "out", "size_left": "3", "size_right": "0" } ], + "m_axis_tuser": [ { "direction": "out", "size_left": "15", "size_right": "0" } ], + "s_req_suppress": [ { "direction": "in", "size_left": "1", "size_right": "0", "driver_value": "0x0" } ], + "s_decode_err": [ { "direction": "out", "size_left": "1", "size_right": "0" } ] + }, + "interfaces": { + "S00_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "slave", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "8", "value_src": "auto", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "4", "value_src": "auto", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "16", "value_src": "auto", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TVALID": [ { "physical_name": "s_axis_tvalid", "physical_left": "0", "physical_right": "0" } ], + "TREADY": [ { "physical_name": "s_axis_tready", "physical_left": "0", "physical_right": "0" } ], + "TDATA": [ { "physical_name": "s_axis_tdata", "physical_left": "63", "physical_right": "0" } ], + "TLAST": [ { "physical_name": "s_axis_tlast", "physical_left": "0", "physical_right": "0" } ], + "TDEST": [ { "physical_name": "s_axis_tdest", "physical_left": "3", "physical_right": "0" } ], + "TUSER": [ { "physical_name": "s_axis_tuser", "physical_left": "15", "physical_right": "0" } ] + } + }, + "M00_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "master", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "8", "value_src": "auto", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "4", "value_src": "auto", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "16", "value_src": "auto", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TVALID": [ { "physical_name": "m_axis_tvalid", "physical_left": "0", "physical_right": "0" } ], + "TREADY": [ { "physical_name": "m_axis_tready", "physical_left": "0", "physical_right": "0" } ], + "TDATA": [ { "physical_name": "m_axis_tdata", "physical_left": "63", "physical_right": "0" } ], + "TLAST": [ { "physical_name": "m_axis_tlast", "physical_left": "0", "physical_right": "0" } ], + "TDEST": [ { "physical_name": "m_axis_tdest", "physical_left": "3", "physical_right": "0" } ], + "TUSER": [ { "physical_name": "m_axis_tuser", "physical_left": "15", "physical_right": "0" } ] + } + }, + "S01_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "slave", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "8", "value_src": "auto", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "4", "value_src": "auto", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "16", "value_src": "auto", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "usage": "simulation.tlm", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TVALID": [ { "physical_name": "s_axis_tvalid", "physical_left": "1", "physical_right": "1" } ], + "TREADY": [ { "physical_name": "s_axis_tready", "physical_left": "1", "physical_right": "1" } ], + "TDATA": [ { "physical_name": "s_axis_tdata", "physical_left": "127", "physical_right": "64" } ], + "TLAST": [ { "physical_name": "s_axis_tlast", "physical_left": "1", "physical_right": "1" } ], + "TDEST": [ { "physical_name": "s_axis_tdest", "physical_left": "7", "physical_right": "4" } ], + "TUSER": [ { "physical_name": "s_axis_tuser", "physical_left": "31", "physical_right": "16" } ] + } + }, + "RSTIF": { + "vlnv": "xilinx.com:signal:reset:1.0", + "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", + "mode": "slave", + "parameters": { + "POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "RST": [ { "physical_name": "aresetn" } ] + } + }, + "CLKIF": { + "vlnv": "xilinx.com:signal:clock:1.0", + "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", + "mode": "slave", + "parameters": { + "FREQ_HZ": [ { "value": "10000000", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "CLK": [ { "physical_name": "aclk" } ] + } + } + } + } + } +} \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/ip/clock_converter/clock_converter.xci b/radar_alinx_kintex.srcs/sources_1/ip/clock_converter/clock_converter.xci new file mode 100755 index 0000000..490783c --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/ip/clock_converter/clock_converter.xci @@ -0,0 +1,189 @@ +{ + "schema": "xilinx.com:schema:json_instance:1.0", + "ip_inst": { + "xci_name": "clock_converter", + "component_reference": "xilinx.com:ip:axis_clock_converter:1.1", + "ip_revision": "28", + "gen_directory": "../../../../radar_alinx_kintex.gen/sources_1/ip/clock_converter", + "parameters": { + "component_parameters": { + "TDATA_NUM_BYTES": [ { "value": "4", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TUSER_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "IS_ACLK_ASYNC": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TLAST": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "SYNCHRONIZATION_STAGES": [ { "value": "2", "resolve_type": "user", "format": "long", "usage": "all" } ], + "ACLK_RATIO": [ { "value": "1:2", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "ACLKEN_CONV_MODE": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Component_Name": [ { "value": "clock_converter", "resolve_type": "user", "usage": "all" } ] + }, + "model_parameters": { + "C_FAMILY": [ { "value": "kintexu", "resolve_type": "generated", "usage": "all" } ], + "C_AXIS_TDATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TID_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TDEST_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TUSER_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_SIGNAL_SET": [ { "value": "0b00000000000000000000000000000011", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_IS_ACLK_ASYNC": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_SYNCHRONIZER_STAGE": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_S_AXIS_ACLK_RATIO": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_M_AXIS_ACLK_RATIO": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ACLKEN_CONV_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ] + }, + "project_parameters": { + "ARCHITECTURE": [ { "value": "kintexu" } ], + "BASE_BOARD_PART": [ { "value": "" } ], + "BOARD_CONNECTIONS": [ { "value": "" } ], + "DEVICE": [ { "value": "xcku040" } ], + "PACKAGE": [ { "value": "ffva1156" } ], + "PREFHDL": [ { "value": "VERILOG" } ], + "SILICON_REVISION": [ { "value": "" } ], + "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], + "SPEEDGRADE": [ { "value": "-2" } ], + "STATIC_POWER": [ { "value": "" } ], + "TEMPERATURE_GRADE": [ { "value": "I" } ], + "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], + "USE_RDI_GENERATION": [ { "value": "TRUE" } ] + }, + "runtime_parameters": { + "IPCONTEXT": [ { "value": "IP_Flow" } ], + "IPREVISION": [ { "value": "28" } ], + "MANAGED": [ { "value": "TRUE" } ], + "OUTPUTDIR": [ { "value": "../../../../radar_alinx_kintex.gen/sources_1/ip/clock_converter" } ], + "SELECTEDSIMMODEL": [ { "value": "" } ], + "SHAREDDIR": [ { "value": "." } ], + "SWVERSION": [ { "value": "2022.2" } ], + "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] + } + }, + "boundary": { + "ports": { + "s_axis_aresetn": [ { "direction": "in", "driver_value": "0x0" } ], + "m_axis_aresetn": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_aclk": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_tvalid": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_tready": [ { "direction": "out" } ], + "s_axis_tdata": [ { "direction": "in", "size_left": "31", "size_right": "0", "driver_value": "0x00000000" } ], + "m_axis_aclk": [ { "direction": "in", "driver_value": "0x0" } ], + "m_axis_tvalid": [ { "direction": "out" } ], + "m_axis_tready": [ { "direction": "in", "driver_value": "0x1" } ], + "m_axis_tdata": [ { "direction": "out", "size_left": "31", "size_right": "0" } ] + }, + "interfaces": { + "S_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "slave", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "4", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "value_src": "constant", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TVALID": [ { "physical_name": "s_axis_tvalid" } ], + "TREADY": [ { "physical_name": "s_axis_tready" } ], + "TDATA": [ { "physical_name": "s_axis_tdata" } ] + } + }, + "M_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "master", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "4", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "value_src": "constant", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TVALID": [ { "physical_name": "m_axis_tvalid" } ], + "TREADY": [ { "physical_name": "m_axis_tready" } ], + "TDATA": [ { "physical_name": "m_axis_tdata" } ] + } + }, + "S_RSTIF": { + "vlnv": "xilinx.com:signal:reset:1.0", + "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", + "mode": "slave", + "parameters": { + "POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "RST": [ { "physical_name": "s_axis_aresetn" } ] + } + }, + "M_RSTIF": { + "vlnv": "xilinx.com:signal:reset:1.0", + "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", + "mode": "slave", + "parameters": { + "POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "RST": [ { "physical_name": "m_axis_aresetn" } ] + } + }, + "S_CLKIF": { + "vlnv": "xilinx.com:signal:clock:1.0", + "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", + "mode": "slave", + "parameters": { + "FREQ_HZ": [ { "value": "10000000", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "CLK": [ { "physical_name": "s_axis_aclk" } ] + } + }, + "M_CLKIF": { + "vlnv": "xilinx.com:signal:clock:1.0", + "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", + "mode": "slave", + "parameters": { + "FREQ_HZ": [ { "value": "10000000", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "CLK": [ { "physical_name": "m_axis_aclk" } ] + } + } + } + } + } +} \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/ip/data_fifo/data_fifo.xci b/radar_alinx_kintex.srcs/sources_1/ip/data_fifo/data_fifo.xci new file mode 100755 index 0000000..a0b8b40 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/ip/data_fifo/data_fifo.xci @@ -0,0 +1,175 @@ +{ + "schema": "xilinx.com:schema:json_instance:1.0", + "ip_inst": { + "xci_name": "data_fifo", + "component_reference": "xilinx.com:ip:axis_data_fifo:2.0", + "ip_revision": "9", + "gen_directory": "../../../../radar_alinx_kintex.gen/sources_1/ip/data_fifo", + "parameters": { + "component_parameters": { + "TDATA_NUM_BYTES": [ { "value": "64", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TUSER_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FIFO_DEPTH": [ { "value": "512", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FIFO_MODE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "IS_ACLK_ASYNC": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "ACLKEN_CONV_MODE": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TLAST": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "SYNCHRONIZATION_STAGES": [ { "value": "3", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "HAS_WR_DATA_COUNT": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_RD_DATA_COUNT": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_AEMPTY": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_PROG_EMPTY": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "PROG_EMPTY_THRESH": [ { "value": "5", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "HAS_AFULL": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_PROG_FULL": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "PROG_FULL_THRESH": [ { "value": "11", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "ENABLE_ECC": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "HAS_ECC_ERR_INJECT": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "FIFO_MEMORY_TYPE": [ { "value": "auto", "resolve_type": "user", "usage": "all" } ], + "Component_Name": [ { "value": "data_fifo", "resolve_type": "user", "usage": "all" } ] + }, + "model_parameters": { + "C_FAMILY": [ { "value": "kintexu", "resolve_type": "generated", "usage": "all" } ], + "C_AXIS_TDATA_WIDTH": [ { "value": "512", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TID_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TDEST_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TUSER_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_SIGNAL_SET": [ { "value": "0b00000000000000000000000000000011", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_FIFO_DEPTH": [ { "value": "512", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_FIFO_MODE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_IS_ACLK_ASYNC": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_SYNCHRONIZER_STAGE": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ACLKEN_CONV_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ECC_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_FIFO_MEMORY_TYPE": [ { "value": "auto", "resolve_type": "generated", "usage": "all" } ], + "C_USE_ADV_FEATURES": [ { "value": "825241648", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_PROG_EMPTY_THRESH": [ { "value": "5", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_PROG_FULL_THRESH": [ { "value": "11", "resolve_type": "generated", "format": "long", "usage": "all" } ] + }, + "project_parameters": { + "ARCHITECTURE": [ { "value": "kintexu" } ], + "BASE_BOARD_PART": [ { "value": "" } ], + "BOARD_CONNECTIONS": [ { "value": "" } ], + "DEVICE": [ { "value": "xcku040" } ], + "PACKAGE": [ { "value": "ffva1156" } ], + "PREFHDL": [ { "value": "VERILOG" } ], + "SILICON_REVISION": [ { "value": "" } ], + "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], + "SPEEDGRADE": [ { "value": "-2" } ], + "STATIC_POWER": [ { "value": "" } ], + "TEMPERATURE_GRADE": [ { "value": "I" } ], + "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], + "USE_RDI_GENERATION": [ { "value": "TRUE" } ] + }, + "runtime_parameters": { + "IPCONTEXT": [ { "value": "IP_Flow" } ], + "IPREVISION": [ { "value": "9" } ], + "MANAGED": [ { "value": "TRUE" } ], + "OUTPUTDIR": [ { "value": "../../../../radar_alinx_kintex.gen/sources_1/ip/data_fifo" } ], + "SELECTEDSIMMODEL": [ { "value": "" } ], + "SHAREDDIR": [ { "value": "." } ], + "SWVERSION": [ { "value": "2022.2" } ], + "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] + } + }, + "boundary": { + "ports": { + "s_axis_aresetn": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_aclk": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_tvalid": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_tready": [ { "direction": "out" } ], + "s_axis_tdata": [ { "direction": "in", "size_left": "511", "size_right": "0", "driver_value": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" } ], + "m_axis_tvalid": [ { "direction": "out" } ], + "m_axis_tready": [ { "direction": "in", "driver_value": "0x1" } ], + "m_axis_tdata": [ { "direction": "out", "size_left": "511", "size_right": "0" } ] + }, + "interfaces": { + "S_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "slave", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "64", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TDATA": [ { "physical_name": "s_axis_tdata" } ], + "TREADY": [ { "physical_name": "s_axis_tready" } ], + "TVALID": [ { "physical_name": "s_axis_tvalid" } ] + } + }, + "M_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "master", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "64", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TDATA": [ { "physical_name": "m_axis_tdata" } ], + "TREADY": [ { "physical_name": "m_axis_tready" } ], + "TVALID": [ { "physical_name": "m_axis_tvalid" } ] + } + }, + "S_RSTIF": { + "vlnv": "xilinx.com:signal:reset:1.0", + "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", + "mode": "slave", + "parameters": { + "POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "RST": [ { "physical_name": "s_axis_aresetn" } ] + } + }, + "S_CLKIF": { + "vlnv": "xilinx.com:signal:clock:1.0", + "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", + "mode": "slave", + "parameters": { + "ASSOCIATED_BUSIF": [ { "value": "S_AXIS", "value_src": "constant", "usage": "all" } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "CLK": [ { "physical_name": "s_axis_aclk" } ] + } + } + } + } + } +} \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/ip/dig_rx_clock_converter/dig_rx_clock_converter.xci b/radar_alinx_kintex.srcs/sources_1/ip/dig_rx_clock_converter/dig_rx_clock_converter.xci new file mode 100755 index 0000000..71c0f23 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/ip/dig_rx_clock_converter/dig_rx_clock_converter.xci @@ -0,0 +1,197 @@ +{ + "schema": "xilinx.com:schema:json_instance:1.0", + "ip_inst": { + "xci_name": "dig_rx_clock_converter", + "component_reference": "xilinx.com:ip:axis_clock_converter:1.1", + "ip_revision": "28", + "gen_directory": "../../../../radar_alinx_kintex.gen/sources_1/ip/dig_rx_clock_converter", + "parameters": { + "component_parameters": { + "TDATA_NUM_BYTES": [ { "value": "8", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TUSER_WIDTH": [ { "value": "1", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "IS_ACLK_ASYNC": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TLAST": [ { "value": "1", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "SYNCHRONIZATION_STAGES": [ { "value": "2", "resolve_type": "user", "format": "long", "usage": "all" } ], + "ACLK_RATIO": [ { "value": "1:2", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "ACLKEN_CONV_MODE": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Component_Name": [ { "value": "dig_rx_clock_converter", "resolve_type": "user", "usage": "all" } ] + }, + "model_parameters": { + "C_FAMILY": [ { "value": "kintexu", "resolve_type": "generated", "usage": "all" } ], + "C_AXIS_TDATA_WIDTH": [ { "value": "64", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TID_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TDEST_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TUSER_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_SIGNAL_SET": [ { "value": "0b00000000000000000000000010010011", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_IS_ACLK_ASYNC": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_SYNCHRONIZER_STAGE": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_S_AXIS_ACLK_RATIO": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_M_AXIS_ACLK_RATIO": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ACLKEN_CONV_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ] + }, + "project_parameters": { + "ARCHITECTURE": [ { "value": "kintexu" } ], + "BASE_BOARD_PART": [ { "value": "" } ], + "BOARD_CONNECTIONS": [ { "value": "" } ], + "DEVICE": [ { "value": "xcku040" } ], + "PACKAGE": [ { "value": "ffva1156" } ], + "PREFHDL": [ { "value": "VERILOG" } ], + "SILICON_REVISION": [ { "value": "" } ], + "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], + "SPEEDGRADE": [ { "value": "-2" } ], + "STATIC_POWER": [ { "value": "" } ], + "TEMPERATURE_GRADE": [ { "value": "I" } ], + "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], + "USE_RDI_GENERATION": [ { "value": "TRUE" } ] + }, + "runtime_parameters": { + "IPCONTEXT": [ { "value": "IP_Flow" } ], + "IPREVISION": [ { "value": "28" } ], + "MANAGED": [ { "value": "TRUE" } ], + "OUTPUTDIR": [ { "value": "../../../../radar_alinx_kintex.gen/sources_1/ip/dig_rx_clock_converter" } ], + "SELECTEDSIMMODEL": [ { "value": "" } ], + "SHAREDDIR": [ { "value": "." } ], + "SWVERSION": [ { "value": "2022.2" } ], + "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] + } + }, + "boundary": { + "ports": { + "s_axis_aresetn": [ { "direction": "in", "driver_value": "0x0" } ], + "m_axis_aresetn": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_aclk": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_tvalid": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_tready": [ { "direction": "out" } ], + "s_axis_tdata": [ { "direction": "in", "size_left": "63", "size_right": "0", "driver_value": "0x0000000000000000" } ], + "s_axis_tlast": [ { "direction": "in", "driver_value": "0x1" } ], + "s_axis_tuser": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0x0" } ], + "m_axis_aclk": [ { "direction": "in", "driver_value": "0x0" } ], + "m_axis_tvalid": [ { "direction": "out" } ], + "m_axis_tready": [ { "direction": "in", "driver_value": "0x1" } ], + "m_axis_tdata": [ { "direction": "out", "size_left": "63", "size_right": "0" } ], + "m_axis_tlast": [ { "direction": "out" } ], + "m_axis_tuser": [ { "direction": "out", "size_left": "0", "size_right": "0" } ] + }, + "interfaces": { + "S_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "slave", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "8", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "value_src": "constant", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TVALID": [ { "physical_name": "s_axis_tvalid" } ], + "TREADY": [ { "physical_name": "s_axis_tready" } ], + "TDATA": [ { "physical_name": "s_axis_tdata" } ], + "TLAST": [ { "physical_name": "s_axis_tlast" } ], + "TUSER": [ { "physical_name": "s_axis_tuser" } ] + } + }, + "M_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "master", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "8", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "value_src": "constant", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TVALID": [ { "physical_name": "m_axis_tvalid" } ], + "TREADY": [ { "physical_name": "m_axis_tready" } ], + "TDATA": [ { "physical_name": "m_axis_tdata" } ], + "TLAST": [ { "physical_name": "m_axis_tlast" } ], + "TUSER": [ { "physical_name": "m_axis_tuser" } ] + } + }, + "S_RSTIF": { + "vlnv": "xilinx.com:signal:reset:1.0", + "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", + "mode": "slave", + "parameters": { + "POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "RST": [ { "physical_name": "s_axis_aresetn" } ] + } + }, + "M_RSTIF": { + "vlnv": "xilinx.com:signal:reset:1.0", + "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", + "mode": "slave", + "parameters": { + "POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "RST": [ { "physical_name": "m_axis_aresetn" } ] + } + }, + "S_CLKIF": { + "vlnv": "xilinx.com:signal:clock:1.0", + "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", + "mode": "slave", + "parameters": { + "FREQ_HZ": [ { "value": "10000000", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "CLK": [ { "physical_name": "s_axis_aclk" } ] + } + }, + "M_CLKIF": { + "vlnv": "xilinx.com:signal:clock:1.0", + "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", + "mode": "slave", + "parameters": { + "FREQ_HZ": [ { "value": "10000000", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "CLK": [ { "physical_name": "m_axis_aclk" } ] + } + } + } + } + } +} \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/ip/dig_rx_dwidth_converter/dig_rx_dwidth_converter.xci b/radar_alinx_kintex.srcs/sources_1/ip/dig_rx_dwidth_converter/dig_rx_dwidth_converter.xci new file mode 100755 index 0000000..75fdc88 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/ip/dig_rx_dwidth_converter/dig_rx_dwidth_converter.xci @@ -0,0 +1,162 @@ +{ + "schema": "xilinx.com:schema:json_instance:1.0", + "ip_inst": { + "xci_name": "dig_rx_dwidth_converter", + "component_reference": "xilinx.com:ip:axis_dwidth_converter:1.1", + "ip_revision": "26", + "gen_directory": "../../../../radar_alinx_kintex.gen/sources_1/ip/dig_rx_dwidth_converter", + "parameters": { + "component_parameters": { + "S_TDATA_NUM_BYTES": [ { "value": "16", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M_TDATA_NUM_BYTES": [ { "value": "8", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TUSER_BITS_PER_BYTE": [ { "value": "1", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TLAST": [ { "value": "1", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_ACLKEN": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_MI_TKEEP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Component_Name": [ { "value": "dig_rx_dwidth_converter", "resolve_type": "user", "usage": "all" } ] + }, + "model_parameters": { + "C_FAMILY": [ { "value": "kintexu", "resolve_type": "generated", "usage": "all" } ], + "C_S_AXIS_TDATA_WIDTH": [ { "value": "128", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_M_AXIS_TDATA_WIDTH": [ { "value": "64", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TID_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TDEST_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_S_AXIS_TUSER_WIDTH": [ { "value": "16", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_M_AXIS_TUSER_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_SIGNAL_SET": [ { "value": "0b00000000000000000000000010010011", "resolve_type": "generated", "format": "bitString", "usage": "all" } ] + }, + "project_parameters": { + "ARCHITECTURE": [ { "value": "kintexu" } ], + "BASE_BOARD_PART": [ { "value": "" } ], + "BOARD_CONNECTIONS": [ { "value": "" } ], + "DEVICE": [ { "value": "xcku040" } ], + "PACKAGE": [ { "value": "ffva1156" } ], + "PREFHDL": [ { "value": "VERILOG" } ], + "SILICON_REVISION": [ { "value": "" } ], + "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], + "SPEEDGRADE": [ { "value": "-2" } ], + "STATIC_POWER": [ { "value": "" } ], + "TEMPERATURE_GRADE": [ { "value": "I" } ], + "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], + "USE_RDI_GENERATION": [ { "value": "TRUE" } ] + }, + "runtime_parameters": { + "IPCONTEXT": [ { "value": "IP_Flow" } ], + "IPREVISION": [ { "value": "26" } ], + "MANAGED": [ { "value": "TRUE" } ], + "OUTPUTDIR": [ { "value": "../../../../radar_alinx_kintex.gen/sources_1/ip/dig_rx_dwidth_converter" } ], + "SELECTEDSIMMODEL": [ { "value": "" } ], + "SHAREDDIR": [ { "value": "." } ], + "SWVERSION": [ { "value": "2022.2" } ], + "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] + } + }, + "boundary": { + "ports": { + "aclk": [ { "direction": "in" } ], + "aresetn": [ { "direction": "in" } ], + "s_axis_tvalid": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_tready": [ { "direction": "out" } ], + "s_axis_tdata": [ { "direction": "in", "size_left": "127", "size_right": "0", "driver_value": "0x00000000000000000000000000000000" } ], + "s_axis_tlast": [ { "direction": "in", "driver_value": "0x1" } ], + "s_axis_tuser": [ { "direction": "in", "size_left": "15", "size_right": "0", "driver_value": "0x0000" } ], + "m_axis_tvalid": [ { "direction": "out" } ], + "m_axis_tready": [ { "direction": "in", "driver_value": "0x1" } ], + "m_axis_tdata": [ { "direction": "out", "size_left": "63", "size_right": "0" } ], + "m_axis_tlast": [ { "direction": "out" } ], + "m_axis_tuser": [ { "direction": "out", "size_left": "7", "size_right": "0" } ] + }, + "interfaces": { + "S_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "slave", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "16", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "16", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TVALID": [ { "physical_name": "s_axis_tvalid" } ], + "TREADY": [ { "physical_name": "s_axis_tready" } ], + "TDATA": [ { "physical_name": "s_axis_tdata" } ], + "TLAST": [ { "physical_name": "s_axis_tlast" } ], + "TUSER": [ { "physical_name": "s_axis_tuser" } ] + } + }, + "M_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "master", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "8", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "8", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TVALID": [ { "physical_name": "m_axis_tvalid" } ], + "TREADY": [ { "physical_name": "m_axis_tready" } ], + "TDATA": [ { "physical_name": "m_axis_tdata" } ], + "TLAST": [ { "physical_name": "m_axis_tlast" } ], + "TUSER": [ { "physical_name": "m_axis_tuser" } ] + } + }, + "RSTIF": { + "vlnv": "xilinx.com:signal:reset:1.0", + "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", + "mode": "slave", + "parameters": { + "POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "RST": [ { "physical_name": "aresetn" } ] + } + }, + "CLKIF": { + "vlnv": "xilinx.com:signal:clock:1.0", + "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", + "mode": "slave", + "parameters": { + "FREQ_HZ": [ { "value": "10000000", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "CLK": [ { "physical_name": "aclk" } ] + } + } + } + } + } +} \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/ip/eth_xcvr_gt_channel/eth_xcvr_gt_channel.xci b/radar_alinx_kintex.srcs/sources_1/ip/eth_xcvr_gt_channel/eth_xcvr_gt_channel.xci new file mode 100755 index 0000000..82984e1 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/ip/eth_xcvr_gt_channel/eth_xcvr_gt_channel.xci @@ -0,0 +1,898 @@ +{ + "schema": "xilinx.com:schema:json_instance:1.0", + "ip_inst": { + "xci_name": "eth_xcvr_gt_channel", + "component_reference": "xilinx.com:ip:gtwizard_ultrascale:1.7", + "ip_revision": "14", + "gen_directory": "../../../../radar_alinx_kintex.gen/sources_1/ip/eth_xcvr_gt_channel", + "parameters": { + "component_parameters": { + "GT_TYPE": [ { "value": "GTH", "resolve_type": "user", "usage": "all" } ], + "INTERNAL_GT_PRIM_TYPE": [ { "value": "gthe3", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "GT_REV": [ { "value": "0", "resolve_type": "user", "usage": "all" } ], + "GT_DIRECTION": [ { "value": "BOTH", "resolve_type": "user", "usage": "all" } ], + "RX_ENABLE": [ { "value": "true", "resolve_type": "generated", "format": "bool", "enabled": false, "usage": "all" } ], + "TX_ENABLE": [ { "value": "true", "resolve_type": "generated", "format": "bool", "enabled": false, "usage": "all" } ], + "CHANNEL_ENABLE": [ { "value": "X0Y0", "resolve_type": "user", "usage": "all" } ], + "TX_MASTER_CHANNEL": [ { "value": "X0Y0", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_MASTER_CHANNEL": [ { "value": "X0Y0", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "INTERNAL_TOTAL_NUM_CHANNELS": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_TOTAL_NUM_COMMONS": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "LOCATE_COMMON": [ { "value": "EXAMPLE_DESIGN", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "INTERNAL_NUM_COMMONS_CORE": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_NUM_COMMONS_EXAMPLE": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_TX_USRCLK_FREQUENCY": [ { "value": "312.5000000", "resolve_type": "generated", "format": "float", "enabled": false, "usage": "all" } ], + "INTERNAL_RX_USRCLK_FREQUENCY": [ { "value": "312.5000000", "resolve_type": "generated", "format": "float", "enabled": false, "usage": "all" } ], + "RX_PPM_OFFSET": [ { "value": "200", "resolve_type": "user", "format": "long", "usage": "all" } ], + "OOB_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_SSC_PPM": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "INS_LOSS_NYQ": [ { "value": "20", "resolve_type": "user", "format": "float", "usage": "all" } ], + "PCIE_CORECLK_FREQ": [ { "value": "250", "resolve_type": "user", "format": "long", "usage": "all" } ], + "PCIE_USERCLK_FREQ": [ { "value": "250", "resolve_type": "user", "format": "float", "usage": "all" } ], + "TX_LINE_RATE": [ { "value": "10.3125", "resolve_type": "user", "format": "float", "usage": "all" } ], + "TX_PLL_TYPE": [ { "value": "QPLL0", "resolve_type": "user", "usage": "all" } ], + "TX_REFCLK_FREQUENCY": [ { "value": "156.25", "resolve_type": "user", "format": "float", "usage": "all" } ], + "TX_DATA_ENCODING": [ { "value": "64B66B_ASYNC", "resolve_type": "user", "usage": "all" } ], + "TX_USER_DATA_WIDTH": [ { "value": "64", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TX_INT_DATA_WIDTH": [ { "value": "32", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TX_BUFFER_MODE": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "TX_QPLL_FRACN_NUMERATOR": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "TX_OUTCLK_SOURCE": [ { "value": "TXPROGDIVCLK", "resolve_type": "user", "usage": "all" } ], + "TX_DIFF_SWING_EMPH_MODE": [ { "value": "CUSTOM", "resolve_type": "user", "usage": "all" } ], + "RX_LINE_RATE": [ { "value": "10.3125", "resolve_type": "user", "format": "float", "usage": "all" } ], + "RX_PLL_TYPE": [ { "value": "QPLL0", "resolve_type": "user", "usage": "all" } ], + "RX_REFCLK_FREQUENCY": [ { "value": "156.25", "resolve_type": "user", "format": "float", "usage": "all" } ], + "RX_DATA_DECODING": [ { "value": "64B66B_ASYNC", "resolve_type": "user", "usage": "all" } ], + "RX_USER_DATA_WIDTH": [ { "value": "64", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "RX_INT_DATA_WIDTH": [ { "value": "32", "resolve_type": "user", "format": "long", "usage": "all" } ], + "RX_BUFFER_MODE": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_QPLL_FRACN_NUMERATOR": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_EQ_MODE": [ { "value": "AUTO", "resolve_type": "user", "usage": "all" } ], + "RX_JTOL_FC": [ { "value": "6.1862627", "resolve_type": "user", "format": "float", "usage": "all" } ], + "RX_JTOL_LF_SLOPE": [ { "value": "-20", "resolve_type": "user", "format": "long", "usage": "all" } ], + "RX_OUTCLK_SOURCE": [ { "value": "RXPROGDIVCLK", "resolve_type": "user", "usage": "all" } ], + "SIM_CPLL_CAL_BYPASS": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "PCIE_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "RX_TERMINATION": [ { "value": "PROGRAMMABLE", "resolve_type": "user", "usage": "all" } ], + "RX_TERMINATION_PROG_VALUE": [ { "value": "800", "resolve_type": "user", "format": "long", "usage": "all" } ], + "RX_COUPLING": [ { "value": "AC", "resolve_type": "user", "usage": "all" } ], + "RX_BUFFER_BYPASS_MODE": [ { "value": "MULTI", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_BUFFER_RESET_ON_CB_CHANGE": [ { "value": "ENABLE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_BUFFER_RESET_ON_COMMAALIGN": [ { "value": "DISABLE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_BUFFER_RESET_ON_RATE_CHANGE": [ { "value": "ENABLE", "resolve_type": "user", "usage": "all" } ], + "TX_BUFFER_RESET_ON_RATE_CHANGE": [ { "value": "ENABLE", "resolve_type": "user", "usage": "all" } ], + "RESET_SEQUENCE_INTERVAL": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "RX_COMMA_PRESET": [ { "value": "NONE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_COMMA_VALID_ONLY": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_COMMA_P_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_COMMA_M_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_COMMA_DOUBLE_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_COMMA_P_VAL": [ { "value": "0101111100", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_COMMA_M_VAL": [ { "value": "1010000011", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_COMMA_MASK": [ { "value": "0000000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_COMMA_ALIGN_WORD": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_COMMA_SHOW_REALIGN_ENABLE": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "RX_SLIDE_MODE": [ { "value": "OFF", "resolve_type": "user", "usage": "all" } ], + "RX_CB_NUM_SEQ": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CB_LEN_SEQ": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CB_MAX_SKEW": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CB_MAX_LEVEL": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CB_MASK": [ { "value": "00000000", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "RX_CB_VAL": [ { "value": "00000000000000000000000000000000000000000000000000000000000000000000000000000000", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "RX_CB_K": [ { "value": "00000000", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "RX_CB_DISP": [ { "value": "00000000", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_0_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_0_0": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_0_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_0_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_0_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_0_1": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_0_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_0_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_0_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_0_2": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_0_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_0_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_0_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_0_3": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_0_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_0_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_1_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_1_0": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_1_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_1_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_1_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_1_1": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_1_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_1_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_1_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_1_2": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_1_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_1_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_1_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_1_3": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_1_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_1_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_NUM_SEQ": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CC_LEN_SEQ": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CC_PERIODICITY": [ { "value": "5000", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CC_KEEP_IDLE": [ { "value": "DISABLE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_PRECEDENCE": [ { "value": "ENABLE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_REPEAT_WAIT": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CC_MASK": [ { "value": "00000000", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "RX_CC_VAL": [ { "value": "00000000000000000000000000000000000000000000000000000000000000000000000000000000", "resolve_type": "user", "usage": "all" } ], + "RX_CC_K": [ { "value": "00000000", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "RX_CC_DISP": [ { "value": "00000000", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_0_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_0_0": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_0_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_0_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_0_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_0_1": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_0_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_0_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_0_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_0_2": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_0_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_0_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_0_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_0_3": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_0_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_0_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_1_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_1_0": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_1_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_1_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_1_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_1_1": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_1_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_1_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_1_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_1_2": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_1_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_1_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_1_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_1_3": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_1_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_1_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "ENABLE_OPTIONAL_PORTS": [ { "value": "", "resolve_type": "user", "usage": "all" } ], + "RX_REFCLK_SOURCE": [ { "value": "", "resolve_type": "user", "usage": "all" } ], + "TX_REFCLK_SOURCE": [ { "value": "", "resolve_type": "user", "usage": "all" } ], + "RX_RECCLK_OUTPUT": [ { "value": "", "resolve_type": "user", "usage": "all" } ], + "LOCATE_RESET_CONTROLLER": [ { "value": "CORE", "resolve_type": "user", "usage": "all" } ], + "LOCATE_TX_BUFFER_BYPASS_CONTROLLER": [ { "value": "CORE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "LOCATE_RX_BUFFER_BYPASS_CONTROLLER": [ { "value": "CORE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "LOCATE_IN_SYSTEM_IBERT_CORE": [ { "value": "NONE", "resolve_type": "user", "usage": "all" } ], + "LOCATE_TX_USER_CLOCKING": [ { "value": "CORE", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "LOCATE_RX_USER_CLOCKING": [ { "value": "CORE", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "LOCATE_USER_DATA_WIDTH_SIZING": [ { "value": "CORE", "resolve_type": "user", "usage": "all" } ], + "ORGANIZE_PORTS_BY": [ { "value": "NAME", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "PRESET": [ { "value": "GTH-10GBASE-R", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "INTERNAL_PRESET": [ { "value": "10GBASE-R", "resolve_type": "user", "usage": "all" } ], + "INTERNAL_PORT_USAGE_UPDATED": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLEMENT_UPDATED": [ { "value": "11", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_CHANNEL_SITES_UPDATED": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_CHANNEL_COLUMN_LOC_MAX": [ { "value": "96", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_RX_COMMA_PRESET_UPDATE": [ { "value": "4", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_UPDATE_IP_SYMBOL_drpclk_in": [ { "value": "false", "resolve_type": "generated", "format": "bool", "enabled": false, "usage": "all" } ], + "SECONDARY_QPLL_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "SECONDARY_QPLL_LINE_RATE": [ { "value": "10.3125", "resolve_type": "user", "format": "float", "enabled": false, "usage": "all" } ], + "SECONDARY_QPLL_FRACN_NUMERATOR": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "SECONDARY_QPLL_REFCLK_FREQUENCY": [ { "value": "257.8125", "resolve_type": "user", "format": "float", "enabled": false, "usage": "all" } ], + "TXPROGDIV_FREQ_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "TXPROGDIV_FREQ_SOURCE": [ { "value": "QPLL0", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "TXPROGDIV_FREQ_VAL": [ { "value": "312.5", "resolve_type": "user", "format": "float", "enabled": false, "usage": "all" } ], + "SATA_TX_BURST_LEN": [ { "value": "15", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FREERUN_FREQUENCY": [ { "value": "156.25", "resolve_type": "user", "format": "float", "usage": "all" } ], + "INCLUDE_CPLL_CAL": [ { "value": "2", "resolve_type": "user", "format": "long", "usage": "all" } ], + "USER_GTPOWERGOOD_DELAY_EN": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "DISABLE_LOC_XDC": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "ENABLE_COMMON_USRCLK": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "USB_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "PCIE_64BIT": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "PCIE_GEN4_EIOS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_TX_RESET_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_TX_ACTIVE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_TX_SRCCLK_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_TX_USRCLK_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_TX_USRCLK2_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_TX_ACTIVE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_RX_RESET_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_RX_ACTIVE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_RX_SRCCLK_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_RX_USRCLK_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_RX_USRCLK2_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_RX_ACTIVE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_TX_RESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_TX_START_USER_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_TX_DONE_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_TX_ERROR_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_RX_RESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_RX_START_USER_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_RX_DONE_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_RX_ERROR_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_CLK_FREERUN_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_ALL_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_TX_PLL_AND_DATAPATH_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_TX_DATAPATH_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_RX_PLL_AND_DATAPATH_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_RX_DATAPATH_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_TX_DONE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_RX_DONE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_QPLL0LOCK_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_QPLL1LOCK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_RX_CDR_STABLE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_TX_DONE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_RX_DONE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_QPLL0RESET_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_QPLL1RESET_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTHE3_CPLL_CAL_TXOUTCLK_PERIOD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTHE3_CPLL_CAL_CNT_TOL_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTHE3_CPLL_CAL_BUFG_CE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTHE4_CPLL_CAL_TXOUTCLK_PERIOD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTHE4_CPLL_CAL_CNT_TOL_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTHE4_CPLL_CAL_BUFG_CE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTYE4_CPLL_CAL_TXOUTCLK_PERIOD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTYE4_CPLL_CAL_CNT_TOL_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTYE4_CPLL_CAL_BUFG_CE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERDATA_TX_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERDATA_RX_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BGBYPASSB_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BGMONITORENB_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BGPDB_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BGRCALOVRD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BGRCALOVRDENB_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPADDR_COMMON_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPCLK_COMMON_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPDI_COMMON_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPEN_COMMON_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPWE_COMMON_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTGREFCLK0_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTGREFCLK1_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTNORTHREFCLK00_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTNORTHREFCLK01_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTNORTHREFCLK10_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTNORTHREFCLK11_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTREFCLK00_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTREFCLK01_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTREFCLK10_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTREFCLK11_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTSOUTHREFCLK00_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTSOUTHREFCLK01_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTSOUTHREFCLK10_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTSOUTHREFCLK11_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERATEQPLL0_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERATEQPLL1_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PMARSVD0_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PMARSVD1_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0CLKRSVD0_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0CLKRSVD1_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0FBDIV_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0LOCKDETCLK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0LOCKEN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0PD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0REFCLKSEL_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0RESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1CLKRSVD0_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1CLKRSVD1_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1FBDIV_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1LOCKDETCLK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1LOCKEN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1PD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1REFCLKSEL_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1RESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLLRSVD1_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLLRSVD2_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLLRSVD3_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLLRSVD4_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RCALENB_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM0DATA_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM0RESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM0TOGGLE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM0WIDTH_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM1DATA_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM1RESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM1TOGGLE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM1WIDTH_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TCONGPI_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TCONPOWERUP_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TCONRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TCONRSVDIN1_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBCFGSTREAMEN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBDO_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBDRDY_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBENABLE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBGPI_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBINTR_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBIOLMBRST_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMBRST_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMCAPTURE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMDBGRST_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMDBGUPDATE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMREGEN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMSHIFT_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMSYSRST_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMTCK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMTDI_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPDO_COMMON_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPRDY_COMMON_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PMARSVDOUT0_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PMARSVDOUT1_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0FBCLKLOST_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0LOCK_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0OUTCLK_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0OUTREFCLK_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0REFCLKLOST_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1FBCLKLOST_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1LOCK_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1OUTCLK_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1OUTREFCLK_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1REFCLKLOST_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLLDMONITOR0_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLLDMONITOR1_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_REFCLKOUTMONITOR0_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_REFCLKOUTMONITOR1_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRECCLK0_SEL_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRECCLK1_SEL_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRECCLK0SEL_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRECCLK1SEL_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM0FINALOUT_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM0TESTDATA_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM1FINALOUT_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM1TESTDATA_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TCONGPO_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TCONRSVDOUT0_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBDADDR_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBDEN_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBDI_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBDWE_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMTDO_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBRSVDOUT_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBTXUART_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CDRSTEPDIR_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CDRSTEPSQ_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CDRSTEPSX_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CFGRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CLKRSVD0_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CLKRSVD1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLFREQLOCK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLLOCKDETCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLLOCKEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLREFCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DMONFIFORESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DMONITORCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPADDR_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPDI_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPRST_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPWE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_ELPCALDVORWREN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_ELPCALPAORWREN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EVODDPHICALDONE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EVODDPHICALSTART_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EVODDPHIDRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EVODDPHIDWREN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EVODDPHIXRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EVODDPHIXWREN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EYESCANMODE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EYESCANRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EYESCANTRIGGER_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_FREQOS_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTGREFCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTHRXN_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTHRXP_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTNORTHREFCLK0_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTNORTHREFCLK1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTREFCLK0_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTREFCLK1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTRESETSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTRSVD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTRXRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTRXRESETSEL_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTSOUTHREFCLK0_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTSOUTHREFCLK1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTTXRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTTXRESETSEL_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_INCPCTRL_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTYRXN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTYRXP_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_LOOPBACK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_LOOPRSVD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_LPBKRXTXSEREN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_LPBKTXRXSEREN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIEEQRXEQADAPTDONE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERSTIDLE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERSTTXSYNCSTART_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIEUSERRATEDONE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCSRSVDIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCSRSVDIN2_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PMARSVDIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0CLK_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0FREQLOCK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0REFCLK_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1CLK_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1FREQLOCK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1REFCLK_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RESETOVRD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RSTCLKENTX_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RX8B10BEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXAFECFOKEN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXBUFRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCDRFREQRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCDRHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCDROVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCDRRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCDRRESETRSV_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHBONDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHBONDI_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHBONDLEVEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHBONDMASTER_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHBONDSLAVE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCKCALRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCKCALSTART_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCOMMADETEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEAGCCTRL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDCCFORCESTART_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEAGCHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEAGCOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFECFOKFCNUM_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFECFOKFEN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFECFOKFPULSE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFECFOKHOLD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFECFOKOVREN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEKHHOLD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEKHOVRDEN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFELFHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFELFOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFELPMRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP10HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP10OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP11HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP11OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP12HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP12OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP13HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP13OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP14HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP14OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP15HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP15OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP2HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP2OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP3HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP3OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP4HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP4OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP5HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP5OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP6HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP6OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP7HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP7OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP8HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP8OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP9HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP9OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEUTHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEUTOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEVPHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEVPOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEVSEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEXYDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDLYBYPASS_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDLYEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDLYOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDLYSRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXELECIDLEMODE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXEQTRAINING_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXGEARBOXSLIP_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLATCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMGCHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMGCOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMHFHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMHFOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMLFHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMLFKLOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMOSHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMOSOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXMCOMMAALIGNEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXMONITORSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOOBRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSCALRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTCFG_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTSTROBE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTTESTOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOUTCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPCOMMAALIGNEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPCSRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPHALIGN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPHALIGNEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPHDLYPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPHDLYRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPHOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPLLCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPMARESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPOLARITY_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPRBSCNTRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPRBSSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPROGDIVRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXQPIEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRATE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRATEMODE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSLIDE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSLIPOUTCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSLIPPMA_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSYNCALLIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSYNCIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSYNCMODE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSYSCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXTERMINATION_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXUSERRDY_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXUSRCLK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXUSRCLK2_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SIGVALIDCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TSTIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TX8B10BBYPASS_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TX8B10BEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXBUFDIFFCTRL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXCOMINIT_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXCOMSAS_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXCOMWAKE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXCTRL0_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXCTRL1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXCTRL2_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDATA_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDATAEXTENDRSVD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDCCFORCESTART_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDCCRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDEEMPH_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDETECTRX_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDIFFCTRL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDIFFPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDLYBYPASS_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDLYEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDLYHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDLYOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDLYSRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDLYUPDOWN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXELECIDLE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXELFORCESTART_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXHEADER_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXINHIBIT_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXLATCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXLFPSTRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXLFPSU2LPEXIT_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXLFPSU3WAKE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXMAINCURSOR_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXMARGIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXMUXDCDEXHOLD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXMUXDCDORWREN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXONESZEROS_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXOUTCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPCSRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPDELECIDLEMODE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHALIGN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHALIGNEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHDLYPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHDLYRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHDLYTSTCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHINIT_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPIPPMEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPIPPMOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPIPPMPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPIPPMSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPIPPMSTEPSIZE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPISOPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPLLCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPMARESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPOLARITY_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPOSTCURSOR_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPOSTCURSORINV_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPRBSFORCEERR_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPRBSSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPRECURSOR_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPRECURSORINV_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPROGDIVRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXQPIBIASEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXQPISTRONGPDOWN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXQPIWEAKPUP_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXRATE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXRATEMODE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSEQUENCE_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSWING_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSYNCALLIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSYNCIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSYNCMODE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSYSCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXUSERRDY_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXUSRCLK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXUSRCLK2_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BUFGTCE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BUFGTCEMASK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BUFGTDIV_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BUFGTRESET_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BUFGTRSTMASK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLFBCLKLOST_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLLOCK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLREFCLKLOST_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DMONITOROUT_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DMONITOROUTCLK_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPDO_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPRDY_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EYESCANDATAERROR_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTHTXN_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTHTXP_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTPOWERGOOD_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTREFCLKMONITOR_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTYTXN_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTYTXP_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERATEGEN3_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERATEIDLE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERATEQPLLPD_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERATEQPLLRESET_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIESYNCTXSYNCDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIEUSERGEN3RDY_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIEUSERPHYSTATUSRST_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIEUSERRATESTART_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCSRSVDOUT_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PHYSTATUS_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PINRSRVDAS_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_POWERPRESENT_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RESETEXCEPTION_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXBUFSTATUS_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXBYTEISALIGNED_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXBYTEREALIGN_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCDRLOCK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCDRPHDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHANBONDSEQ_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHANISALIGNED_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHANREALIGN_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHBONDO_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCKCALDONE_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCLKCORCNT_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCOMINITDET_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCOMMADET_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCOMSASDET_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCOMWAKEDET_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCTRL0_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCTRL1_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCTRL2_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCTRL3_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDATA_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDATAEXTENDRSVD_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDATAVALID_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDLYSRESETDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXELECIDLE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXHEADER_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXHEADERVALID_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLFPSTRESETDET_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLFPSU2LPEXITDET_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLFPSU3WAKEDET_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXMONITOROUT_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTSTARTED_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTSTROBEDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTSTROBESTARTED_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOUTCLK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOUTCLKFABRIC_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOUTCLKPCS_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPHALIGNDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPHALIGNERR_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPMARESETDONE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPRBSERR_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPRBSLOCKED_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPRGDIVRESETDONE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXQPISENN_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXQPISENP_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRATEDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRECCLKOUT_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRESETDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSLIDERDY_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSLIPDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSLIPOUTCLKRDY_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSLIPPMARDY_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSTARTOFSEQ_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSTATUS_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSYNCDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSYNCOUT_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXVALID_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXBUFSTATUS_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXCOMFINISH_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDCCDONE_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDLYSRESETDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXOUTCLK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXOUTCLKFABRIC_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXOUTCLKPCS_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHALIGNDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHINITDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPMARESETDONE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPRGDIVRESETDONE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXQPISENN_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXQPISENP_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXRATEDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXRESETDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSYNCDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSYNCOUT_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "Component_Name": [ { "value": "eth_xcvr_gt_channel", "resolve_type": "user", "usage": "all" } ] + }, + "model_parameters": { + "C_CHANNEL_ENABLE": [ { "value": "\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_PCIE_ENABLE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_PCIE_CORECLK_FREQ": [ { "value": "250", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_COMMON_SCALING_FACTOR": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_CPLL_VCO_FREQUENCY": [ { "value": "2578.125", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_FORCE_COMMONS": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_FREERUN_FREQUENCY": [ { "value": "156.25", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_GT_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_GT_REV": [ { "value": "17", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_INCLUDE_CPLL_CAL": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ENABLE_COMMON_USRCLK": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USER_GTPOWERGOOD_DELAY_EN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_SIM_CPLL_CAL_BYPASS": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_COMMON": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_RESET_CONTROLLER": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_USER_DATA_WIDTH_SIZING": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_RX_BUFFER_BYPASS_CONTROLLER": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_IN_SYSTEM_IBERT_CORE": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_RX_USER_CLOCKING": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_TX_BUFFER_BYPASS_CONTROLLER": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_TX_USER_CLOCKING": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RESET_CONTROLLER_INSTANCE_CTRL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_BUFFBYPASS_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_BUFFER_BYPASS_INSTANCE_CTRL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_BUFFER_MODE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CB_DISP": [ { "value": "\"00000000\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_CB_K": [ { "value": "\"00000000\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_CB_MAX_LEVEL": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CB_LEN_SEQ": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CB_NUM_SEQ": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CB_VAL": [ { "value": "\"00000000000000000000000000000000000000000000000000000000000000000000000000000000\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_CC_DISP": [ { "value": "\"00000000\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_CC_ENABLE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RESET_SEQUENCE_INTERVAL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CC_K": [ { "value": "\"00000000\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_CC_LEN_SEQ": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CC_NUM_SEQ": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CC_PERIODICITY": [ { "value": "5000", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CC_VAL": [ { "value": "\"00000000000000000000000000000000000000000000000000000000000000000000000000000000\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_COMMA_M_ENABLE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_COMMA_M_VAL": [ { "value": "\"1010000011\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_COMMA_P_ENABLE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_COMMA_P_VAL": [ { "value": "\"0101111100\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_DATA_DECODING": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_ENABLE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_INT_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_LINE_RATE": [ { "value": "10.3125", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_RX_MASTER_CHANNEL_IDX": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_OUTCLK_BUFG_GT_DIV": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_OUTCLK_FREQUENCY": [ { "value": "312.5000000", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_RX_OUTCLK_SOURCE": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_PLL_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_RECCLK_OUTPUT": [ { "value": "0x000000000000000000000000000000000000000000000000", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_REFCLK_FREQUENCY": [ { "value": "156.25", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_RX_SLIDE_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_USER_CLOCKING_CONTENTS": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_USER_CLOCKING_INSTANCE_CTRL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_USER_CLOCKING_RATIO_FSRC_FUSRCLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_USER_CLOCKING_RATIO_FUSRCLK_FUSRCLK2": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_USER_CLOCKING_SOURCE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_USER_DATA_WIDTH": [ { "value": "64", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_USRCLK_FREQUENCY": [ { "value": "312.5000000", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_RX_USRCLK2_FREQUENCY": [ { "value": "156.25", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_SECONDARY_QPLL_ENABLE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_SECONDARY_QPLL_REFCLK_FREQUENCY": [ { "value": "257.8125", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_TOTAL_NUM_CHANNELS": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TOTAL_NUM_COMMONS": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TOTAL_NUM_COMMONS_EXAMPLE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TXPROGDIV_FREQ_ENABLE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TXPROGDIV_FREQ_SOURCE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TXPROGDIV_FREQ_VAL": [ { "value": "312.5", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_TX_BUFFBYPASS_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_BUFFER_BYPASS_INSTANCE_CTRL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_BUFFER_MODE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_DATA_ENCODING": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_ENABLE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_INT_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_LINE_RATE": [ { "value": "10.3125", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_TX_MASTER_CHANNEL_IDX": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_OUTCLK_BUFG_GT_DIV": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_OUTCLK_FREQUENCY": [ { "value": "312.5000000", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_TX_OUTCLK_SOURCE": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_PLL_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_REFCLK_FREQUENCY": [ { "value": "156.25", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_TX_USER_CLOCKING_CONTENTS": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_USER_CLOCKING_INSTANCE_CTRL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_USER_CLOCKING_RATIO_FSRC_FUSRCLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_USER_CLOCKING_RATIO_FUSRCLK_FUSRCLK2": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_USER_CLOCKING_SOURCE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_USER_DATA_WIDTH": [ { "value": "64", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_USRCLK_FREQUENCY": [ { "value": "312.5000000", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_TX_USRCLK2_FREQUENCY": [ { "value": "156.25", "resolve_type": "generated", "format": "float", "usage": "all" } ] + }, + "project_parameters": { + "ARCHITECTURE": [ { "value": "kintexu" } ], + "BASE_BOARD_PART": [ { "value": "" } ], + "BOARD_CONNECTIONS": [ { "value": "" } ], + "DEVICE": [ { "value": "xcku040" } ], + "PACKAGE": [ { "value": "ffva1156" } ], + "PREFHDL": [ { "value": "VERILOG" } ], + "SILICON_REVISION": [ { "value": "" } ], + "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], + "SPEEDGRADE": [ { "value": "-2" } ], + "STATIC_POWER": [ { "value": "" } ], + "TEMPERATURE_GRADE": [ { "value": "I" } ], + "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], + "USE_RDI_GENERATION": [ { "value": "TRUE" } ] + }, + "runtime_parameters": { + "IPCONTEXT": [ { "value": "IP_Flow" } ], + "IPREVISION": [ { "value": "14" } ], + "MANAGED": [ { "value": "TRUE" } ], + "OUTPUTDIR": [ { "value": "../../../../radar_alinx_kintex.gen/sources_1/ip/eth_xcvr_gt_channel" } ], + "SELECTEDSIMMODEL": [ { "value": "" } ], + "SHAREDDIR": [ { "value": "." } ], + "SWVERSION": [ { "value": "2022.2" } ], + "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] + } + }, + "boundary": { + "ports": { + "gtwiz_userclk_tx_reset_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_tx_srcclk_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_tx_usrclk_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_tx_usrclk2_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_tx_active_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_rx_reset_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_rx_srcclk_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_rx_usrclk_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_rx_usrclk2_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_rx_active_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_clk_freerun_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_all_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_tx_pll_and_datapath_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_tx_datapath_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_rx_pll_and_datapath_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_rx_datapath_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_qpll0lock_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_rx_cdr_stable_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_tx_done_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_rx_done_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_qpll0reset_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userdata_tx_in": [ { "direction": "in", "size_left": "63", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userdata_rx_out": [ { "direction": "out", "size_left": "63", "size_right": "0", "driver_value": "0" } ], + "gthrxn_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gthrxp_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "qpll0clk_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0x0" } ], + "qpll0refclk_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0x0" } ], + "qpll1clk_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0x0" } ], + "qpll1refclk_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0x0" } ], + "rxgearboxslip_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "txheader_in": [ { "direction": "in", "size_left": "5", "size_right": "0", "driver_value": "0" } ], + "txsequence_in": [ { "direction": "in", "size_left": "6", "size_right": "0", "driver_value": "0" } ], + "gthtxn_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gthtxp_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtpowergood_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "rxdatavalid_out": [ { "direction": "out", "size_left": "1", "size_right": "0", "driver_value": "0" } ], + "rxheader_out": [ { "direction": "out", "size_left": "5", "size_right": "0", "driver_value": "0" } ], + "rxheadervalid_out": [ { "direction": "out", "size_left": "1", "size_right": "0", "driver_value": "0" } ], + "rxpmaresetdone_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "rxprgdivresetdone_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "rxstartofseq_out": [ { "direction": "out", "size_left": "1", "size_right": "0", "driver_value": "0" } ], + "txpmaresetdone_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "txprgdivresetdone_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ] + } + } + } +} \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/ip/eth_xcvr_gt_full/eth_xcvr_gt_full.xci b/radar_alinx_kintex.srcs/sources_1/ip/eth_xcvr_gt_full/eth_xcvr_gt_full.xci new file mode 100755 index 0000000..6535396 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/ip/eth_xcvr_gt_full/eth_xcvr_gt_full.xci @@ -0,0 +1,896 @@ +{ + "schema": "xilinx.com:schema:json_instance:1.0", + "ip_inst": { + "xci_name": "eth_xcvr_gt_full", + "component_reference": "xilinx.com:ip:gtwizard_ultrascale:1.7", + "ip_revision": "14", + "gen_directory": "../../../../radar_alinx_kintex.gen/sources_1/ip/eth_xcvr_gt_full", + "parameters": { + "component_parameters": { + "GT_TYPE": [ { "value": "GTH", "resolve_type": "user", "usage": "all" } ], + "INTERNAL_GT_PRIM_TYPE": [ { "value": "gthe3", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "GT_REV": [ { "value": "0", "resolve_type": "user", "usage": "all" } ], + "GT_DIRECTION": [ { "value": "BOTH", "resolve_type": "user", "usage": "all" } ], + "RX_ENABLE": [ { "value": "true", "resolve_type": "generated", "format": "bool", "enabled": false, "usage": "all" } ], + "TX_ENABLE": [ { "value": "true", "resolve_type": "generated", "format": "bool", "enabled": false, "usage": "all" } ], + "CHANNEL_ENABLE": [ { "value": "X0Y3", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "TX_MASTER_CHANNEL": [ { "value": "X0Y3", "value_src": "user", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_MASTER_CHANNEL": [ { "value": "X0Y3", "value_src": "user", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "INTERNAL_TOTAL_NUM_CHANNELS": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_TOTAL_NUM_COMMONS": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "LOCATE_COMMON": [ { "value": "CORE", "resolve_type": "user", "usage": "all" } ], + "INTERNAL_NUM_COMMONS_CORE": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_NUM_COMMONS_EXAMPLE": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_TX_USRCLK_FREQUENCY": [ { "value": "312.5000000", "resolve_type": "generated", "format": "float", "enabled": false, "usage": "all" } ], + "INTERNAL_RX_USRCLK_FREQUENCY": [ { "value": "312.5000000", "resolve_type": "generated", "format": "float", "enabled": false, "usage": "all" } ], + "RX_PPM_OFFSET": [ { "value": "200", "resolve_type": "user", "format": "long", "usage": "all" } ], + "OOB_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_SSC_PPM": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "INS_LOSS_NYQ": [ { "value": "20", "resolve_type": "user", "format": "float", "usage": "all" } ], + "PCIE_CORECLK_FREQ": [ { "value": "250", "resolve_type": "user", "format": "long", "usage": "all" } ], + "PCIE_USERCLK_FREQ": [ { "value": "250", "resolve_type": "user", "format": "float", "usage": "all" } ], + "TX_LINE_RATE": [ { "value": "10.3125", "resolve_type": "user", "format": "float", "usage": "all" } ], + "TX_PLL_TYPE": [ { "value": "QPLL0", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "TX_REFCLK_FREQUENCY": [ { "value": "156.25", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ], + "TX_DATA_ENCODING": [ { "value": "64B66B_ASYNC", "resolve_type": "user", "usage": "all" } ], + "TX_USER_DATA_WIDTH": [ { "value": "64", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TX_INT_DATA_WIDTH": [ { "value": "32", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TX_BUFFER_MODE": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "TX_QPLL_FRACN_NUMERATOR": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "TX_OUTCLK_SOURCE": [ { "value": "TXPROGDIVCLK", "resolve_type": "user", "usage": "all" } ], + "TX_DIFF_SWING_EMPH_MODE": [ { "value": "CUSTOM", "resolve_type": "user", "usage": "all" } ], + "RX_LINE_RATE": [ { "value": "10.3125", "resolve_type": "user", "format": "float", "usage": "all" } ], + "RX_PLL_TYPE": [ { "value": "QPLL0", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "RX_REFCLK_FREQUENCY": [ { "value": "156.25", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ], + "RX_DATA_DECODING": [ { "value": "64B66B_ASYNC", "resolve_type": "user", "usage": "all" } ], + "RX_USER_DATA_WIDTH": [ { "value": "64", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "RX_INT_DATA_WIDTH": [ { "value": "32", "resolve_type": "user", "format": "long", "usage": "all" } ], + "RX_BUFFER_MODE": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_QPLL_FRACN_NUMERATOR": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_EQ_MODE": [ { "value": "AUTO", "resolve_type": "user", "usage": "all" } ], + "RX_JTOL_FC": [ { "value": "6.1862627", "resolve_type": "user", "format": "float", "usage": "all" } ], + "RX_JTOL_LF_SLOPE": [ { "value": "-20", "resolve_type": "user", "format": "long", "usage": "all" } ], + "RX_OUTCLK_SOURCE": [ { "value": "RXPROGDIVCLK", "resolve_type": "user", "usage": "all" } ], + "SIM_CPLL_CAL_BYPASS": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "PCIE_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "RX_TERMINATION": [ { "value": "PROGRAMMABLE", "resolve_type": "user", "usage": "all" } ], + "RX_TERMINATION_PROG_VALUE": [ { "value": "800", "resolve_type": "user", "format": "long", "usage": "all" } ], + "RX_COUPLING": [ { "value": "AC", "resolve_type": "user", "usage": "all" } ], + "RX_BUFFER_BYPASS_MODE": [ { "value": "MULTI", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_BUFFER_RESET_ON_CB_CHANGE": [ { "value": "ENABLE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_BUFFER_RESET_ON_COMMAALIGN": [ { "value": "DISABLE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_BUFFER_RESET_ON_RATE_CHANGE": [ { "value": "ENABLE", "resolve_type": "user", "usage": "all" } ], + "TX_BUFFER_RESET_ON_RATE_CHANGE": [ { "value": "ENABLE", "resolve_type": "user", "usage": "all" } ], + "RESET_SEQUENCE_INTERVAL": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "RX_COMMA_PRESET": [ { "value": "NONE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_COMMA_VALID_ONLY": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_COMMA_P_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_COMMA_M_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_COMMA_DOUBLE_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_COMMA_P_VAL": [ { "value": "0101111100", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_COMMA_M_VAL": [ { "value": "1010000011", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_COMMA_MASK": [ { "value": "0000000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_COMMA_ALIGN_WORD": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_COMMA_SHOW_REALIGN_ENABLE": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "RX_SLIDE_MODE": [ { "value": "OFF", "resolve_type": "user", "usage": "all" } ], + "RX_CB_NUM_SEQ": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CB_LEN_SEQ": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CB_MAX_SKEW": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CB_MAX_LEVEL": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CB_MASK": [ { "value": "00000000", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "RX_CB_VAL": [ { "value": "00000000000000000000000000000000000000000000000000000000000000000000000000000000", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "RX_CB_K": [ { "value": "00000000", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "RX_CB_DISP": [ { "value": "00000000", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_0_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_0_0": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_0_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_0_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_0_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_0_1": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_0_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_0_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_0_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_0_2": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_0_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_0_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_0_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_0_3": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_0_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_0_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_1_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_1_0": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_1_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_1_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_1_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_1_1": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_1_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_1_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_1_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_1_2": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_1_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_1_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_MASK_1_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_VAL_1_3": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CB_K_1_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CB_DISP_1_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_NUM_SEQ": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CC_LEN_SEQ": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CC_PERIODICITY": [ { "value": "5000", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CC_KEEP_IDLE": [ { "value": "DISABLE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_PRECEDENCE": [ { "value": "ENABLE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_REPEAT_WAIT": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "RX_CC_MASK": [ { "value": "00000000", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "RX_CC_VAL": [ { "value": "00000000000000000000000000000000000000000000000000000000000000000000000000000000", "resolve_type": "user", "usage": "all" } ], + "RX_CC_K": [ { "value": "00000000", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "RX_CC_DISP": [ { "value": "00000000", "resolve_type": "generated", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_0_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_0_0": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_0_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_0_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_0_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_0_1": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_0_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_0_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_0_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_0_2": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_0_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_0_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_0_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_0_3": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_0_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_0_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_1_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_1_0": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_1_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_1_0": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_1_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_1_1": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_1_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_1_1": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_1_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_1_2": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_1_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_1_2": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_MASK_1_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_VAL_1_3": [ { "value": "00000000", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "RX_CC_K_1_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RX_CC_DISP_1_3": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "ENABLE_OPTIONAL_PORTS": [ { "value": "qpll0lock_out", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "RX_REFCLK_SOURCE": [ { "value": "X0Y3 clk1+2", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "TX_REFCLK_SOURCE": [ { "value": "X0Y3 clk1+2", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "RX_RECCLK_OUTPUT": [ { "value": "", "resolve_type": "user", "usage": "all" } ], + "LOCATE_RESET_CONTROLLER": [ { "value": "CORE", "resolve_type": "user", "usage": "all" } ], + "LOCATE_TX_BUFFER_BYPASS_CONTROLLER": [ { "value": "CORE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "LOCATE_RX_BUFFER_BYPASS_CONTROLLER": [ { "value": "CORE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "LOCATE_IN_SYSTEM_IBERT_CORE": [ { "value": "NONE", "resolve_type": "user", "usage": "all" } ], + "LOCATE_TX_USER_CLOCKING": [ { "value": "CORE", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "LOCATE_RX_USER_CLOCKING": [ { "value": "CORE", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "LOCATE_USER_DATA_WIDTH_SIZING": [ { "value": "CORE", "resolve_type": "user", "usage": "all" } ], + "ORGANIZE_PORTS_BY": [ { "value": "NAME", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "PRESET": [ { "value": "GTH-10GBASE-R", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "INTERNAL_PRESET": [ { "value": "10GBASE-R", "resolve_type": "user", "usage": "all" } ], + "INTERNAL_PORT_USAGE_UPDATED": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLEMENT_UPDATED": [ { "value": "14", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_CHANNEL_SITES_UPDATED": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_CHANNEL_COLUMN_LOC_MAX": [ { "value": "96", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_RX_COMMA_PRESET_UPDATE": [ { "value": "4", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_UPDATE_IP_SYMBOL_drpclk_in": [ { "value": "false", "resolve_type": "generated", "format": "bool", "enabled": false, "usage": "all" } ], + "SECONDARY_QPLL_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "SECONDARY_QPLL_LINE_RATE": [ { "value": "10.3125", "resolve_type": "user", "format": "float", "enabled": false, "usage": "all" } ], + "SECONDARY_QPLL_FRACN_NUMERATOR": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "SECONDARY_QPLL_REFCLK_FREQUENCY": [ { "value": "257.8125", "resolve_type": "user", "format": "float", "enabled": false, "usage": "all" } ], + "TXPROGDIV_FREQ_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "TXPROGDIV_FREQ_SOURCE": [ { "value": "QPLL0", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "TXPROGDIV_FREQ_VAL": [ { "value": "312.5", "resolve_type": "user", "format": "float", "enabled": false, "usage": "all" } ], + "SATA_TX_BURST_LEN": [ { "value": "15", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FREERUN_FREQUENCY": [ { "value": "156.25", "resolve_type": "user", "format": "float", "usage": "all" } ], + "INCLUDE_CPLL_CAL": [ { "value": "2", "resolve_type": "user", "format": "long", "usage": "all" } ], + "USER_GTPOWERGOOD_DELAY_EN": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "DISABLE_LOC_XDC": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "ENABLE_COMMON_USRCLK": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "USB_ENABLE": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "PCIE_64BIT": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "PCIE_GEN4_EIOS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_TX_RESET_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_TX_ACTIVE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_TX_SRCCLK_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_TX_USRCLK_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_TX_USRCLK2_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_TX_ACTIVE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_RX_RESET_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_RX_ACTIVE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_RX_SRCCLK_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_RX_USRCLK_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_RX_USRCLK2_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERCLK_RX_ACTIVE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_TX_RESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_TX_START_USER_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_TX_DONE_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_TX_ERROR_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_RX_RESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_RX_START_USER_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_RX_DONE_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_BUFFBYPASS_RX_ERROR_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_CLK_FREERUN_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_ALL_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_TX_PLL_AND_DATAPATH_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_TX_DATAPATH_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_RX_PLL_AND_DATAPATH_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_RX_DATAPATH_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_TX_DONE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_RX_DONE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_QPLL0LOCK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_QPLL1LOCK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_RX_CDR_STABLE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_TX_DONE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_RX_DONE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_QPLL0RESET_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_RESET_QPLL1RESET_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTHE3_CPLL_CAL_TXOUTCLK_PERIOD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTHE3_CPLL_CAL_CNT_TOL_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTHE3_CPLL_CAL_BUFG_CE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTHE4_CPLL_CAL_TXOUTCLK_PERIOD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTHE4_CPLL_CAL_CNT_TOL_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTHE4_CPLL_CAL_BUFG_CE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTYE4_CPLL_CAL_TXOUTCLK_PERIOD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTYE4_CPLL_CAL_CNT_TOL_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_GTYE4_CPLL_CAL_BUFG_CE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERDATA_TX_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTWIZ_USERDATA_RX_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BGBYPASSB_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BGMONITORENB_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BGPDB_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BGRCALOVRD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BGRCALOVRDENB_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPADDR_COMMON_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPCLK_COMMON_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPDI_COMMON_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPEN_COMMON_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPWE_COMMON_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTGREFCLK0_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTGREFCLK1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTNORTHREFCLK00_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTNORTHREFCLK01_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTNORTHREFCLK10_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTNORTHREFCLK11_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTREFCLK00_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTREFCLK01_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTREFCLK10_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTREFCLK11_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTSOUTHREFCLK00_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTSOUTHREFCLK01_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTSOUTHREFCLK10_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTSOUTHREFCLK11_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERATEQPLL0_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERATEQPLL1_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PMARSVD0_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PMARSVD1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0CLKRSVD0_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0CLKRSVD1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0FBDIV_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0LOCKDETCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0LOCKEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0PD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0REFCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0RESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1CLKRSVD0_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1CLKRSVD1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1FBDIV_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1LOCKDETCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1LOCKEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1PD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1REFCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1RESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLLRSVD1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLLRSVD2_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLLRSVD3_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLLRSVD4_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RCALENB_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM0DATA_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM0RESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM0TOGGLE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM0WIDTH_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM1DATA_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM1RESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM1TOGGLE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM1WIDTH_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TCONGPI_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TCONPOWERUP_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TCONRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TCONRSVDIN1_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBCFGSTREAMEN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBDO_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBDRDY_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBENABLE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBGPI_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBINTR_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBIOLMBRST_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMBRST_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMCAPTURE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMDBGRST_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMDBGUPDATE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMREGEN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMSHIFT_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMSYSRST_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMTCK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMTDI_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPDO_COMMON_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPRDY_COMMON_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PMARSVDOUT0_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PMARSVDOUT1_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0FBCLKLOST_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0LOCK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0OUTCLK_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0OUTREFCLK_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0REFCLKLOST_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1FBCLKLOST_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1LOCK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1OUTCLK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1OUTREFCLK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1REFCLKLOST_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLLDMONITOR0_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLLDMONITOR1_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_REFCLKOUTMONITOR0_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_REFCLKOUTMONITOR1_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRECCLK0_SEL_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRECCLK1_SEL_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRECCLK0SEL_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRECCLK1SEL_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM0FINALOUT_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM0TESTDATA_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM1FINALOUT_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SDM1TESTDATA_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TCONGPO_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TCONRSVDOUT0_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBDADDR_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBDEN_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBDI_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBDWE_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBMDMTDO_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBRSVDOUT_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_UBTXUART_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CDRSTEPDIR_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CDRSTEPSQ_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CDRSTEPSX_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CFGRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CLKRSVD0_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CLKRSVD1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLFREQLOCK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLLOCKDETCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLLOCKEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLREFCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DMONFIFORESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DMONITORCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPADDR_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPDI_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPRST_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPWE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_ELPCALDVORWREN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_ELPCALPAORWREN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EVODDPHICALDONE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EVODDPHICALSTART_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EVODDPHIDRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EVODDPHIDWREN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EVODDPHIXRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EVODDPHIXWREN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EYESCANMODE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EYESCANRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EYESCANTRIGGER_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_FREQOS_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTGREFCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTHRXN_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTHRXP_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTNORTHREFCLK0_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTNORTHREFCLK1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTREFCLK0_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTREFCLK1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTRESETSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTRSVD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTRXRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTRXRESETSEL_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTSOUTHREFCLK0_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTSOUTHREFCLK1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTTXRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTTXRESETSEL_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_INCPCTRL_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTYRXN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTYRXP_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_LOOPBACK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_LOOPRSVD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_LPBKRXTXSEREN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_LPBKTXRXSEREN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIEEQRXEQADAPTDONE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERSTIDLE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERSTTXSYNCSTART_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIEUSERRATEDONE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCSRSVDIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCSRSVDIN2_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PMARSVDIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0CLK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0FREQLOCK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL0REFCLK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1CLK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1FREQLOCK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_QPLL1REFCLK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RESETOVRD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RSTCLKENTX_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RX8B10BEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXAFECFOKEN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXBUFRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCDRFREQRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCDRHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCDROVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCDRRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCDRRESETRSV_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHBONDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHBONDI_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHBONDLEVEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHBONDMASTER_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHBONDSLAVE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCKCALRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCKCALSTART_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCOMMADETEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEAGCCTRL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDCCFORCESTART_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEAGCHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEAGCOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFECFOKFCNUM_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFECFOKFEN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFECFOKFPULSE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFECFOKHOLD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFECFOKOVREN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEKHHOLD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEKHOVRDEN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFELFHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFELFOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFELPMRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP10HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP10OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP11HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP11OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP12HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP12OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP13HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP13OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP14HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP14OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP15HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP15OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP2HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP2OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP3HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP3OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP4HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP4OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP5HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP5OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP6HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP6OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP7HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP7OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP8HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP8OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP9HOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFETAP9OVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEUTHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEUTOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEVPHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEVPOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEVSEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDFEXYDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDLYBYPASS_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDLYEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDLYOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDLYSRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXELECIDLEMODE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXEQTRAINING_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXGEARBOXSLIP_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLATCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMGCHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMGCOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMHFHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMHFOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMLFHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMLFKLOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMOSHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLPMOSOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXMCOMMAALIGNEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXMONITORSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOOBRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSCALRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTCFG_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTSTROBE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTTESTOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOUTCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPCOMMAALIGNEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPCSRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPHALIGN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPHALIGNEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPHDLYPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPHDLYRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPHOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPLLCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPMARESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPOLARITY_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPRBSCNTRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPRBSSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPROGDIVRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXQPIEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRATE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRATEMODE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSLIDE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSLIPOUTCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSLIPPMA_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSYNCALLIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSYNCIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSYNCMODE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSYSCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXTERMINATION_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXUSERRDY_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXUSRCLK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXUSRCLK2_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_SIGVALIDCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TSTIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TX8B10BBYPASS_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TX8B10BEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXBUFDIFFCTRL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXCOMINIT_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXCOMSAS_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXCOMWAKE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXCTRL0_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXCTRL1_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXCTRL2_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDATA_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDATAEXTENDRSVD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDCCFORCESTART_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDCCRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDEEMPH_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDETECTRX_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDIFFCTRL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDIFFPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDLYBYPASS_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDLYEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDLYHOLD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDLYOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDLYSRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDLYUPDOWN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXELECIDLE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXELFORCESTART_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXHEADER_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXINHIBIT_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXLATCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXLFPSTRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXLFPSU2LPEXIT_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXLFPSU3WAKE_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXMAINCURSOR_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXMARGIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXMUXDCDEXHOLD_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXMUXDCDORWREN_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXONESZEROS_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXOUTCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPCSRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPDELECIDLEMODE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHALIGN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHALIGNEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHDLYPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHDLYRESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHDLYTSTCLK_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHINIT_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPIPPMEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPIPPMOVRDEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPIPPMPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPIPPMSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPIPPMSTEPSIZE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPISOPD_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPLLCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPMARESET_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPOLARITY_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPOSTCURSOR_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPOSTCURSORINV_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPRBSFORCEERR_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPRBSSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPRECURSOR_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPRECURSORINV_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPROGDIVRESET_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXQPIBIASEN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXQPISTRONGPDOWN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXQPIWEAKPUP_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXRATE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXRATEMODE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSEQUENCE_IN": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSWING_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSYNCALLIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSYNCIN_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSYNCMODE_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSYSCLKSEL_IN": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXUSERRDY_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXUSRCLK_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXUSRCLK2_IN": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BUFGTCE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BUFGTCEMASK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BUFGTDIV_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BUFGTRESET_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_BUFGTRSTMASK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLFBCLKLOST_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLLOCK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_CPLLREFCLKLOST_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DMONITOROUT_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DMONITOROUTCLK_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPDO_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_DRPRDY_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_EYESCANDATAERROR_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTHTXN_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTHTXP_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTPOWERGOOD_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTREFCLKMONITOR_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTYTXN_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_GTYTXP_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERATEGEN3_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERATEIDLE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERATEQPLLPD_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIERATEQPLLRESET_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIESYNCTXSYNCDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIEUSERGEN3RDY_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIEUSERPHYSTATUSRST_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCIEUSERRATESTART_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PCSRSVDOUT_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PHYSTATUS_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_PINRSRVDAS_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_POWERPRESENT_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RESETEXCEPTION_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXBUFSTATUS_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXBYTEISALIGNED_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXBYTEREALIGN_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCDRLOCK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCDRPHDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHANBONDSEQ_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHANISALIGNED_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHANREALIGN_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCHBONDO_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCKCALDONE_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCLKCORCNT_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCOMINITDET_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCOMMADET_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCOMSASDET_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCOMWAKEDET_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCTRL0_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCTRL1_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCTRL2_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXCTRL3_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDATA_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDATAEXTENDRSVD_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDATAVALID_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXDLYSRESETDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXELECIDLE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXHEADER_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXHEADERVALID_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLFPSTRESETDET_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLFPSU2LPEXITDET_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXLFPSU3WAKEDET_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXMONITOROUT_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTSTARTED_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTSTROBEDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOSINTSTROBESTARTED_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOUTCLK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOUTCLKFABRIC_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXOUTCLKPCS_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPHALIGNDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPHALIGNERR_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPMARESETDONE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPRBSERR_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPRBSLOCKED_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXPRGDIVRESETDONE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXQPISENN_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXQPISENP_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRATEDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRECCLKOUT_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXRESETDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSLIDERDY_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSLIPDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSLIPOUTCLKRDY_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSLIPPMARDY_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSTARTOFSEQ_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSTATUS_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSYNCDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXSYNCOUT_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_RXVALID_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXBUFSTATUS_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXCOMFINISH_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDCCDONE_OUT": [ { "value": "-1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXDLYSRESETDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXOUTCLK_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXOUTCLKFABRIC_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXOUTCLKPCS_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHALIGNDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPHINITDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPMARESETDONE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXPRGDIVRESETDONE_OUT": [ { "value": "1", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXQPISENN_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXQPISENP_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXRATEDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXRESETDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSYNCDONE_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "INTERNAL_PORT_ENABLED_TXSYNCOUT_OUT": [ { "value": "0", "resolve_type": "generated", "format": "long", "enabled": false, "usage": "all" } ], + "Component_Name": [ { "value": "eth_xcvr_gt_full", "resolve_type": "user", "usage": "all" } ] + }, + "model_parameters": { + "C_CHANNEL_ENABLE": [ { "value": "\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_PCIE_ENABLE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_PCIE_CORECLK_FREQ": [ { "value": "250", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_COMMON_SCALING_FACTOR": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_CPLL_VCO_FREQUENCY": [ { "value": "2578.125", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_FORCE_COMMONS": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_FREERUN_FREQUENCY": [ { "value": "156.25", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_GT_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_GT_REV": [ { "value": "17", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_INCLUDE_CPLL_CAL": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ENABLE_COMMON_USRCLK": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USER_GTPOWERGOOD_DELAY_EN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_SIM_CPLL_CAL_BYPASS": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_COMMON": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_RESET_CONTROLLER": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_USER_DATA_WIDTH_SIZING": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_RX_BUFFER_BYPASS_CONTROLLER": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_IN_SYSTEM_IBERT_CORE": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_RX_USER_CLOCKING": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_TX_BUFFER_BYPASS_CONTROLLER": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOCATE_TX_USER_CLOCKING": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RESET_CONTROLLER_INSTANCE_CTRL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_BUFFBYPASS_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_BUFFER_BYPASS_INSTANCE_CTRL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_BUFFER_MODE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CB_DISP": [ { "value": "\"00000000\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_CB_K": [ { "value": "\"00000000\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_CB_MAX_LEVEL": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CB_LEN_SEQ": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CB_NUM_SEQ": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CB_VAL": [ { "value": "\"00000000000000000000000000000000000000000000000000000000000000000000000000000000\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_CC_DISP": [ { "value": "\"00000000\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_CC_ENABLE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RESET_SEQUENCE_INTERVAL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CC_K": [ { "value": "\"00000000\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_CC_LEN_SEQ": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CC_NUM_SEQ": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CC_PERIODICITY": [ { "value": "5000", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_CC_VAL": [ { "value": "\"00000000000000000000000000000000000000000000000000000000000000000000000000000000\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_COMMA_M_ENABLE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_COMMA_M_VAL": [ { "value": "\"1010000011\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_COMMA_P_ENABLE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_COMMA_P_VAL": [ { "value": "\"0101111100\"", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_DATA_DECODING": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_ENABLE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_INT_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_LINE_RATE": [ { "value": "10.3125", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_RX_MASTER_CHANNEL_IDX": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_OUTCLK_BUFG_GT_DIV": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_OUTCLK_FREQUENCY": [ { "value": "312.5000000", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_RX_OUTCLK_SOURCE": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_PLL_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_RECCLK_OUTPUT": [ { "value": "0x000000000000000000000000000000000000000000000000", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_RX_REFCLK_FREQUENCY": [ { "value": "156.25", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_RX_SLIDE_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_USER_CLOCKING_CONTENTS": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_USER_CLOCKING_INSTANCE_CTRL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_USER_CLOCKING_RATIO_FSRC_FUSRCLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_USER_CLOCKING_RATIO_FUSRCLK_FUSRCLK2": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_USER_CLOCKING_SOURCE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_USER_DATA_WIDTH": [ { "value": "64", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RX_USRCLK_FREQUENCY": [ { "value": "312.5000000", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_RX_USRCLK2_FREQUENCY": [ { "value": "156.25", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_SECONDARY_QPLL_ENABLE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_SECONDARY_QPLL_REFCLK_FREQUENCY": [ { "value": "257.8125", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_TOTAL_NUM_CHANNELS": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TOTAL_NUM_COMMONS": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TOTAL_NUM_COMMONS_EXAMPLE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TXPROGDIV_FREQ_ENABLE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TXPROGDIV_FREQ_SOURCE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TXPROGDIV_FREQ_VAL": [ { "value": "312.5", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_TX_BUFFBYPASS_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_BUFFER_BYPASS_INSTANCE_CTRL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_BUFFER_MODE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_DATA_ENCODING": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_ENABLE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_INT_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_LINE_RATE": [ { "value": "10.3125", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_TX_MASTER_CHANNEL_IDX": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_OUTCLK_BUFG_GT_DIV": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_OUTCLK_FREQUENCY": [ { "value": "312.5000000", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_TX_OUTCLK_SOURCE": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_PLL_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_REFCLK_FREQUENCY": [ { "value": "156.25", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_TX_USER_CLOCKING_CONTENTS": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_USER_CLOCKING_INSTANCE_CTRL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_USER_CLOCKING_RATIO_FSRC_FUSRCLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_USER_CLOCKING_RATIO_FUSRCLK_FUSRCLK2": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_USER_CLOCKING_SOURCE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_USER_DATA_WIDTH": [ { "value": "64", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_TX_USRCLK_FREQUENCY": [ { "value": "312.5000000", "resolve_type": "generated", "format": "float", "usage": "all" } ], + "C_TX_USRCLK2_FREQUENCY": [ { "value": "156.25", "resolve_type": "generated", "format": "float", "usage": "all" } ] + }, + "project_parameters": { + "ARCHITECTURE": [ { "value": "kintexu" } ], + "BASE_BOARD_PART": [ { "value": "" } ], + "BOARD_CONNECTIONS": [ { "value": "" } ], + "DEVICE": [ { "value": "xcku040" } ], + "PACKAGE": [ { "value": "ffva1156" } ], + "PREFHDL": [ { "value": "VERILOG" } ], + "SILICON_REVISION": [ { "value": "" } ], + "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], + "SPEEDGRADE": [ { "value": "-2" } ], + "STATIC_POWER": [ { "value": "" } ], + "TEMPERATURE_GRADE": [ { "value": "I" } ], + "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], + "USE_RDI_GENERATION": [ { "value": "TRUE" } ] + }, + "runtime_parameters": { + "IPCONTEXT": [ { "value": "IP_Flow" } ], + "IPREVISION": [ { "value": "14" } ], + "MANAGED": [ { "value": "TRUE" } ], + "OUTPUTDIR": [ { "value": "../../../../radar_alinx_kintex.gen/sources_1/ip/eth_xcvr_gt_full" } ], + "SELECTEDSIMMODEL": [ { "value": "" } ], + "SHAREDDIR": [ { "value": "." } ], + "SWVERSION": [ { "value": "2022.2" } ], + "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] + } + }, + "boundary": { + "ports": { + "gtwiz_userclk_tx_reset_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_tx_srcclk_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_tx_usrclk_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_tx_usrclk2_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_tx_active_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_rx_reset_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_rx_srcclk_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_rx_usrclk_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_rx_usrclk2_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userclk_rx_active_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_clk_freerun_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_all_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_tx_pll_and_datapath_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_tx_datapath_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_rx_pll_and_datapath_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_rx_datapath_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_rx_cdr_stable_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_tx_done_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_reset_rx_done_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userdata_tx_in": [ { "direction": "in", "size_left": "63", "size_right": "0", "driver_value": "0" } ], + "gtwiz_userdata_rx_out": [ { "direction": "out", "size_left": "63", "size_right": "0", "driver_value": "0" } ], + "gtrefclk00_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "qpll0lock_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "qpll0outclk_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "qpll0outrefclk_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gthrxn_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gthrxp_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "rxgearboxslip_in": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "txheader_in": [ { "direction": "in", "size_left": "5", "size_right": "0", "driver_value": "0" } ], + "txsequence_in": [ { "direction": "in", "size_left": "6", "size_right": "0", "driver_value": "0" } ], + "gthtxn_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gthtxp_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "gtpowergood_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "rxdatavalid_out": [ { "direction": "out", "size_left": "1", "size_right": "0", "driver_value": "0" } ], + "rxheader_out": [ { "direction": "out", "size_left": "5", "size_right": "0", "driver_value": "0" } ], + "rxheadervalid_out": [ { "direction": "out", "size_left": "1", "size_right": "0", "driver_value": "0" } ], + "rxpmaresetdone_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "rxprgdivresetdone_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "rxstartofseq_out": [ { "direction": "out", "size_left": "1", "size_right": "0", "driver_value": "0" } ], + "txpmaresetdone_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "txprgdivresetdone_out": [ { "direction": "out", "size_left": "0", "size_right": "0", "driver_value": "0" } ] + } + } + } +} \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/ip/hdr_fifo/hdr_fifo.xci b/radar_alinx_kintex.srcs/sources_1/ip/hdr_fifo/hdr_fifo.xci new file mode 100755 index 0000000..1c10a21 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/ip/hdr_fifo/hdr_fifo.xci @@ -0,0 +1,179 @@ +{ + "schema": "xilinx.com:schema:json_instance:1.0", + "ip_inst": { + "xci_name": "hdr_fifo", + "component_reference": "xilinx.com:ip:axis_data_fifo:2.0", + "ip_revision": "9", + "gen_directory": "../../../../radar_alinx_kintex.gen/sources_1/ip/hdr_fifo", + "parameters": { + "component_parameters": { + "TDATA_NUM_BYTES": [ { "value": "8", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TUSER_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FIFO_DEPTH": [ { "value": "128", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FIFO_MODE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "IS_ACLK_ASYNC": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "ACLKEN_CONV_MODE": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TLAST": [ { "value": "1", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "SYNCHRONIZATION_STAGES": [ { "value": "3", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "HAS_WR_DATA_COUNT": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_RD_DATA_COUNT": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_AEMPTY": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_PROG_EMPTY": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "PROG_EMPTY_THRESH": [ { "value": "5", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "HAS_AFULL": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_PROG_FULL": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "PROG_FULL_THRESH": [ { "value": "11", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "ENABLE_ECC": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "HAS_ECC_ERR_INJECT": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "FIFO_MEMORY_TYPE": [ { "value": "auto", "resolve_type": "user", "usage": "all" } ], + "Component_Name": [ { "value": "hdr_fifo", "resolve_type": "user", "usage": "all" } ] + }, + "model_parameters": { + "C_FAMILY": [ { "value": "kintexu", "resolve_type": "generated", "usage": "all" } ], + "C_AXIS_TDATA_WIDTH": [ { "value": "64", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TID_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TDEST_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TUSER_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_SIGNAL_SET": [ { "value": "0b00000000000000000000000000010011", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_FIFO_DEPTH": [ { "value": "128", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_FIFO_MODE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_IS_ACLK_ASYNC": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_SYNCHRONIZER_STAGE": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ACLKEN_CONV_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ECC_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_FIFO_MEMORY_TYPE": [ { "value": "auto", "resolve_type": "generated", "usage": "all" } ], + "C_USE_ADV_FEATURES": [ { "value": "825241648", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_PROG_EMPTY_THRESH": [ { "value": "5", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_PROG_FULL_THRESH": [ { "value": "11", "resolve_type": "generated", "format": "long", "usage": "all" } ] + }, + "project_parameters": { + "ARCHITECTURE": [ { "value": "kintexu" } ], + "BASE_BOARD_PART": [ { "value": "" } ], + "BOARD_CONNECTIONS": [ { "value": "" } ], + "DEVICE": [ { "value": "xcku040" } ], + "PACKAGE": [ { "value": "ffva1156" } ], + "PREFHDL": [ { "value": "VERILOG" } ], + "SILICON_REVISION": [ { "value": "" } ], + "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], + "SPEEDGRADE": [ { "value": "-2" } ], + "STATIC_POWER": [ { "value": "" } ], + "TEMPERATURE_GRADE": [ { "value": "I" } ], + "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], + "USE_RDI_GENERATION": [ { "value": "TRUE" } ] + }, + "runtime_parameters": { + "IPCONTEXT": [ { "value": "IP_Flow" } ], + "IPREVISION": [ { "value": "9" } ], + "MANAGED": [ { "value": "TRUE" } ], + "OUTPUTDIR": [ { "value": "../../../../radar_alinx_kintex.gen/sources_1/ip/hdr_fifo" } ], + "SELECTEDSIMMODEL": [ { "value": "" } ], + "SHAREDDIR": [ { "value": "." } ], + "SWVERSION": [ { "value": "2022.2" } ], + "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] + } + }, + "boundary": { + "ports": { + "s_axis_aresetn": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_aclk": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_tvalid": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_tready": [ { "direction": "out" } ], + "s_axis_tdata": [ { "direction": "in", "size_left": "63", "size_right": "0", "driver_value": "0x0000000000000000" } ], + "s_axis_tlast": [ { "direction": "in", "driver_value": "0x1" } ], + "m_axis_tvalid": [ { "direction": "out" } ], + "m_axis_tready": [ { "direction": "in", "driver_value": "0x1" } ], + "m_axis_tdata": [ { "direction": "out", "size_left": "63", "size_right": "0" } ], + "m_axis_tlast": [ { "direction": "out" } ] + }, + "interfaces": { + "S_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "slave", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "8", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TDATA": [ { "physical_name": "s_axis_tdata" } ], + "TLAST": [ { "physical_name": "s_axis_tlast" } ], + "TREADY": [ { "physical_name": "s_axis_tready" } ], + "TVALID": [ { "physical_name": "s_axis_tvalid" } ] + } + }, + "M_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "master", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "8", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TDATA": [ { "physical_name": "m_axis_tdata" } ], + "TLAST": [ { "physical_name": "m_axis_tlast" } ], + "TREADY": [ { "physical_name": "m_axis_tready" } ], + "TVALID": [ { "physical_name": "m_axis_tvalid" } ] + } + }, + "S_RSTIF": { + "vlnv": "xilinx.com:signal:reset:1.0", + "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", + "mode": "slave", + "parameters": { + "POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "RST": [ { "physical_name": "s_axis_aresetn" } ] + } + }, + "S_CLKIF": { + "vlnv": "xilinx.com:signal:clock:1.0", + "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", + "mode": "slave", + "parameters": { + "ASSOCIATED_BUSIF": [ { "value": "S_AXIS", "value_src": "constant", "usage": "all" } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "CLK": [ { "physical_name": "s_axis_aclk" } ] + } + } + } + } + } +} \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/ip/hdr_mem/hdr_mem.xci b/radar_alinx_kintex.srcs/sources_1/ip/hdr_mem/hdr_mem.xci new file mode 100755 index 0000000..ac08347 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/ip/hdr_mem/hdr_mem.xci @@ -0,0 +1,281 @@ +{ + "schema": "xilinx.com:schema:json_instance:1.0", + "ip_inst": { + "xci_name": "hdr_mem", + "component_reference": "xilinx.com:ip:blk_mem_gen:8.4", + "ip_revision": "5", + "gen_directory": "../../../../radar_alinx_kintex.gen/sources_1/ip/hdr_mem", + "parameters": { + "component_parameters": { + "Component_Name": [ { "value": "hdr_mem", "resolve_type": "user", "usage": "all" } ], + "Interface_Type": [ { "value": "Native", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "AXI_Type": [ { "value": "AXI4_Full", "resolve_type": "user", "usage": "all" } ], + "AXI_Slave_Type": [ { "value": "Memory_Slave", "resolve_type": "user", "usage": "all" } ], + "Use_AXI_ID": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "AXI_ID_Width": [ { "value": "4", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "Memory_Type": [ { "value": "Simple_Dual_Port_RAM", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "PRIM_type_to_Implement": [ { "value": "BRAM", "resolve_type": "user", "usage": "all" } ], + "Enable_32bit_Address": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "ecctype": [ { "value": "No_ECC", "resolve_type": "user", "usage": "all" } ], + "ECC": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "EN_SLEEP_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "EN_DEEPSLEEP_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "EN_SHUTDOWN_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "EN_ECC_PIPE": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RD_ADDR_CHNG_A": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RD_ADDR_CHNG_B": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Use_Error_Injection_Pins": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Error_Injection_Type": [ { "value": "Single_Bit_Error_Injection", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Use_Byte_Write_Enable": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Byte_Size": [ { "value": "9", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Algorithm": [ { "value": "Minimum_Area", "resolve_type": "user", "usage": "all" } ], + "Primitive": [ { "value": "8kx2", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Assume_Synchronous_Clk": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Write_Width_A": [ { "value": "32", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Write_Depth_A": [ { "value": "256", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Read_Width_A": [ { "value": "32", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Operating_Mode_A": [ { "value": "NO_CHANGE", "resolve_type": "user", "usage": "all" } ], + "Enable_A": [ { "value": "Use_ENA_Pin", "resolve_type": "user", "usage": "all" } ], + "Write_Width_B": [ { "value": "64", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "Read_Width_B": [ { "value": "64", "resolve_type": "user", "usage": "all" } ], + "Operating_Mode_B": [ { "value": "WRITE_FIRST", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Enable_B": [ { "value": "Use_ENB_Pin", "resolve_type": "user", "usage": "all" } ], + "Register_PortA_Output_of_Memory_Primitives": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Register_PortA_Output_of_Memory_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Use_REGCEA_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Register_PortB_Output_of_Memory_Primitives": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Register_PortB_Output_of_Memory_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Use_REGCEB_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "register_porta_input_of_softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "register_portb_output_of_softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Pipeline_Stages": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Load_Init_File": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Coe_File": [ { "value": "no_coe_file_loaded", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Fill_Remaining_Memory_Locations": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Remaining_Memory_Locations": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Use_RSTA_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Reset_Memory_Latch_A": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Reset_Priority_A": [ { "value": "CE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Output_Reset_Value_A": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Use_RSTB_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Reset_Memory_Latch_B": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Reset_Priority_B": [ { "value": "CE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Output_Reset_Value_B": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Reset_Type": [ { "value": "SYNC", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Additional_Inputs_for_Power_Estimation": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Port_A_Clock": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Port_A_Write_Rate": [ { "value": "50", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Port_B_Clock": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Port_B_Write_Rate": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "Port_A_Enable_Rate": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Port_B_Enable_Rate": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Collision_Warnings": [ { "value": "ALL", "resolve_type": "user", "usage": "all" } ], + "Disable_Collision_Warnings": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Disable_Out_of_Range_Warnings": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "use_bram_block": [ { "value": "Stand_Alone", "resolve_type": "user", "usage": "all" } ], + "MEM_FILE": [ { "value": "no_mem_loaded", "resolve_type": "user", "usage": "all" } ], + "CTRL_ECC_ALGO": [ { "value": "NONE", "resolve_type": "user", "usage": "all" } ], + "EN_SAFETY_CKT": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "READ_LATENCY_A": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "READ_LATENCY_B": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ] + }, + "model_parameters": { + "C_FAMILY": [ { "value": "kintexu", "resolve_type": "generated", "usage": "all" } ], + "C_XDEVICEFAMILY": [ { "value": "kintexu", "resolve_type": "generated", "usage": "all" } ], + "C_ELABORATION_DIR": [ { "value": "./", "resolve_type": "generated", "usage": "all" } ], + "C_INTERFACE_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXI_TYPE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXI_SLAVE_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USE_BRAM_BLOCK": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ENABLE_32BIT_ADDRESS": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_CTRL_ECC_ALGO": [ { "value": "NONE", "resolve_type": "generated", "usage": "all" } ], + "C_HAS_AXI_ID": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_MEM_TYPE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_BYTE_SIZE": [ { "value": "9", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ALGORITHM": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_PRIM_TYPE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOAD_INIT_FILE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_INIT_FILE_NAME": [ { "value": "no_coe_file_loaded", "resolve_type": "generated", "usage": "all" } ], + "C_INIT_FILE": [ { "value": "hdr_mem.mem", "resolve_type": "generated", "usage": "all" } ], + "C_USE_DEFAULT_DATA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_DEFAULT_DATA": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], + "C_HAS_RSTA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RST_PRIORITY_A": [ { "value": "CE", "resolve_type": "generated", "usage": "all" } ], + "C_RSTRAM_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_INITA_VAL": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], + "C_HAS_ENA": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_REGCEA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USE_BYTE_WEA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_WEA_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_WRITE_MODE_A": [ { "value": "NO_CHANGE", "resolve_type": "generated", "usage": "all" } ], + "C_WRITE_WIDTH_A": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_READ_WIDTH_A": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_WRITE_DEPTH_A": [ { "value": "256", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_READ_DEPTH_A": [ { "value": "256", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ADDRA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_RSTB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RST_PRIORITY_B": [ { "value": "CE", "resolve_type": "generated", "usage": "all" } ], + "C_RSTRAM_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_INITB_VAL": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], + "C_HAS_ENB": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_REGCEB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USE_BYTE_WEB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_WEB_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_WRITE_MODE_B": [ { "value": "WRITE_FIRST", "resolve_type": "generated", "usage": "all" } ], + "C_WRITE_WIDTH_B": [ { "value": "64", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_READ_WIDTH_B": [ { "value": "64", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_WRITE_DEPTH_B": [ { "value": "128", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_READ_DEPTH_B": [ { "value": "128", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ADDRB_WIDTH": [ { "value": "7", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_MEM_OUTPUT_REGS_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_MEM_OUTPUT_REGS_B": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_MUX_OUTPUT_REGS_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_MUX_OUTPUT_REGS_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_MUX_PIPELINE_STAGES": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_SOFTECC_INPUT_REGS_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_SOFTECC_OUTPUT_REGS_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USE_SOFTECC": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USE_ECC": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_ECC_PIPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_READ_LATENCY_A": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_READ_LATENCY_B": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_INJECTERR": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_SIM_COLLISION_CHECK": [ { "value": "ALL", "resolve_type": "generated", "usage": "all" } ], + "C_COMMON_CLK": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_DISABLE_WARN_BHV_COLL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_SLEEP_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USE_URAM": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_RDADDRA_CHG": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_RDADDRB_CHG": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_DEEPSLEEP_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_SHUTDOWN_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_SAFETY_CKT": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_DISABLE_WARN_BHV_RANGE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_COUNT_36K_BRAM": [ { "value": "1", "resolve_type": "generated", "usage": "all" } ], + "C_COUNT_18K_BRAM": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], + "C_EST_POWER_SUMMARY": [ { "value": "Estimated Power for IP : 5.153512 mW", "resolve_type": "generated", "usage": "all" } ] + }, + "project_parameters": { + "ARCHITECTURE": [ { "value": "kintexu" } ], + "BASE_BOARD_PART": [ { "value": "" } ], + "BOARD_CONNECTIONS": [ { "value": "" } ], + "DEVICE": [ { "value": "xcku040" } ], + "PACKAGE": [ { "value": "ffva1156" } ], + "PREFHDL": [ { "value": "VERILOG" } ], + "SILICON_REVISION": [ { "value": "" } ], + "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], + "SPEEDGRADE": [ { "value": "-2" } ], + "STATIC_POWER": [ { "value": "" } ], + "TEMPERATURE_GRADE": [ { "value": "I" } ], + "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], + "USE_RDI_GENERATION": [ { "value": "TRUE" } ] + }, + "runtime_parameters": { + "IPCONTEXT": [ { "value": "IP_Flow" } ], + "IPREVISION": [ { "value": "5" } ], + "MANAGED": [ { "value": "TRUE" } ], + "OUTPUTDIR": [ { "value": "../../../../radar_alinx_kintex.gen/sources_1/ip/hdr_mem" } ], + "SELECTEDSIMMODEL": [ { "value": "" } ], + "SHAREDDIR": [ { "value": "." } ], + "SWVERSION": [ { "value": "2022.2" } ], + "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] + } + }, + "boundary": { + "ports": { + "clka": [ { "direction": "in", "driver_value": "0" } ], + "ena": [ { "direction": "in", "driver_value": "0" } ], + "wea": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], + "addra": [ { "direction": "in", "size_left": "7", "size_right": "0", "driver_value": "0" } ], + "dina": [ { "direction": "in", "size_left": "31", "size_right": "0", "driver_value": "0" } ], + "clkb": [ { "direction": "in", "driver_value": "0" } ], + "enb": [ { "direction": "in", "driver_value": "0" } ], + "addrb": [ { "direction": "in", "size_left": "6", "size_right": "0", "driver_value": "0" } ], + "doutb": [ { "direction": "out", "size_left": "63", "size_right": "0" } ] + }, + "interfaces": { + "CLK.ACLK": { + "vlnv": "xilinx.com:signal:clock:1.0", + "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", + "mode": "slave", + "parameters": { + "ASSOCIATED_BUSIF": [ { "value": "AXI_SLAVE_S_AXI:AXILite_SLAVE_S_AXI", "value_src": "constant", "usage": "all" } ], + "ASSOCIATED_RESET": [ { "value": "s_aresetn", "value_src": "constant", "usage": "all" } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + } + }, + "RST.ARESETN": { + "vlnv": "xilinx.com:signal:reset:1.0", + "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", + "mode": "slave", + "parameters": { + "POLARITY": [ { "value": "ACTIVE_LOW", "value_src": "constant", "usage": "all" } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + } + }, + "BRAM_PORTA": { + "vlnv": "xilinx.com:interface:bram:1.0", + "abstraction_type": "xilinx.com:interface:bram_rtl:1.0", + "mode": "slave", + "parameters": { + "MEM_SIZE": [ { "value": "8192", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "MEM_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "MEM_ECC": [ { "value": "NONE", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "MASTER_TYPE": [ { "value": "OTHER", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "READ_WRITE_MODE": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "READ_LATENCY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "ADDR": [ { "physical_name": "addra" } ], + "CLK": [ { "physical_name": "clka" } ], + "DIN": [ { "physical_name": "dina" } ], + "EN": [ { "physical_name": "ena" } ], + "WE": [ { "physical_name": "wea" } ] + } + }, + "BRAM_PORTB": { + "vlnv": "xilinx.com:interface:bram:1.0", + "abstraction_type": "xilinx.com:interface:bram_rtl:1.0", + "mode": "slave", + "parameters": { + "MEM_SIZE": [ { "value": "8192", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "MEM_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "MEM_ECC": [ { "value": "NONE", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "MASTER_TYPE": [ { "value": "OTHER", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "READ_WRITE_MODE": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "READ_LATENCY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "ADDR": [ { "physical_name": "addrb" } ], + "CLK": [ { "physical_name": "clkb" } ], + "DOUT": [ { "physical_name": "doutb" } ], + "EN": [ { "physical_name": "enb" } ] + } + } + }, + "memory_maps": { + "S_1": { + "address_blocks": { + "Mem0": { + "base_address": "0", + "range": "4096", + "usage": "memory", + "access": "read-write", + "parameters": { + "OFFSET_BASE_PARAM": [ { "value": "C_BASEADDR" } ], + "OFFSET_HIGH_PARAM": [ { "value": "C_HIGHADDR" } ] + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/ip/pulse_buffer_fifo/pulse_buffer_fifo.xci b/radar_alinx_kintex.srcs/sources_1/ip/pulse_buffer_fifo/pulse_buffer_fifo.xci new file mode 100755 index 0000000..41ddf56 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/ip/pulse_buffer_fifo/pulse_buffer_fifo.xci @@ -0,0 +1,183 @@ +{ + "schema": "xilinx.com:schema:json_instance:1.0", + "ip_inst": { + "xci_name": "pulse_buffer_fifo", + "component_reference": "xilinx.com:ip:axis_data_fifo:2.0", + "ip_revision": "9", + "gen_directory": "../../../../radar_alinx_kintex.gen/sources_1/ip/pulse_buffer_fifo", + "parameters": { + "component_parameters": { + "TDATA_NUM_BYTES": [ { "value": "16", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TUSER_WIDTH": [ { "value": "1", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FIFO_DEPTH": [ { "value": "8192", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FIFO_MODE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "IS_ACLK_ASYNC": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "ACLKEN_CONV_MODE": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TLAST": [ { "value": "1", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "SYNCHRONIZATION_STAGES": [ { "value": "3", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "HAS_WR_DATA_COUNT": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_RD_DATA_COUNT": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_AEMPTY": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_PROG_EMPTY": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "PROG_EMPTY_THRESH": [ { "value": "5", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "HAS_AFULL": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_PROG_FULL": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "PROG_FULL_THRESH": [ { "value": "11", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "ENABLE_ECC": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "HAS_ECC_ERR_INJECT": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "FIFO_MEMORY_TYPE": [ { "value": "auto", "resolve_type": "user", "usage": "all" } ], + "Component_Name": [ { "value": "pulse_buffer_fifo", "resolve_type": "user", "usage": "all" } ] + }, + "model_parameters": { + "C_FAMILY": [ { "value": "kintexu", "resolve_type": "generated", "usage": "all" } ], + "C_AXIS_TDATA_WIDTH": [ { "value": "128", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TID_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TDEST_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TUSER_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_SIGNAL_SET": [ { "value": "0b00000000000000000000000010010011", "resolve_type": "generated", "format": "bitString", "usage": "all" } ], + "C_FIFO_DEPTH": [ { "value": "8192", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_FIFO_MODE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_IS_ACLK_ASYNC": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_SYNCHRONIZER_STAGE": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ACLKEN_CONV_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ECC_MODE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_FIFO_MEMORY_TYPE": [ { "value": "auto", "resolve_type": "generated", "usage": "all" } ], + "C_USE_ADV_FEATURES": [ { "value": "825241648", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_PROG_EMPTY_THRESH": [ { "value": "5", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_PROG_FULL_THRESH": [ { "value": "11", "resolve_type": "generated", "format": "long", "usage": "all" } ] + }, + "project_parameters": { + "ARCHITECTURE": [ { "value": "kintexu" } ], + "BASE_BOARD_PART": [ { "value": "" } ], + "BOARD_CONNECTIONS": [ { "value": "" } ], + "DEVICE": [ { "value": "xcku040" } ], + "PACKAGE": [ { "value": "ffva1156" } ], + "PREFHDL": [ { "value": "VERILOG" } ], + "SILICON_REVISION": [ { "value": "" } ], + "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], + "SPEEDGRADE": [ { "value": "-2" } ], + "STATIC_POWER": [ { "value": "" } ], + "TEMPERATURE_GRADE": [ { "value": "I" } ], + "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], + "USE_RDI_GENERATION": [ { "value": "TRUE" } ] + }, + "runtime_parameters": { + "IPCONTEXT": [ { "value": "IP_Flow" } ], + "IPREVISION": [ { "value": "9" } ], + "MANAGED": [ { "value": "TRUE" } ], + "OUTPUTDIR": [ { "value": "../../../../radar_alinx_kintex.gen/sources_1/ip/pulse_buffer_fifo" } ], + "SELECTEDSIMMODEL": [ { "value": "" } ], + "SHAREDDIR": [ { "value": "." } ], + "SWVERSION": [ { "value": "2022.2" } ], + "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] + } + }, + "boundary": { + "ports": { + "s_axis_aresetn": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_aclk": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_tvalid": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_tready": [ { "direction": "out" } ], + "s_axis_tdata": [ { "direction": "in", "size_left": "127", "size_right": "0", "driver_value": "0x00000000000000000000000000000000" } ], + "s_axis_tlast": [ { "direction": "in", "driver_value": "0x1" } ], + "s_axis_tuser": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0x0" } ], + "m_axis_tvalid": [ { "direction": "out" } ], + "m_axis_tready": [ { "direction": "in", "driver_value": "0x1" } ], + "m_axis_tdata": [ { "direction": "out", "size_left": "127", "size_right": "0" } ], + "m_axis_tlast": [ { "direction": "out" } ], + "m_axis_tuser": [ { "direction": "out", "size_left": "0", "size_right": "0" } ] + }, + "interfaces": { + "S_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "slave", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "16", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TDATA": [ { "physical_name": "s_axis_tdata" } ], + "TLAST": [ { "physical_name": "s_axis_tlast" } ], + "TREADY": [ { "physical_name": "s_axis_tready" } ], + "TUSER": [ { "physical_name": "s_axis_tuser" } ], + "TVALID": [ { "physical_name": "s_axis_tvalid" } ] + } + }, + "M_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "master", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "16", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "1", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TDATA": [ { "physical_name": "m_axis_tdata" } ], + "TLAST": [ { "physical_name": "m_axis_tlast" } ], + "TREADY": [ { "physical_name": "m_axis_tready" } ], + "TUSER": [ { "physical_name": "m_axis_tuser" } ], + "TVALID": [ { "physical_name": "m_axis_tvalid" } ] + } + }, + "S_RSTIF": { + "vlnv": "xilinx.com:signal:reset:1.0", + "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", + "mode": "slave", + "parameters": { + "POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "RST": [ { "physical_name": "s_axis_aresetn" } ] + } + }, + "S_CLKIF": { + "vlnv": "xilinx.com:signal:clock:1.0", + "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", + "mode": "slave", + "parameters": { + "ASSOCIATED_BUSIF": [ { "value": "S_AXIS", "value_src": "constant", "usage": "all" } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "CLK": [ { "physical_name": "s_axis_aclk" } ] + } + } + } + } + } +} \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/ip/wf_memory/wf_memory.xci b/radar_alinx_kintex.srcs/sources_1/ip/wf_memory/wf_memory.xci new file mode 100755 index 0000000..2367e7a --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/ip/wf_memory/wf_memory.xci @@ -0,0 +1,287 @@ +{ + "schema": "xilinx.com:schema:json_instance:1.0", + "ip_inst": { + "xci_name": "wf_memory", + "component_reference": "xilinx.com:ip:blk_mem_gen:8.4", + "ip_revision": "5", + "gen_directory": "../../../../radar_alinx_kintex.gen/sources_1/ip/wf_memory", + "parameters": { + "component_parameters": { + "Component_Name": [ { "value": "wf_memory", "resolve_type": "user", "usage": "all" } ], + "Interface_Type": [ { "value": "Native", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "AXI_Type": [ { "value": "AXI4_Full", "resolve_type": "user", "usage": "all" } ], + "AXI_Slave_Type": [ { "value": "Memory_Slave", "resolve_type": "user", "usage": "all" } ], + "Use_AXI_ID": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "AXI_ID_Width": [ { "value": "4", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "Memory_Type": [ { "value": "True_Dual_Port_RAM", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "PRIM_type_to_Implement": [ { "value": "BRAM", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Enable_32bit_Address": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "ecctype": [ { "value": "No_ECC", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "ECC": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "EN_SLEEP_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "EN_DEEPSLEEP_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "EN_SHUTDOWN_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "EN_ECC_PIPE": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RD_ADDR_CHNG_A": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "RD_ADDR_CHNG_B": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Use_Error_Injection_Pins": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Error_Injection_Type": [ { "value": "Single_Bit_Error_Injection", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Use_Byte_Write_Enable": [ { "value": "true", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Byte_Size": [ { "value": "8", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "Algorithm": [ { "value": "Minimum_Area", "resolve_type": "user", "usage": "all" } ], + "Primitive": [ { "value": "8kx2", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Assume_Synchronous_Clk": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Write_Width_A": [ { "value": "32", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Write_Depth_A": [ { "value": "8192", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Read_Width_A": [ { "value": "32", "resolve_type": "user", "usage": "all" } ], + "Operating_Mode_A": [ { "value": "WRITE_FIRST", "resolve_type": "user", "usage": "all" } ], + "Enable_A": [ { "value": "Use_ENA_Pin", "resolve_type": "user", "usage": "all" } ], + "Write_Width_B": [ { "value": "128", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "Read_Width_B": [ { "value": "128", "value_src": "user", "resolve_type": "user", "usage": "all" } ], + "Operating_Mode_B": [ { "value": "WRITE_FIRST", "resolve_type": "user", "usage": "all" } ], + "Enable_B": [ { "value": "Use_ENB_Pin", "resolve_type": "user", "usage": "all" } ], + "Register_PortA_Output_of_Memory_Primitives": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Register_PortA_Output_of_Memory_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Use_REGCEA_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Register_PortB_Output_of_Memory_Primitives": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Register_PortB_Output_of_Memory_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Use_REGCEB_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "register_porta_input_of_softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "register_portb_output_of_softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Pipeline_Stages": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Load_Init_File": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Coe_File": [ { "value": "no_coe_file_loaded", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Fill_Remaining_Memory_Locations": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Remaining_Memory_Locations": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Use_RSTA_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Reset_Memory_Latch_A": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Reset_Priority_A": [ { "value": "CE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Output_Reset_Value_A": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Use_RSTB_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Reset_Memory_Latch_B": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Reset_Priority_B": [ { "value": "CE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Output_Reset_Value_B": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Reset_Type": [ { "value": "SYNC", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Additional_Inputs_for_Power_Estimation": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Port_A_Clock": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Port_A_Write_Rate": [ { "value": "50", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Port_B_Clock": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Port_B_Write_Rate": [ { "value": "50", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Port_A_Enable_Rate": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Port_B_Enable_Rate": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Collision_Warnings": [ { "value": "ALL", "resolve_type": "user", "usage": "all" } ], + "Disable_Collision_Warnings": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Disable_Out_of_Range_Warnings": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "use_bram_block": [ { "value": "Stand_Alone", "resolve_type": "user", "usage": "all" } ], + "MEM_FILE": [ { "value": "no_mem_loaded", "resolve_type": "user", "usage": "all" } ], + "CTRL_ECC_ALGO": [ { "value": "NONE", "resolve_type": "user", "usage": "all" } ], + "EN_SAFETY_CKT": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "READ_LATENCY_A": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], + "READ_LATENCY_B": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ] + }, + "model_parameters": { + "C_FAMILY": [ { "value": "kintexu", "resolve_type": "generated", "usage": "all" } ], + "C_XDEVICEFAMILY": [ { "value": "kintexu", "resolve_type": "generated", "usage": "all" } ], + "C_ELABORATION_DIR": [ { "value": "./", "resolve_type": "generated", "usage": "all" } ], + "C_INTERFACE_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXI_TYPE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXI_SLAVE_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USE_BRAM_BLOCK": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ENABLE_32BIT_ADDRESS": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_CTRL_ECC_ALGO": [ { "value": "NONE", "resolve_type": "generated", "usage": "all" } ], + "C_HAS_AXI_ID": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_MEM_TYPE": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_BYTE_SIZE": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ALGORITHM": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_PRIM_TYPE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_LOAD_INIT_FILE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_INIT_FILE_NAME": [ { "value": "no_coe_file_loaded", "resolve_type": "generated", "usage": "all" } ], + "C_INIT_FILE": [ { "value": "wf_memory.mem", "resolve_type": "generated", "usage": "all" } ], + "C_USE_DEFAULT_DATA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_DEFAULT_DATA": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], + "C_HAS_RSTA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RST_PRIORITY_A": [ { "value": "CE", "resolve_type": "generated", "usage": "all" } ], + "C_RSTRAM_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_INITA_VAL": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], + "C_HAS_ENA": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_REGCEA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USE_BYTE_WEA": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_WEA_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_WRITE_MODE_A": [ { "value": "WRITE_FIRST", "resolve_type": "generated", "usage": "all" } ], + "C_WRITE_WIDTH_A": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_READ_WIDTH_A": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_WRITE_DEPTH_A": [ { "value": "8192", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_READ_DEPTH_A": [ { "value": "8192", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ADDRA_WIDTH": [ { "value": "13", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_RSTB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_RST_PRIORITY_B": [ { "value": "CE", "resolve_type": "generated", "usage": "all" } ], + "C_RSTRAM_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_INITB_VAL": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], + "C_HAS_ENB": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_REGCEB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USE_BYTE_WEB": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_WEB_WIDTH": [ { "value": "16", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_WRITE_MODE_B": [ { "value": "WRITE_FIRST", "resolve_type": "generated", "usage": "all" } ], + "C_WRITE_WIDTH_B": [ { "value": "128", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_READ_WIDTH_B": [ { "value": "128", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_WRITE_DEPTH_B": [ { "value": "2048", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_READ_DEPTH_B": [ { "value": "2048", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_ADDRB_WIDTH": [ { "value": "11", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_MEM_OUTPUT_REGS_A": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_MEM_OUTPUT_REGS_B": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_MUX_OUTPUT_REGS_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_MUX_OUTPUT_REGS_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_MUX_PIPELINE_STAGES": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_SOFTECC_INPUT_REGS_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_SOFTECC_OUTPUT_REGS_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USE_SOFTECC": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USE_ECC": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_ECC_PIPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_READ_LATENCY_A": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_READ_LATENCY_B": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_INJECTERR": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_SIM_COLLISION_CHECK": [ { "value": "ALL", "resolve_type": "generated", "usage": "all" } ], + "C_COMMON_CLK": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_DISABLE_WARN_BHV_COLL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_SLEEP_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USE_URAM": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_RDADDRA_CHG": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_RDADDRB_CHG": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_DEEPSLEEP_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_SHUTDOWN_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_SAFETY_CKT": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_DISABLE_WARN_BHV_RANGE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_COUNT_36K_BRAM": [ { "value": "8", "resolve_type": "generated", "usage": "all" } ], + "C_COUNT_18K_BRAM": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], + "C_EST_POWER_SUMMARY": [ { "value": "Estimated Power for IP : 4.152427 mW", "resolve_type": "generated", "usage": "all" } ] + }, + "project_parameters": { + "ARCHITECTURE": [ { "value": "kintexu" } ], + "BASE_BOARD_PART": [ { "value": "" } ], + "BOARD_CONNECTIONS": [ { "value": "" } ], + "DEVICE": [ { "value": "xcku040" } ], + "PACKAGE": [ { "value": "ffva1156" } ], + "PREFHDL": [ { "value": "VERILOG" } ], + "SILICON_REVISION": [ { "value": "" } ], + "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], + "SPEEDGRADE": [ { "value": "-2" } ], + "STATIC_POWER": [ { "value": "" } ], + "TEMPERATURE_GRADE": [ { "value": "I" } ], + "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], + "USE_RDI_GENERATION": [ { "value": "TRUE" } ] + }, + "runtime_parameters": { + "IPCONTEXT": [ { "value": "IP_Flow" } ], + "IPREVISION": [ { "value": "5" } ], + "MANAGED": [ { "value": "TRUE" } ], + "OUTPUTDIR": [ { "value": "../../../../radar_alinx_kintex.gen/sources_1/ip/wf_memory" } ], + "SELECTEDSIMMODEL": [ { "value": "" } ], + "SHAREDDIR": [ { "value": "." } ], + "SWVERSION": [ { "value": "2022.2" } ], + "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] + } + }, + "boundary": { + "ports": { + "clka": [ { "direction": "in", "driver_value": "0" } ], + "ena": [ { "direction": "in", "driver_value": "0" } ], + "wea": [ { "direction": "in", "size_left": "3", "size_right": "0", "driver_value": "0" } ], + "addra": [ { "direction": "in", "size_left": "12", "size_right": "0", "driver_value": "0" } ], + "dina": [ { "direction": "in", "size_left": "31", "size_right": "0", "driver_value": "0" } ], + "douta": [ { "direction": "out", "size_left": "31", "size_right": "0" } ], + "clkb": [ { "direction": "in", "driver_value": "0" } ], + "enb": [ { "direction": "in", "driver_value": "0" } ], + "web": [ { "direction": "in", "size_left": "15", "size_right": "0", "driver_value": "0" } ], + "addrb": [ { "direction": "in", "size_left": "10", "size_right": "0", "driver_value": "0" } ], + "dinb": [ { "direction": "in", "size_left": "127", "size_right": "0", "driver_value": "0" } ], + "doutb": [ { "direction": "out", "size_left": "127", "size_right": "0" } ] + }, + "interfaces": { + "CLK.ACLK": { + "vlnv": "xilinx.com:signal:clock:1.0", + "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", + "mode": "slave", + "parameters": { + "ASSOCIATED_BUSIF": [ { "value": "AXI_SLAVE_S_AXI:AXILite_SLAVE_S_AXI", "value_src": "constant", "usage": "all" } ], + "ASSOCIATED_RESET": [ { "value": "s_aresetn", "value_src": "constant", "usage": "all" } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + } + }, + "RST.ARESETN": { + "vlnv": "xilinx.com:signal:reset:1.0", + "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", + "mode": "slave", + "parameters": { + "POLARITY": [ { "value": "ACTIVE_LOW", "value_src": "constant", "usage": "all" } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + } + }, + "BRAM_PORTA": { + "vlnv": "xilinx.com:interface:bram:1.0", + "abstraction_type": "xilinx.com:interface:bram_rtl:1.0", + "mode": "slave", + "parameters": { + "MEM_SIZE": [ { "value": "8192", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "MEM_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "MEM_ECC": [ { "value": "NONE", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "MASTER_TYPE": [ { "value": "OTHER", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "READ_WRITE_MODE": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "READ_LATENCY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "ADDR": [ { "physical_name": "addra" } ], + "CLK": [ { "physical_name": "clka" } ], + "DIN": [ { "physical_name": "dina" } ], + "DOUT": [ { "physical_name": "douta" } ], + "EN": [ { "physical_name": "ena" } ], + "WE": [ { "physical_name": "wea" } ] + } + }, + "BRAM_PORTB": { + "vlnv": "xilinx.com:interface:bram:1.0", + "abstraction_type": "xilinx.com:interface:bram_rtl:1.0", + "mode": "slave", + "parameters": { + "MEM_SIZE": [ { "value": "8192", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "MEM_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "MEM_ECC": [ { "value": "NONE", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "MASTER_TYPE": [ { "value": "OTHER", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "READ_WRITE_MODE": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "READ_LATENCY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "ADDR": [ { "physical_name": "addrb" } ], + "CLK": [ { "physical_name": "clkb" } ], + "DIN": [ { "physical_name": "dinb" } ], + "DOUT": [ { "physical_name": "doutb" } ], + "EN": [ { "physical_name": "enb" } ], + "WE": [ { "physical_name": "web" } ] + } + } + }, + "memory_maps": { + "S_1": { + "address_blocks": { + "Mem0": { + "base_address": "0", + "range": "4096", + "usage": "memory", + "access": "read-write", + "parameters": { + "OFFSET_BASE_PARAM": [ { "value": "C_BASEADDR" } ], + "OFFSET_HIGH_PARAM": [ { "value": "C_HIGHADDR" } ] + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/sources_1/ip/width_converter/width_converter.xci b/radar_alinx_kintex.srcs/sources_1/ip/width_converter/width_converter.xci new file mode 100755 index 0000000..d223237 --- /dev/null +++ b/radar_alinx_kintex.srcs/sources_1/ip/width_converter/width_converter.xci @@ -0,0 +1,154 @@ +{ + "schema": "xilinx.com:schema:json_instance:1.0", + "ip_inst": { + "xci_name": "width_converter", + "component_reference": "xilinx.com:ip:axis_dwidth_converter:1.1", + "ip_revision": "26", + "gen_directory": "../../../../radar_alinx_kintex.gen/sources_1/ip/width_converter", + "parameters": { + "component_parameters": { + "S_TDATA_NUM_BYTES": [ { "value": "64", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "M_TDATA_NUM_BYTES": [ { "value": "4", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "TUSER_BITS_PER_BYTE": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TLAST": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_ACLKEN": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "HAS_MI_TKEEP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], + "Component_Name": [ { "value": "width_converter", "resolve_type": "user", "usage": "all" } ] + }, + "model_parameters": { + "C_FAMILY": [ { "value": "kintexu", "resolve_type": "generated", "usage": "all" } ], + "C_S_AXIS_TDATA_WIDTH": [ { "value": "512", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_M_AXIS_TDATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TID_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_TDEST_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_S_AXIS_TUSER_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_M_AXIS_TUSER_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_AXIS_SIGNAL_SET": [ { "value": "0b00000000000000000000000000000011", "resolve_type": "generated", "format": "bitString", "usage": "all" } ] + }, + "project_parameters": { + "ARCHITECTURE": [ { "value": "kintexu" } ], + "BASE_BOARD_PART": [ { "value": "" } ], + "BOARD_CONNECTIONS": [ { "value": "" } ], + "DEVICE": [ { "value": "xcku040" } ], + "PACKAGE": [ { "value": "ffva1156" } ], + "PREFHDL": [ { "value": "VERILOG" } ], + "SILICON_REVISION": [ { "value": "" } ], + "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], + "SPEEDGRADE": [ { "value": "-2" } ], + "STATIC_POWER": [ { "value": "" } ], + "TEMPERATURE_GRADE": [ { "value": "I" } ], + "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], + "USE_RDI_GENERATION": [ { "value": "TRUE" } ] + }, + "runtime_parameters": { + "IPCONTEXT": [ { "value": "IP_Flow" } ], + "IPREVISION": [ { "value": "26" } ], + "MANAGED": [ { "value": "TRUE" } ], + "OUTPUTDIR": [ { "value": "../../../../radar_alinx_kintex.gen/sources_1/ip/width_converter" } ], + "SELECTEDSIMMODEL": [ { "value": "" } ], + "SHAREDDIR": [ { "value": "." } ], + "SWVERSION": [ { "value": "2022.2" } ], + "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] + } + }, + "boundary": { + "ports": { + "aclk": [ { "direction": "in" } ], + "aresetn": [ { "direction": "in" } ], + "s_axis_tvalid": [ { "direction": "in", "driver_value": "0x0" } ], + "s_axis_tready": [ { "direction": "out" } ], + "s_axis_tdata": [ { "direction": "in", "size_left": "511", "size_right": "0", "driver_value": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" } ], + "m_axis_tvalid": [ { "direction": "out" } ], + "m_axis_tready": [ { "direction": "in", "driver_value": "0x1" } ], + "m_axis_tdata": [ { "direction": "out", "size_left": "31", "size_right": "0" } ] + }, + "interfaces": { + "S_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "slave", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "64", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TVALID": [ { "physical_name": "s_axis_tvalid" } ], + "TREADY": [ { "physical_name": "s_axis_tready" } ], + "TDATA": [ { "physical_name": "s_axis_tdata" } ] + } + }, + "M_AXIS": { + "vlnv": "xilinx.com:interface:axis:1.0", + "abstraction_type": "xilinx.com:interface:axis_rtl:1.0", + "mode": "master", + "parameters": { + "TDATA_NUM_BYTES": [ { "value": "4", "value_src": "auto", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TDEST_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TID_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "TUSER_WIDTH": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TREADY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TSTRB": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TKEEP": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "HAS_TLAST": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "LAYERED_METADATA": [ { "value": "undef", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "TVALID": [ { "physical_name": "m_axis_tvalid" } ], + "TREADY": [ { "physical_name": "m_axis_tready" } ], + "TDATA": [ { "physical_name": "m_axis_tdata" } ] + } + }, + "RSTIF": { + "vlnv": "xilinx.com:signal:reset:1.0", + "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", + "mode": "slave", + "parameters": { + "POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "RST": [ { "physical_name": "aresetn" } ] + } + }, + "CLKIF": { + "vlnv": "xilinx.com:signal:clock:1.0", + "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", + "mode": "slave", + "parameters": { + "FREQ_HZ": [ { "value": "10000000", "resolve_type": "user", "format": "long", "usage": "all" } ], + "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], + "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], + "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], + "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] + }, + "port_maps": { + "CLK": [ { "physical_name": "aclk" } ] + } + } + } + } + } +} \ No newline at end of file diff --git a/radar_alinx_kintex.srcs/utils_1/imports/synth_1/top.dcp b/radar_alinx_kintex.srcs/utils_1/imports/synth_1/top.dcp new file mode 100755 index 0000000000000000000000000000000000000000..62b90e7810e4fcc528c8b0b77825a4f9791c6008 GIT binary patch literal 4086257 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

op_AIxRuEFtlR>M2v+%AWyS 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