diff --git a/src/eth/example/HTG_ZRF8/fpga/README.md b/src/eth/example/HTG_ZRF8/fpga/README.md new file mode 100644 index 0000000..0389c92 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/README.md @@ -0,0 +1,101 @@ +# Taxi Example Design for HTG-ZRF8 + +## Introduction + +This example design targets the HiTech Global HTG-ZRF8-R2 and HTG-ZRF8-EM FPGA boards. + +The design places looped-back MACs on the FMC+ for use with SFP and QSFP FMC adapters, as well as XFCP on the USB UART for monitoring and control. The RF data converters are also enabled at 1 Gsps per channel. + +* USB UART + * XFCP (921600 baud) +* QSFP28 + * Looped-back 10GBASE-R or 25GBASE-R MACs via GTY transceivers + +## Board details + +* FPGA: xczu48dr-ffvg1517-2-e +* USB UART: Silicon Labs CP2103 + +## Licensing + +* Toolchain + * Vivado Enterprise (requires license) +* IP + * No licensed vendor IP or 3rd party IP + +## How to build + +Run `make` in the appropriate `fpga*` subdirectory to build the bitstream. Ensure that the Xilinx Vivado toolchain components are in PATH. + +## FMC + +All variants of the HTG-ZRF8 only connect 8 MGT lanes to the FMC+, DP0-7, so on some FMC/FMC+ boards, not all of the connectors will be usable. + +Another complicating factor is that the FMC+ connector has GA0/GA1 wired to ground, which causes an address conflict between the FMC EEPROM and any SFP/QSFP modules that can be connected to the FMC I2C pins. Fixing the address conflict necessitates modification of either the FPGA board or the FMC board. + +Additionally, the HTG-ZRF8-EM only connects LA0-LA9, which can cause some problems with driving module control lines on FMC/FMC+. In some cases, alternative approaches might be required to use a given FMC/FMC+, including module configuration via I2C as well as modifications to the FMC/FMC+ board. + +This design has been tested with: + +* HTG-FMC-QSFP28-DEG90 + * QSFP on DP0-3, DP4-7 not connected + * resetl: on disconnected pin LA31_P, pulled high via R10 (OK) + * lpmode: on disconnected pin LA32_N, pulled high via R3 (no good on -EM) + * modsell: on disconnected pin LA31_N, pulled low via R8 (OK) + +Since the Si5341 PLL is directly connected to the MGTREFCLK pins for the sites connected to the FMC+, no reference clocks are required from the FMC+ and as such any reference PLL on the FMC does not need to be configured and any oscillators can be disabled. + +## Board configuration (HTG-ZRF8-R2) + +For correct operation, several DIP switches need to be set correctly. Additionally, some other component-level modifications may be required. + +DIP switch settings: + +* S2.1-4: all ON for JTAG boot +* S3.1: OFF (enable U19 outputs) +* S3.2: don't care (U19 IN_SEL1) +* S3.4: don't care (ON to disable PS ref clock) + +The PLL configuration in this design ignores the IN_SEL pins, so S3.2 has no effect. The other DIP switches do not affect the operation of this design. A simple "safe" configuration is S3 all OFF and S2 all ON. + +When using optical modules or active optical cables, it is necessary to pull the lpmode pins low and the resetl pins high to enable the lasers. For I2C communication with the module, modsell must be pulled low. + +Additionally, the standard SFP/QSFP I2C address of 0x50 conflicts with the address 0 FMC EEPROM address. The FMC address pins (GA0 and GA1) are controlled by R430/R411 and R441/R451. See the table below for how to configure these resistors. + +| Address | R430 | R411 | R441 | R451 | +| ------- | ---- | ---- | ---- | ---- | +| 0 | 0 | DNP | 0 | DNP | +| 1 | DNP | 4.7K | 0 | DNP | +| 2 | 0 | DNP | DNP | 4.7K | +| 3 | DNP | 4.7K | DNP | 4.7K | + +## Board configuration (HTG-ZRF8-EM) + +For correct operation, several DIP switches need to be set correctly. Additionally, some other component-level modifications may be required. + +DIP switch settings: + +* S2.1: OFF (enable U48 outputs) +* S2.3: don't care (U48 IN_SEL0) +* S2.2: don't care (U48 IN_SEL1) +* S2.4: don't care (ON to disable PS ref clock) +* S3.1-4: all ON for JTAG boot + +The PLL configuration in this design ignores the IN_SEL pins, so S2.2 and S2.3 have no effect. The other DIP switches do not affect the operation of this design. A simple "safe" configuration is S2 all OFF and S3 all ON. + +When using optical modules or active optical cables, it is necessary to pull the lpmode pins low and the resetl pins high to enable the lasers. For I2C communication with the module, modsell must be pulled low. On the HTG-ZRF8-EM, only the first 20 LA pins (pairs LA0-LA9) are connected on the FMC+, so for some adapters, the lpmode and reset pins may not be connected to the FPGA. + +Additionally, the standard SFP/QSFP I2C address of 0x50 conflicts with the address 0 FMC EEPROM address. The FMC address pins (GA0 and GA1) are controlled by R471/R472 and R478/R479. See the table below for how to configure these resistors. + +| Address | R471 | R472 | R478 | R479 | +| ------- | ---- | ---- | ---- | ---- | +| 0 | 0 | DNP | 0 | DNP | +| 1 | DNP | 4.7K | 0 | DNP | +| 2 | 0 | DNP | DNP | 4.7K | +| 3 | DNP | 4.7K | DNP | 4.7K | + +## How to test + +Run `make program` to program the board with Vivado. + +To test the looped-back MAC, it is recommended to use a network tester like the Viavi T-BERD 5800 that supports basic layer 2 tests with a loopback. Do not connect the looped-back MAC to a network as the reflected packets may cause problems. diff --git a/src/eth/example/HTG_ZRF8/fpga/cfgmclk.xdc b/src/eth/example/HTG_ZRF8/fpga/cfgmclk.xdc new file mode 100644 index 0000000..c40adc6 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/cfgmclk.xdc @@ -0,0 +1,5 @@ +# Timing constraints for cfgmclk + +# Fcfgmclk is 50 MHz +/- 15%, rounding to 15 ns period +create_clock -period 15.000 -name cfgmclk [get_pins startupe3_inst/CFGMCLK] + diff --git a/src/eth/example/HTG_ZRF8/fpga/common/vivado.mk b/src/eth/example/HTG_ZRF8/fpga/common/vivado.mk new file mode 100644 index 0000000..07c56e2 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/common/vivado.mk @@ -0,0 +1,153 @@ +# SPDX-License-Identifier: MIT +################################################################### +# +# Xilinx Vivado FPGA Makefile +# +# Copyright (c) 2016-2025 Alex Forencich +# +################################################################### +# +# Parameters: +# FPGA_TOP - Top module name +# FPGA_FAMILY - FPGA family (e.g. VirtexUltrascale) +# FPGA_DEVICE - FPGA device (e.g. xcvu095-ffva2104-2-e) +# SYN_FILES - list of source files +# INC_FILES - list of include files +# XDC_FILES - list of timing constraint files +# XCI_FILES - list of IP XCI files +# IP_TCL_FILES - list of IP TCL files (sourced during project creation) +# CONFIG_TCL_FILES - list of config TCL files (sourced before each build) +# +# Note: both SYN_FILES and INC_FILES support file list files. File list +# files are files with a .f extension that contain a list of additional +# files to include, one path relative to the .f file location per line. +# The .f files are processed recursively, and then the complete file list +# is de-duplicated, with later files in the list taking precedence. +# +# Example: +# +# FPGA_TOP = fpga +# FPGA_FAMILY = VirtexUltrascale +# FPGA_DEVICE = xcvu095-ffva2104-2-e +# SYN_FILES = rtl/fpga.v +# XDC_FILES = fpga.xdc +# XCI_FILES = ip/pcspma.xci +# include ../common/vivado.mk +# +################################################################### + +# phony targets +.PHONY: fpga vivado tmpclean clean distclean + +# prevent make from deleting intermediate files and reports +.PRECIOUS: %.xpr %.bit %.bin %.ltx %.xsa %.mcs %.prm +.SECONDARY: + +CONFIG ?= config.mk +-include $(CONFIG) + +FPGA_TOP ?= fpga +PROJECT ?= $(FPGA_TOP) +XDC_FILES ?= $(PROJECT).xdc + +# handle file list files +process_f_file = $(call process_f_files,$(addprefix $(dir $1),$(shell cat $1))) +process_f_files = $(foreach f,$1,$(if $(filter %.f,$f),$(call process_f_file,$f),$f)) +uniq_base = $(if $1,$(call uniq_base,$(foreach f,$1,$(if $(filter-out $(notdir $(lastword $1)),$(notdir $f)),$f,))) $(lastword $1)) +SYN_FILES := $(call uniq_base,$(call process_f_files,$(SYN_FILES))) +INC_FILES := $(call uniq_base,$(call process_f_files,$(INC_FILES))) + +################################################################### +# Main Targets +# +# all: build everything (fpga) +# fpga: build FPGA config +# vivado: open project in Vivado +# tmpclean: remove intermediate files +# clean: remove output files and project files +# distclean: remove archived output files +################################################################### + +all: fpga + +fpga: $(PROJECT).bit + +vivado: $(PROJECT).xpr + vivado $(PROJECT).xpr + +tmpclean:: + -rm -rf *.log *.jou *.cache *.gen *.hbs *.hw *.ip_user_files *.runs *.xpr *.html *.xml *.sim *.srcs *.str .Xil defines.v + -rm -rf create_project.tcl update_config.tcl run_synth.tcl run_impl.tcl generate_bit.tcl + +clean:: tmpclean + -rm -rf *.bit *.bin *.ltx *.xsa program.tcl generate_mcs.tcl *.mcs *.prm flash.tcl + -rm -rf *_utilization.rpt *_utilization_hierarchical.rpt + +distclean:: clean + -rm -rf rev + +################################################################### +# Target implementations +################################################################### + +# Vivado project file + +# create fresh project if Makefile or IP files have changed +create_project.tcl: Makefile $(XCI_FILES) $(IP_TCL_FILES) + rm -rf defines.v + touch defines.v + for x in $(DEFS); do echo '`define' $$x >> defines.v; done + echo "create_project -force -part $(FPGA_PART) $(PROJECT)" > $@ + echo "add_files -fileset sources_1 defines.v $(SYN_FILES)" >> $@ + echo "set_property top $(FPGA_TOP) [current_fileset]" >> $@ + echo "add_files -fileset constrs_1 $(XDC_FILES)" >> $@ + for x in $(XCI_FILES); do echo "import_ip $$x" >> $@; done + for x in $(IP_TCL_FILES); do echo "source $$x" >> $@; done + for x in $(CONFIG_TCL_FILES); do echo "source $$x" >> $@; done + +# source config TCL scripts if any source file has changed +update_config.tcl: $(CONFIG_TCL_FILES) $(SYN_FILES) $(INC_FILES) $(XDC_FILES) + echo "open_project -quiet $(PROJECT).xpr" > $@ + for x in $(CONFIG_TCL_FILES); do echo "source $$x" >> $@; done + +$(PROJECT).xpr: create_project.tcl update_config.tcl + vivado -nojournal -nolog -mode batch $(foreach x,$?,-source $x) + +# synthesis run +$(PROJECT).runs/synth_1/$(PROJECT).dcp: create_project.tcl update_config.tcl $(SYN_FILES) $(INC_FILES) $(XDC_FILES) | $(PROJECT).xpr + echo "open_project $(PROJECT).xpr" > run_synth.tcl + echo "reset_run synth_1" >> run_synth.tcl + echo "launch_runs -jobs 4 synth_1" >> run_synth.tcl + echo "wait_on_run synth_1" >> run_synth.tcl + vivado -nojournal -nolog -mode batch -source run_synth.tcl + +# implementation run +$(PROJECT).runs/impl_1/$(PROJECT)_routed.dcp: $(PROJECT).runs/synth_1/$(PROJECT).dcp + echo "open_project $(PROJECT).xpr" > run_impl.tcl + echo "reset_run impl_1" >> run_impl.tcl + echo "launch_runs -jobs 4 impl_1" >> run_impl.tcl + echo "wait_on_run impl_1" >> run_impl.tcl + echo "open_run impl_1" >> run_impl.tcl + echo "report_utilization -file $(PROJECT)_utilization.rpt" >> run_impl.tcl + echo "report_utilization -hierarchical -file $(PROJECT)_utilization_hierarchical.rpt" >> run_impl.tcl + vivado -nojournal -nolog -mode batch -source run_impl.tcl + +# output files (including potentially bit, bin, ltx, and xsa) +$(PROJECT).bit $(PROJECT).bin $(PROJECT).ltx $(PROJECT).xsa: $(PROJECT).runs/impl_1/$(PROJECT)_routed.dcp + echo "open_project $(PROJECT).xpr" > generate_bit.tcl + echo "open_run impl_1" >> generate_bit.tcl + echo "write_bitstream -force -bin_file $(PROJECT).runs/impl_1/$(PROJECT).bit" >> generate_bit.tcl + echo "write_debug_probes -force $(PROJECT).runs/impl_1/$(PROJECT).ltx" >> generate_bit.tcl + echo "write_hw_platform -fixed -force -include_bit $(PROJECT).xsa" >> generate_bit.tcl + vivado -nojournal -nolog -mode batch -source generate_bit.tcl + ln -f -s $(PROJECT).runs/impl_1/$(PROJECT).bit . + ln -f -s $(PROJECT).runs/impl_1/$(PROJECT).bin . + if [ -e $(PROJECT).runs/impl_1/$(PROJECT).ltx ]; then ln -f -s $(PROJECT).runs/impl_1/$(PROJECT).ltx .; fi + mkdir -p rev + COUNT=100; \ + while [ -e rev/$(PROJECT)_rev$$COUNT.bit ]; \ + do COUNT=$$((COUNT+1)); done; \ + cp -pv $(PROJECT).runs/impl_1/$(PROJECT).bit rev/$(PROJECT)_rev$$COUNT.bit; \ + cp -pv $(PROJECT).runs/impl_1/$(PROJECT).bin rev/$(PROJECT)_rev$$COUNT.bin; \ + if [ -e $(PROJECT).runs/impl_1/$(PROJECT).ltx ]; then cp -pv $(PROJECT).runs/impl_1/$(PROJECT).ltx rev/$(PROJECT)_rev$$COUNT.ltx; fi; \ + if [ -e $(PROJECT).xsa ]; then cp -pv $(PROJECT).xsa rev/$(PROJECT)_rev$$COUNT.xsa; fi diff --git a/src/eth/example/HTG_ZRF8/fpga/fpga_10g_EM_ZU48DR/Makefile b/src/eth/example/HTG_ZRF8/fpga/fpga_10g_EM_ZU48DR/Makefile new file mode 100644 index 0000000..53eef70 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/fpga_10g_EM_ZU48DR/Makefile @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: MIT +# +# Copyright (c) 2025 FPGA Ninja, LLC +# +# Authors: +# - Alex Forencich +# + +# FPGA settings +FPGA_PART = xczu48dr-ffvg1517-2-e +FPGA_TOP = fpga +FPGA_ARCH = zynquplusRFSOC + +RTL_DIR = ../rtl +LIB_DIR = ../lib +TAXI_SRC_DIR = $(LIB_DIR)/taxi/src + +# Files for synthesis +SYN_FILES = $(RTL_DIR)/fpga_em.sv +SYN_FILES += $(RTL_DIR)/fpga_core.sv +SYN_FILES += $(RTL_DIR)/../pll/pll_i2c_init_em.sv +SYN_FILES += $(TAXI_SRC_DIR)/eth/rtl/us/taxi_eth_mac_25g_us.f +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_if_uart.f +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_switch.sv +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_mod_stats.f +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_mod_i2c_master.f +SYN_FILES += $(TAXI_SRC_DIR)/axis/rtl/taxi_axis_async_fifo.f +SYN_FILES += $(TAXI_SRC_DIR)/sync/rtl/taxi_sync_reset.sv +SYN_FILES += $(TAXI_SRC_DIR)/sync/rtl/taxi_sync_signal.sv +SYN_FILES += $(TAXI_SRC_DIR)/io/rtl/taxi_debounce_switch.sv + +# XDC files +XDC_FILES = ../fpga_em.xdc +XDC_FILES += ../cfgmclk.xdc +XDC_FILES += $(TAXI_SRC_DIR)/eth/syn/vivado/taxi_eth_mac_fifo.tcl +XDC_FILES += $(TAXI_SRC_DIR)/axis/syn/vivado/taxi_axis_async_fifo.tcl +XDC_FILES += $(TAXI_SRC_DIR)/sync/syn/vivado/taxi_sync_reset.tcl +XDC_FILES += $(TAXI_SRC_DIR)/sync/syn/vivado/taxi_sync_signal.tcl + +# IP +IP_TCL_FILES = $(TAXI_SRC_DIR)/eth/rtl/us/taxi_eth_phy_25g_us_gty_10g_161.tcl +IP_TCL_FILES += ../ip/usp_rfdc_1ghz_1gsps.tcl + +# Configuration +# CONFIG_TCL_FILES = ./config.tcl + +include ../common/vivado.mk + +program: $(FPGA_TOP).bit + echo "open_hw" > program.tcl + echo "connect_hw_server" >> program.tcl + echo "open_hw_target" >> program.tcl + echo "current_hw_device [lindex [get_hw_devices] 0]" >> program.tcl + echo "refresh_hw_device -update_hw_probes false [current_hw_device]" >> program.tcl + echo "set_property PROGRAM.FILE {$(FPGA_TOP).bit} [current_hw_device]" >> program.tcl + echo "program_hw_devices [current_hw_device]" >> program.tcl + echo "exit" >> program.tcl + vivado -nojournal -nolog -mode batch -source program.tcl diff --git a/src/eth/example/HTG_ZRF8/fpga/fpga_10g_R2_ZU48DR/Makefile b/src/eth/example/HTG_ZRF8/fpga/fpga_10g_R2_ZU48DR/Makefile new file mode 100644 index 0000000..55646d7 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/fpga_10g_R2_ZU48DR/Makefile @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: MIT +# +# Copyright (c) 2025 FPGA Ninja, LLC +# +# Authors: +# - Alex Forencich +# + +# FPGA settings +FPGA_PART = xczu48dr-ffvg1517-2-e +FPGA_TOP = fpga +FPGA_ARCH = zynquplusRFSOC + +RTL_DIR = ../rtl +LIB_DIR = ../lib +TAXI_SRC_DIR = $(LIB_DIR)/taxi/src + +# Files for synthesis +SYN_FILES = $(RTL_DIR)/fpga_r2.sv +SYN_FILES += $(RTL_DIR)/fpga_core.sv +SYN_FILES += $(RTL_DIR)/../pll/pll_i2c_init_r2.sv +SYN_FILES += $(TAXI_SRC_DIR)/eth/rtl/us/taxi_eth_mac_25g_us.f +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_if_uart.f +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_switch.sv +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_mod_stats.f +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_mod_i2c_master.f +SYN_FILES += $(TAXI_SRC_DIR)/axis/rtl/taxi_axis_async_fifo.f +SYN_FILES += $(TAXI_SRC_DIR)/sync/rtl/taxi_sync_reset.sv +SYN_FILES += $(TAXI_SRC_DIR)/sync/rtl/taxi_sync_signal.sv +SYN_FILES += $(TAXI_SRC_DIR)/io/rtl/taxi_debounce_switch.sv + +# XDC files +XDC_FILES = ../fpga_r2.xdc +XDC_FILES += ../cfgmclk.xdc +XDC_FILES += $(TAXI_SRC_DIR)/eth/syn/vivado/taxi_eth_mac_fifo.tcl +XDC_FILES += $(TAXI_SRC_DIR)/axis/syn/vivado/taxi_axis_async_fifo.tcl +XDC_FILES += $(TAXI_SRC_DIR)/sync/syn/vivado/taxi_sync_reset.tcl +XDC_FILES += $(TAXI_SRC_DIR)/sync/syn/vivado/taxi_sync_signal.tcl + +# IP +IP_TCL_FILES = $(TAXI_SRC_DIR)/eth/rtl/us/taxi_eth_phy_25g_us_gty_10g_161.tcl +IP_TCL_FILES += ../ip/usp_rfdc_1ghz_1gsps.tcl + +# Configuration +# CONFIG_TCL_FILES = ./config.tcl + +include ../common/vivado.mk + +program: $(FPGA_TOP).bit + echo "open_hw" > program.tcl + echo "connect_hw_server" >> program.tcl + echo "open_hw_target" >> program.tcl + echo "current_hw_device [lindex [get_hw_devices] 0]" >> program.tcl + echo "refresh_hw_device -update_hw_probes false [current_hw_device]" >> program.tcl + echo "set_property PROGRAM.FILE {$(FPGA_TOP).bit} [current_hw_device]" >> program.tcl + echo "program_hw_devices [current_hw_device]" >> program.tcl + echo "exit" >> program.tcl + vivado -nojournal -nolog -mode batch -source program.tcl diff --git a/src/eth/example/HTG_ZRF8/fpga/fpga_EM_ZU48DR/Makefile b/src/eth/example/HTG_ZRF8/fpga/fpga_EM_ZU48DR/Makefile new file mode 100644 index 0000000..66a1ba8 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/fpga_EM_ZU48DR/Makefile @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: MIT +# +# Copyright (c) 2025 FPGA Ninja, LLC +# +# Authors: +# - Alex Forencich +# + +# FPGA settings +FPGA_PART = xczu48dr-ffvg1517-2-e +FPGA_TOP = fpga +FPGA_ARCH = zynquplusRFSOC + +RTL_DIR = ../rtl +LIB_DIR = ../lib +TAXI_SRC_DIR = $(LIB_DIR)/taxi/src + +# Files for synthesis +SYN_FILES = $(RTL_DIR)/fpga_em.sv +SYN_FILES += $(RTL_DIR)/fpga_core.sv +SYN_FILES += $(RTL_DIR)/../pll/pll_i2c_init_em.sv +SYN_FILES += $(TAXI_SRC_DIR)/eth/rtl/us/taxi_eth_mac_25g_us.f +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_if_uart.f +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_switch.sv +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_mod_stats.f +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_mod_i2c_master.f +SYN_FILES += $(TAXI_SRC_DIR)/axis/rtl/taxi_axis_async_fifo.f +SYN_FILES += $(TAXI_SRC_DIR)/sync/rtl/taxi_sync_reset.sv +SYN_FILES += $(TAXI_SRC_DIR)/sync/rtl/taxi_sync_signal.sv +SYN_FILES += $(TAXI_SRC_DIR)/io/rtl/taxi_debounce_switch.sv + +# XDC files +XDC_FILES = ../fpga_em.xdc +XDC_FILES += ../cfgmclk.xdc +XDC_FILES += $(TAXI_SRC_DIR)/eth/syn/vivado/taxi_eth_mac_fifo.tcl +XDC_FILES += $(TAXI_SRC_DIR)/axis/syn/vivado/taxi_axis_async_fifo.tcl +XDC_FILES += $(TAXI_SRC_DIR)/sync/syn/vivado/taxi_sync_reset.tcl +XDC_FILES += $(TAXI_SRC_DIR)/sync/syn/vivado/taxi_sync_signal.tcl + +# IP +IP_TCL_FILES = $(TAXI_SRC_DIR)/eth/rtl/us/taxi_eth_phy_25g_us_gty_25g_161.tcl +IP_TCL_FILES += ../ip/usp_rfdc_1ghz_1gsps.tcl + +# Configuration +# CONFIG_TCL_FILES = ./config.tcl + +include ../common/vivado.mk + +program: $(FPGA_TOP).bit + echo "open_hw" > program.tcl + echo "connect_hw_server" >> program.tcl + echo "open_hw_target" >> program.tcl + echo "current_hw_device [lindex [get_hw_devices] 0]" >> program.tcl + echo "refresh_hw_device -update_hw_probes false [current_hw_device]" >> program.tcl + echo "set_property PROGRAM.FILE {$(FPGA_TOP).bit} [current_hw_device]" >> program.tcl + echo "program_hw_devices [current_hw_device]" >> program.tcl + echo "exit" >> program.tcl + vivado -nojournal -nolog -mode batch -source program.tcl diff --git a/src/eth/example/HTG_ZRF8/fpga/fpga_R2_ZU48DR/Makefile b/src/eth/example/HTG_ZRF8/fpga/fpga_R2_ZU48DR/Makefile new file mode 100644 index 0000000..3e4c4f7 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/fpga_R2_ZU48DR/Makefile @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: MIT +# +# Copyright (c) 2025 FPGA Ninja, LLC +# +# Authors: +# - Alex Forencich +# + +# FPGA settings +FPGA_PART = xczu48dr-ffvg1517-2-e +FPGA_TOP = fpga +FPGA_ARCH = zynquplusRFSOC + +RTL_DIR = ../rtl +LIB_DIR = ../lib +TAXI_SRC_DIR = $(LIB_DIR)/taxi/src + +# Files for synthesis +SYN_FILES = $(RTL_DIR)/fpga_r2.sv +SYN_FILES += $(RTL_DIR)/fpga_core.sv +SYN_FILES += $(RTL_DIR)/../pll/pll_i2c_init_r2.sv +SYN_FILES += $(TAXI_SRC_DIR)/eth/rtl/us/taxi_eth_mac_25g_us.f +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_if_uart.f +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_switch.sv +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_mod_stats.f +SYN_FILES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_mod_i2c_master.f +SYN_FILES += $(TAXI_SRC_DIR)/axis/rtl/taxi_axis_async_fifo.f +SYN_FILES += $(TAXI_SRC_DIR)/sync/rtl/taxi_sync_reset.sv +SYN_FILES += $(TAXI_SRC_DIR)/sync/rtl/taxi_sync_signal.sv +SYN_FILES += $(TAXI_SRC_DIR)/io/rtl/taxi_debounce_switch.sv + +# XDC files +XDC_FILES = ../fpga_r2.xdc +XDC_FILES += ../cfgmclk.xdc +XDC_FILES += $(TAXI_SRC_DIR)/eth/syn/vivado/taxi_eth_mac_fifo.tcl +XDC_FILES += $(TAXI_SRC_DIR)/axis/syn/vivado/taxi_axis_async_fifo.tcl +XDC_FILES += $(TAXI_SRC_DIR)/sync/syn/vivado/taxi_sync_reset.tcl +XDC_FILES += $(TAXI_SRC_DIR)/sync/syn/vivado/taxi_sync_signal.tcl + +# IP +IP_TCL_FILES = $(TAXI_SRC_DIR)/eth/rtl/us/taxi_eth_phy_25g_us_gty_25g_161.tcl +IP_TCL_FILES += ../ip/usp_rfdc_1ghz_1gsps.tcl + +# Configuration +# CONFIG_TCL_FILES = ./config.tcl + +include ../common/vivado.mk + +program: $(FPGA_TOP).bit + echo "open_hw" > program.tcl + echo "connect_hw_server" >> program.tcl + echo "open_hw_target" >> program.tcl + echo "current_hw_device [lindex [get_hw_devices] 0]" >> program.tcl + echo "refresh_hw_device -update_hw_probes false [current_hw_device]" >> program.tcl + echo "set_property PROGRAM.FILE {$(FPGA_TOP).bit} [current_hw_device]" >> program.tcl + echo "program_hw_devices [current_hw_device]" >> program.tcl + echo "exit" >> program.tcl + vivado -nojournal -nolog -mode batch -source program.tcl diff --git a/src/eth/example/HTG_ZRF8/fpga/fpga_em.xdc b/src/eth/example/HTG_ZRF8/fpga/fpga_em.xdc new file mode 100644 index 0000000..c07bc85 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/fpga_em.xdc @@ -0,0 +1,554 @@ +# SPDX-License-Identifier: MIT +# +# Copyright (c) 2025 FPGA Ninja, LLC +# +# Authors: +# - Alex Forencich +# + +# XDC constraints for the HiTech Global HTG-ZRF8-EM board +# part: xczu28dr-ffvg1517-2-e +# part: xczu48dr-ffvg1517-2-e + +# General configuration +set_property BITSTREAM.GENERAL.COMPRESS true [current_design] + +# System clocks +# DDR4 clocks from U48 (300 MHz) +#set_property -dict {LOC G13 IOSTANDARD DIFF_SSTL12} [get_ports sys_clk_ddr4_p] ;# U48.59 OUT9_P +#set_property -dict {LOC G12 IOSTANDARD DIFF_SSTL12} [get_ports sys_clk_ddr4_n] ;# U48.58 OUT9_N +#create_clock -period 3.333 -name sys_clk_ddr4 [get_ports sys_clk_ddr4_p] + +#set_property -dict {LOC AP8 IOSTANDARD DIFF_SSTL12} [get_ports sys_clk_ddr4_c_p] ;# U48.51 OUT7_P +#set_property -dict {LOC AR9 IOSTANDARD DIFF_SSTL12} [get_ports sys_clk_ddr4_c_n] ;# U48.50 OUT7_N +#create_clock -period 3.333 -name sys_clk_ddr4_c [get_ports sys_clk_ddr4_c_p] + +# User clock from U48 (200 MHz) +set_property -dict {LOC AV6 IOSTANDARD LVDS_25} [get_ports clk_pl_user_p] ;# U48.54 OUT8_P +set_property -dict {LOC AV5 IOSTANDARD LVDS_25} [get_ports clk_pl_user_n] ;# U48.53 OUT8_N +create_clock -period 5.000 -name clk_pl_user [get_ports clk_pl_user_p] + +# Source pin is in an HDIO bank, so it must be routed to an MMCM via a BUFG +set_property CLOCK_DEDICATED_ROUTE ANY_CMT_COLUMN [get_nets clk_pl_user_bufg] + +# PLL refclk from U2 (250 MHz) +set_property -dict {LOC AU4 IOSTANDARD LVDS_25} [get_ports fpga_refclk_p] ;# U2.60 CLKout13_P +set_property -dict {LOC AU3 IOSTANDARD LVDS_25} [get_ports fpga_refclk_n] ;# U2.61 CLKout13_N +create_clock -period 4.000 -name fpga_refclk [get_ports fpga_refclk_p] + +# Source pin is in an HDIO bank, so it must be routed to an MMCM via a BUFG +set_property CLOCK_DEDICATED_ROUTE ANY_CMT_COLUMN [get_nets fpga_refclk_int fpga_refclk_bufg_inst_n_0] + +# PLL sysref from U2 +set_property -dict {LOC AT5 IOSTANDARD LVDS_25} [get_ports fpga_sysref_p] ;# U2.62 CLKout12_P +set_property -dict {LOC AU5 IOSTANDARD LVDS_25} [get_ports fpga_sysref_n] ;# U2.63 CLKout12_N +create_clock -period 100.000 -name fpga_sysref [get_ports fpga_sysref_p] + +# LEDs +set_property -dict {LOC AP6 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {led[0]}] ;# D16 +set_property -dict {LOC AW5 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {led[1]}] ;# D15 +set_property -dict {LOC AW6 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {led[2]}] ;# D14 +set_property -dict {LOC AR6 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {led[3]}] ;# D3 + +set_false_path -to [get_ports {led[*]}] +set_output_delay 0 [get_ports {led[*]}] + +# Push buttons +set_property -dict {LOC AG14 IOSTANDARD LVCMOS12} [get_ports {btn}] ;# PB4 + +set_false_path -from [get_ports {btn}] +set_input_delay 0 [get_ports {btn}] + +# DIP switches +set_property -dict {LOC E19 IOSTANDARD LVCMOS12} [get_ports {sw[0]}] ;# S1.1 +set_property -dict {LOC D19 IOSTANDARD LVCMOS12} [get_ports {sw[1]}] ;# S1.2 +set_property -dict {LOC C18 IOSTANDARD LVCMOS12} [get_ports {sw[2]}] ;# S1.3 +set_property -dict {LOC A25 IOSTANDARD LVCMOS12} [get_ports {sw[3]}] ;# S1.4 + +set_false_path -from [get_ports {sw[*]}] +set_input_delay 0 [get_ports {sw[*]}] + +# GPIO +set_property -dict {LOC N21 IOSTANDARD LVCMOS12} [get_ports {gpio[0]}] ;# J32.1 +set_property -dict {LOC M12 IOSTANDARD LVCMOS12} [get_ports {gpio[1]}] ;# J32.3 +set_property -dict {LOC F22 IOSTANDARD LVCMOS12} [get_ports {gpio[2]}] ;# J32.5 +set_property -dict {LOC B23 IOSTANDARD LVCMOS12} [get_ports {gpio[3]}] ;# J32.7 +set_property -dict {LOC G24 IOSTANDARD LVCMOS12} [get_ports {gpio[4]}] ;# J32.9 +set_property -dict {LOC D20 IOSTANDARD LVCMOS12} [get_ports {gpio[5]}] ;# J32.11 +set_property -dict {LOC J24 IOSTANDARD LVCMOS12} [get_ports {gpio[6]}] ;# J32.13 +set_property -dict {LOC H15 IOSTANDARD LVCMOS12} [get_ports {gpio[7]}] ;# J32.15 + +set_false_path -to [get_ports {gpio[*]}] +set_output_delay 0 [get_ports {gpio[*]}] + +# UART +set_property -dict {LOC AV7 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports uart_rxd] +set_property -dict {LOC AV8 IOSTANDARD LVCMOS33} [get_ports uart_txd] +set_property -dict {LOC AU8 IOSTANDARD LVCMOS33} [get_ports uart_rts] +set_property -dict {LOC AU7 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports uart_cts] +set_property -dict {LOC AT6 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports uart_rst_n] +set_property -dict {LOC AT7 IOSTANDARD LVCMOS33} [get_ports uart_suspend_n] + +set_false_path -to [get_ports {uart_rxd uart_cts uart_rst_n}] +set_output_delay 0 [get_ports {uart_rxd uart_cts uart_rst_n}] +set_false_path -from [get_ports {uart_txd uart_rts uart_suspend_n}] +set_input_delay 0 [get_ports {uart_txd uart_rts uart_suspend_n}] + +# I2C +set_property -dict {LOC AU2 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports i2c_scl] +set_property -dict {LOC AU1 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports i2c_sda] +set_property -dict {LOC AV2 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports i2c_rst_n] + +set_false_path -to [get_ports {i2c_sda i2c_scl i2c_rst_n}] +set_output_delay 0 [get_ports {i2c_sda i2c_scl i2c_rst_n}] +set_false_path -from [get_ports {i2c_sda i2c_scl}] +set_input_delay 0 [get_ports {i2c_sda i2c_scl}] + +# DDR4 SODIMM +#set_property -dict {LOC E13 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[0]}] +#set_property -dict {LOC A12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[1]}] +#set_property -dict {LOC F12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[2]}] +#set_property -dict {LOC A11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[3]}] +#set_property -dict {LOC F10 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[4]}] +#set_property -dict {LOC G10 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[5]}] +#set_property -dict {LOC D11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[6]}] +#set_property -dict {LOC H13 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[7]}] +#set_property -dict {LOC C12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[8]}] +#set_property -dict {LOC F11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[9]}] +#set_property -dict {LOC B12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[10]}] +#set_property -dict {LOC H10 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[11]}] +#set_property -dict {LOC E12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[12]}] +#set_property -dict {LOC C13 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[13]}] +#set_property -dict {LOC D13 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[14]}] +#set_property -dict {LOC B13 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[15]}] +#set_property -dict {LOC A14 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[16]}] + +#set_property -dict {LOC J10 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_act_n}] +#set_property -dict {LOC K11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_alert_n}] + +#set_property -dict {LOC E11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_ba[0]}] +#set_property -dict {LOC B15 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_ba[1]}] +#set_property -dict {LOC H11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_bg[0]}] +#set_property -dict {LOC H12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_bg[1]}] + +#set_property -dict {LOC J11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_cke[0]}] +#set_property -dict {LOC K10 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_cke[1]}] +#set_property -dict {LOC J14 IOSTANDARD DIFF_SSTL2_DCI} [get_ports {ddr4_ck_t[0]}] +#set_property -dict {LOC J13 IOSTANDARD DIFF_SSTL2_DCI} [get_ports {ddr4_ck_c[0]}] +#set_property -dict {LOC K13 IOSTANDARD DIFF_SSTL2_DCI} [get_ports {ddr4_ck_t[1]}] +#set_property -dict {LOC K12 IOSTANDARD DIFF_SSTL2_DCI} [get_ports {ddr4_ck_c[1]}] +#set_property -dict {LOC A15 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_cs_n[0]}] +#set_property -dict {LOC C15 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_cs_n[1]}] +#set_property -dict {LOC D14 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_cs_n[2]}] +#set_property -dict {LOC G14 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_cs_n[3]}] + +#set_property -dict {LOC C21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[0]}] +#set_property -dict {LOC A21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[1]}] +#set_property -dict {LOC B24 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[2]}] +#set_property -dict {LOC C22 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[3]}] +#set_property -dict {LOC C20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[4]}] +#set_property -dict {LOC A20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[5]}] +#set_property -dict {LOC A24 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[6]}] +#set_property -dict {LOC B20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[7]}] +#set_property -dict {LOC D21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[8]}] +#set_property -dict {LOC E21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[9]}] +#set_property -dict {LOC E23 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[10]}] +#set_property -dict {LOC E24 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[11]}] +#set_property -dict {LOC G20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[12]}] +#set_property -dict {LOC F20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[13]}] +#set_property -dict {LOC F24 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[14]}] +#set_property -dict {LOC E22 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[15]}] +#set_property -dict {LOC G23 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[16]}] +#set_property -dict {LOC H22 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[17]}] +#set_property -dict {LOC J21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[18]}] +#set_property -dict {LOC K24 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[19]}] +#set_property -dict {LOC H21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[20]}] +#set_property -dict {LOC G22 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[21]}] +#set_property -dict {LOC L24 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[22]}] +#set_property -dict {LOC H23 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[23]}] +#set_property -dict {LOC L20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[24]}] +#set_property -dict {LOC L23 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[25]}] +#set_property -dict {LOC N19 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[26]}] +#set_property -dict {LOC M20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[27]}] +#set_property -dict {LOC L19 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[28]}] +#set_property -dict {LOC L21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[29]}] +#set_property -dict {LOC M19 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[30]}] +#set_property -dict {LOC L22 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[31]}] +#set_property -dict {LOC A19 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[32]}] +#set_property -dict {LOC B19 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[33]}] +#set_property -dict {LOC D15 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[34]}] +#set_property -dict {LOC D16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[35]}] +#set_property -dict {LOC A17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[36]}] +#set_property -dict {LOC A16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[37]}] +#set_property -dict {LOC C16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[38]}] +#set_property -dict {LOC C17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[39]}] +#set_property -dict {LOC G18 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[40]}] +#set_property -dict {LOC E18 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[41]}] +#set_property -dict {LOC F15 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[42]}] +#set_property -dict {LOC G15 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[43]}] +#set_property -dict {LOC E16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[44]}] +#set_property -dict {LOC E17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[45]}] +#set_property -dict {LOC F16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[46]}] +#set_property -dict {LOC H18 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[47]}] +#set_property -dict {LOC K17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[48]}] +#set_property -dict {LOC J18 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[49]}] +#set_property -dict {LOC H16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[50]}] +#set_property -dict {LOC J16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[51]}] +#set_property -dict {LOC J19 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[52]}] +#set_property -dict {LOC H17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[53]}] +#set_property -dict {LOC L17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[54]}] +#set_property -dict {LOC K16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[55]}] +#set_property -dict {LOC N15 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[56]}] +#set_property -dict {LOC N17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[57]}] +#set_property -dict {LOC L12 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[58]}] +#set_property -dict {LOC M12 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[59]}] +#set_property -dict {LOC M17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[60]}] +#set_property -dict {LOC M15 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[61]}] +#set_property -dict {LOC M13 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[62]}] +#set_property -dict {LOC N13 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[63]}] +#set_property -dict {LOC G9 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[64]}] +#set_property -dict {LOC J9 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[65]}] +#set_property -dict {LOC K9 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[66]}] +#set_property -dict {LOC G7 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[67]}] +#set_property -dict {LOC F9 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[68]}] +#set_property -dict {LOC G6 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[69]}] +#set_property -dict {LOC H7 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[70]}] +#set_property -dict {LOC H6 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[71]}] + +#set_property -dict {LOC B22 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[0]}] +#set_property -dict {LOC A22 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[0]}] +#set_property -dict {LOC D23 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[1]}] +#set_property -dict {LOC D24 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[1]}] +#set_property -dict {LOC J20 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[2]}] +#set_property -dict {LOC H20 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[2]}] +#set_property -dict {LOC K21 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[3]}] +#set_property -dict {LOC K22 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[3]}] +#set_property -dict {LOC B18 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[4]}] +#set_property -dict {LOC B17 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[4]}] +#set_property -dict {LOC G19 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[5]}] +#set_property -dict {LOC F19 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[5]}] +#set_property -dict {LOC K19 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[6]}] +#set_property -dict {LOC K18 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[6]}] +#set_property -dict {LOC L15 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[7]}] +#set_property -dict {LOC L14 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[7]}] +#set_property -dict {LOC H8 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[8]}] +#set_property -dict {LOC G8 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[8]}] + +#set_property -dict {LOC C23 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[0]}] +#set_property -dict {LOC F21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[1]}] +#set_property -dict {LOC J23 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[2]}] +#set_property -dict {LOC N20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[3]}] +#set_property -dict {LOC D18 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[4]}] +#set_property -dict {LOC G17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[5]}] +#set_property -dict {LOC J15 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[6]}] +#set_property -dict {LOC N14 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[7]}] +#set_property -dict {LOC J8 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[8]}] + +#set_property -dict {LOC E14 IOSTANDARD LVCMOS12} [get_ports {ddr4_odt[0]}] +#set_property -dict {LOC F14 IOSTANDARD LVCMOS12} [get_ports {ddr4_odt[1]}] +#set_property -dict {LOC J7 IOSTANDARD LVCMOS12} [get_ports {ddr4_rst_n}] +#set_property -dict {LOC B14 IOSTANDARD LVCMOS12} [get_ports {ddr4_par}] +#set_property -dict {LOC C11 IOSTANDARD LVCMOS12} [get_ports {ddr4_event_n}] + +# DDR4 components +#set_property -dict {LOC AN11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[0]}] +#set_property -dict {LOC AM14 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[1]}] +#set_property -dict {LOC AM7 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[2]}] +#set_property -dict {LOC AL14 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[3]}] +#set_property -dict {LOC AL10 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[4]}] +#set_property -dict {LOC AM12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[5]}] +#set_property -dict {LOC AN7 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[6]}] +#set_property -dict {LOC AR11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[7]}] +#set_property -dict {LOC AM8 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[8]}] +#set_property -dict {LOC AN12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[9]}] +#set_property -dict {LOC AN10 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[10]}] +#set_property -dict {LOC AL7 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[11]}] +#set_property -dict {LOC AK14 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[12]}] +#set_property -dict {LOC AP11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[13]}] +#set_property -dict {LOC AM10 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[14]}] +#set_property -dict {LOC AJ14 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[15]}] +#set_property -dict {LOC AH13 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_a[16]}] + +#set_property -dict {LOC AP10 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_act_n}] +#set_property -dict {LOC AM9 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_alert_n}] + +#set_property -dict {LOC AL8 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_ba[0]}] +#set_property -dict {LOC AK13 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_ba[1]}] +#set_property -dict {LOC AN8 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_bg[0]}] + +#set_property -dict {LOC AR9 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_cke}] +#set_property -dict {LOC AM13 IOSTANDARD DIFF_SSTL2_DCI} [get_ports {ddr4_c_ck_t}] +#set_property -dict {LOC AN13 IOSTANDARD DIFF_SSTL2_DCI} [get_ports {ddr4_c_ck_c}] +#set_property -dict {LOC AL12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_c_cs_n}] + +#set_property -dict {LOC AT10 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[0]}] +#set_property -dict {LOC AW11 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[1]}] +#set_property -dict {LOC AU10 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[2]}] +#set_property -dict {LOC AV11 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[3]}] +#set_property -dict {LOC AW8 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[4]}] +#set_property -dict {LOC AV12 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[5]}] +#set_property -dict {LOC AW9 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[6]}] +#set_property -dict {LOC AU12 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[7]}] +#set_property -dict {LOC AH16 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[8]}] +#set_property -dict {LOC AJ16 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[9]}] +#set_property -dict {LOC AF16 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[10]}] +#set_property -dict {LOC AJ15 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[11]}] +#set_property -dict {LOC AF17 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[12]}] +#set_property -dict {LOC AK16 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[13]}] +#set_property -dict {LOC AH15 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[14]}] +#set_property -dict {LOC AK17 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[15]}] +#set_property -dict {LOC AV15 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[16]}] +#set_property -dict {LOC AU15 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[17]}] +#set_property -dict {LOC AV13 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[18]}] +#set_property -dict {LOC AW15 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[19]}] +#set_property -dict {LOC AT15 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[20]}] +#set_property -dict {LOC AT16 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[21]}] +#set_property -dict {LOC AU14 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[22]}] +#set_property -dict {LOC AU13 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[23]}] +#set_property -dict {LOC AN15 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[24]}] +#set_property -dict {LOC AR16 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[25]}] +#set_property -dict {LOC AM15 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[26]}] +#set_property -dict {LOC AP14 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[27]}] +#set_property -dict {LOC AM17 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[28]}] +#set_property -dict {LOC AR14 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[29]}] +#set_property -dict {LOC AL17 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[30]}] +#set_property -dict {LOC AP16 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[31]}] +#set_property -dict {LOC AV18 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[32]}] +#set_property -dict {LOC AU19 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[33]}] +#set_property -dict {LOC AU18 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[34]}] +#set_property -dict {LOC AU20 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[35]}] +#set_property -dict {LOC AV17 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[36]}] +#set_property -dict {LOC AV20 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[37]}] +#set_property -dict {LOC AU17 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[38]}] +#set_property -dict {LOC AW20 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[39]}] +#set_property -dict {LOC AP18 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[40]}] +#set_property -dict {LOC AR21 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[41]}] +#set_property -dict {LOC AR19 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[42]}] +#set_property -dict {LOC AT21 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[43]}] +#set_property -dict {LOC AT19 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[44]}] +#set_property -dict {LOC AP20 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[45]}] +#set_property -dict {LOC AR18 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[46]}] +#set_property -dict {LOC AP19 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[47]}] +#set_property -dict {LOC AN21 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[48]}] +#set_property -dict {LOC AL21 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[49]}] +#set_property -dict {LOC AL19 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[50]}] +#set_property -dict {LOC AM18 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[51]}] +#set_property -dict {LOC AP21 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[52]}] +#set_property -dict {LOC AL20 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[53]}] +#set_property -dict {LOC AM19 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[54]}] +#set_property -dict {LOC AN18 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[55]}] +#set_property -dict {LOC AH18 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[56]}] +#set_property -dict {LOC AG18 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[57]}] +#set_property -dict {LOC AK22 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[58]}] +#set_property -dict {LOC AF20 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[59]}] +#set_property -dict {LOC AK21 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[60]}] +#set_property -dict {LOC AF19 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[61]}] +#set_property -dict {LOC AJ19 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[62]}] +#set_property -dict {LOC AJ20 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dq[63]}] + +#set_property -dict {LOC AT12 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_t[0]}] +#set_property -dict {LOC AT11 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_c[0]}] +#set_property -dict {LOC AG17 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_t[1]}] +#set_property -dict {LOC AH17 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_c[1]}] +#set_property -dict {LOC AV16 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_t[2]}] +#set_property -dict {LOC AW16 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_c[2]}] +#set_property -dict {LOC AN17 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_t[3]}] +#set_property -dict {LOC AN16 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_c[3]}] +#set_property -dict {LOC AV21 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_t[4]}] +#set_property -dict {LOC AW21 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_c[4]}] +#set_property -dict {LOC AR22 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_t[5]}] +#set_property -dict {LOC AT22 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_c[5]}] +#set_property -dict {LOC AL22 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_t[6]}] +#set_property -dict {LOC AM22 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_c[6]}] +#set_property -dict {LOC AG20 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_t[7]}] +#set_property -dict {LOC AH20 IOSTANDARD DIFF_POD12} [get_ports {ddr4_c_dqs_c[7]}] + +#set_property -dict {LOC AV10 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dm_dbi_n[0]}] +#set_property -dict {LOC AL16 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dm_dbi_n[1]}] +#set_property -dict {LOC AW14 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dm_dbi_n[2]}] +#set_property -dict {LOC AP13 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dm_dbi_n[3]}] +#set_property -dict {LOC AW19 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dm_dbi_n[4]}] +#set_property -dict {LOC AR17 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dm_dbi_n[5]}] +#set_property -dict {LOC AM20 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dm_dbi_n[6]}] +#set_property -dict {LOC AJ18 IOSTANDARD POD12_DCI} [get_ports {ddr4_c_dm_dbi_n[7]}] + +#set_property -dict {LOC AP9 IOSTANDARD LVCMOS12} [get_ports {ddr4_c_odt}] +#set_property -dict {LOC AK12 IOSTANDARD LVCMOS12} [get_ports {ddr4_c_rst_n}] +#set_property -dict {LOC AL9 IOSTANDARD LVCMOS12} [get_ports {ddr4_c_par}] +#set_property -dict {LOC AR12 IOSTANDARD LVCMOS12} [get_ports {ddr4_c_ten}] + +# PCIe Interface +#set_property -dict {LOC J33 } [get_ports {pcie_tx_p[0]}] ;# MGTYTXP3_129 GTYE4_CHANNEL_X0Y7 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC J34 } [get_ports {pcie_tx_n[0]}] ;# MGTYTXN3_129 GTYE4_CHANNEL_X0Y7 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC K36 } [get_ports {pcie_rx_p[0]}] ;# MGTYRXP3_129 GTYE4_CHANNEL_X0Y7 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC K37 } [get_ports {pcie_rx_n[0]}] ;# MGTYRXN3_129 GTYE4_CHANNEL_X0Y7 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC L33 } [get_ports {pcie_tx_p[1]}] ;# MGTYTXP2_129 GTYE4_CHANNEL_X0Y6 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC L34 } [get_ports {pcie_tx_n[1]}] ;# MGTYTXN2_129 GTYE4_CHANNEL_X0Y6 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC L38 } [get_ports {pcie_rx_p[1]}] ;# MGTYRXP2_129 GTYE4_CHANNEL_X0Y6 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC L39 } [get_ports {pcie_rx_n[1]}] ;# MGTYRXN2_129 GTYE4_CHANNEL_X0Y6 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC N33 } [get_ports {pcie_tx_p[2]}] ;# MGTYTXP1_129 GTYE4_CHANNEL_X0Y5 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC N34 } [get_ports {pcie_tx_n[2]}] ;# MGTYTXN1_129 GTYE4_CHANNEL_X0Y5 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC M36 } [get_ports {pcie_rx_p[2]}] ;# MGTYRXP1_129 GTYE4_CHANNEL_X0Y5 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC M37 } [get_ports {pcie_rx_n[2]}] ;# MGTYRXN1_129 GTYE4_CHANNEL_X0Y5 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC P35 } [get_ports {pcie_tx_p[3]}] ;# MGTYTXP0_129 GTYE4_CHANNEL_X0Y4 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC P36 } [get_ports {pcie_tx_n[3]}] ;# MGTYTXN0_129 GTYE4_CHANNEL_X0Y4 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC N38 } [get_ports {pcie_rx_p[3]}] ;# MGTYRXP0_129 GTYE4_CHANNEL_X0Y4 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC N39 } [get_ports {pcie_rx_n[3]}] ;# MGTYRXN0_129 GTYE4_CHANNEL_X0Y4 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC R33 } [get_ports {pcie_tx_p[4]}] ;# MGTYTXP3_128 GTYE4_CHANNEL_X0Y3 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC R34 } [get_ports {pcie_tx_n[4]}] ;# MGTYTXN3_128 GTYE4_CHANNEL_X0Y3 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC R38 } [get_ports {pcie_rx_p[4]}] ;# MGTYRXP3_128 GTYE4_CHANNEL_X0Y3 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC R39 } [get_ports {pcie_rx_n[4]}] ;# MGTYRXN3_128 GTYE4_CHANNEL_X0Y3 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC T35 } [get_ports {pcie_tx_p[5]}] ;# MGTYTXP2_128 GTYE4_CHANNEL_X0Y2 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC T36 } [get_ports {pcie_tx_n[5]}] ;# MGTYTXN2_128 GTYE4_CHANNEL_X0Y2 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC U38 } [get_ports {pcie_rx_p[5]}] ;# MGTYRXP2_128 GTYE4_CHANNEL_X0Y2 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC U39 } [get_ports {pcie_rx_n[5]}] ;# MGTYRXN2_128 GTYE4_CHANNEL_X0Y2 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC V35 } [get_ports {pcie_tx_p[6]}] ;# MGTYTXP1_128 GTYE4_CHANNEL_X0Y1 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC V36 } [get_ports {pcie_tx_n[6]}] ;# MGTYTXN1_128 GTYE4_CHANNEL_X0Y1 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC W38 } [get_ports {pcie_rx_p[6]}] ;# MGTYRXP1_128 GTYE4_CHANNEL_X0Y1 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC W39 } [get_ports {pcie_rx_n[6]}] ;# MGTYRXN1_128 GTYE4_CHANNEL_X0Y1 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC Y35 } [get_ports {pcie_tx_p[7]}] ;# MGTYTXP0_128 GTYE4_CHANNEL_X0Y0 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC Y36 } [get_ports {pcie_tx_n[7]}] ;# MGTYTXN0_128 GTYE4_CHANNEL_X0Y0 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC AA38} [get_ports {pcie_rx_p[7]}] ;# MGTYRXP0_128 GTYE4_CHANNEL_X0Y0 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC AA39} [get_ports {pcie_rx_n[7]}] ;# MGTYRXN0_128 GTYE4_CHANNEL_X0Y0 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC AA33} [get_ports pcie_refclk_p] ;# MGTREFCLK0P_128 +#set_property -dict {LOC AA34} [get_ports pcie_refclk_n] ;# MGTREFCLK0N_128 +#set_property -dict {LOC AJ13 IOSTANDARD LVCMOS12 PULLUP true} [get_ports pcie_reset_n] + +#set_false_path -from [get_ports {pcie_reset_n}] +#set_input_delay 0 [get_ports {pcie_reset_n}] + +# 100 MHz MGT reference clock +#create_clock -period 10 -name pcie_mgt_refclk [get_ports pcie_refclk_p] + +# FMC+ J25 +#set_property -dict {LOC B8 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_p[0]}] ;# J25.G9 LA00_P_CC +#set_property -dict {LOC B7 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_n[0]}] ;# J25.G10 LA00_N_CC +#set_property -dict {LOC E9 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_p[1]}] ;# J25.D8 LA01_P_CC +#set_property -dict {LOC E8 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_n[1]}] ;# J25.D9 LA01_N_CC +#set_property -dict {LOC A7 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_p[2]}] ;# J25.H7 LA02_P +#set_property -dict {LOC A6 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_n[2]}] ;# J25.H8 LA02_N +#set_property -dict {LOC E7 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_p[3]}] ;# J25.G12 LA03_P +#set_property -dict {LOC E6 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_n[3]}] ;# J25.G13 LA03_N +#set_property -dict {LOC F6 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_p[4]}] ;# J25.H10 LA04_P +#set_property -dict {LOC E6 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_n[4]}] ;# J25.H11 LA04_N +#set_property -dict {LOC D9 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_p[5]}] ;# J25.D11 LA05_P +#set_property -dict {LOC D8 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_n[5]}] ;# J25.D12 LA05_N +#set_property -dict {LOC D10 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_p[6]}] ;# J25.C10 LA06_P +#set_property -dict {LOC C10 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_n[6]}] ;# J25.C11 LA06_N +#set_property -dict {LOC C6 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_p[7]}] ;# J25.H13 LA07_P +#set_property -dict {LOC C5 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_n[7]}] ;# J25.H14 LA07_N +#set_property -dict {LOC B5 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_p[8]}] ;# J25.G12 LA08_P +#set_property -dict {LOC A5 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_n[8]}] ;# J25.G13 LA08_N +#set_property -dict {LOC A10 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_p[9]}] ;# J25.D14 LA09_P +#set_property -dict {LOC A9 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_la_n[9]}] ;# J25.D15 LA09_N + +#set_property -dict {LOC C8 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_clk0_m2c_p}] ;# J25.H4 CLK0_M2C_P +#set_property -dict {LOC C7 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_clk0_m2c_n}] ;# J25.H5 CLK0_M2C_N + +#set_property -dict {LOC B10 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_refclk_m2c_p}] ;# J25.L24 REFCLK_M2C_P +#set_property -dict {LOC B9 IOSTANDARD LVDS DIFF_TERM TRUE} [get_ports {fmc_refclk_m2c_n}] ;# J25.L25 REFCLK_M2C_N + +#set_property -dict {LOC F17 IOSTANDARD LVCMOS12} [get_ports {fmc_prsnt_m2c}] ;# J25.H2 PRSNT_M2C_L +#set_property -dict {LOC M18 IOSTANDARD LVCMOS12} [get_ports {fmc_hspc_prsnt_m2c_l}] ;# J25.Z1 HSPC_PRSNT_M2C_L + +set_property -dict {LOC E33 } [get_ports {fmc_dp_c2m_p[0]}] ;# MGTYTXP3_130 GTYE4_CHANNEL_X0Y41 / GTYE4_COMMON_X0Y10 from J25.C2 DP0_C2M_P +set_property -dict {LOC E34 } [get_ports {fmc_dp_c2m_n[0]}] ;# MGTYTXN3_130 GTYE4_CHANNEL_X0Y41 / GTYE4_COMMON_X0Y10 from J25.C3 DP0_C2M_N +set_property -dict {LOC F36 } [get_ports {fmc_dp_m2c_p[0]}] ;# MGTYRXP3_130 GTYE4_CHANNEL_X0Y41 / GTYE4_COMMON_X0Y10 from J25.C6 DP0_M2C_P +set_property -dict {LOC F37 } [get_ports {fmc_dp_m2c_n[0]}] ;# MGTYRXN3_130 GTYE4_CHANNEL_X0Y41 / GTYE4_COMMON_X0Y10 from J25.C7 DP0_M2C_N +set_property -dict {LOC H31 } [get_ports {fmc_dp_c2m_p[1]}] ;# MGTYTXP0_130 GTYE4_CHANNEL_X0Y43 / GTYE4_COMMON_X0Y10 from J25.A22 DP1_C2M_P +set_property -dict {LOC H32 } [get_ports {fmc_dp_c2m_n[1]}] ;# MGTYTXN0_130 GTYE4_CHANNEL_X0Y43 / GTYE4_COMMON_X0Y10 from J25.A23 DP1_C2M_N +set_property -dict {LOC J38 } [get_ports {fmc_dp_m2c_p[1]}] ;# MGTYRXP0_130 GTYE4_CHANNEL_X0Y43 / GTYE4_COMMON_X0Y10 from J25.A2 DP1_M2C_P +set_property -dict {LOC J39 } [get_ports {fmc_dp_m2c_n[1]}] ;# MGTYRXN0_130 GTYE4_CHANNEL_X0Y43 / GTYE4_COMMON_X0Y10 from J25.A3 DP1_M2C_N +set_property -dict {LOC G33 } [get_ports {fmc_dp_c2m_p[2]}] ;# MGTYTXP1_130 GTYE4_CHANNEL_X0Y42 / GTYE4_COMMON_X0Y10 from J25.A26 DP2_C2M_P +set_property -dict {LOC G34 } [get_ports {fmc_dp_c2m_n[2]}] ;# MGTYTXN1_130 GTYE4_CHANNEL_X0Y42 / GTYE4_COMMON_X0Y10 from J25.A27 DP2_C2M_N +set_property -dict {LOC H36 } [get_ports {fmc_dp_m2c_p[2]}] ;# MGTYRXP1_130 GTYE4_CHANNEL_X0Y42 / GTYE4_COMMON_X0Y10 from J25.A6 DP2_M2C_P +set_property -dict {LOC H37 } [get_ports {fmc_dp_m2c_n[2]}] ;# MGTYRXN1_130 GTYE4_CHANNEL_X0Y42 / GTYE4_COMMON_X0Y10 from J25.A7 DP2_M2C_N +set_property -dict {LOC F31 } [get_ports {fmc_dp_c2m_p[3]}] ;# MGTYTXP2_130 GTYE4_CHANNEL_X0Y40 / GTYE4_COMMON_X0Y10 from J25.A30 DP3_C2M_P +set_property -dict {LOC F32 } [get_ports {fmc_dp_c2m_n[3]}] ;# MGTYTXN2_130 GTYE4_CHANNEL_X0Y40 / GTYE4_COMMON_X0Y10 from J25.A31 DP3_C2M_N +set_property -dict {LOC G38 } [get_ports {fmc_dp_m2c_p[3]}] ;# MGTYRXP2_130 GTYE4_CHANNEL_X0Y40 / GTYE4_COMMON_X0Y10 from J25.A10 DP3_M2C_P +set_property -dict {LOC G39 } [get_ports {fmc_dp_m2c_n[3]}] ;# MGTYRXN2_130 GTYE4_CHANNEL_X0Y40 / GTYE4_COMMON_X0Y10 from J25.A11 DP3_M2C_N +set_property -dict {LOC U33 } [get_ports fmc_mgt_refclk_0_0_p] ;# MGTREFCLK0P_130 from U48.42 OUT5_P +set_property -dict {LOC U34 } [get_ports fmc_mgt_refclk_0_0_n] ;# MGTREFCLK0N_130 from U48.41 OUT5_N +#set_property -dict {LOC T31 } [get_ports fmc_mgt_refclk_0_1_p] ;# MGTREFCLK1P_130 from J25.D4 GBTCLK0_M2C_P +#set_property -dict {LOC T32 } [get_ports fmc_mgt_refclk_0_1_n] ;# MGTREFCLK1N_130 from J25.D5 GBTCLK0_M2C_N + +# reference clock +create_clock -period 6.206 -name fmc_mgt_refclk_0_0 [get_ports fmc_mgt_refclk_0_0_p] +#create_clock -period 6.400 -name fmc_mgt_refclk_0_1 [get_ports fmc_mgt_refclk_0_1_p] + +set_property -dict {LOC C33 } [get_ports {fmc_dp_c2m_p[4]}] ;# MGTYTXP1_131 GTYE4_CHANNEL_X0Y38 / GTYE4_COMMON_X0Y9 from J25.A34 DP4_C2M_P +set_property -dict {LOC C34 } [get_ports {fmc_dp_c2m_n[4]}] ;# MGTYTXN1_131 GTYE4_CHANNEL_X0Y38 / GTYE4_COMMON_X0Y9 from J25.A35 DP4_C2M_N +set_property -dict {LOC D36 } [get_ports {fmc_dp_m2c_p[4]}] ;# MGTYRXP1_131 GTYE4_CHANNEL_X0Y38 / GTYE4_COMMON_X0Y9 from J25.A14 DP4_M2C_P +set_property -dict {LOC D37 } [get_ports {fmc_dp_m2c_n[4]}] ;# MGTYRXN1_131 GTYE4_CHANNEL_X0Y38 / GTYE4_COMMON_X0Y9 from J25.A15 DP4_M2C_N +set_property -dict {LOC A33 } [get_ports {fmc_dp_c2m_p[5]}] ;# MGTYTXP3_131 GTYE4_CHANNEL_X0Y36 / GTYE4_COMMON_X0Y9 from J25.A38 DP5_C2M_P +set_property -dict {LOC A34 } [get_ports {fmc_dp_c2m_n[5]}] ;# MGTYTXN3_131 GTYE4_CHANNEL_X0Y36 / GTYE4_COMMON_X0Y9 from J25.A39 DP5_C2M_N +set_property -dict {LOC B36 } [get_ports {fmc_dp_m2c_p[5]}] ;# MGTYRXP3_131 GTYE4_CHANNEL_X0Y36 / GTYE4_COMMON_X0Y9 from J25.A18 DP5_M2C_P +set_property -dict {LOC B37 } [get_ports {fmc_dp_m2c_n[5]}] ;# MGTYRXN3_131 GTYE4_CHANNEL_X0Y36 / GTYE4_COMMON_X0Y9 from J25.A19 DP5_M2C_N +set_property -dict {LOC B31 } [get_ports {fmc_dp_c2m_p[6]}] ;# MGTYTXP2_131 GTYE4_CHANNEL_X0Y37 / GTYE4_COMMON_X0Y9 from J25.B36 DP6_C2M_P +set_property -dict {LOC B32 } [get_ports {fmc_dp_c2m_n[6]}] ;# MGTYTXN2_131 GTYE4_CHANNEL_X0Y37 / GTYE4_COMMON_X0Y9 from J25.B37 DP6_C2M_N +set_property -dict {LOC C38 } [get_ports {fmc_dp_m2c_p[6]}] ;# MGTYRXP2_131 GTYE4_CHANNEL_X0Y37 / GTYE4_COMMON_X0Y9 from J25.B16 DP6_M2C_P +set_property -dict {LOC C39 } [get_ports {fmc_dp_m2c_n[6]}] ;# MGTYRXN2_131 GTYE4_CHANNEL_X0Y37 / GTYE4_COMMON_X0Y9 from J25.B17 DP6_M2C_N +set_property -dict {LOC D31 } [get_ports {fmc_dp_c2m_p[7]}] ;# MGTYTXP0_131 GTYE4_CHANNEL_X0Y39 / GTYE4_COMMON_X0Y9 from J25.B32 DP7_C2M_P +set_property -dict {LOC D32 } [get_ports {fmc_dp_c2m_n[7]}] ;# MGTYTXN0_131 GTYE4_CHANNEL_X0Y39 / GTYE4_COMMON_X0Y9 from J25.B33 DP7_C2M_N +set_property -dict {LOC E38 } [get_ports {fmc_dp_m2c_p[7]}] ;# MGTYRXP0_131 GTYE4_CHANNEL_X0Y39 / GTYE4_COMMON_X0Y9 from J25.B12 DP7_M2C_P +set_property -dict {LOC E39 } [get_ports {fmc_dp_m2c_n[7]}] ;# MGTYRXN0_131 GTYE4_CHANNEL_X0Y39 / GTYE4_COMMON_X0Y9 from J25.B13 DP7_M2C_N +set_property -dict {LOC P31 } [get_ports fmc_mgt_refclk_1_0_p] ;# MGTREFCLK0P_131 from U48.45 OUT6_P +set_property -dict {LOC P32 } [get_ports fmc_mgt_refclk_1_0_n] ;# MGTREFCLK0N_131 from U48.44 OUT6_N +#set_property -dict {LOC M31 } [get_ports fmc_mgt_refclk_1_1_p] ;# MGTREFCLK1P_131 from J25.B20 GBTCLK1_M2C_P +#set_property -dict {LOC M32 } [get_ports fmc_mgt_refclk_1_1_n] ;# MGTREFCLK1N_131 from J25.B21 GBTCLK1_M2C_N + +# reference clock +create_clock -period 6.206 -name fmc_mgt_refclk_1_0 [get_ports fmc_mgt_refclk_1_0_p] +#create_clock -period 6.400 -name fmc_mgt_refclk_1_1 [get_ports fmc_mgt_refclk_1_1_p] + +# RFDC +set_property -dict {LOC Y2 } [get_ports {adc_vin_p[0]}] ;# ADC_VIN_I23_227_P from J9 via T5 +set_property -dict {LOC Y1 } [get_ports {adc_vin_n[0]}] ;# ADC_VIN_I23_227_N from J9 via T5 +set_property -dict {LOC AB2 } [get_ports {adc_vin_p[1]}] ;# ADC_VIN_I01_227_P from J10 via T13 +set_property -dict {LOC AB1 } [get_ports {adc_vin_n[1]}] ;# ADC_VIN_I01_227_N from J10 via T13 +set_property -dict {LOC AD2 } [get_ports {adc_vin_p[2]}] ;# ADC_VIN_I23_226_P from J11 via T6 +set_property -dict {LOC AD1 } [get_ports {adc_vin_n[2]}] ;# ADC_VIN_I23_226_N from J11 via T6 +set_property -dict {LOC AF2 } [get_ports {adc_vin_p[3]}] ;# ADC_VIN_I01_226_P from J12 via T14 +set_property -dict {LOC AF1 } [get_ports {adc_vin_n[3]}] ;# ADC_VIN_I01_226_N from J12 via T14 +set_property -dict {LOC AH2 } [get_ports {adc_vin_p[4]}] ;# ADC_VIN_I23_225_P from J13 via T7 +set_property -dict {LOC AH1 } [get_ports {adc_vin_n[4]}] ;# ADC_VIN_I23_225_N from J13 via T7 +set_property -dict {LOC AK2 } [get_ports {adc_vin_p[5]}] ;# ADC_VIN_I01_225_P from J14 via T15 +set_property -dict {LOC AK1 } [get_ports {adc_vin_n[5]}] ;# ADC_VIN_I01_225_N from J14 via T15 +set_property -dict {LOC AM2 } [get_ports {adc_vin_p[6]}] ;# ADC_VIN_I23_224_P from J15 via T8 +set_property -dict {LOC AM1 } [get_ports {adc_vin_n[6]}] ;# ADC_VIN_I23_224_N from J15 via T8 +set_property -dict {LOC AP2 } [get_ports {adc_vin_p[7]}] ;# ADC_VIN_I01_224_P from J16 via T16 +set_property -dict {LOC AP1 } [get_ports {adc_vin_n[7]}] ;# ADC_VIN_I01_224_N from J16 via T16 + +set_property -dict {LOC AF5 } [get_ports {adc_refclk_0_p}] ;# ADC_224_REFCLK_P from U67.23 RFoutAP +set_property -dict {LOC AF4 } [get_ports {adc_refclk_0_n}] ;# ADC_224_REFCLK_N from U67.22 RFoutAN +set_property -dict {LOC AD5 } [get_ports {adc_refclk_1_p}] ;# ADC_225_REFCLK_P from U67.19 RFoutBP +set_property -dict {LOC AD4 } [get_ports {adc_refclk_1_n}] ;# ADC_225_REFCLK_N from U67.18 RFoutBN +set_property -dict {LOC AB5 } [get_ports {adc_refclk_2_p}] ;# ADC_226_REFCLK_P from U66.23 RFoutAP +set_property -dict {LOC AB4 } [get_ports {adc_refclk_2_n}] ;# ADC_226_REFCLK_N from U66.22 RFoutAN +set_property -dict {LOC Y5 } [get_ports {adc_refclk_3_p}] ;# ADC_227_REFCLK_P from U66.19 RFoutBP +set_property -dict {LOC Y4 } [get_ports {adc_refclk_3_n}] ;# ADC_227_REFCLK_N from U66.18 RFoutBN + +set_property -dict {LOC C2 } [get_ports {dac_vout_p[0]}] ;# DAC_VOUT3_229_P from J1 via T1 +set_property -dict {LOC C1 } [get_ports {dac_vout_n[0]}] ;# DAC_VOUT3_229_N from J1 via T1 +set_property -dict {LOC E2 } [get_ports {dac_vout_p[1]}] ;# DAC_VOUT2_229_P from J2 via T9 +set_property -dict {LOC E1 } [get_ports {dac_vout_n[1]}] ;# DAC_VOUT2_229_N from J2 via T9 +set_property -dict {LOC G2 } [get_ports {dac_vout_p[2]}] ;# DAC_VOUT1_229_P from J3 via T2 +set_property -dict {LOC G1 } [get_ports {dac_vout_n[2]}] ;# DAC_VOUT1_229_N from J3 via T2 +set_property -dict {LOC J2 } [get_ports {dac_vout_p[3]}] ;# DAC_VOUT0_229_P from J4 via T10 +set_property -dict {LOC J1 } [get_ports {dac_vout_n[3]}] ;# DAC_VOUT0_229_N from J4 via T10 +set_property -dict {LOC L2 } [get_ports {dac_vout_p[4]}] ;# DAC_VOUT3_228_P from J5 via T3 +set_property -dict {LOC L1 } [get_ports {dac_vout_n[4]}] ;# DAC_VOUT3_228_N from J5 via T3 +set_property -dict {LOC N2 } [get_ports {dac_vout_p[5]}] ;# DAC_VOUT2_228_P from J6 via T11 +set_property -dict {LOC N1 } [get_ports {dac_vout_n[5]}] ;# DAC_VOUT2_228_N from J6 via T11 +set_property -dict {LOC R2 } [get_ports {dac_vout_p[6]}] ;# DAC_VOUT1_228_P from J7 via T4 +set_property -dict {LOC R1 } [get_ports {dac_vout_n[6]}] ;# DAC_VOUT1_228_N from J7 via T4 +set_property -dict {LOC U2 } [get_ports {dac_vout_p[7]}] ;# DAC_VOUT0_228_P from J8 via T12 +set_property -dict {LOC U1 } [get_ports {dac_vout_n[7]}] ;# DAC_VOUT0_228_N from J8 via T12 + +#set_property -dict {LOC R5 } [get_ports {dac_refclk_0_p}] ;# DAC_228_REFCLK_P from U65.23 RFoutAP +#set_property -dict {LOC R4 } [get_ports {dac_refclk_0_n}] ;# DAC_228_REFCLK_N from U65.22 RFoutAN +set_property -dict {LOC N5 } [get_ports {dac_refclk_1_p}] ;# DAC_229_REFCLK_P from U65.19 RFoutBP +set_property -dict {LOC N4 } [get_ports {dac_refclk_1_n}] ;# DAC_229_REFCLK_N from U65.18 RFoutBN + +set_property -dict {LOC U5 } [get_ports {rfdc_sysref_p}] ;# SYSREF_P_228 from U2.1 CLKout0_P +set_property -dict {LOC U4 } [get_ports {rfdc_sysref_n}] ;# SYSREF_N_228 from U2.2 CLKout0_N diff --git a/src/eth/example/HTG_ZRF8/fpga/fpga_r2.xdc b/src/eth/example/HTG_ZRF8/fpga/fpga_r2.xdc new file mode 100644 index 0000000..5f742fa --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/fpga_r2.xdc @@ -0,0 +1,527 @@ +# SPDX-License-Identifier: MIT +# +# Copyright (c) 2025 FPGA Ninja, LLC +# +# Authors: +# - Alex Forencich +# + +# XDC constraints for the HiTech Global HTG-ZRF8-R2 board +# part: xczu28dr-ffvg1517-2-e +# part: xczu48dr-ffvg1517-2-e + +# General configuration +set_property BITSTREAM.GENERAL.COMPRESS true [current_design] + +# System clocks +# DDR4 clocks from U48 (300 MHz) +#set_property -dict {LOC G13 IOSTANDARD DIFF_SSTL12} [get_ports sys_clk_ddr4_p] ;# U48.28 OUT1_P +#set_property -dict {LOC G12 IOSTANDARD DIFF_SSTL12} [get_ports sys_clk_ddr4_n] ;# U48.27 OUT1_N +#create_clock -period 3.333 -name sys_clk_ddr4 [get_ports sys_clk_ddr4_p] + +# User clock 1 from U48 (200 MHz) +set_property -dict {LOC C8 IOSTANDARD LVDS_25} [get_ports clk_pl_user1_p] ;# U48.24 OUT0_P +set_property -dict {LOC C7 IOSTANDARD LVDS_25} [get_ports clk_pl_user1_n] ;# U48.23 OUT0_N +create_clock -period 5.000 -name clk_pl_user1 [get_ports clk_pl_user1_p] + +# Source pin is in an HDIO bank, so it must be routed to an MMCM via a BUFG +set_property CLOCK_DEDICATED_ROUTE ANY_CMT_COLUMN [get_nets clk_pl_user1_bufg] + +# User clock 2 from U48 (200 MHz) +#set_property -dict {LOC AM15 IOSTANDARD LVDS} [get_ports clk_pl_user2_p] ;# U48.42 OUT5_P +#set_property -dict {LOC AN15 IOSTANDARD LVDS} [get_ports clk_pl_user2_n] ;# U48.41 OUT5_N +#create_clock -period 5.000 -name clk_pl_user2 [get_ports clk_pl_user2_p] + +# PLL refclk from U78 (250 MHz) +set_property -dict {LOC AV6 IOSTANDARD LVDS_25} [get_ports fpga_refclk_p] ;# U78.51 CLKout8_P +set_property -dict {LOC AV5 IOSTANDARD LVDS_25} [get_ports fpga_refclk_n] ;# U78.52 CLKout8_N +create_clock -period 4.000 -name fpga_refclk [get_ports fpga_refclk_p] + +# Source pin is in an HDIO bank, so it must be routed to an MMCM via a BUFG +set_property CLOCK_DEDICATED_ROUTE ANY_CMT_COLUMN [get_nets fpga_refclk_int fpga_refclk_bufg_inst_n_0] + +# PLL sysref from U78 +set_property -dict {LOC AP20 IOSTANDARD LVDS} [get_ports fpga_sysref_p] ;# U78.22 CLKout5_P +set_property -dict {LOC AP19 IOSTANDARD LVDS} [get_ports fpga_sysref_n] ;# U78.23 CLKout5_N +create_clock -period 100.000 -name fpga_sysref [get_ports fpga_sysref_p] + +# PLL control +set_property -dict {LOC AU4 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {clk_fdec}] +set_property -dict {LOC AV2 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {clk_finc}] +set_property -dict {LOC AU1 IOSTANDARD LVCMOS33} [get_ports {clk_intr_n}] +set_property -dict {LOC AV3 IOSTANDARD LVCMOS33} [get_ports {clk_lol_n}] +set_property -dict {LOC AU3 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {clk_sync_n}] +set_property -dict {LOC AU2 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {clk_rst_n}] + +set_property -dict {LOC AW6 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {lmk_rst}] +set_property -dict {LOC AW4 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {lmk_clkin_s[0]}] +set_property -dict {LOC AW3 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {lmk_clkin_s[1]}] + +set_false_path -to [get_ports {clk_fdec clk_finc clk_sync_n clk_rst_n}] +set_output_delay 0 [get_ports {clk_fdec clk_finc clk_sync_n clk_rst_n}] +set_false_path -from [get_ports {clk_intr_n clk_lol_n}] +set_input_delay 0 [get_ports {clk_intr_n clk_lol_n}] + +set_false_path -to [get_ports {lmk_rst}] +set_output_delay 0 [get_ports {lmk_rst}] + +# LEDs +set_property -dict {LOC A6 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {led[0]}] ;# D10 +set_property -dict {LOC C6 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {led[1]}] ;# D9 +set_property -dict {LOC D6 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {led[2]}] ;# D8 +set_property -dict {LOC E6 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports {led[3]}] ;# D7 + +set_false_path -to [get_ports {led[*]}] +set_output_delay 0 [get_ports {led[*]}] + +# Push buttons +set_property -dict {LOC AT5 IOSTANDARD LVCMOS33} [get_ports {btn}] ;# PB3 + +set_false_path -from [get_ports {btn}] +set_input_delay 0 [get_ports {btn}] + +# DIP switches +set_property -dict {LOC D20 IOSTANDARD LVCMOS12} [get_ports {sw[0]}] ;# S1.1 +set_property -dict {LOC A25 IOSTANDARD LVCMOS12} [get_ports {sw[1]}] ;# S1.2 +set_property -dict {LOC B23 IOSTANDARD LVCMOS12} [get_ports {sw[2]}] ;# S1.3 +set_property -dict {LOC D19 IOSTANDARD LVCMOS12} [get_ports {sw[3]}] ;# S1.4 + +set_false_path -from [get_ports {sw[*]}] +set_input_delay 0 [get_ports {sw[*]}] + +# Trace +#set_property -dict {LOC AR16 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[0]}] ;# J22.38 +#set_property -dict {LOC AN17 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[1]}] ;# J22.28 +#set_property -dict {LOC AM17 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[2]}] ;# J22.26 +#set_property -dict {LOC AF16 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[3]}] ;# J22.24 +#set_property -dict {LOC AP14 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[4]}] ;# J22.22 +#set_property -dict {LOC AR14 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[5]}] ;# J22.20 +#set_property -dict {LOC AT13 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[6]}] ;# J22.18 +#set_property -dict {LOC AT15 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[7]}] ;# J22.16 +#set_property -dict {LOC AN16 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[8]}] ;# J22.37 +#set_property -dict {LOC AK17 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[9]}] ;# J22.35 +#set_property -dict {LOC AR13 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[10]}] ;# J22.33 +#set_property -dict {LOC AU13 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[11]}] ;# J22.31 +#set_property -dict {LOC AK16 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[12]}] ;# J22.29 +#set_property -dict {LOC AL15 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[13]}] ;# J22.27 +#set_property -dict {LOC AH14 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[14]}] ;# J22.25 +#set_property -dict {LOC AJ16 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_data[15]}] ;# J22.23 +#set_property -dict {LOC AL16 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_clk}] ;# J22.6 +#set_property -dict {LOC AT16 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_tdi}] ;# J22.19 +#set_property -dict {LOC AH16 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_tdo}] ;# J22.11 +#set_property -dict {LOC AF17 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_tms}] ;# J22.17 +#set_property -dict {LOC AG17 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_tck}] ;# J22.15 +#set_property -dict {LOC AL17 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_rtck}] ;# J22.13 +#set_property -dict {LOC AJ15 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_dbgrq}] ;# J22.7 +#set_property -dict {LOC AU14 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_dbgack}] ;# J22.8 +#set_property -dict {LOC AP15 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_trst_b}] ;# J22.21 +#set_property -dict {LOC AH15 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_srst_b}] ;# J22.9 +#set_property -dict {LOC AP16 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_ctl}] ;# J22.36 +#set_property -dict {LOC AU15 IOSTANDARD LVCMOS18 SLEW FAST DRIVE 8} [get_ports {trace_exttrig}] ;# J22.10 + +#set_false_path -to [get_ports {trace_data trace_clk trace_tdi trace_tdo trace_tms trace_tck trace_rtck trace_dbgrq trace_dbgack trace_rst_b trace_ctl trace_exttrig[*]}] +#set_output_delay 0 [get_ports {trace_data trace_clk trace_tdi trace_tdo trace_tms trace_tck trace_rtck trace_dbgrq trace_dbgack trace_rst_b trace_ctl trace_exttrig[*]}] + +# UART +set_property -dict {LOC AU8 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports uart_rxd] +set_property -dict {LOC AV8 IOSTANDARD LVCMOS33} [get_ports uart_txd] +set_property -dict {LOC AV7 IOSTANDARD LVCMOS33} [get_ports uart_rts] +set_property -dict {LOC AU7 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports uart_cts] +set_property -dict {LOC AT7 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports uart_rst_n] +set_property -dict {LOC AR7 IOSTANDARD LVCMOS33} [get_ports uart_suspend_n] + +set_false_path -to [get_ports {uart_rxd uart_cts uart_rst_n}] +set_output_delay 0 [get_ports {uart_rxd uart_cts uart_rst_n}] +set_false_path -from [get_ports {uart_txd uart_rts uart_suspend_n}] +set_input_delay 0 [get_ports {uart_txd uart_rts uart_suspend_n}] + +# I2C +set_property -dict {LOC E9 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports i2c_scl] +set_property -dict {LOC E8 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports i2c_sda] +set_property -dict {LOC D10 IOSTANDARD LVCMOS33 SLEW SLOW DRIVE 8} [get_ports i2c_rst_n] + +set_false_path -to [get_ports {i2c_sda i2c_scl i2c_rst_n}] +set_output_delay 0 [get_ports {i2c_sda i2c_scl i2c_rst_n}] +set_false_path -from [get_ports {i2c_sda i2c_scl}] +set_input_delay 0 [get_ports {i2c_sda i2c_scl}] + +# DDR4 SODIMM +#set_property -dict {LOC F11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[0]}] +#set_property -dict {LOC C13 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[1]}] +#set_property -dict {LOC F14 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[2]}] +#set_property -dict {LOC F10 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[3]}] +#set_property -dict {LOC E11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[4]}] +#set_property -dict {LOC E13 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[5]}] +#set_property -dict {LOC B13 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[6]}] +#set_property -dict {LOC E12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[7]}] +#set_property -dict {LOC A11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[8]}] +#set_property -dict {LOC C12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[9]}] +#set_property -dict {LOC K13 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[10]}] +#set_property -dict {LOC C15 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[11]}] +#set_property -dict {LOC C11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[12]}] +#set_property -dict {LOC K10 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[13]}] +#set_property -dict {LOC B14 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[14]}] +#set_property -dict {LOC H12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[15]}] +#set_property -dict {LOC K12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_a[16]}] + +#set_property -dict {LOC B15 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_act_n}] +#set_property -dict {LOC D14 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_alert_n}] + +#set_property -dict {LOC H13 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_ba[0]}] +#set_property -dict {LOC A14 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_ba[1]}] +#set_property -dict {LOC B12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_bg[0]}] +#set_property -dict {LOC D11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_bg[1]}] + +#set_property -dict {LOC A12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_cke[0]}] +#set_property -dict {LOC A15 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_cke[1]}] +#set_property -dict {LOC J11 IOSTANDARD DIFF_SSTL2_DCI} [get_ports {ddr4_ck_t[0]}] +#set_property -dict {LOC J10 IOSTANDARD DIFF_SSTL2_DCI} [get_ports {ddr4_ck_c[0]}] +#set_property -dict {LOC J14 IOSTANDARD DIFF_SSTL2_DCI} [get_ports {ddr4_ck_t[1]}] +#set_property -dict {LOC J13 IOSTANDARD DIFF_SSTL2_DCI} [get_ports {ddr4_ck_c[1]}] +#set_property -dict {LOC H10 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_cs_n[0]}] +#set_property -dict {LOC E14 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_cs_n[1]}] +#set_property -dict {LOC K11 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_cs_n[2]}] +#set_property -dict {LOC F12 IOSTANDARD SSTL12_DCI} [get_ports {ddr4_cs_n[3]}] + +#set_property -dict {LOC M12 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[0]}] +#set_property -dict {LOC M13 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[1]}] +#set_property -dict {LOC N15 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[2]}] +#set_property -dict {LOC M17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[3]}] +#set_property -dict {LOC L12 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[4]}] +#set_property -dict {LOC N13 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[5]}] +#set_property -dict {LOC M15 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[6]}] +#set_property -dict {LOC N17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[7]}] +#set_property -dict {LOC K17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[8]}] +#set_property -dict {LOC L17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[9]}] +#set_property -dict {LOC J19 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[10]}] +#set_property -dict {LOC H16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[11]}] +#set_property -dict {LOC J16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[12]}] +#set_property -dict {LOC K16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[13]}] +#set_property -dict {LOC H17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[14]}] +#set_property -dict {LOC J18 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[15]}] +#set_property -dict {LOC E16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[16]}] +#set_property -dict {LOC F15 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[17]}] +#set_property -dict {LOC E17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[18]}] +#set_property -dict {LOC H18 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[19]}] +#set_property -dict {LOC F16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[20]}] +#set_property -dict {LOC G15 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[21]}] +#set_property -dict {LOC E18 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[22]}] +#set_property -dict {LOC G18 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[23]}] +#set_property -dict {LOC C16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[24]}] +#set_property -dict {LOC D15 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[25]}] +#set_property -dict {LOC C17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[26]}] +#set_property -dict {LOC A19 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[27]}] +#set_property -dict {LOC A16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[28]}] +#set_property -dict {LOC D16 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[29]}] +#set_property -dict {LOC A17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[30]}] +#set_property -dict {LOC B19 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[31]}] +#set_property -dict {LOC H23 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[32]}] +#set_property -dict {LOC J21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[33]}] +#set_property -dict {LOC H22 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[34]}] +#set_property -dict {LOC K24 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[35]}] +#set_property -dict {LOC G23 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[36]}] +#set_property -dict {LOC H21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[37]}] +#set_property -dict {LOC G22 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[38]}] +#set_property -dict {LOC L24 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[39]}] +#set_property -dict {LOC E21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[40]}] +#set_property -dict {LOC F20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[41]}] +#set_property -dict {LOC E23 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[42]}] +#set_property -dict {LOC F24 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[43]}] +#set_property -dict {LOC D21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[44]}] +#set_property -dict {LOC E22 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[45]}] +#set_property -dict {LOC E24 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[46]}] +#set_property -dict {LOC G20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[47]}] +#set_property -dict {LOC C20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[48]}] +#set_property -dict {LOC A20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[49]}] +#set_property -dict {LOC B24 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[50]}] +#set_property -dict {LOC C21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[51]}] +#set_property -dict {LOC B20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[52]}] +#set_property -dict {LOC A21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[53]}] +#set_property -dict {LOC C22 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[54]}] +#set_property -dict {LOC A24 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[55]}] +#set_property -dict {LOC L19 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[56]}] +#set_property -dict {LOC L21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[57]}] +#set_property -dict {LOC L23 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[58]}] +#set_property -dict {LOC N19 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[59]}] +#set_property -dict {LOC L20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[60]}] +#set_property -dict {LOC M19 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[61]}] +#set_property -dict {LOC L22 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[62]}] +#set_property -dict {LOC M20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[63]}] +#set_property -dict {LOC F9 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[64]}] +#set_property -dict {LOC G7 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[65]}] +#set_property -dict {LOC H6 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[66]}] +#set_property -dict {LOC G6 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[67]}] +#set_property -dict {LOC G9 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[68]}] +#set_property -dict {LOC H7 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[69]}] +#set_property -dict {LOC K9 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[70]}] +#set_property -dict {LOC J9 IOSTANDARD POD12_DCI} [get_ports {ddr4_dq[71]}] + +#set_property -dict {LOC L15 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[0]}] +#set_property -dict {LOC L14 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[0]}] +#set_property -dict {LOC K19 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[1]}] +#set_property -dict {LOC K18 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[1]}] +#set_property -dict {LOC G19 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[2]}] +#set_property -dict {LOC F19 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[2]}] +#set_property -dict {LOC B18 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[3]}] +#set_property -dict {LOC B17 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[3]}] +#set_property -dict {LOC J20 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[4]}] +#set_property -dict {LOC H20 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[4]}] +#set_property -dict {LOC D23 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[5]}] +#set_property -dict {LOC D24 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[5]}] +#set_property -dict {LOC B22 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[6]}] +#set_property -dict {LOC A22 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[6]}] +#set_property -dict {LOC K21 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[7]}] +#set_property -dict {LOC K22 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[7]}] +#set_property -dict {LOC H8 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_t[8]}] +#set_property -dict {LOC G8 IOSTANDARD DIFF_POD12} [get_ports {ddr4_dqs_c[8]}] + +#set_property -dict {LOC N14 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[0]}] +#set_property -dict {LOC J15 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[1]}] +#set_property -dict {LOC G17 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[2]}] +#set_property -dict {LOC D18 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[3]}] +#set_property -dict {LOC J23 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[4]}] +#set_property -dict {LOC F21 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[5]}] +#set_property -dict {LOC C23 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[6]}] +#set_property -dict {LOC N20 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[7]}] +#set_property -dict {LOC J8 IOSTANDARD POD12_DCI} [get_ports {ddr4_dm_dbi_n[8]}] + +#set_property -dict {LOC J7 IOSTANDARD LVCMOS12} [get_ports {ddr4_odt[0]}] +#set_property -dict {LOC H11 IOSTANDARD LVCMOS12} [get_ports {ddr4_odt[1]}] +#set_property -dict {LOC D13 IOSTANDARD LVCMOS12} [get_ports {ddr4_rst_n}] +#set_property -dict {LOC G10 IOSTANDARD LVCMOS12} [get_ports {ddr4_par}] +#set_property -dict {LOC G14 IOSTANDARD LVCMOS12} [get_ports {ddr4_event_n}] + +# PCIe Interface +#set_property -dict {LOC J33 } [get_ports {pcie_tx_p[0]}] ;# MGTYTXP3_129 GTYE4_CHANNEL_X0Y7 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC J34 } [get_ports {pcie_tx_n[0]}] ;# MGTYTXN3_129 GTYE4_CHANNEL_X0Y7 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC K36 } [get_ports {pcie_rx_p[0]}] ;# MGTYRXP3_129 GTYE4_CHANNEL_X0Y7 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC K37 } [get_ports {pcie_rx_n[0]}] ;# MGTYRXN3_129 GTYE4_CHANNEL_X0Y7 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC L33 } [get_ports {pcie_tx_p[1]}] ;# MGTYTXP2_129 GTYE4_CHANNEL_X0Y6 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC L34 } [get_ports {pcie_tx_n[1]}] ;# MGTYTXN2_129 GTYE4_CHANNEL_X0Y6 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC L38 } [get_ports {pcie_rx_p[1]}] ;# MGTYRXP2_129 GTYE4_CHANNEL_X0Y6 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC L39 } [get_ports {pcie_rx_n[1]}] ;# MGTYRXN2_129 GTYE4_CHANNEL_X0Y6 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC N33 } [get_ports {pcie_tx_p[2]}] ;# MGTYTXP1_129 GTYE4_CHANNEL_X0Y5 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC N34 } [get_ports {pcie_tx_n[2]}] ;# MGTYTXN1_129 GTYE4_CHANNEL_X0Y5 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC M36 } [get_ports {pcie_rx_p[2]}] ;# MGTYRXP1_129 GTYE4_CHANNEL_X0Y5 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC M37 } [get_ports {pcie_rx_n[2]}] ;# MGTYRXN1_129 GTYE4_CHANNEL_X0Y5 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC P35 } [get_ports {pcie_tx_p[3]}] ;# MGTYTXP0_129 GTYE4_CHANNEL_X0Y4 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC P36 } [get_ports {pcie_tx_n[3]}] ;# MGTYTXN0_129 GTYE4_CHANNEL_X0Y4 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC N38 } [get_ports {pcie_rx_p[3]}] ;# MGTYRXP0_129 GTYE4_CHANNEL_X0Y4 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC N39 } [get_ports {pcie_rx_n[3]}] ;# MGTYRXN0_129 GTYE4_CHANNEL_X0Y4 / GTYE4_COMMON_X0Y1 +#set_property -dict {LOC R33 } [get_ports {pcie_tx_p[4]}] ;# MGTYTXP3_128 GTYE4_CHANNEL_X0Y3 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC R34 } [get_ports {pcie_tx_n[4]}] ;# MGTYTXN3_128 GTYE4_CHANNEL_X0Y3 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC R38 } [get_ports {pcie_rx_p[4]}] ;# MGTYRXP3_128 GTYE4_CHANNEL_X0Y3 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC R39 } [get_ports {pcie_rx_n[4]}] ;# MGTYRXN3_128 GTYE4_CHANNEL_X0Y3 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC T35 } [get_ports {pcie_tx_p[5]}] ;# MGTYTXP2_128 GTYE4_CHANNEL_X0Y2 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC T36 } [get_ports {pcie_tx_n[5]}] ;# MGTYTXN2_128 GTYE4_CHANNEL_X0Y2 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC U38 } [get_ports {pcie_rx_p[5]}] ;# MGTYRXP2_128 GTYE4_CHANNEL_X0Y2 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC U39 } [get_ports {pcie_rx_n[5]}] ;# MGTYRXN2_128 GTYE4_CHANNEL_X0Y2 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC V35 } [get_ports {pcie_tx_p[6]}] ;# MGTYTXP1_128 GTYE4_CHANNEL_X0Y1 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC V36 } [get_ports {pcie_tx_n[6]}] ;# MGTYTXN1_128 GTYE4_CHANNEL_X0Y1 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC W38 } [get_ports {pcie_rx_p[6]}] ;# MGTYRXP1_128 GTYE4_CHANNEL_X0Y1 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC W39 } [get_ports {pcie_rx_n[6]}] ;# MGTYRXN1_128 GTYE4_CHANNEL_X0Y1 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC Y35 } [get_ports {pcie_tx_p[7]}] ;# MGTYTXP0_128 GTYE4_CHANNEL_X0Y0 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC Y36 } [get_ports {pcie_tx_n[7]}] ;# MGTYTXN0_128 GTYE4_CHANNEL_X0Y0 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC AA38} [get_ports {pcie_rx_p[7]}] ;# MGTYRXP0_128 GTYE4_CHANNEL_X0Y0 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC AA39} [get_ports {pcie_rx_n[7]}] ;# MGTYRXN0_128 GTYE4_CHANNEL_X0Y0 / GTYE4_COMMON_X0Y0 +#set_property -dict {LOC AA33} [get_ports pcie_refclk_p] ;# MGTREFCLK0P_128 +#set_property -dict {LOC AA34} [get_ports pcie_refclk_n] ;# MGTREFCLK0N_128 +#set_property -dict {LOC AJ13 IOSTANDARD LVCMOS18 PULLUP true} [get_ports pcie_reset_n] + +#set_false_path -from [get_ports {pcie_reset_n}] +#set_input_delay 0 [get_ports {pcie_reset_n}] + +# 100 MHz MGT reference clock +#create_clock -period 10 -name pcie_mgt_refclk [get_ports pcie_refclk_p] + +# FMC+ J25 + +# for HTG-FMC-QSFP28-DEG90 +set_property -dict {LOC AJ12 IOSTANDARD LVCMOS18} [get_ports {fmc_qsfp_resetl}] ;# J25.G33 LA31_P +set_property -dict {LOC AK12 IOSTANDARD LVCMOS18} [get_ports {fmc_qsfp_modsell}] ;# J25.G34 LA31_N +set_property -dict {LOC AL7 IOSTANDARD LVCMOS18} [get_ports {fmc_qsfp_lpmode}] ;# J25.H38 LA32_N + +#set_property -dict {LOC AP18 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[0]}] ;# J25.G9 LA00_P_CC +#set_property -dict {LOC AR18 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[0]}] ;# J25.G10 LA00_N_CC +#set_property -dict {LOC AM20 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[1]}] ;# J25.D8 LA01_P_CC +#set_property -dict {LOC AN20 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[1]}] ;# J25.D9 LA01_N_CC +#set_property -dict {LOC AR22 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[2]}] ;# J25.H7 LA02_P +#set_property -dict {LOC AT22 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[2]}] ;# J25.H8 LA02_N +#set_property -dict {LOC AR21 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[3]}] ;# J25.G12 LA03_P +#set_property -dict {LOC AT21 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[3]}] ;# J25.G13 LA03_N +#set_property -dict {LOC AV21 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[4]}] ;# J25.H10 LA04_P +#set_property -dict {LOC AW21 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[4]}] ;# J25.H11 LA04_N +#set_property -dict {LOC AK22 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[5]}] ;# J25.D11 LA05_P +#set_property -dict {LOC AK21 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[5]}] ;# J25.D12 LA05_N +#set_property -dict {LOC AU18 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[6]}] ;# J25.C10 LA06_P +#set_property -dict {LOC AV18 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[6]}] ;# J25.C11 LA06_N +#set_property -dict {LOC AL21 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[7]}] ;# J25.H13 LA07_P +#set_property -dict {LOC AL20 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[7]}] ;# J25.H14 LA07_N +#set_property -dict {LOC AL22 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[8]}] ;# J25.G12 LA08_P +#set_property -dict {LOC AM22 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[8]}] ;# J25.G13 LA08_N +#set_property -dict {LOC AR19 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[9]}] ;# J25.D14 LA09_P +#set_property -dict {LOC AT19 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[9]}] ;# J25.D15 LA09_N +#set_property -dict {LOC AU17 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[10]}] ;# J25.C14 LA10_P +#set_property -dict {LOC AV17 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[10]}] ;# J25.C15 LA10_N +#set_property -dict {LOC AL19 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[11]}] ;# J25.H16 LA11_P +#set_property -dict {LOC AM19 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[11]}] ;# J25.H17 LA11_N +#set_property -dict {LOC AG20 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[12]}] ;# J25.G15 LA12_P +#set_property -dict {LOC AH20 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[12]}] ;# J25.G16 LA12_N +#set_property -dict {LOC AJ20 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[13]}] ;# J25.D17 LA13_P +#set_property -dict {LOC AJ19 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[13]}] ;# J25.D18 LA13_N +#set_property -dict {LOC AJ18 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[14]}] ;# J25.C18 LA14_P +#set_property -dict {LOC AK18 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[14]}] ;# J25.C19 LA14_N +#set_property -dict {LOC AR17 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[15]}] ;# J25.H19 LA15_P +#set_property -dict {LOC AT17 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[15]}] ;# J25.H20 LA15_N +#set_property -dict {LOC AG18 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[16]}] ;# J25.G18 LA16_P +#set_property -dict {LOC AH18 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[16]}] ;# J25.G19 LA16_N +#set_property -dict {LOC AP8 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[17]}] ;# J25.D20 LA17_P_CC +#set_property -dict {LOC AR8 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[17]}] ;# J25.D21 LA17_N_CC +#set_property -dict {LOC AP9 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[18]}] ;# J25.C22 LA18_P_CC +#set_property -dict {LOC AR9 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[18]}] ;# J25.C23 LA18_N_CC +#set_property -dict {LOC AU12 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[19]}] ;# J25.H22 LA19_P +#set_property -dict {LOC AV12 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[19]}] ;# J25.H23 LA19_N +#set_property -dict {LOC AW9 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[20]}] ;# J25.G21 LA20_P +#set_property -dict {LOC AW8 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[20]}] ;# J25.G22 LA20_N +#set_property -dict {LOC AM13 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[21]}] ;# J25.H25 LA21_P +#set_property -dict {LOC AN13 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[21]}] ;# J25.H26 LA21_N +#set_property -dict {LOC AT10 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[22]}] ;# J25.G24 LA22_P +#set_property -dict {LOC AU10 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[22]}] ;# J25.G25 LA22_N +#set_property -dict {LOC AV11 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[23]}] ;# J25.D23 LA23_P +#set_property -dict {LOC AW11 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[23]}] ;# J25.D24 LA23_N +#set_property -dict {LOC AN8 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[24]}] ;# J25.H28 LA24_P +#set_property -dict {LOC AN7 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[24]}] ;# J25.H29 LA24_N +#set_property -dict {LOC AL14 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[25]}] ;# J25.G27 LA25_P +#set_property -dict {LOC AM14 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[25]}] ;# J25.G28 LA25_N +#set_property -dict {LOC AM12 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[26]}] ;# J25.D26 LA26_P +#set_property -dict {LOC AN12 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[26]}] ;# J25.D27 LA26_N +#set_property -dict {LOC AR12 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[27]}] ;# J25.C26 LA27_P +#set_property -dict {LOC AR11 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[27]}] ;# J25.C27 LA27_N +#set_property -dict {LOC AL10 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[28]}] ;# J25.H31 LA28_P +#set_property -dict {LOC AM10 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[28]}] ;# J25.H32 LA28_N +#set_property -dict {LOC AJ14 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[29]}] ;# J25.G30 LA29_P +#set_property -dict {LOC AK14 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[29]}] ;# J25.G31 LA29_N +#set_property -dict {LOC AG12 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[30]}] ;# J25.H34 LA30_P +#set_property -dict {LOC AH12 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[30]}] ;# J25.H35 LA30_N +#set_property -dict {LOC AJ12 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[31]}] ;# J25.G33 LA31_P +#set_property -dict {LOC AK12 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[31]}] ;# J25.G34 LA31_N +#set_property -dict {LOC AL8 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[32]}] ;# J25.H37 LA32_P +#set_property -dict {LOC AL7 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[32]}] ;# J25.H38 LA32_N +#set_property -dict {LOC AL9 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_p[33]}] ;# J25.G36 LA33_P +#set_property -dict {LOC AM9 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_la_n[33]}] ;# J25.G37 LA33_N + +#set_property -dict {LOC AN21 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_clk0_m2c_p}] ;# J25.H4 CLK0_M2C_P +#set_property -dict {LOC AP21 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_clk0_m2c_n}] ;# J25.H5 CLK0_M2C_N + +#set_property -dict {LOC AN11 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_refclk_m2c_p}] ;# J25.L24 REFCLK_M2C_P +#set_property -dict {LOC AP11 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_refclk_m2c_n}] ;# J25.L25 REFCLK_M2C_N +#set_property -dict {LOC AV10 IOSTANDARD LVDS } [get_ports {fmc_sync_c2m_p}] ;# J25.L16 SYNC_C2M_P +#set_property -dict {LOC AW10 IOSTANDARD LVDS } [get_ports {fmc_sync_c2m_n}] ;# J25.L17 SYNC_C2M_N +#set_property -dict {LOC AN10 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_sync_m2c_p}] ;# J25.L28 SYNC_M2C_P +#set_property -dict {LOC AP10 IOSTANDARD LVDS DIFF_TERM_ADV TERM_100} [get_ports {fmc_sync_m2c_n}] ;# J25.L29 SYNC_M2C_N + +#set_property -dict {LOC A10 IOSTANDARD LVCMOS18} [get_ports {fmc_pg_m2c}] ;# J25.F1 PG_M2C +#set_property -dict {LOC C10 IOSTANDARD LVCMOS12} [get_ports {fmc_prsnt_m2c_l}] ;# J25.H2 PRSNT_M2C_L +#set_property -dict {LOC B10 IOSTANDARD LVCMOS12} [get_ports {fmc_hspc_prsnt_m2c_l}] ;# J25.Z1 HSPC_PRSNT_M2C_L + +set_property -dict {LOC E33 } [get_ports {fmc_dp_c2m_p[0]}] ;# MGTYTXP3_130 GTYE4_CHANNEL_X0Y41 / GTYE4_COMMON_X0Y10 from J25.C2 DP0_C2M_P +set_property -dict {LOC E34 } [get_ports {fmc_dp_c2m_n[0]}] ;# MGTYTXN3_130 GTYE4_CHANNEL_X0Y41 / GTYE4_COMMON_X0Y10 from J25.C3 DP0_C2M_N +set_property -dict {LOC F36 } [get_ports {fmc_dp_m2c_p[0]}] ;# MGTYRXP3_130 GTYE4_CHANNEL_X0Y41 / GTYE4_COMMON_X0Y10 from J25.C6 DP0_M2C_P +set_property -dict {LOC F37 } [get_ports {fmc_dp_m2c_n[0]}] ;# MGTYRXN3_130 GTYE4_CHANNEL_X0Y41 / GTYE4_COMMON_X0Y10 from J25.C7 DP0_M2C_N +set_property -dict {LOC H31 } [get_ports {fmc_dp_c2m_p[1]}] ;# MGTYTXP0_130 GTYE4_CHANNEL_X0Y43 / GTYE4_COMMON_X0Y10 from J25.A22 DP1_C2M_P +set_property -dict {LOC H32 } [get_ports {fmc_dp_c2m_n[1]}] ;# MGTYTXN0_130 GTYE4_CHANNEL_X0Y43 / GTYE4_COMMON_X0Y10 from J25.A23 DP1_C2M_N +set_property -dict {LOC J38 } [get_ports {fmc_dp_m2c_p[1]}] ;# MGTYRXP0_130 GTYE4_CHANNEL_X0Y43 / GTYE4_COMMON_X0Y10 from J25.A2 DP1_M2C_P +set_property -dict {LOC J39 } [get_ports {fmc_dp_m2c_n[1]}] ;# MGTYRXN0_130 GTYE4_CHANNEL_X0Y43 / GTYE4_COMMON_X0Y10 from J25.A3 DP1_M2C_N +set_property -dict {LOC G33 } [get_ports {fmc_dp_c2m_p[2]}] ;# MGTYTXP1_130 GTYE4_CHANNEL_X0Y42 / GTYE4_COMMON_X0Y10 from J25.A26 DP2_C2M_P +set_property -dict {LOC G34 } [get_ports {fmc_dp_c2m_n[2]}] ;# MGTYTXN1_130 GTYE4_CHANNEL_X0Y42 / GTYE4_COMMON_X0Y10 from J25.A27 DP2_C2M_N +set_property -dict {LOC H36 } [get_ports {fmc_dp_m2c_p[2]}] ;# MGTYRXP1_130 GTYE4_CHANNEL_X0Y42 / GTYE4_COMMON_X0Y10 from J25.A6 DP2_M2C_P +set_property -dict {LOC H37 } [get_ports {fmc_dp_m2c_n[2]}] ;# MGTYRXN1_130 GTYE4_CHANNEL_X0Y42 / GTYE4_COMMON_X0Y10 from J25.A7 DP2_M2C_N +set_property -dict {LOC F31 } [get_ports {fmc_dp_c2m_p[3]}] ;# MGTYTXP2_130 GTYE4_CHANNEL_X0Y40 / GTYE4_COMMON_X0Y10 from J25.A30 DP3_C2M_P +set_property -dict {LOC F32 } [get_ports {fmc_dp_c2m_n[3]}] ;# MGTYTXN2_130 GTYE4_CHANNEL_X0Y40 / GTYE4_COMMON_X0Y10 from J25.A31 DP3_C2M_N +set_property -dict {LOC G38 } [get_ports {fmc_dp_m2c_p[3]}] ;# MGTYRXP2_130 GTYE4_CHANNEL_X0Y40 / GTYE4_COMMON_X0Y10 from J25.A10 DP3_M2C_P +set_property -dict {LOC G39 } [get_ports {fmc_dp_m2c_n[3]}] ;# MGTYRXN2_130 GTYE4_CHANNEL_X0Y40 / GTYE4_COMMON_X0Y10 from J25.A11 DP3_M2C_N +set_property -dict {LOC U33 } [get_ports fmc_mgt_refclk_0_0_p] ;# MGTREFCLK0P_130 from U48.38 OUT4_P +set_property -dict {LOC U34 } [get_ports fmc_mgt_refclk_0_0_n] ;# MGTREFCLK0N_130 from U48.37 OUT4_N +#set_property -dict {LOC T31 } [get_ports fmc_mgt_refclk_0_1_p] ;# MGTREFCLK1P_130 from J25.D4 GBTCLK0_M2C_P +#set_property -dict {LOC T32 } [get_ports fmc_mgt_refclk_0_1_n] ;# MGTREFCLK1N_130 from J25.D5 GBTCLK0_M2C_N + +# reference clock +create_clock -period 6.206 -name fmc_mgt_refclk_0_0 [get_ports fmc_mgt_refclk_0_0_p] +#create_clock -period 6.400 -name fmc_mgt_refclk_0_1 [get_ports fmc_mgt_refclk_0_1_p] + +set_property -dict {LOC C33 } [get_ports {fmc_dp_c2m_p[4]}] ;# MGTYTXP1_131 GTYE4_CHANNEL_X0Y38 / GTYE4_COMMON_X0Y9 from J25.A34 DP4_C2M_P +set_property -dict {LOC C34 } [get_ports {fmc_dp_c2m_n[4]}] ;# MGTYTXN1_131 GTYE4_CHANNEL_X0Y38 / GTYE4_COMMON_X0Y9 from J25.A35 DP4_C2M_N +set_property -dict {LOC D36 } [get_ports {fmc_dp_m2c_p[4]}] ;# MGTYRXP1_131 GTYE4_CHANNEL_X0Y38 / GTYE4_COMMON_X0Y9 from J25.A14 DP4_M2C_P +set_property -dict {LOC D37 } [get_ports {fmc_dp_m2c_n[4]}] ;# MGTYRXN1_131 GTYE4_CHANNEL_X0Y38 / GTYE4_COMMON_X0Y9 from J25.A15 DP4_M2C_N +set_property -dict {LOC A33 } [get_ports {fmc_dp_c2m_p[5]}] ;# MGTYTXP3_131 GTYE4_CHANNEL_X0Y36 / GTYE4_COMMON_X0Y9 from J25.A38 DP5_C2M_P +set_property -dict {LOC A34 } [get_ports {fmc_dp_c2m_n[5]}] ;# MGTYTXN3_131 GTYE4_CHANNEL_X0Y36 / GTYE4_COMMON_X0Y9 from J25.A39 DP5_C2M_N +set_property -dict {LOC B36 } [get_ports {fmc_dp_m2c_p[5]}] ;# MGTYRXP3_131 GTYE4_CHANNEL_X0Y36 / GTYE4_COMMON_X0Y9 from J25.A18 DP5_M2C_P +set_property -dict {LOC B37 } [get_ports {fmc_dp_m2c_n[5]}] ;# MGTYRXN3_131 GTYE4_CHANNEL_X0Y36 / GTYE4_COMMON_X0Y9 from J25.A19 DP5_M2C_N +set_property -dict {LOC B31 } [get_ports {fmc_dp_c2m_p[6]}] ;# MGTYTXP2_131 GTYE4_CHANNEL_X0Y37 / GTYE4_COMMON_X0Y9 from J25.B36 DP6_C2M_P +set_property -dict {LOC B32 } [get_ports {fmc_dp_c2m_n[6]}] ;# MGTYTXN2_131 GTYE4_CHANNEL_X0Y37 / GTYE4_COMMON_X0Y9 from J25.B37 DP6_C2M_N +set_property -dict {LOC C38 } [get_ports {fmc_dp_m2c_p[6]}] ;# MGTYRXP2_131 GTYE4_CHANNEL_X0Y37 / GTYE4_COMMON_X0Y9 from J25.B16 DP6_M2C_P +set_property -dict {LOC C39 } [get_ports {fmc_dp_m2c_n[6]}] ;# MGTYRXN2_131 GTYE4_CHANNEL_X0Y37 / GTYE4_COMMON_X0Y9 from J25.B17 DP6_M2C_N +set_property -dict {LOC D31 } [get_ports {fmc_dp_c2m_p[7]}] ;# MGTYTXP0_131 GTYE4_CHANNEL_X0Y39 / GTYE4_COMMON_X0Y9 from J25.B32 DP7_C2M_P +set_property -dict {LOC D32 } [get_ports {fmc_dp_c2m_n[7]}] ;# MGTYTXN0_131 GTYE4_CHANNEL_X0Y39 / GTYE4_COMMON_X0Y9 from J25.B33 DP7_C2M_N +set_property -dict {LOC E38 } [get_ports {fmc_dp_m2c_p[7]}] ;# MGTYRXP0_131 GTYE4_CHANNEL_X0Y39 / GTYE4_COMMON_X0Y9 from J25.B12 DP7_M2C_P +set_property -dict {LOC E39 } [get_ports {fmc_dp_m2c_n[7]}] ;# MGTYRXN0_131 GTYE4_CHANNEL_X0Y39 / GTYE4_COMMON_X0Y9 from J25.B13 DP7_M2C_N +set_property -dict {LOC P31 } [get_ports fmc_mgt_refclk_1_0_p] ;# MGTREFCLK0P_131 from U48.35 OUT3_P +set_property -dict {LOC P32 } [get_ports fmc_mgt_refclk_1_0_n] ;# MGTREFCLK0N_131 from U48.34 OUT3_N +#set_property -dict {LOC M31 } [get_ports fmc_mgt_refclk_1_1_p] ;# MGTREFCLK1P_131 from J25.B20 GBTCLK1_M2C_P +#set_property -dict {LOC M32 } [get_ports fmc_mgt_refclk_1_1_n] ;# MGTREFCLK1N_131 from J25.B21 GBTCLK1_M2C_N + +# reference clock +create_clock -period 6.206 -name fmc_mgt_refclk_1_0 [get_ports fmc_mgt_refclk_1_0_p] +#create_clock -period 6.400 -name fmc_mgt_refclk_1_1 [get_ports fmc_mgt_refclk_1_1_p] + +# RFDC +set_property -dict {LOC Y2 } [get_ports {adc_vin_p[0]}] ;# ADC_VIN_I23_227_P from J7 (RA) via T5 +set_property -dict {LOC Y1 } [get_ports {adc_vin_n[0]}] ;# ADC_VIN_I23_227_N from J7 (RA) via T5 +set_property -dict {LOC AB2 } [get_ports {adc_vin_p[1]}] ;# ADC_VIN_I01_227_P from J17 (V) via T13 +set_property -dict {LOC AB1 } [get_ports {adc_vin_n[1]}] ;# ADC_VIN_I01_227_N from J17 (V) via T13 +set_property -dict {LOC AD2 } [get_ports {adc_vin_p[2]}] ;# ADC_VIN_I23_226_P from J8 (RA) via T6 +set_property -dict {LOC AD1 } [get_ports {adc_vin_n[2]}] ;# ADC_VIN_I23_226_N from J8 (RA) via T6 +set_property -dict {LOC AF2 } [get_ports {adc_vin_p[3]}] ;# ADC_VIN_I01_226_P from J18 (V) via T14 +set_property -dict {LOC AF1 } [get_ports {adc_vin_n[3]}] ;# ADC_VIN_I01_226_N from J18 (V) via T14 +set_property -dict {LOC AH2 } [get_ports {adc_vin_p[4]}] ;# ADC_VIN_I23_225_P from J9 (RA) via T7 +set_property -dict {LOC AH1 } [get_ports {adc_vin_n[4]}] ;# ADC_VIN_I23_225_N from J9 (RA) via T7 +set_property -dict {LOC AK2 } [get_ports {adc_vin_p[5]}] ;# ADC_VIN_I01_225_P from J19 (V) via T15 +set_property -dict {LOC AK1 } [get_ports {adc_vin_n[5]}] ;# ADC_VIN_I01_225_N from J19 (V) via T15 +set_property -dict {LOC AM2 } [get_ports {adc_vin_p[6]}] ;# ADC_VIN_I23_224_P from J10 (RA) via T8 +set_property -dict {LOC AM1 } [get_ports {adc_vin_n[6]}] ;# ADC_VIN_I23_224_N from J10 (RA) via T8 +set_property -dict {LOC AP2 } [get_ports {adc_vin_p[7]}] ;# ADC_VIN_I01_224_P from J20 (V) via T16 +set_property -dict {LOC AP1 } [get_ports {adc_vin_n[7]}] ;# ADC_VIN_I01_224_N from J20 (V) via T16 + +set_property -dict {LOC AF5 } [get_ports {adc_refclk_0_p}] ;# ADC_224_REFCLK_P from U83.23 RFoutAP +set_property -dict {LOC AF4 } [get_ports {adc_refclk_0_n}] ;# ADC_224_REFCLK_N from U83.22 RFoutAN +set_property -dict {LOC AD5 } [get_ports {adc_refclk_1_p}] ;# ADC_225_REFCLK_P from U83.19 RFoutBP +set_property -dict {LOC AD4 } [get_ports {adc_refclk_1_n}] ;# ADC_225_REFCLK_N from U83.18 RFoutBN +set_property -dict {LOC AB5 } [get_ports {adc_refclk_2_p}] ;# ADC_226_REFCLK_P from U82.23 RFoutAP +set_property -dict {LOC AB4 } [get_ports {adc_refclk_2_n}] ;# ADC_226_REFCLK_N from U82.22 RFoutAN +set_property -dict {LOC Y5 } [get_ports {adc_refclk_3_p}] ;# ADC_227_REFCLK_P from U82.19 RFoutBP +set_property -dict {LOC Y4 } [get_ports {adc_refclk_3_n}] ;# ADC_227_REFCLK_N from U82.18 RFoutBN + +set_property -dict {LOC C2 } [get_ports {dac_vout_p[0]}] ;# DAC_VOUT3_229_P from J3 (RA) via T1 +set_property -dict {LOC C1 } [get_ports {dac_vout_n[0]}] ;# DAC_VOUT3_229_N from J3 (RA) via T1 +set_property -dict {LOC E2 } [get_ports {dac_vout_p[1]}] ;# DAC_VOUT2_229_P from J13 (V) via T9 +set_property -dict {LOC E1 } [get_ports {dac_vout_n[1]}] ;# DAC_VOUT2_229_N from J13 (V) via T9 +set_property -dict {LOC G2 } [get_ports {dac_vout_p[2]}] ;# DAC_VOUT1_229_P from J4 (RA) via T2 +set_property -dict {LOC G1 } [get_ports {dac_vout_n[2]}] ;# DAC_VOUT1_229_N from J4 (RA) via T2 +set_property -dict {LOC J2 } [get_ports {dac_vout_p[3]}] ;# DAC_VOUT0_229_P from J14 (V) via T10 +set_property -dict {LOC J1 } [get_ports {dac_vout_n[3]}] ;# DAC_VOUT0_229_N from J14 (V) via T10 +set_property -dict {LOC L2 } [get_ports {dac_vout_p[4]}] ;# DAC_VOUT3_228_P from J5 (RA) via T3 +set_property -dict {LOC L1 } [get_ports {dac_vout_n[4]}] ;# DAC_VOUT3_228_N from J5 (RA) via T3 +set_property -dict {LOC N2 } [get_ports {dac_vout_p[5]}] ;# DAC_VOUT2_228_P from J15 (V) via T11 +set_property -dict {LOC N1 } [get_ports {dac_vout_n[5]}] ;# DAC_VOUT2_228_N from J15 (V) via T11 +set_property -dict {LOC R2 } [get_ports {dac_vout_p[6]}] ;# DAC_VOUT1_228_P from J6 (RA) via T4 +set_property -dict {LOC R1 } [get_ports {dac_vout_n[6]}] ;# DAC_VOUT1_228_N from J6 (RA) via T4 +set_property -dict {LOC U2 } [get_ports {dac_vout_p[7]}] ;# DAC_VOUT0_228_P from J16 (V) via T12 +set_property -dict {LOC U1 } [get_ports {dac_vout_n[7]}] ;# DAC_VOUT0_228_N from J16 (V) via T12 + +#set_property -dict {LOC R5 } [get_ports {dac_refclk_0_p}] ;# DAC_228_REFCLK_P from U81.23 RFoutAP +#set_property -dict {LOC R4 } [get_ports {dac_refclk_0_n}] ;# DAC_228_REFCLK_N from U81.22 RFoutAN +set_property -dict {LOC N5 } [get_ports {dac_refclk_1_p}] ;# DAC_229_REFCLK_P from U81.19 RFoutBP +set_property -dict {LOC N4 } [get_ports {dac_refclk_1_n}] ;# DAC_229_REFCLK_N from U81.18 RFoutBN + +set_property -dict {LOC U5 } [get_ports {rfdc_sysref_p}] ;# SYSREF_P_228 from U2.1 CLKout0_P +set_property -dict {LOC U4 } [get_ports {rfdc_sysref_n}] ;# SYSREF_N_228 from U2.2 CLKout0_N diff --git a/src/eth/example/HTG_ZRF8/fpga/ip/usp_rfdc_1ghz_1gsps.tcl b/src/eth/example/HTG_ZRF8/fpga/ip/usp_rfdc_1ghz_1gsps.tcl new file mode 100644 index 0000000..0556e55 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/ip/usp_rfdc_1ghz_1gsps.tcl @@ -0,0 +1,182 @@ + +create_ip -name usp_rf_data_converter -vendor xilinx.com -library ip -module_name usp_rfdc_0 + +set ADC_RATE {1.0} +set ADC_REFCLK_FREQ {1000.000} +set ADC_OUTCLK_FREQ {62.500} +set ADC_FABRIC_FREQ {250.000} +set ADC_DATA_WIDTH {4} + +set DAC_RATE $ADC_RATE +set DAC_REFCLK_FREQ $ADC_REFCLK_FREQ +set DAC_OUTCLK_FREQ $ADC_OUTCLK_FREQ +set DAC_FABRIC_FREQ $ADC_FABRIC_FREQ +set DAC_DATA_WIDTH $ADC_DATA_WIDTH +set DAC_VOP {40.5} + +set_property -dict [list \ + CONFIG.Axiclk_Freq {125} \ + CONFIG.DAC_VOP_RTS {true} \ + CONFIG.ADC0_Sampling_Rate $ADC_RATE \ + CONFIG.ADC0_Refclk_Freq $ADC_REFCLK_FREQ \ + CONFIG.ADC0_Outclk_Freq $ADC_OUTCLK_FREQ \ + CONFIG.ADC0_Fabric_Freq $ADC_FABRIC_FREQ \ + CONFIG.ADC_Data_Width00 $ADC_DATA_WIDTH \ + CONFIG.ADC_Data_Width01 $ADC_DATA_WIDTH \ + CONFIG.ADC_Slice02_Enable {true} \ + CONFIG.ADC_Decimation_Mode02 {1} \ + CONFIG.ADC_Mixer_Type02 {1} \ + CONFIG.ADC_Data_Width02 $ADC_DATA_WIDTH \ + CONFIG.ADC_Coarse_Mixer_Freq02 {3} \ + CONFIG.ADC_Slice03_Enable {true} \ + CONFIG.ADC_Decimation_Mode03 {1} \ + CONFIG.ADC_Mixer_Type03 {1} \ + CONFIG.ADC_Data_Width03 $ADC_DATA_WIDTH \ + CONFIG.ADC_Coarse_Mixer_Freq03 {3} \ + CONFIG.ADC1_Enable {1} \ + CONFIG.ADC1_Sampling_Rate $ADC_RATE \ + CONFIG.ADC1_Refclk_Freq $ADC_REFCLK_FREQ \ + CONFIG.ADC1_Outclk_Freq $ADC_OUTCLK_FREQ \ + CONFIG.ADC1_Fabric_Freq $ADC_FABRIC_FREQ \ + CONFIG.ADC_Slice10_Enable {true} \ + CONFIG.ADC_Decimation_Mode10 {1} \ + CONFIG.ADC_Mixer_Type10 {1} \ + CONFIG.ADC_Data_Width10 $ADC_DATA_WIDTH \ + CONFIG.ADC_Coarse_Mixer_Freq10 {3} \ + CONFIG.ADC_Slice11_Enable {true} \ + CONFIG.ADC_Decimation_Mode11 {1} \ + CONFIG.ADC_Mixer_Type11 {1} \ + CONFIG.ADC_Data_Width11 $ADC_DATA_WIDTH \ + CONFIG.ADC_Coarse_Mixer_Freq11 {3} \ + CONFIG.ADC_Slice12_Enable {true} \ + CONFIG.ADC_Decimation_Mode12 {1} \ + CONFIG.ADC_Mixer_Type12 {1} \ + CONFIG.ADC_Data_Width12 $ADC_DATA_WIDTH \ + CONFIG.ADC_Coarse_Mixer_Freq12 {3} \ + CONFIG.ADC_OBS12 {0} \ + CONFIG.ADC_Slice13_Enable {true} \ + CONFIG.ADC_Decimation_Mode13 {1} \ + CONFIG.ADC_Mixer_Type13 {1} \ + CONFIG.ADC_Data_Width13 $ADC_DATA_WIDTH \ + CONFIG.ADC_Coarse_Mixer_Freq13 {3} \ + CONFIG.ADC2_Enable {1} \ + CONFIG.ADC2_Sampling_Rate $ADC_RATE \ + CONFIG.ADC2_Refclk_Freq $ADC_REFCLK_FREQ \ + CONFIG.ADC2_Outclk_Freq $ADC_OUTCLK_FREQ \ + CONFIG.ADC2_Fabric_Freq $ADC_FABRIC_FREQ \ + CONFIG.ADC_Slice20_Enable {true} \ + CONFIG.ADC_Decimation_Mode20 {1} \ + CONFIG.ADC_Mixer_Type20 {1} \ + CONFIG.ADC_Data_Width20 $ADC_DATA_WIDTH \ + CONFIG.ADC_Coarse_Mixer_Freq20 {3} \ + CONFIG.ADC_Slice21_Enable {true} \ + CONFIG.ADC_Decimation_Mode21 {1} \ + CONFIG.ADC_Mixer_Type21 {1} \ + CONFIG.ADC_Data_Width21 $ADC_DATA_WIDTH \ + CONFIG.ADC_Coarse_Mixer_Freq21 {3} \ + CONFIG.ADC_Slice22_Enable {true} \ + CONFIG.ADC_Decimation_Mode22 {1} \ + CONFIG.ADC_Mixer_Type22 {1} \ + CONFIG.ADC_Data_Width22 $ADC_DATA_WIDTH \ + CONFIG.ADC_Coarse_Mixer_Freq22 {3} \ + CONFIG.ADC_OBS22 {0} \ + CONFIG.ADC_Slice23_Enable {true} \ + CONFIG.ADC_Decimation_Mode23 {1} \ + CONFIG.ADC_Mixer_Type23 {1} \ + CONFIG.ADC_Data_Width23 $ADC_DATA_WIDTH \ + CONFIG.ADC_Coarse_Mixer_Freq23 {3} \ + CONFIG.ADC3_Enable {1} \ + CONFIG.ADC3_Sampling_Rate $ADC_RATE \ + CONFIG.ADC3_Refclk_Freq $ADC_REFCLK_FREQ \ + CONFIG.ADC3_Outclk_Freq $ADC_OUTCLK_FREQ \ + CONFIG.ADC3_Fabric_Freq $ADC_FABRIC_FREQ \ + CONFIG.ADC_Slice30_Enable {true} \ + CONFIG.ADC_Decimation_Mode30 {1} \ + CONFIG.ADC_Mixer_Type30 {1} \ + CONFIG.ADC_Data_Width30 $ADC_DATA_WIDTH \ + CONFIG.ADC_Coarse_Mixer_Freq30 {3} \ + CONFIG.ADC_Slice31_Enable {true} \ + CONFIG.ADC_Decimation_Mode31 {1} \ + CONFIG.ADC_Mixer_Type31 {1} \ + CONFIG.ADC_Data_Width31 $ADC_DATA_WIDTH \ + CONFIG.ADC_Coarse_Mixer_Freq31 {3} \ + CONFIG.ADC_Slice32_Enable {true} \ + CONFIG.ADC_Decimation_Mode32 {1} \ + CONFIG.ADC_Mixer_Type32 {1} \ + CONFIG.ADC_Data_Width32 $ADC_DATA_WIDTH \ + CONFIG.ADC_Coarse_Mixer_Freq32 {3} \ + CONFIG.ADC_OBS32 {0} \ + CONFIG.ADC_Slice33_Enable {true} \ + CONFIG.ADC_Decimation_Mode33 {1} \ + CONFIG.ADC_Mixer_Type33 {1} \ + CONFIG.ADC_Data_Width33 $ADC_DATA_WIDTH \ + CONFIG.ADC_Coarse_Mixer_Freq33 {3} \ + CONFIG.ADC_DSA_RTS {true} \ + CONFIG.DAC0_Enable {1} \ + CONFIG.DAC0_Sampling_Rate $DAC_RATE \ + CONFIG.DAC0_Refclk_Freq $DAC_REFCLK_FREQ \ + CONFIG.DAC0_Outclk_Freq $DAC_OUTCLK_FREQ \ + CONFIG.DAC0_Fabric_Freq $DAC_FABRIC_FREQ \ + CONFIG.DAC0_Clock_Source {6} \ + CONFIG.DAC0_VOP $DAC_VOP \ + CONFIG.DAC_Slice00_Enable {true} \ + CONFIG.DAC_Data_Width00 $DAC_DATA_WIDTH \ + CONFIG.DAC_Interpolation_Mode00 {1} \ + CONFIG.DAC_Mixer_Type00 {1} \ + CONFIG.DAC_Coarse_Mixer_Freq00 {3} \ + CONFIG.DAC_Slice02_Enable {true} \ + CONFIG.DAC_Data_Width02 $DAC_DATA_WIDTH \ + CONFIG.DAC_Interpolation_Mode02 {1} \ + CONFIG.DAC_Mixer_Type02 {1} \ + CONFIG.DAC_Coarse_Mixer_Freq02 {3} \ + CONFIG.DAC1_Enable {1} \ + CONFIG.DAC1_Sampling_Rate $DAC_RATE \ + CONFIG.DAC1_Refclk_Freq $DAC_REFCLK_FREQ \ + CONFIG.DAC1_Outclk_Freq $DAC_OUTCLK_FREQ \ + CONFIG.DAC1_Fabric_Freq $DAC_FABRIC_FREQ \ + CONFIG.DAC1_VOP $DAC_VOP \ + CONFIG.DAC_Slice10_Enable {true} \ + CONFIG.DAC_Data_Width10 $DAC_DATA_WIDTH \ + CONFIG.DAC_Interpolation_Mode10 {1} \ + CONFIG.DAC_Mixer_Type10 {1} \ + CONFIG.DAC_Coarse_Mixer_Freq10 {3} \ + CONFIG.DAC_Slice12_Enable {true} \ + CONFIG.DAC_Data_Width12 $DAC_DATA_WIDTH \ + CONFIG.DAC_Interpolation_Mode12 {1} \ + CONFIG.DAC_Mixer_Type12 {1} \ + CONFIG.DAC_Coarse_Mixer_Freq12 {3} \ + CONFIG.DAC2_Enable {1} \ + CONFIG.DAC2_Sampling_Rate $DAC_RATE \ + CONFIG.DAC2_Refclk_Freq $DAC_REFCLK_FREQ \ + CONFIG.DAC2_Outclk_Freq $DAC_OUTCLK_FREQ \ + CONFIG.DAC2_Fabric_Freq $DAC_FABRIC_FREQ \ + CONFIG.DAC2_Clock_Dist {1} \ + CONFIG.DAC2_VOP $DAC_VOP \ + CONFIG.DAC_Slice20_Enable {true} \ + CONFIG.DAC_Data_Width20 $DAC_DATA_WIDTH \ + CONFIG.DAC_Interpolation_Mode20 {1} \ + CONFIG.DAC_Mixer_Type20 {1} \ + CONFIG.DAC_Coarse_Mixer_Freq20 {3} \ + CONFIG.DAC_Slice22_Enable {true} \ + CONFIG.DAC_Data_Width22 $DAC_DATA_WIDTH \ + CONFIG.DAC_Interpolation_Mode22 {1} \ + CONFIG.DAC_Mixer_Type22 {1} \ + CONFIG.DAC_Coarse_Mixer_Freq22 {3} \ + CONFIG.DAC3_Enable {1} \ + CONFIG.DAC3_Sampling_Rate $DAC_RATE \ + CONFIG.DAC3_Refclk_Freq $DAC_REFCLK_FREQ \ + CONFIG.DAC3_Outclk_Freq $DAC_OUTCLK_FREQ \ + CONFIG.DAC3_Fabric_Freq $DAC_FABRIC_FREQ \ + CONFIG.DAC3_Clock_Source {6} \ + CONFIG.DAC3_VOP $DAC_VOP \ + CONFIG.DAC_Slice30_Enable {true} \ + CONFIG.DAC_Data_Width30 $DAC_DATA_WIDTH \ + CONFIG.DAC_Interpolation_Mode30 {1} \ + CONFIG.DAC_Mixer_Type30 {1} \ + CONFIG.DAC_Coarse_Mixer_Freq30 {3} \ + CONFIG.DAC_Slice32_Enable {true} \ + CONFIG.DAC_Data_Width32 $DAC_DATA_WIDTH \ + CONFIG.DAC_Interpolation_Mode32 {1} \ + CONFIG.DAC_Mixer_Type32 {1} \ + CONFIG.DAC_Coarse_Mixer_Freq32 {3} \ +] [get_ips usp_rfdc_0] diff --git a/src/eth/example/HTG_ZRF8/fpga/lib/taxi b/src/eth/example/HTG_ZRF8/fpga/lib/taxi new file mode 120000 index 0000000..477cbaa --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/lib/taxi @@ -0,0 +1 @@ +../../../../../../ \ No newline at end of file diff --git a/src/eth/example/HTG_ZRF8/fpga/pll/HTG-ZRF8-EM-161-ZRF8EM01-Registers.txt b/src/eth/example/HTG_ZRF8/fpga/pll/HTG-ZRF8-EM-161-ZRF8EM01-Registers.txt new file mode 100755 index 0000000..bb4dd5f --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/pll/HTG-ZRF8-EM-161-ZRF8EM01-Registers.txt @@ -0,0 +1,412 @@ +# Si534x/7x/8x/9x Registers Script +# +# Part: Si5341 +# Project File: X:\Projects\taxi\src\eth\example\HTG_ZRF8\fpga\pll\HTG-ZRF8-EM-161-ZRF8EM01.slabtimeproj +# Design ID: ZRF8EM01 +# Includes Pre/Post Download Control Register Writes: Yes +# Die Revision: B1 +# Creator: ClockBuilder Pro v4.1 [2021-09-22] +# Created On: 2025-09-02 08:11:56 GMT-07:00 +Address,Data +# +# Start configuration preamble +0x0B24,0xC0 +0x0B25,0x00 +# Rev D stuck divider fix +0x0502,0x01 +0x0505,0x03 +0x0957,0x17 +0x0B4E,0x1A +# End configuration preamble +# +# Delay 300 msec +# Delay is worst case time for device to complete any calibration +# that is running due to device state change previous to this script +# being processed. +# +# Start configuration registers +0x0006,0x00 +0x0007,0x00 +0x0008,0x00 +0x000B,0x74 +0x0017,0xD0 +0x0018,0xFF +0x0021,0x0F +0x0022,0x00 +0x002B,0x02 +0x002C,0x20 +0x002D,0x00 +0x002E,0x00 +0x002F,0x00 +0x0030,0x00 +0x0031,0x00 +0x0032,0x00 +0x0033,0x00 +0x0034,0x00 +0x0035,0x00 +0x0036,0x00 +0x0037,0x00 +0x0038,0x00 +0x0039,0x00 +0x003A,0x00 +0x003B,0x00 +0x003C,0x00 +0x003D,0x00 +0x0041,0x00 +0x0042,0x00 +0x0043,0x00 +0x0044,0x00 +0x009E,0x00 +0x0102,0x01 +0x0108,0x02 +0x0109,0x09 +0x010A,0x33 +0x010B,0x08 +0x010D,0x02 +0x010E,0x09 +0x010F,0x33 +0x0110,0x0A +0x0112,0x02 +0x0113,0x09 +0x0114,0x33 +0x0115,0x0B +0x0117,0x06 +0x0118,0x09 +0x0119,0x33 +0x011A,0x09 +0x011C,0x02 +0x011D,0x09 +0x011E,0x33 +0x011F,0x0B +0x0121,0x02 +0x0122,0x09 +0x0123,0x33 +0x0124,0x08 +0x0126,0x02 +0x0127,0x09 +0x0128,0x33 +0x0129,0x08 +0x012B,0x02 +0x012C,0x09 +0x012D,0x33 +0x012E,0x0A +0x0130,0x02 +0x0131,0x09 +0x0132,0x33 +0x0133,0x0A +0x013A,0x02 +0x013B,0x09 +0x013C,0x33 +0x013D,0x0A +0x013F,0x00 +0x0140,0x00 +0x0141,0x40 +0x0206,0x00 +0x0208,0x00 +0x0209,0x00 +0x020A,0x00 +0x020B,0x00 +0x020C,0x00 +0x020D,0x00 +0x020E,0x00 +0x020F,0x00 +0x0210,0x00 +0x0211,0x00 +0x0212,0x00 +0x0213,0x00 +0x0214,0x00 +0x0215,0x00 +0x0216,0x00 +0x0217,0x00 +0x0218,0x00 +0x0219,0x00 +0x021A,0x00 +0x021B,0x00 +0x021C,0x00 +0x021D,0x00 +0x021E,0x00 +0x021F,0x00 +0x0220,0x00 +0x0221,0x00 +0x0222,0x00 +0x0223,0x00 +0x0224,0x00 +0x0225,0x00 +0x0226,0x00 +0x0227,0x00 +0x0228,0x00 +0x0229,0x00 +0x022A,0x00 +0x022B,0x00 +0x022C,0x00 +0x022D,0x00 +0x022E,0x00 +0x022F,0x00 +0x0235,0x00 +0x0236,0x00 +0x0237,0x00 +0x0238,0x00 +0x0239,0x96 +0x023A,0x00 +0x023B,0x00 +0x023C,0x00 +0x023D,0x00 +0x023E,0x80 +0x024A,0x02 +0x024B,0x00 +0x024C,0x00 +0x024D,0x3B +0x024E,0x00 +0x024F,0x00 +0x0250,0x1A +0x0251,0x00 +0x0252,0x00 +0x0253,0x00 +0x0254,0x00 +0x0255,0x00 +0x0256,0x19 +0x0257,0x00 +0x0258,0x00 +0x0259,0x02 +0x025A,0x00 +0x025B,0x00 +0x025C,0x02 +0x025D,0x00 +0x025E,0x00 +0x025F,0x01 +0x0260,0x00 +0x0261,0x00 +0x0262,0x02 +0x0263,0x00 +0x0264,0x00 +0x0268,0x01 +0x0269,0x00 +0x026A,0x00 +0x026B,0x5A +0x026C,0x52 +0x026D,0x46 +0x026E,0x38 +0x026F,0x45 +0x0270,0x4D +0x0271,0x30 +0x0272,0x31 +0x0302,0x00 +0x0303,0x00 +0x0304,0x00 +0x0305,0x00 +0x0306,0x08 +0x0307,0x00 +0x0308,0x00 +0x0309,0x00 +0x030A,0x80 +0x030B,0x89 +0x030C,0x00 +0x030D,0x00 +0x030E,0x00 +0x030F,0x00 +0x0310,0x00 +0x0311,0x24 +0x0312,0x00 +0x0313,0x00 +0x0314,0x00 +0x0315,0x00 +0x0316,0xA0 +0x0317,0x00 +0x0318,0x00 +0x0319,0x00 +0x031A,0x00 +0x031B,0x00 +0x031C,0x06 +0x031D,0x00 +0x031E,0x00 +0x031F,0x00 +0x0320,0x00 +0x0321,0x80 +0x0322,0x00 +0x0323,0x00 +0x0324,0x00 +0x0325,0x00 +0x0326,0x40 +0x0327,0x06 +0x0328,0x00 +0x0329,0x00 +0x032A,0x00 +0x032B,0x00 +0x032C,0x9C +0x032D,0x00 +0x032E,0x00 +0x032F,0x00 +0x0330,0x00 +0x0331,0x00 +0x0332,0x00 +0x0333,0x00 +0x0334,0x00 +0x0335,0x00 +0x0336,0x00 +0x0337,0x00 +0x0338,0x00 +0x0339,0x1F +0x033B,0x00 +0x033C,0x00 +0x033D,0x00 +0x033E,0x00 +0x033F,0x00 +0x0340,0x00 +0x0341,0x00 +0x0342,0x00 +0x0343,0x00 +0x0344,0x00 +0x0345,0x00 +0x0346,0x00 +0x0347,0x00 +0x0348,0x00 +0x0349,0x00 +0x034A,0x00 +0x034B,0x00 +0x034C,0x00 +0x034D,0x00 +0x034E,0x00 +0x034F,0x00 +0x0350,0x00 +0x0351,0x00 +0x0352,0x00 +0x0353,0x00 +0x0354,0x00 +0x0355,0x00 +0x0356,0x00 +0x0357,0x00 +0x0358,0x00 +0x0359,0x00 +0x035A,0x00 +0x035B,0x00 +0x035C,0x00 +0x035D,0x00 +0x035E,0x00 +0x035F,0x00 +0x0360,0x00 +0x0361,0x00 +0x0362,0x00 +0x0802,0x00 +0x0803,0x00 +0x0804,0x00 +0x0805,0x00 +0x0806,0x00 +0x0807,0x00 +0x0808,0x00 +0x0809,0x00 +0x080A,0x00 +0x080B,0x00 +0x080C,0x00 +0x080D,0x00 +0x080E,0x00 +0x080F,0x00 +0x0810,0x00 +0x0811,0x00 +0x0812,0x00 +0x0813,0x00 +0x0814,0x00 +0x0815,0x00 +0x0816,0x00 +0x0817,0x00 +0x0818,0x00 +0x0819,0x00 +0x081A,0x00 +0x081B,0x00 +0x081C,0x00 +0x081D,0x00 +0x081E,0x00 +0x081F,0x00 +0x0820,0x00 +0x0821,0x00 +0x0822,0x00 +0x0823,0x00 +0x0824,0x00 +0x0825,0x00 +0x0826,0x00 +0x0827,0x00 +0x0828,0x00 +0x0829,0x00 +0x082A,0x00 +0x082B,0x00 +0x082C,0x00 +0x082D,0x00 +0x082E,0x00 +0x082F,0x00 +0x0830,0x00 +0x0831,0x00 +0x0832,0x00 +0x0833,0x00 +0x0834,0x00 +0x0835,0x00 +0x0836,0x00 +0x0837,0x00 +0x0838,0x00 +0x0839,0x00 +0x083A,0x00 +0x083B,0x00 +0x083C,0x00 +0x083D,0x00 +0x083E,0x00 +0x083F,0x00 +0x0840,0x00 +0x0841,0x00 +0x0842,0x00 +0x0843,0x00 +0x0844,0x00 +0x0845,0x00 +0x0846,0x00 +0x0847,0x00 +0x0848,0x00 +0x0849,0x00 +0x084A,0x00 +0x084B,0x00 +0x084C,0x00 +0x084D,0x00 +0x084E,0x00 +0x084F,0x00 +0x0850,0x00 +0x0851,0x00 +0x0852,0x00 +0x0853,0x00 +0x0854,0x00 +0x0855,0x00 +0x0856,0x00 +0x0857,0x00 +0x0858,0x00 +0x0859,0x00 +0x085A,0x00 +0x085B,0x00 +0x085C,0x00 +0x085D,0x00 +0x085E,0x00 +0x085F,0x00 +0x0860,0x00 +0x0861,0x00 +0x090E,0x02 +0x091C,0x04 +0x0943,0x01 +0x0949,0x00 +0x094A,0x00 +0x094E,0x49 +0x094F,0x02 +0x095E,0x00 +0x0A02,0x00 +0x0A03,0x0F +0x0A04,0x04 +0x0A05,0x0F +0x0A14,0x00 +0x0A1A,0x00 +0x0A20,0x00 +0x0A26,0x00 +0x0A2C,0x00 +0x0B44,0x0F +0x0B4A,0x10 +0x0B57,0x0E +0x0B58,0x01 +# End configuration registers +# +# Start configuration postamble +0x001C,0x01 +0x0B24,0xC3 +0x0B25,0x02 +# End configuration postamble diff --git a/src/eth/example/HTG_ZRF8/fpga/pll/HTG-ZRF8-EM-161-ZRF8EM01.slabtimeproj b/src/eth/example/HTG_ZRF8/fpga/pll/HTG-ZRF8-EM-161-ZRF8EM01.slabtimeproj new file mode 100755 index 0000000..2fd9594 Binary files /dev/null and b/src/eth/example/HTG_ZRF8/fpga/pll/HTG-ZRF8-EM-161-ZRF8EM01.slabtimeproj differ diff --git a/src/eth/example/HTG_ZRF8/fpga/pll/HTG-ZRF8-R2-161-ZRF8R201-Registers.txt b/src/eth/example/HTG_ZRF8/fpga/pll/HTG-ZRF8-R2-161-ZRF8R201-Registers.txt new file mode 100755 index 0000000..ac14449 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/pll/HTG-ZRF8-R2-161-ZRF8R201-Registers.txt @@ -0,0 +1,412 @@ +# Si534x/7x/8x/9x Registers Script +# +# Part: Si5341 +# Project File: X:\Projects\taxi\src\eth\example\HTG_ZRF8\fpga\pll\HTG-ZRF8-R2-161-ZRF8R201.slabtimeproj +# Design ID: ZRF8R201 +# Includes Pre/Post Download Control Register Writes: Yes +# Die Revision: B1 +# Creator: ClockBuilder Pro v4.1 [2021-09-22] +# Created On: 2025-09-02 08:30:10 GMT-07:00 +Address,Data +# +# Start configuration preamble +0x0B24,0xC0 +0x0B25,0x00 +# Rev D stuck divider fix +0x0502,0x01 +0x0505,0x03 +0x0957,0x17 +0x0B4E,0x1A +# End configuration preamble +# +# Delay 300 msec +# Delay is worst case time for device to complete any calibration +# that is running due to device state change previous to this script +# being processed. +# +# Start configuration registers +0x0006,0x00 +0x0007,0x00 +0x0008,0x00 +0x000B,0x74 +0x0017,0xD0 +0x0018,0xFF +0x0021,0x0F +0x0022,0x00 +0x002B,0x02 +0x002C,0x20 +0x002D,0x00 +0x002E,0x00 +0x002F,0x00 +0x0030,0x00 +0x0031,0x00 +0x0032,0x00 +0x0033,0x00 +0x0034,0x00 +0x0035,0x00 +0x0036,0x00 +0x0037,0x00 +0x0038,0x00 +0x0039,0x00 +0x003A,0x00 +0x003B,0x00 +0x003C,0x00 +0x003D,0x00 +0x0041,0x00 +0x0042,0x00 +0x0043,0x00 +0x0044,0x00 +0x009E,0x00 +0x0102,0x01 +0x0108,0x02 +0x0109,0x09 +0x010A,0x33 +0x010B,0x0A +0x010D,0x02 +0x010E,0x09 +0x010F,0x33 +0x0110,0x0A +0x0112,0x02 +0x0113,0x09 +0x0114,0x33 +0x0115,0x08 +0x0117,0x02 +0x0118,0x09 +0x0119,0x33 +0x011A,0x08 +0x011C,0x02 +0x011D,0x09 +0x011E,0x33 +0x011F,0x08 +0x0121,0x02 +0x0122,0x09 +0x0123,0x33 +0x0124,0x0A +0x0126,0x02 +0x0127,0x09 +0x0128,0x33 +0x0129,0x0B +0x012B,0x02 +0x012C,0x09 +0x012D,0x33 +0x012E,0x0A +0x0130,0x02 +0x0131,0x09 +0x0132,0x33 +0x0133,0x0B +0x013A,0x06 +0x013B,0x09 +0x013C,0x33 +0x013D,0x09 +0x013F,0x00 +0x0140,0x00 +0x0141,0x40 +0x0206,0x00 +0x0208,0x00 +0x0209,0x00 +0x020A,0x00 +0x020B,0x00 +0x020C,0x00 +0x020D,0x00 +0x020E,0x00 +0x020F,0x00 +0x0210,0x00 +0x0211,0x00 +0x0212,0x00 +0x0213,0x00 +0x0214,0x00 +0x0215,0x00 +0x0216,0x00 +0x0217,0x00 +0x0218,0x00 +0x0219,0x00 +0x021A,0x00 +0x021B,0x00 +0x021C,0x00 +0x021D,0x00 +0x021E,0x00 +0x021F,0x00 +0x0220,0x00 +0x0221,0x00 +0x0222,0x00 +0x0223,0x00 +0x0224,0x00 +0x0225,0x00 +0x0226,0x00 +0x0227,0x00 +0x0228,0x00 +0x0229,0x00 +0x022A,0x00 +0x022B,0x00 +0x022C,0x00 +0x022D,0x00 +0x022E,0x00 +0x022F,0x00 +0x0235,0x00 +0x0236,0x00 +0x0237,0x00 +0x0238,0x00 +0x0239,0x96 +0x023A,0x00 +0x023B,0x00 +0x023C,0x00 +0x023D,0x00 +0x023E,0x80 +0x024A,0x02 +0x024B,0x00 +0x024C,0x00 +0x024D,0x01 +0x024E,0x00 +0x024F,0x00 +0x0250,0x02 +0x0251,0x00 +0x0252,0x00 +0x0253,0x02 +0x0254,0x00 +0x0255,0x00 +0x0256,0x02 +0x0257,0x00 +0x0258,0x00 +0x0259,0x02 +0x025A,0x00 +0x025B,0x00 +0x025C,0x19 +0x025D,0x00 +0x025E,0x00 +0x025F,0x3B +0x0260,0x00 +0x0261,0x00 +0x0262,0x1A +0x0263,0x00 +0x0264,0x00 +0x0268,0x00 +0x0269,0x00 +0x026A,0x00 +0x026B,0x5A +0x026C,0x52 +0x026D,0x46 +0x026E,0x38 +0x026F,0x52 +0x0270,0x32 +0x0271,0x30 +0x0272,0x31 +0x0302,0x00 +0x0303,0x00 +0x0304,0x00 +0x0305,0x00 +0x0306,0x08 +0x0307,0x00 +0x0308,0x00 +0x0309,0x00 +0x030A,0x80 +0x030B,0x89 +0x030C,0x00 +0x030D,0x00 +0x030E,0x00 +0x030F,0x00 +0x0310,0x00 +0x0311,0x24 +0x0312,0x00 +0x0313,0x00 +0x0314,0x00 +0x0315,0x00 +0x0316,0xA0 +0x0317,0x00 +0x0318,0x00 +0x0319,0x00 +0x031A,0x00 +0x031B,0x00 +0x031C,0x06 +0x031D,0x00 +0x031E,0x00 +0x031F,0x00 +0x0320,0x00 +0x0321,0x80 +0x0322,0x00 +0x0323,0x00 +0x0324,0x00 +0x0325,0x00 +0x0326,0x40 +0x0327,0x06 +0x0328,0x00 +0x0329,0x00 +0x032A,0x00 +0x032B,0x00 +0x032C,0x9C +0x032D,0x00 +0x032E,0x00 +0x032F,0x00 +0x0330,0x00 +0x0331,0x00 +0x0332,0x00 +0x0333,0x00 +0x0334,0x00 +0x0335,0x00 +0x0336,0x00 +0x0337,0x00 +0x0338,0x00 +0x0339,0x1F +0x033B,0x00 +0x033C,0x00 +0x033D,0x00 +0x033E,0x00 +0x033F,0x00 +0x0340,0x00 +0x0341,0x00 +0x0342,0x00 +0x0343,0x00 +0x0344,0x00 +0x0345,0x00 +0x0346,0x00 +0x0347,0x00 +0x0348,0x00 +0x0349,0x00 +0x034A,0x00 +0x034B,0x00 +0x034C,0x00 +0x034D,0x00 +0x034E,0x00 +0x034F,0x00 +0x0350,0x00 +0x0351,0x00 +0x0352,0x00 +0x0353,0x00 +0x0354,0x00 +0x0355,0x00 +0x0356,0x00 +0x0357,0x00 +0x0358,0x00 +0x0359,0x00 +0x035A,0x00 +0x035B,0x00 +0x035C,0x00 +0x035D,0x00 +0x035E,0x00 +0x035F,0x00 +0x0360,0x00 +0x0361,0x00 +0x0362,0x00 +0x0802,0x00 +0x0803,0x00 +0x0804,0x00 +0x0805,0x00 +0x0806,0x00 +0x0807,0x00 +0x0808,0x00 +0x0809,0x00 +0x080A,0x00 +0x080B,0x00 +0x080C,0x00 +0x080D,0x00 +0x080E,0x00 +0x080F,0x00 +0x0810,0x00 +0x0811,0x00 +0x0812,0x00 +0x0813,0x00 +0x0814,0x00 +0x0815,0x00 +0x0816,0x00 +0x0817,0x00 +0x0818,0x00 +0x0819,0x00 +0x081A,0x00 +0x081B,0x00 +0x081C,0x00 +0x081D,0x00 +0x081E,0x00 +0x081F,0x00 +0x0820,0x00 +0x0821,0x00 +0x0822,0x00 +0x0823,0x00 +0x0824,0x00 +0x0825,0x00 +0x0826,0x00 +0x0827,0x00 +0x0828,0x00 +0x0829,0x00 +0x082A,0x00 +0x082B,0x00 +0x082C,0x00 +0x082D,0x00 +0x082E,0x00 +0x082F,0x00 +0x0830,0x00 +0x0831,0x00 +0x0832,0x00 +0x0833,0x00 +0x0834,0x00 +0x0835,0x00 +0x0836,0x00 +0x0837,0x00 +0x0838,0x00 +0x0839,0x00 +0x083A,0x00 +0x083B,0x00 +0x083C,0x00 +0x083D,0x00 +0x083E,0x00 +0x083F,0x00 +0x0840,0x00 +0x0841,0x00 +0x0842,0x00 +0x0843,0x00 +0x0844,0x00 +0x0845,0x00 +0x0846,0x00 +0x0847,0x00 +0x0848,0x00 +0x0849,0x00 +0x084A,0x00 +0x084B,0x00 +0x084C,0x00 +0x084D,0x00 +0x084E,0x00 +0x084F,0x00 +0x0850,0x00 +0x0851,0x00 +0x0852,0x00 +0x0853,0x00 +0x0854,0x00 +0x0855,0x00 +0x0856,0x00 +0x0857,0x00 +0x0858,0x00 +0x0859,0x00 +0x085A,0x00 +0x085B,0x00 +0x085C,0x00 +0x085D,0x00 +0x085E,0x00 +0x085F,0x00 +0x0860,0x00 +0x0861,0x00 +0x090E,0x02 +0x091C,0x04 +0x0943,0x01 +0x0949,0x00 +0x094A,0x00 +0x094E,0x49 +0x094F,0x02 +0x095E,0x00 +0x0A02,0x00 +0x0A03,0x0F +0x0A04,0x04 +0x0A05,0x0F +0x0A14,0x00 +0x0A1A,0x00 +0x0A20,0x00 +0x0A26,0x00 +0x0A2C,0x00 +0x0B44,0x0F +0x0B4A,0x10 +0x0B57,0x0E +0x0B58,0x01 +# End configuration registers +# +# Start configuration postamble +0x001C,0x01 +0x0B24,0xC3 +0x0B25,0x02 +# End configuration postamble diff --git a/src/eth/example/HTG_ZRF8/fpga/pll/HTG-ZRF8-R2-161-ZRF8R201.slabtimeproj b/src/eth/example/HTG_ZRF8/fpga/pll/HTG-ZRF8-R2-161-ZRF8R201.slabtimeproj new file mode 100755 index 0000000..5b6a3ba Binary files /dev/null and b/src/eth/example/HTG_ZRF8/fpga/pll/HTG-ZRF8-R2-161-ZRF8R201.slabtimeproj differ diff --git a/src/eth/example/HTG_ZRF8/fpga/pll/LMK04832_EM_250.txt b/src/eth/example/HTG_ZRF8/fpga/pll/LMK04832_EM_250.txt new file mode 100644 index 0000000..dc40998 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/pll/LMK04832_EM_250.txt @@ -0,0 +1,270 @@ +# Configuration for LMK04832 PLL on HTG-ZRF8-EM + +# PLL1 +# CLKin0 = 12.2880 MHz TCXO +# CLKin1 = 10 MHz +# CLKin0 R = 768 +# CLKin1 R = 625 +# PFD = in0 / R0 = in1 / R1 = 16 kHz +# N1 = 7680 +# VCO = PFD * N1 = 122.88 MHz +# Ext VCO is 122.88 MHz + +# PLL2 +# 122.88 MHz from ext VCO +# VCO0 range 2440 - 2580 MHz +# VCO1 range 2945 - 3255 MHz +# R2 = 1536 +# P = 2 +# N2 = 15625 +# PFD = 122.88 / R2 = 0.08 +# VCO = PFD * P * N2 = 2500 +# VCO/10 = 250 MHz +# VCO/250 = 10 MHz +# VCO/1280 = 1.953125 MHz + +# CLKout0: DAC 228 SYSREF +# CLKout1: SYNC_IN_PLL1/SYNC_IN_PLL2 +# CLKout2: RF_CLKOUT to Si5341 +# CLKout3: SYNC_IN_PLL3 +# CLKout4: CLK_IN_PLL3 +# CLKout5: NC +# CLKout6: CLK_IN_PLL2 +# CLKout7: NC +# CLKout8: LMK_CLK_OUT SMPM +# CLKout9: NC +# CLKout10: CLK_IN_PLL1 +# CLKout11: NC +# CLKout12: SYSREF_FPGA +# CLKout13: REFCLK_FPGA + +Address,Data + +# Reset +0x000,0x80 + +# Configure outputs + +# DCLK0_1_DIV: 10 (2500/10 = 250) +0x100,0x0a +# DCLK0_1_DDLY: 10 +0x101,0x0a +# CLKout0_1_PD +0x102,0x00 +# CLKout0_SRC_MUX: 1 (sysref) +0x103,0x60 +# CLKout1_SRC_MUX: 1 (sysref) +0x104,0x20 +# SCLK0_1_ADLY: 0 +0x105,0x00 +# SCLK0_1_DDLY: 0 +0x106,0x00 +# CLKout0_FMT: 1 (LVDS) +# CLKout1_FMT: 15 (CMOS norm/norm) +0x107,0xf1 +# DCLK2_3_DIV: 10 (2500/10 = 250) +0x108,0x0a +# DCLK2_3_DDLY: 10 +0x109,0x0a +# CLKout2_3_PD +0x10a,0x00 +# CLKout2_SRC_MUX: 0 (device clock) +0x10b,0x40 +# CLKout3_SRC_MUX: 1 (sysref) +0x10c,0x20 +# SCLK2_3_ADLY: 0 +0x10d,0x00 +# SCLK2_3_DDLY: 0 +0x10e,0x00 +# CLKout2_FMT: 1 (LVDS) +# CLKout3_FMT: 12 (CMOS norm/norm) +0x10f,0xc1 +# DCLK4_5_DIV: 10 (2500/10 = 250) +0x110,0x0a +# DCLK4_5_DDLY: 10 +0x111,0x0a +# CLKout4_5_PD +0x112,0x00 +# CLKout4_SRC_MUX: 0 (device clock) +0x113,0x40 +# CLKout5_SRC_MUX: 1 (sysref) +0x114,0x20 +# SCLK4_5_ADLY: 0 +0x115,0x00 +# SCLK4_5_DDLY: 0 +0x116,0x00 +# CLKout4_FMT: 1 (LVDS) +# CLKout5_FMT: 0 (PD) +0x117,0x01 +# DCLK6_7_DIV: 10 (2500/10 = 250) +0x118,0x0a +# DCLK6_7_DDLY: 10 +0x119,0x0a +# CLKout6_7_PD +0x11a,0x00 +# CLKout6_SRC_MUX: 0 (device clock) +0x11b,0x40 +# CLKout7_SRC_MUX: 1 (sysref) +0x11c,0x20 +# SCLK6_7_ADLY: 0 +0x11d,0x00 +# SCLK6_7_DDLY: 0 +0x11e,0x00 +# CLKout6_FMT: 1 (LVDS) +# CLKout7_FMT: 0 (PD) +0x11f,0x01 +# DCLK8_9_DIV: 250 (2500/250 = 10) +0x120,0xfa +# DCLK8_9_DDLY: 10 +0x121,0x0a +# CLKout8_9_PD +0x122,0x00 +# CLKout8_SRC_MUX: 0 (device clock) +0x123,0x40 +# CLKout9_SRC_MUX: 1 (sysref) +0x124,0x20 +# SCLK8_9_ADLY: 0 +0x125,0x00 +# SCLK8_9_DDLY: 0 +0x126,0x00 +# CLKout8_FMT: 5 (LVPECL 2000 mV) +# CLKout9_FMT: 0 (PD) +0x127,0x05 +# DCLK10_11_DIV: 10 (2500/10 = 250) +0x128,0x0a +# DCLK10_11_DDLY: 10 +0x129,0x0a +# CLKout10_11_PD +0x12a,0x00 +# CLKout10_SRC_MUX: 0 (device clock) +0x12b,0x40 +# CLKout11_SRC_MUX: 1 (sysref) +0x12c,0x20 +# SCLK10_11_ADLY: 0 +0x12d,0x00 +# SCLK10_11_DDLY: 0 +0x12e,0x00 +# CLKout10_FMT: 1 (LVDS) +# CLKout11_FMT: 0 (PD) +0x12f,0x01 +# DCLK12_13_DIV: 10 (2500/10 = 250) +0x130,0x0a +# DCLK12_13_DDLY: 10 +0x131,0x0a +# CLKout12_13_PD +0x132,0x00 +# CLKout12_SRC_MUX: 1 (sysref) +0x133,0x60 +# CLKout13_SRC_MUX: 0 (device clock) +0x134,0x00 +# SCLK12_13_ADLY: 0 +0x135,0x00 +# SCLK12_13_DDLY: 0 +0x136,0x00 +# CLKout12_FMT: 1 (LVDS) +# CLKout13_FMT: 1 (LVDS) +0x137,0x11 + +# configure PLL1 + +# VCO_MUX: VCO0 +# OSCout_FMT: power down +0x138,0x00 +# PLL2_RCLK_MUX: 0 (OSCin) +# PLL2_NCLK_MUX: 0 (prescaler) +# PLL1_NCLK_MUX: 0 (OSCin) +# FB_MUX: 0 +# FB_MUX_EN: 0 +0x13f,0x00 +# release power down +0x140,0x00 +# 0x141,0x00 +# 0x142,0x00 +# 0x143,0x00 +# 0x144,0x00 +# 0x145,0x00 +# enable CLKin0 and CLKin1 with bipolar buffers +0x146,0x18 +# route CLKin0 and CLKin1 to PLL1, enable auto revert +0x147,0x8a +# CLKin_SEL0: input +0x148,0x00 +# CLKin_SEL1: input +0x149,0x00 +# reset mux/type: input +0x14a,0x00 +# auto DAC +0x14b,0x10 +# MAN_DAC +0x14c,0x00 +# DAC trip low: 0 +0x14d,0x00 +# DAC trip high: 63 +# DAC_CLK_MULT: 3 (16384) +0x14e,0xff +# DAC_CLK_CNTR +0x14f,0x7f +# no holdover +0x150,0x00 +# holdover DLD count +#0x151,0x00 +#0x152,0x00 +# CLKin0 R = 768 (0x300) +0x153,0x03 +0x154,0x00 +# CLKin1 R = 625 (0x271) +0x155,0x02 +0x156,0x71 +# CLKin2 R +#0x157,0x00 +#0x158,0x00 +# PLL1 N = 7680 (0x1e00) +0x159,0x1e +0x15a,0x00 +# PLL1_WND_SIZE: 3 +# PLL1_CP_TRI: 0 +# PLL1_CP_POL: 1 +# PLL1_CP_GAIN: 4 +0x15b,0xd4 +# PLL1_DLD_CNT: 32, 0 +0x15c,0x20 +0x15d,0x00 +# HOLDOVER_EXIT_NADJ: 30 +0x15e,0x1e +# PLL1 LD pin: SPI readback +0x15f,0x3b + +# configure PLL2 + +# release PLL2 PD +0x173,0x10 + +# PLL2 R: 1536 (0x600) +0x160,0x06 +0x161,0x00 +# PLL2 P: 2 (2) +# OSCin_FREQ: 1 (63-127) +# 2X: off +0x162,0x44 +# PLL2_N_CAL: 15625 (0x3d09) +0x163,0x00 +0x164,0x3d +0x165,0x09 +# PLL2_N_CAL: 15625 (0x3d09) +0x166,0x00 +0x167,0x3d +0x168,0x09 +# PLL2_WND_SIZE: 2 (1.8 ns) +# PLL2_CP_GAIN: 3 +# PLL2_CP_POL: 0 +# PLL2_CP_TRI: 0 +# PLL2_DLD_EN: 1 +0x169,0x59 +# PLL2_DLD_CNT: 32, 0 +0x16a,0x20 +0x16b,0x00 +# PLL2 LD pin: PLL1+PLL2 DLD +0x16e,0x1b + +# release PLL1 R reset +0x177,0x00 diff --git a/src/eth/example/HTG_ZRF8/fpga/pll/LMK04832_R2_250.txt b/src/eth/example/HTG_ZRF8/fpga/pll/LMK04832_R2_250.txt new file mode 100644 index 0000000..bb2f1fb --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/pll/LMK04832_R2_250.txt @@ -0,0 +1,270 @@ +# Configuration for LMK04832 PLL on HTG-ZRF8-R2 + +# PLL1 +# CLKin0 = 12.2880 MHz TCXO +# CLKin1 = 10 MHz +# CLKin0 R = 768 +# CLKin1 R = 625 +# PFD = in0 / R0 = in1 / R1 = 16 kHz +# N1 = 7680 +# VCO = PFD * N1 = 122.88 MHz +# Ext VCO is 122.88 MHz + +# PLL2 +# 122.88 MHz from ext VCO +# VCO0 range 2440 - 2580 MHz +# VCO1 range 2945 - 3255 MHz +# R2 = 1536 +# P = 2 +# N2 = 15625 +# PFD = 122.88 / R2 = 0.08 +# VCO = PFD * P * N2 = 2500 +# VCO/10 = 250 MHz +# VCO/250 = 10 MHz +# VCO/1280 = 1.953125 MHz + +# CLKout0: LMK_CLK_OUT SMPM +# CLKout1: RF_CLKOUT to Si5341 +# CLKout2: CLK_IN_PLL3 (refclk) +# CLKout3: DAC 228 SYSREF (sysref) +# CLKout4: CLK_IN_PLL2 (refclk) +# CLKout5: SYSREF_FPGA (sysref) +# CLKout6: CLK_IN_PLL1 (refclk) +# CLKout7: NC +# CLKout8: REFCLK_FPGA (refclk) +# CLKout9: NC +# CLKout10: NC +# CLKout11: SYNC_IN_PLL1/SYNC_IN_PLL2 (sysref) +# CLKout12: NC +# CLKout13: SYNC_IN_PLL3 (sysref) + +Address,Data + +# Reset +0x000,0x80 + +# Configure outputs + +# DCLK0_1_DIV: 10 (2500/10 = 250) +0x100,0x0a +# DCLK0_1_DDLY: 10 +0x101,0x0a +# CLKout0_1_PD +0x102,0x00 +# CLKout0_SRC_MUX: 0 (device clock) +0x103,0x40 +# CLKout1_SRC_MUX: 0 (device clock) +0x104,0x00 +# SCLK0_1_ADLY: 0 +0x105,0x00 +# SCLK0_1_DDLY: 0 +0x106,0x00 +# CLKout0_FMT: 5 (LVPECL 2000 mV) +# CLKout1_FMT: 1 (LVDS) +0x107,0x15 +# DCLK2_3_DIV: 10 (2500/10 = 250) +0x108,0x0a +# DCLK2_3_DDLY: 10 +0x109,0x0a +# CLKout2_3_PD +0x10a,0x00 +# CLKout2_SRC_MUX: 0 (device clock) +0x10b,0x40 +# CLKout3_SRC_MUX: 1 (sysref) +0x10c,0x20 +# SCLK2_3_ADLY: 0 +0x10d,0x00 +# SCLK2_3_DDLY: 0 +0x10e,0x00 +# CLKout2_FMT: 1 (LVDS) +# CLKout3_FMT: 1 (LVDS) +0x10f,0x11 +# DCLK4_5_DIV: 10 (2500/10 = 250) +0x110,0x0a +# DCLK4_5_DDLY: 10 +0x111,0x0a +# CLKout4_5_PD +0x112,0x00 +# CLKout4_SRC_MUX: 0 (device clock) +0x113,0x40 +# CLKout5_SRC_MUX: 1 (sysref) +0x114,0x20 +# SCLK4_5_ADLY: 0 +0x115,0x00 +# SCLK4_5_DDLY: 0 +0x116,0x00 +# CLKout4_FMT: 1 (LVDS) +# CLKout5_FMT: 1 (LVDS) +0x117,0x11 +# DCLK6_7_DIV: 10 (2500/10 = 250) +0x118,0x0a +# DCLK6_7_DDLY: 10 +0x119,0x0a +# CLKout6_7_PD +0x11a,0x00 +# CLKout6_SRC_MUX: 0 (device clock) +0x11b,0x40 +# CLKout7_SRC_MUX: 1 (sysref) +0x11c,0x20 +# SCLK6_7_ADLY: 0 +0x11d,0x00 +# SCLK6_7_DDLY: 0 +0x11e,0x00 +# CLKout6_FMT: 1 (LVDS) +# CLKout7_FMT: 0 (PD) +0x11f,0x01 +# DCLK8_9_DIV: 10 (2500/10 = 250) +0x120,0x0a +# DCLK8_9_DDLY: 10 +0x121,0x0a +# CLKout8_9_PD +0x122,0x00 +# CLKout8_SRC_MUX: 0 (device clock) +0x123,0x40 +# CLKout9_SRC_MUX: 1 (sysref) +0x124,0x20 +# SCLK8_9_ADLY: 0 +0x125,0x00 +# SCLK8_9_DDLY: 0 +0x126,0x00 +# CLKout8_FMT: 1 (LVDS) +# CLKout9_FMT: 0 (PD) +0x127,0x01 +# DCLK10_11_DIV: 10 (2500/10 = 250) +0x128,0x0a +# DCLK10_11_DDLY: 10 +0x129,0x0a +# CLKout10_11_PD +0x12a,0x00 +# CLKout10_SRC_MUX: 0 (device clock) +0x12b,0x40 +# CLKout11_SRC_MUX: 1 (sysref) +0x12c,0x20 +# SCLK10_11_ADLY: 0 +0x12d,0x00 +# SCLK10_11_DDLY: 0 +0x12e,0x00 +# CLKout10_FMT: 0 (PD) +# CLKout11_FMT: 15 (CMOS norm/norm) +0x12f,0xf0 +# DCLK12_13_DIV: 10 (2500/10 = 250) +0x130,0x0a +# DCLK12_13_DDLY: 10 +0x131,0x0a +# CLKout12_13_PD +0x132,0x00 +# CLKout12_SRC_MUX: 1 (sysref) +0x133,0x60 +# CLKout13_SRC_MUX: 1 (sysref) +0x134,0x20 +# SCLK12_13_ADLY: 0 +0x135,0x00 +# SCLK12_13_DDLY: 0 +0x136,0x00 +# CLKout12_FMT: 0 (PD) +# CLKout13_FMT: 12 (CMOS norm/norm) +0x137,0xc0 + +# configure PLL1 + +# VCO_MUX: VCO0 +# OSCout_FMT: power down +0x138,0x00 +# PLL2_RCLK_MUX: 0 (OSCin) +# PLL2_NCLK_MUX: 0 (prescaler) +# PLL1_NCLK_MUX: 0 (OSCin) +# FB_MUX: 0 +# FB_MUX_EN: 0 +0x13f,0x00 +# release power down +0x140,0x00 +# 0x141,0x00 +# 0x142,0x00 +# 0x143,0x00 +# 0x144,0x00 +# 0x145,0x00 +# enable CLKin0 and CLKin1 with bipolar buffers +0x146,0x18 +# route CLKin0 and CLKin1 to PLL1, enable auto revert +0x147,0x8a +# CLKin_SEL0: input +0x148,0x00 +# CLKin_SEL1: input +0x149,0x00 +# reset mux/type: input +0x14a,0x00 +# auto DAC +0x14b,0x10 +# MAN_DAC +0x14c,0x00 +# DAC trip low: 0 +0x14d,0x00 +# DAC trip high: 63 +# DAC_CLK_MULT: 3 (16384) +0x14e,0xff +# DAC_CLK_CNTR +0x14f,0x7f +# no holdover +0x150,0x00 +# holdover DLD count +#0x151,0x00 +#0x152,0x00 +# CLKin0 R = 768 (0x300) +0x153,0x03 +0x154,0x00 +# CLKin1 R = 625 (0x271) +0x155,0x02 +0x156,0x71 +# CLKin2 R +#0x157,0x00 +#0x158,0x00 +# PLL1 N = 7680 (0x1e00) +0x159,0x1e +0x15a,0x00 +# PLL1_WND_SIZE: 3 +# PLL1_CP_TRI: 0 +# PLL1_CP_POL: 1 +# PLL1_CP_GAIN: 4 +0x15b,0xd4 +# PLL1_DLD_CNT: 32, 0 +0x15c,0x20 +0x15d,0x00 +# HOLDOVER_EXIT_NADJ: 30 +0x15e,0x1e +# PLL1 LD pin: SPI readback +0x15f,0x3b + +# configure PLL2 + +# release PLL2 PD +0x173,0x10 + +# PLL2 R: 1536 (0x600) +0x160,0x06 +0x161,0x00 +# PLL2 P: 2 (2) +# OSCin_FREQ: 1 (63-127) +# 2X: off +0x162,0x44 +# PLL2_N_CAL: 15625 (0x3d09) +0x163,0x00 +0x164,0x3d +0x165,0x09 +# PLL2_N_CAL: 15625 (0x3d09) +0x166,0x00 +0x167,0x3d +0x168,0x09 +# PLL2_WND_SIZE: 2 (1.8 ns) +# PLL2_CP_GAIN: 3 +# PLL2_CP_POL: 0 +# PLL2_CP_TRI: 0 +# PLL2_DLD_EN: 1 +0x169,0x59 +# PLL2_DLD_CNT: 32, 0 +0x16a,0x20 +0x16b,0x00 +# PLL2 LD pin: PLL1+PLL2 DLD +0x16e,0x1b + +# release PLL1 R reset +0x177,0x00 diff --git a/src/eth/example/HTG_ZRF8/fpga/pll/LMX2594_250_1000.txt b/src/eth/example/HTG_ZRF8/fpga/pll/LMX2594_250_1000.txt new file mode 100644 index 0000000..8c46098 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/pll/LMX2594_250_1000.txt @@ -0,0 +1,152 @@ +# Configuration for LMX2594 PLL + +# OSCin = 250 MHz +# VCO range 7.5 - 15 GHz +# R_PRE = 1 +# R = 1 +# PFD = OSCin / (R_PRE * R) = 250 MHz +# N = 32 +# VCO = PFD * N = 8 GHz +# VCO / 8 = 1 GHz + +# Reset +0,0x2412 +0,0x2410 + +# QUICK_RECAL_EN: 0 +# VCO_CAPCTRL_STRT: 0 +78,0x0001 +# 77,0x0000 +# 76,0x0000 +# CHDIV: 3 (8) +75,0x08c0 +# 74,0x0000 +# 73,0x0000 +# 72,0x0000 +# 71,0x0000 +# MASH_RST_COUNT: 50000 (0xc350) +70,0xc350 +# MASH_RST_COUNT: 50000 (0xc350) +69,0x0000 +# 68,0x0000 +# 67,0x0000 +# 66,0x0000 +# 65,0x0000 +# 64,0x0000 +# 63,0x0000 +# 62,0x0000 +# 61,0x0000 +# LD_DELAY: 1000 (0x3e8) +60,0x03e8 +# LD_TYPE: 1 +59,0x0001 +# INPIN_IGNORE: 1 +# INPIN_HYST: 0 +# INPIN_LVL: 0 +# INPIN_FMT: 0 +58,0x8001 +# 57,0x0000 +# 56,0x0000 +# 55,0x0000 +# 54,0x0000 +# 53,0x0000 +# 52,0x0000 +# 51,0x0000 +# 50,0x0000 +# 49,0x0000 +# 48,0x0000 +# 47,0x0000 +# OUTB_MUX: 0 (ch div) +46,0x07fc +# OUTA_MUX: 0 (ch div) +# OUT_ISET: 0 (max) +# OUTB_PWR: 31 (0x1f) +45,0xc0df +# OUTA_PWR: 31 (0x1f) +# OUTB_PD: 0 +# OUTA_PD: 0 +# MASH_RESET_N: 0 +# MASH_ORDER: 0 +44,0x1f00 +# PLL_NUM: 0 +43,0x0000 +# PLL_NUM: 0 +42,0x0000 +# MASH_SEED: 0 +41,0x0000 +# MASH_SEED: 0 +40,0x0000 +# PLL_DEN: '1 +39,0xffff +# PLL_DEN: '1 +38,0xffff +# MASH_SEED_EN: 0 +# PFD_DLY_SEL: 2 +37,0x0204 +# PLL_N: 32 (0x20) +36,0x0020 +# 35,0x0000 +# PLL_N: 32 (0x20) +34,0x0000 +# 33,0x0000 +# 32,0x0000 +# CHDIV_DIV2: 1 +31,0x43ec +# 30,0x0000 +# 29,0x0000 +# 28,0x0000 +# 27,0x0000 +# 26,0x0000 +# 25,0x0000 +# 24,0x0000 +# 23,0x0000 +# 22,0x0000 +# 21,0x0000 +# VCO_SEL: 7 (VCO7) +# VCO_SEL_FORCE: 0 +20,0xf848 +# VCO_CAPCTRL: 183 (0xb7) +19,0x27b7 +# 18,0x0000 +# VCO_DACISET_STRT: 250 (0xfa) +17,0x00fa +# VCO_DACISET: 128 (0x80) +16,0x0080 +# 15,0x0000 +# CPG: 7 +14,0x1e70 +# PLL_R_PRE: 1 +12,0x5001 +# PLL_R: 1 +11,0x0018 +# MULT: 1 (bypass) +10,0x10d8 +# OSC_2X: 0 +9,0x0604 +# VCO_DACISET_FORCE: 0 +# VCO_CAPCTRL_FORCE: 0 +8,0x2000 +# OUT_FORCE: 0 +7,0x00b2 +# ACAL_CMP_DLY: 10 +4,0x0a43 +# CAL_CLK_DIV: 3 (div 8) +1,0x080b + +# FCAL_HPFD_ADJ: 3 (PFD > 200 MHz) +# FCAL_LPFD_ADJ: 0 (PFD > 10 MHz) +# FCAL_EN: 0 +# MUXOUT_LD_SEL: 0 (readback) +# RESET: 0 +# POWERDOWN: 0 +0,0x2590 + +# Delay 10 msec + +# FCAL_HPFD_ADJ: 3 (PFD > 200 MHz) +# FCAL_LPFD_ADJ: 0 (PFD > 10 MHz) +# FCAL_EN: 1 +# MUXOUT_LD_SEL: 0 (readback) +# RESET: 0 +# POWERDOWN: 0 +0,0x2598 diff --git a/src/eth/example/HTG_ZRF8/fpga/pll/pll_i2c_init.py b/src/eth/example/HTG_ZRF8/fpga/pll/pll_i2c_init.py new file mode 100755 index 0000000..c8d45f8 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/pll/pll_i2c_init.py @@ -0,0 +1,779 @@ +#!/usr/bin/env python +""" +Generates an I2C init module for multiple chips +""" + +from jinja2 import Template + + +def si5341_cmds(regs, dev_addr=0x74): + cur_page = None + cur_addr = None + + cmds = [] + + print(f"Reading register list file '{regs}'...") + + with open(regs, "r") as f: + for line in f: + line = line.strip() + if not line or line == "Address,Data": + continue + if line[0] == '#': + cmds.append(f"// {line[1:].strip()}") + + if line.startswith("# Delay"): + cmds.append("cmd_delay(10); // delay 300 ms") + cur_addr = None + + continue + + d = line.split(",") + addr = int(d[0], 0) + page = (addr >> 8) & 0xff + data = int(d[1], 0) + + if page != cur_page: + cmds.append(f"cmd_start(7'h{dev_addr:02x});") + cmds.append("cmd_wr(8'h01);") + cmds.append(f"cmd_wr(8'h{page:02x}); // set page {page:#04x}") + cur_page = page + cur_addr = None + + if addr != cur_addr: + cmds.append(f"cmd_start(7'h{dev_addr:02x});") + cmds.append(f"cmd_wr(8'h{addr & 0xff:02x});") + cur_addr = addr + + cmds.append(f"cmd_wr(8'h{data:02x}); // write {data:#04x} to {addr:#06x}") + cur_addr += 1 + + return cmds + + +def lmk04832_cmds(regs, dev_addr=0x2a, mask=0x01): + cmds = [] + + print(f"Reading register list file '{regs}'...") + + with open(regs, "r") as f: + for line in f: + line = line.strip() + if not line or line == "Address,Data": + continue + if line[0] == '#': + cmds.append(f"// {line[1:].strip()}") + + if line.startswith("# Delay"): + cmds.append("cmd_delay(10); // delay 300 ms") + + continue + + d = line.split(",") + addr = int(d[0], 0) + addr_msb = (addr >> 8) & 0xff + addr_lsb = addr & 0xff + data = int(d[1], 0) + + cmds.append(f"cmd_start(7'h{dev_addr:02x});") + cmds.append(f"cmd_wr(8'h{mask:02x}); // SPI transfer, CS mask {mask:#03x}") + cmds.append(f"cmd_wr(8'h{addr_msb:02x}); // address {addr:#06x}") + cmds.append(f"cmd_wr(8'h{addr_lsb:02x});") + cmds.append(f"cmd_wr(8'h{data:02x}); // write {data:#04x}") + + return cmds + + +def lmx2594_cmds(regs, dev_addr=0x2a, mask=0x01): + cmds = [] + + print(f"Reading register list file '{regs}'...") + + with open(regs, "r") as f: + for line in f: + line = line.strip() + if not line or line == "Address,Data": + continue + if line[0] == '#': + cmds.append(f"// {line[1:].strip()}") + + if line.startswith("# Delay"): + cmds.append("cmd_delay(10); // delay 300 ms") + + continue + + d = line.split(",") + addr = int(d[0], 0) + data = int(d[1], 0) + data_msb = (data >> 8) & 0xff + data_lsb = data & 0xff + + cmds.append(f"cmd_start(7'h{dev_addr:02x});") + cmds.append(f"cmd_wr(8'h{mask:02x}); // SPI transfer, CS mask {mask:#03x}") + cmds.append(f"cmd_wr(8'h{addr:02x}); // address {addr:#04x}") + cmds.append(f"cmd_wr(8'h{data_msb:02x}); // write {data:#06x}") + cmds.append(f"cmd_wr(8'h{data_lsb:02x});") + + return cmds + + +def mux_cmds(val, dev_addr): + cmds = [] + cmds.append(f"cmd_start(7'h{dev_addr:02x});") + cmds.append(f"cmd_wr(8'h{val:02x});") + cmds.append("cmd_stop(); // I2C stop") + return cmds + + +def main(): + cmds = [] + + cmds.append("// Initial delay") + cmds.append("cmd_delay(6); // delay 30 ms") + + # Si5341 on HTG-ZRF8-EM + cmds.append("// Set mux to select U48 Si5341 on HTG-ZRF8-EM") + cmds.extend(mux_cmds(0x10, 0x71)) + + cmds.extend(si5341_cmds("HTG-ZRF8-EM-161-ZRF8EM01-Registers.txt", 0x74)) + + # PLLs for RF data converters + cmds.append("// Set mux to select I2C-SPI bridge on HTG-ZRF8-EM") + cmds.extend(mux_cmds(0x0a, 0x71)) + + cmds.append("// Configure I2C-SPI bridge") + cmds.append("cmd_start(7'h2a);") + cmds.append("cmd_wr(8'hf0);") + cmds.append("cmd_wr(8'h00);") + cmds.append("cmd_start(7'h2a);") + cmds.append("cmd_wr(8'hf6);") + cmds.append("cmd_wr(8'h00);") + + cmds.extend(lmk04832_cmds("LMK04832_EM_250.txt", 0x2a, 0x08)) + cmds.extend(lmx2594_cmds("LMX2594_250_1000.txt", 0x2a, 0x07)) + + cmds.append("// Clear I2C-SPI bridge interrupt") + cmds.append("cmd_start(7'h2a);") + cmds.append("cmd_wr(8'hf1);") + + # cmds.append("// Delay for PLL to lock") + # cmds.append("cmd_delay(10); // delay 300 ms") + + generate(cmds, "pll_i2c_init_em") + + cmds = [] + + cmds.append("// Initial delay") + cmds.append("cmd_delay(6); // delay 30 ms") + + # Si5341 on HTG-ZRF8-R2 + cmds.append("// Set mux to select U19 Si5341 on HTG-ZRF8-R2") + cmds.extend(mux_cmds(0x10, 0x71)) + + cmds.extend(si5341_cmds("HTG-ZRF8-R2-161-ZRF8R201-Registers.txt", 0x74)) + + # PLLs for RF data converters + cmds.append("// Set mux to select I2C-SPI bridge on HTG-ZRF8-R2") + cmds.extend(mux_cmds(0x0b, 0x71)) + + cmds.append("// Configure I2C-SPI bridge for LMK04832") + cmds.append("cmd_start(7'h2e);") + cmds.append("cmd_wr(8'hf0);") + cmds.append("cmd_wr(8'h00);") + cmds.append("cmd_start(7'h2e);") + cmds.append("cmd_wr(8'hf6);") + cmds.append("cmd_wr(8'h00);") + + cmds.append("// Configure I2C-SPI bridge for LMX2594") + cmds.append("cmd_start(7'h2a);") + cmds.append("cmd_wr(8'hf0);") + cmds.append("cmd_wr(8'h00);") + cmds.append("cmd_start(7'h2a);") + cmds.append("cmd_wr(8'hf6);") + cmds.append("cmd_wr(8'h00);") + + cmds.extend(lmk04832_cmds("LMK04832_R2_250.txt", 0x2e, 0x01)) + cmds.extend(lmx2594_cmds("LMX2594_250_1000.txt", 0x2a, 0x07)) + + cmds.append("// Clear I2C-SPI bridge interrupt for LMK04832") + cmds.append("cmd_start(7'h2e);") + cmds.append("cmd_wr(8'hf1);") + cmds.append("// Clear I2C-SPI bridge interrupt for LMX2594") + cmds.append("cmd_start(7'h2a);") + cmds.append("cmd_wr(8'hf1);") + + # cmds.append("// Delay for PLL to lock") + # cmds.append("cmd_delay(10); // delay 300 ms") + + generate(cmds, "pll_i2c_init_r2") + + +def generate(cmds=None, name=None, output=None): + if cmds is None: + raise Exception("Command list is required") + + if name is None: + name = "pll_i2c_init" + + if output is None: + output = name + ".sv" + + print(f"Generating PLL I2C init module {name}...") + + cmds = cmds.copy() + cmds.append("cmd_halt(); // end") + + cmd_str = "" + cmd_count = 0 + + for cmd in cmds: + if cmd.startswith('//'): + cmd_str += f" {cmd}\n" + else: + cmd_str += f" init_data[{cmd_count}] = {cmd}\n" + cmd_count += 1 + + t = Template(u"""// SPDX-License-Identifier: CERN-OHL-S-2.0 +/* + +Copyright (c) 2015-2025 FPGA Ninja, LLC + +Authors: +- Alex Forencich + +*/ + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * {{name}} + */ +module {{name}} # +( + parameter logic SIM_SPEEDUP = 1'b0 +) +( + input wire logic clk, + input wire logic rst, + + /* + * I2C master interface + */ + taxi_axis_if.src m_axis_cmd, + taxi_axis_if.src m_axis_tx, + + /* + * Status + */ + output wire logic busy, + + /* + * Configuration + */ + input wire logic start +); + +/* + +Generic module for I2C bus initialization. Good for use when multiple devices +on an I2C bus must be initialized on system start without intervention of a +general-purpose processor. + +Copy this file and change init_data and INIT_DATA_LEN as needed. + +This module can be used in two modes: simple device initialization, or multiple +device initialization. In multiple device mode, the same initialization sequence +can be performed on multiple different device addresses. + +To use single device mode, only use the start write to address and write data commands. +The module will generate the I2C commands in sequential order. Terminate the list +with a 0 entry. + +To use the multiple device mode, use the start data and start address block commands +to set up lists of initialization data and device addresses. The module enters +multiple device mode upon seeing a start data block command. The module stores the +offset of the start of the data block and then skips ahead until it reaches a start +address block command. The module will store the offset to the address block and +read the first address in the block. Then it will jump back to the data block +and execute it, substituting the stored address for each current address write +command. Upon reaching the start address block command, the module will read out the +next address and start again at the top of the data block. If the module encounters +a start data block command while looking for an address, then it will store a new data +offset and then look for a start address block command. Terminate the list with a 0 +entry. Normal address commands will operate normally inside a data block. + +Commands: + +00 0000000 : stop +00 0000001 : exit multiple device mode +00 0000011 : start write to current address +00 0001000 : start address block +00 0001001 : start data block +00 001dddd : delay 2**(16+d) cycles +00 1000001 : send I2C stop +01 aaaaaaa : start write to address +1 dddddddd : write 8-bit data + +Examples + +write 0x11223344 to register 0x0004 on device at 0x50 + +01 1010000 start write to 0x50 +1 00000000 write address 0x0004 +1 00000100 +1 00010001 write data 0x11223344 +1 00100010 +1 00110011 +1 01000100 +0 00000000 stop + +write 0x11223344 to register 0x0004 on devices at 0x50, 0x51, 0x52, and 0x53 + +00 0001001 start data block +00 0000011 start write to current address +1 00000000 write address 0x0004 +1 00000100 +1 00010001 write data 0x11223344 +1 00100010 +1 00110011 +1 01000100 +00 0001000 start address block +01 1010000 address 0x50 +01 1010001 address 0x51 +01 1010010 address 0x52 +01 1010011 address 0x53 +00 0000001 exit multi-dev mode +00 0000000 stop + +*/ + +// check configuration +if (m_axis_cmd.DATA_W < 12) + $fatal(0, "Command interface width must be at least 12 bits (instance %m)"); + +if (m_axis_tx.DATA_W != 8) + $fatal(0, "Data interface width must be 8 bits (instance %m)"); + +function [8:0] cmd_start(input [6:0] addr); + cmd_start = {2'b01, addr}; +endfunction + +function [8:0] cmd_wr(input [7:0] data); + cmd_wr = {1'b1, data}; +endfunction + +function [8:0] cmd_stop(); + cmd_stop = {2'b00, 7'b1000001}; +endfunction + +function [8:0] cmd_delay(input [3:0] d); + cmd_delay = {2'b00, 3'b001, d}; +endfunction + +function [8:0] cmd_halt(); + cmd_halt = 9'd0; +endfunction + +function [8:0] blk_start_data(); + blk_start_data = {2'b00, 7'b0001001}; +endfunction + +function [8:0] blk_start_addr(); + blk_start_addr = {2'b00, 7'b0001000}; +endfunction + +function [8:0] cmd_start_cur(); + cmd_start_cur = {2'b00, 7'b0000011}; +endfunction + +function [8:0] cmd_exit(); + cmd_exit = {2'b00, 7'b0000001}; +endfunction + +// init_data ROM +localparam INIT_DATA_LEN = {{cmd_count}}; + +reg [8:0] init_data [INIT_DATA_LEN-1:0]; + +initial begin +{{cmd_str-}} +end + +localparam [2:0] + STATE_IDLE = 3'd0, + STATE_RUN = 3'd1, + STATE_TABLE_1 = 3'd2, + STATE_TABLE_2 = 3'd3, + STATE_TABLE_3 = 3'd4; + +logic [2:0] state_reg = STATE_IDLE, state_next; + +localparam AW = $clog2(INIT_DATA_LEN); + +logic [8:0] init_data_reg = '0; + +logic [AW-1:0] address_reg = '0, address_next; +logic [AW-1:0] address_ptr_reg = '0, address_ptr_next; +logic [AW-1:0] data_ptr_reg = '0, data_ptr_next; + +logic [6:0] cur_address_reg = '0, cur_address_next; + +logic [31:0] delay_counter_reg = '0, delay_counter_next; + +logic [6:0] m_axis_cmd_address_reg = '0, m_axis_cmd_address_next; +logic m_axis_cmd_start_reg = 1'b0, m_axis_cmd_start_next; +logic m_axis_cmd_write_reg = 1'b0, m_axis_cmd_write_next; +logic m_axis_cmd_stop_reg = 1'b0, m_axis_cmd_stop_next; +logic m_axis_cmd_valid_reg = 1'b0, m_axis_cmd_valid_next; + +logic [7:0] m_axis_tx_tdata_reg = '0, m_axis_tx_tdata_next; +logic m_axis_tx_tvalid_reg = 1'b0, m_axis_tx_tvalid_next; + +logic start_flag_reg = 1'b0, start_flag_next; + +logic busy_reg = 1'b0; + +assign m_axis_cmd.tdata[6:0] = m_axis_cmd_address_reg; +assign m_axis_cmd.tdata[7] = m_axis_cmd_start_reg; +assign m_axis_cmd.tdata[8] = 1'b0; // read +assign m_axis_cmd.tdata[9] = m_axis_cmd_write_reg; +assign m_axis_cmd.tdata[10] = 1'b0; // write multi +assign m_axis_cmd.tdata[11] = m_axis_cmd_stop_reg; +assign m_axis_cmd.tvalid = m_axis_cmd_valid_reg; +assign m_axis_cmd.tlast = 1'b1; +assign m_axis_cmd.tid = '0; +assign m_axis_cmd.tdest = '0; +assign m_axis_cmd.tuser = '0; + +assign m_axis_tx.tdata = m_axis_tx_tdata_reg; +assign m_axis_tx.tvalid = m_axis_tx_tvalid_reg; +assign m_axis_tx.tlast = 1'b1; +assign m_axis_tx.tid = '0; +assign m_axis_tx.tdest = '0; +assign m_axis_tx.tuser = '0; + +assign busy = busy_reg; + +always_comb begin + state_next = STATE_IDLE; + + address_next = address_reg; + address_ptr_next = address_ptr_reg; + data_ptr_next = data_ptr_reg; + + cur_address_next = cur_address_reg; + + delay_counter_next = delay_counter_reg; + + m_axis_cmd_address_next = m_axis_cmd_address_reg; + m_axis_cmd_start_next = m_axis_cmd_start_reg && !(m_axis_cmd.tvalid && m_axis_cmd.tready); + m_axis_cmd_write_next = m_axis_cmd_write_reg && !(m_axis_cmd.tvalid && m_axis_cmd.tready); + m_axis_cmd_stop_next = m_axis_cmd_stop_reg && !(m_axis_cmd.tvalid && m_axis_cmd.tready); + m_axis_cmd_valid_next = m_axis_cmd_valid_reg && !m_axis_cmd.tready; + + m_axis_tx_tdata_next = m_axis_tx_tdata_reg; + m_axis_tx_tvalid_next = m_axis_tx_tvalid_reg && !m_axis_tx.tready; + + start_flag_next = start_flag_reg; + + if (m_axis_cmd.tvalid || m_axis_tx.tvalid) begin + // wait for output registers to clear + state_next = state_reg; + end else if (delay_counter_reg != 0) begin + // delay + delay_counter_next = delay_counter_reg - 1; + state_next = state_reg; + end else begin + case (state_reg) + STATE_IDLE: begin + // wait for start signal + if (!start_flag_reg && start) begin + address_next = '0; + start_flag_next = 1'b1; + state_next = STATE_RUN; + end else begin + state_next = STATE_IDLE; + end + end + STATE_RUN: begin + // process commands + if (init_data_reg[8] == 1'b1) begin + // write data + m_axis_cmd_write_next = 1'b1; + m_axis_cmd_stop_next = 1'b0; + m_axis_cmd_valid_next = 1'b1; + + m_axis_tx_tdata_next = init_data_reg[7:0]; + m_axis_tx_tvalid_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_RUN; + end else if (init_data_reg[8:7] == 2'b01) begin + // write address + m_axis_cmd_address_next = init_data_reg[6:0]; + m_axis_cmd_start_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_RUN; + end else if (init_data_reg[8:4] == 5'b00001) begin + // delay + if (SIM_SPEEDUP) begin + delay_counter_next = 32'd1 << (init_data_reg[3:0]); + end else begin + delay_counter_next = 32'd1 << (init_data_reg[3:0]+16); + end + + address_next = address_reg + 1; + + state_next = STATE_RUN; + end else if (init_data_reg == 9'b001000001) begin + // send stop + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_RUN; + end else if (init_data_reg == 9'b000001001) begin + // data table start + data_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end else if (init_data_reg == 9'd0) begin + // stop + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + state_next = STATE_IDLE; + end else begin + // invalid command, skip + address_next = address_reg + 1; + state_next = STATE_RUN; + end + end + STATE_TABLE_1: begin + // find address table start + if (init_data_reg == 9'b000001000) begin + // address table start + address_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_2; + end else if (init_data_reg == 9'b000001001) begin + // data table start + data_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end else if (init_data_reg == 1) begin + // exit mode + address_next = address_reg + 1; + state_next = STATE_RUN; + end else if (init_data_reg == 9'd0) begin + // stop + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + state_next = STATE_IDLE; + end else begin + // invalid command, skip + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end + end + STATE_TABLE_2: begin + // find next address + if (init_data_reg[8:7] == 2'b01) begin + // write address command + // store address and move to data table + cur_address_next = init_data_reg[6:0]; + address_ptr_next = address_reg + 1; + address_next = data_ptr_reg; + state_next = STATE_TABLE_3; + end else if (init_data_reg == 9'b000001001) begin + // data table start + data_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end else if (init_data_reg == 9'd1) begin + // exit mode + address_next = address_reg + 1; + state_next = STATE_RUN; + end else if (init_data_reg == 9'd0) begin + // stop + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + state_next = STATE_IDLE; + end else begin + // invalid command, skip + address_next = address_reg + 1; + state_next = STATE_TABLE_2; + end + end + STATE_TABLE_3: begin + // process data table with selected address + if (init_data_reg[8] == 1'b1) begin + // write data + m_axis_cmd_write_next = 1'b1; + m_axis_cmd_stop_next = 1'b0; + m_axis_cmd_valid_next = 1'b1; + + m_axis_tx_tdata_next = init_data_reg[7:0]; + m_axis_tx_tvalid_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg[8:7] == 2'b01) begin + // write address + m_axis_cmd_address_next = init_data_reg[6:0]; + m_axis_cmd_start_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg == 9'b000000011) begin + // write current address + m_axis_cmd_address_next = cur_address_reg; + m_axis_cmd_start_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg[8:4] == 5'b00001) begin + // delay + if (SIM_SPEEDUP) begin + delay_counter_next = 32'd1 << (init_data_reg[3:0]); + end else begin + delay_counter_next = 32'd1 << (init_data_reg[3:0]+16); + end + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg == 9'b001000001) begin + // send stop + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg == 9'b000001001) begin + // data table start + data_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end else if (init_data_reg == 9'b000001000) begin + // address table start + address_next = address_ptr_reg; + state_next = STATE_TABLE_2; + end else if (init_data_reg == 9'd1) begin + // exit mode + address_next = address_reg + 1; + state_next = STATE_RUN; + end else if (init_data_reg == 9'd0) begin + // stop + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + state_next = STATE_IDLE; + end else begin + // invalid command, skip + address_next = address_reg + 1; + state_next = STATE_TABLE_3; + end + end + default: begin + // invalid state + state_next = STATE_IDLE; + end + endcase + end +end + +always_ff @(posedge clk) begin + state_reg <= state_next; + + // read init_data ROM + init_data_reg <= init_data[address_next]; + + address_reg <= address_next; + address_ptr_reg <= address_ptr_next; + data_ptr_reg <= data_ptr_next; + + cur_address_reg <= cur_address_next; + + delay_counter_reg <= delay_counter_next; + + m_axis_cmd_address_reg <= m_axis_cmd_address_next; + m_axis_cmd_start_reg <= m_axis_cmd_start_next; + m_axis_cmd_write_reg <= m_axis_cmd_write_next; + m_axis_cmd_stop_reg <= m_axis_cmd_stop_next; + m_axis_cmd_valid_reg <= m_axis_cmd_valid_next; + + m_axis_tx_tdata_reg <= m_axis_tx_tdata_next; + m_axis_tx_tvalid_reg <= m_axis_tx_tvalid_next; + + start_flag_reg <= start && start_flag_next; + + busy_reg <= (state_reg != STATE_IDLE); + + if (rst) begin + state_reg <= STATE_IDLE; + + init_data_reg <= '0; + + address_reg <= '0; + address_ptr_reg <= '0; + data_ptr_reg <= '0; + + cur_address_reg <= '0; + + delay_counter_reg <= '0; + + m_axis_cmd_valid_reg <= 1'b0; + + m_axis_tx_tvalid_reg <= 1'b0; + + start_flag_reg <= 1'b0; + + busy_reg <= 1'b0; + end +end + +endmodule + +`resetall +""") + + print(f"Writing file '{output}'...") + + with open(output, 'w') as f: + f.write(t.render( + cmd_str=cmd_str, + cmd_count=cmd_count, + name=name + )) + f.flush() + + print("Done") + + +if __name__ == "__main__": + main() diff --git a/src/eth/example/HTG_ZRF8/fpga/pll/pll_i2c_init_em.sv b/src/eth/example/HTG_ZRF8/fpga/pll/pll_i2c_init_em.sv new file mode 100644 index 0000000..f18baab --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/pll/pll_i2c_init_em.sv @@ -0,0 +1,2038 @@ +// SPDX-License-Identifier: CERN-OHL-S-2.0 +/* + +Copyright (c) 2015-2025 FPGA Ninja, LLC + +Authors: +- Alex Forencich + +*/ + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * pll_i2c_init_em + */ +module pll_i2c_init_em # +( + parameter logic SIM_SPEEDUP = 1'b0 +) +( + input wire logic clk, + input wire logic rst, + + /* + * I2C master interface + */ + taxi_axis_if.src m_axis_cmd, + taxi_axis_if.src m_axis_tx, + + /* + * Status + */ + output wire logic busy, + + /* + * Configuration + */ + input wire logic start +); + +/* + +Generic module for I2C bus initialization. Good for use when multiple devices +on an I2C bus must be initialized on system start without intervention of a +general-purpose processor. + +Copy this file and change init_data and INIT_DATA_LEN as needed. + +This module can be used in two modes: simple device initialization, or multiple +device initialization. In multiple device mode, the same initialization sequence +can be performed on multiple different device addresses. + +To use single device mode, only use the start write to address and write data commands. +The module will generate the I2C commands in sequential order. Terminate the list +with a 0 entry. + +To use the multiple device mode, use the start data and start address block commands +to set up lists of initialization data and device addresses. The module enters +multiple device mode upon seeing a start data block command. The module stores the +offset of the start of the data block and then skips ahead until it reaches a start +address block command. The module will store the offset to the address block and +read the first address in the block. Then it will jump back to the data block +and execute it, substituting the stored address for each current address write +command. Upon reaching the start address block command, the module will read out the +next address and start again at the top of the data block. If the module encounters +a start data block command while looking for an address, then it will store a new data +offset and then look for a start address block command. Terminate the list with a 0 +entry. Normal address commands will operate normally inside a data block. + +Commands: + +00 0000000 : stop +00 0000001 : exit multiple device mode +00 0000011 : start write to current address +00 0001000 : start address block +00 0001001 : start data block +00 001dddd : delay 2**(16+d) cycles +00 1000001 : send I2C stop +01 aaaaaaa : start write to address +1 dddddddd : write 8-bit data + +Examples + +write 0x11223344 to register 0x0004 on device at 0x50 + +01 1010000 start write to 0x50 +1 00000000 write address 0x0004 +1 00000100 +1 00010001 write data 0x11223344 +1 00100010 +1 00110011 +1 01000100 +0 00000000 stop + +write 0x11223344 to register 0x0004 on devices at 0x50, 0x51, 0x52, and 0x53 + +00 0001001 start data block +00 0000011 start write to current address +1 00000000 write address 0x0004 +1 00000100 +1 00010001 write data 0x11223344 +1 00100010 +1 00110011 +1 01000100 +00 0001000 start address block +01 1010000 address 0x50 +01 1010001 address 0x51 +01 1010010 address 0x52 +01 1010011 address 0x53 +00 0000001 exit multi-dev mode +00 0000000 stop + +*/ + +// check configuration +if (m_axis_cmd.DATA_W < 12) + $fatal(0, "Command interface width must be at least 12 bits (instance %m)"); + +if (m_axis_tx.DATA_W != 8) + $fatal(0, "Data interface width must be 8 bits (instance %m)"); + +function [8:0] cmd_start(input [6:0] addr); + cmd_start = {2'b01, addr}; +endfunction + +function [8:0] cmd_wr(input [7:0] data); + cmd_wr = {1'b1, data}; +endfunction + +function [8:0] cmd_stop(); + cmd_stop = {2'b00, 7'b1000001}; +endfunction + +function [8:0] cmd_delay(input [3:0] d); + cmd_delay = {2'b00, 3'b001, d}; +endfunction + +function [8:0] cmd_halt(); + cmd_halt = 9'd0; +endfunction + +function [8:0] blk_start_data(); + blk_start_data = {2'b00, 7'b0001001}; +endfunction + +function [8:0] blk_start_addr(); + blk_start_addr = {2'b00, 7'b0001000}; +endfunction + +function [8:0] cmd_start_cur(); + cmd_start_cur = {2'b00, 7'b0000011}; +endfunction + +function [8:0] cmd_exit(); + cmd_exit = {2'b00, 7'b0000001}; +endfunction + +// init_data ROM +localparam INIT_DATA_LEN = 1215; + +reg [8:0] init_data [INIT_DATA_LEN-1:0]; + +initial begin + // Initial delay + init_data[0] = cmd_delay(6); // delay 30 ms + // Set mux to select U48 Si5341 on HTG-ZRF8-EM + init_data[1] = cmd_start(7'h71); + init_data[2] = cmd_wr(8'h10); + init_data[3] = cmd_stop(); // I2C stop + // Si534x/7x/8x/9x Registers Script + // + // Part: Si5341 + // Project File: X:\Projects\taxi\src\eth\example\HTG_ZRF8\fpga\pll\HTG-ZRF8-EM-161-ZRF8EM01.slabtimeproj + // Design ID: ZRF8EM01 + // Includes Pre/Post Download Control Register Writes: Yes + // Die Revision: B1 + // Creator: ClockBuilder Pro v4.1 [2021-09-22] + // Created On: 2025-09-02 08:11:56 GMT-07:00 + // + // Start configuration preamble + init_data[4] = cmd_start(7'h74); + init_data[5] = cmd_wr(8'h01); + init_data[6] = cmd_wr(8'h0b); // set page 0x0b + init_data[7] = cmd_start(7'h74); + init_data[8] = cmd_wr(8'h24); + init_data[9] = cmd_wr(8'hc0); // write 0xc0 to 0x0b24 + init_data[10] = cmd_wr(8'h00); // write 0x00 to 0x0b25 + // Rev D stuck divider fix + init_data[11] = cmd_start(7'h74); + init_data[12] = cmd_wr(8'h01); + init_data[13] = cmd_wr(8'h05); // set page 0x05 + init_data[14] = cmd_start(7'h74); + init_data[15] = cmd_wr(8'h02); + init_data[16] = cmd_wr(8'h01); // write 0x01 to 0x0502 + init_data[17] = cmd_start(7'h74); + init_data[18] = cmd_wr(8'h05); + init_data[19] = cmd_wr(8'h03); // write 0x03 to 0x0505 + init_data[20] = cmd_start(7'h74); + init_data[21] = cmd_wr(8'h01); + init_data[22] = cmd_wr(8'h09); // set page 0x09 + init_data[23] = cmd_start(7'h74); + init_data[24] = cmd_wr(8'h57); + init_data[25] = cmd_wr(8'h17); // write 0x17 to 0x0957 + init_data[26] = cmd_start(7'h74); + init_data[27] = cmd_wr(8'h01); + init_data[28] = cmd_wr(8'h0b); // set page 0x0b + init_data[29] = cmd_start(7'h74); + init_data[30] = cmd_wr(8'h4e); + init_data[31] = cmd_wr(8'h1a); // write 0x1a to 0x0b4e + // End configuration preamble + // + // Delay 300 msec + init_data[32] = cmd_delay(10); // delay 300 ms + // Delay is worst case time for device to complete any calibration + // that is running due to device state change previous to this script + // being processed. + // + // Start configuration registers + init_data[33] = cmd_start(7'h74); + init_data[34] = cmd_wr(8'h01); + init_data[35] = cmd_wr(8'h00); // set page 0x00 + init_data[36] = cmd_start(7'h74); + init_data[37] = cmd_wr(8'h06); + init_data[38] = cmd_wr(8'h00); // write 0x00 to 0x0006 + init_data[39] = cmd_wr(8'h00); // write 0x00 to 0x0007 + init_data[40] = cmd_wr(8'h00); // write 0x00 to 0x0008 + init_data[41] = cmd_start(7'h74); + init_data[42] = cmd_wr(8'h0b); + init_data[43] = cmd_wr(8'h74); // write 0x74 to 0x000b + init_data[44] = cmd_start(7'h74); + init_data[45] = cmd_wr(8'h17); + init_data[46] = cmd_wr(8'hd0); // write 0xd0 to 0x0017 + init_data[47] = cmd_wr(8'hff); // write 0xff to 0x0018 + init_data[48] = cmd_start(7'h74); + init_data[49] = cmd_wr(8'h21); + init_data[50] = cmd_wr(8'h0f); // write 0x0f to 0x0021 + init_data[51] = cmd_wr(8'h00); // write 0x00 to 0x0022 + init_data[52] = cmd_start(7'h74); + init_data[53] = cmd_wr(8'h2b); + init_data[54] = cmd_wr(8'h02); // write 0x02 to 0x002b + init_data[55] = cmd_wr(8'h20); // write 0x20 to 0x002c + init_data[56] = cmd_wr(8'h00); // write 0x00 to 0x002d + init_data[57] = cmd_wr(8'h00); // write 0x00 to 0x002e + init_data[58] = cmd_wr(8'h00); // write 0x00 to 0x002f + init_data[59] = cmd_wr(8'h00); // write 0x00 to 0x0030 + init_data[60] = cmd_wr(8'h00); // write 0x00 to 0x0031 + init_data[61] = cmd_wr(8'h00); // write 0x00 to 0x0032 + init_data[62] = cmd_wr(8'h00); // write 0x00 to 0x0033 + init_data[63] = cmd_wr(8'h00); // write 0x00 to 0x0034 + init_data[64] = cmd_wr(8'h00); // write 0x00 to 0x0035 + init_data[65] = cmd_wr(8'h00); // write 0x00 to 0x0036 + init_data[66] = cmd_wr(8'h00); // write 0x00 to 0x0037 + init_data[67] = cmd_wr(8'h00); // write 0x00 to 0x0038 + init_data[68] = cmd_wr(8'h00); // write 0x00 to 0x0039 + init_data[69] = cmd_wr(8'h00); // write 0x00 to 0x003a + init_data[70] = cmd_wr(8'h00); // write 0x00 to 0x003b + init_data[71] = cmd_wr(8'h00); // write 0x00 to 0x003c + init_data[72] = cmd_wr(8'h00); // write 0x00 to 0x003d + init_data[73] = cmd_start(7'h74); + init_data[74] = cmd_wr(8'h41); + init_data[75] = cmd_wr(8'h00); // write 0x00 to 0x0041 + init_data[76] = cmd_wr(8'h00); // write 0x00 to 0x0042 + init_data[77] = cmd_wr(8'h00); // write 0x00 to 0x0043 + init_data[78] = cmd_wr(8'h00); // write 0x00 to 0x0044 + init_data[79] = cmd_start(7'h74); + init_data[80] = cmd_wr(8'h9e); + init_data[81] = cmd_wr(8'h00); // write 0x00 to 0x009e + init_data[82] = cmd_start(7'h74); + init_data[83] = cmd_wr(8'h01); + init_data[84] = cmd_wr(8'h01); // set page 0x01 + init_data[85] = cmd_start(7'h74); + init_data[86] = cmd_wr(8'h02); + init_data[87] = cmd_wr(8'h01); // write 0x01 to 0x0102 + init_data[88] = cmd_start(7'h74); + init_data[89] = cmd_wr(8'h08); + init_data[90] = cmd_wr(8'h02); // write 0x02 to 0x0108 + init_data[91] = cmd_wr(8'h09); // write 0x09 to 0x0109 + init_data[92] = cmd_wr(8'h33); // write 0x33 to 0x010a + init_data[93] = cmd_wr(8'h08); // write 0x08 to 0x010b + init_data[94] = cmd_start(7'h74); + init_data[95] = cmd_wr(8'h0d); + init_data[96] = cmd_wr(8'h02); // write 0x02 to 0x010d + init_data[97] = cmd_wr(8'h09); // write 0x09 to 0x010e + init_data[98] = cmd_wr(8'h33); // write 0x33 to 0x010f + init_data[99] = cmd_wr(8'h0a); // write 0x0a to 0x0110 + init_data[100] = cmd_start(7'h74); + init_data[101] = cmd_wr(8'h12); + init_data[102] = cmd_wr(8'h02); // write 0x02 to 0x0112 + init_data[103] = cmd_wr(8'h09); // write 0x09 to 0x0113 + init_data[104] = cmd_wr(8'h33); // write 0x33 to 0x0114 + init_data[105] = cmd_wr(8'h0b); // write 0x0b to 0x0115 + init_data[106] = cmd_start(7'h74); + init_data[107] = cmd_wr(8'h17); + init_data[108] = cmd_wr(8'h06); // write 0x06 to 0x0117 + init_data[109] = cmd_wr(8'h09); // write 0x09 to 0x0118 + init_data[110] = cmd_wr(8'h33); // write 0x33 to 0x0119 + init_data[111] = cmd_wr(8'h09); // write 0x09 to 0x011a + init_data[112] = cmd_start(7'h74); + init_data[113] = cmd_wr(8'h1c); + init_data[114] = cmd_wr(8'h02); // write 0x02 to 0x011c + init_data[115] = cmd_wr(8'h09); // write 0x09 to 0x011d + init_data[116] = cmd_wr(8'h33); // write 0x33 to 0x011e + init_data[117] = cmd_wr(8'h0b); // write 0x0b to 0x011f + init_data[118] = cmd_start(7'h74); + init_data[119] = cmd_wr(8'h21); + init_data[120] = cmd_wr(8'h02); // write 0x02 to 0x0121 + init_data[121] = cmd_wr(8'h09); // write 0x09 to 0x0122 + init_data[122] = cmd_wr(8'h33); // write 0x33 to 0x0123 + init_data[123] = cmd_wr(8'h08); // write 0x08 to 0x0124 + init_data[124] = cmd_start(7'h74); + init_data[125] = cmd_wr(8'h26); + init_data[126] = cmd_wr(8'h02); // write 0x02 to 0x0126 + init_data[127] = cmd_wr(8'h09); // write 0x09 to 0x0127 + init_data[128] = cmd_wr(8'h33); // write 0x33 to 0x0128 + init_data[129] = cmd_wr(8'h08); // write 0x08 to 0x0129 + init_data[130] = cmd_start(7'h74); + init_data[131] = cmd_wr(8'h2b); + init_data[132] = cmd_wr(8'h02); // write 0x02 to 0x012b + init_data[133] = cmd_wr(8'h09); // write 0x09 to 0x012c + init_data[134] = cmd_wr(8'h33); // write 0x33 to 0x012d + init_data[135] = cmd_wr(8'h0a); // write 0x0a to 0x012e + init_data[136] = cmd_start(7'h74); + init_data[137] = cmd_wr(8'h30); + init_data[138] = cmd_wr(8'h02); // write 0x02 to 0x0130 + init_data[139] = cmd_wr(8'h09); // write 0x09 to 0x0131 + init_data[140] = cmd_wr(8'h33); // write 0x33 to 0x0132 + init_data[141] = cmd_wr(8'h0a); // write 0x0a to 0x0133 + init_data[142] = cmd_start(7'h74); + init_data[143] = cmd_wr(8'h3a); + init_data[144] = cmd_wr(8'h02); // write 0x02 to 0x013a + init_data[145] = cmd_wr(8'h09); // write 0x09 to 0x013b + init_data[146] = cmd_wr(8'h33); // write 0x33 to 0x013c + init_data[147] = cmd_wr(8'h0a); // write 0x0a to 0x013d + init_data[148] = cmd_start(7'h74); + init_data[149] = cmd_wr(8'h3f); + init_data[150] = cmd_wr(8'h00); // write 0x00 to 0x013f + init_data[151] = cmd_wr(8'h00); // write 0x00 to 0x0140 + init_data[152] = cmd_wr(8'h40); // write 0x40 to 0x0141 + init_data[153] = cmd_start(7'h74); + init_data[154] = cmd_wr(8'h01); + init_data[155] = cmd_wr(8'h02); // set page 0x02 + init_data[156] = cmd_start(7'h74); + init_data[157] = cmd_wr(8'h06); + init_data[158] = cmd_wr(8'h00); // write 0x00 to 0x0206 + init_data[159] = cmd_start(7'h74); + init_data[160] = cmd_wr(8'h08); + init_data[161] = cmd_wr(8'h00); // write 0x00 to 0x0208 + init_data[162] = cmd_wr(8'h00); // write 0x00 to 0x0209 + init_data[163] = cmd_wr(8'h00); // write 0x00 to 0x020a + init_data[164] = cmd_wr(8'h00); // write 0x00 to 0x020b + init_data[165] = cmd_wr(8'h00); // write 0x00 to 0x020c + init_data[166] = cmd_wr(8'h00); // write 0x00 to 0x020d + init_data[167] = cmd_wr(8'h00); // write 0x00 to 0x020e + init_data[168] = cmd_wr(8'h00); // write 0x00 to 0x020f + init_data[169] = cmd_wr(8'h00); // write 0x00 to 0x0210 + init_data[170] = cmd_wr(8'h00); // write 0x00 to 0x0211 + init_data[171] = cmd_wr(8'h00); // write 0x00 to 0x0212 + init_data[172] = cmd_wr(8'h00); // write 0x00 to 0x0213 + init_data[173] = cmd_wr(8'h00); // write 0x00 to 0x0214 + init_data[174] = cmd_wr(8'h00); // write 0x00 to 0x0215 + init_data[175] = cmd_wr(8'h00); // write 0x00 to 0x0216 + init_data[176] = cmd_wr(8'h00); // write 0x00 to 0x0217 + init_data[177] = cmd_wr(8'h00); // write 0x00 to 0x0218 + init_data[178] = cmd_wr(8'h00); // write 0x00 to 0x0219 + init_data[179] = cmd_wr(8'h00); // write 0x00 to 0x021a + init_data[180] = cmd_wr(8'h00); // write 0x00 to 0x021b + init_data[181] = cmd_wr(8'h00); // write 0x00 to 0x021c + init_data[182] = cmd_wr(8'h00); // write 0x00 to 0x021d + init_data[183] = cmd_wr(8'h00); // write 0x00 to 0x021e + init_data[184] = cmd_wr(8'h00); // write 0x00 to 0x021f + init_data[185] = cmd_wr(8'h00); // write 0x00 to 0x0220 + init_data[186] = cmd_wr(8'h00); // write 0x00 to 0x0221 + init_data[187] = cmd_wr(8'h00); // write 0x00 to 0x0222 + init_data[188] = cmd_wr(8'h00); // write 0x00 to 0x0223 + init_data[189] = cmd_wr(8'h00); // write 0x00 to 0x0224 + init_data[190] = cmd_wr(8'h00); // write 0x00 to 0x0225 + init_data[191] = cmd_wr(8'h00); // write 0x00 to 0x0226 + init_data[192] = cmd_wr(8'h00); // write 0x00 to 0x0227 + init_data[193] = cmd_wr(8'h00); // write 0x00 to 0x0228 + init_data[194] = cmd_wr(8'h00); // write 0x00 to 0x0229 + init_data[195] = cmd_wr(8'h00); // write 0x00 to 0x022a + init_data[196] = cmd_wr(8'h00); // write 0x00 to 0x022b + init_data[197] = cmd_wr(8'h00); // write 0x00 to 0x022c + init_data[198] = cmd_wr(8'h00); // write 0x00 to 0x022d + init_data[199] = cmd_wr(8'h00); // write 0x00 to 0x022e + init_data[200] = cmd_wr(8'h00); // write 0x00 to 0x022f + init_data[201] = cmd_start(7'h74); + init_data[202] = cmd_wr(8'h35); + init_data[203] = cmd_wr(8'h00); // write 0x00 to 0x0235 + init_data[204] = cmd_wr(8'h00); // write 0x00 to 0x0236 + init_data[205] = cmd_wr(8'h00); // write 0x00 to 0x0237 + init_data[206] = cmd_wr(8'h00); // write 0x00 to 0x0238 + init_data[207] = cmd_wr(8'h96); // write 0x96 to 0x0239 + init_data[208] = cmd_wr(8'h00); // write 0x00 to 0x023a + init_data[209] = cmd_wr(8'h00); // write 0x00 to 0x023b + init_data[210] = cmd_wr(8'h00); // write 0x00 to 0x023c + init_data[211] = cmd_wr(8'h00); // write 0x00 to 0x023d + init_data[212] = cmd_wr(8'h80); // write 0x80 to 0x023e + init_data[213] = cmd_start(7'h74); + init_data[214] = cmd_wr(8'h4a); + init_data[215] = cmd_wr(8'h02); // write 0x02 to 0x024a + init_data[216] = cmd_wr(8'h00); // write 0x00 to 0x024b + init_data[217] = cmd_wr(8'h00); // write 0x00 to 0x024c + init_data[218] = cmd_wr(8'h3b); // write 0x3b to 0x024d + init_data[219] = cmd_wr(8'h00); // write 0x00 to 0x024e + init_data[220] = cmd_wr(8'h00); // write 0x00 to 0x024f + init_data[221] = cmd_wr(8'h1a); // write 0x1a to 0x0250 + init_data[222] = cmd_wr(8'h00); // write 0x00 to 0x0251 + init_data[223] = cmd_wr(8'h00); // write 0x00 to 0x0252 + init_data[224] = cmd_wr(8'h00); // write 0x00 to 0x0253 + init_data[225] = cmd_wr(8'h00); // write 0x00 to 0x0254 + init_data[226] = cmd_wr(8'h00); // write 0x00 to 0x0255 + init_data[227] = cmd_wr(8'h19); // write 0x19 to 0x0256 + init_data[228] = cmd_wr(8'h00); // write 0x00 to 0x0257 + init_data[229] = cmd_wr(8'h00); // write 0x00 to 0x0258 + init_data[230] = cmd_wr(8'h02); // write 0x02 to 0x0259 + init_data[231] = cmd_wr(8'h00); // write 0x00 to 0x025a + init_data[232] = cmd_wr(8'h00); // write 0x00 to 0x025b + init_data[233] = cmd_wr(8'h02); // write 0x02 to 0x025c + init_data[234] = cmd_wr(8'h00); // write 0x00 to 0x025d + init_data[235] = cmd_wr(8'h00); // write 0x00 to 0x025e + init_data[236] = cmd_wr(8'h01); // write 0x01 to 0x025f + init_data[237] = cmd_wr(8'h00); // write 0x00 to 0x0260 + init_data[238] = cmd_wr(8'h00); // write 0x00 to 0x0261 + init_data[239] = cmd_wr(8'h02); // write 0x02 to 0x0262 + init_data[240] = cmd_wr(8'h00); // write 0x00 to 0x0263 + init_data[241] = cmd_wr(8'h00); // write 0x00 to 0x0264 + init_data[242] = cmd_start(7'h74); + init_data[243] = cmd_wr(8'h68); + init_data[244] = cmd_wr(8'h01); // write 0x01 to 0x0268 + init_data[245] = cmd_wr(8'h00); // write 0x00 to 0x0269 + init_data[246] = cmd_wr(8'h00); // write 0x00 to 0x026a + init_data[247] = cmd_wr(8'h5a); // write 0x5a to 0x026b + init_data[248] = cmd_wr(8'h52); // write 0x52 to 0x026c + init_data[249] = cmd_wr(8'h46); // write 0x46 to 0x026d + init_data[250] = cmd_wr(8'h38); // write 0x38 to 0x026e + init_data[251] = cmd_wr(8'h45); // write 0x45 to 0x026f + init_data[252] = cmd_wr(8'h4d); // write 0x4d to 0x0270 + init_data[253] = cmd_wr(8'h30); // write 0x30 to 0x0271 + init_data[254] = cmd_wr(8'h31); // write 0x31 to 0x0272 + init_data[255] = cmd_start(7'h74); + init_data[256] = cmd_wr(8'h01); + init_data[257] = cmd_wr(8'h03); // set page 0x03 + init_data[258] = cmd_start(7'h74); + init_data[259] = cmd_wr(8'h02); + init_data[260] = cmd_wr(8'h00); // write 0x00 to 0x0302 + init_data[261] = cmd_wr(8'h00); // write 0x00 to 0x0303 + init_data[262] = cmd_wr(8'h00); // write 0x00 to 0x0304 + init_data[263] = cmd_wr(8'h00); // write 0x00 to 0x0305 + init_data[264] = cmd_wr(8'h08); // write 0x08 to 0x0306 + init_data[265] = cmd_wr(8'h00); // write 0x00 to 0x0307 + init_data[266] = cmd_wr(8'h00); // write 0x00 to 0x0308 + init_data[267] = cmd_wr(8'h00); // write 0x00 to 0x0309 + init_data[268] = cmd_wr(8'h80); // write 0x80 to 0x030a + init_data[269] = cmd_wr(8'h89); // write 0x89 to 0x030b + init_data[270] = cmd_wr(8'h00); // write 0x00 to 0x030c + init_data[271] = cmd_wr(8'h00); // write 0x00 to 0x030d + init_data[272] = cmd_wr(8'h00); // write 0x00 to 0x030e + init_data[273] = cmd_wr(8'h00); // write 0x00 to 0x030f + init_data[274] = cmd_wr(8'h00); // write 0x00 to 0x0310 + init_data[275] = cmd_wr(8'h24); // write 0x24 to 0x0311 + init_data[276] = cmd_wr(8'h00); // write 0x00 to 0x0312 + init_data[277] = cmd_wr(8'h00); // write 0x00 to 0x0313 + init_data[278] = cmd_wr(8'h00); // write 0x00 to 0x0314 + init_data[279] = cmd_wr(8'h00); // write 0x00 to 0x0315 + init_data[280] = cmd_wr(8'ha0); // write 0xa0 to 0x0316 + init_data[281] = cmd_wr(8'h00); // write 0x00 to 0x0317 + init_data[282] = cmd_wr(8'h00); // write 0x00 to 0x0318 + init_data[283] = cmd_wr(8'h00); // write 0x00 to 0x0319 + init_data[284] = cmd_wr(8'h00); // write 0x00 to 0x031a + init_data[285] = cmd_wr(8'h00); // write 0x00 to 0x031b + init_data[286] = cmd_wr(8'h06); // write 0x06 to 0x031c + init_data[287] = cmd_wr(8'h00); // write 0x00 to 0x031d + init_data[288] = cmd_wr(8'h00); // write 0x00 to 0x031e + init_data[289] = cmd_wr(8'h00); // write 0x00 to 0x031f + init_data[290] = cmd_wr(8'h00); // write 0x00 to 0x0320 + init_data[291] = cmd_wr(8'h80); // write 0x80 to 0x0321 + init_data[292] = cmd_wr(8'h00); // write 0x00 to 0x0322 + init_data[293] = cmd_wr(8'h00); // write 0x00 to 0x0323 + init_data[294] = cmd_wr(8'h00); // write 0x00 to 0x0324 + init_data[295] = cmd_wr(8'h00); // write 0x00 to 0x0325 + init_data[296] = cmd_wr(8'h40); // write 0x40 to 0x0326 + init_data[297] = cmd_wr(8'h06); // write 0x06 to 0x0327 + init_data[298] = cmd_wr(8'h00); // write 0x00 to 0x0328 + init_data[299] = cmd_wr(8'h00); // write 0x00 to 0x0329 + init_data[300] = cmd_wr(8'h00); // write 0x00 to 0x032a + init_data[301] = cmd_wr(8'h00); // write 0x00 to 0x032b + init_data[302] = cmd_wr(8'h9c); // write 0x9c to 0x032c + init_data[303] = cmd_wr(8'h00); // write 0x00 to 0x032d + init_data[304] = cmd_wr(8'h00); // write 0x00 to 0x032e + init_data[305] = cmd_wr(8'h00); // write 0x00 to 0x032f + init_data[306] = cmd_wr(8'h00); // write 0x00 to 0x0330 + init_data[307] = cmd_wr(8'h00); // write 0x00 to 0x0331 + init_data[308] = cmd_wr(8'h00); // write 0x00 to 0x0332 + init_data[309] = cmd_wr(8'h00); // write 0x00 to 0x0333 + init_data[310] = cmd_wr(8'h00); // write 0x00 to 0x0334 + init_data[311] = cmd_wr(8'h00); // write 0x00 to 0x0335 + init_data[312] = cmd_wr(8'h00); // write 0x00 to 0x0336 + init_data[313] = cmd_wr(8'h00); // write 0x00 to 0x0337 + init_data[314] = cmd_wr(8'h00); // write 0x00 to 0x0338 + init_data[315] = cmd_wr(8'h1f); // write 0x1f to 0x0339 + init_data[316] = cmd_start(7'h74); + init_data[317] = cmd_wr(8'h3b); + init_data[318] = cmd_wr(8'h00); // write 0x00 to 0x033b + init_data[319] = cmd_wr(8'h00); // write 0x00 to 0x033c + init_data[320] = cmd_wr(8'h00); // write 0x00 to 0x033d + init_data[321] = cmd_wr(8'h00); // write 0x00 to 0x033e + init_data[322] = cmd_wr(8'h00); // write 0x00 to 0x033f + init_data[323] = cmd_wr(8'h00); // write 0x00 to 0x0340 + init_data[324] = cmd_wr(8'h00); // write 0x00 to 0x0341 + init_data[325] = cmd_wr(8'h00); // write 0x00 to 0x0342 + init_data[326] = cmd_wr(8'h00); // write 0x00 to 0x0343 + init_data[327] = cmd_wr(8'h00); // write 0x00 to 0x0344 + init_data[328] = cmd_wr(8'h00); // write 0x00 to 0x0345 + init_data[329] = cmd_wr(8'h00); // write 0x00 to 0x0346 + init_data[330] = cmd_wr(8'h00); // write 0x00 to 0x0347 + init_data[331] = cmd_wr(8'h00); // write 0x00 to 0x0348 + init_data[332] = cmd_wr(8'h00); // write 0x00 to 0x0349 + init_data[333] = cmd_wr(8'h00); // write 0x00 to 0x034a + init_data[334] = cmd_wr(8'h00); // write 0x00 to 0x034b + init_data[335] = cmd_wr(8'h00); // write 0x00 to 0x034c + init_data[336] = cmd_wr(8'h00); // write 0x00 to 0x034d + init_data[337] = cmd_wr(8'h00); // write 0x00 to 0x034e + init_data[338] = cmd_wr(8'h00); // write 0x00 to 0x034f + init_data[339] = cmd_wr(8'h00); // write 0x00 to 0x0350 + init_data[340] = cmd_wr(8'h00); // write 0x00 to 0x0351 + init_data[341] = cmd_wr(8'h00); // write 0x00 to 0x0352 + init_data[342] = cmd_wr(8'h00); // write 0x00 to 0x0353 + init_data[343] = cmd_wr(8'h00); // write 0x00 to 0x0354 + init_data[344] = cmd_wr(8'h00); // write 0x00 to 0x0355 + init_data[345] = cmd_wr(8'h00); // write 0x00 to 0x0356 + init_data[346] = cmd_wr(8'h00); // write 0x00 to 0x0357 + init_data[347] = cmd_wr(8'h00); // write 0x00 to 0x0358 + init_data[348] = cmd_wr(8'h00); // write 0x00 to 0x0359 + init_data[349] = cmd_wr(8'h00); // write 0x00 to 0x035a + init_data[350] = cmd_wr(8'h00); // write 0x00 to 0x035b + init_data[351] = cmd_wr(8'h00); // write 0x00 to 0x035c + init_data[352] = cmd_wr(8'h00); // write 0x00 to 0x035d + init_data[353] = cmd_wr(8'h00); // write 0x00 to 0x035e + init_data[354] = cmd_wr(8'h00); // write 0x00 to 0x035f + init_data[355] = cmd_wr(8'h00); // write 0x00 to 0x0360 + init_data[356] = cmd_wr(8'h00); // write 0x00 to 0x0361 + init_data[357] = cmd_wr(8'h00); // write 0x00 to 0x0362 + init_data[358] = cmd_start(7'h74); + init_data[359] = cmd_wr(8'h01); + init_data[360] = cmd_wr(8'h08); // set page 0x08 + init_data[361] = cmd_start(7'h74); + init_data[362] = cmd_wr(8'h02); + init_data[363] = cmd_wr(8'h00); // write 0x00 to 0x0802 + init_data[364] = cmd_wr(8'h00); // write 0x00 to 0x0803 + init_data[365] = cmd_wr(8'h00); // write 0x00 to 0x0804 + init_data[366] = cmd_wr(8'h00); // write 0x00 to 0x0805 + init_data[367] = cmd_wr(8'h00); // write 0x00 to 0x0806 + init_data[368] = cmd_wr(8'h00); // write 0x00 to 0x0807 + init_data[369] = cmd_wr(8'h00); // write 0x00 to 0x0808 + init_data[370] = cmd_wr(8'h00); // write 0x00 to 0x0809 + init_data[371] = cmd_wr(8'h00); // write 0x00 to 0x080a + init_data[372] = cmd_wr(8'h00); // write 0x00 to 0x080b + init_data[373] = cmd_wr(8'h00); // write 0x00 to 0x080c + init_data[374] = cmd_wr(8'h00); // write 0x00 to 0x080d + init_data[375] = cmd_wr(8'h00); // write 0x00 to 0x080e + init_data[376] = cmd_wr(8'h00); // write 0x00 to 0x080f + init_data[377] = cmd_wr(8'h00); // write 0x00 to 0x0810 + init_data[378] = cmd_wr(8'h00); // write 0x00 to 0x0811 + init_data[379] = cmd_wr(8'h00); // write 0x00 to 0x0812 + init_data[380] = cmd_wr(8'h00); // write 0x00 to 0x0813 + init_data[381] = cmd_wr(8'h00); // write 0x00 to 0x0814 + init_data[382] = cmd_wr(8'h00); // write 0x00 to 0x0815 + init_data[383] = cmd_wr(8'h00); // write 0x00 to 0x0816 + init_data[384] = cmd_wr(8'h00); // write 0x00 to 0x0817 + init_data[385] = cmd_wr(8'h00); // write 0x00 to 0x0818 + init_data[386] = cmd_wr(8'h00); // write 0x00 to 0x0819 + init_data[387] = cmd_wr(8'h00); // write 0x00 to 0x081a + init_data[388] = cmd_wr(8'h00); // write 0x00 to 0x081b + init_data[389] = cmd_wr(8'h00); // write 0x00 to 0x081c + init_data[390] = cmd_wr(8'h00); // write 0x00 to 0x081d + init_data[391] = cmd_wr(8'h00); // write 0x00 to 0x081e + init_data[392] = cmd_wr(8'h00); // write 0x00 to 0x081f + init_data[393] = cmd_wr(8'h00); // write 0x00 to 0x0820 + init_data[394] = cmd_wr(8'h00); // write 0x00 to 0x0821 + init_data[395] = cmd_wr(8'h00); // write 0x00 to 0x0822 + init_data[396] = cmd_wr(8'h00); // write 0x00 to 0x0823 + init_data[397] = cmd_wr(8'h00); // write 0x00 to 0x0824 + init_data[398] = cmd_wr(8'h00); // write 0x00 to 0x0825 + init_data[399] = cmd_wr(8'h00); // write 0x00 to 0x0826 + init_data[400] = cmd_wr(8'h00); // write 0x00 to 0x0827 + init_data[401] = cmd_wr(8'h00); // write 0x00 to 0x0828 + init_data[402] = cmd_wr(8'h00); // write 0x00 to 0x0829 + init_data[403] = cmd_wr(8'h00); // write 0x00 to 0x082a + init_data[404] = cmd_wr(8'h00); // write 0x00 to 0x082b + init_data[405] = cmd_wr(8'h00); // write 0x00 to 0x082c + init_data[406] = cmd_wr(8'h00); // write 0x00 to 0x082d + init_data[407] = cmd_wr(8'h00); // write 0x00 to 0x082e + init_data[408] = cmd_wr(8'h00); // write 0x00 to 0x082f + init_data[409] = cmd_wr(8'h00); // write 0x00 to 0x0830 + init_data[410] = cmd_wr(8'h00); // write 0x00 to 0x0831 + init_data[411] = cmd_wr(8'h00); // write 0x00 to 0x0832 + init_data[412] = cmd_wr(8'h00); // write 0x00 to 0x0833 + init_data[413] = cmd_wr(8'h00); // write 0x00 to 0x0834 + init_data[414] = cmd_wr(8'h00); // write 0x00 to 0x0835 + init_data[415] = cmd_wr(8'h00); // write 0x00 to 0x0836 + init_data[416] = cmd_wr(8'h00); // write 0x00 to 0x0837 + init_data[417] = cmd_wr(8'h00); // write 0x00 to 0x0838 + init_data[418] = cmd_wr(8'h00); // write 0x00 to 0x0839 + init_data[419] = cmd_wr(8'h00); // write 0x00 to 0x083a + init_data[420] = cmd_wr(8'h00); // write 0x00 to 0x083b + init_data[421] = cmd_wr(8'h00); // write 0x00 to 0x083c + init_data[422] = cmd_wr(8'h00); // write 0x00 to 0x083d + init_data[423] = cmd_wr(8'h00); // write 0x00 to 0x083e + init_data[424] = cmd_wr(8'h00); // write 0x00 to 0x083f + init_data[425] = cmd_wr(8'h00); // write 0x00 to 0x0840 + init_data[426] = cmd_wr(8'h00); // write 0x00 to 0x0841 + init_data[427] = cmd_wr(8'h00); // write 0x00 to 0x0842 + init_data[428] = cmd_wr(8'h00); // write 0x00 to 0x0843 + init_data[429] = cmd_wr(8'h00); // write 0x00 to 0x0844 + init_data[430] = cmd_wr(8'h00); // write 0x00 to 0x0845 + init_data[431] = cmd_wr(8'h00); // write 0x00 to 0x0846 + init_data[432] = cmd_wr(8'h00); // write 0x00 to 0x0847 + init_data[433] = cmd_wr(8'h00); // write 0x00 to 0x0848 + init_data[434] = cmd_wr(8'h00); // write 0x00 to 0x0849 + init_data[435] = cmd_wr(8'h00); // write 0x00 to 0x084a + init_data[436] = cmd_wr(8'h00); // write 0x00 to 0x084b + init_data[437] = cmd_wr(8'h00); // write 0x00 to 0x084c + init_data[438] = cmd_wr(8'h00); // write 0x00 to 0x084d + init_data[439] = cmd_wr(8'h00); // write 0x00 to 0x084e + init_data[440] = cmd_wr(8'h00); // write 0x00 to 0x084f + init_data[441] = cmd_wr(8'h00); // write 0x00 to 0x0850 + init_data[442] = cmd_wr(8'h00); // write 0x00 to 0x0851 + init_data[443] = cmd_wr(8'h00); // write 0x00 to 0x0852 + init_data[444] = cmd_wr(8'h00); // write 0x00 to 0x0853 + init_data[445] = cmd_wr(8'h00); // write 0x00 to 0x0854 + init_data[446] = cmd_wr(8'h00); // write 0x00 to 0x0855 + init_data[447] = cmd_wr(8'h00); // write 0x00 to 0x0856 + init_data[448] = cmd_wr(8'h00); // write 0x00 to 0x0857 + init_data[449] = cmd_wr(8'h00); // write 0x00 to 0x0858 + init_data[450] = cmd_wr(8'h00); // write 0x00 to 0x0859 + init_data[451] = cmd_wr(8'h00); // write 0x00 to 0x085a + init_data[452] = cmd_wr(8'h00); // write 0x00 to 0x085b + init_data[453] = cmd_wr(8'h00); // write 0x00 to 0x085c + init_data[454] = cmd_wr(8'h00); // write 0x00 to 0x085d + init_data[455] = cmd_wr(8'h00); // write 0x00 to 0x085e + init_data[456] = cmd_wr(8'h00); // write 0x00 to 0x085f + init_data[457] = cmd_wr(8'h00); // write 0x00 to 0x0860 + init_data[458] = cmd_wr(8'h00); // write 0x00 to 0x0861 + init_data[459] = cmd_start(7'h74); + init_data[460] = cmd_wr(8'h01); + init_data[461] = cmd_wr(8'h09); // set page 0x09 + init_data[462] = cmd_start(7'h74); + init_data[463] = cmd_wr(8'h0e); + init_data[464] = cmd_wr(8'h02); // write 0x02 to 0x090e + init_data[465] = cmd_start(7'h74); + init_data[466] = cmd_wr(8'h1c); + init_data[467] = cmd_wr(8'h04); // write 0x04 to 0x091c + init_data[468] = cmd_start(7'h74); + init_data[469] = cmd_wr(8'h43); + init_data[470] = cmd_wr(8'h01); // write 0x01 to 0x0943 + init_data[471] = cmd_start(7'h74); + init_data[472] = cmd_wr(8'h49); + init_data[473] = cmd_wr(8'h00); // write 0x00 to 0x0949 + init_data[474] = cmd_wr(8'h00); // write 0x00 to 0x094a + init_data[475] = cmd_start(7'h74); + init_data[476] = cmd_wr(8'h4e); + init_data[477] = cmd_wr(8'h49); // write 0x49 to 0x094e + init_data[478] = cmd_wr(8'h02); // write 0x02 to 0x094f + init_data[479] = cmd_start(7'h74); + init_data[480] = cmd_wr(8'h5e); + init_data[481] = cmd_wr(8'h00); // write 0x00 to 0x095e + init_data[482] = cmd_start(7'h74); + init_data[483] = cmd_wr(8'h01); + init_data[484] = cmd_wr(8'h0a); // set page 0x0a + init_data[485] = cmd_start(7'h74); + init_data[486] = cmd_wr(8'h02); + init_data[487] = cmd_wr(8'h00); // write 0x00 to 0x0a02 + init_data[488] = cmd_wr(8'h0f); // write 0x0f to 0x0a03 + init_data[489] = cmd_wr(8'h04); // write 0x04 to 0x0a04 + init_data[490] = cmd_wr(8'h0f); // write 0x0f to 0x0a05 + init_data[491] = cmd_start(7'h74); + init_data[492] = cmd_wr(8'h14); + init_data[493] = cmd_wr(8'h00); // write 0x00 to 0x0a14 + init_data[494] = cmd_start(7'h74); + init_data[495] = cmd_wr(8'h1a); + init_data[496] = cmd_wr(8'h00); // write 0x00 to 0x0a1a + init_data[497] = cmd_start(7'h74); + init_data[498] = cmd_wr(8'h20); + init_data[499] = cmd_wr(8'h00); // write 0x00 to 0x0a20 + init_data[500] = cmd_start(7'h74); + init_data[501] = cmd_wr(8'h26); + init_data[502] = cmd_wr(8'h00); // write 0x00 to 0x0a26 + init_data[503] = cmd_start(7'h74); + init_data[504] = cmd_wr(8'h2c); + init_data[505] = cmd_wr(8'h00); // write 0x00 to 0x0a2c + init_data[506] = cmd_start(7'h74); + init_data[507] = cmd_wr(8'h01); + init_data[508] = cmd_wr(8'h0b); // set page 0x0b + init_data[509] = cmd_start(7'h74); + init_data[510] = cmd_wr(8'h44); + init_data[511] = cmd_wr(8'h0f); // write 0x0f to 0x0b44 + init_data[512] = cmd_start(7'h74); + init_data[513] = cmd_wr(8'h4a); + init_data[514] = cmd_wr(8'h10); // write 0x10 to 0x0b4a + init_data[515] = cmd_start(7'h74); + init_data[516] = cmd_wr(8'h57); + init_data[517] = cmd_wr(8'h0e); // write 0x0e to 0x0b57 + init_data[518] = cmd_wr(8'h01); // write 0x01 to 0x0b58 + // End configuration registers + // + // Start configuration postamble + init_data[519] = cmd_start(7'h74); + init_data[520] = cmd_wr(8'h01); + init_data[521] = cmd_wr(8'h00); // set page 0x00 + init_data[522] = cmd_start(7'h74); + init_data[523] = cmd_wr(8'h1c); + init_data[524] = cmd_wr(8'h01); // write 0x01 to 0x001c + init_data[525] = cmd_start(7'h74); + init_data[526] = cmd_wr(8'h01); + init_data[527] = cmd_wr(8'h0b); // set page 0x0b + init_data[528] = cmd_start(7'h74); + init_data[529] = cmd_wr(8'h24); + init_data[530] = cmd_wr(8'hc3); // write 0xc3 to 0x0b24 + init_data[531] = cmd_wr(8'h02); // write 0x02 to 0x0b25 + // End configuration postamble + // Set mux to select I2C-SPI bridge on HTG-ZRF8-EM + init_data[532] = cmd_start(7'h71); + init_data[533] = cmd_wr(8'h0a); + init_data[534] = cmd_stop(); // I2C stop + // Configure I2C-SPI bridge + init_data[535] = cmd_start(7'h2a); + init_data[536] = cmd_wr(8'hf0); + init_data[537] = cmd_wr(8'h00); + init_data[538] = cmd_start(7'h2a); + init_data[539] = cmd_wr(8'hf6); + init_data[540] = cmd_wr(8'h00); + // Configuration for LMK04832 PLL on HTG-ZRF8-EM + // PLL1 + // CLKin0 = 12.2880 MHz TCXO + // CLKin1 = 10 MHz + // CLKin0 R = 768 + // CLKin1 R = 625 + // PFD = in0 / R0 = in1 / R1 = 16 kHz + // N1 = 7680 + // VCO = PFD * N1 = 122.88 MHz + // Ext VCO is 122.88 MHz + // PLL2 + // 122.88 MHz from ext VCO + // VCO0 range 2440 - 2580 MHz + // VCO1 range 2945 - 3255 MHz + // R2 = 1536 + // P = 2 + // N2 = 15625 + // PFD = 122.88 / R2 = 0.08 + // VCO = PFD * P * N2 = 2500 + // VCO/10 = 250 MHz + // VCO/250 = 10 MHz + // VCO/1280 = 1.953125 MHz + // CLKout0: DAC 228 SYSREF + // CLKout1: SYNC_IN_PLL1/SYNC_IN_PLL2 + // CLKout2: RF_CLKOUT to Si5341 + // CLKout3: SYNC_IN_PLL3 + // CLKout4: CLK_IN_PLL3 + // CLKout5: NC + // CLKout6: CLK_IN_PLL2 + // CLKout7: NC + // CLKout8: LMK_CLK_OUT SMPM + // CLKout9: NC + // CLKout10: CLK_IN_PLL1 + // CLKout11: NC + // CLKout12: SYSREF_FPGA + // CLKout13: REFCLK_FPGA + // Reset + init_data[541] = cmd_start(7'h2a); + init_data[542] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[543] = cmd_wr(8'h00); // address 0x0000 + init_data[544] = cmd_wr(8'h00); + init_data[545] = cmd_wr(8'h80); // write 0x80 + // Configure outputs + // DCLK0_1_DIV: 10 (2500/10 = 250) + init_data[546] = cmd_start(7'h2a); + init_data[547] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[548] = cmd_wr(8'h01); // address 0x0100 + init_data[549] = cmd_wr(8'h00); + init_data[550] = cmd_wr(8'h0a); // write 0x0a + // DCLK0_1_DDLY: 10 + init_data[551] = cmd_start(7'h2a); + init_data[552] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[553] = cmd_wr(8'h01); // address 0x0101 + init_data[554] = cmd_wr(8'h01); + init_data[555] = cmd_wr(8'h0a); // write 0x0a + // CLKout0_1_PD + init_data[556] = cmd_start(7'h2a); + init_data[557] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[558] = cmd_wr(8'h01); // address 0x0102 + init_data[559] = cmd_wr(8'h02); + init_data[560] = cmd_wr(8'h00); // write 0x00 + // CLKout0_SRC_MUX: 1 (sysref) + init_data[561] = cmd_start(7'h2a); + init_data[562] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[563] = cmd_wr(8'h01); // address 0x0103 + init_data[564] = cmd_wr(8'h03); + init_data[565] = cmd_wr(8'h60); // write 0x60 + // CLKout1_SRC_MUX: 1 (sysref) + init_data[566] = cmd_start(7'h2a); + init_data[567] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[568] = cmd_wr(8'h01); // address 0x0104 + init_data[569] = cmd_wr(8'h04); + init_data[570] = cmd_wr(8'h20); // write 0x20 + // SCLK0_1_ADLY: 0 + init_data[571] = cmd_start(7'h2a); + init_data[572] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[573] = cmd_wr(8'h01); // address 0x0105 + init_data[574] = cmd_wr(8'h05); + init_data[575] = cmd_wr(8'h00); // write 0x00 + // SCLK0_1_DDLY: 0 + init_data[576] = cmd_start(7'h2a); + init_data[577] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[578] = cmd_wr(8'h01); // address 0x0106 + init_data[579] = cmd_wr(8'h06); + init_data[580] = cmd_wr(8'h00); // write 0x00 + // CLKout0_FMT: 1 (LVDS) + // CLKout1_FMT: 15 (CMOS norm/norm) + init_data[581] = cmd_start(7'h2a); + init_data[582] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[583] = cmd_wr(8'h01); // address 0x0107 + init_data[584] = cmd_wr(8'h07); + init_data[585] = cmd_wr(8'hf1); // write 0xf1 + // DCLK2_3_DIV: 10 (2500/10 = 250) + init_data[586] = cmd_start(7'h2a); + init_data[587] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[588] = cmd_wr(8'h01); // address 0x0108 + init_data[589] = cmd_wr(8'h08); + init_data[590] = cmd_wr(8'h0a); // write 0x0a + // DCLK2_3_DDLY: 10 + init_data[591] = cmd_start(7'h2a); + init_data[592] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[593] = cmd_wr(8'h01); // address 0x0109 + init_data[594] = cmd_wr(8'h09); + init_data[595] = cmd_wr(8'h0a); // write 0x0a + // CLKout2_3_PD + init_data[596] = cmd_start(7'h2a); + init_data[597] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[598] = cmd_wr(8'h01); // address 0x010a + init_data[599] = cmd_wr(8'h0a); + init_data[600] = cmd_wr(8'h00); // write 0x00 + // CLKout2_SRC_MUX: 0 (device clock) + init_data[601] = cmd_start(7'h2a); + init_data[602] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[603] = cmd_wr(8'h01); // address 0x010b + init_data[604] = cmd_wr(8'h0b); + init_data[605] = cmd_wr(8'h40); // write 0x40 + // CLKout3_SRC_MUX: 1 (sysref) + init_data[606] = cmd_start(7'h2a); + init_data[607] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[608] = cmd_wr(8'h01); // address 0x010c + init_data[609] = cmd_wr(8'h0c); + init_data[610] = cmd_wr(8'h20); // write 0x20 + // SCLK2_3_ADLY: 0 + init_data[611] = cmd_start(7'h2a); + init_data[612] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[613] = cmd_wr(8'h01); // address 0x010d + init_data[614] = cmd_wr(8'h0d); + init_data[615] = cmd_wr(8'h00); // write 0x00 + // SCLK2_3_DDLY: 0 + init_data[616] = cmd_start(7'h2a); + init_data[617] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[618] = cmd_wr(8'h01); // address 0x010e + init_data[619] = cmd_wr(8'h0e); + init_data[620] = cmd_wr(8'h00); // write 0x00 + // CLKout2_FMT: 1 (LVDS) + // CLKout3_FMT: 12 (CMOS norm/norm) + init_data[621] = cmd_start(7'h2a); + init_data[622] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[623] = cmd_wr(8'h01); // address 0x010f + init_data[624] = cmd_wr(8'h0f); + init_data[625] = cmd_wr(8'hc1); // write 0xc1 + // DCLK4_5_DIV: 10 (2500/10 = 250) + init_data[626] = cmd_start(7'h2a); + init_data[627] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[628] = cmd_wr(8'h01); // address 0x0110 + init_data[629] = cmd_wr(8'h10); + init_data[630] = cmd_wr(8'h0a); // write 0x0a + // DCLK4_5_DDLY: 10 + init_data[631] = cmd_start(7'h2a); + init_data[632] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[633] = cmd_wr(8'h01); // address 0x0111 + init_data[634] = cmd_wr(8'h11); + init_data[635] = cmd_wr(8'h0a); // write 0x0a + // CLKout4_5_PD + init_data[636] = cmd_start(7'h2a); + init_data[637] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[638] = cmd_wr(8'h01); // address 0x0112 + init_data[639] = cmd_wr(8'h12); + init_data[640] = cmd_wr(8'h00); // write 0x00 + // CLKout4_SRC_MUX: 0 (device clock) + init_data[641] = cmd_start(7'h2a); + init_data[642] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[643] = cmd_wr(8'h01); // address 0x0113 + init_data[644] = cmd_wr(8'h13); + init_data[645] = cmd_wr(8'h40); // write 0x40 + // CLKout5_SRC_MUX: 1 (sysref) + init_data[646] = cmd_start(7'h2a); + init_data[647] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[648] = cmd_wr(8'h01); // address 0x0114 + init_data[649] = cmd_wr(8'h14); + init_data[650] = cmd_wr(8'h20); // write 0x20 + // SCLK4_5_ADLY: 0 + init_data[651] = cmd_start(7'h2a); + init_data[652] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[653] = cmd_wr(8'h01); // address 0x0115 + init_data[654] = cmd_wr(8'h15); + init_data[655] = cmd_wr(8'h00); // write 0x00 + // SCLK4_5_DDLY: 0 + init_data[656] = cmd_start(7'h2a); + init_data[657] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[658] = cmd_wr(8'h01); // address 0x0116 + init_data[659] = cmd_wr(8'h16); + init_data[660] = cmd_wr(8'h00); // write 0x00 + // CLKout4_FMT: 1 (LVDS) + // CLKout5_FMT: 0 (PD) + init_data[661] = cmd_start(7'h2a); + init_data[662] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[663] = cmd_wr(8'h01); // address 0x0117 + init_data[664] = cmd_wr(8'h17); + init_data[665] = cmd_wr(8'h01); // write 0x01 + // DCLK6_7_DIV: 10 (2500/10 = 250) + init_data[666] = cmd_start(7'h2a); + init_data[667] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[668] = cmd_wr(8'h01); // address 0x0118 + init_data[669] = cmd_wr(8'h18); + init_data[670] = cmd_wr(8'h0a); // write 0x0a + // DCLK6_7_DDLY: 10 + init_data[671] = cmd_start(7'h2a); + init_data[672] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[673] = cmd_wr(8'h01); // address 0x0119 + init_data[674] = cmd_wr(8'h19); + init_data[675] = cmd_wr(8'h0a); // write 0x0a + // CLKout6_7_PD + init_data[676] = cmd_start(7'h2a); + init_data[677] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[678] = cmd_wr(8'h01); // address 0x011a + init_data[679] = cmd_wr(8'h1a); + init_data[680] = cmd_wr(8'h00); // write 0x00 + // CLKout6_SRC_MUX: 0 (device clock) + init_data[681] = cmd_start(7'h2a); + init_data[682] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[683] = cmd_wr(8'h01); // address 0x011b + init_data[684] = cmd_wr(8'h1b); + init_data[685] = cmd_wr(8'h40); // write 0x40 + // CLKout7_SRC_MUX: 1 (sysref) + init_data[686] = cmd_start(7'h2a); + init_data[687] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[688] = cmd_wr(8'h01); // address 0x011c + init_data[689] = cmd_wr(8'h1c); + init_data[690] = cmd_wr(8'h20); // write 0x20 + // SCLK6_7_ADLY: 0 + init_data[691] = cmd_start(7'h2a); + init_data[692] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[693] = cmd_wr(8'h01); // address 0x011d + init_data[694] = cmd_wr(8'h1d); + init_data[695] = cmd_wr(8'h00); // write 0x00 + // SCLK6_7_DDLY: 0 + init_data[696] = cmd_start(7'h2a); + init_data[697] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[698] = cmd_wr(8'h01); // address 0x011e + init_data[699] = cmd_wr(8'h1e); + init_data[700] = cmd_wr(8'h00); // write 0x00 + // CLKout6_FMT: 1 (LVDS) + // CLKout7_FMT: 0 (PD) + init_data[701] = cmd_start(7'h2a); + init_data[702] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[703] = cmd_wr(8'h01); // address 0x011f + init_data[704] = cmd_wr(8'h1f); + init_data[705] = cmd_wr(8'h01); // write 0x01 + // DCLK8_9_DIV: 250 (2500/250 = 10) + init_data[706] = cmd_start(7'h2a); + init_data[707] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[708] = cmd_wr(8'h01); // address 0x0120 + init_data[709] = cmd_wr(8'h20); + init_data[710] = cmd_wr(8'hfa); // write 0xfa + // DCLK8_9_DDLY: 10 + init_data[711] = cmd_start(7'h2a); + init_data[712] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[713] = cmd_wr(8'h01); // address 0x0121 + init_data[714] = cmd_wr(8'h21); + init_data[715] = cmd_wr(8'h0a); // write 0x0a + // CLKout8_9_PD + init_data[716] = cmd_start(7'h2a); + init_data[717] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[718] = cmd_wr(8'h01); // address 0x0122 + init_data[719] = cmd_wr(8'h22); + init_data[720] = cmd_wr(8'h00); // write 0x00 + // CLKout8_SRC_MUX: 0 (device clock) + init_data[721] = cmd_start(7'h2a); + init_data[722] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[723] = cmd_wr(8'h01); // address 0x0123 + init_data[724] = cmd_wr(8'h23); + init_data[725] = cmd_wr(8'h40); // write 0x40 + // CLKout9_SRC_MUX: 1 (sysref) + init_data[726] = cmd_start(7'h2a); + init_data[727] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[728] = cmd_wr(8'h01); // address 0x0124 + init_data[729] = cmd_wr(8'h24); + init_data[730] = cmd_wr(8'h20); // write 0x20 + // SCLK8_9_ADLY: 0 + init_data[731] = cmd_start(7'h2a); + init_data[732] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[733] = cmd_wr(8'h01); // address 0x0125 + init_data[734] = cmd_wr(8'h25); + init_data[735] = cmd_wr(8'h00); // write 0x00 + // SCLK8_9_DDLY: 0 + init_data[736] = cmd_start(7'h2a); + init_data[737] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[738] = cmd_wr(8'h01); // address 0x0126 + init_data[739] = cmd_wr(8'h26); + init_data[740] = cmd_wr(8'h00); // write 0x00 + // CLKout8_FMT: 5 (LVPECL 2000 mV) + // CLKout9_FMT: 0 (PD) + init_data[741] = cmd_start(7'h2a); + init_data[742] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[743] = cmd_wr(8'h01); // address 0x0127 + init_data[744] = cmd_wr(8'h27); + init_data[745] = cmd_wr(8'h05); // write 0x05 + // DCLK10_11_DIV: 10 (2500/10 = 250) + init_data[746] = cmd_start(7'h2a); + init_data[747] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[748] = cmd_wr(8'h01); // address 0x0128 + init_data[749] = cmd_wr(8'h28); + init_data[750] = cmd_wr(8'h0a); // write 0x0a + // DCLK10_11_DDLY: 10 + init_data[751] = cmd_start(7'h2a); + init_data[752] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[753] = cmd_wr(8'h01); // address 0x0129 + init_data[754] = cmd_wr(8'h29); + init_data[755] = cmd_wr(8'h0a); // write 0x0a + // CLKout10_11_PD + init_data[756] = cmd_start(7'h2a); + init_data[757] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[758] = cmd_wr(8'h01); // address 0x012a + init_data[759] = cmd_wr(8'h2a); + init_data[760] = cmd_wr(8'h00); // write 0x00 + // CLKout10_SRC_MUX: 0 (device clock) + init_data[761] = cmd_start(7'h2a); + init_data[762] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[763] = cmd_wr(8'h01); // address 0x012b + init_data[764] = cmd_wr(8'h2b); + init_data[765] = cmd_wr(8'h40); // write 0x40 + // CLKout11_SRC_MUX: 1 (sysref) + init_data[766] = cmd_start(7'h2a); + init_data[767] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[768] = cmd_wr(8'h01); // address 0x012c + init_data[769] = cmd_wr(8'h2c); + init_data[770] = cmd_wr(8'h20); // write 0x20 + // SCLK10_11_ADLY: 0 + init_data[771] = cmd_start(7'h2a); + init_data[772] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[773] = cmd_wr(8'h01); // address 0x012d + init_data[774] = cmd_wr(8'h2d); + init_data[775] = cmd_wr(8'h00); // write 0x00 + // SCLK10_11_DDLY: 0 + init_data[776] = cmd_start(7'h2a); + init_data[777] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[778] = cmd_wr(8'h01); // address 0x012e + init_data[779] = cmd_wr(8'h2e); + init_data[780] = cmd_wr(8'h00); // write 0x00 + // CLKout10_FMT: 1 (LVDS) + // CLKout11_FMT: 0 (PD) + init_data[781] = cmd_start(7'h2a); + init_data[782] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[783] = cmd_wr(8'h01); // address 0x012f + init_data[784] = cmd_wr(8'h2f); + init_data[785] = cmd_wr(8'h01); // write 0x01 + // DCLK12_13_DIV: 10 (2500/10 = 250) + init_data[786] = cmd_start(7'h2a); + init_data[787] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[788] = cmd_wr(8'h01); // address 0x0130 + init_data[789] = cmd_wr(8'h30); + init_data[790] = cmd_wr(8'h0a); // write 0x0a + // DCLK12_13_DDLY: 10 + init_data[791] = cmd_start(7'h2a); + init_data[792] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[793] = cmd_wr(8'h01); // address 0x0131 + init_data[794] = cmd_wr(8'h31); + init_data[795] = cmd_wr(8'h0a); // write 0x0a + // CLKout12_13_PD + init_data[796] = cmd_start(7'h2a); + init_data[797] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[798] = cmd_wr(8'h01); // address 0x0132 + init_data[799] = cmd_wr(8'h32); + init_data[800] = cmd_wr(8'h00); // write 0x00 + // CLKout12_SRC_MUX: 1 (sysref) + init_data[801] = cmd_start(7'h2a); + init_data[802] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[803] = cmd_wr(8'h01); // address 0x0133 + init_data[804] = cmd_wr(8'h33); + init_data[805] = cmd_wr(8'h60); // write 0x60 + // CLKout13_SRC_MUX: 0 (device clock) + init_data[806] = cmd_start(7'h2a); + init_data[807] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[808] = cmd_wr(8'h01); // address 0x0134 + init_data[809] = cmd_wr(8'h34); + init_data[810] = cmd_wr(8'h00); // write 0x00 + // SCLK12_13_ADLY: 0 + init_data[811] = cmd_start(7'h2a); + init_data[812] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[813] = cmd_wr(8'h01); // address 0x0135 + init_data[814] = cmd_wr(8'h35); + init_data[815] = cmd_wr(8'h00); // write 0x00 + // SCLK12_13_DDLY: 0 + init_data[816] = cmd_start(7'h2a); + init_data[817] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[818] = cmd_wr(8'h01); // address 0x0136 + init_data[819] = cmd_wr(8'h36); + init_data[820] = cmd_wr(8'h00); // write 0x00 + // CLKout12_FMT: 1 (LVDS) + // CLKout13_FMT: 1 (LVDS) + init_data[821] = cmd_start(7'h2a); + init_data[822] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[823] = cmd_wr(8'h01); // address 0x0137 + init_data[824] = cmd_wr(8'h37); + init_data[825] = cmd_wr(8'h11); // write 0x11 + // configure PLL1 + // VCO_MUX: VCO0 + // OSCout_FMT: power down + init_data[826] = cmd_start(7'h2a); + init_data[827] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[828] = cmd_wr(8'h01); // address 0x0138 + init_data[829] = cmd_wr(8'h38); + init_data[830] = cmd_wr(8'h00); // write 0x00 + // PLL2_RCLK_MUX: 0 (OSCin) + // PLL2_NCLK_MUX: 0 (prescaler) + // PLL1_NCLK_MUX: 0 (OSCin) + // FB_MUX: 0 + // FB_MUX_EN: 0 + init_data[831] = cmd_start(7'h2a); + init_data[832] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[833] = cmd_wr(8'h01); // address 0x013f + init_data[834] = cmd_wr(8'h3f); + init_data[835] = cmd_wr(8'h00); // write 0x00 + // release power down + init_data[836] = cmd_start(7'h2a); + init_data[837] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[838] = cmd_wr(8'h01); // address 0x0140 + init_data[839] = cmd_wr(8'h40); + init_data[840] = cmd_wr(8'h00); // write 0x00 + // 0x141,0x00 + // 0x142,0x00 + // 0x143,0x00 + // 0x144,0x00 + // 0x145,0x00 + // enable CLKin0 and CLKin1 with bipolar buffers + init_data[841] = cmd_start(7'h2a); + init_data[842] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[843] = cmd_wr(8'h01); // address 0x0146 + init_data[844] = cmd_wr(8'h46); + init_data[845] = cmd_wr(8'h18); // write 0x18 + // route CLKin0 and CLKin1 to PLL1, enable auto revert + init_data[846] = cmd_start(7'h2a); + init_data[847] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[848] = cmd_wr(8'h01); // address 0x0147 + init_data[849] = cmd_wr(8'h47); + init_data[850] = cmd_wr(8'h8a); // write 0x8a + // CLKin_SEL0: input + init_data[851] = cmd_start(7'h2a); + init_data[852] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[853] = cmd_wr(8'h01); // address 0x0148 + init_data[854] = cmd_wr(8'h48); + init_data[855] = cmd_wr(8'h00); // write 0x00 + // CLKin_SEL1: input + init_data[856] = cmd_start(7'h2a); + init_data[857] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[858] = cmd_wr(8'h01); // address 0x0149 + init_data[859] = cmd_wr(8'h49); + init_data[860] = cmd_wr(8'h00); // write 0x00 + // reset mux/type: input + init_data[861] = cmd_start(7'h2a); + init_data[862] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[863] = cmd_wr(8'h01); // address 0x014a + init_data[864] = cmd_wr(8'h4a); + init_data[865] = cmd_wr(8'h00); // write 0x00 + // auto DAC + init_data[866] = cmd_start(7'h2a); + init_data[867] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[868] = cmd_wr(8'h01); // address 0x014b + init_data[869] = cmd_wr(8'h4b); + init_data[870] = cmd_wr(8'h10); // write 0x10 + // MAN_DAC + init_data[871] = cmd_start(7'h2a); + init_data[872] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[873] = cmd_wr(8'h01); // address 0x014c + init_data[874] = cmd_wr(8'h4c); + init_data[875] = cmd_wr(8'h00); // write 0x00 + // DAC trip low: 0 + init_data[876] = cmd_start(7'h2a); + init_data[877] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[878] = cmd_wr(8'h01); // address 0x014d + init_data[879] = cmd_wr(8'h4d); + init_data[880] = cmd_wr(8'h00); // write 0x00 + // DAC trip high: 63 + // DAC_CLK_MULT: 3 (16384) + init_data[881] = cmd_start(7'h2a); + init_data[882] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[883] = cmd_wr(8'h01); // address 0x014e + init_data[884] = cmd_wr(8'h4e); + init_data[885] = cmd_wr(8'hff); // write 0xff + // DAC_CLK_CNTR + init_data[886] = cmd_start(7'h2a); + init_data[887] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[888] = cmd_wr(8'h01); // address 0x014f + init_data[889] = cmd_wr(8'h4f); + init_data[890] = cmd_wr(8'h7f); // write 0x7f + // no holdover + init_data[891] = cmd_start(7'h2a); + init_data[892] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[893] = cmd_wr(8'h01); // address 0x0150 + init_data[894] = cmd_wr(8'h50); + init_data[895] = cmd_wr(8'h00); // write 0x00 + // holdover DLD count + // 0x151,0x00 + // 0x152,0x00 + // CLKin0 R = 768 (0x300) + init_data[896] = cmd_start(7'h2a); + init_data[897] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[898] = cmd_wr(8'h01); // address 0x0153 + init_data[899] = cmd_wr(8'h53); + init_data[900] = cmd_wr(8'h03); // write 0x03 + init_data[901] = cmd_start(7'h2a); + init_data[902] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[903] = cmd_wr(8'h01); // address 0x0154 + init_data[904] = cmd_wr(8'h54); + init_data[905] = cmd_wr(8'h00); // write 0x00 + // CLKin1 R = 625 (0x271) + init_data[906] = cmd_start(7'h2a); + init_data[907] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[908] = cmd_wr(8'h01); // address 0x0155 + init_data[909] = cmd_wr(8'h55); + init_data[910] = cmd_wr(8'h02); // write 0x02 + init_data[911] = cmd_start(7'h2a); + init_data[912] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[913] = cmd_wr(8'h01); // address 0x0156 + init_data[914] = cmd_wr(8'h56); + init_data[915] = cmd_wr(8'h71); // write 0x71 + // CLKin2 R + // 0x157,0x00 + // 0x158,0x00 + // PLL1 N = 7680 (0x1e00) + init_data[916] = cmd_start(7'h2a); + init_data[917] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[918] = cmd_wr(8'h01); // address 0x0159 + init_data[919] = cmd_wr(8'h59); + init_data[920] = cmd_wr(8'h1e); // write 0x1e + init_data[921] = cmd_start(7'h2a); + init_data[922] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[923] = cmd_wr(8'h01); // address 0x015a + init_data[924] = cmd_wr(8'h5a); + init_data[925] = cmd_wr(8'h00); // write 0x00 + // PLL1_WND_SIZE: 3 + // PLL1_CP_TRI: 0 + // PLL1_CP_POL: 1 + // PLL1_CP_GAIN: 4 + init_data[926] = cmd_start(7'h2a); + init_data[927] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[928] = cmd_wr(8'h01); // address 0x015b + init_data[929] = cmd_wr(8'h5b); + init_data[930] = cmd_wr(8'hd4); // write 0xd4 + // PLL1_DLD_CNT: 32, 0 + init_data[931] = cmd_start(7'h2a); + init_data[932] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[933] = cmd_wr(8'h01); // address 0x015c + init_data[934] = cmd_wr(8'h5c); + init_data[935] = cmd_wr(8'h20); // write 0x20 + init_data[936] = cmd_start(7'h2a); + init_data[937] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[938] = cmd_wr(8'h01); // address 0x015d + init_data[939] = cmd_wr(8'h5d); + init_data[940] = cmd_wr(8'h00); // write 0x00 + // HOLDOVER_EXIT_NADJ: 30 + init_data[941] = cmd_start(7'h2a); + init_data[942] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[943] = cmd_wr(8'h01); // address 0x015e + init_data[944] = cmd_wr(8'h5e); + init_data[945] = cmd_wr(8'h1e); // write 0x1e + // PLL1 LD pin: SPI readback + init_data[946] = cmd_start(7'h2a); + init_data[947] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[948] = cmd_wr(8'h01); // address 0x015f + init_data[949] = cmd_wr(8'h5f); + init_data[950] = cmd_wr(8'h3b); // write 0x3b + // configure PLL2 + // release PLL2 PD + init_data[951] = cmd_start(7'h2a); + init_data[952] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[953] = cmd_wr(8'h01); // address 0x0173 + init_data[954] = cmd_wr(8'h73); + init_data[955] = cmd_wr(8'h10); // write 0x10 + // PLL2 R: 1536 (0x600) + init_data[956] = cmd_start(7'h2a); + init_data[957] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[958] = cmd_wr(8'h01); // address 0x0160 + init_data[959] = cmd_wr(8'h60); + init_data[960] = cmd_wr(8'h06); // write 0x06 + init_data[961] = cmd_start(7'h2a); + init_data[962] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[963] = cmd_wr(8'h01); // address 0x0161 + init_data[964] = cmd_wr(8'h61); + init_data[965] = cmd_wr(8'h00); // write 0x00 + // PLL2 P: 2 (2) + // OSCin_FREQ: 1 (63-127) + // 2X: off + init_data[966] = cmd_start(7'h2a); + init_data[967] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[968] = cmd_wr(8'h01); // address 0x0162 + init_data[969] = cmd_wr(8'h62); + init_data[970] = cmd_wr(8'h44); // write 0x44 + // PLL2_N_CAL: 15625 (0x3d09) + init_data[971] = cmd_start(7'h2a); + init_data[972] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[973] = cmd_wr(8'h01); // address 0x0163 + init_data[974] = cmd_wr(8'h63); + init_data[975] = cmd_wr(8'h00); // write 0x00 + init_data[976] = cmd_start(7'h2a); + init_data[977] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[978] = cmd_wr(8'h01); // address 0x0164 + init_data[979] = cmd_wr(8'h64); + init_data[980] = cmd_wr(8'h3d); // write 0x3d + init_data[981] = cmd_start(7'h2a); + init_data[982] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[983] = cmd_wr(8'h01); // address 0x0165 + init_data[984] = cmd_wr(8'h65); + init_data[985] = cmd_wr(8'h09); // write 0x09 + // PLL2_N_CAL: 15625 (0x3d09) + init_data[986] = cmd_start(7'h2a); + init_data[987] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[988] = cmd_wr(8'h01); // address 0x0166 + init_data[989] = cmd_wr(8'h66); + init_data[990] = cmd_wr(8'h00); // write 0x00 + init_data[991] = cmd_start(7'h2a); + init_data[992] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[993] = cmd_wr(8'h01); // address 0x0167 + init_data[994] = cmd_wr(8'h67); + init_data[995] = cmd_wr(8'h3d); // write 0x3d + init_data[996] = cmd_start(7'h2a); + init_data[997] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[998] = cmd_wr(8'h01); // address 0x0168 + init_data[999] = cmd_wr(8'h68); + init_data[1000] = cmd_wr(8'h09); // write 0x09 + // PLL2_WND_SIZE: 2 (1.8 ns) + // PLL2_CP_GAIN: 3 + // PLL2_CP_POL: 0 + // PLL2_CP_TRI: 0 + // PLL2_DLD_EN: 1 + init_data[1001] = cmd_start(7'h2a); + init_data[1002] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[1003] = cmd_wr(8'h01); // address 0x0169 + init_data[1004] = cmd_wr(8'h69); + init_data[1005] = cmd_wr(8'h59); // write 0x59 + // PLL2_DLD_CNT: 32, 0 + init_data[1006] = cmd_start(7'h2a); + init_data[1007] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[1008] = cmd_wr(8'h01); // address 0x016a + init_data[1009] = cmd_wr(8'h6a); + init_data[1010] = cmd_wr(8'h20); // write 0x20 + init_data[1011] = cmd_start(7'h2a); + init_data[1012] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[1013] = cmd_wr(8'h01); // address 0x016b + init_data[1014] = cmd_wr(8'h6b); + init_data[1015] = cmd_wr(8'h00); // write 0x00 + // PLL2 LD pin: PLL1+PLL2 DLD + init_data[1016] = cmd_start(7'h2a); + init_data[1017] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[1018] = cmd_wr(8'h01); // address 0x016e + init_data[1019] = cmd_wr(8'h6e); + init_data[1020] = cmd_wr(8'h1b); // write 0x1b + // release PLL1 R reset + init_data[1021] = cmd_start(7'h2a); + init_data[1022] = cmd_wr(8'h08); // SPI transfer, CS mask 0x8 + init_data[1023] = cmd_wr(8'h01); // address 0x0177 + init_data[1024] = cmd_wr(8'h77); + init_data[1025] = cmd_wr(8'h00); // write 0x00 + // Configuration for LMX2594 PLL + // OSCin = 250 MHz + // VCO range 7.5 - 15 GHz + // R_PRE = 1 + // R = 1 + // PFD = OSCin / (R_PRE * R) = 250 MHz + // N = 32 + // VCO = PFD * N = 8 GHz + // VCO / 8 = 1 GHz + // Reset + init_data[1026] = cmd_start(7'h2a); + init_data[1027] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1028] = cmd_wr(8'h00); // address 0x00 + init_data[1029] = cmd_wr(8'h24); // write 0x2412 + init_data[1030] = cmd_wr(8'h12); + init_data[1031] = cmd_start(7'h2a); + init_data[1032] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1033] = cmd_wr(8'h00); // address 0x00 + init_data[1034] = cmd_wr(8'h24); // write 0x2410 + init_data[1035] = cmd_wr(8'h10); + // QUICK_RECAL_EN: 0 + // VCO_CAPCTRL_STRT: 0 + init_data[1036] = cmd_start(7'h2a); + init_data[1037] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1038] = cmd_wr(8'h4e); // address 0x4e + init_data[1039] = cmd_wr(8'h00); // write 0x0001 + init_data[1040] = cmd_wr(8'h01); + // 77,0x0000 + // 76,0x0000 + // CHDIV: 3 (8) + init_data[1041] = cmd_start(7'h2a); + init_data[1042] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1043] = cmd_wr(8'h4b); // address 0x4b + init_data[1044] = cmd_wr(8'h08); // write 0x08c0 + init_data[1045] = cmd_wr(8'hc0); + // 74,0x0000 + // 73,0x0000 + // 72,0x0000 + // 71,0x0000 + // MASH_RST_COUNT: 50000 (0xc350) + init_data[1046] = cmd_start(7'h2a); + init_data[1047] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1048] = cmd_wr(8'h46); // address 0x46 + init_data[1049] = cmd_wr(8'hc3); // write 0xc350 + init_data[1050] = cmd_wr(8'h50); + // MASH_RST_COUNT: 50000 (0xc350) + init_data[1051] = cmd_start(7'h2a); + init_data[1052] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1053] = cmd_wr(8'h45); // address 0x45 + init_data[1054] = cmd_wr(8'h00); // write 0x0000 + init_data[1055] = cmd_wr(8'h00); + // 68,0x0000 + // 67,0x0000 + // 66,0x0000 + // 65,0x0000 + // 64,0x0000 + // 63,0x0000 + // 62,0x0000 + // 61,0x0000 + // LD_DELAY: 1000 (0x3e8) + init_data[1056] = cmd_start(7'h2a); + init_data[1057] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1058] = cmd_wr(8'h3c); // address 0x3c + init_data[1059] = cmd_wr(8'h03); // write 0x03e8 + init_data[1060] = cmd_wr(8'he8); + // LD_TYPE: 1 + init_data[1061] = cmd_start(7'h2a); + init_data[1062] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1063] = cmd_wr(8'h3b); // address 0x3b + init_data[1064] = cmd_wr(8'h00); // write 0x0001 + init_data[1065] = cmd_wr(8'h01); + // INPIN_IGNORE: 1 + // INPIN_HYST: 0 + // INPIN_LVL: 0 + // INPIN_FMT: 0 + init_data[1066] = cmd_start(7'h2a); + init_data[1067] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1068] = cmd_wr(8'h3a); // address 0x3a + init_data[1069] = cmd_wr(8'h80); // write 0x8001 + init_data[1070] = cmd_wr(8'h01); + // 57,0x0000 + // 56,0x0000 + // 55,0x0000 + // 54,0x0000 + // 53,0x0000 + // 52,0x0000 + // 51,0x0000 + // 50,0x0000 + // 49,0x0000 + // 48,0x0000 + // 47,0x0000 + // OUTB_MUX: 0 (ch div) + init_data[1071] = cmd_start(7'h2a); + init_data[1072] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1073] = cmd_wr(8'h2e); // address 0x2e + init_data[1074] = cmd_wr(8'h07); // write 0x07fc + init_data[1075] = cmd_wr(8'hfc); + // OUTA_MUX: 0 (ch div) + // OUT_ISET: 0 (max) + // OUTB_PWR: 31 (0x1f) + init_data[1076] = cmd_start(7'h2a); + init_data[1077] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1078] = cmd_wr(8'h2d); // address 0x2d + init_data[1079] = cmd_wr(8'hc0); // write 0xc0df + init_data[1080] = cmd_wr(8'hdf); + // OUTA_PWR: 31 (0x1f) + // OUTB_PD: 0 + // OUTA_PD: 0 + // MASH_RESET_N: 0 + // MASH_ORDER: 0 + init_data[1081] = cmd_start(7'h2a); + init_data[1082] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1083] = cmd_wr(8'h2c); // address 0x2c + init_data[1084] = cmd_wr(8'h1f); // write 0x1f00 + init_data[1085] = cmd_wr(8'h00); + // PLL_NUM: 0 + init_data[1086] = cmd_start(7'h2a); + init_data[1087] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1088] = cmd_wr(8'h2b); // address 0x2b + init_data[1089] = cmd_wr(8'h00); // write 0x0000 + init_data[1090] = cmd_wr(8'h00); + // PLL_NUM: 0 + init_data[1091] = cmd_start(7'h2a); + init_data[1092] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1093] = cmd_wr(8'h2a); // address 0x2a + init_data[1094] = cmd_wr(8'h00); // write 0x0000 + init_data[1095] = cmd_wr(8'h00); + // MASH_SEED: 0 + init_data[1096] = cmd_start(7'h2a); + init_data[1097] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1098] = cmd_wr(8'h29); // address 0x29 + init_data[1099] = cmd_wr(8'h00); // write 0x0000 + init_data[1100] = cmd_wr(8'h00); + // MASH_SEED: 0 + init_data[1101] = cmd_start(7'h2a); + init_data[1102] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1103] = cmd_wr(8'h28); // address 0x28 + init_data[1104] = cmd_wr(8'h00); // write 0x0000 + init_data[1105] = cmd_wr(8'h00); + // PLL_DEN: '1 + init_data[1106] = cmd_start(7'h2a); + init_data[1107] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1108] = cmd_wr(8'h27); // address 0x27 + init_data[1109] = cmd_wr(8'hff); // write 0xffff + init_data[1110] = cmd_wr(8'hff); + // PLL_DEN: '1 + init_data[1111] = cmd_start(7'h2a); + init_data[1112] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1113] = cmd_wr(8'h26); // address 0x26 + init_data[1114] = cmd_wr(8'hff); // write 0xffff + init_data[1115] = cmd_wr(8'hff); + // MASH_SEED_EN: 0 + // PFD_DLY_SEL: 2 + init_data[1116] = cmd_start(7'h2a); + init_data[1117] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1118] = cmd_wr(8'h25); // address 0x25 + init_data[1119] = cmd_wr(8'h02); // write 0x0204 + init_data[1120] = cmd_wr(8'h04); + // PLL_N: 32 (0x20) + init_data[1121] = cmd_start(7'h2a); + init_data[1122] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1123] = cmd_wr(8'h24); // address 0x24 + init_data[1124] = cmd_wr(8'h00); // write 0x0020 + init_data[1125] = cmd_wr(8'h20); + // 35,0x0000 + // PLL_N: 32 (0x20) + init_data[1126] = cmd_start(7'h2a); + init_data[1127] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1128] = cmd_wr(8'h22); // address 0x22 + init_data[1129] = cmd_wr(8'h00); // write 0x0000 + init_data[1130] = cmd_wr(8'h00); + // 33,0x0000 + // 32,0x0000 + // CHDIV_DIV2: 1 + init_data[1131] = cmd_start(7'h2a); + init_data[1132] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1133] = cmd_wr(8'h1f); // address 0x1f + init_data[1134] = cmd_wr(8'h43); // write 0x43ec + init_data[1135] = cmd_wr(8'hec); + // 30,0x0000 + // 29,0x0000 + // 28,0x0000 + // 27,0x0000 + // 26,0x0000 + // 25,0x0000 + // 24,0x0000 + // 23,0x0000 + // 22,0x0000 + // 21,0x0000 + // VCO_SEL: 7 (VCO7) + // VCO_SEL_FORCE: 0 + init_data[1136] = cmd_start(7'h2a); + init_data[1137] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1138] = cmd_wr(8'h14); // address 0x14 + init_data[1139] = cmd_wr(8'hf8); // write 0xf848 + init_data[1140] = cmd_wr(8'h48); + // VCO_CAPCTRL: 183 (0xb7) + init_data[1141] = cmd_start(7'h2a); + init_data[1142] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1143] = cmd_wr(8'h13); // address 0x13 + init_data[1144] = cmd_wr(8'h27); // write 0x27b7 + init_data[1145] = cmd_wr(8'hb7); + // 18,0x0000 + // VCO_DACISET_STRT: 250 (0xfa) + init_data[1146] = cmd_start(7'h2a); + init_data[1147] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1148] = cmd_wr(8'h11); // address 0x11 + init_data[1149] = cmd_wr(8'h00); // write 0x00fa + init_data[1150] = cmd_wr(8'hfa); + // VCO_DACISET: 128 (0x80) + init_data[1151] = cmd_start(7'h2a); + init_data[1152] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1153] = cmd_wr(8'h10); // address 0x10 + init_data[1154] = cmd_wr(8'h00); // write 0x0080 + init_data[1155] = cmd_wr(8'h80); + // 15,0x0000 + // CPG: 7 + init_data[1156] = cmd_start(7'h2a); + init_data[1157] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1158] = cmd_wr(8'h0e); // address 0x0e + init_data[1159] = cmd_wr(8'h1e); // write 0x1e70 + init_data[1160] = cmd_wr(8'h70); + // PLL_R_PRE: 1 + init_data[1161] = cmd_start(7'h2a); + init_data[1162] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1163] = cmd_wr(8'h0c); // address 0x0c + init_data[1164] = cmd_wr(8'h50); // write 0x5001 + init_data[1165] = cmd_wr(8'h01); + // PLL_R: 1 + init_data[1166] = cmd_start(7'h2a); + init_data[1167] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1168] = cmd_wr(8'h0b); // address 0x0b + init_data[1169] = cmd_wr(8'h00); // write 0x0018 + init_data[1170] = cmd_wr(8'h18); + // MULT: 1 (bypass) + init_data[1171] = cmd_start(7'h2a); + init_data[1172] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1173] = cmd_wr(8'h0a); // address 0x0a + init_data[1174] = cmd_wr(8'h10); // write 0x10d8 + init_data[1175] = cmd_wr(8'hd8); + // OSC_2X: 0 + init_data[1176] = cmd_start(7'h2a); + init_data[1177] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1178] = cmd_wr(8'h09); // address 0x09 + init_data[1179] = cmd_wr(8'h06); // write 0x0604 + init_data[1180] = cmd_wr(8'h04); + // VCO_DACISET_FORCE: 0 + // VCO_CAPCTRL_FORCE: 0 + init_data[1181] = cmd_start(7'h2a); + init_data[1182] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1183] = cmd_wr(8'h08); // address 0x08 + init_data[1184] = cmd_wr(8'h20); // write 0x2000 + init_data[1185] = cmd_wr(8'h00); + // OUT_FORCE: 0 + init_data[1186] = cmd_start(7'h2a); + init_data[1187] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1188] = cmd_wr(8'h07); // address 0x07 + init_data[1189] = cmd_wr(8'h00); // write 0x00b2 + init_data[1190] = cmd_wr(8'hb2); + // ACAL_CMP_DLY: 10 + init_data[1191] = cmd_start(7'h2a); + init_data[1192] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1193] = cmd_wr(8'h04); // address 0x04 + init_data[1194] = cmd_wr(8'h0a); // write 0x0a43 + init_data[1195] = cmd_wr(8'h43); + // CAL_CLK_DIV: 3 (div 8) + init_data[1196] = cmd_start(7'h2a); + init_data[1197] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1198] = cmd_wr(8'h01); // address 0x01 + init_data[1199] = cmd_wr(8'h08); // write 0x080b + init_data[1200] = cmd_wr(8'h0b); + // FCAL_HPFD_ADJ: 3 (PFD > 200 MHz) + // FCAL_LPFD_ADJ: 0 (PFD > 10 MHz) + // FCAL_EN: 0 + // MUXOUT_LD_SEL: 0 (readback) + // RESET: 0 + // POWERDOWN: 0 + init_data[1201] = cmd_start(7'h2a); + init_data[1202] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1203] = cmd_wr(8'h00); // address 0x00 + init_data[1204] = cmd_wr(8'h25); // write 0x2590 + init_data[1205] = cmd_wr(8'h90); + // Delay 10 msec + init_data[1206] = cmd_delay(10); // delay 300 ms + // FCAL_HPFD_ADJ: 3 (PFD > 200 MHz) + // FCAL_LPFD_ADJ: 0 (PFD > 10 MHz) + // FCAL_EN: 1 + // MUXOUT_LD_SEL: 0 (readback) + // RESET: 0 + // POWERDOWN: 0 + init_data[1207] = cmd_start(7'h2a); + init_data[1208] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1209] = cmd_wr(8'h00); // address 0x00 + init_data[1210] = cmd_wr(8'h25); // write 0x2598 + init_data[1211] = cmd_wr(8'h98); + // Clear I2C-SPI bridge interrupt + init_data[1212] = cmd_start(7'h2a); + init_data[1213] = cmd_wr(8'hf1); + init_data[1214] = cmd_halt(); // end +end + +localparam [2:0] + STATE_IDLE = 3'd0, + STATE_RUN = 3'd1, + STATE_TABLE_1 = 3'd2, + STATE_TABLE_2 = 3'd3, + STATE_TABLE_3 = 3'd4; + +logic [2:0] state_reg = STATE_IDLE, state_next; + +localparam AW = $clog2(INIT_DATA_LEN); + +logic [8:0] init_data_reg = '0; + +logic [AW-1:0] address_reg = '0, address_next; +logic [AW-1:0] address_ptr_reg = '0, address_ptr_next; +logic [AW-1:0] data_ptr_reg = '0, data_ptr_next; + +logic [6:0] cur_address_reg = '0, cur_address_next; + +logic [31:0] delay_counter_reg = '0, delay_counter_next; + +logic [6:0] m_axis_cmd_address_reg = '0, m_axis_cmd_address_next; +logic m_axis_cmd_start_reg = 1'b0, m_axis_cmd_start_next; +logic m_axis_cmd_write_reg = 1'b0, m_axis_cmd_write_next; +logic m_axis_cmd_stop_reg = 1'b0, m_axis_cmd_stop_next; +logic m_axis_cmd_valid_reg = 1'b0, m_axis_cmd_valid_next; + +logic [7:0] m_axis_tx_tdata_reg = '0, m_axis_tx_tdata_next; +logic m_axis_tx_tvalid_reg = 1'b0, m_axis_tx_tvalid_next; + +logic start_flag_reg = 1'b0, start_flag_next; + +logic busy_reg = 1'b0; + +assign m_axis_cmd.tdata[6:0] = m_axis_cmd_address_reg; +assign m_axis_cmd.tdata[7] = m_axis_cmd_start_reg; +assign m_axis_cmd.tdata[8] = 1'b0; // read +assign m_axis_cmd.tdata[9] = m_axis_cmd_write_reg; +assign m_axis_cmd.tdata[10] = 1'b0; // write multi +assign m_axis_cmd.tdata[11] = m_axis_cmd_stop_reg; +assign m_axis_cmd.tvalid = m_axis_cmd_valid_reg; +assign m_axis_cmd.tlast = 1'b1; +assign m_axis_cmd.tid = '0; +assign m_axis_cmd.tdest = '0; +assign m_axis_cmd.tuser = '0; + +assign m_axis_tx.tdata = m_axis_tx_tdata_reg; +assign m_axis_tx.tvalid = m_axis_tx_tvalid_reg; +assign m_axis_tx.tlast = 1'b1; +assign m_axis_tx.tid = '0; +assign m_axis_tx.tdest = '0; +assign m_axis_tx.tuser = '0; + +assign busy = busy_reg; + +always_comb begin + state_next = STATE_IDLE; + + address_next = address_reg; + address_ptr_next = address_ptr_reg; + data_ptr_next = data_ptr_reg; + + cur_address_next = cur_address_reg; + + delay_counter_next = delay_counter_reg; + + m_axis_cmd_address_next = m_axis_cmd_address_reg; + m_axis_cmd_start_next = m_axis_cmd_start_reg && !(m_axis_cmd.tvalid && m_axis_cmd.tready); + m_axis_cmd_write_next = m_axis_cmd_write_reg && !(m_axis_cmd.tvalid && m_axis_cmd.tready); + m_axis_cmd_stop_next = m_axis_cmd_stop_reg && !(m_axis_cmd.tvalid && m_axis_cmd.tready); + m_axis_cmd_valid_next = m_axis_cmd_valid_reg && !m_axis_cmd.tready; + + m_axis_tx_tdata_next = m_axis_tx_tdata_reg; + m_axis_tx_tvalid_next = m_axis_tx_tvalid_reg && !m_axis_tx.tready; + + start_flag_next = start_flag_reg; + + if (m_axis_cmd.tvalid || m_axis_tx.tvalid) begin + // wait for output registers to clear + state_next = state_reg; + end else if (delay_counter_reg != 0) begin + // delay + delay_counter_next = delay_counter_reg - 1; + state_next = state_reg; + end else begin + case (state_reg) + STATE_IDLE: begin + // wait for start signal + if (!start_flag_reg && start) begin + address_next = '0; + start_flag_next = 1'b1; + state_next = STATE_RUN; + end else begin + state_next = STATE_IDLE; + end + end + STATE_RUN: begin + // process commands + if (init_data_reg[8] == 1'b1) begin + // write data + m_axis_cmd_write_next = 1'b1; + m_axis_cmd_stop_next = 1'b0; + m_axis_cmd_valid_next = 1'b1; + + m_axis_tx_tdata_next = init_data_reg[7:0]; + m_axis_tx_tvalid_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_RUN; + end else if (init_data_reg[8:7] == 2'b01) begin + // write address + m_axis_cmd_address_next = init_data_reg[6:0]; + m_axis_cmd_start_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_RUN; + end else if (init_data_reg[8:4] == 5'b00001) begin + // delay + if (SIM_SPEEDUP) begin + delay_counter_next = 32'd1 << (init_data_reg[3:0]); + end else begin + delay_counter_next = 32'd1 << (init_data_reg[3:0]+16); + end + + address_next = address_reg + 1; + + state_next = STATE_RUN; + end else if (init_data_reg == 9'b001000001) begin + // send stop + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_RUN; + end else if (init_data_reg == 9'b000001001) begin + // data table start + data_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end else if (init_data_reg == 9'd0) begin + // stop + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + state_next = STATE_IDLE; + end else begin + // invalid command, skip + address_next = address_reg + 1; + state_next = STATE_RUN; + end + end + STATE_TABLE_1: begin + // find address table start + if (init_data_reg == 9'b000001000) begin + // address table start + address_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_2; + end else if (init_data_reg == 9'b000001001) begin + // data table start + data_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end else if (init_data_reg == 1) begin + // exit mode + address_next = address_reg + 1; + state_next = STATE_RUN; + end else if (init_data_reg == 9'd0) begin + // stop + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + state_next = STATE_IDLE; + end else begin + // invalid command, skip + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end + end + STATE_TABLE_2: begin + // find next address + if (init_data_reg[8:7] == 2'b01) begin + // write address command + // store address and move to data table + cur_address_next = init_data_reg[6:0]; + address_ptr_next = address_reg + 1; + address_next = data_ptr_reg; + state_next = STATE_TABLE_3; + end else if (init_data_reg == 9'b000001001) begin + // data table start + data_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end else if (init_data_reg == 9'd1) begin + // exit mode + address_next = address_reg + 1; + state_next = STATE_RUN; + end else if (init_data_reg == 9'd0) begin + // stop + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + state_next = STATE_IDLE; + end else begin + // invalid command, skip + address_next = address_reg + 1; + state_next = STATE_TABLE_2; + end + end + STATE_TABLE_3: begin + // process data table with selected address + if (init_data_reg[8] == 1'b1) begin + // write data + m_axis_cmd_write_next = 1'b1; + m_axis_cmd_stop_next = 1'b0; + m_axis_cmd_valid_next = 1'b1; + + m_axis_tx_tdata_next = init_data_reg[7:0]; + m_axis_tx_tvalid_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg[8:7] == 2'b01) begin + // write address + m_axis_cmd_address_next = init_data_reg[6:0]; + m_axis_cmd_start_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg == 9'b000000011) begin + // write current address + m_axis_cmd_address_next = cur_address_reg; + m_axis_cmd_start_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg[8:4] == 5'b00001) begin + // delay + if (SIM_SPEEDUP) begin + delay_counter_next = 32'd1 << (init_data_reg[3:0]); + end else begin + delay_counter_next = 32'd1 << (init_data_reg[3:0]+16); + end + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg == 9'b001000001) begin + // send stop + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg == 9'b000001001) begin + // data table start + data_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end else if (init_data_reg == 9'b000001000) begin + // address table start + address_next = address_ptr_reg; + state_next = STATE_TABLE_2; + end else if (init_data_reg == 9'd1) begin + // exit mode + address_next = address_reg + 1; + state_next = STATE_RUN; + end else if (init_data_reg == 9'd0) begin + // stop + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + state_next = STATE_IDLE; + end else begin + // invalid command, skip + address_next = address_reg + 1; + state_next = STATE_TABLE_3; + end + end + default: begin + // invalid state + state_next = STATE_IDLE; + end + endcase + end +end + +always_ff @(posedge clk) begin + state_reg <= state_next; + + // read init_data ROM + init_data_reg <= init_data[address_next]; + + address_reg <= address_next; + address_ptr_reg <= address_ptr_next; + data_ptr_reg <= data_ptr_next; + + cur_address_reg <= cur_address_next; + + delay_counter_reg <= delay_counter_next; + + m_axis_cmd_address_reg <= m_axis_cmd_address_next; + m_axis_cmd_start_reg <= m_axis_cmd_start_next; + m_axis_cmd_write_reg <= m_axis_cmd_write_next; + m_axis_cmd_stop_reg <= m_axis_cmd_stop_next; + m_axis_cmd_valid_reg <= m_axis_cmd_valid_next; + + m_axis_tx_tdata_reg <= m_axis_tx_tdata_next; + m_axis_tx_tvalid_reg <= m_axis_tx_tvalid_next; + + start_flag_reg <= start && start_flag_next; + + busy_reg <= (state_reg != STATE_IDLE); + + if (rst) begin + state_reg <= STATE_IDLE; + + init_data_reg <= '0; + + address_reg <= '0; + address_ptr_reg <= '0; + data_ptr_reg <= '0; + + cur_address_reg <= '0; + + delay_counter_reg <= '0; + + m_axis_cmd_valid_reg <= 1'b0; + + m_axis_tx_tvalid_reg <= 1'b0; + + start_flag_reg <= 1'b0; + + busy_reg <= 1'b0; + end +end + +endmodule + +`resetall \ No newline at end of file diff --git a/src/eth/example/HTG_ZRF8/fpga/pll/pll_i2c_init_r2.sv b/src/eth/example/HTG_ZRF8/fpga/pll/pll_i2c_init_r2.sv new file mode 100644 index 0000000..fc07d29 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/pll/pll_i2c_init_r2.sv @@ -0,0 +1,2048 @@ +// SPDX-License-Identifier: CERN-OHL-S-2.0 +/* + +Copyright (c) 2015-2025 FPGA Ninja, LLC + +Authors: +- Alex Forencich + +*/ + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * pll_i2c_init_r2 + */ +module pll_i2c_init_r2 # +( + parameter logic SIM_SPEEDUP = 1'b0 +) +( + input wire logic clk, + input wire logic rst, + + /* + * I2C master interface + */ + taxi_axis_if.src m_axis_cmd, + taxi_axis_if.src m_axis_tx, + + /* + * Status + */ + output wire logic busy, + + /* + * Configuration + */ + input wire logic start +); + +/* + +Generic module for I2C bus initialization. Good for use when multiple devices +on an I2C bus must be initialized on system start without intervention of a +general-purpose processor. + +Copy this file and change init_data and INIT_DATA_LEN as needed. + +This module can be used in two modes: simple device initialization, or multiple +device initialization. In multiple device mode, the same initialization sequence +can be performed on multiple different device addresses. + +To use single device mode, only use the start write to address and write data commands. +The module will generate the I2C commands in sequential order. Terminate the list +with a 0 entry. + +To use the multiple device mode, use the start data and start address block commands +to set up lists of initialization data and device addresses. The module enters +multiple device mode upon seeing a start data block command. The module stores the +offset of the start of the data block and then skips ahead until it reaches a start +address block command. The module will store the offset to the address block and +read the first address in the block. Then it will jump back to the data block +and execute it, substituting the stored address for each current address write +command. Upon reaching the start address block command, the module will read out the +next address and start again at the top of the data block. If the module encounters +a start data block command while looking for an address, then it will store a new data +offset and then look for a start address block command. Terminate the list with a 0 +entry. Normal address commands will operate normally inside a data block. + +Commands: + +00 0000000 : stop +00 0000001 : exit multiple device mode +00 0000011 : start write to current address +00 0001000 : start address block +00 0001001 : start data block +00 001dddd : delay 2**(16+d) cycles +00 1000001 : send I2C stop +01 aaaaaaa : start write to address +1 dddddddd : write 8-bit data + +Examples + +write 0x11223344 to register 0x0004 on device at 0x50 + +01 1010000 start write to 0x50 +1 00000000 write address 0x0004 +1 00000100 +1 00010001 write data 0x11223344 +1 00100010 +1 00110011 +1 01000100 +0 00000000 stop + +write 0x11223344 to register 0x0004 on devices at 0x50, 0x51, 0x52, and 0x53 + +00 0001001 start data block +00 0000011 start write to current address +1 00000000 write address 0x0004 +1 00000100 +1 00010001 write data 0x11223344 +1 00100010 +1 00110011 +1 01000100 +00 0001000 start address block +01 1010000 address 0x50 +01 1010001 address 0x51 +01 1010010 address 0x52 +01 1010011 address 0x53 +00 0000001 exit multi-dev mode +00 0000000 stop + +*/ + +// check configuration +if (m_axis_cmd.DATA_W < 12) + $fatal(0, "Command interface width must be at least 12 bits (instance %m)"); + +if (m_axis_tx.DATA_W != 8) + $fatal(0, "Data interface width must be 8 bits (instance %m)"); + +function [8:0] cmd_start(input [6:0] addr); + cmd_start = {2'b01, addr}; +endfunction + +function [8:0] cmd_wr(input [7:0] data); + cmd_wr = {1'b1, data}; +endfunction + +function [8:0] cmd_stop(); + cmd_stop = {2'b00, 7'b1000001}; +endfunction + +function [8:0] cmd_delay(input [3:0] d); + cmd_delay = {2'b00, 3'b001, d}; +endfunction + +function [8:0] cmd_halt(); + cmd_halt = 9'd0; +endfunction + +function [8:0] blk_start_data(); + blk_start_data = {2'b00, 7'b0001001}; +endfunction + +function [8:0] blk_start_addr(); + blk_start_addr = {2'b00, 7'b0001000}; +endfunction + +function [8:0] cmd_start_cur(); + cmd_start_cur = {2'b00, 7'b0000011}; +endfunction + +function [8:0] cmd_exit(); + cmd_exit = {2'b00, 7'b0000001}; +endfunction + +// init_data ROM +localparam INIT_DATA_LEN = 1223; + +reg [8:0] init_data [INIT_DATA_LEN-1:0]; + +initial begin + // Initial delay + init_data[0] = cmd_delay(6); // delay 30 ms + // Set mux to select U19 Si5341 on HTG-ZRF8-R2 + init_data[1] = cmd_start(7'h71); + init_data[2] = cmd_wr(8'h10); + init_data[3] = cmd_stop(); // I2C stop + // Si534x/7x/8x/9x Registers Script + // + // Part: Si5341 + // Project File: X:\Projects\taxi\src\eth\example\HTG_ZRF8\fpga\pll\HTG-ZRF8-R2-161-ZRF8R201.slabtimeproj + // Design ID: ZRF8R201 + // Includes Pre/Post Download Control Register Writes: Yes + // Die Revision: B1 + // Creator: ClockBuilder Pro v4.1 [2021-09-22] + // Created On: 2025-09-02 08:30:10 GMT-07:00 + // + // Start configuration preamble + init_data[4] = cmd_start(7'h74); + init_data[5] = cmd_wr(8'h01); + init_data[6] = cmd_wr(8'h0b); // set page 0x0b + init_data[7] = cmd_start(7'h74); + init_data[8] = cmd_wr(8'h24); + init_data[9] = cmd_wr(8'hc0); // write 0xc0 to 0x0b24 + init_data[10] = cmd_wr(8'h00); // write 0x00 to 0x0b25 + // Rev D stuck divider fix + init_data[11] = cmd_start(7'h74); + init_data[12] = cmd_wr(8'h01); + init_data[13] = cmd_wr(8'h05); // set page 0x05 + init_data[14] = cmd_start(7'h74); + init_data[15] = cmd_wr(8'h02); + init_data[16] = cmd_wr(8'h01); // write 0x01 to 0x0502 + init_data[17] = cmd_start(7'h74); + init_data[18] = cmd_wr(8'h05); + init_data[19] = cmd_wr(8'h03); // write 0x03 to 0x0505 + init_data[20] = cmd_start(7'h74); + init_data[21] = cmd_wr(8'h01); + init_data[22] = cmd_wr(8'h09); // set page 0x09 + init_data[23] = cmd_start(7'h74); + init_data[24] = cmd_wr(8'h57); + init_data[25] = cmd_wr(8'h17); // write 0x17 to 0x0957 + init_data[26] = cmd_start(7'h74); + init_data[27] = cmd_wr(8'h01); + init_data[28] = cmd_wr(8'h0b); // set page 0x0b + init_data[29] = cmd_start(7'h74); + init_data[30] = cmd_wr(8'h4e); + init_data[31] = cmd_wr(8'h1a); // write 0x1a to 0x0b4e + // End configuration preamble + // + // Delay 300 msec + init_data[32] = cmd_delay(10); // delay 300 ms + // Delay is worst case time for device to complete any calibration + // that is running due to device state change previous to this script + // being processed. + // + // Start configuration registers + init_data[33] = cmd_start(7'h74); + init_data[34] = cmd_wr(8'h01); + init_data[35] = cmd_wr(8'h00); // set page 0x00 + init_data[36] = cmd_start(7'h74); + init_data[37] = cmd_wr(8'h06); + init_data[38] = cmd_wr(8'h00); // write 0x00 to 0x0006 + init_data[39] = cmd_wr(8'h00); // write 0x00 to 0x0007 + init_data[40] = cmd_wr(8'h00); // write 0x00 to 0x0008 + init_data[41] = cmd_start(7'h74); + init_data[42] = cmd_wr(8'h0b); + init_data[43] = cmd_wr(8'h74); // write 0x74 to 0x000b + init_data[44] = cmd_start(7'h74); + init_data[45] = cmd_wr(8'h17); + init_data[46] = cmd_wr(8'hd0); // write 0xd0 to 0x0017 + init_data[47] = cmd_wr(8'hff); // write 0xff to 0x0018 + init_data[48] = cmd_start(7'h74); + init_data[49] = cmd_wr(8'h21); + init_data[50] = cmd_wr(8'h0f); // write 0x0f to 0x0021 + init_data[51] = cmd_wr(8'h00); // write 0x00 to 0x0022 + init_data[52] = cmd_start(7'h74); + init_data[53] = cmd_wr(8'h2b); + init_data[54] = cmd_wr(8'h02); // write 0x02 to 0x002b + init_data[55] = cmd_wr(8'h20); // write 0x20 to 0x002c + init_data[56] = cmd_wr(8'h00); // write 0x00 to 0x002d + init_data[57] = cmd_wr(8'h00); // write 0x00 to 0x002e + init_data[58] = cmd_wr(8'h00); // write 0x00 to 0x002f + init_data[59] = cmd_wr(8'h00); // write 0x00 to 0x0030 + init_data[60] = cmd_wr(8'h00); // write 0x00 to 0x0031 + init_data[61] = cmd_wr(8'h00); // write 0x00 to 0x0032 + init_data[62] = cmd_wr(8'h00); // write 0x00 to 0x0033 + init_data[63] = cmd_wr(8'h00); // write 0x00 to 0x0034 + init_data[64] = cmd_wr(8'h00); // write 0x00 to 0x0035 + init_data[65] = cmd_wr(8'h00); // write 0x00 to 0x0036 + init_data[66] = cmd_wr(8'h00); // write 0x00 to 0x0037 + init_data[67] = cmd_wr(8'h00); // write 0x00 to 0x0038 + init_data[68] = cmd_wr(8'h00); // write 0x00 to 0x0039 + init_data[69] = cmd_wr(8'h00); // write 0x00 to 0x003a + init_data[70] = cmd_wr(8'h00); // write 0x00 to 0x003b + init_data[71] = cmd_wr(8'h00); // write 0x00 to 0x003c + init_data[72] = cmd_wr(8'h00); // write 0x00 to 0x003d + init_data[73] = cmd_start(7'h74); + init_data[74] = cmd_wr(8'h41); + init_data[75] = cmd_wr(8'h00); // write 0x00 to 0x0041 + init_data[76] = cmd_wr(8'h00); // write 0x00 to 0x0042 + init_data[77] = cmd_wr(8'h00); // write 0x00 to 0x0043 + init_data[78] = cmd_wr(8'h00); // write 0x00 to 0x0044 + init_data[79] = cmd_start(7'h74); + init_data[80] = cmd_wr(8'h9e); + init_data[81] = cmd_wr(8'h00); // write 0x00 to 0x009e + init_data[82] = cmd_start(7'h74); + init_data[83] = cmd_wr(8'h01); + init_data[84] = cmd_wr(8'h01); // set page 0x01 + init_data[85] = cmd_start(7'h74); + init_data[86] = cmd_wr(8'h02); + init_data[87] = cmd_wr(8'h01); // write 0x01 to 0x0102 + init_data[88] = cmd_start(7'h74); + init_data[89] = cmd_wr(8'h08); + init_data[90] = cmd_wr(8'h02); // write 0x02 to 0x0108 + init_data[91] = cmd_wr(8'h09); // write 0x09 to 0x0109 + init_data[92] = cmd_wr(8'h33); // write 0x33 to 0x010a + init_data[93] = cmd_wr(8'h0a); // write 0x0a to 0x010b + init_data[94] = cmd_start(7'h74); + init_data[95] = cmd_wr(8'h0d); + init_data[96] = cmd_wr(8'h02); // write 0x02 to 0x010d + init_data[97] = cmd_wr(8'h09); // write 0x09 to 0x010e + init_data[98] = cmd_wr(8'h33); // write 0x33 to 0x010f + init_data[99] = cmd_wr(8'h0a); // write 0x0a to 0x0110 + init_data[100] = cmd_start(7'h74); + init_data[101] = cmd_wr(8'h12); + init_data[102] = cmd_wr(8'h02); // write 0x02 to 0x0112 + init_data[103] = cmd_wr(8'h09); // write 0x09 to 0x0113 + init_data[104] = cmd_wr(8'h33); // write 0x33 to 0x0114 + init_data[105] = cmd_wr(8'h08); // write 0x08 to 0x0115 + init_data[106] = cmd_start(7'h74); + init_data[107] = cmd_wr(8'h17); + init_data[108] = cmd_wr(8'h02); // write 0x02 to 0x0117 + init_data[109] = cmd_wr(8'h09); // write 0x09 to 0x0118 + init_data[110] = cmd_wr(8'h33); // write 0x33 to 0x0119 + init_data[111] = cmd_wr(8'h08); // write 0x08 to 0x011a + init_data[112] = cmd_start(7'h74); + init_data[113] = cmd_wr(8'h1c); + init_data[114] = cmd_wr(8'h02); // write 0x02 to 0x011c + init_data[115] = cmd_wr(8'h09); // write 0x09 to 0x011d + init_data[116] = cmd_wr(8'h33); // write 0x33 to 0x011e + init_data[117] = cmd_wr(8'h08); // write 0x08 to 0x011f + init_data[118] = cmd_start(7'h74); + init_data[119] = cmd_wr(8'h21); + init_data[120] = cmd_wr(8'h02); // write 0x02 to 0x0121 + init_data[121] = cmd_wr(8'h09); // write 0x09 to 0x0122 + init_data[122] = cmd_wr(8'h33); // write 0x33 to 0x0123 + init_data[123] = cmd_wr(8'h0a); // write 0x0a to 0x0124 + init_data[124] = cmd_start(7'h74); + init_data[125] = cmd_wr(8'h26); + init_data[126] = cmd_wr(8'h02); // write 0x02 to 0x0126 + init_data[127] = cmd_wr(8'h09); // write 0x09 to 0x0127 + init_data[128] = cmd_wr(8'h33); // write 0x33 to 0x0128 + init_data[129] = cmd_wr(8'h0b); // write 0x0b to 0x0129 + init_data[130] = cmd_start(7'h74); + init_data[131] = cmd_wr(8'h2b); + init_data[132] = cmd_wr(8'h02); // write 0x02 to 0x012b + init_data[133] = cmd_wr(8'h09); // write 0x09 to 0x012c + init_data[134] = cmd_wr(8'h33); // write 0x33 to 0x012d + init_data[135] = cmd_wr(8'h0a); // write 0x0a to 0x012e + init_data[136] = cmd_start(7'h74); + init_data[137] = cmd_wr(8'h30); + init_data[138] = cmd_wr(8'h02); // write 0x02 to 0x0130 + init_data[139] = cmd_wr(8'h09); // write 0x09 to 0x0131 + init_data[140] = cmd_wr(8'h33); // write 0x33 to 0x0132 + init_data[141] = cmd_wr(8'h0b); // write 0x0b to 0x0133 + init_data[142] = cmd_start(7'h74); + init_data[143] = cmd_wr(8'h3a); + init_data[144] = cmd_wr(8'h06); // write 0x06 to 0x013a + init_data[145] = cmd_wr(8'h09); // write 0x09 to 0x013b + init_data[146] = cmd_wr(8'h33); // write 0x33 to 0x013c + init_data[147] = cmd_wr(8'h09); // write 0x09 to 0x013d + init_data[148] = cmd_start(7'h74); + init_data[149] = cmd_wr(8'h3f); + init_data[150] = cmd_wr(8'h00); // write 0x00 to 0x013f + init_data[151] = cmd_wr(8'h00); // write 0x00 to 0x0140 + init_data[152] = cmd_wr(8'h40); // write 0x40 to 0x0141 + init_data[153] = cmd_start(7'h74); + init_data[154] = cmd_wr(8'h01); + init_data[155] = cmd_wr(8'h02); // set page 0x02 + init_data[156] = cmd_start(7'h74); + init_data[157] = cmd_wr(8'h06); + init_data[158] = cmd_wr(8'h00); // write 0x00 to 0x0206 + init_data[159] = cmd_start(7'h74); + init_data[160] = cmd_wr(8'h08); + init_data[161] = cmd_wr(8'h00); // write 0x00 to 0x0208 + init_data[162] = cmd_wr(8'h00); // write 0x00 to 0x0209 + init_data[163] = cmd_wr(8'h00); // write 0x00 to 0x020a + init_data[164] = cmd_wr(8'h00); // write 0x00 to 0x020b + init_data[165] = cmd_wr(8'h00); // write 0x00 to 0x020c + init_data[166] = cmd_wr(8'h00); // write 0x00 to 0x020d + init_data[167] = cmd_wr(8'h00); // write 0x00 to 0x020e + init_data[168] = cmd_wr(8'h00); // write 0x00 to 0x020f + init_data[169] = cmd_wr(8'h00); // write 0x00 to 0x0210 + init_data[170] = cmd_wr(8'h00); // write 0x00 to 0x0211 + init_data[171] = cmd_wr(8'h00); // write 0x00 to 0x0212 + init_data[172] = cmd_wr(8'h00); // write 0x00 to 0x0213 + init_data[173] = cmd_wr(8'h00); // write 0x00 to 0x0214 + init_data[174] = cmd_wr(8'h00); // write 0x00 to 0x0215 + init_data[175] = cmd_wr(8'h00); // write 0x00 to 0x0216 + init_data[176] = cmd_wr(8'h00); // write 0x00 to 0x0217 + init_data[177] = cmd_wr(8'h00); // write 0x00 to 0x0218 + init_data[178] = cmd_wr(8'h00); // write 0x00 to 0x0219 + init_data[179] = cmd_wr(8'h00); // write 0x00 to 0x021a + init_data[180] = cmd_wr(8'h00); // write 0x00 to 0x021b + init_data[181] = cmd_wr(8'h00); // write 0x00 to 0x021c + init_data[182] = cmd_wr(8'h00); // write 0x00 to 0x021d + init_data[183] = cmd_wr(8'h00); // write 0x00 to 0x021e + init_data[184] = cmd_wr(8'h00); // write 0x00 to 0x021f + init_data[185] = cmd_wr(8'h00); // write 0x00 to 0x0220 + init_data[186] = cmd_wr(8'h00); // write 0x00 to 0x0221 + init_data[187] = cmd_wr(8'h00); // write 0x00 to 0x0222 + init_data[188] = cmd_wr(8'h00); // write 0x00 to 0x0223 + init_data[189] = cmd_wr(8'h00); // write 0x00 to 0x0224 + init_data[190] = cmd_wr(8'h00); // write 0x00 to 0x0225 + init_data[191] = cmd_wr(8'h00); // write 0x00 to 0x0226 + init_data[192] = cmd_wr(8'h00); // write 0x00 to 0x0227 + init_data[193] = cmd_wr(8'h00); // write 0x00 to 0x0228 + init_data[194] = cmd_wr(8'h00); // write 0x00 to 0x0229 + init_data[195] = cmd_wr(8'h00); // write 0x00 to 0x022a + init_data[196] = cmd_wr(8'h00); // write 0x00 to 0x022b + init_data[197] = cmd_wr(8'h00); // write 0x00 to 0x022c + init_data[198] = cmd_wr(8'h00); // write 0x00 to 0x022d + init_data[199] = cmd_wr(8'h00); // write 0x00 to 0x022e + init_data[200] = cmd_wr(8'h00); // write 0x00 to 0x022f + init_data[201] = cmd_start(7'h74); + init_data[202] = cmd_wr(8'h35); + init_data[203] = cmd_wr(8'h00); // write 0x00 to 0x0235 + init_data[204] = cmd_wr(8'h00); // write 0x00 to 0x0236 + init_data[205] = cmd_wr(8'h00); // write 0x00 to 0x0237 + init_data[206] = cmd_wr(8'h00); // write 0x00 to 0x0238 + init_data[207] = cmd_wr(8'h96); // write 0x96 to 0x0239 + init_data[208] = cmd_wr(8'h00); // write 0x00 to 0x023a + init_data[209] = cmd_wr(8'h00); // write 0x00 to 0x023b + init_data[210] = cmd_wr(8'h00); // write 0x00 to 0x023c + init_data[211] = cmd_wr(8'h00); // write 0x00 to 0x023d + init_data[212] = cmd_wr(8'h80); // write 0x80 to 0x023e + init_data[213] = cmd_start(7'h74); + init_data[214] = cmd_wr(8'h4a); + init_data[215] = cmd_wr(8'h02); // write 0x02 to 0x024a + init_data[216] = cmd_wr(8'h00); // write 0x00 to 0x024b + init_data[217] = cmd_wr(8'h00); // write 0x00 to 0x024c + init_data[218] = cmd_wr(8'h01); // write 0x01 to 0x024d + init_data[219] = cmd_wr(8'h00); // write 0x00 to 0x024e + init_data[220] = cmd_wr(8'h00); // write 0x00 to 0x024f + init_data[221] = cmd_wr(8'h02); // write 0x02 to 0x0250 + init_data[222] = cmd_wr(8'h00); // write 0x00 to 0x0251 + init_data[223] = cmd_wr(8'h00); // write 0x00 to 0x0252 + init_data[224] = cmd_wr(8'h02); // write 0x02 to 0x0253 + init_data[225] = cmd_wr(8'h00); // write 0x00 to 0x0254 + init_data[226] = cmd_wr(8'h00); // write 0x00 to 0x0255 + init_data[227] = cmd_wr(8'h02); // write 0x02 to 0x0256 + init_data[228] = cmd_wr(8'h00); // write 0x00 to 0x0257 + init_data[229] = cmd_wr(8'h00); // write 0x00 to 0x0258 + init_data[230] = cmd_wr(8'h02); // write 0x02 to 0x0259 + init_data[231] = cmd_wr(8'h00); // write 0x00 to 0x025a + init_data[232] = cmd_wr(8'h00); // write 0x00 to 0x025b + init_data[233] = cmd_wr(8'h19); // write 0x19 to 0x025c + init_data[234] = cmd_wr(8'h00); // write 0x00 to 0x025d + init_data[235] = cmd_wr(8'h00); // write 0x00 to 0x025e + init_data[236] = cmd_wr(8'h3b); // write 0x3b to 0x025f + init_data[237] = cmd_wr(8'h00); // write 0x00 to 0x0260 + init_data[238] = cmd_wr(8'h00); // write 0x00 to 0x0261 + init_data[239] = cmd_wr(8'h1a); // write 0x1a to 0x0262 + init_data[240] = cmd_wr(8'h00); // write 0x00 to 0x0263 + init_data[241] = cmd_wr(8'h00); // write 0x00 to 0x0264 + init_data[242] = cmd_start(7'h74); + init_data[243] = cmd_wr(8'h68); + init_data[244] = cmd_wr(8'h00); // write 0x00 to 0x0268 + init_data[245] = cmd_wr(8'h00); // write 0x00 to 0x0269 + init_data[246] = cmd_wr(8'h00); // write 0x00 to 0x026a + init_data[247] = cmd_wr(8'h5a); // write 0x5a to 0x026b + init_data[248] = cmd_wr(8'h52); // write 0x52 to 0x026c + init_data[249] = cmd_wr(8'h46); // write 0x46 to 0x026d + init_data[250] = cmd_wr(8'h38); // write 0x38 to 0x026e + init_data[251] = cmd_wr(8'h52); // write 0x52 to 0x026f + init_data[252] = cmd_wr(8'h32); // write 0x32 to 0x0270 + init_data[253] = cmd_wr(8'h30); // write 0x30 to 0x0271 + init_data[254] = cmd_wr(8'h31); // write 0x31 to 0x0272 + init_data[255] = cmd_start(7'h74); + init_data[256] = cmd_wr(8'h01); + init_data[257] = cmd_wr(8'h03); // set page 0x03 + init_data[258] = cmd_start(7'h74); + init_data[259] = cmd_wr(8'h02); + init_data[260] = cmd_wr(8'h00); // write 0x00 to 0x0302 + init_data[261] = cmd_wr(8'h00); // write 0x00 to 0x0303 + init_data[262] = cmd_wr(8'h00); // write 0x00 to 0x0304 + init_data[263] = cmd_wr(8'h00); // write 0x00 to 0x0305 + init_data[264] = cmd_wr(8'h08); // write 0x08 to 0x0306 + init_data[265] = cmd_wr(8'h00); // write 0x00 to 0x0307 + init_data[266] = cmd_wr(8'h00); // write 0x00 to 0x0308 + init_data[267] = cmd_wr(8'h00); // write 0x00 to 0x0309 + init_data[268] = cmd_wr(8'h80); // write 0x80 to 0x030a + init_data[269] = cmd_wr(8'h89); // write 0x89 to 0x030b + init_data[270] = cmd_wr(8'h00); // write 0x00 to 0x030c + init_data[271] = cmd_wr(8'h00); // write 0x00 to 0x030d + init_data[272] = cmd_wr(8'h00); // write 0x00 to 0x030e + init_data[273] = cmd_wr(8'h00); // write 0x00 to 0x030f + init_data[274] = cmd_wr(8'h00); // write 0x00 to 0x0310 + init_data[275] = cmd_wr(8'h24); // write 0x24 to 0x0311 + init_data[276] = cmd_wr(8'h00); // write 0x00 to 0x0312 + init_data[277] = cmd_wr(8'h00); // write 0x00 to 0x0313 + init_data[278] = cmd_wr(8'h00); // write 0x00 to 0x0314 + init_data[279] = cmd_wr(8'h00); // write 0x00 to 0x0315 + init_data[280] = cmd_wr(8'ha0); // write 0xa0 to 0x0316 + init_data[281] = cmd_wr(8'h00); // write 0x00 to 0x0317 + init_data[282] = cmd_wr(8'h00); // write 0x00 to 0x0318 + init_data[283] = cmd_wr(8'h00); // write 0x00 to 0x0319 + init_data[284] = cmd_wr(8'h00); // write 0x00 to 0x031a + init_data[285] = cmd_wr(8'h00); // write 0x00 to 0x031b + init_data[286] = cmd_wr(8'h06); // write 0x06 to 0x031c + init_data[287] = cmd_wr(8'h00); // write 0x00 to 0x031d + init_data[288] = cmd_wr(8'h00); // write 0x00 to 0x031e + init_data[289] = cmd_wr(8'h00); // write 0x00 to 0x031f + init_data[290] = cmd_wr(8'h00); // write 0x00 to 0x0320 + init_data[291] = cmd_wr(8'h80); // write 0x80 to 0x0321 + init_data[292] = cmd_wr(8'h00); // write 0x00 to 0x0322 + init_data[293] = cmd_wr(8'h00); // write 0x00 to 0x0323 + init_data[294] = cmd_wr(8'h00); // write 0x00 to 0x0324 + init_data[295] = cmd_wr(8'h00); // write 0x00 to 0x0325 + init_data[296] = cmd_wr(8'h40); // write 0x40 to 0x0326 + init_data[297] = cmd_wr(8'h06); // write 0x06 to 0x0327 + init_data[298] = cmd_wr(8'h00); // write 0x00 to 0x0328 + init_data[299] = cmd_wr(8'h00); // write 0x00 to 0x0329 + init_data[300] = cmd_wr(8'h00); // write 0x00 to 0x032a + init_data[301] = cmd_wr(8'h00); // write 0x00 to 0x032b + init_data[302] = cmd_wr(8'h9c); // write 0x9c to 0x032c + init_data[303] = cmd_wr(8'h00); // write 0x00 to 0x032d + init_data[304] = cmd_wr(8'h00); // write 0x00 to 0x032e + init_data[305] = cmd_wr(8'h00); // write 0x00 to 0x032f + init_data[306] = cmd_wr(8'h00); // write 0x00 to 0x0330 + init_data[307] = cmd_wr(8'h00); // write 0x00 to 0x0331 + init_data[308] = cmd_wr(8'h00); // write 0x00 to 0x0332 + init_data[309] = cmd_wr(8'h00); // write 0x00 to 0x0333 + init_data[310] = cmd_wr(8'h00); // write 0x00 to 0x0334 + init_data[311] = cmd_wr(8'h00); // write 0x00 to 0x0335 + init_data[312] = cmd_wr(8'h00); // write 0x00 to 0x0336 + init_data[313] = cmd_wr(8'h00); // write 0x00 to 0x0337 + init_data[314] = cmd_wr(8'h00); // write 0x00 to 0x0338 + init_data[315] = cmd_wr(8'h1f); // write 0x1f to 0x0339 + init_data[316] = cmd_start(7'h74); + init_data[317] = cmd_wr(8'h3b); + init_data[318] = cmd_wr(8'h00); // write 0x00 to 0x033b + init_data[319] = cmd_wr(8'h00); // write 0x00 to 0x033c + init_data[320] = cmd_wr(8'h00); // write 0x00 to 0x033d + init_data[321] = cmd_wr(8'h00); // write 0x00 to 0x033e + init_data[322] = cmd_wr(8'h00); // write 0x00 to 0x033f + init_data[323] = cmd_wr(8'h00); // write 0x00 to 0x0340 + init_data[324] = cmd_wr(8'h00); // write 0x00 to 0x0341 + init_data[325] = cmd_wr(8'h00); // write 0x00 to 0x0342 + init_data[326] = cmd_wr(8'h00); // write 0x00 to 0x0343 + init_data[327] = cmd_wr(8'h00); // write 0x00 to 0x0344 + init_data[328] = cmd_wr(8'h00); // write 0x00 to 0x0345 + init_data[329] = cmd_wr(8'h00); // write 0x00 to 0x0346 + init_data[330] = cmd_wr(8'h00); // write 0x00 to 0x0347 + init_data[331] = cmd_wr(8'h00); // write 0x00 to 0x0348 + init_data[332] = cmd_wr(8'h00); // write 0x00 to 0x0349 + init_data[333] = cmd_wr(8'h00); // write 0x00 to 0x034a + init_data[334] = cmd_wr(8'h00); // write 0x00 to 0x034b + init_data[335] = cmd_wr(8'h00); // write 0x00 to 0x034c + init_data[336] = cmd_wr(8'h00); // write 0x00 to 0x034d + init_data[337] = cmd_wr(8'h00); // write 0x00 to 0x034e + init_data[338] = cmd_wr(8'h00); // write 0x00 to 0x034f + init_data[339] = cmd_wr(8'h00); // write 0x00 to 0x0350 + init_data[340] = cmd_wr(8'h00); // write 0x00 to 0x0351 + init_data[341] = cmd_wr(8'h00); // write 0x00 to 0x0352 + init_data[342] = cmd_wr(8'h00); // write 0x00 to 0x0353 + init_data[343] = cmd_wr(8'h00); // write 0x00 to 0x0354 + init_data[344] = cmd_wr(8'h00); // write 0x00 to 0x0355 + init_data[345] = cmd_wr(8'h00); // write 0x00 to 0x0356 + init_data[346] = cmd_wr(8'h00); // write 0x00 to 0x0357 + init_data[347] = cmd_wr(8'h00); // write 0x00 to 0x0358 + init_data[348] = cmd_wr(8'h00); // write 0x00 to 0x0359 + init_data[349] = cmd_wr(8'h00); // write 0x00 to 0x035a + init_data[350] = cmd_wr(8'h00); // write 0x00 to 0x035b + init_data[351] = cmd_wr(8'h00); // write 0x00 to 0x035c + init_data[352] = cmd_wr(8'h00); // write 0x00 to 0x035d + init_data[353] = cmd_wr(8'h00); // write 0x00 to 0x035e + init_data[354] = cmd_wr(8'h00); // write 0x00 to 0x035f + init_data[355] = cmd_wr(8'h00); // write 0x00 to 0x0360 + init_data[356] = cmd_wr(8'h00); // write 0x00 to 0x0361 + init_data[357] = cmd_wr(8'h00); // write 0x00 to 0x0362 + init_data[358] = cmd_start(7'h74); + init_data[359] = cmd_wr(8'h01); + init_data[360] = cmd_wr(8'h08); // set page 0x08 + init_data[361] = cmd_start(7'h74); + init_data[362] = cmd_wr(8'h02); + init_data[363] = cmd_wr(8'h00); // write 0x00 to 0x0802 + init_data[364] = cmd_wr(8'h00); // write 0x00 to 0x0803 + init_data[365] = cmd_wr(8'h00); // write 0x00 to 0x0804 + init_data[366] = cmd_wr(8'h00); // write 0x00 to 0x0805 + init_data[367] = cmd_wr(8'h00); // write 0x00 to 0x0806 + init_data[368] = cmd_wr(8'h00); // write 0x00 to 0x0807 + init_data[369] = cmd_wr(8'h00); // write 0x00 to 0x0808 + init_data[370] = cmd_wr(8'h00); // write 0x00 to 0x0809 + init_data[371] = cmd_wr(8'h00); // write 0x00 to 0x080a + init_data[372] = cmd_wr(8'h00); // write 0x00 to 0x080b + init_data[373] = cmd_wr(8'h00); // write 0x00 to 0x080c + init_data[374] = cmd_wr(8'h00); // write 0x00 to 0x080d + init_data[375] = cmd_wr(8'h00); // write 0x00 to 0x080e + init_data[376] = cmd_wr(8'h00); // write 0x00 to 0x080f + init_data[377] = cmd_wr(8'h00); // write 0x00 to 0x0810 + init_data[378] = cmd_wr(8'h00); // write 0x00 to 0x0811 + init_data[379] = cmd_wr(8'h00); // write 0x00 to 0x0812 + init_data[380] = cmd_wr(8'h00); // write 0x00 to 0x0813 + init_data[381] = cmd_wr(8'h00); // write 0x00 to 0x0814 + init_data[382] = cmd_wr(8'h00); // write 0x00 to 0x0815 + init_data[383] = cmd_wr(8'h00); // write 0x00 to 0x0816 + init_data[384] = cmd_wr(8'h00); // write 0x00 to 0x0817 + init_data[385] = cmd_wr(8'h00); // write 0x00 to 0x0818 + init_data[386] = cmd_wr(8'h00); // write 0x00 to 0x0819 + init_data[387] = cmd_wr(8'h00); // write 0x00 to 0x081a + init_data[388] = cmd_wr(8'h00); // write 0x00 to 0x081b + init_data[389] = cmd_wr(8'h00); // write 0x00 to 0x081c + init_data[390] = cmd_wr(8'h00); // write 0x00 to 0x081d + init_data[391] = cmd_wr(8'h00); // write 0x00 to 0x081e + init_data[392] = cmd_wr(8'h00); // write 0x00 to 0x081f + init_data[393] = cmd_wr(8'h00); // write 0x00 to 0x0820 + init_data[394] = cmd_wr(8'h00); // write 0x00 to 0x0821 + init_data[395] = cmd_wr(8'h00); // write 0x00 to 0x0822 + init_data[396] = cmd_wr(8'h00); // write 0x00 to 0x0823 + init_data[397] = cmd_wr(8'h00); // write 0x00 to 0x0824 + init_data[398] = cmd_wr(8'h00); // write 0x00 to 0x0825 + init_data[399] = cmd_wr(8'h00); // write 0x00 to 0x0826 + init_data[400] = cmd_wr(8'h00); // write 0x00 to 0x0827 + init_data[401] = cmd_wr(8'h00); // write 0x00 to 0x0828 + init_data[402] = cmd_wr(8'h00); // write 0x00 to 0x0829 + init_data[403] = cmd_wr(8'h00); // write 0x00 to 0x082a + init_data[404] = cmd_wr(8'h00); // write 0x00 to 0x082b + init_data[405] = cmd_wr(8'h00); // write 0x00 to 0x082c + init_data[406] = cmd_wr(8'h00); // write 0x00 to 0x082d + init_data[407] = cmd_wr(8'h00); // write 0x00 to 0x082e + init_data[408] = cmd_wr(8'h00); // write 0x00 to 0x082f + init_data[409] = cmd_wr(8'h00); // write 0x00 to 0x0830 + init_data[410] = cmd_wr(8'h00); // write 0x00 to 0x0831 + init_data[411] = cmd_wr(8'h00); // write 0x00 to 0x0832 + init_data[412] = cmd_wr(8'h00); // write 0x00 to 0x0833 + init_data[413] = cmd_wr(8'h00); // write 0x00 to 0x0834 + init_data[414] = cmd_wr(8'h00); // write 0x00 to 0x0835 + init_data[415] = cmd_wr(8'h00); // write 0x00 to 0x0836 + init_data[416] = cmd_wr(8'h00); // write 0x00 to 0x0837 + init_data[417] = cmd_wr(8'h00); // write 0x00 to 0x0838 + init_data[418] = cmd_wr(8'h00); // write 0x00 to 0x0839 + init_data[419] = cmd_wr(8'h00); // write 0x00 to 0x083a + init_data[420] = cmd_wr(8'h00); // write 0x00 to 0x083b + init_data[421] = cmd_wr(8'h00); // write 0x00 to 0x083c + init_data[422] = cmd_wr(8'h00); // write 0x00 to 0x083d + init_data[423] = cmd_wr(8'h00); // write 0x00 to 0x083e + init_data[424] = cmd_wr(8'h00); // write 0x00 to 0x083f + init_data[425] = cmd_wr(8'h00); // write 0x00 to 0x0840 + init_data[426] = cmd_wr(8'h00); // write 0x00 to 0x0841 + init_data[427] = cmd_wr(8'h00); // write 0x00 to 0x0842 + init_data[428] = cmd_wr(8'h00); // write 0x00 to 0x0843 + init_data[429] = cmd_wr(8'h00); // write 0x00 to 0x0844 + init_data[430] = cmd_wr(8'h00); // write 0x00 to 0x0845 + init_data[431] = cmd_wr(8'h00); // write 0x00 to 0x0846 + init_data[432] = cmd_wr(8'h00); // write 0x00 to 0x0847 + init_data[433] = cmd_wr(8'h00); // write 0x00 to 0x0848 + init_data[434] = cmd_wr(8'h00); // write 0x00 to 0x0849 + init_data[435] = cmd_wr(8'h00); // write 0x00 to 0x084a + init_data[436] = cmd_wr(8'h00); // write 0x00 to 0x084b + init_data[437] = cmd_wr(8'h00); // write 0x00 to 0x084c + init_data[438] = cmd_wr(8'h00); // write 0x00 to 0x084d + init_data[439] = cmd_wr(8'h00); // write 0x00 to 0x084e + init_data[440] = cmd_wr(8'h00); // write 0x00 to 0x084f + init_data[441] = cmd_wr(8'h00); // write 0x00 to 0x0850 + init_data[442] = cmd_wr(8'h00); // write 0x00 to 0x0851 + init_data[443] = cmd_wr(8'h00); // write 0x00 to 0x0852 + init_data[444] = cmd_wr(8'h00); // write 0x00 to 0x0853 + init_data[445] = cmd_wr(8'h00); // write 0x00 to 0x0854 + init_data[446] = cmd_wr(8'h00); // write 0x00 to 0x0855 + init_data[447] = cmd_wr(8'h00); // write 0x00 to 0x0856 + init_data[448] = cmd_wr(8'h00); // write 0x00 to 0x0857 + init_data[449] = cmd_wr(8'h00); // write 0x00 to 0x0858 + init_data[450] = cmd_wr(8'h00); // write 0x00 to 0x0859 + init_data[451] = cmd_wr(8'h00); // write 0x00 to 0x085a + init_data[452] = cmd_wr(8'h00); // write 0x00 to 0x085b + init_data[453] = cmd_wr(8'h00); // write 0x00 to 0x085c + init_data[454] = cmd_wr(8'h00); // write 0x00 to 0x085d + init_data[455] = cmd_wr(8'h00); // write 0x00 to 0x085e + init_data[456] = cmd_wr(8'h00); // write 0x00 to 0x085f + init_data[457] = cmd_wr(8'h00); // write 0x00 to 0x0860 + init_data[458] = cmd_wr(8'h00); // write 0x00 to 0x0861 + init_data[459] = cmd_start(7'h74); + init_data[460] = cmd_wr(8'h01); + init_data[461] = cmd_wr(8'h09); // set page 0x09 + init_data[462] = cmd_start(7'h74); + init_data[463] = cmd_wr(8'h0e); + init_data[464] = cmd_wr(8'h02); // write 0x02 to 0x090e + init_data[465] = cmd_start(7'h74); + init_data[466] = cmd_wr(8'h1c); + init_data[467] = cmd_wr(8'h04); // write 0x04 to 0x091c + init_data[468] = cmd_start(7'h74); + init_data[469] = cmd_wr(8'h43); + init_data[470] = cmd_wr(8'h01); // write 0x01 to 0x0943 + init_data[471] = cmd_start(7'h74); + init_data[472] = cmd_wr(8'h49); + init_data[473] = cmd_wr(8'h00); // write 0x00 to 0x0949 + init_data[474] = cmd_wr(8'h00); // write 0x00 to 0x094a + init_data[475] = cmd_start(7'h74); + init_data[476] = cmd_wr(8'h4e); + init_data[477] = cmd_wr(8'h49); // write 0x49 to 0x094e + init_data[478] = cmd_wr(8'h02); // write 0x02 to 0x094f + init_data[479] = cmd_start(7'h74); + init_data[480] = cmd_wr(8'h5e); + init_data[481] = cmd_wr(8'h00); // write 0x00 to 0x095e + init_data[482] = cmd_start(7'h74); + init_data[483] = cmd_wr(8'h01); + init_data[484] = cmd_wr(8'h0a); // set page 0x0a + init_data[485] = cmd_start(7'h74); + init_data[486] = cmd_wr(8'h02); + init_data[487] = cmd_wr(8'h00); // write 0x00 to 0x0a02 + init_data[488] = cmd_wr(8'h0f); // write 0x0f to 0x0a03 + init_data[489] = cmd_wr(8'h04); // write 0x04 to 0x0a04 + init_data[490] = cmd_wr(8'h0f); // write 0x0f to 0x0a05 + init_data[491] = cmd_start(7'h74); + init_data[492] = cmd_wr(8'h14); + init_data[493] = cmd_wr(8'h00); // write 0x00 to 0x0a14 + init_data[494] = cmd_start(7'h74); + init_data[495] = cmd_wr(8'h1a); + init_data[496] = cmd_wr(8'h00); // write 0x00 to 0x0a1a + init_data[497] = cmd_start(7'h74); + init_data[498] = cmd_wr(8'h20); + init_data[499] = cmd_wr(8'h00); // write 0x00 to 0x0a20 + init_data[500] = cmd_start(7'h74); + init_data[501] = cmd_wr(8'h26); + init_data[502] = cmd_wr(8'h00); // write 0x00 to 0x0a26 + init_data[503] = cmd_start(7'h74); + init_data[504] = cmd_wr(8'h2c); + init_data[505] = cmd_wr(8'h00); // write 0x00 to 0x0a2c + init_data[506] = cmd_start(7'h74); + init_data[507] = cmd_wr(8'h01); + init_data[508] = cmd_wr(8'h0b); // set page 0x0b + init_data[509] = cmd_start(7'h74); + init_data[510] = cmd_wr(8'h44); + init_data[511] = cmd_wr(8'h0f); // write 0x0f to 0x0b44 + init_data[512] = cmd_start(7'h74); + init_data[513] = cmd_wr(8'h4a); + init_data[514] = cmd_wr(8'h10); // write 0x10 to 0x0b4a + init_data[515] = cmd_start(7'h74); + init_data[516] = cmd_wr(8'h57); + init_data[517] = cmd_wr(8'h0e); // write 0x0e to 0x0b57 + init_data[518] = cmd_wr(8'h01); // write 0x01 to 0x0b58 + // End configuration registers + // + // Start configuration postamble + init_data[519] = cmd_start(7'h74); + init_data[520] = cmd_wr(8'h01); + init_data[521] = cmd_wr(8'h00); // set page 0x00 + init_data[522] = cmd_start(7'h74); + init_data[523] = cmd_wr(8'h1c); + init_data[524] = cmd_wr(8'h01); // write 0x01 to 0x001c + init_data[525] = cmd_start(7'h74); + init_data[526] = cmd_wr(8'h01); + init_data[527] = cmd_wr(8'h0b); // set page 0x0b + init_data[528] = cmd_start(7'h74); + init_data[529] = cmd_wr(8'h24); + init_data[530] = cmd_wr(8'hc3); // write 0xc3 to 0x0b24 + init_data[531] = cmd_wr(8'h02); // write 0x02 to 0x0b25 + // End configuration postamble + // Set mux to select I2C-SPI bridge on HTG-ZRF8-R2 + init_data[532] = cmd_start(7'h71); + init_data[533] = cmd_wr(8'h0b); + init_data[534] = cmd_stop(); // I2C stop + // Configure I2C-SPI bridge for LMK04832 + init_data[535] = cmd_start(7'h2e); + init_data[536] = cmd_wr(8'hf0); + init_data[537] = cmd_wr(8'h00); + init_data[538] = cmd_start(7'h2e); + init_data[539] = cmd_wr(8'hf6); + init_data[540] = cmd_wr(8'h00); + // Configure I2C-SPI bridge for LMX2594 + init_data[541] = cmd_start(7'h2a); + init_data[542] = cmd_wr(8'hf0); + init_data[543] = cmd_wr(8'h00); + init_data[544] = cmd_start(7'h2a); + init_data[545] = cmd_wr(8'hf6); + init_data[546] = cmd_wr(8'h00); + // Configuration for LMK04832 PLL on HTG-ZRF8-R2 + // PLL1 + // CLKin0 = 12.2880 MHz TCXO + // CLKin1 = 10 MHz + // CLKin0 R = 768 + // CLKin1 R = 625 + // PFD = in0 / R0 = in1 / R1 = 16 kHz + // N1 = 7680 + // VCO = PFD * N1 = 122.88 MHz + // Ext VCO is 122.88 MHz + // PLL2 + // 122.88 MHz from ext VCO + // VCO0 range 2440 - 2580 MHz + // VCO1 range 2945 - 3255 MHz + // R2 = 1536 + // P = 2 + // N2 = 15625 + // PFD = 122.88 / R2 = 0.08 + // VCO = PFD * P * N2 = 2500 + // VCO/10 = 250 MHz + // VCO/250 = 10 MHz + // VCO/1280 = 1.953125 MHz + // CLKout0: LMK_CLK_OUT SMPM + // CLKout1: RF_CLKOUT to Si5341 + // CLKout2: CLK_IN_PLL3 (refclk) + // CLKout3: DAC 228 SYSREF (sysref) + // CLKout4: CLK_IN_PLL2 (refclk) + // CLKout5: SYSREF_FPGA (sysref) + // CLKout6: CLK_IN_PLL1 (refclk) + // CLKout7: NC + // CLKout8: REFCLK_FPGA (refclk) + // CLKout9: NC + // CLKout10: NC + // CLKout11: SYNC_IN_PLL1/SYNC_IN_PLL2 (sysref) + // CLKout12: NC + // CLKout13: SYNC_IN_PLL3 (sysref) + // Reset + init_data[547] = cmd_start(7'h2e); + init_data[548] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[549] = cmd_wr(8'h00); // address 0x0000 + init_data[550] = cmd_wr(8'h00); + init_data[551] = cmd_wr(8'h80); // write 0x80 + // Configure outputs + // DCLK0_1_DIV: 10 (2500/10 = 250) + init_data[552] = cmd_start(7'h2e); + init_data[553] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[554] = cmd_wr(8'h01); // address 0x0100 + init_data[555] = cmd_wr(8'h00); + init_data[556] = cmd_wr(8'h0a); // write 0x0a + // DCLK0_1_DDLY: 10 + init_data[557] = cmd_start(7'h2e); + init_data[558] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[559] = cmd_wr(8'h01); // address 0x0101 + init_data[560] = cmd_wr(8'h01); + init_data[561] = cmd_wr(8'h0a); // write 0x0a + // CLKout0_1_PD + init_data[562] = cmd_start(7'h2e); + init_data[563] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[564] = cmd_wr(8'h01); // address 0x0102 + init_data[565] = cmd_wr(8'h02); + init_data[566] = cmd_wr(8'h00); // write 0x00 + // CLKout0_SRC_MUX: 0 (device clock) + init_data[567] = cmd_start(7'h2e); + init_data[568] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[569] = cmd_wr(8'h01); // address 0x0103 + init_data[570] = cmd_wr(8'h03); + init_data[571] = cmd_wr(8'h40); // write 0x40 + // CLKout1_SRC_MUX: 0 (device clock) + init_data[572] = cmd_start(7'h2e); + init_data[573] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[574] = cmd_wr(8'h01); // address 0x0104 + init_data[575] = cmd_wr(8'h04); + init_data[576] = cmd_wr(8'h00); // write 0x00 + // SCLK0_1_ADLY: 0 + init_data[577] = cmd_start(7'h2e); + init_data[578] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[579] = cmd_wr(8'h01); // address 0x0105 + init_data[580] = cmd_wr(8'h05); + init_data[581] = cmd_wr(8'h00); // write 0x00 + // SCLK0_1_DDLY: 0 + init_data[582] = cmd_start(7'h2e); + init_data[583] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[584] = cmd_wr(8'h01); // address 0x0106 + init_data[585] = cmd_wr(8'h06); + init_data[586] = cmd_wr(8'h00); // write 0x00 + // CLKout0_FMT: 5 (LVPECL 2000 mV) + // CLKout1_FMT: 1 (LVDS) + init_data[587] = cmd_start(7'h2e); + init_data[588] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[589] = cmd_wr(8'h01); // address 0x0107 + init_data[590] = cmd_wr(8'h07); + init_data[591] = cmd_wr(8'h15); // write 0x15 + // DCLK2_3_DIV: 10 (2500/10 = 250) + init_data[592] = cmd_start(7'h2e); + init_data[593] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[594] = cmd_wr(8'h01); // address 0x0108 + init_data[595] = cmd_wr(8'h08); + init_data[596] = cmd_wr(8'h0a); // write 0x0a + // DCLK2_3_DDLY: 10 + init_data[597] = cmd_start(7'h2e); + init_data[598] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[599] = cmd_wr(8'h01); // address 0x0109 + init_data[600] = cmd_wr(8'h09); + init_data[601] = cmd_wr(8'h0a); // write 0x0a + // CLKout2_3_PD + init_data[602] = cmd_start(7'h2e); + init_data[603] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[604] = cmd_wr(8'h01); // address 0x010a + init_data[605] = cmd_wr(8'h0a); + init_data[606] = cmd_wr(8'h00); // write 0x00 + // CLKout2_SRC_MUX: 0 (device clock) + init_data[607] = cmd_start(7'h2e); + init_data[608] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[609] = cmd_wr(8'h01); // address 0x010b + init_data[610] = cmd_wr(8'h0b); + init_data[611] = cmd_wr(8'h40); // write 0x40 + // CLKout3_SRC_MUX: 1 (sysref) + init_data[612] = cmd_start(7'h2e); + init_data[613] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[614] = cmd_wr(8'h01); // address 0x010c + init_data[615] = cmd_wr(8'h0c); + init_data[616] = cmd_wr(8'h20); // write 0x20 + // SCLK2_3_ADLY: 0 + init_data[617] = cmd_start(7'h2e); + init_data[618] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[619] = cmd_wr(8'h01); // address 0x010d + init_data[620] = cmd_wr(8'h0d); + init_data[621] = cmd_wr(8'h00); // write 0x00 + // SCLK2_3_DDLY: 0 + init_data[622] = cmd_start(7'h2e); + init_data[623] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[624] = cmd_wr(8'h01); // address 0x010e + init_data[625] = cmd_wr(8'h0e); + init_data[626] = cmd_wr(8'h00); // write 0x00 + // CLKout2_FMT: 1 (LVDS) + // CLKout3_FMT: 1 (LVDS) + init_data[627] = cmd_start(7'h2e); + init_data[628] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[629] = cmd_wr(8'h01); // address 0x010f + init_data[630] = cmd_wr(8'h0f); + init_data[631] = cmd_wr(8'h11); // write 0x11 + // DCLK4_5_DIV: 10 (2500/10 = 250) + init_data[632] = cmd_start(7'h2e); + init_data[633] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[634] = cmd_wr(8'h01); // address 0x0110 + init_data[635] = cmd_wr(8'h10); + init_data[636] = cmd_wr(8'h0a); // write 0x0a + // DCLK4_5_DDLY: 10 + init_data[637] = cmd_start(7'h2e); + init_data[638] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[639] = cmd_wr(8'h01); // address 0x0111 + init_data[640] = cmd_wr(8'h11); + init_data[641] = cmd_wr(8'h0a); // write 0x0a + // CLKout4_5_PD + init_data[642] = cmd_start(7'h2e); + init_data[643] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[644] = cmd_wr(8'h01); // address 0x0112 + init_data[645] = cmd_wr(8'h12); + init_data[646] = cmd_wr(8'h00); // write 0x00 + // CLKout4_SRC_MUX: 0 (device clock) + init_data[647] = cmd_start(7'h2e); + init_data[648] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[649] = cmd_wr(8'h01); // address 0x0113 + init_data[650] = cmd_wr(8'h13); + init_data[651] = cmd_wr(8'h40); // write 0x40 + // CLKout5_SRC_MUX: 1 (sysref) + init_data[652] = cmd_start(7'h2e); + init_data[653] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[654] = cmd_wr(8'h01); // address 0x0114 + init_data[655] = cmd_wr(8'h14); + init_data[656] = cmd_wr(8'h20); // write 0x20 + // SCLK4_5_ADLY: 0 + init_data[657] = cmd_start(7'h2e); + init_data[658] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[659] = cmd_wr(8'h01); // address 0x0115 + init_data[660] = cmd_wr(8'h15); + init_data[661] = cmd_wr(8'h00); // write 0x00 + // SCLK4_5_DDLY: 0 + init_data[662] = cmd_start(7'h2e); + init_data[663] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[664] = cmd_wr(8'h01); // address 0x0116 + init_data[665] = cmd_wr(8'h16); + init_data[666] = cmd_wr(8'h00); // write 0x00 + // CLKout4_FMT: 1 (LVDS) + // CLKout5_FMT: 1 (LVDS) + init_data[667] = cmd_start(7'h2e); + init_data[668] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[669] = cmd_wr(8'h01); // address 0x0117 + init_data[670] = cmd_wr(8'h17); + init_data[671] = cmd_wr(8'h11); // write 0x11 + // DCLK6_7_DIV: 10 (2500/10 = 250) + init_data[672] = cmd_start(7'h2e); + init_data[673] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[674] = cmd_wr(8'h01); // address 0x0118 + init_data[675] = cmd_wr(8'h18); + init_data[676] = cmd_wr(8'h0a); // write 0x0a + // DCLK6_7_DDLY: 10 + init_data[677] = cmd_start(7'h2e); + init_data[678] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[679] = cmd_wr(8'h01); // address 0x0119 + init_data[680] = cmd_wr(8'h19); + init_data[681] = cmd_wr(8'h0a); // write 0x0a + // CLKout6_7_PD + init_data[682] = cmd_start(7'h2e); + init_data[683] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[684] = cmd_wr(8'h01); // address 0x011a + init_data[685] = cmd_wr(8'h1a); + init_data[686] = cmd_wr(8'h00); // write 0x00 + // CLKout6_SRC_MUX: 0 (device clock) + init_data[687] = cmd_start(7'h2e); + init_data[688] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[689] = cmd_wr(8'h01); // address 0x011b + init_data[690] = cmd_wr(8'h1b); + init_data[691] = cmd_wr(8'h40); // write 0x40 + // CLKout7_SRC_MUX: 1 (sysref) + init_data[692] = cmd_start(7'h2e); + init_data[693] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[694] = cmd_wr(8'h01); // address 0x011c + init_data[695] = cmd_wr(8'h1c); + init_data[696] = cmd_wr(8'h20); // write 0x20 + // SCLK6_7_ADLY: 0 + init_data[697] = cmd_start(7'h2e); + init_data[698] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[699] = cmd_wr(8'h01); // address 0x011d + init_data[700] = cmd_wr(8'h1d); + init_data[701] = cmd_wr(8'h00); // write 0x00 + // SCLK6_7_DDLY: 0 + init_data[702] = cmd_start(7'h2e); + init_data[703] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[704] = cmd_wr(8'h01); // address 0x011e + init_data[705] = cmd_wr(8'h1e); + init_data[706] = cmd_wr(8'h00); // write 0x00 + // CLKout6_FMT: 1 (LVDS) + // CLKout7_FMT: 0 (PD) + init_data[707] = cmd_start(7'h2e); + init_data[708] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[709] = cmd_wr(8'h01); // address 0x011f + init_data[710] = cmd_wr(8'h1f); + init_data[711] = cmd_wr(8'h01); // write 0x01 + // DCLK8_9_DIV: 10 (2500/10 = 250) + init_data[712] = cmd_start(7'h2e); + init_data[713] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[714] = cmd_wr(8'h01); // address 0x0120 + init_data[715] = cmd_wr(8'h20); + init_data[716] = cmd_wr(8'h0a); // write 0x0a + // DCLK8_9_DDLY: 10 + init_data[717] = cmd_start(7'h2e); + init_data[718] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[719] = cmd_wr(8'h01); // address 0x0121 + init_data[720] = cmd_wr(8'h21); + init_data[721] = cmd_wr(8'h0a); // write 0x0a + // CLKout8_9_PD + init_data[722] = cmd_start(7'h2e); + init_data[723] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[724] = cmd_wr(8'h01); // address 0x0122 + init_data[725] = cmd_wr(8'h22); + init_data[726] = cmd_wr(8'h00); // write 0x00 + // CLKout8_SRC_MUX: 0 (device clock) + init_data[727] = cmd_start(7'h2e); + init_data[728] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[729] = cmd_wr(8'h01); // address 0x0123 + init_data[730] = cmd_wr(8'h23); + init_data[731] = cmd_wr(8'h40); // write 0x40 + // CLKout9_SRC_MUX: 1 (sysref) + init_data[732] = cmd_start(7'h2e); + init_data[733] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[734] = cmd_wr(8'h01); // address 0x0124 + init_data[735] = cmd_wr(8'h24); + init_data[736] = cmd_wr(8'h20); // write 0x20 + // SCLK8_9_ADLY: 0 + init_data[737] = cmd_start(7'h2e); + init_data[738] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[739] = cmd_wr(8'h01); // address 0x0125 + init_data[740] = cmd_wr(8'h25); + init_data[741] = cmd_wr(8'h00); // write 0x00 + // SCLK8_9_DDLY: 0 + init_data[742] = cmd_start(7'h2e); + init_data[743] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[744] = cmd_wr(8'h01); // address 0x0126 + init_data[745] = cmd_wr(8'h26); + init_data[746] = cmd_wr(8'h00); // write 0x00 + // CLKout8_FMT: 1 (LVDS) + // CLKout9_FMT: 0 (PD) + init_data[747] = cmd_start(7'h2e); + init_data[748] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[749] = cmd_wr(8'h01); // address 0x0127 + init_data[750] = cmd_wr(8'h27); + init_data[751] = cmd_wr(8'h01); // write 0x01 + // DCLK10_11_DIV: 10 (2500/10 = 250) + init_data[752] = cmd_start(7'h2e); + init_data[753] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[754] = cmd_wr(8'h01); // address 0x0128 + init_data[755] = cmd_wr(8'h28); + init_data[756] = cmd_wr(8'h0a); // write 0x0a + // DCLK10_11_DDLY: 10 + init_data[757] = cmd_start(7'h2e); + init_data[758] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[759] = cmd_wr(8'h01); // address 0x0129 + init_data[760] = cmd_wr(8'h29); + init_data[761] = cmd_wr(8'h0a); // write 0x0a + // CLKout10_11_PD + init_data[762] = cmd_start(7'h2e); + init_data[763] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[764] = cmd_wr(8'h01); // address 0x012a + init_data[765] = cmd_wr(8'h2a); + init_data[766] = cmd_wr(8'h00); // write 0x00 + // CLKout10_SRC_MUX: 0 (device clock) + init_data[767] = cmd_start(7'h2e); + init_data[768] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[769] = cmd_wr(8'h01); // address 0x012b + init_data[770] = cmd_wr(8'h2b); + init_data[771] = cmd_wr(8'h40); // write 0x40 + // CLKout11_SRC_MUX: 1 (sysref) + init_data[772] = cmd_start(7'h2e); + init_data[773] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[774] = cmd_wr(8'h01); // address 0x012c + init_data[775] = cmd_wr(8'h2c); + init_data[776] = cmd_wr(8'h20); // write 0x20 + // SCLK10_11_ADLY: 0 + init_data[777] = cmd_start(7'h2e); + init_data[778] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[779] = cmd_wr(8'h01); // address 0x012d + init_data[780] = cmd_wr(8'h2d); + init_data[781] = cmd_wr(8'h00); // write 0x00 + // SCLK10_11_DDLY: 0 + init_data[782] = cmd_start(7'h2e); + init_data[783] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[784] = cmd_wr(8'h01); // address 0x012e + init_data[785] = cmd_wr(8'h2e); + init_data[786] = cmd_wr(8'h00); // write 0x00 + // CLKout10_FMT: 0 (PD) + // CLKout11_FMT: 15 (CMOS norm/norm) + init_data[787] = cmd_start(7'h2e); + init_data[788] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[789] = cmd_wr(8'h01); // address 0x012f + init_data[790] = cmd_wr(8'h2f); + init_data[791] = cmd_wr(8'hf0); // write 0xf0 + // DCLK12_13_DIV: 10 (2500/10 = 250) + init_data[792] = cmd_start(7'h2e); + init_data[793] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[794] = cmd_wr(8'h01); // address 0x0130 + init_data[795] = cmd_wr(8'h30); + init_data[796] = cmd_wr(8'h0a); // write 0x0a + // DCLK12_13_DDLY: 10 + init_data[797] = cmd_start(7'h2e); + init_data[798] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[799] = cmd_wr(8'h01); // address 0x0131 + init_data[800] = cmd_wr(8'h31); + init_data[801] = cmd_wr(8'h0a); // write 0x0a + // CLKout12_13_PD + init_data[802] = cmd_start(7'h2e); + init_data[803] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[804] = cmd_wr(8'h01); // address 0x0132 + init_data[805] = cmd_wr(8'h32); + init_data[806] = cmd_wr(8'h00); // write 0x00 + // CLKout12_SRC_MUX: 1 (sysref) + init_data[807] = cmd_start(7'h2e); + init_data[808] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[809] = cmd_wr(8'h01); // address 0x0133 + init_data[810] = cmd_wr(8'h33); + init_data[811] = cmd_wr(8'h60); // write 0x60 + // CLKout13_SRC_MUX: 1 (sysref) + init_data[812] = cmd_start(7'h2e); + init_data[813] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[814] = cmd_wr(8'h01); // address 0x0134 + init_data[815] = cmd_wr(8'h34); + init_data[816] = cmd_wr(8'h20); // write 0x20 + // SCLK12_13_ADLY: 0 + init_data[817] = cmd_start(7'h2e); + init_data[818] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[819] = cmd_wr(8'h01); // address 0x0135 + init_data[820] = cmd_wr(8'h35); + init_data[821] = cmd_wr(8'h00); // write 0x00 + // SCLK12_13_DDLY: 0 + init_data[822] = cmd_start(7'h2e); + init_data[823] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[824] = cmd_wr(8'h01); // address 0x0136 + init_data[825] = cmd_wr(8'h36); + init_data[826] = cmd_wr(8'h00); // write 0x00 + // CLKout12_FMT: 0 (PD) + // CLKout13_FMT: 12 (CMOS norm/norm) + init_data[827] = cmd_start(7'h2e); + init_data[828] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[829] = cmd_wr(8'h01); // address 0x0137 + init_data[830] = cmd_wr(8'h37); + init_data[831] = cmd_wr(8'hc0); // write 0xc0 + // configure PLL1 + // VCO_MUX: VCO0 + // OSCout_FMT: power down + init_data[832] = cmd_start(7'h2e); + init_data[833] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[834] = cmd_wr(8'h01); // address 0x0138 + init_data[835] = cmd_wr(8'h38); + init_data[836] = cmd_wr(8'h00); // write 0x00 + // PLL2_RCLK_MUX: 0 (OSCin) + // PLL2_NCLK_MUX: 0 (prescaler) + // PLL1_NCLK_MUX: 0 (OSCin) + // FB_MUX: 0 + // FB_MUX_EN: 0 + init_data[837] = cmd_start(7'h2e); + init_data[838] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[839] = cmd_wr(8'h01); // address 0x013f + init_data[840] = cmd_wr(8'h3f); + init_data[841] = cmd_wr(8'h00); // write 0x00 + // release power down + init_data[842] = cmd_start(7'h2e); + init_data[843] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[844] = cmd_wr(8'h01); // address 0x0140 + init_data[845] = cmd_wr(8'h40); + init_data[846] = cmd_wr(8'h00); // write 0x00 + // 0x141,0x00 + // 0x142,0x00 + // 0x143,0x00 + // 0x144,0x00 + // 0x145,0x00 + // enable CLKin0 and CLKin1 with bipolar buffers + init_data[847] = cmd_start(7'h2e); + init_data[848] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[849] = cmd_wr(8'h01); // address 0x0146 + init_data[850] = cmd_wr(8'h46); + init_data[851] = cmd_wr(8'h18); // write 0x18 + // route CLKin0 and CLKin1 to PLL1, enable auto revert + init_data[852] = cmd_start(7'h2e); + init_data[853] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[854] = cmd_wr(8'h01); // address 0x0147 + init_data[855] = cmd_wr(8'h47); + init_data[856] = cmd_wr(8'h8a); // write 0x8a + // CLKin_SEL0: input + init_data[857] = cmd_start(7'h2e); + init_data[858] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[859] = cmd_wr(8'h01); // address 0x0148 + init_data[860] = cmd_wr(8'h48); + init_data[861] = cmd_wr(8'h00); // write 0x00 + // CLKin_SEL1: input + init_data[862] = cmd_start(7'h2e); + init_data[863] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[864] = cmd_wr(8'h01); // address 0x0149 + init_data[865] = cmd_wr(8'h49); + init_data[866] = cmd_wr(8'h00); // write 0x00 + // reset mux/type: input + init_data[867] = cmd_start(7'h2e); + init_data[868] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[869] = cmd_wr(8'h01); // address 0x014a + init_data[870] = cmd_wr(8'h4a); + init_data[871] = cmd_wr(8'h00); // write 0x00 + // auto DAC + init_data[872] = cmd_start(7'h2e); + init_data[873] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[874] = cmd_wr(8'h01); // address 0x014b + init_data[875] = cmd_wr(8'h4b); + init_data[876] = cmd_wr(8'h10); // write 0x10 + // MAN_DAC + init_data[877] = cmd_start(7'h2e); + init_data[878] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[879] = cmd_wr(8'h01); // address 0x014c + init_data[880] = cmd_wr(8'h4c); + init_data[881] = cmd_wr(8'h00); // write 0x00 + // DAC trip low: 0 + init_data[882] = cmd_start(7'h2e); + init_data[883] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[884] = cmd_wr(8'h01); // address 0x014d + init_data[885] = cmd_wr(8'h4d); + init_data[886] = cmd_wr(8'h00); // write 0x00 + // DAC trip high: 63 + // DAC_CLK_MULT: 3 (16384) + init_data[887] = cmd_start(7'h2e); + init_data[888] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[889] = cmd_wr(8'h01); // address 0x014e + init_data[890] = cmd_wr(8'h4e); + init_data[891] = cmd_wr(8'hff); // write 0xff + // DAC_CLK_CNTR + init_data[892] = cmd_start(7'h2e); + init_data[893] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[894] = cmd_wr(8'h01); // address 0x014f + init_data[895] = cmd_wr(8'h4f); + init_data[896] = cmd_wr(8'h7f); // write 0x7f + // no holdover + init_data[897] = cmd_start(7'h2e); + init_data[898] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[899] = cmd_wr(8'h01); // address 0x0150 + init_data[900] = cmd_wr(8'h50); + init_data[901] = cmd_wr(8'h00); // write 0x00 + // holdover DLD count + // 0x151,0x00 + // 0x152,0x00 + // CLKin0 R = 768 (0x300) + init_data[902] = cmd_start(7'h2e); + init_data[903] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[904] = cmd_wr(8'h01); // address 0x0153 + init_data[905] = cmd_wr(8'h53); + init_data[906] = cmd_wr(8'h03); // write 0x03 + init_data[907] = cmd_start(7'h2e); + init_data[908] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[909] = cmd_wr(8'h01); // address 0x0154 + init_data[910] = cmd_wr(8'h54); + init_data[911] = cmd_wr(8'h00); // write 0x00 + // CLKin1 R = 625 (0x271) + init_data[912] = cmd_start(7'h2e); + init_data[913] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[914] = cmd_wr(8'h01); // address 0x0155 + init_data[915] = cmd_wr(8'h55); + init_data[916] = cmd_wr(8'h02); // write 0x02 + init_data[917] = cmd_start(7'h2e); + init_data[918] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[919] = cmd_wr(8'h01); // address 0x0156 + init_data[920] = cmd_wr(8'h56); + init_data[921] = cmd_wr(8'h71); // write 0x71 + // CLKin2 R + // 0x157,0x00 + // 0x158,0x00 + // PLL1 N = 7680 (0x1e00) + init_data[922] = cmd_start(7'h2e); + init_data[923] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[924] = cmd_wr(8'h01); // address 0x0159 + init_data[925] = cmd_wr(8'h59); + init_data[926] = cmd_wr(8'h1e); // write 0x1e + init_data[927] = cmd_start(7'h2e); + init_data[928] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[929] = cmd_wr(8'h01); // address 0x015a + init_data[930] = cmd_wr(8'h5a); + init_data[931] = cmd_wr(8'h00); // write 0x00 + // PLL1_WND_SIZE: 3 + // PLL1_CP_TRI: 0 + // PLL1_CP_POL: 1 + // PLL1_CP_GAIN: 4 + init_data[932] = cmd_start(7'h2e); + init_data[933] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[934] = cmd_wr(8'h01); // address 0x015b + init_data[935] = cmd_wr(8'h5b); + init_data[936] = cmd_wr(8'hd4); // write 0xd4 + // PLL1_DLD_CNT: 32, 0 + init_data[937] = cmd_start(7'h2e); + init_data[938] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[939] = cmd_wr(8'h01); // address 0x015c + init_data[940] = cmd_wr(8'h5c); + init_data[941] = cmd_wr(8'h20); // write 0x20 + init_data[942] = cmd_start(7'h2e); + init_data[943] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[944] = cmd_wr(8'h01); // address 0x015d + init_data[945] = cmd_wr(8'h5d); + init_data[946] = cmd_wr(8'h00); // write 0x00 + // HOLDOVER_EXIT_NADJ: 30 + init_data[947] = cmd_start(7'h2e); + init_data[948] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[949] = cmd_wr(8'h01); // address 0x015e + init_data[950] = cmd_wr(8'h5e); + init_data[951] = cmd_wr(8'h1e); // write 0x1e + // PLL1 LD pin: SPI readback + init_data[952] = cmd_start(7'h2e); + init_data[953] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[954] = cmd_wr(8'h01); // address 0x015f + init_data[955] = cmd_wr(8'h5f); + init_data[956] = cmd_wr(8'h3b); // write 0x3b + // configure PLL2 + // release PLL2 PD + init_data[957] = cmd_start(7'h2e); + init_data[958] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[959] = cmd_wr(8'h01); // address 0x0173 + init_data[960] = cmd_wr(8'h73); + init_data[961] = cmd_wr(8'h10); // write 0x10 + // PLL2 R: 1536 (0x600) + init_data[962] = cmd_start(7'h2e); + init_data[963] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[964] = cmd_wr(8'h01); // address 0x0160 + init_data[965] = cmd_wr(8'h60); + init_data[966] = cmd_wr(8'h06); // write 0x06 + init_data[967] = cmd_start(7'h2e); + init_data[968] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[969] = cmd_wr(8'h01); // address 0x0161 + init_data[970] = cmd_wr(8'h61); + init_data[971] = cmd_wr(8'h00); // write 0x00 + // PLL2 P: 2 (2) + // OSCin_FREQ: 1 (63-127) + // 2X: off + init_data[972] = cmd_start(7'h2e); + init_data[973] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[974] = cmd_wr(8'h01); // address 0x0162 + init_data[975] = cmd_wr(8'h62); + init_data[976] = cmd_wr(8'h44); // write 0x44 + // PLL2_N_CAL: 15625 (0x3d09) + init_data[977] = cmd_start(7'h2e); + init_data[978] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[979] = cmd_wr(8'h01); // address 0x0163 + init_data[980] = cmd_wr(8'h63); + init_data[981] = cmd_wr(8'h00); // write 0x00 + init_data[982] = cmd_start(7'h2e); + init_data[983] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[984] = cmd_wr(8'h01); // address 0x0164 + init_data[985] = cmd_wr(8'h64); + init_data[986] = cmd_wr(8'h3d); // write 0x3d + init_data[987] = cmd_start(7'h2e); + init_data[988] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[989] = cmd_wr(8'h01); // address 0x0165 + init_data[990] = cmd_wr(8'h65); + init_data[991] = cmd_wr(8'h09); // write 0x09 + // PLL2_N_CAL: 15625 (0x3d09) + init_data[992] = cmd_start(7'h2e); + init_data[993] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[994] = cmd_wr(8'h01); // address 0x0166 + init_data[995] = cmd_wr(8'h66); + init_data[996] = cmd_wr(8'h00); // write 0x00 + init_data[997] = cmd_start(7'h2e); + init_data[998] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[999] = cmd_wr(8'h01); // address 0x0167 + init_data[1000] = cmd_wr(8'h67); + init_data[1001] = cmd_wr(8'h3d); // write 0x3d + init_data[1002] = cmd_start(7'h2e); + init_data[1003] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[1004] = cmd_wr(8'h01); // address 0x0168 + init_data[1005] = cmd_wr(8'h68); + init_data[1006] = cmd_wr(8'h09); // write 0x09 + // PLL2_WND_SIZE: 2 (1.8 ns) + // PLL2_CP_GAIN: 3 + // PLL2_CP_POL: 0 + // PLL2_CP_TRI: 0 + // PLL2_DLD_EN: 1 + init_data[1007] = cmd_start(7'h2e); + init_data[1008] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[1009] = cmd_wr(8'h01); // address 0x0169 + init_data[1010] = cmd_wr(8'h69); + init_data[1011] = cmd_wr(8'h59); // write 0x59 + // PLL2_DLD_CNT: 32, 0 + init_data[1012] = cmd_start(7'h2e); + init_data[1013] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[1014] = cmd_wr(8'h01); // address 0x016a + init_data[1015] = cmd_wr(8'h6a); + init_data[1016] = cmd_wr(8'h20); // write 0x20 + init_data[1017] = cmd_start(7'h2e); + init_data[1018] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[1019] = cmd_wr(8'h01); // address 0x016b + init_data[1020] = cmd_wr(8'h6b); + init_data[1021] = cmd_wr(8'h00); // write 0x00 + // PLL2 LD pin: PLL1+PLL2 DLD + init_data[1022] = cmd_start(7'h2e); + init_data[1023] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[1024] = cmd_wr(8'h01); // address 0x016e + init_data[1025] = cmd_wr(8'h6e); + init_data[1026] = cmd_wr(8'h1b); // write 0x1b + // release PLL1 R reset + init_data[1027] = cmd_start(7'h2e); + init_data[1028] = cmd_wr(8'h01); // SPI transfer, CS mask 0x1 + init_data[1029] = cmd_wr(8'h01); // address 0x0177 + init_data[1030] = cmd_wr(8'h77); + init_data[1031] = cmd_wr(8'h00); // write 0x00 + // Configuration for LMX2594 PLL + // OSCin = 250 MHz + // VCO range 7.5 - 15 GHz + // R_PRE = 1 + // R = 1 + // PFD = OSCin / (R_PRE * R) = 250 MHz + // N = 32 + // VCO = PFD * N = 8 GHz + // VCO / 8 = 1 GHz + // Reset + init_data[1032] = cmd_start(7'h2a); + init_data[1033] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1034] = cmd_wr(8'h00); // address 0x00 + init_data[1035] = cmd_wr(8'h24); // write 0x2412 + init_data[1036] = cmd_wr(8'h12); + init_data[1037] = cmd_start(7'h2a); + init_data[1038] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1039] = cmd_wr(8'h00); // address 0x00 + init_data[1040] = cmd_wr(8'h24); // write 0x2410 + init_data[1041] = cmd_wr(8'h10); + // QUICK_RECAL_EN: 0 + // VCO_CAPCTRL_STRT: 0 + init_data[1042] = cmd_start(7'h2a); + init_data[1043] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1044] = cmd_wr(8'h4e); // address 0x4e + init_data[1045] = cmd_wr(8'h00); // write 0x0001 + init_data[1046] = cmd_wr(8'h01); + // 77,0x0000 + // 76,0x0000 + // CHDIV: 3 (8) + init_data[1047] = cmd_start(7'h2a); + init_data[1048] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1049] = cmd_wr(8'h4b); // address 0x4b + init_data[1050] = cmd_wr(8'h08); // write 0x08c0 + init_data[1051] = cmd_wr(8'hc0); + // 74,0x0000 + // 73,0x0000 + // 72,0x0000 + // 71,0x0000 + // MASH_RST_COUNT: 50000 (0xc350) + init_data[1052] = cmd_start(7'h2a); + init_data[1053] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1054] = cmd_wr(8'h46); // address 0x46 + init_data[1055] = cmd_wr(8'hc3); // write 0xc350 + init_data[1056] = cmd_wr(8'h50); + // MASH_RST_COUNT: 50000 (0xc350) + init_data[1057] = cmd_start(7'h2a); + init_data[1058] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1059] = cmd_wr(8'h45); // address 0x45 + init_data[1060] = cmd_wr(8'h00); // write 0x0000 + init_data[1061] = cmd_wr(8'h00); + // 68,0x0000 + // 67,0x0000 + // 66,0x0000 + // 65,0x0000 + // 64,0x0000 + // 63,0x0000 + // 62,0x0000 + // 61,0x0000 + // LD_DELAY: 1000 (0x3e8) + init_data[1062] = cmd_start(7'h2a); + init_data[1063] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1064] = cmd_wr(8'h3c); // address 0x3c + init_data[1065] = cmd_wr(8'h03); // write 0x03e8 + init_data[1066] = cmd_wr(8'he8); + // LD_TYPE: 1 + init_data[1067] = cmd_start(7'h2a); + init_data[1068] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1069] = cmd_wr(8'h3b); // address 0x3b + init_data[1070] = cmd_wr(8'h00); // write 0x0001 + init_data[1071] = cmd_wr(8'h01); + // INPIN_IGNORE: 1 + // INPIN_HYST: 0 + // INPIN_LVL: 0 + // INPIN_FMT: 0 + init_data[1072] = cmd_start(7'h2a); + init_data[1073] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1074] = cmd_wr(8'h3a); // address 0x3a + init_data[1075] = cmd_wr(8'h80); // write 0x8001 + init_data[1076] = cmd_wr(8'h01); + // 57,0x0000 + // 56,0x0000 + // 55,0x0000 + // 54,0x0000 + // 53,0x0000 + // 52,0x0000 + // 51,0x0000 + // 50,0x0000 + // 49,0x0000 + // 48,0x0000 + // 47,0x0000 + // OUTB_MUX: 0 (ch div) + init_data[1077] = cmd_start(7'h2a); + init_data[1078] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1079] = cmd_wr(8'h2e); // address 0x2e + init_data[1080] = cmd_wr(8'h07); // write 0x07fc + init_data[1081] = cmd_wr(8'hfc); + // OUTA_MUX: 0 (ch div) + // OUT_ISET: 0 (max) + // OUTB_PWR: 31 (0x1f) + init_data[1082] = cmd_start(7'h2a); + init_data[1083] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1084] = cmd_wr(8'h2d); // address 0x2d + init_data[1085] = cmd_wr(8'hc0); // write 0xc0df + init_data[1086] = cmd_wr(8'hdf); + // OUTA_PWR: 31 (0x1f) + // OUTB_PD: 0 + // OUTA_PD: 0 + // MASH_RESET_N: 0 + // MASH_ORDER: 0 + init_data[1087] = cmd_start(7'h2a); + init_data[1088] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1089] = cmd_wr(8'h2c); // address 0x2c + init_data[1090] = cmd_wr(8'h1f); // write 0x1f00 + init_data[1091] = cmd_wr(8'h00); + // PLL_NUM: 0 + init_data[1092] = cmd_start(7'h2a); + init_data[1093] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1094] = cmd_wr(8'h2b); // address 0x2b + init_data[1095] = cmd_wr(8'h00); // write 0x0000 + init_data[1096] = cmd_wr(8'h00); + // PLL_NUM: 0 + init_data[1097] = cmd_start(7'h2a); + init_data[1098] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1099] = cmd_wr(8'h2a); // address 0x2a + init_data[1100] = cmd_wr(8'h00); // write 0x0000 + init_data[1101] = cmd_wr(8'h00); + // MASH_SEED: 0 + init_data[1102] = cmd_start(7'h2a); + init_data[1103] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1104] = cmd_wr(8'h29); // address 0x29 + init_data[1105] = cmd_wr(8'h00); // write 0x0000 + init_data[1106] = cmd_wr(8'h00); + // MASH_SEED: 0 + init_data[1107] = cmd_start(7'h2a); + init_data[1108] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1109] = cmd_wr(8'h28); // address 0x28 + init_data[1110] = cmd_wr(8'h00); // write 0x0000 + init_data[1111] = cmd_wr(8'h00); + // PLL_DEN: '1 + init_data[1112] = cmd_start(7'h2a); + init_data[1113] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1114] = cmd_wr(8'h27); // address 0x27 + init_data[1115] = cmd_wr(8'hff); // write 0xffff + init_data[1116] = cmd_wr(8'hff); + // PLL_DEN: '1 + init_data[1117] = cmd_start(7'h2a); + init_data[1118] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1119] = cmd_wr(8'h26); // address 0x26 + init_data[1120] = cmd_wr(8'hff); // write 0xffff + init_data[1121] = cmd_wr(8'hff); + // MASH_SEED_EN: 0 + // PFD_DLY_SEL: 2 + init_data[1122] = cmd_start(7'h2a); + init_data[1123] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1124] = cmd_wr(8'h25); // address 0x25 + init_data[1125] = cmd_wr(8'h02); // write 0x0204 + init_data[1126] = cmd_wr(8'h04); + // PLL_N: 32 (0x20) + init_data[1127] = cmd_start(7'h2a); + init_data[1128] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1129] = cmd_wr(8'h24); // address 0x24 + init_data[1130] = cmd_wr(8'h00); // write 0x0020 + init_data[1131] = cmd_wr(8'h20); + // 35,0x0000 + // PLL_N: 32 (0x20) + init_data[1132] = cmd_start(7'h2a); + init_data[1133] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1134] = cmd_wr(8'h22); // address 0x22 + init_data[1135] = cmd_wr(8'h00); // write 0x0000 + init_data[1136] = cmd_wr(8'h00); + // 33,0x0000 + // 32,0x0000 + // CHDIV_DIV2: 1 + init_data[1137] = cmd_start(7'h2a); + init_data[1138] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1139] = cmd_wr(8'h1f); // address 0x1f + init_data[1140] = cmd_wr(8'h43); // write 0x43ec + init_data[1141] = cmd_wr(8'hec); + // 30,0x0000 + // 29,0x0000 + // 28,0x0000 + // 27,0x0000 + // 26,0x0000 + // 25,0x0000 + // 24,0x0000 + // 23,0x0000 + // 22,0x0000 + // 21,0x0000 + // VCO_SEL: 7 (VCO7) + // VCO_SEL_FORCE: 0 + init_data[1142] = cmd_start(7'h2a); + init_data[1143] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1144] = cmd_wr(8'h14); // address 0x14 + init_data[1145] = cmd_wr(8'hf8); // write 0xf848 + init_data[1146] = cmd_wr(8'h48); + // VCO_CAPCTRL: 183 (0xb7) + init_data[1147] = cmd_start(7'h2a); + init_data[1148] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1149] = cmd_wr(8'h13); // address 0x13 + init_data[1150] = cmd_wr(8'h27); // write 0x27b7 + init_data[1151] = cmd_wr(8'hb7); + // 18,0x0000 + // VCO_DACISET_STRT: 250 (0xfa) + init_data[1152] = cmd_start(7'h2a); + init_data[1153] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1154] = cmd_wr(8'h11); // address 0x11 + init_data[1155] = cmd_wr(8'h00); // write 0x00fa + init_data[1156] = cmd_wr(8'hfa); + // VCO_DACISET: 128 (0x80) + init_data[1157] = cmd_start(7'h2a); + init_data[1158] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1159] = cmd_wr(8'h10); // address 0x10 + init_data[1160] = cmd_wr(8'h00); // write 0x0080 + init_data[1161] = cmd_wr(8'h80); + // 15,0x0000 + // CPG: 7 + init_data[1162] = cmd_start(7'h2a); + init_data[1163] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1164] = cmd_wr(8'h0e); // address 0x0e + init_data[1165] = cmd_wr(8'h1e); // write 0x1e70 + init_data[1166] = cmd_wr(8'h70); + // PLL_R_PRE: 1 + init_data[1167] = cmd_start(7'h2a); + init_data[1168] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1169] = cmd_wr(8'h0c); // address 0x0c + init_data[1170] = cmd_wr(8'h50); // write 0x5001 + init_data[1171] = cmd_wr(8'h01); + // PLL_R: 1 + init_data[1172] = cmd_start(7'h2a); + init_data[1173] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1174] = cmd_wr(8'h0b); // address 0x0b + init_data[1175] = cmd_wr(8'h00); // write 0x0018 + init_data[1176] = cmd_wr(8'h18); + // MULT: 1 (bypass) + init_data[1177] = cmd_start(7'h2a); + init_data[1178] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1179] = cmd_wr(8'h0a); // address 0x0a + init_data[1180] = cmd_wr(8'h10); // write 0x10d8 + init_data[1181] = cmd_wr(8'hd8); + // OSC_2X: 0 + init_data[1182] = cmd_start(7'h2a); + init_data[1183] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1184] = cmd_wr(8'h09); // address 0x09 + init_data[1185] = cmd_wr(8'h06); // write 0x0604 + init_data[1186] = cmd_wr(8'h04); + // VCO_DACISET_FORCE: 0 + // VCO_CAPCTRL_FORCE: 0 + init_data[1187] = cmd_start(7'h2a); + init_data[1188] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1189] = cmd_wr(8'h08); // address 0x08 + init_data[1190] = cmd_wr(8'h20); // write 0x2000 + init_data[1191] = cmd_wr(8'h00); + // OUT_FORCE: 0 + init_data[1192] = cmd_start(7'h2a); + init_data[1193] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1194] = cmd_wr(8'h07); // address 0x07 + init_data[1195] = cmd_wr(8'h00); // write 0x00b2 + init_data[1196] = cmd_wr(8'hb2); + // ACAL_CMP_DLY: 10 + init_data[1197] = cmd_start(7'h2a); + init_data[1198] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1199] = cmd_wr(8'h04); // address 0x04 + init_data[1200] = cmd_wr(8'h0a); // write 0x0a43 + init_data[1201] = cmd_wr(8'h43); + // CAL_CLK_DIV: 3 (div 8) + init_data[1202] = cmd_start(7'h2a); + init_data[1203] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1204] = cmd_wr(8'h01); // address 0x01 + init_data[1205] = cmd_wr(8'h08); // write 0x080b + init_data[1206] = cmd_wr(8'h0b); + // FCAL_HPFD_ADJ: 3 (PFD > 200 MHz) + // FCAL_LPFD_ADJ: 0 (PFD > 10 MHz) + // FCAL_EN: 0 + // MUXOUT_LD_SEL: 0 (readback) + // RESET: 0 + // POWERDOWN: 0 + init_data[1207] = cmd_start(7'h2a); + init_data[1208] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1209] = cmd_wr(8'h00); // address 0x00 + init_data[1210] = cmd_wr(8'h25); // write 0x2590 + init_data[1211] = cmd_wr(8'h90); + // Delay 10 msec + init_data[1212] = cmd_delay(10); // delay 300 ms + // FCAL_HPFD_ADJ: 3 (PFD > 200 MHz) + // FCAL_LPFD_ADJ: 0 (PFD > 10 MHz) + // FCAL_EN: 1 + // MUXOUT_LD_SEL: 0 (readback) + // RESET: 0 + // POWERDOWN: 0 + init_data[1213] = cmd_start(7'h2a); + init_data[1214] = cmd_wr(8'h07); // SPI transfer, CS mask 0x7 + init_data[1215] = cmd_wr(8'h00); // address 0x00 + init_data[1216] = cmd_wr(8'h25); // write 0x2598 + init_data[1217] = cmd_wr(8'h98); + // Clear I2C-SPI bridge interrupt for LMK04832 + init_data[1218] = cmd_start(7'h2e); + init_data[1219] = cmd_wr(8'hf1); + // Clear I2C-SPI bridge interrupt for LMX2594 + init_data[1220] = cmd_start(7'h2a); + init_data[1221] = cmd_wr(8'hf1); + init_data[1222] = cmd_halt(); // end +end + +localparam [2:0] + STATE_IDLE = 3'd0, + STATE_RUN = 3'd1, + STATE_TABLE_1 = 3'd2, + STATE_TABLE_2 = 3'd3, + STATE_TABLE_3 = 3'd4; + +logic [2:0] state_reg = STATE_IDLE, state_next; + +localparam AW = $clog2(INIT_DATA_LEN); + +logic [8:0] init_data_reg = '0; + +logic [AW-1:0] address_reg = '0, address_next; +logic [AW-1:0] address_ptr_reg = '0, address_ptr_next; +logic [AW-1:0] data_ptr_reg = '0, data_ptr_next; + +logic [6:0] cur_address_reg = '0, cur_address_next; + +logic [31:0] delay_counter_reg = '0, delay_counter_next; + +logic [6:0] m_axis_cmd_address_reg = '0, m_axis_cmd_address_next; +logic m_axis_cmd_start_reg = 1'b0, m_axis_cmd_start_next; +logic m_axis_cmd_write_reg = 1'b0, m_axis_cmd_write_next; +logic m_axis_cmd_stop_reg = 1'b0, m_axis_cmd_stop_next; +logic m_axis_cmd_valid_reg = 1'b0, m_axis_cmd_valid_next; + +logic [7:0] m_axis_tx_tdata_reg = '0, m_axis_tx_tdata_next; +logic m_axis_tx_tvalid_reg = 1'b0, m_axis_tx_tvalid_next; + +logic start_flag_reg = 1'b0, start_flag_next; + +logic busy_reg = 1'b0; + +assign m_axis_cmd.tdata[6:0] = m_axis_cmd_address_reg; +assign m_axis_cmd.tdata[7] = m_axis_cmd_start_reg; +assign m_axis_cmd.tdata[8] = 1'b0; // read +assign m_axis_cmd.tdata[9] = m_axis_cmd_write_reg; +assign m_axis_cmd.tdata[10] = 1'b0; // write multi +assign m_axis_cmd.tdata[11] = m_axis_cmd_stop_reg; +assign m_axis_cmd.tvalid = m_axis_cmd_valid_reg; +assign m_axis_cmd.tlast = 1'b1; +assign m_axis_cmd.tid = '0; +assign m_axis_cmd.tdest = '0; +assign m_axis_cmd.tuser = '0; + +assign m_axis_tx.tdata = m_axis_tx_tdata_reg; +assign m_axis_tx.tvalid = m_axis_tx_tvalid_reg; +assign m_axis_tx.tlast = 1'b1; +assign m_axis_tx.tid = '0; +assign m_axis_tx.tdest = '0; +assign m_axis_tx.tuser = '0; + +assign busy = busy_reg; + +always_comb begin + state_next = STATE_IDLE; + + address_next = address_reg; + address_ptr_next = address_ptr_reg; + data_ptr_next = data_ptr_reg; + + cur_address_next = cur_address_reg; + + delay_counter_next = delay_counter_reg; + + m_axis_cmd_address_next = m_axis_cmd_address_reg; + m_axis_cmd_start_next = m_axis_cmd_start_reg && !(m_axis_cmd.tvalid && m_axis_cmd.tready); + m_axis_cmd_write_next = m_axis_cmd_write_reg && !(m_axis_cmd.tvalid && m_axis_cmd.tready); + m_axis_cmd_stop_next = m_axis_cmd_stop_reg && !(m_axis_cmd.tvalid && m_axis_cmd.tready); + m_axis_cmd_valid_next = m_axis_cmd_valid_reg && !m_axis_cmd.tready; + + m_axis_tx_tdata_next = m_axis_tx_tdata_reg; + m_axis_tx_tvalid_next = m_axis_tx_tvalid_reg && !m_axis_tx.tready; + + start_flag_next = start_flag_reg; + + if (m_axis_cmd.tvalid || m_axis_tx.tvalid) begin + // wait for output registers to clear + state_next = state_reg; + end else if (delay_counter_reg != 0) begin + // delay + delay_counter_next = delay_counter_reg - 1; + state_next = state_reg; + end else begin + case (state_reg) + STATE_IDLE: begin + // wait for start signal + if (!start_flag_reg && start) begin + address_next = '0; + start_flag_next = 1'b1; + state_next = STATE_RUN; + end else begin + state_next = STATE_IDLE; + end + end + STATE_RUN: begin + // process commands + if (init_data_reg[8] == 1'b1) begin + // write data + m_axis_cmd_write_next = 1'b1; + m_axis_cmd_stop_next = 1'b0; + m_axis_cmd_valid_next = 1'b1; + + m_axis_tx_tdata_next = init_data_reg[7:0]; + m_axis_tx_tvalid_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_RUN; + end else if (init_data_reg[8:7] == 2'b01) begin + // write address + m_axis_cmd_address_next = init_data_reg[6:0]; + m_axis_cmd_start_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_RUN; + end else if (init_data_reg[8:4] == 5'b00001) begin + // delay + if (SIM_SPEEDUP) begin + delay_counter_next = 32'd1 << (init_data_reg[3:0]); + end else begin + delay_counter_next = 32'd1 << (init_data_reg[3:0]+16); + end + + address_next = address_reg + 1; + + state_next = STATE_RUN; + end else if (init_data_reg == 9'b001000001) begin + // send stop + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_RUN; + end else if (init_data_reg == 9'b000001001) begin + // data table start + data_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end else if (init_data_reg == 9'd0) begin + // stop + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + state_next = STATE_IDLE; + end else begin + // invalid command, skip + address_next = address_reg + 1; + state_next = STATE_RUN; + end + end + STATE_TABLE_1: begin + // find address table start + if (init_data_reg == 9'b000001000) begin + // address table start + address_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_2; + end else if (init_data_reg == 9'b000001001) begin + // data table start + data_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end else if (init_data_reg == 1) begin + // exit mode + address_next = address_reg + 1; + state_next = STATE_RUN; + end else if (init_data_reg == 9'd0) begin + // stop + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + state_next = STATE_IDLE; + end else begin + // invalid command, skip + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end + end + STATE_TABLE_2: begin + // find next address + if (init_data_reg[8:7] == 2'b01) begin + // write address command + // store address and move to data table + cur_address_next = init_data_reg[6:0]; + address_ptr_next = address_reg + 1; + address_next = data_ptr_reg; + state_next = STATE_TABLE_3; + end else if (init_data_reg == 9'b000001001) begin + // data table start + data_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end else if (init_data_reg == 9'd1) begin + // exit mode + address_next = address_reg + 1; + state_next = STATE_RUN; + end else if (init_data_reg == 9'd0) begin + // stop + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + state_next = STATE_IDLE; + end else begin + // invalid command, skip + address_next = address_reg + 1; + state_next = STATE_TABLE_2; + end + end + STATE_TABLE_3: begin + // process data table with selected address + if (init_data_reg[8] == 1'b1) begin + // write data + m_axis_cmd_write_next = 1'b1; + m_axis_cmd_stop_next = 1'b0; + m_axis_cmd_valid_next = 1'b1; + + m_axis_tx_tdata_next = init_data_reg[7:0]; + m_axis_tx_tvalid_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg[8:7] == 2'b01) begin + // write address + m_axis_cmd_address_next = init_data_reg[6:0]; + m_axis_cmd_start_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg == 9'b000000011) begin + // write current address + m_axis_cmd_address_next = cur_address_reg; + m_axis_cmd_start_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg[8:4] == 5'b00001) begin + // delay + if (SIM_SPEEDUP) begin + delay_counter_next = 32'd1 << (init_data_reg[3:0]); + end else begin + delay_counter_next = 32'd1 << (init_data_reg[3:0]+16); + end + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg == 9'b001000001) begin + // send stop + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + address_next = address_reg + 1; + + state_next = STATE_TABLE_3; + end else if (init_data_reg == 9'b000001001) begin + // data table start + data_ptr_next = address_reg + 1; + address_next = address_reg + 1; + state_next = STATE_TABLE_1; + end else if (init_data_reg == 9'b000001000) begin + // address table start + address_next = address_ptr_reg; + state_next = STATE_TABLE_2; + end else if (init_data_reg == 9'd1) begin + // exit mode + address_next = address_reg + 1; + state_next = STATE_RUN; + end else if (init_data_reg == 9'd0) begin + // stop + m_axis_cmd_start_next = 1'b0; + m_axis_cmd_write_next = 1'b0; + m_axis_cmd_stop_next = 1'b1; + m_axis_cmd_valid_next = 1'b1; + + state_next = STATE_IDLE; + end else begin + // invalid command, skip + address_next = address_reg + 1; + state_next = STATE_TABLE_3; + end + end + default: begin + // invalid state + state_next = STATE_IDLE; + end + endcase + end +end + +always_ff @(posedge clk) begin + state_reg <= state_next; + + // read init_data ROM + init_data_reg <= init_data[address_next]; + + address_reg <= address_next; + address_ptr_reg <= address_ptr_next; + data_ptr_reg <= data_ptr_next; + + cur_address_reg <= cur_address_next; + + delay_counter_reg <= delay_counter_next; + + m_axis_cmd_address_reg <= m_axis_cmd_address_next; + m_axis_cmd_start_reg <= m_axis_cmd_start_next; + m_axis_cmd_write_reg <= m_axis_cmd_write_next; + m_axis_cmd_stop_reg <= m_axis_cmd_stop_next; + m_axis_cmd_valid_reg <= m_axis_cmd_valid_next; + + m_axis_tx_tdata_reg <= m_axis_tx_tdata_next; + m_axis_tx_tvalid_reg <= m_axis_tx_tvalid_next; + + start_flag_reg <= start && start_flag_next; + + busy_reg <= (state_reg != STATE_IDLE); + + if (rst) begin + state_reg <= STATE_IDLE; + + init_data_reg <= '0; + + address_reg <= '0; + address_ptr_reg <= '0; + data_ptr_reg <= '0; + + cur_address_reg <= '0; + + delay_counter_reg <= '0; + + m_axis_cmd_valid_reg <= 1'b0; + + m_axis_tx_tvalid_reg <= 1'b0; + + start_flag_reg <= 1'b0; + + busy_reg <= 1'b0; + end +end + +endmodule + +`resetall \ No newline at end of file diff --git a/src/eth/example/HTG_ZRF8/fpga/rtl/fpga_core.sv b/src/eth/example/HTG_ZRF8/fpga/rtl/fpga_core.sv new file mode 100644 index 0000000..87394f2 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/rtl/fpga_core.sv @@ -0,0 +1,610 @@ +// SPDX-License-Identifier: MIT +/* + +Copyright (c) 2021-2025 FPGA Ninja, LLC + +Authors: +- Alex Forencich + +*/ + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * FPGA core logic + */ +module fpga_core # +( + parameter logic SIM = 1'b0, + parameter string VENDOR = "XILINX", + parameter string FAMILY = "zynquplusRFSOC", + parameter PORT_CNT = 2, + parameter GTY_QUAD_CNT = PORT_CNT, + parameter GTY_CNT = GTY_QUAD_CNT*4, + parameter GTY_CLK_CNT = GTY_QUAD_CNT, + parameter ADC_CNT = 8, + parameter DAC_CNT = ADC_CNT +) +( + /* + * Clock: 125MHz + * Synchronous reset + */ + input wire logic clk_125mhz, + input wire logic rst_125mhz, + input wire logic fpga_refclk, + input wire logic fpga_sysref, + + /* + * GPIO + */ + input wire logic [3:0] sw, + output wire logic [3:0] led, + output wire logic [7:0] gpio, + + /* + * I2C for board management + */ + input wire logic i2c_scl_i, + output wire logic i2c_scl_o, + input wire logic i2c_sda_i, + output wire logic i2c_sda_o, + + /* + * UART: 921600 bps, 8N1 + */ + output wire logic uart_rxd, + input wire logic uart_txd, + input wire logic uart_rts, + output wire logic uart_cts, + output wire logic uart_rst_n, + input wire logic uart_suspend_n, + + /* + * Ethernet: QSFP28 + */ + output wire logic [GTY_CNT-1:0] eth_gty_tx_p, + output wire logic [GTY_CNT-1:0] eth_gty_tx_n, + input wire logic [GTY_CNT-1:0] eth_gty_rx_p, + input wire logic [GTY_CNT-1:0] eth_gty_rx_n, + input wire logic [GTY_CLK_CNT-1:0] eth_gty_mgt_refclk_p, + input wire logic [GTY_CLK_CNT-1:0] eth_gty_mgt_refclk_n, + output wire logic [GTY_CLK_CNT-1:0] eth_gty_mgt_refclk_out, + + output wire logic [PORT_CNT-1:0] eth_port_resetl, + input wire logic [PORT_CNT-1:0] eth_port_modprsl, + input wire logic [PORT_CNT-1:0] eth_port_intl, + + /* + * RFDC + */ + input wire logic axil_rfdc_clk, + input wire logic axil_rfdc_rst, + taxi_axil_if.wr_mst m_axil_rfdc_wr, + taxi_axil_if.rd_mst m_axil_rfdc_rd, + + input wire logic axis_rfdc_clk, + input wire logic axis_rfdc_rst, + taxi_axis_if.snk s_axis_adc[ADC_CNT], + taxi_axis_if.src m_axis_dac[DAC_CNT] +); + +// XFCP +taxi_axis_if #(.DATA_W(8), .USER_EN(1), .USER_W(1)) xfcp_ds(), xfcp_us(); + +assign uart_cts = 1'b1; +assign uart_rst_n = 1'b1; + +taxi_xfcp_if_uart #( + .TX_FIFO_DEPTH(512), + .RX_FIFO_DEPTH(512) +) +xfcp_if_uart_inst ( + .clk(clk_125mhz), + .rst(rst_125mhz), + + /* + * UART interface + */ + .uart_rxd(uart_txd), + .uart_txd(uart_rxd), + + /* + * XFCP downstream interface + */ + .xfcp_dsp_ds(xfcp_ds), + .xfcp_dsp_us(xfcp_us), + + /* + * Configuration + */ + .prescale(16'(125000000/921600)) +); + +taxi_axis_if #(.DATA_W(8), .USER_EN(1), .USER_W(1)) xfcp_sw_ds[3](), xfcp_sw_us[3](); + +taxi_xfcp_switch #( + .XFCP_ID_STR("HTG-ZRF8"), + .XFCP_EXT_ID(0), + .XFCP_EXT_ID_STR("Taxi example"), + .PORTS($size(xfcp_sw_us)) +) +xfcp_sw_inst ( + .clk(clk_125mhz), + .rst(rst_125mhz), + + /* + * XFCP upstream port + */ + .xfcp_usp_ds(xfcp_ds), + .xfcp_usp_us(xfcp_us), + + /* + * XFCP downstream ports + */ + .xfcp_dsp_ds(xfcp_sw_ds), + .xfcp_dsp_us(xfcp_sw_us) +); + +// Statistics +taxi_axis_if #(.DATA_W(16), .KEEP_W(1), .KEEP_EN(0), .LAST_EN(0), .USER_EN(1), .USER_W(1), .ID_EN(1), .ID_W(10)) axis_stat(); + +taxi_xfcp_mod_stats #( + .XFCP_ID_STR("Statistics"), + .XFCP_EXT_ID(0), + .XFCP_EXT_ID_STR(""), + .STAT_COUNT_W(64), + .STAT_PIPELINE(2) +) +xfcp_stats_inst ( + .clk(clk_125mhz), + .rst(rst_125mhz), + + /* + * XFCP upstream port + */ + .xfcp_usp_ds(xfcp_sw_ds[0]), + .xfcp_usp_us(xfcp_sw_us[0]), + + /* + * Statistics increment input + */ + .s_axis_stat(axis_stat) +); + +taxi_axis_if #(.DATA_W(16), .KEEP_W(1), .KEEP_EN(0), .LAST_EN(0), .USER_EN(1), .USER_W(1), .ID_EN(1), .ID_W(axis_stat.ID_W)) axis_eth_stat[GTY_QUAD_CNT](); + +taxi_axis_arb_mux #( + .S_COUNT($size(axis_eth_stat)), + .UPDATE_TID(1'b0), + .ARB_ROUND_ROBIN(1'b1), + .ARB_LSB_HIGH_PRIO(1'b0) +) +stat_mux_inst ( + .clk(clk_125mhz), + .rst(rst_125mhz), + + /* + * AXI4-Stream inputs (sink) + */ + .s_axis(axis_eth_stat), + + /* + * AXI4-Stream output (source) + */ + .m_axis(axis_stat) +); + +// I2C +taxi_xfcp_mod_i2c_master #( + .DEFAULT_PRESCALE(16'(125000000/400000/4)) +) +xfcp_mod_i2c_inst ( + .clk(clk_125mhz), + .rst(rst_125mhz), + + /* + * XFCP upstream port + */ + .xfcp_usp_ds(xfcp_sw_ds[1]), + .xfcp_usp_us(xfcp_sw_us[1]), + + /* + * I2C interface + */ + .i2c_scl_i(i2c_scl_i), + .i2c_scl_o(i2c_scl_o), + .i2c_sda_i(i2c_sda_i), + .i2c_sda_o(i2c_sda_o) +); + +// RFDC control +taxi_xfcp_mod_axil #( + .XFCP_ID_STR("RFDC"), + .COUNT_SIZE(16) +) +xfcp_mod_axil_inst ( + .clk(clk_125mhz), + .rst(rst_125mhz), + + /* + * XFCP upstream port + */ + .xfcp_usp_ds(xfcp_sw_ds[2]), + .xfcp_usp_us(xfcp_sw_us[2]), + + /* + * AXI lite master interface + */ + .m_axil_wr(m_axil_rfdc_wr), + .m_axil_rd(m_axil_rfdc_rd) +); + +// Ethernet +wire eth_reset = SIM ? 1'b0 : rst_125mhz; +assign eth_port_resetl = {PORT_CNT{~eth_reset}}; + +wire [GTY_CNT-1:0] eth_gty_tx_clk; +wire [GTY_CNT-1:0] eth_gty_tx_rst; +taxi_axis_if #(.DATA_W(64), .ID_W(8)) eth_gty_axis_tx[GTY_CNT](); +taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) eth_gty_axis_tx_cpl[GTY_CNT](); + +wire [GTY_CNT-1:0] eth_gty_rx_clk; +wire [GTY_CNT-1:0] eth_gty_rx_rst; +taxi_axis_if #(.DATA_W(64), .ID_W(8)) eth_gty_axis_rx[GTY_CNT](); + +wire [GTY_CNT-1:0] eth_gty_rx_status; + +wire [GTY_QUAD_CNT-1:0] eth_gty_gtpowergood; + +wire [GTY_CLK_CNT-1:0] eth_gty_mgt_refclk; +wire [GTY_CLK_CNT-1:0] eth_gty_mgt_refclk_bufg; + +wire [GTY_CLK_CNT-1:0] eth_gty_rst; + +for (genvar n = 0; n < GTY_CLK_CNT; n = n + 1) begin : gty_clk + + wire eth_gty_mgt_refclk_int; + + if (SIM) begin + + assign eth_gty_mgt_refclk[n] = eth_gty_mgt_refclk_p[n]; + assign eth_gty_mgt_refclk_int = eth_gty_mgt_refclk_p[n]; + assign eth_gty_mgt_refclk_bufg[n] = eth_gty_mgt_refclk_int; + + end else begin + + IBUFDS_GTE4 ibufds_gte4_eth_gty_mgt_refclk_inst ( + .I (eth_gty_mgt_refclk_p[n]), + .IB (eth_gty_mgt_refclk_n[n]), + .CEB (1'b0), + .O (eth_gty_mgt_refclk[n]), + .ODIV2 (eth_gty_mgt_refclk_int) + ); + + BUFG_GT bufg_gt_eth_gty_mgt_refclk_inst ( + .CE (ð_gty_gtpowergood), + .CEMASK (1'b1), + .CLR (1'b0), + .CLRMASK (1'b1), + .DIV (3'd0), + .I (eth_gty_mgt_refclk_int), + .O (eth_gty_mgt_refclk_bufg[n]) + ); + + end + + assign eth_gty_mgt_refclk_out[n] = eth_gty_mgt_refclk_bufg[n]; + + taxi_sync_reset #( + .N(4) + ) + qsfp_sync_reset_inst ( + .clk(eth_gty_mgt_refclk_bufg[n]), + .rst(rst_125mhz || eth_reset), + .out(eth_gty_rst[n]) + ); + +end + +localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP1[4] = '{"QSFP1.1", "QSFP1.2", "QSFP1.3", "QSFP1.4"}; +localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP2[4] = '{"QSFP2.1", "QSFP2.2", "QSFP2.3", "QSFP2.4"}; + +for (genvar n = 0; n < GTY_QUAD_CNT; n = n + 1) begin : gty_quad + + localparam CLK = n; + localparam CNT = 4; + + taxi_eth_mac_25g_us #( + .SIM(SIM), + .VENDOR(VENDOR), + .FAMILY(FAMILY), + + .CNT(CNT), + + // GT config + .CFG_LOW_LATENCY(1), + + // GT type + .GT_TYPE("GTY"), + + // PHY parameters + .PADDING_EN(1'b1), + .DIC_EN(1'b1), + .MIN_FRAME_LEN(64), + .PTP_TS_EN(1'b0), + .PTP_TS_FMT_TOD(1'b1), + .PTP_TS_W(96), + .PRBS31_EN(1'b0), + .TX_SERDES_PIPELINE(1), + .RX_SERDES_PIPELINE(1), + .COUNT_125US(125000/6.4), + .STAT_EN(1), + .STAT_TX_LEVEL(1), + .STAT_RX_LEVEL(1), + .STAT_ID_BASE(n*CNT*(16+16)), + .STAT_UPDATE_PERIOD(1024), + .STAT_STR_EN(1), + .STAT_PREFIX_STR( + n == 0 ? STAT_PREFIX_STR_QSFP1 : + STAT_PREFIX_STR_QSFP2 + ) + ) + mac_inst ( + .xcvr_ctrl_clk(clk_125mhz), + .xcvr_ctrl_rst(eth_gty_rst[CLK]), + + /* + * Common + */ + .xcvr_gtpowergood_out(eth_gty_gtpowergood[n]), + .xcvr_gtrefclk00_in(eth_gty_mgt_refclk[CLK]), + .xcvr_qpll0pd_in(1'b0), + .xcvr_qpll0reset_in(1'b0), + .xcvr_qpll0pcierate_in(3'd0), + .xcvr_qpll0lock_out(), + .xcvr_qpll0clk_out(), + .xcvr_qpll0refclk_out(), + .xcvr_gtrefclk01_in(eth_gty_mgt_refclk[CLK]), + .xcvr_qpll1pd_in(1'b0), + .xcvr_qpll1reset_in(1'b0), + .xcvr_qpll1pcierate_in(3'd0), + .xcvr_qpll1lock_out(), + .xcvr_qpll1clk_out(), + .xcvr_qpll1refclk_out(), + + /* + * Serial data + */ + .xcvr_txp(eth_gty_tx_p[n*CNT +: CNT]), + .xcvr_txn(eth_gty_tx_n[n*CNT +: CNT]), + .xcvr_rxp(eth_gty_rx_p[n*CNT +: CNT]), + .xcvr_rxn(eth_gty_rx_n[n*CNT +: CNT]), + + /* + * MAC clocks + */ + .rx_clk(eth_gty_rx_clk[n*CNT +: CNT]), + .rx_rst_in('0), + .rx_rst_out(eth_gty_rx_rst[n*CNT +: CNT]), + .tx_clk(eth_gty_tx_clk[n*CNT +: CNT]), + .tx_rst_in('0), + .tx_rst_out(eth_gty_tx_rst[n*CNT +: CNT]), + .ptp_sample_clk('0), + + /* + * Transmit interface (AXI stream) + */ + .s_axis_tx(eth_gty_axis_tx[n*CNT +: CNT]), + .m_axis_tx_cpl(eth_gty_axis_tx_cpl[n*CNT +: CNT]), + + /* + * Receive interface (AXI stream) + */ + .m_axis_rx(eth_gty_axis_rx[n*CNT +: CNT]), + + /* + * PTP clock + */ + .tx_ptp_ts('{CNT{'0}}), + .tx_ptp_ts_step('0), + .rx_ptp_ts('{CNT{'0}}), + .rx_ptp_ts_step('0), + + /* + * Link-level Flow Control (LFC) (IEEE 802.3 annex 31B PAUSE) + */ + .tx_lfc_req('0), + .tx_lfc_resend('0), + .rx_lfc_en('0), + .rx_lfc_req(), + .rx_lfc_ack('0), + + /* + * Priority Flow Control (PFC) (IEEE 802.3 annex 31D PFC) + */ + .tx_pfc_req('{CNT{'0}}), + .tx_pfc_resend('0), + .rx_pfc_en('{CNT{'0}}), + .rx_pfc_req(), + .rx_pfc_ack('{CNT{'0}}), + + /* + * Pause interface + */ + .tx_lfc_pause_en('0), + .tx_pause_req('0), + .tx_pause_ack(), + + /* + * Statistics + */ + .stat_clk(clk_125mhz), + .stat_rst(rst_125mhz), + .m_axis_stat(axis_eth_stat[n]), + + /* + * Status + */ + .tx_start_packet(), + .stat_tx_byte(), + .stat_tx_pkt_len(), + .stat_tx_pkt_ucast(), + .stat_tx_pkt_mcast(), + .stat_tx_pkt_bcast(), + .stat_tx_pkt_vlan(), + .stat_tx_pkt_good(), + .stat_tx_pkt_bad(), + .stat_tx_err_oversize(), + .stat_tx_err_user(), + .stat_tx_err_underflow(), + .rx_start_packet(), + .rx_error_count(), + .rx_block_lock(), + .rx_high_ber(), + .rx_status(eth_gty_rx_status[n*CNT +: CNT]), + .stat_rx_byte(), + .stat_rx_pkt_len(), + .stat_rx_pkt_fragment(), + .stat_rx_pkt_jabber(), + .stat_rx_pkt_ucast(), + .stat_rx_pkt_mcast(), + .stat_rx_pkt_bcast(), + .stat_rx_pkt_vlan(), + .stat_rx_pkt_good(), + .stat_rx_pkt_bad(), + .stat_rx_err_oversize(), + .stat_rx_err_bad_fcs(), + .stat_rx_err_bad_block(), + .stat_rx_err_framing(), + .stat_rx_err_preamble(), + .stat_rx_fifo_drop('0), + .stat_tx_mcf(), + .stat_rx_mcf(), + .stat_tx_lfc_pkt(), + .stat_tx_lfc_xon(), + .stat_tx_lfc_xoff(), + .stat_tx_lfc_paused(), + .stat_tx_pfc_pkt(), + .stat_tx_pfc_xon(), + .stat_tx_pfc_xoff(), + .stat_tx_pfc_paused(), + .stat_rx_lfc_pkt(), + .stat_rx_lfc_xon(), + .stat_rx_lfc_xoff(), + .stat_rx_lfc_paused(), + .stat_rx_pfc_pkt(), + .stat_rx_pfc_xon(), + .stat_rx_pfc_xoff(), + .stat_rx_pfc_paused(), + + /* + * Configuration + */ + .cfg_tx_max_pkt_len('{CNT{16'd9218}}), + .cfg_tx_ifg('{CNT{8'd12}}), + .cfg_tx_enable('1), + .cfg_rx_max_pkt_len('{CNT{16'd9218}}), + .cfg_rx_enable('1), + .cfg_tx_prbs31_enable('0), + .cfg_rx_prbs31_enable('0), + .cfg_mcf_rx_eth_dst_mcast('{CNT{48'h01_80_C2_00_00_01}}), + .cfg_mcf_rx_check_eth_dst_mcast('1), + .cfg_mcf_rx_eth_dst_ucast('{CNT{48'd0}}), + .cfg_mcf_rx_check_eth_dst_ucast('0), + .cfg_mcf_rx_eth_src('{CNT{48'd0}}), + .cfg_mcf_rx_check_eth_src('0), + .cfg_mcf_rx_eth_type('{CNT{16'h8808}}), + .cfg_mcf_rx_opcode_lfc('{CNT{16'h0001}}), + .cfg_mcf_rx_check_opcode_lfc('1), + .cfg_mcf_rx_opcode_pfc('{CNT{16'h0101}}), + .cfg_mcf_rx_check_opcode_pfc('1), + .cfg_mcf_rx_forward('0), + .cfg_mcf_rx_enable('0), + .cfg_tx_lfc_eth_dst('{CNT{48'h01_80_C2_00_00_01}}), + .cfg_tx_lfc_eth_src('{CNT{48'h80_23_31_43_54_4C}}), + .cfg_tx_lfc_eth_type('{CNT{16'h8808}}), + .cfg_tx_lfc_opcode('{CNT{16'h0001}}), + .cfg_tx_lfc_en('0), + .cfg_tx_lfc_quanta('{CNT{16'hffff}}), + .cfg_tx_lfc_refresh('{CNT{16'h7fff}}), + .cfg_tx_pfc_eth_dst('{CNT{48'h01_80_C2_00_00_01}}), + .cfg_tx_pfc_eth_src('{CNT{48'h80_23_31_43_54_4C}}), + .cfg_tx_pfc_eth_type('{CNT{16'h8808}}), + .cfg_tx_pfc_opcode('{CNT{16'h0101}}), + .cfg_tx_pfc_en('0), + .cfg_tx_pfc_quanta('{CNT{'{8{16'hffff}}}}), + .cfg_tx_pfc_refresh('{CNT{'{8{16'h7fff}}}}), + .cfg_rx_lfc_opcode('{CNT{16'h0001}}), + .cfg_rx_lfc_en('0), + .cfg_rx_pfc_opcode('{CNT{16'h0101}}), + .cfg_rx_pfc_en('0) + ); + +end + +for (genvar n = 0; n < GTY_CNT; n = n + 1) begin : gty_ch + + taxi_axis_async_fifo #( + .DEPTH(16384), + .RAM_PIPELINE(2), + .FRAME_FIFO(1), + .USER_BAD_FRAME_VALUE(1'b1), + .USER_BAD_FRAME_MASK(1'b1), + .DROP_OVERSIZE_FRAME(1), + .DROP_BAD_FRAME(1), + .DROP_WHEN_FULL(1) + ) + ch_fifo ( + /* + * AXI4-Stream input (sink) + */ + .s_clk(eth_gty_rx_clk[n]), + .s_rst(eth_gty_rx_rst[n]), + .s_axis(eth_gty_axis_rx[n]), + + /* + * AXI4-Stream output (source) + */ + .m_clk(eth_gty_tx_clk[n]), + .m_rst(eth_gty_tx_rst[n]), + .m_axis(eth_gty_axis_tx[n]), + + /* + * Pause + */ + .s_pause_req(1'b0), + .s_pause_ack(), + .m_pause_req(1'b0), + .m_pause_ack(), + + /* + * Status + */ + .s_status_depth(), + .s_status_depth_commit(), + .s_status_overflow(), + .s_status_bad_frame(), + .s_status_good_frame(), + .m_status_depth(), + .m_status_depth_commit(), + .m_status_overflow(), + .m_status_bad_frame(), + .m_status_good_frame() + ); + +end + +for (genvar n = 0; n < ADC_CNT; n = n + 1) begin : rfdc_lpbk + + assign m_axis_dac[n].tdata = s_axis_adc[n].tdata; + assign m_axis_dac[n].tvalid = s_axis_adc[n].tvalid; + assign s_axis_adc[n].tready = m_axis_dac[n].tready; + +end + +endmodule + +`resetall diff --git a/src/eth/example/HTG_ZRF8/fpga/rtl/fpga_em.sv b/src/eth/example/HTG_ZRF8/fpga/rtl/fpga_em.sv new file mode 100644 index 0000000..da1e13a --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/rtl/fpga_em.sv @@ -0,0 +1,897 @@ +// SPDX-License-Identifier: MIT +/* + +Copyright (c) 2021-2025 FPGA Ninja, LLC + +Authors: +- Alex Forencich + +*/ + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * FPGA top-level module for HTG-ZRF8-EM + */ +module fpga # +( + parameter logic SIM = 1'b0, + parameter string VENDOR = "XILINX", + parameter string FAMILY = "zynquplusRFSOC" +) +( + /* + * Clock: 200 MHz LVDS + */ + input wire logic clk_pl_user_p, + input wire logic clk_pl_user_n, + input wire logic fpga_refclk_p, + input wire logic fpga_refclk_n, + input wire logic fpga_sysref_p, + input wire logic fpga_sysref_n, + + /* + * GPIO + */ + input wire logic btn, + input wire logic [3:0] sw, + output wire logic [3:0] led, + output wire logic [7:0] gpio, + + /* + * I2C for board management + */ + inout wire logic i2c_scl, + inout wire logic i2c_sda, + output wire logic i2c_rst_n, + + /* + * UART: 921600 bps, 8N1 + */ + output wire logic uart_rxd, + input wire logic uart_txd, + input wire logic uart_rts, + output wire logic uart_cts, + output wire logic uart_rst_n, + input wire logic uart_suspend_n, + + /* + * FMC+ + */ + // output wire logic [9:0] fmc_la_p, + // output wire logic [9:0] fmc_la_n, + + output wire logic [7:0] fmc_dp_c2m_p, + output wire logic [7:0] fmc_dp_c2m_n, + input wire logic [7:0] fmc_dp_m2c_p, + input wire logic [7:0] fmc_dp_m2c_n, + input wire logic fmc_mgt_refclk_0_0_p, + input wire logic fmc_mgt_refclk_0_0_n, + input wire logic fmc_mgt_refclk_1_0_p, + input wire logic fmc_mgt_refclk_1_0_n, + + /* + * RFDC + */ + input wire logic [7:0] adc_vin_p, + input wire logic [7:0] adc_vin_n, + + input wire logic adc_refclk_0_p, + input wire logic adc_refclk_0_n, + input wire logic adc_refclk_1_p, + input wire logic adc_refclk_1_n, + input wire logic adc_refclk_2_p, + input wire logic adc_refclk_2_n, + input wire logic adc_refclk_3_p, + input wire logic adc_refclk_3_n, + + output wire logic [7:0] dac_vout_p, + output wire logic [7:0] dac_vout_n, + + // input wire logic dac_refclk_0_p, + // input wire logic dac_refclk_0_n, + input wire logic dac_refclk_1_p, + input wire logic dac_refclk_1_n, + + input wire logic rfdc_sysref_p, + input wire logic rfdc_sysref_n +); + +// PLL +wire pll_i2c_busy; + +// Clock and reset + +wire clk_pl_user_ibufg; +wire clk_pl_user_bufg; + +// Internal 125 MHz clock +wire clk_125mhz_mmcm_out; +wire clk_125mhz_int; +wire rst_125mhz_int; + +wire mmcm_rst = pll_i2c_busy; +wire mmcm_locked; +wire mmcm_clkfb; + +IBUFGDS #( + .DIFF_TERM("FALSE"), + .IBUF_LOW_PWR("FALSE") +) +clk_pl_user_ibufg_inst ( + .I (clk_pl_user_p), + .IB(clk_pl_user_n), + .O (clk_pl_user_ibufg) +); + +BUFG +clk_pl_user_bufg_inst ( + .I(clk_pl_user_ibufg), + .O(clk_pl_user_bufg) +); + +// MMCM instance +MMCME4_BASE #( + // 200 MHz input + .CLKIN1_PERIOD(5.0), + .REF_JITTER1(0.010), + // 200 MHz input / 1 = 200 MHz PFD (range 10 MHz to 500 MHz) + .DIVCLK_DIVIDE(1), + // 200 MHz PFD * 5 = 1000 MHz VCO (range 800 MHz to 1600 MHz) + .CLKFBOUT_MULT_F(5), + .CLKFBOUT_PHASE(0), + // 1000 MHz / 8 = 125 MHz, 0 degrees + .CLKOUT0_DIVIDE_F(8), + .CLKOUT0_DUTY_CYCLE(0.5), + .CLKOUT0_PHASE(0), + // Not used + .CLKOUT1_DIVIDE(1), + .CLKOUT1_DUTY_CYCLE(0.5), + .CLKOUT1_PHASE(0), + // Not used + .CLKOUT2_DIVIDE(1), + .CLKOUT2_DUTY_CYCLE(0.5), + .CLKOUT2_PHASE(0), + // Not used + .CLKOUT3_DIVIDE(1), + .CLKOUT3_DUTY_CYCLE(0.5), + .CLKOUT3_PHASE(0), + // Not used + .CLKOUT4_DIVIDE(1), + .CLKOUT4_DUTY_CYCLE(0.5), + .CLKOUT4_PHASE(0), + .CLKOUT4_CASCADE("FALSE"), + // Not used + .CLKOUT5_DIVIDE(1), + .CLKOUT5_DUTY_CYCLE(0.5), + .CLKOUT5_PHASE(0), + // Not used + .CLKOUT6_DIVIDE(1), + .CLKOUT6_DUTY_CYCLE(0.5), + .CLKOUT6_PHASE(0), + + // optimized bandwidth + .BANDWIDTH("OPTIMIZED"), + // don't wait for lock during startup + .STARTUP_WAIT("FALSE") +) +clk_mmcm_inst ( + // 200 MHz input + .CLKIN1(clk_pl_user_bufg), + // direct clkfb feeback + .CLKFBIN(mmcm_clkfb), + .CLKFBOUT(mmcm_clkfb), + .CLKFBOUTB(), + // 125 MHz, 0 degrees + .CLKOUT0(clk_125mhz_mmcm_out), + .CLKOUT0B(), + // Not used + .CLKOUT1(), + .CLKOUT1B(), + // Not used + .CLKOUT2(), + .CLKOUT2B(), + // Not used + .CLKOUT3(), + .CLKOUT3B(), + // Not used + .CLKOUT4(), + // Not used + .CLKOUT5(), + // Not used + .CLKOUT6(), + // reset input + .RST(mmcm_rst), + // don't power down + .PWRDWN(1'b0), + // locked output + .LOCKED(mmcm_locked) +); + +BUFG +clk_125mhz_bufg_inst ( + .I(clk_125mhz_mmcm_out), + .O(clk_125mhz_int) +); + +taxi_sync_reset #( + .N(4) +) +sync_reset_125mhz_inst ( + .clk(clk_125mhz_int), + .rst(~mmcm_locked), + .out(rst_125mhz_int) +); + +wire fpga_refclk_ibufg; +wire fpga_refclk_int; +wire fpga_sysref_ibufg; +wire fpga_sysref_int; + +IBUFGDS #( + .DIFF_TERM("FALSE"), + .IBUF_LOW_PWR("FALSE") +) +fpga_refclk_ibufg_inst ( + .O (fpga_refclk_ibufg), + .I (fpga_refclk_p), + .IB (fpga_refclk_n) +); + +BUFG +fpga_refclk_bufg_inst ( + .I(fpga_refclk_ibufg), + .O(fpga_refclk_int) +); + +IBUFGDS #( + .DIFF_TERM("FALSE"), + .IBUF_LOW_PWR("FALSE") +) +fpga_sysref_ibufg_inst ( + .O (fpga_sysref_ibufg), + .I (fpga_sysref_p), + .IB (fpga_sysref_n) +); + +BUFG +fpga_sysref_bufg_inst ( + .I(fpga_sysref_ibufg), + .O(fpga_sysref_int) +); + +// STARTUP instance for cfgmclk +wire cfgmclk; + +STARTUPE3 +startupe3_inst ( + .CFGCLK(), + .CFGMCLK(cfgmclk), + .DI(), + .DO(4'd0), + .DTS(1'b1), + .EOS(), + .FCSBO(1'b1), + .FCSBTS(1'b1), + .GSR(1'b0), + .GTS(1'b0), + .KEYCLEARB(1'b1), + .PACK(1'b0), + .PREQ(), + .USRCCLKO(1'b0), + .USRCCLKTS(1'b1), + .USRDONEO(1'b0), + .USRDONETS(1'b1) +); + +wire cfgmclk_int; + +BUFG +cfgmclk_bufg_inst ( + .I(cfgmclk), + .O(cfgmclk_int) +); + +wire cfgmclk_rst_int; + +taxi_sync_reset #( + .N(4) +) +sync_reset_cfgmclk_inst ( + .clk(cfgmclk_int), + .rst(~btn), + .out(cfgmclk_rst_int) +); + +// GPIO +wire [3:0] sw_int; + +taxi_debounce_switch #( + .WIDTH(4), + .N(4), + .RATE(125000) +) +debounce_switch_inst ( + .clk(clk_125mhz_int), + .rst(rst_125mhz_int), + .in({sw}), + .out({sw_int}) +); + +wire uart_txd_int; +wire uart_rts_int; + +taxi_sync_signal #( + .WIDTH(2), + .N(2) +) +sync_signal_inst ( + .clk(clk_125mhz_int), + .in({uart_txd, uart_rts}), + .out({uart_txd_int, uart_rts_int}) +); + +wire i2c_scl_i; +wire i2c_scl_o; +wire i2c_sda_i; +wire i2c_sda_o; + +assign i2c_scl_i = i2c_scl; +assign i2c_scl = i2c_scl_o ? 1'bz : 1'b0; +assign i2c_sda_i = i2c_sda; +assign i2c_sda = i2c_sda_o ? 1'bz : 1'b0; +assign i2c_rst_n = 1'b1; + +wire i2c_init_scl_i = i2c_scl_i; +wire i2c_init_scl_o; +wire i2c_init_sda_i = i2c_sda_i; +wire i2c_init_sda_o; + +wire i2c_int_scl_i = i2c_scl_i; +wire i2c_int_scl_o; +wire i2c_int_sda_i = i2c_sda_i; +wire i2c_int_sda_o; + +assign i2c_scl_o = i2c_init_scl_o & i2c_int_scl_o; +assign i2c_sda_o = i2c_init_sda_o & i2c_int_sda_o; + +// PLL init +taxi_axis_if #(.DATA_W(12)) pll_i2c_cmd(); +taxi_axis_if #(.DATA_W(8)) pll_i2c_tx(); +taxi_axis_if #(.DATA_W(8)) pll_i2c_rx(); + +assign pll_i2c_rx.tready = 1'b1; + +taxi_i2c_master +pll_i2c_master_inst ( + .clk(cfgmclk_int), + .rst(cfgmclk_rst_int), + + /* + * Host interface + */ + .s_axis_cmd(pll_i2c_cmd), + .s_axis_tx(pll_i2c_tx), + .m_axis_rx(pll_i2c_rx), + + /* + * I2C interface + */ + .scl_i(i2c_init_scl_i), + .scl_o(i2c_init_scl_o), + .sda_i(i2c_init_sda_i), + .sda_o(i2c_init_sda_o), + + /* + * Status + */ + .busy(), + .bus_control(), + .bus_active(), + .missed_ack(), + + /* + * Configuration + */ + .prescale(SIM ? 15 : 150), + .stop_on_idle(1) +); + +pll_i2c_init_em #( + .SIM_SPEEDUP(SIM) +) +pll_i2c_init_inst ( + .clk(cfgmclk_int), + .rst(cfgmclk_rst_int), + + /* + * I2C master interface + */ + .m_axis_cmd(pll_i2c_cmd), + .m_axis_tx(pll_i2c_tx), + + /* + * Status + */ + .busy(pll_i2c_busy), + + /* + * Configuration + */ + .start(1'b1) +); + +localparam PORT_CNT = 2; +localparam GTY_QUAD_CNT = PORT_CNT; +localparam GTY_CNT = GTY_QUAD_CNT*4; +localparam GTY_CLK_CNT = GTY_QUAD_CNT; + +// RF data converters +localparam ADC_CNT = 8; +localparam ADC_SAMPLE_W = 16; +localparam ADC_SAMPLE_CNT = 4; +localparam ADC_DATA_W = ADC_SAMPLE_W*ADC_SAMPLE_CNT; + +localparam DAC_CNT = ADC_CNT; +localparam DAC_SAMPLE_W = ADC_SAMPLE_W; +localparam DAC_SAMPLE_CNT = ADC_SAMPLE_CNT; +localparam DAC_DATA_W = DAC_SAMPLE_W*DAC_SAMPLE_CNT; + +wire axil_rfdc_clk = clk_125mhz_int; +wire axil_rfdc_rst = rst_125mhz_int; + +taxi_axil_if #( + .DATA_W(32), + .ADDR_W(18) +) axil_rfdc(); + +wire axis_rfdc_clk; +wire axis_rfdc_rst; + +wire [3:0] adc_clk_out; +wire [3:0] dac_clk_out; + +taxi_axis_if #( + .DATA_W(ADC_DATA_W), + .KEEP_EN(1), + .KEEP_W(ADC_SAMPLE_CNT), + .LAST_EN(0), + .USER_EN(0), + .ID_EN(0), + .DEST_EN(0) +) axis_adc[ADC_CNT](); + +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_0 = axis_adc[0].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_1 = axis_adc[1].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_2 = axis_adc[2].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_3 = axis_adc[3].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_4 = axis_adc[4].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_5 = axis_adc[5].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_6 = axis_adc[6].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_7 = axis_adc[7].tdata; + +taxi_axis_if #( + .DATA_W(DAC_DATA_W), + .KEEP_EN(1), + .KEEP_W(DAC_SAMPLE_CNT), + .LAST_EN(0), + .USER_EN(0), + .ID_EN(0), + .DEST_EN(0) +) axis_dac[DAC_CNT](); + +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_0 = axis_dac[0].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_1 = axis_dac[1].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_2 = axis_dac[2].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_3 = axis_dac[3].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_4 = axis_dac[4].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_5 = axis_dac[5].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_6 = axis_dac[6].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_7 = axis_dac[7].tdata; + +wire rfdc_mmcm_in = dac_clk_out[0]; +wire rfdc_mmcm_rst = rst_125mhz_int; +wire rfdc_mmcm_clkfb; +wire rfdc_mmcm_locked; +wire rfdc_mmcm_out; + +// MMCM instance +MMCME4_BASE #( + // 62.5 MHz input + .CLKIN1_PERIOD(16.0), + .REF_JITTER1(0.010), + // 62.5 MHz input / 1 = 62.5 MHz PFD (range 10 MHz to 500 MHz) + .DIVCLK_DIVIDE(1), + // 62.5 MHz PFD * 20 = 1250 MHz VCO (range 800 MHz to 1600 MHz) + .CLKFBOUT_MULT_F(20), + .CLKFBOUT_PHASE(0), + // 1250 MHz / 5 = 250 MHz, 0 degrees + .CLKOUT0_DIVIDE_F(5), + .CLKOUT0_DUTY_CYCLE(0.5), + .CLKOUT0_PHASE(0), + // Not used + .CLKOUT1_DIVIDE(1), + .CLKOUT1_DUTY_CYCLE(0.5), + .CLKOUT1_PHASE(0), + // Not used + .CLKOUT2_DIVIDE(1), + .CLKOUT2_DUTY_CYCLE(0.5), + .CLKOUT2_PHASE(0), + // Not used + .CLKOUT3_DIVIDE(1), + .CLKOUT3_DUTY_CYCLE(0.5), + .CLKOUT3_PHASE(0), + // Not used + .CLKOUT4_DIVIDE(1), + .CLKOUT4_DUTY_CYCLE(0.5), + .CLKOUT4_PHASE(0), + .CLKOUT4_CASCADE("FALSE"), + // Not used + .CLKOUT5_DIVIDE(1), + .CLKOUT5_DUTY_CYCLE(0.5), + .CLKOUT5_PHASE(0), + // Not used + .CLKOUT6_DIVIDE(1), + .CLKOUT6_DUTY_CYCLE(0.5), + .CLKOUT6_PHASE(0), + + // optimized bandwidth + .BANDWIDTH("OPTIMIZED"), + // don't wait for lock during startup + .STARTUP_WAIT("FALSE") +) +rfdc_mmcm_inst ( + // 62.5 MHz input + .CLKIN1(rfdc_mmcm_in), + // direct clkfb feeback + .CLKFBIN(rfdc_mmcm_clkfb), + .CLKFBOUT(rfdc_mmcm_clkfb), + .CLKFBOUTB(), + // 250 MHz, 0 degrees + .CLKOUT0(rfdc_mmcm_out), + .CLKOUT0B(), + // Not used + .CLKOUT1(), + .CLKOUT1B(), + // Not used + .CLKOUT2(), + .CLKOUT2B(), + // Not used + .CLKOUT3(), + .CLKOUT3B(), + // Not used + .CLKOUT4(), + // Not used + .CLKOUT5(), + // Not used + .CLKOUT6(), + // reset input + .RST(rfdc_mmcm_rst), + // don't power down + .PWRDWN(1'b0), + // locked output + .LOCKED(rfdc_mmcm_locked) +); + +BUFG +axis_rfdc_bufg_inst ( + .I(rfdc_mmcm_out), + .O(axis_rfdc_clk) +); + +taxi_sync_reset #( + .N(4) +) +axis_rfdc_sync_reset_inst ( + .clk(axis_rfdc_clk), + .rst(!rfdc_mmcm_locked || rfdc_mmcm_rst), + .out(axis_rfdc_rst) +); + +usp_rfdc_0 rfdc_inst ( + // Common + .sysref_in_p(rfdc_sysref_p), + .sysref_in_n(rfdc_sysref_n), + + .s_axi_aclk(axil_rfdc_clk), + .s_axi_aresetn(!axil_rfdc_rst), + .s_axi_awaddr(axil_rfdc.awaddr), + .s_axi_awvalid(axil_rfdc.awvalid), + .s_axi_awready(axil_rfdc.awready), + .s_axi_wdata(axil_rfdc.wdata), + .s_axi_wstrb(axil_rfdc.wstrb), + .s_axi_wvalid(axil_rfdc.wvalid), + .s_axi_wready(axil_rfdc.wready), + .s_axi_bresp(axil_rfdc.bresp), + .s_axi_bvalid(axil_rfdc.bvalid), + .s_axi_bready(axil_rfdc.bready), + .s_axi_araddr(axil_rfdc.araddr), + .s_axi_arvalid(axil_rfdc.arvalid), + .s_axi_arready(axil_rfdc.arready), + .s_axi_rdata(axil_rfdc.rdata), + .s_axi_rresp(axil_rfdc.rresp), + .s_axi_rvalid(axil_rfdc.rvalid), + .s_axi_rready(axil_rfdc.rready), + + .irq(), + + // ADC + .adc0_clk_p(adc_refclk_0_p), + .adc0_clk_n(adc_refclk_0_n), + .clk_adc0(adc_clk_out[0]), + + .adc1_clk_p(adc_refclk_1_p), + .adc1_clk_n(adc_refclk_1_n), + .clk_adc1(adc_clk_out[1]), + + .adc2_clk_p(adc_refclk_2_p), + .adc2_clk_n(adc_refclk_2_n), + .clk_adc2(adc_clk_out[2]), + + .adc3_clk_p(adc_refclk_3_p), + .adc3_clk_n(adc_refclk_3_n), + .clk_adc3(adc_clk_out[3]), + + .vin0_01_p(adc_vin_p[7]), + .vin0_01_n(adc_vin_n[7]), + .vin0_23_p(adc_vin_p[6]), + .vin0_23_n(adc_vin_n[6]), + + .vin1_01_p(adc_vin_p[5]), + .vin1_01_n(adc_vin_n[5]), + .vin1_23_p(adc_vin_p[4]), + .vin1_23_n(adc_vin_n[4]), + + .vin2_01_p(adc_vin_p[3]), + .vin2_01_n(adc_vin_n[3]), + .vin2_23_p(adc_vin_p[2]), + .vin2_23_n(adc_vin_n[2]), + + .vin3_01_p(adc_vin_p[1]), + .vin3_01_n(adc_vin_n[1]), + .vin3_23_p(adc_vin_p[0]), + .vin3_23_n(adc_vin_n[0]), + + .m0_axis_aresetn(!axis_rfdc_rst), + .m0_axis_aclk(axis_rfdc_clk), + .m00_axis_tdata(axis_adc[7].tdata), + .m00_axis_tvalid(axis_adc[7].tvalid), + .m00_axis_tready(axis_adc[7].tready), + .m02_axis_tdata(axis_adc[6].tdata), + .m02_axis_tvalid(axis_adc[6].tvalid), + .m02_axis_tready(axis_adc[6].tready), + + .m1_axis_aresetn(!axis_rfdc_rst), + .m1_axis_aclk(axis_rfdc_clk), + .m10_axis_tdata(axis_adc[5].tdata), + .m10_axis_tvalid(axis_adc[5].tvalid), + .m10_axis_tready(axis_adc[5].tready), + .m12_axis_tdata(axis_adc[4].tdata), + .m12_axis_tvalid(axis_adc[4].tvalid), + .m12_axis_tready(axis_adc[4].tready), + + .m2_axis_aresetn(!axis_rfdc_rst), + .m2_axis_aclk(axis_rfdc_clk), + .m20_axis_tdata(axis_adc[3].tdata), + .m20_axis_tvalid(axis_adc[3].tvalid), + .m20_axis_tready(axis_adc[3].tready), + .m22_axis_tdata(axis_adc[2].tdata), + .m22_axis_tvalid(axis_adc[2].tvalid), + .m22_axis_tready(axis_adc[2].tready), + + .m3_axis_aresetn(!axis_rfdc_rst), + .m3_axis_aclk(axis_rfdc_clk), + .m30_axis_tdata(axis_adc[1].tdata), + .m30_axis_tvalid(axis_adc[1].tvalid), + .m30_axis_tready(axis_adc[1].tready), + .m32_axis_tdata(axis_adc[0].tdata), + .m32_axis_tvalid(axis_adc[0].tvalid), + .m32_axis_tready(axis_adc[0].tready), + + .adc0_01_dsa_code(5'd27), + .adc0_23_dsa_code(5'd27), + .adc0_dsa_update(1'b0), + .adc1_01_dsa_code(5'd27), + .adc1_23_dsa_code(5'd27), + .adc1_dsa_update(1'b0), + .adc2_01_dsa_code(5'd27), + .adc2_23_dsa_code(5'd27), + .adc2_dsa_update(1'b0), + .adc3_01_dsa_code(5'd27), + .adc3_23_dsa_code(5'd27), + .adc3_dsa_update(1'b0), + + // DAC + .dac2_clk_p(dac_refclk_1_p), + .dac2_clk_n(dac_refclk_1_n), + + .clk_dac0(dac_clk_out[0]), + .clk_dac1(dac_clk_out[1]), + .clk_dac2(dac_clk_out[2]), + .clk_dac3(dac_clk_out[3]), + + .vout00_p(dac_vout_p[7]), + .vout00_n(dac_vout_n[7]), + .vout02_p(dac_vout_p[6]), + .vout02_n(dac_vout_n[6]), + + .vout10_p(dac_vout_p[5]), + .vout10_n(dac_vout_n[5]), + .vout12_p(dac_vout_p[4]), + .vout12_n(dac_vout_n[4]), + + .vout20_p(dac_vout_p[3]), + .vout20_n(dac_vout_n[3]), + .vout22_p(dac_vout_p[2]), + .vout22_n(dac_vout_n[2]), + + .vout30_p(dac_vout_p[1]), + .vout30_n(dac_vout_n[1]), + .vout32_p(dac_vout_p[0]), + .vout32_n(dac_vout_n[0]), + + .s0_axis_aresetn(!axis_rfdc_rst), + .s0_axis_aclk(axis_rfdc_clk), + .s00_axis_tdata(axis_dac[7].tdata), + .s00_axis_tvalid(axis_dac[7].tvalid), + .s00_axis_tready(axis_dac[7].tready), + .s02_axis_tdata(axis_dac[6].tdata), + .s02_axis_tvalid(axis_dac[6].tvalid), + .s02_axis_tready(axis_dac[6].tready), + + .s1_axis_aresetn(!axis_rfdc_rst), + .s1_axis_aclk(axis_rfdc_clk), + .s10_axis_tdata(axis_dac[5].tdata), + .s10_axis_tvalid(axis_dac[5].tvalid), + .s10_axis_tready(axis_dac[5].tready), + .s12_axis_tdata(axis_dac[4].tdata), + .s12_axis_tvalid(axis_dac[4].tvalid), + .s12_axis_tready(axis_dac[4].tready), + + .s2_axis_aresetn(!axis_rfdc_rst), + .s2_axis_aclk(axis_rfdc_clk), + .s20_axis_tdata(axis_dac[3].tdata), + .s20_axis_tvalid(axis_dac[3].tvalid), + .s20_axis_tready(axis_dac[3].tready), + .s22_axis_tdata(axis_dac[2].tdata), + .s22_axis_tvalid(axis_dac[2].tvalid), + .s22_axis_tready(axis_dac[2].tready), + + .s3_axis_aresetn(!axis_rfdc_rst), + .s3_axis_aclk(axis_rfdc_clk), + .s30_axis_tdata(axis_dac[1].tdata), + .s30_axis_tvalid(axis_dac[1].tvalid), + .s30_axis_tready(axis_dac[1].tready), + .s32_axis_tdata(axis_dac[0].tdata), + .s32_axis_tvalid(axis_dac[0].tvalid), + .s32_axis_tready(axis_dac[0].tready), + + .dac00_vop_code(10'd895), + .dac02_vop_code(10'd895), + .dac00_update_vop(1'b0), + .dac02_update_vop(1'b0), + .dac00_vop_done(), + .dac02_vop_done(), + .dac0_vop_busy(), + + .dac10_vop_code(10'd895), + .dac12_vop_code(10'd895), + .dac10_update_vop(1'b0), + .dac12_update_vop(1'b0), + .dac10_vop_done(), + .dac12_vop_done(), + .dac1_vop_busy(), + + .dac20_vop_code(10'd895), + .dac22_vop_code(10'd895), + .dac20_update_vop(1'b0), + .dac22_update_vop(1'b0), + .dac20_vop_done(), + .dac22_vop_done(), + .dac2_vop_busy(), + + .dac30_vop_code(10'd895), + .dac32_vop_code(10'd895), + .dac30_update_vop(1'b0), + .dac32_update_vop(1'b0), + .dac30_vop_done(), + .dac32_vop_done(), + .dac3_vop_busy() +); + +fpga_core #( + .SIM(SIM), + .VENDOR(VENDOR), + .FAMILY(FAMILY), + .PORT_CNT(PORT_CNT), + .GTY_QUAD_CNT(GTY_QUAD_CNT), + .GTY_CNT(GTY_CNT), + .GTY_CLK_CNT(GTY_CLK_CNT), + .ADC_CNT(ADC_CNT), + .DAC_CNT(DAC_CNT) +) +core_inst ( + /* + * Clock: 125MHz + * Synchronous reset + */ + .clk_125mhz(clk_125mhz_int), + .rst_125mhz(rst_125mhz_int), + .fpga_refclk(fpga_refclk_int), + .fpga_sysref(fpga_sysref_int), + + /* + * GPIO + */ + .sw(sw_int), + .led(led), + .gpio(gpio), + + /* + * I2C for board management + */ + .i2c_scl_i(i2c_int_scl_i), + .i2c_scl_o(i2c_int_scl_o), + .i2c_sda_i(i2c_int_sda_i), + .i2c_sda_o(i2c_int_sda_o), + + /* + * UART: 921600 bps, 8N1 + */ + .uart_rxd(uart_rxd), + .uart_txd(uart_txd_int), + .uart_rts(uart_rts_int), + .uart_cts(uart_cts), + .uart_rst_n(uart_rst_n), + .uart_suspend_n(uart_suspend_n), + + /* + * Ethernet: QSFP28 + */ + .eth_gty_tx_p(fmc_dp_c2m_p), + .eth_gty_tx_n(fmc_dp_c2m_n), + .eth_gty_rx_p(fmc_dp_m2c_p), + .eth_gty_rx_n(fmc_dp_m2c_n), + .eth_gty_mgt_refclk_p({fmc_mgt_refclk_1_0_p, fmc_mgt_refclk_0_0_p}), + .eth_gty_mgt_refclk_n({fmc_mgt_refclk_1_0_n, fmc_mgt_refclk_0_0_n}), + .eth_gty_mgt_refclk_out(), + + .eth_port_resetl(), + .eth_port_modprsl('0), + .eth_port_intl('1), + + /* + * RFDC + */ + .axil_rfdc_clk(axil_rfdc_clk), + .axil_rfdc_rst(axil_rfdc_rst), + .m_axil_rfdc_wr(axil_rfdc), + .m_axil_rfdc_rd(axil_rfdc), + + .axis_rfdc_clk(axis_rfdc_clk), + .axis_rfdc_rst(axis_rfdc_rst), + .s_axis_adc(axis_adc), + .m_axis_dac(axis_dac) +); + +endmodule + +`resetall diff --git a/src/eth/example/HTG_ZRF8/fpga/rtl/fpga_r2.sv b/src/eth/example/HTG_ZRF8/fpga/rtl/fpga_r2.sv new file mode 100644 index 0000000..9b0b09e --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/rtl/fpga_r2.sv @@ -0,0 +1,923 @@ +// SPDX-License-Identifier: MIT +/* + +Copyright (c) 2021-2025 FPGA Ninja, LLC + +Authors: +- Alex Forencich + +*/ + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * FPGA top-level module for HTG-ZRF8-R2 + */ +module fpga # +( + parameter logic SIM = 1'b0, + parameter string VENDOR = "XILINX", + parameter string FAMILY = "zynquplusRFSOC" +) +( + /* + * Clock: 200 MHz LVDS + */ + input wire logic clk_pl_user1_p, + input wire logic clk_pl_user1_n, + input wire logic fpga_refclk_p, + input wire logic fpga_refclk_n, + input wire logic fpga_sysref_p, + input wire logic fpga_sysref_n, + + /* + * GPIO + */ + input wire logic btn, + input wire logic [3:0] sw, + output wire logic [3:0] led, + + /* + * I2C for board management + */ + inout wire logic i2c_scl, + inout wire logic i2c_sda, + output wire logic i2c_rst_n, + + /* + * PLL + */ + output wire logic clk_fdec, + output wire logic clk_finc, + input wire logic clk_intr_n, + input wire logic clk_lol_n, + output wire logic clk_sync_n, + output wire logic clk_rst_n, + output wire logic lmk_rst, + output wire logic [1:0] lmk_clkin_s, + + /* + * UART: 921600 bps, 8N1 + */ + output wire logic uart_rxd, + input wire logic uart_txd, + input wire logic uart_rts, + output wire logic uart_cts, + output wire logic uart_rst_n, + input wire logic uart_suspend_n, + + /* + * FMC+ + */ + // output wire logic [33:0] fmc_la_p, + // output wire logic [33:0] fmc_la_n, + output wire logic fmc_qsfp_modsell, + output wire logic fmc_qsfp_resetl, + output wire logic fmc_qsfp_lpmode, + + output wire logic [7:0] fmc_dp_c2m_p, + output wire logic [7:0] fmc_dp_c2m_n, + input wire logic [7:0] fmc_dp_m2c_p, + input wire logic [7:0] fmc_dp_m2c_n, + input wire logic fmc_mgt_refclk_0_0_p, + input wire logic fmc_mgt_refclk_0_0_n, + input wire logic fmc_mgt_refclk_1_0_p, + input wire logic fmc_mgt_refclk_1_0_n, + + /* + * RFDC + */ + input wire logic [7:0] adc_vin_p, + input wire logic [7:0] adc_vin_n, + + input wire logic adc_refclk_0_p, + input wire logic adc_refclk_0_n, + input wire logic adc_refclk_1_p, + input wire logic adc_refclk_1_n, + input wire logic adc_refclk_2_p, + input wire logic adc_refclk_2_n, + input wire logic adc_refclk_3_p, + input wire logic adc_refclk_3_n, + + output wire logic [7:0] dac_vout_p, + output wire logic [7:0] dac_vout_n, + + // input wire logic dac_refclk_0_p, + // input wire logic dac_refclk_0_n, + input wire logic dac_refclk_1_p, + input wire logic dac_refclk_1_n, + + input wire logic rfdc_sysref_p, + input wire logic rfdc_sysref_n +); + +// PLL +assign clk_fdec = 1'b0; +assign clk_finc = 1'b0; +assign clk_sync_n = 1'b1; +assign clk_rst_n = 1'b1; + +assign lmk_rst = 1'b0; +assign lmk_clkin_s = 2'b00; + +wire pll_i2c_busy; + +// Clock and reset + +wire clk_pl_user1_ibufg; +wire clk_pl_user1_bufg; + +// Internal 125 MHz clock +wire clk_125mhz_mmcm_out; +wire clk_125mhz_int; +wire rst_125mhz_int; + +wire mmcm_rst = pll_i2c_busy || !clk_lol_n; +wire mmcm_locked; +wire mmcm_clkfb; + +IBUFGDS #( + .DIFF_TERM("FALSE"), + .IBUF_LOW_PWR("FALSE") +) +clk_pl_user1_ibufg_inst ( + .I (clk_pl_user1_p), + .IB(clk_pl_user1_n), + .O (clk_pl_user1_ibufg) +); + +BUFG +clk_pl_user1_bufg_inst ( + .I(clk_pl_user1_ibufg), + .O(clk_pl_user1_bufg) +); + +// MMCM instance +MMCME4_BASE #( + // 200 MHz input + .CLKIN1_PERIOD(5.0), + .REF_JITTER1(0.010), + // 200 MHz input / 1 = 200 MHz PFD (range 10 MHz to 500 MHz) + .DIVCLK_DIVIDE(1), + // 200 MHz PFD * 5 = 1000 MHz VCO (range 800 MHz to 1600 MHz) + .CLKFBOUT_MULT_F(5), + .CLKFBOUT_PHASE(0), + // 1000 MHz / 8 = 125 MHz, 0 degrees + .CLKOUT0_DIVIDE_F(8), + .CLKOUT0_DUTY_CYCLE(0.5), + .CLKOUT0_PHASE(0), + // Not used + .CLKOUT1_DIVIDE(1), + .CLKOUT1_DUTY_CYCLE(0.5), + .CLKOUT1_PHASE(0), + // Not used + .CLKOUT2_DIVIDE(1), + .CLKOUT2_DUTY_CYCLE(0.5), + .CLKOUT2_PHASE(0), + // Not used + .CLKOUT3_DIVIDE(1), + .CLKOUT3_DUTY_CYCLE(0.5), + .CLKOUT3_PHASE(0), + // Not used + .CLKOUT4_DIVIDE(1), + .CLKOUT4_DUTY_CYCLE(0.5), + .CLKOUT4_PHASE(0), + .CLKOUT4_CASCADE("FALSE"), + // Not used + .CLKOUT5_DIVIDE(1), + .CLKOUT5_DUTY_CYCLE(0.5), + .CLKOUT5_PHASE(0), + // Not used + .CLKOUT6_DIVIDE(1), + .CLKOUT6_DUTY_CYCLE(0.5), + .CLKOUT6_PHASE(0), + + // optimized bandwidth + .BANDWIDTH("OPTIMIZED"), + // don't wait for lock during startup + .STARTUP_WAIT("FALSE") +) +clk_mmcm_inst ( + // 200 MHz input + .CLKIN1(clk_pl_user1_bufg), + // direct clkfb feeback + .CLKFBIN(mmcm_clkfb), + .CLKFBOUT(mmcm_clkfb), + .CLKFBOUTB(), + // 125 MHz, 0 degrees + .CLKOUT0(clk_125mhz_mmcm_out), + .CLKOUT0B(), + // Not used + .CLKOUT1(), + .CLKOUT1B(), + // Not used + .CLKOUT2(), + .CLKOUT2B(), + // Not used + .CLKOUT3(), + .CLKOUT3B(), + // Not used + .CLKOUT4(), + // Not used + .CLKOUT5(), + // Not used + .CLKOUT6(), + // reset input + .RST(mmcm_rst), + // don't power down + .PWRDWN(1'b0), + // locked output + .LOCKED(mmcm_locked) +); + +BUFG +clk_125mhz_bufg_inst ( + .I(clk_125mhz_mmcm_out), + .O(clk_125mhz_int) +); + +taxi_sync_reset #( + .N(4) +) +sync_reset_125mhz_inst ( + .clk(clk_125mhz_int), + .rst(~mmcm_locked), + .out(rst_125mhz_int) +); + +wire fpga_refclk_ibufg; +wire fpga_refclk_int; +wire fpga_sysref_ibufg; +wire fpga_sysref_int; + +IBUFGDS #( + .DIFF_TERM("FALSE"), + .IBUF_LOW_PWR("FALSE") +) +fpga_refclk_ibufg_inst ( + .O (fpga_refclk_ibufg), + .I (fpga_refclk_p), + .IB (fpga_refclk_n) +); + +BUFG +fpga_refclk_bufg_inst ( + .I(fpga_refclk_ibufg), + .O(fpga_refclk_int) +); + +IBUFGDS #( + .DIFF_TERM("FALSE"), + .IBUF_LOW_PWR("FALSE") +) +fpga_sysref_ibufg_inst ( + .O (fpga_sysref_ibufg), + .I (fpga_sysref_p), + .IB (fpga_sysref_n) +); + +BUFG +fpga_sysref_bufg_inst ( + .I(fpga_sysref_ibufg), + .O(fpga_sysref_int) +); + +// STARTUP instance for cfgmclk +wire cfgmclk; + +STARTUPE3 +startupe3_inst ( + .CFGCLK(), + .CFGMCLK(cfgmclk), + .DI(), + .DO(4'd0), + .DTS(1'b1), + .EOS(), + .FCSBO(1'b1), + .FCSBTS(1'b1), + .GSR(1'b0), + .GTS(1'b0), + .KEYCLEARB(1'b1), + .PACK(1'b0), + .PREQ(), + .USRCCLKO(1'b0), + .USRCCLKTS(1'b1), + .USRDONEO(1'b0), + .USRDONETS(1'b1) +); + +wire cfgmclk_int; + +BUFG +cfgmclk_bufg_inst ( + .I(cfgmclk), + .O(cfgmclk_int) +); + +wire cfgmclk_rst_int; + +taxi_sync_reset #( + .N(4) +) +sync_reset_cfgmclk_inst ( + .clk(cfgmclk_int), + .rst(~btn), + .out(cfgmclk_rst_int) +); + +// GPIO +wire [3:0] sw_int; + +taxi_debounce_switch #( + .WIDTH(4), + .N(4), + .RATE(125000) +) +debounce_switch_inst ( + .clk(clk_125mhz_int), + .rst(rst_125mhz_int), + .in({sw}), + .out({sw_int}) +); + +wire uart_txd_int; +wire uart_rts_int; + +taxi_sync_signal #( + .WIDTH(2), + .N(2) +) +sync_signal_inst ( + .clk(clk_125mhz_int), + .in({uart_txd, uart_rts}), + .out({uart_txd_int, uart_rts_int}) +); + +wire i2c_scl_i; +wire i2c_scl_o; +wire i2c_sda_i; +wire i2c_sda_o; + +assign i2c_scl_i = i2c_scl; +assign i2c_scl = i2c_scl_o ? 1'bz : 1'b0; +assign i2c_sda_i = i2c_sda; +assign i2c_sda = i2c_sda_o ? 1'bz : 1'b0; +assign i2c_rst_n = 1'b1; + +wire i2c_init_scl_i = i2c_scl_i; +wire i2c_init_scl_o; +wire i2c_init_sda_i = i2c_sda_i; +wire i2c_init_sda_o; + +wire i2c_int_scl_i = i2c_scl_i; +wire i2c_int_scl_o; +wire i2c_int_sda_i = i2c_sda_i; +wire i2c_int_sda_o; + +assign i2c_scl_o = i2c_init_scl_o & i2c_int_scl_o; +assign i2c_sda_o = i2c_init_sda_o & i2c_int_sda_o; + +// PLL init +taxi_axis_if #(.DATA_W(12)) pll_i2c_cmd(); +taxi_axis_if #(.DATA_W(8)) pll_i2c_tx(); +taxi_axis_if #(.DATA_W(8)) pll_i2c_rx(); + +assign pll_i2c_rx.tready = 1'b1; + +taxi_i2c_master +pll_i2c_master_inst ( + .clk(cfgmclk_int), + .rst(cfgmclk_rst_int), + + /* + * Host interface + */ + .s_axis_cmd(pll_i2c_cmd), + .s_axis_tx(pll_i2c_tx), + .m_axis_rx(pll_i2c_rx), + + /* + * I2C interface + */ + .scl_i(i2c_init_scl_i), + .scl_o(i2c_init_scl_o), + .sda_i(i2c_init_sda_i), + .sda_o(i2c_init_sda_o), + + /* + * Status + */ + .busy(), + .bus_control(), + .bus_active(), + .missed_ack(), + + /* + * Configuration + */ + .prescale(SIM ? 15 : 150), + .stop_on_idle(1) +); + +pll_i2c_init_r2 #( + .SIM_SPEEDUP(SIM) +) +pll_i2c_init_inst ( + .clk(cfgmclk_int), + .rst(cfgmclk_rst_int), + + /* + * I2C master interface + */ + .m_axis_cmd(pll_i2c_cmd), + .m_axis_tx(pll_i2c_tx), + + /* + * Status + */ + .busy(pll_i2c_busy), + + /* + * Configuration + */ + .start(1'b1) +); + +localparam PORT_CNT = 2; +localparam GTY_QUAD_CNT = PORT_CNT; +localparam GTY_CNT = GTY_QUAD_CNT*4; +localparam GTY_CLK_CNT = GTY_QUAD_CNT; + +assign fmc_qsfp_modsell = 1'b0; +assign fmc_qsfp_resetl = 1'b1; +assign fmc_qsfp_lpmode = 1'b0; + +// RF data converters +localparam ADC_CNT = 8; +localparam ADC_SAMPLE_W = 16; +localparam ADC_SAMPLE_CNT = 4; +localparam ADC_DATA_W = ADC_SAMPLE_W*ADC_SAMPLE_CNT; + +localparam DAC_CNT = ADC_CNT; +localparam DAC_SAMPLE_W = ADC_SAMPLE_W; +localparam DAC_SAMPLE_CNT = ADC_SAMPLE_CNT; +localparam DAC_DATA_W = DAC_SAMPLE_W*DAC_SAMPLE_CNT; + +wire axil_rfdc_clk = clk_125mhz_int; +wire axil_rfdc_rst = rst_125mhz_int; + +taxi_axil_if #( + .DATA_W(32), + .ADDR_W(18) +) axil_rfdc(); + +wire axis_rfdc_clk; +wire axis_rfdc_rst; + +wire [3:0] adc_clk_out; +wire [3:0] dac_clk_out; + +taxi_axis_if #( + .DATA_W(ADC_DATA_W), + .KEEP_EN(1), + .KEEP_W(ADC_SAMPLE_CNT), + .LAST_EN(0), + .USER_EN(0), + .ID_EN(0), + .DEST_EN(0) +) axis_adc[ADC_CNT](); + +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_0 = axis_adc[0].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_1 = axis_adc[1].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_2 = axis_adc[2].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_3 = axis_adc[3].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_4 = axis_adc[4].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_5 = axis_adc[5].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_6 = axis_adc[6].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [ADC_DATA_W-1:0] adc_data_7 = axis_adc[7].tdata; + +taxi_axis_if #( + .DATA_W(DAC_DATA_W), + .KEEP_EN(1), + .KEEP_W(DAC_SAMPLE_CNT), + .LAST_EN(0), + .USER_EN(0), + .ID_EN(0), + .DEST_EN(0) +) axis_dac[DAC_CNT](); + +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_0 = axis_dac[0].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_1 = axis_dac[1].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_2 = axis_dac[2].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_3 = axis_dac[3].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_4 = axis_dac[4].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_5 = axis_dac[5].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_6 = axis_dac[6].tdata; +(* MARK_DEBUG = "TRUE" *) +wire [DAC_DATA_W-1:0] dac_data_7 = axis_dac[7].tdata; + +wire rfdc_mmcm_in = dac_clk_out[0]; +wire rfdc_mmcm_rst = rst_125mhz_int; +wire rfdc_mmcm_clkfb; +wire rfdc_mmcm_locked; +wire rfdc_mmcm_out; + +// MMCM instance +MMCME4_BASE #( + // 62.5 MHz input + .CLKIN1_PERIOD(16.0), + .REF_JITTER1(0.010), + // 62.5 MHz input / 1 = 62.5 MHz PFD (range 10 MHz to 500 MHz) + .DIVCLK_DIVIDE(1), + // 62.5 MHz PFD * 20 = 1250 MHz VCO (range 800 MHz to 1600 MHz) + .CLKFBOUT_MULT_F(20), + .CLKFBOUT_PHASE(0), + // 1250 MHz / 5 = 250 MHz, 0 degrees + .CLKOUT0_DIVIDE_F(5), + .CLKOUT0_DUTY_CYCLE(0.5), + .CLKOUT0_PHASE(0), + // Not used + .CLKOUT1_DIVIDE(1), + .CLKOUT1_DUTY_CYCLE(0.5), + .CLKOUT1_PHASE(0), + // Not used + .CLKOUT2_DIVIDE(1), + .CLKOUT2_DUTY_CYCLE(0.5), + .CLKOUT2_PHASE(0), + // Not used + .CLKOUT3_DIVIDE(1), + .CLKOUT3_DUTY_CYCLE(0.5), + .CLKOUT3_PHASE(0), + // Not used + .CLKOUT4_DIVIDE(1), + .CLKOUT4_DUTY_CYCLE(0.5), + .CLKOUT4_PHASE(0), + .CLKOUT4_CASCADE("FALSE"), + // Not used + .CLKOUT5_DIVIDE(1), + .CLKOUT5_DUTY_CYCLE(0.5), + .CLKOUT5_PHASE(0), + // Not used + .CLKOUT6_DIVIDE(1), + .CLKOUT6_DUTY_CYCLE(0.5), + .CLKOUT6_PHASE(0), + + // optimized bandwidth + .BANDWIDTH("OPTIMIZED"), + // don't wait for lock during startup + .STARTUP_WAIT("FALSE") +) +rfdc_mmcm_inst ( + // 62.5 MHz input + .CLKIN1(rfdc_mmcm_in), + // direct clkfb feeback + .CLKFBIN(rfdc_mmcm_clkfb), + .CLKFBOUT(rfdc_mmcm_clkfb), + .CLKFBOUTB(), + // 250 MHz, 0 degrees + .CLKOUT0(rfdc_mmcm_out), + .CLKOUT0B(), + // Not used + .CLKOUT1(), + .CLKOUT1B(), + // Not used + .CLKOUT2(), + .CLKOUT2B(), + // Not used + .CLKOUT3(), + .CLKOUT3B(), + // Not used + .CLKOUT4(), + // Not used + .CLKOUT5(), + // Not used + .CLKOUT6(), + // reset input + .RST(rfdc_mmcm_rst), + // don't power down + .PWRDWN(1'b0), + // locked output + .LOCKED(rfdc_mmcm_locked) +); + +BUFG +axis_rfdc_bufg_inst ( + .I(rfdc_mmcm_out), + .O(axis_rfdc_clk) +); + +taxi_sync_reset #( + .N(4) +) +axis_rfdc_sync_reset_inst ( + .clk(axis_rfdc_clk), + .rst(!rfdc_mmcm_locked || rfdc_mmcm_rst), + .out(axis_rfdc_rst) +); + +usp_rfdc_0 rfdc_inst ( + // Common + .sysref_in_p(rfdc_sysref_p), + .sysref_in_n(rfdc_sysref_n), + + .s_axi_aclk(axil_rfdc_clk), + .s_axi_aresetn(!axil_rfdc_rst), + .s_axi_awaddr(axil_rfdc.awaddr), + .s_axi_awvalid(axil_rfdc.awvalid), + .s_axi_awready(axil_rfdc.awready), + .s_axi_wdata(axil_rfdc.wdata), + .s_axi_wstrb(axil_rfdc.wstrb), + .s_axi_wvalid(axil_rfdc.wvalid), + .s_axi_wready(axil_rfdc.wready), + .s_axi_bresp(axil_rfdc.bresp), + .s_axi_bvalid(axil_rfdc.bvalid), + .s_axi_bready(axil_rfdc.bready), + .s_axi_araddr(axil_rfdc.araddr), + .s_axi_arvalid(axil_rfdc.arvalid), + .s_axi_arready(axil_rfdc.arready), + .s_axi_rdata(axil_rfdc.rdata), + .s_axi_rresp(axil_rfdc.rresp), + .s_axi_rvalid(axil_rfdc.rvalid), + .s_axi_rready(axil_rfdc.rready), + + .irq(), + + // ADC + .adc0_clk_p(adc_refclk_0_p), + .adc0_clk_n(adc_refclk_0_n), + .clk_adc0(adc_clk_out[0]), + + .adc1_clk_p(adc_refclk_1_p), + .adc1_clk_n(adc_refclk_1_n), + .clk_adc1(adc_clk_out[1]), + + .adc2_clk_p(adc_refclk_2_p), + .adc2_clk_n(adc_refclk_2_n), + .clk_adc2(adc_clk_out[2]), + + .adc3_clk_p(adc_refclk_3_p), + .adc3_clk_n(adc_refclk_3_n), + .clk_adc3(adc_clk_out[3]), + + .vin0_01_p(adc_vin_p[7]), + .vin0_01_n(adc_vin_n[7]), + .vin0_23_p(adc_vin_p[6]), + .vin0_23_n(adc_vin_n[6]), + + .vin1_01_p(adc_vin_p[5]), + .vin1_01_n(adc_vin_n[5]), + .vin1_23_p(adc_vin_p[4]), + .vin1_23_n(adc_vin_n[4]), + + .vin2_01_p(adc_vin_p[3]), + .vin2_01_n(adc_vin_n[3]), + .vin2_23_p(adc_vin_p[2]), + .vin2_23_n(adc_vin_n[2]), + + .vin3_01_p(adc_vin_p[1]), + .vin3_01_n(adc_vin_n[1]), + .vin3_23_p(adc_vin_p[0]), + .vin3_23_n(adc_vin_n[0]), + + .m0_axis_aresetn(!axis_rfdc_rst), + .m0_axis_aclk(axis_rfdc_clk), + .m00_axis_tdata(axis_adc[7].tdata), + .m00_axis_tvalid(axis_adc[7].tvalid), + .m00_axis_tready(axis_adc[7].tready), + .m02_axis_tdata(axis_adc[6].tdata), + .m02_axis_tvalid(axis_adc[6].tvalid), + .m02_axis_tready(axis_adc[6].tready), + + .m1_axis_aresetn(!axis_rfdc_rst), + .m1_axis_aclk(axis_rfdc_clk), + .m10_axis_tdata(axis_adc[5].tdata), + .m10_axis_tvalid(axis_adc[5].tvalid), + .m10_axis_tready(axis_adc[5].tready), + .m12_axis_tdata(axis_adc[4].tdata), + .m12_axis_tvalid(axis_adc[4].tvalid), + .m12_axis_tready(axis_adc[4].tready), + + .m2_axis_aresetn(!axis_rfdc_rst), + .m2_axis_aclk(axis_rfdc_clk), + .m20_axis_tdata(axis_adc[3].tdata), + .m20_axis_tvalid(axis_adc[3].tvalid), + .m20_axis_tready(axis_adc[3].tready), + .m22_axis_tdata(axis_adc[2].tdata), + .m22_axis_tvalid(axis_adc[2].tvalid), + .m22_axis_tready(axis_adc[2].tready), + + .m3_axis_aresetn(!axis_rfdc_rst), + .m3_axis_aclk(axis_rfdc_clk), + .m30_axis_tdata(axis_adc[1].tdata), + .m30_axis_tvalid(axis_adc[1].tvalid), + .m30_axis_tready(axis_adc[1].tready), + .m32_axis_tdata(axis_adc[0].tdata), + .m32_axis_tvalid(axis_adc[0].tvalid), + .m32_axis_tready(axis_adc[0].tready), + + .adc0_01_dsa_code(5'd27), + .adc0_23_dsa_code(5'd27), + .adc0_dsa_update(1'b0), + .adc1_01_dsa_code(5'd27), + .adc1_23_dsa_code(5'd27), + .adc1_dsa_update(1'b0), + .adc2_01_dsa_code(5'd27), + .adc2_23_dsa_code(5'd27), + .adc2_dsa_update(1'b0), + .adc3_01_dsa_code(5'd27), + .adc3_23_dsa_code(5'd27), + .adc3_dsa_update(1'b0), + + // DAC + .dac2_clk_p(dac_refclk_1_p), + .dac2_clk_n(dac_refclk_1_n), + + .clk_dac0(dac_clk_out[0]), + .clk_dac1(dac_clk_out[1]), + .clk_dac2(dac_clk_out[2]), + .clk_dac3(dac_clk_out[3]), + + .vout00_p(dac_vout_p[7]), + .vout00_n(dac_vout_n[7]), + .vout02_p(dac_vout_p[6]), + .vout02_n(dac_vout_n[6]), + + .vout10_p(dac_vout_p[5]), + .vout10_n(dac_vout_n[5]), + .vout12_p(dac_vout_p[4]), + .vout12_n(dac_vout_n[4]), + + .vout20_p(dac_vout_p[3]), + .vout20_n(dac_vout_n[3]), + .vout22_p(dac_vout_p[2]), + .vout22_n(dac_vout_n[2]), + + .vout30_p(dac_vout_p[1]), + .vout30_n(dac_vout_n[1]), + .vout32_p(dac_vout_p[0]), + .vout32_n(dac_vout_n[0]), + + .s0_axis_aresetn(!axis_rfdc_rst), + .s0_axis_aclk(axis_rfdc_clk), + .s00_axis_tdata(axis_dac[7].tdata), + .s00_axis_tvalid(axis_dac[7].tvalid), + .s00_axis_tready(axis_dac[7].tready), + .s02_axis_tdata(axis_dac[6].tdata), + .s02_axis_tvalid(axis_dac[6].tvalid), + .s02_axis_tready(axis_dac[6].tready), + + .s1_axis_aresetn(!axis_rfdc_rst), + .s1_axis_aclk(axis_rfdc_clk), + .s10_axis_tdata(axis_dac[5].tdata), + .s10_axis_tvalid(axis_dac[5].tvalid), + .s10_axis_tready(axis_dac[5].tready), + .s12_axis_tdata(axis_dac[4].tdata), + .s12_axis_tvalid(axis_dac[4].tvalid), + .s12_axis_tready(axis_dac[4].tready), + + .s2_axis_aresetn(!axis_rfdc_rst), + .s2_axis_aclk(axis_rfdc_clk), + .s20_axis_tdata(axis_dac[3].tdata), + .s20_axis_tvalid(axis_dac[3].tvalid), + .s20_axis_tready(axis_dac[3].tready), + .s22_axis_tdata(axis_dac[2].tdata), + .s22_axis_tvalid(axis_dac[2].tvalid), + .s22_axis_tready(axis_dac[2].tready), + + .s3_axis_aresetn(!axis_rfdc_rst), + .s3_axis_aclk(axis_rfdc_clk), + .s30_axis_tdata(axis_dac[1].tdata), + .s30_axis_tvalid(axis_dac[1].tvalid), + .s30_axis_tready(axis_dac[1].tready), + .s32_axis_tdata(axis_dac[0].tdata), + .s32_axis_tvalid(axis_dac[0].tvalid), + .s32_axis_tready(axis_dac[0].tready), + + .dac00_vop_code(10'd895), + .dac02_vop_code(10'd895), + .dac00_update_vop(1'b0), + .dac02_update_vop(1'b0), + .dac00_vop_done(), + .dac02_vop_done(), + .dac0_vop_busy(), + + .dac10_vop_code(10'd895), + .dac12_vop_code(10'd895), + .dac10_update_vop(1'b0), + .dac12_update_vop(1'b0), + .dac10_vop_done(), + .dac12_vop_done(), + .dac1_vop_busy(), + + .dac20_vop_code(10'd895), + .dac22_vop_code(10'd895), + .dac20_update_vop(1'b0), + .dac22_update_vop(1'b0), + .dac20_vop_done(), + .dac22_vop_done(), + .dac2_vop_busy(), + + .dac30_vop_code(10'd895), + .dac32_vop_code(10'd895), + .dac30_update_vop(1'b0), + .dac32_update_vop(1'b0), + .dac30_vop_done(), + .dac32_vop_done(), + .dac3_vop_busy() +); + +fpga_core #( + .SIM(SIM), + .VENDOR(VENDOR), + .FAMILY(FAMILY), + .PORT_CNT(PORT_CNT), + .GTY_QUAD_CNT(GTY_QUAD_CNT), + .GTY_CNT(GTY_CNT), + .GTY_CLK_CNT(GTY_CLK_CNT), + .ADC_CNT(ADC_CNT), + .DAC_CNT(DAC_CNT) +) +core_inst ( + /* + * Clock: 125MHz + * Synchronous reset + */ + .clk_125mhz(clk_125mhz_int), + .rst_125mhz(rst_125mhz_int), + .fpga_refclk(fpga_refclk_int), + .fpga_sysref(fpga_sysref_int), + + /* + * GPIO + */ + .sw(sw_int), + .led(led), + .gpio(), + + /* + * I2C for board management + */ + .i2c_scl_i(i2c_int_scl_i), + .i2c_scl_o(i2c_int_scl_o), + .i2c_sda_i(i2c_int_sda_i), + .i2c_sda_o(i2c_int_sda_o), + + /* + * UART: 921600 bps, 8N1 + */ + .uart_rxd(uart_rxd), + .uart_txd(uart_txd_int), + .uart_rts(uart_rts_int), + .uart_cts(uart_cts), + .uart_rst_n(uart_rst_n), + .uart_suspend_n(uart_suspend_n), + + /* + * Ethernet: QSFP28 + */ + .eth_gty_tx_p(fmc_dp_c2m_p), + .eth_gty_tx_n(fmc_dp_c2m_n), + .eth_gty_rx_p(fmc_dp_m2c_p), + .eth_gty_rx_n(fmc_dp_m2c_n), + .eth_gty_mgt_refclk_p({fmc_mgt_refclk_1_0_p, fmc_mgt_refclk_0_0_p}), + .eth_gty_mgt_refclk_n({fmc_mgt_refclk_1_0_n, fmc_mgt_refclk_0_0_n}), + .eth_gty_mgt_refclk_out(), + + .eth_port_resetl(), + .eth_port_modprsl('0), + .eth_port_intl('1), + + /* + * RFDC + */ + .axil_rfdc_clk(axil_rfdc_clk), + .axil_rfdc_rst(axil_rfdc_rst), + .m_axil_rfdc_wr(axil_rfdc), + .m_axil_rfdc_rd(axil_rfdc), + + .axis_rfdc_clk(axis_rfdc_clk), + .axis_rfdc_rst(axis_rfdc_rst), + .s_axis_adc(axis_adc), + .m_axis_dac(axis_dac) +); + +endmodule + +`resetall diff --git a/src/eth/example/HTG_ZRF8/fpga/tb/fpga_core/Makefile b/src/eth/example/HTG_ZRF8/fpga/tb/fpga_core/Makefile new file mode 100644 index 0000000..9cdd6e4 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/tb/fpga_core/Makefile @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: MIT +# +# Copyright (c) 2020-2025 FPGA Ninja, LLC +# +# Authors: +# - Alex Forencich + +TOPLEVEL_LANG = verilog + +SIM ?= verilator +WAVES ?= 0 + +COCOTB_HDL_TIMEUNIT = 1ns +COCOTB_HDL_TIMEPRECISION = 1ps + +RTL_DIR = ../../rtl +LIB_DIR = ../../lib +TAXI_SRC_DIR = $(LIB_DIR)/taxi/src + +DUT = fpga_core +COCOTB_TEST_MODULES = test_$(DUT) +COCOTB_TOPLEVEL = test_$(DUT) +MODULE = $(COCOTB_TEST_MODULES) +TOPLEVEL = $(COCOTB_TOPLEVEL) +VERILOG_SOURCES += $(COCOTB_TOPLEVEL).sv +VERILOG_SOURCES += $(RTL_DIR)/$(DUT).sv +VERILOG_SOURCES += $(TAXI_SRC_DIR)/eth/rtl/us/taxi_eth_mac_25g_us.f +VERILOG_SOURCES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_if_uart.f +VERILOG_SOURCES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_switch.sv +VERILOG_SOURCES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_mod_stats.f +VERILOG_SOURCES += $(TAXI_SRC_DIR)/xfcp/rtl/taxi_xfcp_mod_i2c_master.f +VERILOG_SOURCES += $(TAXI_SRC_DIR)/axis/rtl/taxi_axis_async_fifo.f +VERILOG_SOURCES += $(TAXI_SRC_DIR)/sync/rtl/taxi_sync_reset.sv +VERILOG_SOURCES += $(TAXI_SRC_DIR)/sync/rtl/taxi_sync_signal.sv +VERILOG_SOURCES += $(TAXI_SRC_DIR)/io/rtl/taxi_debounce_switch.sv + +# handle file list files +process_f_file = $(call process_f_files,$(addprefix $(dir $1),$(shell cat $1))) +process_f_files = $(foreach f,$1,$(if $(filter %.f,$f),$(call process_f_file,$f),$f)) +uniq_base = $(if $1,$(call uniq_base,$(foreach f,$1,$(if $(filter-out $(notdir $(lastword $1)),$(notdir $f)),$f,))) $(lastword $1)) +VERILOG_SOURCES := $(call uniq_base,$(call process_f_files,$(VERILOG_SOURCES))) + +# module parameters +export PARAM_SIM := "1'b1" +export PARAM_VENDOR := "\"XILINX\"" +export PARAM_FAMILY := "\"zynquplusRFSOC\"" +export PARAM_PORT_CNT := 2 +export PARAM_GTY_QUAD_CNT := $(PARAM_PORT_CNT) +export PARAM_GTY_CNT := $(shell echo $$(( 4 * $(PARAM_GTY_QUAD_CNT) ))) +export PARAM_GTY_CLK_CNT := $(PARAM_GTY_QUAD_CNT) + +ifeq ($(SIM), icarus) + PLUSARGS += -fst + + COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(COCOTB_TOPLEVEL).$(subst PARAM_,,$(v))=$($(v))) +else ifeq ($(SIM), verilator) + COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v))) + + ifeq ($(WAVES), 1) + COMPILE_ARGS += --trace-fst + VERILATOR_TRACE = 1 + endif +endif + +include $(shell cocotb-config --makefiles)/Makefile.sim diff --git a/src/eth/example/HTG_ZRF8/fpga/tb/fpga_core/baser.py b/src/eth/example/HTG_ZRF8/fpga/tb/fpga_core/baser.py new file mode 120000 index 0000000..946b03b --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/tb/fpga_core/baser.py @@ -0,0 +1 @@ +../../lib/taxi/src/eth/tb/baser.py \ No newline at end of file diff --git a/src/eth/example/HTG_ZRF8/fpga/tb/fpga_core/test_fpga_core.py b/src/eth/example/HTG_ZRF8/fpga/tb/fpga_core/test_fpga_core.py new file mode 100644 index 0000000..d827b89 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/tb/fpga_core/test_fpga_core.py @@ -0,0 +1,259 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: MIT +""" + +Copyright (c) 2020-2025 FPGA Ninja, LLC + +Authors: +- Alex Forencich + +""" + +import logging +import os +import sys + +import cocotb_test.simulator + +import cocotb +from cocotb.log import SimLog +from cocotb.clock import Clock +from cocotb.triggers import RisingEdge, Timer, Combine + +from cocotbext.eth import XgmiiFrame +from cocotbext.uart import UartSource, UartSink + +try: + from baser import BaseRSerdesSource, BaseRSerdesSink +except ImportError: + # attempt import from current directory + sys.path.insert(0, os.path.join(os.path.dirname(__file__))) + try: + from baser import BaseRSerdesSource, BaseRSerdesSink + finally: + del sys.path[0] + + +class TB: + def __init__(self, dut): + self.dut = dut + + self.log = SimLog("cocotb.tb") + self.log.setLevel(logging.DEBUG) + + cocotb.start_soon(Clock(dut.clk_125mhz, 8, units="ns").start()) + + self.uart_source = UartSource(dut.uart_rxd, baud=921600, bits=8, stop_bits=1) + self.uart_sink = UartSink(dut.uart_txd, baud=921600, bits=8, stop_bits=1) + + self.qsfp_sources = [] + self.qsfp_sinks = [] + + for inst in dut.uut.gty_quad: + for ch in inst.mac_inst.ch: + gt_inst = ch.ch_inst.gt.gt_inst + + if ch.ch_inst.CFG_LOW_LATENCY.value: + clk = 2.482 + gbx_cfg = (66, [64, 65]) + else: + clk = 2.56 + gbx_cfg = None + + cocotb.start_soon(Clock(gt_inst.tx_clk, clk, units="ns").start()) + cocotb.start_soon(Clock(gt_inst.rx_clk, clk, units="ns").start()) + + self.qsfp_sources.append(BaseRSerdesSource( + data=gt_inst.serdes_rx_data, + data_valid=gt_inst.serdes_rx_data_valid, + hdr=gt_inst.serdes_rx_hdr, + hdr_valid=gt_inst.serdes_rx_hdr_valid, + clock=gt_inst.rx_clk, + slip=gt_inst.serdes_rx_bitslip, + reverse=True, + gbx_cfg=gbx_cfg + )) + self.qsfp_sinks.append(BaseRSerdesSink( + data=gt_inst.serdes_tx_data, + data_valid=gt_inst.serdes_tx_data_valid, + hdr=gt_inst.serdes_tx_hdr, + hdr_valid=gt_inst.serdes_tx_hdr_valid, + gbx_sync=gt_inst.serdes_tx_gbx_sync, + clock=gt_inst.tx_clk, + reverse=True, + gbx_cfg=gbx_cfg + )) + + cocotb.start_soon(Clock(dut.axil_rfdc_clk, 8, units="ns").start()) + cocotb.start_soon(Clock(dut.axis_rfdc_clk, 4, units="ns").start()) + + dut.i2c_scl_i.setimmediatevalue(1) + dut.i2c_sda_i.setimmediatevalue(1) + dut.sw.setimmediatevalue(0) + + cocotb.start_soon(self._run_refclk()) + + async def init(self): + + self.dut.rst_125mhz.setimmediatevalue(0) + self.dut.axil_rfdc_rst.setimmediatevalue(0) + self.dut.axis_rfdc_rst.setimmediatevalue(0) + + for k in range(10): + await RisingEdge(self.dut.clk_125mhz) + + self.dut.rst_125mhz.value = 1 + self.dut.axil_rfdc_rst.value = 1 + self.dut.axis_rfdc_rst.value = 1 + + for k in range(10): + await RisingEdge(self.dut.clk_125mhz) + + self.dut.rst_125mhz.value = 0 + self.dut.axil_rfdc_rst.value = 0 + self.dut.axis_rfdc_rst.value = 0 + + for k in range(10): + await RisingEdge(self.dut.clk_125mhz) + + async def _run_refclk(self): + t = Timer(3.102, 'ns') + val = 2**len(self.dut.eth_gty_mgt_refclk_p)-1 + while True: + self.dut.eth_gty_mgt_refclk_p.value = val + await t + self.dut.eth_gty_mgt_refclk_p.value = 0 + await t + + +async def mac_test(tb, source, sink): + tb.log.info("Test MAC") + + tb.log.info("Wait for block lock") + for k in range(1200): + await RisingEdge(tb.dut.clk_125mhz) + + tb.log.info("Multiple small packets") + + count = 64 + + pkts = [bytearray([(x+k) % 256 for x in range(60)]) for k in range(count)] + + for p in pkts: + await source.send(XgmiiFrame.from_payload(p)) + + for k in range(count): + rx_frame = await sink.recv() + + tb.log.info("RX frame: %s", rx_frame) + + assert rx_frame.get_payload() == pkts[k] + assert rx_frame.check_fcs() + + tb.log.info("Multiple large packets") + + count = 32 + + pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)] + + for p in pkts: + await source.send(XgmiiFrame.from_payload(p)) + + for k in range(count): + rx_frame = await sink.recv() + + tb.log.info("RX frame: %s", rx_frame) + + assert rx_frame.get_payload() == pkts[k] + assert rx_frame.check_fcs() + + tb.log.info("MAC test done") + + +@cocotb.test() +async def run_test(dut): + + tb = TB(dut) + + await tb.init() + + tests = [] + + for k in range(len(tb.qsfp_sources)): + tb.log.info("Start QSFP %d MAC loopback test", k) + + tests.append(cocotb.start_soon(mac_test(tb, tb.qsfp_sources[k], tb.qsfp_sinks[k]))) + + await Combine(*tests) + + await RisingEdge(dut.clk_125mhz) + await RisingEdge(dut.clk_125mhz) + + +# cocotb-test + +tests_dir = os.path.abspath(os.path.dirname(__file__)) +rtl_dir = os.path.abspath(os.path.join(tests_dir, '..', '..', 'rtl')) +lib_dir = os.path.abspath(os.path.join(tests_dir, '..', '..', 'lib')) +taxi_src_dir = os.path.abspath(os.path.join(lib_dir, 'taxi', 'src')) + + +def process_f_files(files): + lst = {} + for f in files: + if f[-2:].lower() == '.f': + with open(f, 'r') as fp: + l = fp.read().split() + for f in process_f_files([os.path.join(os.path.dirname(f), x) for x in l]): + lst[os.path.basename(f)] = f + else: + lst[os.path.basename(f)] = f + return list(lst.values()) + + +def test_fpga_core(request): + dut = "fpga_core" + module = os.path.splitext(os.path.basename(__file__))[0] + toplevel = module + + verilog_sources = [ + os.path.join(tests_dir, f"{toplevel}.sv"), + os.path.join(rtl_dir, f"{dut}.sv"), + os.path.join(taxi_src_dir, "eth", "rtl", "us", "taxi_eth_mac_25g_us.f"), + os.path.join(taxi_src_dir, "xfcp", "rtl", "taxi_xfcp_if_uart.f"), + os.path.join(taxi_src_dir, "xfcp", "rtl", "taxi_xfcp_switch.sv"), + os.path.join(taxi_src_dir, "xfcp", "rtl", "taxi_xfcp_mod_stats.f"), + os.path.join(taxi_src_dir, "xfcp", "rtl", "taxi_xfcp_mod_i2c_master.f"), + os.path.join(taxi_src_dir, "axis", "rtl", "taxi_axis_async_fifo.f"), + os.path.join(taxi_src_dir, "sync", "rtl", "taxi_sync_reset.sv"), + os.path.join(taxi_src_dir, "sync", "rtl", "taxi_sync_signal.sv"), + os.path.join(taxi_src_dir, "io", "rtl", "taxi_debounce_switch.sv"), + ] + + verilog_sources = process_f_files(verilog_sources) + + parameters = {} + + parameters['SIM'] = "1'b1" + parameters['VENDOR'] = "\"XILINX\"" + parameters['FAMILY'] = "\"virtexuplus\"" + parameters['PORT_CNT'] = 2 + parameters['GTY_QUAD_CNT'] = parameters['PORT_CNT'] + parameters['GTY_CNT'] = parameters['GTY_QUAD_CNT']*4 + parameters['GTY_CLK_CNT'] = parameters['GTY_QUAD_CNT'] + + extra_env = {f'PARAM_{k}': str(v) for k, v in parameters.items()} + + sim_build = os.path.join(tests_dir, "sim_build", + request.node.name.replace('[', '-').replace(']', '')) + + cocotb_test.simulator.run( + simulator="verilator", + python_search=[tests_dir], + verilog_sources=verilog_sources, + toplevel=toplevel, + module=module, + parameters=parameters, + sim_build=sim_build, + extra_env=extra_env, + ) diff --git a/src/eth/example/HTG_ZRF8/fpga/tb/fpga_core/test_fpga_core.sv b/src/eth/example/HTG_ZRF8/fpga/tb/fpga_core/test_fpga_core.sv new file mode 100644 index 0000000..41b7a47 --- /dev/null +++ b/src/eth/example/HTG_ZRF8/fpga/tb/fpga_core/test_fpga_core.sv @@ -0,0 +1,182 @@ +// SPDX-License-Identifier: MIT +/* + +Copyright (c) 2025 FPGA Ninja, LLC + +Authors: +- Alex Forencich + +*/ + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * FPGA core logic testbench + */ +module test_fpga_core # +( + /* verilator lint_off WIDTHTRUNC */ + parameter logic SIM = 1'b1, + parameter string VENDOR = "XILINX", + parameter string FAMILY = "zynquplusRFSOC", + parameter PORT_CNT = 2, + parameter GTY_QUAD_CNT = PORT_CNT, + parameter GTY_CNT = GTY_QUAD_CNT*4, + parameter GTY_CLK_CNT = GTY_QUAD_CNT, + parameter ADC_CNT = 8, + parameter ADC_SAMPLE_W = 16, + parameter ADC_SAMPLE_CNT = 4, + parameter DAC_CNT = ADC_CNT, + parameter DAC_SAMPLE_W = ADC_SAMPLE_W, + parameter DAC_SAMPLE_CNT = ADC_SAMPLE_CNT + /* verilator lint_on WIDTHTRUNC */ +) +(); + +localparam ADC_DATA_W = ADC_SAMPLE_W*ADC_SAMPLE_CNT; +localparam DAC_DATA_W = DAC_SAMPLE_W*DAC_SAMPLE_CNT; + +logic clk_125mhz; +logic rst_125mhz; +logic fpga_refclk; +logic fpga_sysref; + +logic [3:0] sw; +logic [3:0] led; +logic [7:0] gpio; + +logic i2c_scl_i; +logic i2c_scl_o; +logic i2c_sda_i; +logic i2c_sda_o; + +logic uart_rxd; +logic uart_txd; +logic uart_rts; +logic uart_cts; +logic uart_rst_n; +logic uart_suspend_n; + +logic [GTY_CNT-1:0] eth_gty_tx_p; +logic [GTY_CNT-1:0] eth_gty_tx_n; +logic [GTY_CNT-1:0] eth_gty_rx_p; +logic [GTY_CNT-1:0] eth_gty_rx_n; +logic [GTY_CLK_CNT-1:0] eth_gty_mgt_refclk_p; +logic [GTY_CLK_CNT-1:0] eth_gty_mgt_refclk_n; +logic [GTY_CLK_CNT-1:0] eth_gty_mgt_refclk_out; + +logic [PORT_CNT-1:0] eth_port_resetl; +logic [PORT_CNT-1:0] eth_port_modprsl; +logic [PORT_CNT-1:0] eth_port_intl; + +logic axil_rfdc_clk; +logic axil_rfdc_rst; + +taxi_axil_if #( + .DATA_W(32), + .ADDR_W(18) +) m_axil_rfdc(); + +logic axis_rfdc_clk; +logic axis_rfdc_rst; + +taxi_axis_if #( + .DATA_W(ADC_DATA_W), + .KEEP_EN(1), + .KEEP_W(ADC_SAMPLE_CNT), + .LAST_EN(0), + .USER_EN(0), + .ID_EN(0), + .DEST_EN(0) +) s_axis_adc[ADC_CNT](); + +taxi_axis_if #( + .DATA_W(DAC_DATA_W), + .KEEP_EN(1), + .KEEP_W(DAC_SAMPLE_CNT), + .LAST_EN(0), + .USER_EN(0), + .ID_EN(0), + .DEST_EN(0) +) m_axis_dac[DAC_CNT](); + +fpga_core #( + .SIM(SIM), + .VENDOR(VENDOR), + .FAMILY(FAMILY), + .PORT_CNT(PORT_CNT), + .GTY_QUAD_CNT(GTY_QUAD_CNT), + .GTY_CNT(GTY_CNT), + .GTY_CLK_CNT(GTY_CLK_CNT), + .ADC_CNT(ADC_CNT), + .DAC_CNT(DAC_CNT) +) +uut ( + /* + * Clock: 125MHz + * Synchronous reset + */ + .clk_125mhz(clk_125mhz), + .rst_125mhz(rst_125mhz), + .fpga_refclk(fpga_refclk), + .fpga_sysref(fpga_sysref), + + /* + * GPIO + */ + .sw(sw), + .led(led), + .gpio(gpio), + + /* + * I2C for board management + */ + .i2c_scl_i(i2c_scl_i), + .i2c_scl_o(i2c_scl_o), + .i2c_sda_i(i2c_sda_i), + .i2c_sda_o(i2c_sda_o), + + /* + * UART: 115200 bps, 8N1 + */ + .uart_rxd(uart_rxd), + .uart_txd(uart_txd), + .uart_rts(uart_rts), + .uart_cts(uart_cts), + .uart_rst_n(uart_rst_n), + .uart_suspend_n(uart_suspend_n), + + /* + * Ethernet: FMC + */ + .eth_gty_tx_p(eth_gty_tx_p), + .eth_gty_tx_n(eth_gty_tx_n), + .eth_gty_rx_p(eth_gty_rx_p), + .eth_gty_rx_n(eth_gty_rx_n), + .eth_gty_mgt_refclk_p(eth_gty_mgt_refclk_p), + .eth_gty_mgt_refclk_n(eth_gty_mgt_refclk_n), + .eth_gty_mgt_refclk_out(eth_gty_mgt_refclk_out), + + .eth_port_resetl(eth_port_resetl), + .eth_port_modprsl(eth_port_modprsl), + .eth_port_intl(eth_port_intl), + + /* + * RFDC + */ + .axil_rfdc_clk(axil_rfdc_clk), + .axil_rfdc_rst(axil_rfdc_rst), + .m_axil_rfdc_wr(m_axil_rfdc), + .m_axil_rfdc_rd(m_axil_rfdc), + + .axis_rfdc_clk(axis_rfdc_clk), + .axis_rfdc_rst(axis_rfdc_rst), + .s_axis_adc(s_axis_adc), + .m_axis_dac(m_axis_dac) +); + +endmodule + +`resetall