initial commit

This commit is contained in:
2023-03-18 15:35:53 +08:00
commit 5965eba577
3222 changed files with 4025781 additions and 0 deletions
+64
View File
@@ -0,0 +1,64 @@
# ---------------------------- Vivado & SDK common -----------------------------
# ignore the vivado project
project/*
# folders (and all of their contents) that should always be ignored,
# anywhere in the repo
.Xil/
# file patterns that should always be ignored (journal files, log
# files, dump files that are created upon Vivado/SDK errors)
*.jou
*.log
*.backup.jou
*.backup.log
*.upgrade_log
*.dmp
vivado_pid*
*~
# ------------------------------ Vivado Specific -------------------------------
# preserve hardware manager projects and sources
!project/*.hw/
# preserve design run results
!project/*.runs/
project/*.runs/*
!project/*.runs/impl_*/
project/*.runs/impl_*/*
!project/*.runs/impl_*/*.bit
!project/*.runs/impl_*/*.ltx
# -------------------------------- SDK Specific --------------------------------
!project/*.sdk/
# exclude some obscure hidden SDK folders
project/*.sdk/.metadata/
project/*.sdk/.sdk/
project/*.sdk/RemoteSystemsTempFiles/
project/*.sdk/webtalk/
# hw_platform : exclude the entire hw_platform folder, as everything can be
# generated from the .hdf file. Make sure to include the bitstream in the .hdf
# file when exporting from Vivado!
project/*.sdk/*_hw_platform_*/
# BSP: only keep `.cproject`, `.project`, `.sdkproject`, `.system.mss` and
# Makefile, the ps7_cortexa9_0 lib files are regenerated automatically
project/*.sdk/*_bsp/*
!project/*.sdk/*_bsp/*.cproject
!project/*.sdk/*_bsp/*.project
!project/*.sdk/*_bsp/*.sdkproject
!project/*.sdk/*_bsp/system.mss
!project/*.sdk/*_bsp/Makefile
# Application: ignored file patterns, exclude Debug & Release folders
project/*.sdk/**/*.o
project/*.sdk/**/*.d
project/*.sdk/**/*.a
project/*.sdk/*/Debug/
project/*.sdk/*/Release/
# REF: https://support.xilinx.com/s/question/0D52E00006iHpHzSAK/which-files-and-folders-of-an-sdk-project-should-be-checked-into-git-and-which-ones-should-be-ignored?language=en_US
@@ -0,0 +1,61 @@
# 2zynq0745_3ad9371 (xc7z100 version)
## Timing Assertions Section
create_clock -period 8.000 [get_ports refclk_p]
## Physical Constraints Section
# Clocks and Resets
set_property -dict {PACKAGE_PIN AE22 IOSTANDARD LVDS_25 } [get_ports sysclk_p ] ;# FPGA_LOGIC_CLK_IN_1P
set_property -dict {PACKAGE_PIN AD10 } [get_ports refclk_p ] ;# FPGA_JESD204B_CLK_IN_1P
set_property -dict {PACKAGE_PIN AJ20 IOSTANDARD LVDS_25 } [get_ports sysref_p ] ;# FPGA_SYSREF_IN_1P
# AD9528 Interface
set_property -dict {PACKAGE_PIN AE16 IOSTANDARD LVCMOS33} [get_ports spi_csn_ad9528 ] ;# SPI_CS_9528
set_property -dict {PACKAGE_PIN AE17 IOSTANDARD LVCMOS33} [get_ports spi_clk_ad9528 ] ;# SPI_SCK_9528
set_property -dict {PACKAGE_PIN AE18 IOSTANDARD LVCMOS33} [get_ports spi_mosi_ad9528 ] ;# SPI_SDI_9528
set_property -dict {PACKAGE_PIN AE15 IOSTANDARD LVCMOS33} [get_ports spi_miso_ad9528 ] ;# SPI_SDO_9528
set_property -dict {PACKAGE_PIN AH13 IOSTANDARD LVCMOS33} [get_ports ad9528_reset_b ] ;# AD9528_CLK_RESETB
set_property -dict {PACKAGE_PIN AA17 IOSTANDARD LVCMOS33} [get_ports ad9528_sysref_req ] ;# AD9528_CLK_SYSREF_REQUEST
# AD9371 Interface
set_property -dict {PACKAGE_PIN AH23 IOSTANDARD LVDS_25 } [get_ports rx_sync_p ] ;# AD9371_1_SYNCINB0+
set_property -dict {PACKAGE_PIN AJ25 IOSTANDARD LVDS_25 } [get_ports tx_sync_p ] ;# AD9371_1_SYNCOUTB0+
set_property -dict {PACKAGE_PIN AH10 } [get_ports {rx_data_p[0]} ] ;# AD9371_1_SERDOUT0+
set_property -dict {PACKAGE_PIN AJ8 } [get_ports {rx_data_p[1]} ] ;# AD9371_1_SERDOUT1+
set_property -dict {PACKAGE_PIN AK10 } [get_ports {tx_data_p[0]} ] ;# AD9371_1_SERDIN0+
set_property -dict {PACKAGE_PIN AK6 } [get_ports {tx_data_p[1]} ] ;# AD9371_1_SERDIN1+
set_property -dict {PACKAGE_PIN AD24 IOSTANDARD LVCMOS25} [get_ports spi_csn_ad9371 ] ;# AD9371_1_SPI_CS
set_property -dict {PACKAGE_PIN AF23 IOSTANDARD LVCMOS25} [get_ports spi_clk_ad9371 ] ;# AD9371_1_SPI_CLK
set_property -dict {PACKAGE_PIN AG24 IOSTANDARD LVCMOS25} [get_ports spi_mosi_ad9371 ] ;# AD9371_1_SPI_SDIN
set_property -dict {PACKAGE_PIN AG25 IOSTANDARD LVCMOS25} [get_ports spi_miso_ad9371 ] ;# AD9371_1_SPI_SDO
set_property -dict {PACKAGE_PIN AK18 IOSTANDARD LVCMOS25} [get_ports ad9371_test ] ;# AD9371_1_TEST
set_property -dict {PACKAGE_PIN AH19 IOSTANDARD LVCMOS25} [get_ports ad9371_reset_b ] ;# AD9371_1_RESETB
set_property -dict {PACKAGE_PIN AK17 IOSTANDARD LVCMOS25} [get_ports ad9371_gpint ] ;# AD9371_1_GP_INTERRUPT
# RF Control
set_property -dict {PACKAGE_PIN T23 IOSTANDARD LVCMOS25} [get_ports {freq_hop_words[10]} ]
set_property -dict {PACKAGE_PIN R22 IOSTANDARD LVCMOS25} [get_ports {freq_hop_words[9] } ]
set_property -dict {PACKAGE_PIN R23 IOSTANDARD LVCMOS25} [get_ports {freq_hop_words[8] } ]
set_property -dict {PACKAGE_PIN U22 IOSTANDARD LVCMOS25} [get_ports {freq_hop_words[7] } ]
set_property -dict {PACKAGE_PIN V22 IOSTANDARD LVCMOS25} [get_ports {freq_hop_words[6] } ]
set_property -dict {PACKAGE_PIN U24 IOSTANDARD LVCMOS25} [get_ports {freq_hop_words[5] } ]
set_property -dict {PACKAGE_PIN V24 IOSTANDARD LVCMOS25} [get_ports {freq_hop_words[4] } ]
set_property -dict {PACKAGE_PIN V23 IOSTANDARD LVCMOS25} [get_ports {freq_hop_words[3] } ]
set_property -dict {PACKAGE_PIN W24 IOSTANDARD LVCMOS25} [get_ports {freq_hop_words[2] } ]
set_property -dict {PACKAGE_PIN V21 IOSTANDARD LVCMOS25} [get_ports {freq_hop_words[1] } ]
set_property -dict {PACKAGE_PIN AF20 IOSTANDARD LVCMOS25} [get_ports {freq_hop_words[0] } ]
set_property -dict {PACKAGE_PIN AH21 IOSTANDARD LVCMOS25} [get_ports hop_words_valid ]
set_property -dict {PACKAGE_PIN AG21 IOSTANDARD LVCMOS25} [get_ports freq_hop_switch ]
set_property -dict {PACKAGE_PIN V29 IOSTANDARD LVCMOS25} [get_ports tx_gain_on ]
set_property -dict {PACKAGE_PIN V28 IOSTANDARD LVCMOS25} [get_ports rx_gain_on ]
set_property -dict {PACKAGE_PIN V27 IOSTANDARD LVCMOS25} [get_ports rx_gain_5bit ]
set_property -dict {PACKAGE_PIN W28 IOSTANDARD LVCMOS25} [get_ports rx_gain_4bit ]
set_property -dict {PACKAGE_PIN T22 IOSTANDARD LVCMOS25} [get_ports rx_gain_3bit ]
set_property -dict {PACKAGE_PIN W29 IOSTANDARD LVCMOS25} [get_ports tx_gain_6bit ]
set_property -dict {PACKAGE_PIN W30 IOSTANDARD LVCMOS25} [get_ports tx_gain_5bit ]
+616
View File
@@ -0,0 +1,616 @@
#*****************************************************************************************
# Vivado (TM) v2019.1.3 (64-bit)
#
# dl814_dj.tcl: Tcl script for re-creating project 'dl814_dj'
#
# Generated by Vivado on Sat Mar 18 09:24:09 +0800 2023
# IP Build 2633630 on Wed Sep 4 12:30:14 MDT 2019
#
# This file contains the Vivado Tcl commands for re-creating the project to the state*
# when this script was generated. In order to re-create the project, please source this
# file in the Vivado Tcl Shell.
#
# * Note that the runs in the created project will be configured the same way as the
# original project, however they will not be launched automatically. To regenerate the
# run results please launch the synthesis/implementation runs as needed.
#
#*****************************************************************************************
# NOTE: In order to use this script for source control purposes, please make sure that the
# following files are added to the source control system:-
#
# 1. This project restoration tcl script (dl814_dj.tcl) that was generated.
#
# 2. The following source(s) files that were local or imported into the original project.
# (Please see the '$orig_proj_dir' and '$origin_dir' variable setting below at the start of the script)
#
# <none>
#
# 3. The following remote source files that were added to the original project:-
#
# "D:/vivado-git/datalink_814/ip/vio_rf_control/vio_rf_control.xci"
# "D:/vivado-git/datalink_814/ip/vio_manual_ctrl/vio_manual_ctrl.xci"
# "D:/vivado-git/datalink_814/ip/ila_ctrl_signal/ila_ctrl_signal.xci"
# "D:/vivado-git/datalink_814/ip/ila_tx_rx/ila_tx_rx.xci"
# "D:/vivado-git/datalink_814/ip/cmpy_18x8/cmpy_18x8.xci"
# "D:/vivado-git/datalink_814/ip/dds_32b_8b/dds_32b_8b.xci"
# "D:/vivado-git/datalink_814/ip/hop_rom/hop_rom.xci"
# "D:/vivado-git/datalink_814/ip/hrc_64_12_025/hrc_64_12_025.xci"
# "D:/vivado-git/datalink_814/ipi-bds/system_bd/system_bd.bd"
# "D:/vivado-git/datalink_814/ip/sig_clk_gen/sig_clk_gen.xci"
# "D:/vivado-git/datalink_814/rtl/rf_control.v"
# "D:/vivado-git/datalink_814/ipi-bds/system_bd/hdl/system_bd_wrapper.v"
# "D:/vivado-git/datalink_814/rtl/tx_qpsk.v"
# "D:/vivado-git/datalink_814/rtl/system_top.v"
# "d:/vivado-git/datalink_814/ip/coe/hrc_64_12_025.coe"
# "d:/vivado-git/datalink_814/ip/coe/sweep_freq.coe"
# "D:/vivado-git/datalink_814/constraints/z7100_ad9528_ad9371.xdc"
#
#*****************************************************************************************
# Set the reference directory for source file relative paths (by default the value is script directory path)
set origin_dir "."
# Use origin directory path location variable, if specified in the tcl shell
if { [info exists ::origin_dir_loc] } {
set origin_dir $::origin_dir_loc
}
# Set the project name
set _xil_proj_name_ "dl814_dj"
# Use project name variable, if specified in the tcl shell
if { [info exists ::user_project_name] } {
set _xil_proj_name_ $::user_project_name
}
variable script_file
set script_file "dl814_dj.tcl"
# Help information for this script
proc print_help {} {
variable script_file
puts "\nDescription:"
puts "Recreate a Vivado project from this script. The created project will be"
puts "functionally equivalent to the original project for which this script was"
puts "generated. The script contains commands for creating a project, filesets,"
puts "runs, adding/importing sources and setting properties on various objects.\n"
puts "Syntax:"
puts "$script_file"
puts "$script_file -tclargs \[--origin_dir <path>\]"
puts "$script_file -tclargs \[--project_name <name>\]"
puts "$script_file -tclargs \[--help\]\n"
puts "Usage:"
puts "Name Description"
puts "-------------------------------------------------------------------------"
puts "\[--origin_dir <path>\] Determine source file paths wrt this path. Default"
puts " origin_dir path value is \".\", otherwise, the value"
puts " that was set with the \"-paths_relative_to\" switch"
puts " when this script was generated.\n"
puts "\[--project_name <name>\] Create project with the specified name. Default"
puts " name is the name of the project from where this"
puts " script was generated.\n"
puts "\[--help\] Print help information for this script"
puts "-------------------------------------------------------------------------\n"
exit 0
}
if { $::argc > 0 } {
for {set i 0} {$i < $::argc} {incr i} {
set option [string trim [lindex $::argv $i]]
switch -regexp -- $option {
"--origin_dir" { incr i; set origin_dir [lindex $::argv $i] }
"--project_name" { incr i; set _xil_proj_name_ [lindex $::argv $i] }
"--help" { print_help }
default {
if { [regexp {^-} $option] } {
puts "ERROR: Unknown option '$option' specified, please type '$script_file -tclargs --help' for usage info.\n"
return 1
}
}
}
}
}
# Set the directory path for the original project from where this script was exported
set orig_proj_dir "[file normalize "$origin_dir/project"]"
# Create project
create_project ${_xil_proj_name_} ./${_xil_proj_name_} -part xc7z100ffg900-2
# Set the directory path for the new project
set proj_dir [get_property directory [current_project]]
# Set project properties
set obj [current_project]
set_property -name "compxlib.modelsim_compiled_library_dir" -value "C:/Mentor/CompLib/2019.1.3" -objects $obj
set_property -name "corecontainer.enable" -value "1" -objects $obj
set_property -name "default_lib" -value "xil_defaultlib" -objects $obj
set_property -name "dsa.accelerator_binary_content" -value "bitstream" -objects $obj
set_property -name "dsa.accelerator_binary_format" -value "xclbin2" -objects $obj
set_property -name "dsa.description" -value "Vivado generated DSA" -objects $obj
set_property -name "dsa.dr_bd_base_address" -value "0" -objects $obj
set_property -name "dsa.emu_dir" -value "emu" -objects $obj
set_property -name "dsa.flash_interface_type" -value "bpix16" -objects $obj
set_property -name "dsa.flash_offset_address" -value "0" -objects $obj
set_property -name "dsa.flash_size" -value "1024" -objects $obj
set_property -name "dsa.host_architecture" -value "x86_64" -objects $obj
set_property -name "dsa.host_interface" -value "pcie" -objects $obj
set_property -name "dsa.num_compute_units" -value "60" -objects $obj
set_property -name "dsa.platform_state" -value "pre_synth" -objects $obj
set_property -name "dsa.vendor" -value "xilinx" -objects $obj
set_property -name "dsa.version" -value "0.0" -objects $obj
set_property -name "enable_core_container" -value "1" -objects $obj
set_property -name "enable_vhdl_2008" -value "1" -objects $obj
set_property -name "ip_cache_permissions" -value "read write" -objects $obj
set_property -name "ip_output_repo" -value "$proj_dir/${_xil_proj_name_}.cache/ip" -objects $obj
set_property -name "mem.enable_memory_map_generation" -value "1" -objects $obj
set_property -name "part" -value "xc7z100ffg900-2" -objects $obj
set_property -name "sim.central_dir" -value "$proj_dir/${_xil_proj_name_}.ip_user_files" -objects $obj
set_property -name "sim.ip.auto_export_scripts" -value "1" -objects $obj
set_property -name "simulator_language" -value "Mixed" -objects $obj
set_property -name "webtalk.activehdl_export_sim" -value "9" -objects $obj
set_property -name "webtalk.ies_export_sim" -value "9" -objects $obj
set_property -name "webtalk.modelsim_export_sim" -value "9" -objects $obj
set_property -name "webtalk.questa_export_sim" -value "9" -objects $obj
set_property -name "webtalk.riviera_export_sim" -value "9" -objects $obj
set_property -name "webtalk.vcs_export_sim" -value "9" -objects $obj
set_property -name "webtalk.xcelium_export_sim" -value "9" -objects $obj
set_property -name "webtalk.xsim_export_sim" -value "9" -objects $obj
set_property -name "xpm_libraries" -value "XPM_CDC XPM_FIFO XPM_MEMORY" -objects $obj
# Create 'sources_1' fileset (if not found)
if {[string equal [get_filesets -quiet sources_1] ""]} {
create_fileset -srcset sources_1
}
# Set 'sources_1' fileset object
set obj [get_filesets sources_1]
set files [list \
[file normalize "${origin_dir}/ip/vio_rf_control/vio_rf_control.xci"] \
[file normalize "${origin_dir}/ip/vio_manual_ctrl/vio_manual_ctrl.xci"] \
[file normalize "${origin_dir}/ip/ila_ctrl_signal/ila_ctrl_signal.xci"] \
[file normalize "${origin_dir}/ip/ila_tx_rx/ila_tx_rx.xci"] \
[file normalize "${origin_dir}/ip/cmpy_18x8/cmpy_18x8.xci"] \
[file normalize "${origin_dir}/ip/dds_32b_8b/dds_32b_8b.xci"] \
[file normalize "${origin_dir}/ip/hop_rom/hop_rom.xci"] \
[file normalize "${origin_dir}/ip/hrc_64_12_025/hrc_64_12_025.xci"] \
[file normalize "${origin_dir}/ipi-bds/system_bd/system_bd.bd"] \
[file normalize "${origin_dir}/ip/sig_clk_gen/sig_clk_gen.xci"] \
[file normalize "${origin_dir}/rtl/rf_control.v"] \
[file normalize "${origin_dir}/ipi-bds/system_bd/hdl/system_bd_wrapper.v"] \
[file normalize "${origin_dir}/rtl/tx_qpsk.v"] \
[file normalize "${origin_dir}/rtl/system_top.v"] \
[file normalize "${origin_dir}/ip/coe/hrc_64_12_025.coe"] \
[file normalize "${origin_dir}/ip/coe/sweep_freq.coe"] \
]
add_files -norecurse -fileset $obj $files
# Set 'sources_1' fileset file properties for remote files
set file "$origin_dir/ip/vio_rf_control/vio_rf_control.xci"
set file [file normalize $file]
set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]]
set_property -name "generate_files_for_reference" -value "0" -objects $file_obj
set_property -name "registered_with_manager" -value "1" -objects $file_obj
if { ![get_property "is_locked" $file_obj] } {
set_property -name "synth_checkpoint_mode" -value "Singular" -objects $file_obj
}
set file "$origin_dir/ip/vio_manual_ctrl/vio_manual_ctrl.xci"
set file [file normalize $file]
set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]]
set_property -name "generate_files_for_reference" -value "0" -objects $file_obj
set_property -name "registered_with_manager" -value "1" -objects $file_obj
if { ![get_property "is_locked" $file_obj] } {
set_property -name "synth_checkpoint_mode" -value "Singular" -objects $file_obj
}
set file "$origin_dir/ip/ila_ctrl_signal/ila_ctrl_signal.xci"
set file [file normalize $file]
set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]]
set_property -name "generate_files_for_reference" -value "0" -objects $file_obj
set_property -name "registered_with_manager" -value "1" -objects $file_obj
if { ![get_property "is_locked" $file_obj] } {
set_property -name "synth_checkpoint_mode" -value "Singular" -objects $file_obj
}
set file "$origin_dir/ip/ila_tx_rx/ila_tx_rx.xci"
set file [file normalize $file]
set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]]
set_property -name "generate_files_for_reference" -value "0" -objects $file_obj
set_property -name "registered_with_manager" -value "1" -objects $file_obj
if { ![get_property "is_locked" $file_obj] } {
set_property -name "synth_checkpoint_mode" -value "Singular" -objects $file_obj
}
set file "$origin_dir/ip/cmpy_18x8/cmpy_18x8.xci"
set file [file normalize $file]
set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]]
set_property -name "generate_files_for_reference" -value "0" -objects $file_obj
set_property -name "registered_with_manager" -value "1" -objects $file_obj
if { ![get_property "is_locked" $file_obj] } {
set_property -name "synth_checkpoint_mode" -value "Singular" -objects $file_obj
}
set file "$origin_dir/ip/dds_32b_8b/dds_32b_8b.xci"
set file [file normalize $file]
set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]]
set_property -name "generate_files_for_reference" -value "0" -objects $file_obj
set_property -name "registered_with_manager" -value "1" -objects $file_obj
if { ![get_property "is_locked" $file_obj] } {
set_property -name "synth_checkpoint_mode" -value "Singular" -objects $file_obj
}
set file "$origin_dir/ip/hop_rom/hop_rom.xci"
set file [file normalize $file]
set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]]
set_property -name "generate_files_for_reference" -value "0" -objects $file_obj
set_property -name "registered_with_manager" -value "1" -objects $file_obj
if { ![get_property "is_locked" $file_obj] } {
set_property -name "synth_checkpoint_mode" -value "Singular" -objects $file_obj
}
set file "$origin_dir/ip/hrc_64_12_025/hrc_64_12_025.xci"
set file [file normalize $file]
set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]]
set_property -name "generate_files_for_reference" -value "0" -objects $file_obj
set_property -name "registered_with_manager" -value "1" -objects $file_obj
if { ![get_property "is_locked" $file_obj] } {
set_property -name "synth_checkpoint_mode" -value "Singular" -objects $file_obj
}
set file "$origin_dir/ipi-bds/system_bd/system_bd.bd"
set file [file normalize $file]
set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]]
set_property -name "registered_with_manager" -value "1" -objects $file_obj
set file "$origin_dir/ip/sig_clk_gen/sig_clk_gen.xci"
set file [file normalize $file]
set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]]
set_property -name "generate_files_for_reference" -value "0" -objects $file_obj
set_property -name "registered_with_manager" -value "1" -objects $file_obj
if { ![get_property "is_locked" $file_obj] } {
set_property -name "synth_checkpoint_mode" -value "Singular" -objects $file_obj
}
# Set 'sources_1' fileset file properties for local files
# None
# Set 'sources_1' fileset properties
set obj [get_filesets sources_1]
set_property -name "top" -value "system_top" -objects $obj
# Create 'constrs_1' fileset (if not found)
if {[string equal [get_filesets -quiet constrs_1] ""]} {
create_fileset -constrset constrs_1
}
# Set 'constrs_1' fileset object
set obj [get_filesets constrs_1]
# Add/Import constrs file and set constrs file properties
set file "[file normalize "$origin_dir/constraints/z7100_ad9528_ad9371.xdc"]"
set file_added [add_files -norecurse -fileset $obj [list $file]]
set file "$origin_dir/constraints/z7100_ad9528_ad9371.xdc"
set file [file normalize $file]
set file_obj [get_files -of_objects [get_filesets constrs_1] [list "*$file"]]
set_property -name "file_type" -value "XDC" -objects $file_obj
# Set 'constrs_1' fileset properties
set obj [get_filesets constrs_1]
set_property -name "target_part" -value "xc7z100ffg900-2" -objects $obj
# Create 'sim_1' fileset (if not found)
if {[string equal [get_filesets -quiet sim_1] ""]} {
create_fileset -simset sim_1
}
# Set 'sim_1' fileset object
set obj [get_filesets sim_1]
# Empty (no sources present)
# Set 'sim_1' fileset properties
set obj [get_filesets sim_1]
set_property -name "top" -value "system_top" -objects $obj
set_property -name "top_lib" -value "xil_defaultlib" -objects $obj
# Set 'utils_1' fileset object
set obj [get_filesets utils_1]
# Empty (no sources present)
# Set 'utils_1' fileset properties
set obj [get_filesets utils_1]
# Create 'synth_1' run (if not found)
if {[string equal [get_runs -quiet synth_1] ""]} {
create_run -name synth_1 -part xc7z100ffg900-2 -flow {Vivado Synthesis 2019} -strategy "Vivado Synthesis Defaults" -report_strategy {No Reports} -constrset constrs_1
} else {
set_property strategy "Vivado Synthesis Defaults" [get_runs synth_1]
set_property flow "Vivado Synthesis 2019" [get_runs synth_1]
}
set obj [get_runs synth_1]
set_property set_report_strategy_name 1 $obj
set_property report_strategy {Vivado Synthesis Default Reports} $obj
set_property set_report_strategy_name 0 $obj
# Create 'synth_1_synth_report_utilization_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs synth_1] synth_1_synth_report_utilization_0] "" ] } {
create_report_config -report_name synth_1_synth_report_utilization_0 -report_type report_utilization:1.0 -steps synth_design -runs synth_1
}
set obj [get_report_configs -of_objects [get_runs synth_1] synth_1_synth_report_utilization_0]
if { $obj != "" } {
}
set obj [get_runs synth_1]
set_property -name "part" -value "xc7z100ffg900-2" -objects $obj
set_property -name "strategy" -value "Vivado Synthesis Defaults" -objects $obj
# set the current synth run
current_run -synthesis [get_runs synth_1]
# Create 'impl_1' run (if not found)
if {[string equal [get_runs -quiet impl_1] ""]} {
create_run -name impl_1 -part xc7z100ffg900-2 -flow {Vivado Implementation 2019} -strategy "Vivado Implementation Defaults" -report_strategy {No Reports} -constrset constrs_1 -parent_run synth_1
} else {
set_property strategy "Vivado Implementation Defaults" [get_runs impl_1]
set_property flow "Vivado Implementation 2019" [get_runs impl_1]
}
set obj [get_runs impl_1]
set_property set_report_strategy_name 1 $obj
set_property report_strategy {Vivado Implementation Default Reports} $obj
set_property set_report_strategy_name 0 $obj
# Create 'impl_1_init_report_timing_summary_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_init_report_timing_summary_0] "" ] } {
create_report_config -report_name impl_1_init_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps init_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_init_report_timing_summary_0]
if { $obj != "" } {
set_property -name "is_enabled" -value "0" -objects $obj
set_property -name "options.max_paths" -value "10" -objects $obj
}
# Create 'impl_1_opt_report_drc_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_opt_report_drc_0] "" ] } {
create_report_config -report_name impl_1_opt_report_drc_0 -report_type report_drc:1.0 -steps opt_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_opt_report_drc_0]
if { $obj != "" } {
}
# Create 'impl_1_opt_report_timing_summary_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_opt_report_timing_summary_0] "" ] } {
create_report_config -report_name impl_1_opt_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps opt_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_opt_report_timing_summary_0]
if { $obj != "" } {
set_property -name "is_enabled" -value "0" -objects $obj
set_property -name "options.max_paths" -value "10" -objects $obj
}
# Create 'impl_1_power_opt_report_timing_summary_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_power_opt_report_timing_summary_0] "" ] } {
create_report_config -report_name impl_1_power_opt_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps power_opt_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_power_opt_report_timing_summary_0]
if { $obj != "" } {
set_property -name "is_enabled" -value "0" -objects $obj
set_property -name "options.max_paths" -value "10" -objects $obj
}
# Create 'impl_1_place_report_io_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_io_0] "" ] } {
create_report_config -report_name impl_1_place_report_io_0 -report_type report_io:1.0 -steps place_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_io_0]
if { $obj != "" } {
}
# Create 'impl_1_place_report_utilization_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_utilization_0] "" ] } {
create_report_config -report_name impl_1_place_report_utilization_0 -report_type report_utilization:1.0 -steps place_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_utilization_0]
if { $obj != "" } {
}
# Create 'impl_1_place_report_control_sets_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_control_sets_0] "" ] } {
create_report_config -report_name impl_1_place_report_control_sets_0 -report_type report_control_sets:1.0 -steps place_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_control_sets_0]
if { $obj != "" } {
set_property -name "options.verbose" -value "1" -objects $obj
}
# Create 'impl_1_place_report_incremental_reuse_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_incremental_reuse_0] "" ] } {
create_report_config -report_name impl_1_place_report_incremental_reuse_0 -report_type report_incremental_reuse:1.0 -steps place_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_incremental_reuse_0]
if { $obj != "" } {
set_property -name "is_enabled" -value "0" -objects $obj
}
# Create 'impl_1_place_report_incremental_reuse_1' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_incremental_reuse_1] "" ] } {
create_report_config -report_name impl_1_place_report_incremental_reuse_1 -report_type report_incremental_reuse:1.0 -steps place_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_incremental_reuse_1]
if { $obj != "" } {
set_property -name "is_enabled" -value "0" -objects $obj
}
# Create 'impl_1_place_report_timing_summary_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_timing_summary_0] "" ] } {
create_report_config -report_name impl_1_place_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps place_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_timing_summary_0]
if { $obj != "" } {
set_property -name "is_enabled" -value "0" -objects $obj
set_property -name "options.max_paths" -value "10" -objects $obj
}
# Create 'impl_1_post_place_power_opt_report_timing_summary_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_post_place_power_opt_report_timing_summary_0] "" ] } {
create_report_config -report_name impl_1_post_place_power_opt_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps post_place_power_opt_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_post_place_power_opt_report_timing_summary_0]
if { $obj != "" } {
set_property -name "is_enabled" -value "0" -objects $obj
set_property -name "options.max_paths" -value "10" -objects $obj
}
# Create 'impl_1_phys_opt_report_timing_summary_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_phys_opt_report_timing_summary_0] "" ] } {
create_report_config -report_name impl_1_phys_opt_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps phys_opt_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_phys_opt_report_timing_summary_0]
if { $obj != "" } {
set_property -name "is_enabled" -value "0" -objects $obj
set_property -name "options.max_paths" -value "10" -objects $obj
}
# Create 'impl_1_route_report_drc_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_drc_0] "" ] } {
create_report_config -report_name impl_1_route_report_drc_0 -report_type report_drc:1.0 -steps route_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_drc_0]
if { $obj != "" } {
}
# Create 'impl_1_route_report_methodology_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_methodology_0] "" ] } {
create_report_config -report_name impl_1_route_report_methodology_0 -report_type report_methodology:1.0 -steps route_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_methodology_0]
if { $obj != "" } {
}
# Create 'impl_1_route_report_power_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_power_0] "" ] } {
create_report_config -report_name impl_1_route_report_power_0 -report_type report_power:1.0 -steps route_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_power_0]
if { $obj != "" } {
}
# Create 'impl_1_route_report_route_status_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_route_status_0] "" ] } {
create_report_config -report_name impl_1_route_report_route_status_0 -report_type report_route_status:1.0 -steps route_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_route_status_0]
if { $obj != "" } {
}
# Create 'impl_1_route_report_timing_summary_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_timing_summary_0] "" ] } {
create_report_config -report_name impl_1_route_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps route_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_timing_summary_0]
if { $obj != "" } {
set_property -name "options.max_paths" -value "10" -objects $obj
}
# Create 'impl_1_route_report_incremental_reuse_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_incremental_reuse_0] "" ] } {
create_report_config -report_name impl_1_route_report_incremental_reuse_0 -report_type report_incremental_reuse:1.0 -steps route_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_incremental_reuse_0]
if { $obj != "" } {
}
# Create 'impl_1_route_report_clock_utilization_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_clock_utilization_0] "" ] } {
create_report_config -report_name impl_1_route_report_clock_utilization_0 -report_type report_clock_utilization:1.0 -steps route_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_clock_utilization_0]
if { $obj != "" } {
}
# Create 'impl_1_route_report_bus_skew_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_bus_skew_0] "" ] } {
create_report_config -report_name impl_1_route_report_bus_skew_0 -report_type report_bus_skew:1.1 -steps route_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_bus_skew_0]
if { $obj != "" } {
set_property -name "options.warn_on_violation" -value "1" -objects $obj
}
# Create 'impl_1_post_route_phys_opt_report_timing_summary_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_post_route_phys_opt_report_timing_summary_0] "" ] } {
create_report_config -report_name impl_1_post_route_phys_opt_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps post_route_phys_opt_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_post_route_phys_opt_report_timing_summary_0]
if { $obj != "" } {
set_property -name "options.max_paths" -value "10" -objects $obj
set_property -name "options.warn_on_violation" -value "1" -objects $obj
}
# Create 'impl_1_post_route_phys_opt_report_bus_skew_0' report (if not found)
if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_post_route_phys_opt_report_bus_skew_0] "" ] } {
create_report_config -report_name impl_1_post_route_phys_opt_report_bus_skew_0 -report_type report_bus_skew:1.1 -steps post_route_phys_opt_design -runs impl_1
}
set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_post_route_phys_opt_report_bus_skew_0]
if { $obj != "" } {
set_property -name "options.warn_on_violation" -value "1" -objects $obj
}
set obj [get_runs impl_1]
set_property -name "part" -value "xc7z100ffg900-2" -objects $obj
set_property -name "strategy" -value "Vivado Implementation Defaults" -objects $obj
set_property -name "steps.write_bitstream.args.readback_file" -value "0" -objects $obj
set_property -name "steps.write_bitstream.args.verbose" -value "0" -objects $obj
# set the current impl run
current_run -implementation [get_runs impl_1]
puts "INFO: Project created:${_xil_proj_name_}"
# Create 'drc_1' gadget (if not found)
if {[string equal [get_dashboard_gadgets [ list "drc_1" ] ] ""]} {
create_dashboard_gadget -name {drc_1} -type drc
}
set obj [get_dashboard_gadgets [ list "drc_1" ] ]
set_property -name "reports" -value "impl_1#impl_1_route_report_drc_0" -objects $obj
# Create 'methodology_1' gadget (if not found)
if {[string equal [get_dashboard_gadgets [ list "methodology_1" ] ] ""]} {
create_dashboard_gadget -name {methodology_1} -type methodology
}
set obj [get_dashboard_gadgets [ list "methodology_1" ] ]
set_property -name "reports" -value "impl_1#impl_1_route_report_methodology_0" -objects $obj
# Create 'power_1' gadget (if not found)
if {[string equal [get_dashboard_gadgets [ list "power_1" ] ] ""]} {
create_dashboard_gadget -name {power_1} -type power
}
set obj [get_dashboard_gadgets [ list "power_1" ] ]
set_property -name "reports" -value "impl_1#impl_1_route_report_power_0" -objects $obj
# Create 'timing_1' gadget (if not found)
if {[string equal [get_dashboard_gadgets [ list "timing_1" ] ] ""]} {
create_dashboard_gadget -name {timing_1} -type timing
}
set obj [get_dashboard_gadgets [ list "timing_1" ] ]
set_property -name "reports" -value "impl_1#impl_1_route_report_timing_summary_0" -objects $obj
# Create 'utilization_1' gadget (if not found)
if {[string equal [get_dashboard_gadgets [ list "utilization_1" ] ] ""]} {
create_dashboard_gadget -name {utilization_1} -type utilization
}
set obj [get_dashboard_gadgets [ list "utilization_1" ] ]
set_property -name "reports" -value "synth_1#synth_1_synth_report_utilization_0" -objects $obj
set_property -name "run.step" -value "synth_design" -objects $obj
set_property -name "run.type" -value "synthesis" -objects $obj
# Create 'utilization_2' gadget (if not found)
if {[string equal [get_dashboard_gadgets [ list "utilization_2" ] ] ""]} {
create_dashboard_gadget -name {utilization_2} -type utilization
}
set obj [get_dashboard_gadgets [ list "utilization_2" ] ]
set_property -name "reports" -value "impl_1#impl_1_place_report_utilization_0" -objects $obj
move_dashboard_gadget -name {utilization_1} -row 0 -col 0
move_dashboard_gadget -name {power_1} -row 1 -col 0
move_dashboard_gadget -name {drc_1} -row 2 -col 0
move_dashboard_gadget -name {timing_1} -row 0 -col 1
move_dashboard_gadget -name {utilization_2} -row 1 -col 1
move_dashboard_gadget -name {methodology_1} -row 2 -col 1
Binary file not shown.
@@ -0,0 +1,771 @@
RADIX = 10;
COEFDATA =
-47,
-30,
-13,
4,
21,
38,
56,
73,
89,
106,
122,
138,
153,
168,
182,
196,
209,
221,
232,
243,
252,
261,
268,
275,
281,
285,
289,
291,
292,
292,
291,
288,
285,
280,
274,
267,
259,
249,
239,
228,
215,
202,
187,
172,
156,
139,
122,
104,
85,
66,
46,
26,
5,
-15,
-36,
-56,
-77,
-98,
-118,
-138,
-158,
-177,
-195,
-213,
-231,
-247,
-263,
-277,
-291,
-303,
-314,
-325,
-333,
-341,
-347,
-351,
-354,
-356,
-356,
-354,
-351,
-346,
-340,
-332,
-322,
-311,
-298,
-284,
-268,
-250,
-231,
-211,
-189,
-166,
-142,
-117,
-90,
-63,
-35,
-6,
24,
54,
85,
116,
147,
179,
210,
242,
273,
304,
334,
363,
392,
420,
447,
473,
497,
520,
542,
562,
580,
596,
611,
623,
633,
641,
647,
650,
650,
649,
644,
637,
627,
615,
600,
582,
562,
538,
513,
484,
453,
419,
383,
345,
304,
261,
216,
169,
119,
69,
16,
-38,
-93,
-150,
-207,
-265,
-324,
-383,
-443,
-502,
-562,
-621,
-679,
-736,
-793,
-848,
-902,
-954,
-1004,
-1052,
-1097,
-1140,
-1181,
-1218,
-1252,
-1283,
-1310,
-1333,
-1353,
-1369,
-1380,
-1387,
-1389,
-1387,
-1381,
-1369,
-1353,
-1332,
-1306,
-1274,
-1238,
-1197,
-1151,
-1100,
-1044,
-983,
-918,
-848,
-773,
-694,
-611,
-524,
-432,
-337,
-239,
-137,
-33,
74,
184,
296,
410,
525,
642,
759,
877,
995,
1113,
1230,
1346,
1461,
1575,
1686,
1794,
1900,
2002,
2101,
2195,
2285,
2371,
2451,
2525,
2593,
2655,
2711,
2759,
2800,
2833,
2859,
2876,
2885,
2886,
2877,
2860,
2833,
2798,
2752,
2698,
2633,
2559,
2476,
2382,
2280,
2168,
2046,
1915,
1775,
1627,
1469,
1304,
1130,
948,
759,
563,
360,
151,
-64,
-284,
-509,
-739,
-972,
-1208,
-1447,
-1687,
-1929,
-2172,
-2414,
-2656,
-2896,
-3133,
-3368,
-3600,
-3826,
-4048,
-4263,
-4472,
-4673,
-4866,
-5050,
-5224,
-5387,
-5539,
-5679,
-5807,
-5920,
-6020,
-6104,
-6173,
-6226,
-6262,
-6281,
-6282,
-6264,
-6228,
-6171,
-6096,
-5999,
-5882,
-5745,
-5585,
-5405,
-5203,
-4978,
-4732,
-4464,
-4174,
-3861,
-3527,
-3170,
-2792,
-2392,
-1971,
-1529,
-1066,
-582,
-79,
444,
985,
1545,
2123,
2717,
3328,
3955,
4597,
5253,
5921,
6603,
7295,
7998,
8711,
9432,
10160,
10895,
11635,
12379,
13126,
13875,
14624,
15374,
16121,
16866,
17607,
18342,
19071,
19793,
20505,
21208,
21900,
22579,
23245,
23896,
24532,
25151,
25752,
26334,
26896,
27438,
27957,
28455,
28928,
29377,
29801,
30200,
30571,
30915,
31232,
31520,
31779,
32009,
32209,
32379,
32518,
32627,
32704,
32751,
32767,
32751,
32704,
32627,
32518,
32379,
32209,
32009,
31779,
31520,
31232,
30915,
30571,
30200,
29801,
29377,
28928,
28455,
27957,
27438,
26896,
26334,
25752,
25151,
24532,
23896,
23245,
22579,
21900,
21208,
20505,
19793,
19071,
18342,
17607,
16866,
16121,
15374,
14624,
13875,
13126,
12379,
11635,
10895,
10160,
9432,
8711,
7998,
7295,
6603,
5921,
5253,
4597,
3955,
3328,
2717,
2123,
1545,
985,
444,
-79,
-582,
-1066,
-1529,
-1971,
-2392,
-2792,
-3170,
-3527,
-3861,
-4174,
-4464,
-4732,
-4978,
-5203,
-5405,
-5585,
-5745,
-5882,
-5999,
-6096,
-6171,
-6228,
-6264,
-6282,
-6281,
-6262,
-6226,
-6173,
-6104,
-6020,
-5920,
-5807,
-5679,
-5539,
-5387,
-5224,
-5050,
-4866,
-4673,
-4472,
-4263,
-4048,
-3826,
-3600,
-3368,
-3133,
-2896,
-2656,
-2414,
-2172,
-1929,
-1687,
-1447,
-1208,
-972,
-739,
-509,
-284,
-64,
151,
360,
563,
759,
948,
1130,
1304,
1469,
1627,
1775,
1915,
2046,
2168,
2280,
2382,
2476,
2559,
2633,
2698,
2752,
2798,
2833,
2860,
2877,
2886,
2885,
2876,
2859,
2833,
2800,
2759,
2711,
2655,
2593,
2525,
2451,
2371,
2285,
2195,
2101,
2002,
1900,
1794,
1686,
1575,
1461,
1346,
1230,
1113,
995,
877,
759,
642,
525,
410,
296,
184,
74,
-33,
-137,
-239,
-337,
-432,
-524,
-611,
-694,
-773,
-848,
-918,
-983,
-1044,
-1100,
-1151,
-1197,
-1238,
-1274,
-1306,
-1332,
-1353,
-1369,
-1381,
-1387,
-1389,
-1387,
-1380,
-1369,
-1353,
-1333,
-1310,
-1283,
-1252,
-1218,
-1181,
-1140,
-1097,
-1052,
-1004,
-954,
-902,
-848,
-793,
-736,
-679,
-621,
-562,
-502,
-443,
-383,
-324,
-265,
-207,
-150,
-93,
-38,
16,
69,
119,
169,
216,
261,
304,
345,
383,
419,
453,
484,
513,
538,
562,
582,
600,
615,
627,
637,
644,
649,
650,
650,
647,
641,
633,
623,
611,
596,
580,
562,
542,
520,
497,
473,
447,
420,
392,
363,
334,
304,
273,
242,
210,
179,
147,
116,
85,
54,
24,
-6,
-35,
-63,
-90,
-117,
-142,
-166,
-189,
-211,
-231,
-250,
-268,
-284,
-298,
-311,
-322,
-332,
-340,
-346,
-351,
-354,
-356,
-356,
-354,
-351,
-347,
-341,
-333,
-325,
-314,
-303,
-291,
-277,
-263,
-247,
-231,
-213,
-195,
-177,
-158,
-138,
-118,
-98,
-77,
-56,
-36,
-15,
5,
26,
46,
66,
85,
104,
122,
139,
156,
172,
187,
202,
215,
228,
239,
249,
259,
267,
274,
280,
285,
288,
291,
292,
292,
291,
289,
285,
281,
275,
268,
261,
252,
243,
232,
221,
209,
196,
182,
168,
153,
138,
122,
106,
89,
73,
56,
38,
21,
4,
-13,
-30,
-47;
@@ -0,0 +1,258 @@
MEMORY_INITIALIZATION_RADIX = 10;
MEMORY_INITIALIZATION_VECTOR =
-2147483647,
-2130640638,
-2113797629,
-2096954620,
-2080111611,
-2063268602,
-2046425593,
-2029582584,
-2012739575,
-1995896566,
-1979053557,
-1962210548,
-1945367539,
-1928524530,
-1911681521,
-1894838512,
-1877995503,
-1861152494,
-1844309485,
-1827466476,
-1810623467,
-1793780458,
-1776937449,
-1760094440,
-1743251431,
-1726408422,
-1709565413,
-1692722404,
-1675879395,
-1659036386,
-1642193377,
-1625350368,
-1608507359,
-1591664350,
-1574821341,
-1557978332,
-1541135323,
-1524292314,
-1507449305,
-1490606296,
-1473763287,
-1456920278,
-1440077269,
-1423234260,
-1406391251,
-1389548242,
-1372705233,
-1355862224,
-1339019215,
-1322176206,
-1305333197,
-1288490188,
-1271647179,
-1254804170,
-1237961161,
-1221118152,
-1204275143,
-1187432134,
-1170589125,
-1153746116,
-1136903107,
-1120060098,
-1103217089,
-1086374080,
-1069531071,
-1052688062,
-1035845053,
-1019002044,
-1002159035,
-985316026,
-968473017,
-951630008,
-934786999,
-917943990,
-901100981,
-884257972,
-867414963,
-850571954,
-833728945,
-816885936,
-800042927,
-783199918,
-766356909,
-749513900,
-732670891,
-715827882,
-698984873,
-682141864,
-665298855,
-648455846,
-631612837,
-614769828,
-597926819,
-581083810,
-564240801,
-547397792,
-530554783,
-513711774,
-496868765,
-480025756,
-463182747,
-446339738,
-429496729,
-412653720,
-395810711,
-378967702,
-362124693,
-345281684,
-328438675,
-311595666,
-294752657,
-277909648,
-261066639,
-244223630,
-227380621,
-210537612,
-193694603,
-176851594,
-160008585,
-143165576,
-126322567,
-109479558,
-92636549,
-75793540,
-58950531,
-42107522,
-25264513,
-8421504,
8421504,
25264513,
42107522,
58950531,
75793540,
92636549,
109479558,
126322567,
143165576,
160008585,
176851594,
193694603,
210537612,
227380621,
244223630,
261066639,
277909648,
294752657,
311595666,
328438675,
345281684,
362124693,
378967702,
395810711,
412653720,
429496729,
446339738,
463182747,
480025756,
496868765,
513711774,
530554783,
547397792,
564240801,
581083810,
597926819,
614769828,
631612837,
648455846,
665298855,
682141864,
698984873,
715827882,
732670891,
749513900,
766356909,
783199918,
800042927,
816885936,
833728945,
850571954,
867414963,
884257972,
901100981,
917943990,
934786999,
951630008,
968473017,
985316026,
1002159035,
1019002044,
1035845053,
1052688062,
1069531071,
1086374080,
1103217089,
1120060098,
1136903107,
1153746116,
1170589125,
1187432134,
1204275143,
1221118152,
1237961161,
1254804170,
1271647179,
1288490188,
1305333197,
1322176206,
1339019215,
1355862224,
1372705233,
1389548242,
1406391251,
1423234260,
1440077269,
1456920278,
1473763287,
1490606296,
1507449305,
1524292314,
1541135323,
1557978332,
1574821341,
1591664350,
1608507359,
1625350368,
1642193377,
1659036386,
1675879395,
1692722404,
1709565413,
1726408422,
1743251431,
1760094440,
1776937449,
1793780458,
1810623467,
1827466476,
1844309485,
1861152494,
1877995503,
1894838512,
1911681521,
1928524530,
1945367539,
1962210548,
1979053557,
1995896566,
2012739575,
2029582584,
2046425593,
2063268602,
2080111611,
2096954620,
2113797629,
2130640638,
2147483647;
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
The files in this directory structure are automatically generated and managed by Vivado. Editing these files is not recommended.
@@ -0,0 +1,71 @@
// (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
// DO NOT MODIFY THIS FILE.
// IP VLNV: xilinx.com:ip:cmpy:6.0
// IP Revision: 17
// The following must be inserted into your Verilog file for this
// core to be instantiated. Change the instance name and port connections
// (in parentheses) to your own signal names.
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
cmpy_18x8 your_instance_name (
.aclk(aclk), // input wire aclk
.s_axis_a_tvalid(s_axis_a_tvalid), // input wire s_axis_a_tvalid
.s_axis_a_tdata(s_axis_a_tdata), // input wire [47 : 0] s_axis_a_tdata
.s_axis_b_tvalid(s_axis_b_tvalid), // input wire s_axis_b_tvalid
.s_axis_b_tdata(s_axis_b_tdata), // input wire [15 : 0] s_axis_b_tdata
.m_axis_dout_tvalid(m_axis_dout_tvalid), // output wire m_axis_dout_tvalid
.m_axis_dout_tdata(m_axis_dout_tdata) // output wire [63 : 0] m_axis_dout_tdata
);
// INST_TAG_END ------ End INSTANTIATION Template ---------
// You must compile the wrapper file cmpy_18x8.v when simulating
// the core, cmpy_18x8. When compiling the wrapper file, be sure to
// reference the Verilog simulation library.
@@ -0,0 +1,87 @@
-- (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
--
-- This file contains confidential and proprietary information
-- of Xilinx, Inc. and is protected under U.S. and
-- international copyright and other intellectual property
-- laws.
--
-- DISCLAIMER
-- This disclaimer is not a license and does not grant any
-- rights to the materials distributed herewith. Except as
-- otherwise provided in a valid license issued to you by
-- Xilinx, and to the maximum extent permitted by applicable
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
-- (2) Xilinx shall not be liable (whether in contract or tort,
-- including negligence, or under any other theory of
-- liability) for any loss or damage of any kind or nature
-- related to, arising under or in connection with these
-- materials, including for any direct, or any indirect,
-- special, incidental, or consequential loss or damage
-- (including loss of data, profits, goodwill, or any type of
-- loss or damage suffered as a result of any action brought
-- by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the
-- possibility of the same.
--
-- CRITICAL APPLICATIONS
-- Xilinx products are not designed or intended to be fail-
-- safe, or for use in any application requiring fail-safe
-- performance, such as life-support or safety devices or
-- systems, Class III medical devices, nuclear facilities,
-- applications related to the deployment of airbags, or any
-- other applications that could lead to death, personal
-- injury, or severe property or environmental damage
-- (individually and collectively, "Critical
-- Applications"). Customer assumes the sole risk and
-- liability of any use of Xilinx products in Critical
-- Applications, subject only to applicable laws and
-- regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
-- PART OF THIS FILE AT ALL TIMES.
--
-- DO NOT MODIFY THIS FILE.
-- IP VLNV: xilinx.com:ip:cmpy:6.0
-- IP Revision: 17
-- The following code must appear in the VHDL architecture header.
------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
COMPONENT cmpy_18x8
PORT (
aclk : IN STD_LOGIC;
s_axis_a_tvalid : IN STD_LOGIC;
s_axis_a_tdata : IN STD_LOGIC_VECTOR(47 DOWNTO 0);
s_axis_b_tvalid : IN STD_LOGIC;
s_axis_b_tdata : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
m_axis_dout_tvalid : OUT STD_LOGIC;
m_axis_dout_tdata : OUT STD_LOGIC_VECTOR(63 DOWNTO 0)
);
END COMPONENT;
-- COMP_TAG_END ------ End COMPONENT Declaration ------------
-- The following code must appear in the VHDL architecture
-- body. Substitute your own instance name and net names.
------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
your_instance_name : cmpy_18x8
PORT MAP (
aclk => aclk,
s_axis_a_tvalid => s_axis_a_tvalid,
s_axis_a_tdata => s_axis_a_tdata,
s_axis_b_tvalid => s_axis_b_tvalid,
s_axis_b_tdata => s_axis_b_tdata,
m_axis_dout_tvalid => m_axis_dout_tvalid,
m_axis_dout_tdata => m_axis_dout_tdata
);
-- INST_TAG_END ------ End INSTANTIATION Template ---------
-- You must compile the wrapper file cmpy_18x8.vhd when simulating
-- the core, cmpy_18x8. When compiling the wrapper file, be sure to
-- reference the VHDL simulation library.
@@ -0,0 +1,27 @@
// Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
// --------------------------------------------------------------------------------
// Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
// Date : Fri Mar 17 22:22:44 2023
// Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
// Command : write_verilog -force -mode synth_stub
// D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/cmpy_18x8_synth_1/cmpy_18x8_stub.v
// Design : cmpy_18x8
// Purpose : Stub declaration of top-level module interface
// Device : xc7z100ffg900-2
// --------------------------------------------------------------------------------
// This empty module with port declaration file causes synthesis tools to infer a black box for IP.
// The synthesis directives are for Synopsys Synplify support to prevent IO buffer insertion.
// Please paste the declaration into a Verilog source file or add the file as an additional source.
(* x_core_info = "cmpy_v6_0_17,Vivado 2019.1.3" *)
module cmpy_18x8(aclk, s_axis_a_tvalid, s_axis_a_tdata,
s_axis_b_tvalid, s_axis_b_tdata, m_axis_dout_tvalid, m_axis_dout_tdata)
/* synthesis syn_black_box black_box_pad_pin="aclk,s_axis_a_tvalid,s_axis_a_tdata[47:0],s_axis_b_tvalid,s_axis_b_tdata[15:0],m_axis_dout_tvalid,m_axis_dout_tdata[63:0]" */;
input aclk;
input s_axis_a_tvalid;
input [47:0]s_axis_a_tdata;
input s_axis_b_tvalid;
input [15:0]s_axis_b_tdata;
output m_axis_dout_tvalid;
output [63:0]m_axis_dout_tdata;
endmodule
@@ -0,0 +1,36 @@
-- Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
-- --------------------------------------------------------------------------------
-- Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
-- Date : Fri Mar 17 22:22:44 2023
-- Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
-- Command : write_vhdl -force -mode synth_stub
-- D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/cmpy_18x8_synth_1/cmpy_18x8_stub.vhdl
-- Design : cmpy_18x8
-- Purpose : Stub declaration of top-level module interface
-- Device : xc7z100ffg900-2
-- --------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity cmpy_18x8 is
Port (
aclk : in STD_LOGIC;
s_axis_a_tvalid : in STD_LOGIC;
s_axis_a_tdata : in STD_LOGIC_VECTOR ( 47 downto 0 );
s_axis_b_tvalid : in STD_LOGIC;
s_axis_b_tdata : in STD_LOGIC_VECTOR ( 15 downto 0 );
m_axis_dout_tvalid : out STD_LOGIC;
m_axis_dout_tdata : out STD_LOGIC_VECTOR ( 63 downto 0 )
);
end cmpy_18x8;
architecture stub of cmpy_18x8 is
attribute syn_black_box : boolean;
attribute black_box_pad_pin : string;
attribute syn_black_box of stub : architecture is true;
attribute black_box_pad_pin of stub : architecture is "aclk,s_axis_a_tvalid,s_axis_a_tdata[47:0],s_axis_b_tvalid,s_axis_b_tdata[15:0],m_axis_dout_tvalid,m_axis_dout_tdata[63:0]";
attribute x_core_info : string;
attribute x_core_info of stub : architecture is "cmpy_v6_0_17,Vivado 2019.1.3";
begin
end;
@@ -0,0 +1,387 @@
--------------------------------------------------------------------------------
-- (c) Copyright 2011 - 2013 Xilinx, Inc. All rights reserved.
--
-- This file contains confidential and proprietary information
-- of Xilinx, Inc. and is protected under U.S. and
-- international copyright and other intellectual property
-- laws.
--
-- DISCLAIMER
-- This disclaimer is not a license and does not grant any
-- rights to the materials distributed herewith. Except as
-- otherwise provided in a valid license issued to you by
-- Xilinx, and to the maximum extent permitted by applicable
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
-- (2) Xilinx shall not be liable (whether in contract or tort,
-- including negligence, or under any other theory of
-- liability) for any loss or damage of any kind or nature
-- related to, arising under or in connection with these
-- materials, including for any direct, or any indirect,
-- special, incidental, or consequential loss or damage
-- (including loss of data, profits, goodwill, or any type of
-- loss or damage suffered as a result of any action brought
-- by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the
-- possibility of the same.
--
-- CRITICAL APPLICATIONS
-- Xilinx products are not designed or intended to be fail-
-- safe, or for use in any application requiring fail-safe
-- performance, such as life-support or safety devices or
-- systems, Class III medical devices, nuclear facilities,
-- applications related to the deployment of airbags, or any
-- other applications that could lead to death, personal
-- injury, or severe property or environmental damage
-- (individually and collectively, "Critical
-- Applications"). Customer assumes the sole risk and
-- liability of any use of Xilinx products in Critical
-- Applications, subject only to applicable laws and
-- regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
-- PART OF THIS FILE AT ALL TIMES.
--------------------------------------------------------------------------------
-- Description:
-- This is an example testbench for the Complex Multiplier IP core.
-- The testbench has been generated by Vivado to accompany the IP core
-- instance you have generated.
--
-- This testbench is for demonstration purposes only. See note below for
-- instructions on how to use it with your core.
--
-- See the Complex Multiplier product guide for further information
-- about this core.
--
--------------------------------------------------------------------------------
-- Using this testbench
--
-- This testbench instantiates your generated Complex Multiplier core
-- instance named "cmpy_18x8".
--
-- Use Vivado's Run Simulation flow to run this testbench. See the Vivado
-- documentation for details.
--------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.math_real.all;
entity tb_cmpy_18x8 is
end tb_cmpy_18x8;
architecture tb of tb_cmpy_18x8 is
-----------------------------------------------------------------------
-- Timing constants
-----------------------------------------------------------------------
constant CLOCK_PERIOD : time := 100 ns;
constant T_HOLD : time := 10 ns;
constant T_STROBE : time := CLOCK_PERIOD - (1 ns);
constant TEST_CYCLES : integer := 3000;
constant PHASE_CYCLES : integer := 1000;
-----------------------------------------------------------------------
-- DUT input signals
-----------------------------------------------------------------------
-- General inputs
signal aclk : std_logic := '0'; -- the master clock
-- Slave channel A inputs
signal s_axis_a_tvalid : std_logic := '0'; -- TVALID for channel A
signal s_axis_a_tdata : std_logic_vector(47 downto 0) := (others => '0'); -- TDATA for channel A
-- Slave channel B inputs
signal s_axis_b_tvalid : std_logic := '0'; -- TVALID for channel B
signal s_axis_b_tdata : std_logic_vector(15 downto 0) := (others => '0'); -- TDATA for channel B
-----------------------------------------------------------------------
-- DUT output signals
-----------------------------------------------------------------------
-- Master channel DOUT outputs
signal m_axis_dout_tvalid : std_logic := '0'; -- TVALID for channel DOUT
signal m_axis_dout_tdata : std_logic_vector(63 downto 0) := (others => '0'); -- TDATA for channel DOUT
-----------------------------------------------------------------------
-- Aliases for AXI channel TDATA fields
-- These are a convenience for viewing data in a simulator waveform viewer.
-- If using ModelSim or Questa, add "-voptargs=+acc=n" to the vsim command
-- to prevent the simulator optimizing away these signals.
-----------------------------------------------------------------------
signal s_axis_a_tdata_real : std_logic_vector(17 downto 0) := (others => '0');
signal s_axis_a_tdata_imag : std_logic_vector(17 downto 0) := (others => '0');
signal s_axis_b_tdata_real : std_logic_vector(7 downto 0) := (others => '0');
signal s_axis_b_tdata_imag : std_logic_vector(7 downto 0) := (others => '0');
signal m_axis_dout_tdata_real : std_logic_vector(26 downto 0) := (others => '0');
signal m_axis_dout_tdata_imag : std_logic_vector(26 downto 0) := (others => '0');
-----------------------------------------------------------------------
-- Testbench signals
-----------------------------------------------------------------------
signal cycles : integer := 0; -- Clock cycle counter
-----------------------------------------------------------------------
-- Constants, types and functions to create input data
-- Treat the complex multiplier as a mixer that is combining two
-- sinusoids exp(+/-jwt) of different frequencies and amplitudes:
-- channel A: exp(+jwt), frequency = clock / 30, amplitude = fullscale >> 3
-- channel B: exp(-jwt), frequency = clock / 32, amplitude = fullscale
-- The output of the complex multiplier is a sinusoid with a frequency
-- equal to the difference between the input frequencies.
-----------------------------------------------------------------------
constant IP_A_DEPTH : integer := 30;
constant IP_A_WIDTH : integer := 18;
constant IP_A_SHIFT : integer := 3; -- bit shift for amplitude
constant IP_B_DEPTH : integer := 32;
constant IP_B_WIDTH : integer := 8;
constant IP_B_SHIFT : integer := 0; -- no bit shift, max amplitude
type T_IP_INT_ENTRY is record
re : integer;
im : integer;
end record;
type T_IP_A_ENTRY is record
re : std_logic_vector(IP_A_WIDTH-1 downto 0);
im : std_logic_vector(IP_A_WIDTH-1 downto 0);
end record;
type T_IP_B_ENTRY is record
re : std_logic_vector(IP_B_WIDTH-1 downto 0);
im : std_logic_vector(IP_B_WIDTH-1 downto 0);
end record;
type T_IP_A_TABLE is array (0 to IP_A_DEPTH-1) of T_IP_A_ENTRY;
type T_IP_B_TABLE is array (0 to IP_B_DEPTH-1) of T_IP_B_ENTRY;
-- Common function to calculate sine and cosine values
function create_ip_entry(index, depth, width : integer) return T_IP_INT_ENTRY is
variable result : T_IP_INT_ENTRY;
variable theta : real;
variable limited_width : integer := width - 2;
begin
if limited_width > 30 then
limited_width := 30;
end if;
theta := real(index) / real(depth) * 2.0 * MATH_PI;
result.re := integer(round(cos(theta) * real(2**limited_width-1)));
result.im := integer(round(sin(theta) * real(2**limited_width-1)));
return result;
end function create_ip_entry;
-- Use separate functions to calculate channel A and B sinusoids as they return different types
function create_ip_a_table return T_IP_A_TABLE is
variable result : T_IP_A_TABLE;
variable entry_int : T_IP_INT_ENTRY;
begin
for i in 0 to IP_A_DEPTH-1 loop
entry_int := create_ip_entry(i, IP_A_DEPTH, IP_A_WIDTH - IP_A_SHIFT);
result(i).re := std_logic_vector(to_signed(entry_int.re, IP_A_WIDTH));
result(i).im := std_logic_vector(to_signed(entry_int.im, IP_A_WIDTH));
end loop;
return result;
end function create_ip_a_table;
function create_ip_b_table return T_IP_B_TABLE is
variable result : T_IP_B_TABLE;
variable entry_int : T_IP_INT_ENTRY;
begin
for i in 0 to IP_B_DEPTH-1 loop
entry_int := create_ip_entry(IP_B_DEPTH-1-i, IP_B_DEPTH, IP_B_WIDTH - IP_B_SHIFT); -- note rotation direction
result(i).re := std_logic_vector(to_signed(entry_int.re, IP_B_WIDTH));
result(i).im := std_logic_vector(to_signed(entry_int.im, IP_B_WIDTH));
end loop;
return result;
end function create_ip_b_table;
-- Call the functions to create the data
constant IP_A_DATA : T_IP_A_TABLE := create_ip_a_table;
constant IP_B_DATA : T_IP_B_TABLE := create_ip_b_table;
begin
-----------------------------------------------------------------------
-- Instantiate the DUT
-----------------------------------------------------------------------
dut : entity work.cmpy_18x8
port map (
aclk => aclk,
s_axis_a_tvalid => s_axis_a_tvalid,
s_axis_a_tdata => s_axis_a_tdata,
s_axis_b_tvalid => s_axis_b_tvalid,
s_axis_b_tdata => s_axis_b_tdata,
m_axis_dout_tvalid => m_axis_dout_tvalid,
m_axis_dout_tdata => m_axis_dout_tdata
);
-----------------------------------------------------------------------
-- Generate clock
-----------------------------------------------------------------------
clock_gen : process
begin
aclk <= '0';
wait for CLOCK_PERIOD;
loop
cycles <= cycles + 1;
aclk <= '0';
wait for CLOCK_PERIOD/2;
aclk <= '1';
wait for CLOCK_PERIOD/2;
if cycles >= TEST_CYCLES then
report "Not a real failure. Simulation finished successfully. Test completed successfully" severity failure;
wait;
end if;
end loop;
end process clock_gen;
-----------------------------------------------------------------------
-- Generate inputs
-----------------------------------------------------------------------
stimuli : process
variable ip_a_index : integer := 0;
variable ip_b_index : integer := 0;
variable a_tvalid_nxt : std_logic := '0';
variable b_tvalid_nxt : std_logic := '0';
variable phase2_cycles : integer := 1;
variable phase2_count : integer := 0;
constant PHASE2_LIMIT : integer := 30;
begin
-- Test is stopped in clock_gen process, use endless loop here
loop
-- Drive inputs T_HOLD time after rising edge of clock
wait until rising_edge(aclk);
wait for T_HOLD;
-- Drive AXI TVALID signals to demonstrate different types of operation
case cycles is -- do different types of operation at different phases of the test
when 0 to PHASE_CYCLES * 1 - 1 =>
-- Phase 1: inputs always valid, no missing input data
a_tvalid_nxt := '1';
b_tvalid_nxt := '1';
when PHASE_CYCLES * 1 to PHASE_CYCLES * 2 - 1 =>
-- Phase 2: deprive channel A of valid transactions at an increasing rate
b_tvalid_nxt := '1';
if phase2_count < phase2_cycles then
a_tvalid_nxt := '0';
else
a_tvalid_nxt := '1';
end if;
phase2_count := phase2_count + 1;
if phase2_count >= PHASE2_LIMIT then
phase2_count := 0;
phase2_cycles := phase2_cycles + 1;
end if;
when PHASE_CYCLES * 2 to PHASE_CYCLES * 3 - 1 =>
-- Phase 3: deprive channel A of 1 out of 2 transactions, and channel B of 1 out of 3 transactions
if cycles mod 2 = 0 then
a_tvalid_nxt := '0';
else
a_tvalid_nxt := '1';
end if;
if cycles mod 3 = 0 then
b_tvalid_nxt := '0';
else
b_tvalid_nxt := '1';
end if;
when others =>
-- Test will stop imminently - do nothing
null;
end case;
-- Drive handshake signals with local variable values
s_axis_a_tvalid <= a_tvalid_nxt;
s_axis_b_tvalid <= b_tvalid_nxt;
-- Drive AXI slave channel A payload
-- Drive '0's on payload signals when not valid
if a_tvalid_nxt /= '1' then
s_axis_a_tdata <= (others => '0');
else
-- TDATA: Real and imaginary components are each 18 bits wide and byte-aligned at their LSBs
s_axis_a_tdata(17 downto 0) <= IP_A_DATA(ip_a_index).re;
s_axis_a_tdata(23 downto 18) <= (others => IP_A_DATA(ip_a_index).re(17)); -- sign-extend;
s_axis_a_tdata(41 downto 24) <= IP_A_DATA(ip_a_index).im;
s_axis_a_tdata(47 downto 42) <= (others => IP_A_DATA(ip_a_index).im(17)); -- sign-extend;
end if;
-- Drive AXI slave channel B payload
-- Drive '0's on payload signals when not valid
if b_tvalid_nxt /= '1' then
s_axis_b_tdata <= (others => '0');
else
-- TDATA: Real and imaginary components are each 8 bits wide and byte-aligned at their LSBs
s_axis_b_tdata(7 downto 0) <= IP_B_DATA(ip_b_index).re;
s_axis_b_tdata(15 downto 8) <= IP_B_DATA(ip_b_index).im;
end if;
-- Increment input data indices
if a_tvalid_nxt = '1' then
ip_a_index := ip_a_index + 1;
if ip_a_index = IP_A_DEPTH then
ip_a_index := 0;
end if;
end if;
if b_tvalid_nxt = '1' then
ip_b_index := ip_b_index + 1;
if ip_b_index = IP_B_DEPTH then
ip_b_index := 0;
end if;
end if;
end loop;
end process stimuli;
-----------------------------------------------------------------------
-- Check outputs
-----------------------------------------------------------------------
check_outputs : process
variable check_ok : boolean := true;
begin
-- Check outputs T_STROBE time after rising edge of clock
wait until rising_edge(aclk);
wait for T_STROBE;
-- Do not check the output payload values, as this requires the behavioral model
-- which would make this demonstration testbench unwieldy.
-- Instead, check the protocol of the DOUT channel:
-- check that the payload is valid (not X) when TVALID is high
if m_axis_dout_tvalid = '1' then
if is_x(m_axis_dout_tdata) then
report "ERROR: m_axis_dout_tdata is invalid when m_axis_dout_tvalid is high" severity error;
check_ok := false;
end if;
end if;
assert check_ok
report "ERROR: terminating test with failures." severity failure;
end process check_outputs;
-----------------------------------------------------------------------
-- Assign TDATA fields to aliases, for easy simulator waveform viewing
-----------------------------------------------------------------------
s_axis_a_tdata_real <= s_axis_a_tdata(17 downto 0);
s_axis_a_tdata_imag <= s_axis_a_tdata(41 downto 24);
s_axis_b_tdata_real <= s_axis_b_tdata(7 downto 0);
s_axis_b_tdata_imag <= s_axis_b_tdata(15 downto 8);
m_axis_dout_tdata_real <= m_axis_dout_tdata(26 downto 0);
m_axis_dout_tdata_imag <= m_axis_dout_tdata(58 downto 32);
end tb;
@@ -0,0 +1,202 @@
-- (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
--
-- This file contains confidential and proprietary information
-- of Xilinx, Inc. and is protected under U.S. and
-- international copyright and other intellectual property
-- laws.
--
-- DISCLAIMER
-- This disclaimer is not a license and does not grant any
-- rights to the materials distributed herewith. Except as
-- otherwise provided in a valid license issued to you by
-- Xilinx, and to the maximum extent permitted by applicable
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
-- (2) Xilinx shall not be liable (whether in contract or tort,
-- including negligence, or under any other theory of
-- liability) for any loss or damage of any kind or nature
-- related to, arising under or in connection with these
-- materials, including for any direct, or any indirect,
-- special, incidental, or consequential loss or damage
-- (including loss of data, profits, goodwill, or any type of
-- loss or damage suffered as a result of any action brought
-- by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the
-- possibility of the same.
--
-- CRITICAL APPLICATIONS
-- Xilinx products are not designed or intended to be fail-
-- safe, or for use in any application requiring fail-safe
-- performance, such as life-support or safety devices or
-- systems, Class III medical devices, nuclear facilities,
-- applications related to the deployment of airbags, or any
-- other applications that could lead to death, personal
-- injury, or severe property or environmental damage
-- (individually and collectively, "Critical
-- Applications"). Customer assumes the sole risk and
-- liability of any use of Xilinx products in Critical
-- Applications, subject only to applicable laws and
-- regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
-- PART OF THIS FILE AT ALL TIMES.
--
-- DO NOT MODIFY THIS FILE.
-- IP VLNV: xilinx.com:ip:cmpy:6.0
-- IP Revision: 17
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
LIBRARY cmpy_v6_0_17;
USE cmpy_v6_0_17.cmpy_v6_0_17;
ENTITY cmpy_18x8 IS
PORT (
aclk : IN STD_LOGIC;
s_axis_a_tvalid : IN STD_LOGIC;
s_axis_a_tdata : IN STD_LOGIC_VECTOR(47 DOWNTO 0);
s_axis_b_tvalid : IN STD_LOGIC;
s_axis_b_tdata : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
m_axis_dout_tvalid : OUT STD_LOGIC;
m_axis_dout_tdata : OUT STD_LOGIC_VECTOR(63 DOWNTO 0)
);
END cmpy_18x8;
ARCHITECTURE cmpy_18x8_arch OF cmpy_18x8 IS
ATTRIBUTE DowngradeIPIdentifiedWarnings : STRING;
ATTRIBUTE DowngradeIPIdentifiedWarnings OF cmpy_18x8_arch: ARCHITECTURE IS "yes";
COMPONENT cmpy_v6_0_17 IS
GENERIC (
C_VERBOSITY : INTEGER;
C_XDEVICEFAMILY : STRING;
C_XDEVICE : STRING;
C_A_WIDTH : INTEGER;
C_B_WIDTH : INTEGER;
C_OUT_WIDTH : INTEGER;
C_LATENCY : INTEGER;
C_MULT_TYPE : INTEGER;
C_OPTIMIZE_GOAL : INTEGER;
HAS_NEGATE : INTEGER;
SINGLE_OUTPUT : INTEGER;
ROUND : INTEGER;
USE_DSP_CASCADES : INTEGER;
C_THROTTLE_SCHEME : INTEGER;
C_HAS_ACLKEN : INTEGER;
C_HAS_ARESETN : INTEGER;
C_HAS_S_AXIS_A_TUSER : INTEGER;
C_HAS_S_AXIS_A_TLAST : INTEGER;
C_HAS_S_AXIS_B_TUSER : INTEGER;
C_HAS_S_AXIS_B_TLAST : INTEGER;
C_HAS_S_AXIS_CTRL_TUSER : INTEGER;
C_HAS_S_AXIS_CTRL_TLAST : INTEGER;
C_TLAST_RESOLUTION : INTEGER;
C_S_AXIS_A_TDATA_WIDTH : INTEGER;
C_S_AXIS_A_TUSER_WIDTH : INTEGER;
C_S_AXIS_B_TDATA_WIDTH : INTEGER;
C_S_AXIS_B_TUSER_WIDTH : INTEGER;
C_S_AXIS_CTRL_TDATA_WIDTH : INTEGER;
C_S_AXIS_CTRL_TUSER_WIDTH : INTEGER;
C_M_AXIS_DOUT_TDATA_WIDTH : INTEGER;
C_M_AXIS_DOUT_TUSER_WIDTH : INTEGER
);
PORT (
aclk : IN STD_LOGIC;
aclken : IN STD_LOGIC;
aresetn : IN STD_LOGIC;
s_axis_a_tvalid : IN STD_LOGIC;
s_axis_a_tready : OUT STD_LOGIC;
s_axis_a_tuser : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
s_axis_a_tlast : IN STD_LOGIC;
s_axis_a_tdata : IN STD_LOGIC_VECTOR(47 DOWNTO 0);
s_axis_b_tvalid : IN STD_LOGIC;
s_axis_b_tready : OUT STD_LOGIC;
s_axis_b_tuser : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
s_axis_b_tlast : IN STD_LOGIC;
s_axis_b_tdata : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
s_axis_ctrl_tvalid : IN STD_LOGIC;
s_axis_ctrl_tready : OUT STD_LOGIC;
s_axis_ctrl_tuser : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
s_axis_ctrl_tlast : IN STD_LOGIC;
s_axis_ctrl_tdata : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
m_axis_dout_tvalid : OUT STD_LOGIC;
m_axis_dout_tready : IN STD_LOGIC;
m_axis_dout_tuser : OUT STD_LOGIC_VECTOR(0 DOWNTO 0);
m_axis_dout_tlast : OUT STD_LOGIC;
m_axis_dout_tdata : OUT STD_LOGIC_VECTOR(63 DOWNTO 0)
);
END COMPONENT cmpy_v6_0_17;
ATTRIBUTE X_INTERFACE_INFO : STRING;
ATTRIBUTE X_INTERFACE_PARAMETER : STRING;
ATTRIBUTE X_INTERFACE_INFO OF m_axis_dout_tdata: SIGNAL IS "xilinx.com:interface:axis:1.0 M_AXIS_DOUT TDATA";
ATTRIBUTE X_INTERFACE_PARAMETER OF m_axis_dout_tvalid: SIGNAL IS "XIL_INTERFACENAME M_AXIS_DOUT, TDATA_NUM_BYTES 8, TDEST_WIDTH 0, TID_WIDTH 0, TUSER_WIDTH 0, HAS_TREADY 0, HAS_TSTRB 0, HAS_TKEEP 0, HAS_TLAST 0, FREQ_HZ 100000000, PHASE 0.000, LAYERED_METADATA undef, INSERT_VIP 0";
ATTRIBUTE X_INTERFACE_INFO OF m_axis_dout_tvalid: SIGNAL IS "xilinx.com:interface:axis:1.0 M_AXIS_DOUT TVALID";
ATTRIBUTE X_INTERFACE_INFO OF s_axis_b_tdata: SIGNAL IS "xilinx.com:interface:axis:1.0 S_AXIS_B TDATA";
ATTRIBUTE X_INTERFACE_PARAMETER OF s_axis_b_tvalid: SIGNAL IS "XIL_INTERFACENAME S_AXIS_B, TDATA_NUM_BYTES 2, TDEST_WIDTH 0, TID_WIDTH 0, TUSER_WIDTH 0, HAS_TREADY 0, HAS_TSTRB 0, HAS_TKEEP 0, HAS_TLAST 0, FREQ_HZ 100000000, PHASE 0.000, LAYERED_METADATA undef, INSERT_VIP 0";
ATTRIBUTE X_INTERFACE_INFO OF s_axis_b_tvalid: SIGNAL IS "xilinx.com:interface:axis:1.0 S_AXIS_B TVALID";
ATTRIBUTE X_INTERFACE_INFO OF s_axis_a_tdata: SIGNAL IS "xilinx.com:interface:axis:1.0 S_AXIS_A TDATA";
ATTRIBUTE X_INTERFACE_PARAMETER OF s_axis_a_tvalid: SIGNAL IS "XIL_INTERFACENAME S_AXIS_A, TDATA_NUM_BYTES 6, TDEST_WIDTH 0, TID_WIDTH 0, TUSER_WIDTH 0, HAS_TREADY 0, HAS_TSTRB 0, HAS_TKEEP 0, HAS_TLAST 0, FREQ_HZ 100000000, PHASE 0.000, LAYERED_METADATA undef, INSERT_VIP 0";
ATTRIBUTE X_INTERFACE_INFO OF s_axis_a_tvalid: SIGNAL IS "xilinx.com:interface:axis:1.0 S_AXIS_A TVALID";
ATTRIBUTE X_INTERFACE_PARAMETER OF aclk: SIGNAL IS "XIL_INTERFACENAME aclk_intf, ASSOCIATED_BUSIF S_AXIS_CTRL:S_AXIS_B:S_AXIS_A:M_AXIS_DOUT, ASSOCIATED_RESET aresetn, ASSOCIATED_CLKEN aclken, FREQ_HZ 10000000, PHASE 0.000, INSERT_VIP 0";
ATTRIBUTE X_INTERFACE_INFO OF aclk: SIGNAL IS "xilinx.com:signal:clock:1.0 aclk_intf CLK";
BEGIN
U0 : cmpy_v6_0_17
GENERIC MAP (
C_VERBOSITY => 0,
C_XDEVICEFAMILY => "zynq",
C_XDEVICE => "xc7z100",
C_A_WIDTH => 18,
C_B_WIDTH => 8,
C_OUT_WIDTH => 27,
C_LATENCY => 4,
C_MULT_TYPE => 0,
C_OPTIMIZE_GOAL => 0,
HAS_NEGATE => 0,
SINGLE_OUTPUT => 0,
ROUND => 0,
USE_DSP_CASCADES => 1,
C_THROTTLE_SCHEME => 3,
C_HAS_ACLKEN => 0,
C_HAS_ARESETN => 0,
C_HAS_S_AXIS_A_TUSER => 0,
C_HAS_S_AXIS_A_TLAST => 0,
C_HAS_S_AXIS_B_TUSER => 0,
C_HAS_S_AXIS_B_TLAST => 0,
C_HAS_S_AXIS_CTRL_TUSER => 0,
C_HAS_S_AXIS_CTRL_TLAST => 0,
C_TLAST_RESOLUTION => 0,
C_S_AXIS_A_TDATA_WIDTH => 48,
C_S_AXIS_A_TUSER_WIDTH => 1,
C_S_AXIS_B_TDATA_WIDTH => 16,
C_S_AXIS_B_TUSER_WIDTH => 1,
C_S_AXIS_CTRL_TDATA_WIDTH => 8,
C_S_AXIS_CTRL_TUSER_WIDTH => 1,
C_M_AXIS_DOUT_TDATA_WIDTH => 64,
C_M_AXIS_DOUT_TUSER_WIDTH => 1
)
PORT MAP (
aclk => aclk,
aclken => '1',
aresetn => '1',
s_axis_a_tvalid => s_axis_a_tvalid,
s_axis_a_tuser => STD_LOGIC_VECTOR(TO_UNSIGNED(0, 1)),
s_axis_a_tlast => '0',
s_axis_a_tdata => s_axis_a_tdata,
s_axis_b_tvalid => s_axis_b_tvalid,
s_axis_b_tuser => STD_LOGIC_VECTOR(TO_UNSIGNED(0, 1)),
s_axis_b_tlast => '0',
s_axis_b_tdata => s_axis_b_tdata,
s_axis_ctrl_tvalid => '0',
s_axis_ctrl_tuser => STD_LOGIC_VECTOR(TO_UNSIGNED(0, 1)),
s_axis_ctrl_tlast => '0',
s_axis_ctrl_tdata => STD_LOGIC_VECTOR(TO_UNSIGNED(0, 8)),
m_axis_dout_tvalid => m_axis_dout_tvalid,
m_axis_dout_tready => '0',
m_axis_dout_tdata => m_axis_dout_tdata
);
END cmpy_18x8_arch;
@@ -0,0 +1,69 @@
// (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
// DO NOT MODIFY THIS FILE.
// IP VLNV: xilinx.com:ip:dds_compiler:6.0
// IP Revision: 18
// The following must be inserted into your Verilog file for this
// core to be instantiated. Change the instance name and port connections
// (in parentheses) to your own signal names.
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
dds_32b_8b your_instance_name (
.aclk(aclk), // input wire aclk
.s_axis_config_tvalid(s_axis_config_tvalid), // input wire s_axis_config_tvalid
.s_axis_config_tdata(s_axis_config_tdata), // input wire [31 : 0] s_axis_config_tdata
.m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata) // output wire [15 : 0] m_axis_data_tdata
);
// INST_TAG_END ------ End INSTANTIATION Template ---------
// You must compile the wrapper file dds_32b_8b.v when simulating
// the core, dds_32b_8b. When compiling the wrapper file, be sure to
// reference the Verilog simulation library.
@@ -0,0 +1,83 @@
-- (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
--
-- This file contains confidential and proprietary information
-- of Xilinx, Inc. and is protected under U.S. and
-- international copyright and other intellectual property
-- laws.
--
-- DISCLAIMER
-- This disclaimer is not a license and does not grant any
-- rights to the materials distributed herewith. Except as
-- otherwise provided in a valid license issued to you by
-- Xilinx, and to the maximum extent permitted by applicable
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
-- (2) Xilinx shall not be liable (whether in contract or tort,
-- including negligence, or under any other theory of
-- liability) for any loss or damage of any kind or nature
-- related to, arising under or in connection with these
-- materials, including for any direct, or any indirect,
-- special, incidental, or consequential loss or damage
-- (including loss of data, profits, goodwill, or any type of
-- loss or damage suffered as a result of any action brought
-- by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the
-- possibility of the same.
--
-- CRITICAL APPLICATIONS
-- Xilinx products are not designed or intended to be fail-
-- safe, or for use in any application requiring fail-safe
-- performance, such as life-support or safety devices or
-- systems, Class III medical devices, nuclear facilities,
-- applications related to the deployment of airbags, or any
-- other applications that could lead to death, personal
-- injury, or severe property or environmental damage
-- (individually and collectively, "Critical
-- Applications"). Customer assumes the sole risk and
-- liability of any use of Xilinx products in Critical
-- Applications, subject only to applicable laws and
-- regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
-- PART OF THIS FILE AT ALL TIMES.
--
-- DO NOT MODIFY THIS FILE.
-- IP VLNV: xilinx.com:ip:dds_compiler:6.0
-- IP Revision: 18
-- The following code must appear in the VHDL architecture header.
------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
COMPONENT dds_32b_8b
PORT (
aclk : IN STD_LOGIC;
s_axis_config_tvalid : IN STD_LOGIC;
s_axis_config_tdata : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
m_axis_data_tvalid : OUT STD_LOGIC;
m_axis_data_tdata : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)
);
END COMPONENT;
-- COMP_TAG_END ------ End COMPONENT Declaration ------------
-- The following code must appear in the VHDL architecture
-- body. Substitute your own instance name and net names.
------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
your_instance_name : dds_32b_8b
PORT MAP (
aclk => aclk,
s_axis_config_tvalid => s_axis_config_tvalid,
s_axis_config_tdata => s_axis_config_tdata,
m_axis_data_tvalid => m_axis_data_tvalid,
m_axis_data_tdata => m_axis_data_tdata
);
-- INST_TAG_END ------ End INSTANTIATION Template ---------
-- You must compile the wrapper file dds_32b_8b.vhd when simulating
-- the core, dds_32b_8b. When compiling the wrapper file, be sure to
-- reference the VHDL simulation library.
@@ -0,0 +1,25 @@
// Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
// --------------------------------------------------------------------------------
// Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
// Date : Fri Mar 17 22:22:40 2023
// Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
// Command : write_verilog -force -mode synth_stub
// D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/dds_32b_8b_synth_1/dds_32b_8b_stub.v
// Design : dds_32b_8b
// Purpose : Stub declaration of top-level module interface
// Device : xc7z100ffg900-2
// --------------------------------------------------------------------------------
// This empty module with port declaration file causes synthesis tools to infer a black box for IP.
// The synthesis directives are for Synopsys Synplify support to prevent IO buffer insertion.
// Please paste the declaration into a Verilog source file or add the file as an additional source.
(* x_core_info = "dds_compiler_v6_0_18,Vivado 2019.1.3" *)
module dds_32b_8b(aclk, s_axis_config_tvalid,
s_axis_config_tdata, m_axis_data_tvalid, m_axis_data_tdata)
/* synthesis syn_black_box black_box_pad_pin="aclk,s_axis_config_tvalid,s_axis_config_tdata[31:0],m_axis_data_tvalid,m_axis_data_tdata[15:0]" */;
input aclk;
input s_axis_config_tvalid;
input [31:0]s_axis_config_tdata;
output m_axis_data_tvalid;
output [15:0]m_axis_data_tdata;
endmodule
@@ -0,0 +1,34 @@
-- Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
-- --------------------------------------------------------------------------------
-- Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
-- Date : Fri Mar 17 22:22:40 2023
-- Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
-- Command : write_vhdl -force -mode synth_stub
-- D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/dds_32b_8b_synth_1/dds_32b_8b_stub.vhdl
-- Design : dds_32b_8b
-- Purpose : Stub declaration of top-level module interface
-- Device : xc7z100ffg900-2
-- --------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity dds_32b_8b is
Port (
aclk : in STD_LOGIC;
s_axis_config_tvalid : in STD_LOGIC;
s_axis_config_tdata : in STD_LOGIC_VECTOR ( 31 downto 0 );
m_axis_data_tvalid : out STD_LOGIC;
m_axis_data_tdata : out STD_LOGIC_VECTOR ( 15 downto 0 )
);
end dds_32b_8b;
architecture stub of dds_32b_8b is
attribute syn_black_box : boolean;
attribute black_box_pad_pin : string;
attribute syn_black_box of stub : architecture is true;
attribute black_box_pad_pin of stub : architecture is "aclk,s_axis_config_tvalid,s_axis_config_tdata[31:0],m_axis_data_tvalid,m_axis_data_tdata[15:0]";
attribute x_core_info : string;
attribute x_core_info of stub : architecture is "dds_compiler_v6_0_18,Vivado 2019.1.3";
begin
end;
@@ -0,0 +1,235 @@
--------------------------------------------------------------------------------
-- (c) Copyright 2010 - 2013 Xilinx, Inc. All rights reserved.
--
-- This file contains confidential and proprietary information
-- of Xilinx, Inc. and is protected under U.S. and
-- international copyright and other intellectual property
-- laws.
--
-- DISCLAIMER
-- This disclaimer is not a license and does not grant any
-- rights to the materials distributed herewith. Except as
-- otherwise provided in a valid license issued to you by
-- Xilinx, and to the maximum extent permitted by applicable
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
-- (2) Xilinx shall not be liable (whether in contract or tort,
-- including negligence, or under any other theory of
-- liability) for any loss or damage of any kind or nature
-- related to, arising under or in connection with these
-- materials, including for any direct, or any indirect,
-- special, incidental, or consequential loss or damage
-- (including loss of data, profits, goodwill, or any type of
-- loss or damage suffered as a result of any action brought
-- by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the
-- possibility of the same.
--
-- CRITICAL APPLICATIONS
-- Xilinx products are not designed or intended to be fail-
-- safe, or for use in any application requiring fail-safe
-- performance, such as life-support or safety devices or
-- systems, Class III medical devices, nuclear facilities,
-- applications related to the deployment of airbags, or any
-- other applications that could lead to death, personal
-- injury, or severe property or environmental damage
-- (individually and collectively, "Critical
-- Applications"). Customer assumes the sole risk and
-- liability of any use of Xilinx products in Critical
-- Applications, subject only to applicable laws and
-- regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
-- PART OF THIS FILE AT ALL TIMES.
--------------------------------------------------------------------------------
-- Description:
-- This is an example testbench for the DDS Compiler IP core.
-- The testbench has been generated by Vivado to accompany the IP core
-- instance you have generated.
--
-- This testbench is for demonstration purposes only. See note below for
-- instructions on how to use it with your core.
--
-- See the DDS Compiler product guide for further information
-- about this core.
--
--------------------------------------------------------------------------------
-- Using this testbench
--
-- This testbench instantiates your generated DDS Compiler core
-- instance named "dds_32b_8b".
--
-- Use Vivado's Run Simulation flow to run this testbench. See the Vivado
-- documentation for details.
--------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.math_real.all;
entity tb_dds_32b_8b is
end tb_dds_32b_8b;
architecture tb of tb_dds_32b_8b is
-----------------------------------------------------------------------
-- Timing constants
-----------------------------------------------------------------------
constant CLOCK_PERIOD : time := 100 ns;
constant T_HOLD : time := 10 ns;
constant T_STROBE : time := CLOCK_PERIOD - (1 ns);
-----------------------------------------------------------------------
-- DUT input signals
-----------------------------------------------------------------------
-- General inputs
signal aclk : std_logic := '0'; -- the master clock
-- Config slave channel signals
signal s_axis_config_tvalid : std_logic := '0'; -- payload is valid
signal s_axis_config_tdata : std_logic_vector(31 downto 0) := (others => '0'); -- data payload
-- Data master channel signals
signal m_axis_data_tvalid : std_logic := '0'; -- payload is valid
signal m_axis_data_tdata : std_logic_vector(15 downto 0) := (others => '0'); -- data payload
-----------------------------------------------------------------------
-- Aliases for AXI channel TDATA and TUSER fields
-- These are a convenience for viewing data in a simulator waveform viewer.
-- If using ModelSim or Questa, add "-voptargs=+acc=n" to the vsim command
-- to prevent the simulator optimizing away these signals.
-----------------------------------------------------------------------
-- Config slave channel alias signals
signal s_axis_config_tdata_inc : std_logic_vector(31 downto 0) := (others => '0');
-- Data master channel alias signals
signal m_axis_data_tdata_cosine : std_logic_vector(7 downto 0) := (others => '0');
signal m_axis_data_tdata_sine : std_logic_vector(7 downto 0) := (others => '0');
signal end_of_simulation : boolean := false;
begin
-----------------------------------------------------------------------
-- Instantiate the DUT
-----------------------------------------------------------------------
dut : entity work.dds_32b_8b
port map (
aclk => aclk
,s_axis_config_tvalid => s_axis_config_tvalid
,s_axis_config_tdata => s_axis_config_tdata
,m_axis_data_tvalid => m_axis_data_tvalid
,m_axis_data_tdata => m_axis_data_tdata
);
-----------------------------------------------------------------------
-- Generate clock
-----------------------------------------------------------------------
clock_gen : process
begin
aclk <= '0';
if (end_of_simulation) then
wait;
else
wait for CLOCK_PERIOD;
loop
aclk <= '0';
wait for CLOCK_PERIOD/2;
aclk <= '1';
wait for CLOCK_PERIOD/2;
end loop;
end if;
end process clock_gen;
-----------------------------------------------------------------------
-- Generate inputs
-----------------------------------------------------------------------
stimuli : process
begin
-- Drive inputs T_HOLD time after rising edge of clock
wait until rising_edge(aclk);
wait for T_HOLD;
-- Program the core with the initial configuration.
-- The phase increment value here is derived from the output frequency value set in the CORE Generator GUI.
s_axis_config_tvalid <= '1';
s_axis_config_tdata <= (others => '0'); -- set unused TDATA bits to zero
s_axis_config_tdata(31 downto 0) <= "00000000000000010101010101010101"; -- phase increment
wait for CLOCK_PERIOD;
s_axis_config_tvalid <= '0';
-- Run for long enough to produce 5 periods of outputs
wait for CLOCK_PERIOD * 245761;
-- Configure the core with a different configuration:
-- set phase increment to half of its current value
s_axis_config_tvalid <= '1';
s_axis_config_tdata <= (others => '0'); -- set unused TDATA bits to zero
s_axis_config_tdata(31 downto 0) <= "00000000000000001010101010101010"; -- current phase increment / 2
wait for CLOCK_PERIOD;
s_axis_config_tvalid <= '0';
-- Run for long enough to produce 5 periods of outputs
wait for CLOCK_PERIOD * 491522;
-- End of test
end_of_simulation <= true;
report "Not a real failure. Simulation finished successfully. Test completed successfully" severity failure;
wait;
end process stimuli;
-----------------------------------------------------------------------
-- Check outputs
-----------------------------------------------------------------------
check_outputs : process
variable check_ok : boolean := true;
begin
-- Check outputs T_STROBE time after rising edge of clock
wait until rising_edge(aclk);
wait for T_STROBE;
-- Do not check the output payload values, as this requires the behavioral model
-- which would make this demonstration testbench unwieldy.
-- Instead, check the protocol of the data master channel:
-- check that the payload is valid (not X) when TVALID is high
if m_axis_data_tvalid = '1' then
if is_x(m_axis_data_tdata) then
report "ERROR: m_axis_data_tdata is invalid when m_axis_data_tvalid is high" severity error;
check_ok := false;
end if;
end if;
assert check_ok
report "ERROR: terminating test with failures." severity failure;
end process check_outputs;
-----------------------------------------------------------------------
-- Assign TDATA fields to aliases, for easy simulator waveform viewing
-----------------------------------------------------------------------
-- Config slave channel alias signals
s_axis_config_tdata_inc <= s_axis_config_tdata(31 downto 0);
-- Data master channel alias signals: update these only when they are valid
m_axis_data_tdata_cosine <= m_axis_data_tdata(7 downto 0) when m_axis_data_tvalid = '1';
m_axis_data_tdata_sine <= m_axis_data_tdata(15 downto 8) when m_axis_data_tvalid = '1';
end tb;
@@ -0,0 +1,232 @@
-- (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
--
-- This file contains confidential and proprietary information
-- of Xilinx, Inc. and is protected under U.S. and
-- international copyright and other intellectual property
-- laws.
--
-- DISCLAIMER
-- This disclaimer is not a license and does not grant any
-- rights to the materials distributed herewith. Except as
-- otherwise provided in a valid license issued to you by
-- Xilinx, and to the maximum extent permitted by applicable
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
-- (2) Xilinx shall not be liable (whether in contract or tort,
-- including negligence, or under any other theory of
-- liability) for any loss or damage of any kind or nature
-- related to, arising under or in connection with these
-- materials, including for any direct, or any indirect,
-- special, incidental, or consequential loss or damage
-- (including loss of data, profits, goodwill, or any type of
-- loss or damage suffered as a result of any action brought
-- by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the
-- possibility of the same.
--
-- CRITICAL APPLICATIONS
-- Xilinx products are not designed or intended to be fail-
-- safe, or for use in any application requiring fail-safe
-- performance, such as life-support or safety devices or
-- systems, Class III medical devices, nuclear facilities,
-- applications related to the deployment of airbags, or any
-- other applications that could lead to death, personal
-- injury, or severe property or environmental damage
-- (individually and collectively, "Critical
-- Applications"). Customer assumes the sole risk and
-- liability of any use of Xilinx products in Critical
-- Applications, subject only to applicable laws and
-- regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
-- PART OF THIS FILE AT ALL TIMES.
--
-- DO NOT MODIFY THIS FILE.
-- IP VLNV: xilinx.com:ip:dds_compiler:6.0
-- IP Revision: 18
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
LIBRARY dds_compiler_v6_0_18;
USE dds_compiler_v6_0_18.dds_compiler_v6_0_18;
ENTITY dds_32b_8b IS
PORT (
aclk : IN STD_LOGIC;
s_axis_config_tvalid : IN STD_LOGIC;
s_axis_config_tdata : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
m_axis_data_tvalid : OUT STD_LOGIC;
m_axis_data_tdata : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)
);
END dds_32b_8b;
ARCHITECTURE dds_32b_8b_arch OF dds_32b_8b IS
ATTRIBUTE DowngradeIPIdentifiedWarnings : STRING;
ATTRIBUTE DowngradeIPIdentifiedWarnings OF dds_32b_8b_arch: ARCHITECTURE IS "yes";
COMPONENT dds_compiler_v6_0_18 IS
GENERIC (
C_XDEVICEFAMILY : STRING;
C_MODE_OF_OPERATION : INTEGER;
C_MODULUS : INTEGER;
C_ACCUMULATOR_WIDTH : INTEGER;
C_CHANNELS : INTEGER;
C_HAS_PHASE_OUT : INTEGER;
C_HAS_PHASEGEN : INTEGER;
C_HAS_SINCOS : INTEGER;
C_LATENCY : INTEGER;
C_MEM_TYPE : INTEGER;
C_NEGATIVE_COSINE : INTEGER;
C_NEGATIVE_SINE : INTEGER;
C_NOISE_SHAPING : INTEGER;
C_OUTPUTS_REQUIRED : INTEGER;
C_OUTPUT_FORM : INTEGER;
C_OUTPUT_WIDTH : INTEGER;
C_PHASE_ANGLE_WIDTH : INTEGER;
C_PHASE_INCREMENT : INTEGER;
C_PHASE_INCREMENT_VALUE : STRING;
C_RESYNC : INTEGER;
C_PHASE_OFFSET : INTEGER;
C_PHASE_OFFSET_VALUE : STRING;
C_OPTIMISE_GOAL : INTEGER;
C_USE_DSP48 : INTEGER;
C_POR_MODE : INTEGER;
C_AMPLITUDE : INTEGER;
C_HAS_ACLKEN : INTEGER;
C_HAS_ARESETN : INTEGER;
C_HAS_TLAST : INTEGER;
C_HAS_TREADY : INTEGER;
C_HAS_S_PHASE : INTEGER;
C_S_PHASE_TDATA_WIDTH : INTEGER;
C_S_PHASE_HAS_TUSER : INTEGER;
C_S_PHASE_TUSER_WIDTH : INTEGER;
C_HAS_S_CONFIG : INTEGER;
C_S_CONFIG_SYNC_MODE : INTEGER;
C_S_CONFIG_TDATA_WIDTH : INTEGER;
C_HAS_M_DATA : INTEGER;
C_M_DATA_TDATA_WIDTH : INTEGER;
C_M_DATA_HAS_TUSER : INTEGER;
C_M_DATA_TUSER_WIDTH : INTEGER;
C_HAS_M_PHASE : INTEGER;
C_M_PHASE_TDATA_WIDTH : INTEGER;
C_M_PHASE_HAS_TUSER : INTEGER;
C_M_PHASE_TUSER_WIDTH : INTEGER;
C_DEBUG_INTERFACE : INTEGER;
C_CHAN_WIDTH : INTEGER
);
PORT (
aclk : IN STD_LOGIC;
aclken : IN STD_LOGIC;
aresetn : IN STD_LOGIC;
s_axis_phase_tvalid : IN STD_LOGIC;
s_axis_phase_tready : OUT STD_LOGIC;
s_axis_phase_tdata : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
s_axis_phase_tlast : IN STD_LOGIC;
s_axis_phase_tuser : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
s_axis_config_tvalid : IN STD_LOGIC;
s_axis_config_tready : OUT STD_LOGIC;
s_axis_config_tdata : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
s_axis_config_tlast : IN STD_LOGIC;
m_axis_data_tvalid : OUT STD_LOGIC;
m_axis_data_tready : IN STD_LOGIC;
m_axis_data_tdata : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
m_axis_data_tlast : OUT STD_LOGIC;
m_axis_data_tuser : OUT STD_LOGIC_VECTOR(0 DOWNTO 0);
m_axis_phase_tvalid : OUT STD_LOGIC;
m_axis_phase_tready : IN STD_LOGIC;
m_axis_phase_tdata : OUT STD_LOGIC_VECTOR(0 DOWNTO 0);
m_axis_phase_tlast : OUT STD_LOGIC;
m_axis_phase_tuser : OUT STD_LOGIC_VECTOR(0 DOWNTO 0);
event_pinc_invalid : OUT STD_LOGIC;
event_poff_invalid : OUT STD_LOGIC;
event_phase_in_invalid : OUT STD_LOGIC;
event_s_phase_tlast_missing : OUT STD_LOGIC;
event_s_phase_tlast_unexpected : OUT STD_LOGIC;
event_s_phase_chanid_incorrect : OUT STD_LOGIC;
event_s_config_tlast_missing : OUT STD_LOGIC;
event_s_config_tlast_unexpected : OUT STD_LOGIC
);
END COMPONENT dds_compiler_v6_0_18;
ATTRIBUTE X_INTERFACE_INFO : STRING;
ATTRIBUTE X_INTERFACE_PARAMETER : STRING;
ATTRIBUTE X_INTERFACE_INFO OF m_axis_data_tdata: SIGNAL IS "xilinx.com:interface:axis:1.0 M_AXIS_DATA TDATA";
ATTRIBUTE X_INTERFACE_PARAMETER OF m_axis_data_tvalid: SIGNAL IS "XIL_INTERFACENAME M_AXIS_DATA, TDATA_NUM_BYTES 2, TDEST_WIDTH 0, TID_WIDTH 0, TUSER_WIDTH 0, HAS_TREADY 0, HAS_TSTRB 0, HAS_TKEEP 0, HAS_TLAST 0, FREQ_HZ 100000000, PHASE 0.000, LAYERED_METADATA undef, INSERT_VIP 0";
ATTRIBUTE X_INTERFACE_INFO OF m_axis_data_tvalid: SIGNAL IS "xilinx.com:interface:axis:1.0 M_AXIS_DATA TVALID";
ATTRIBUTE X_INTERFACE_INFO OF s_axis_config_tdata: SIGNAL IS "xilinx.com:interface:axis:1.0 S_AXIS_CONFIG TDATA";
ATTRIBUTE X_INTERFACE_PARAMETER OF s_axis_config_tvalid: SIGNAL IS "XIL_INTERFACENAME S_AXIS_CONFIG, TDATA_NUM_BYTES 4, TDEST_WIDTH 0, TID_WIDTH 0, TUSER_WIDTH 0, HAS_TREADY 0, HAS_TSTRB 0, HAS_TKEEP 0, HAS_TLAST 0, FREQ_HZ 100000000, PHASE 0.000, LAYERED_METADATA undef, INSERT_VIP 0";
ATTRIBUTE X_INTERFACE_INFO OF s_axis_config_tvalid: SIGNAL IS "xilinx.com:interface:axis:1.0 S_AXIS_CONFIG TVALID";
ATTRIBUTE X_INTERFACE_PARAMETER OF aclk: SIGNAL IS "XIL_INTERFACENAME aclk_intf, ASSOCIATED_BUSIF M_AXIS_PHASE:S_AXIS_CONFIG:M_AXIS_DATA:S_AXIS_PHASE, ASSOCIATED_RESET aresetn, ASSOCIATED_CLKEN aclken, FREQ_HZ 100000000, PHASE 0.000, INSERT_VIP 0";
ATTRIBUTE X_INTERFACE_INFO OF aclk: SIGNAL IS "xilinx.com:signal:clock:1.0 aclk_intf CLK";
BEGIN
U0 : dds_compiler_v6_0_18
GENERIC MAP (
C_XDEVICEFAMILY => "zynq",
C_MODE_OF_OPERATION => 0,
C_MODULUS => 9,
C_ACCUMULATOR_WIDTH => 32,
C_CHANNELS => 1,
C_HAS_PHASE_OUT => 0,
C_HAS_PHASEGEN => 1,
C_HAS_SINCOS => 1,
C_LATENCY => 3,
C_MEM_TYPE => 1,
C_NEGATIVE_COSINE => 0,
C_NEGATIVE_SINE => 0,
C_NOISE_SHAPING => 0,
C_OUTPUTS_REQUIRED => 2,
C_OUTPUT_FORM => 0,
C_OUTPUT_WIDTH => 8,
C_PHASE_ANGLE_WIDTH => 8,
C_PHASE_INCREMENT => 1,
C_PHASE_INCREMENT_VALUE => "10101010101010101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0",
C_RESYNC => 0,
C_PHASE_OFFSET => 0,
C_PHASE_OFFSET_VALUE => "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0",
C_OPTIMISE_GOAL => 0,
C_USE_DSP48 => 0,
C_POR_MODE => 0,
C_AMPLITUDE => 0,
C_HAS_ACLKEN => 0,
C_HAS_ARESETN => 0,
C_HAS_TLAST => 0,
C_HAS_TREADY => 0,
C_HAS_S_PHASE => 0,
C_S_PHASE_TDATA_WIDTH => 1,
C_S_PHASE_HAS_TUSER => 0,
C_S_PHASE_TUSER_WIDTH => 1,
C_HAS_S_CONFIG => 1,
C_S_CONFIG_SYNC_MODE => 0,
C_S_CONFIG_TDATA_WIDTH => 32,
C_HAS_M_DATA => 1,
C_M_DATA_TDATA_WIDTH => 16,
C_M_DATA_HAS_TUSER => 0,
C_M_DATA_TUSER_WIDTH => 1,
C_HAS_M_PHASE => 0,
C_M_PHASE_TDATA_WIDTH => 1,
C_M_PHASE_HAS_TUSER => 0,
C_M_PHASE_TUSER_WIDTH => 1,
C_DEBUG_INTERFACE => 0,
C_CHAN_WIDTH => 1
)
PORT MAP (
aclk => aclk,
aclken => '1',
aresetn => '1',
s_axis_phase_tvalid => '0',
s_axis_phase_tdata => STD_LOGIC_VECTOR(TO_UNSIGNED(0, 1)),
s_axis_phase_tlast => '0',
s_axis_phase_tuser => STD_LOGIC_VECTOR(TO_UNSIGNED(0, 1)),
s_axis_config_tvalid => s_axis_config_tvalid,
s_axis_config_tdata => s_axis_config_tdata,
s_axis_config_tlast => '0',
m_axis_data_tvalid => m_axis_data_tvalid,
m_axis_data_tready => '0',
m_axis_data_tdata => m_axis_data_tdata,
m_axis_phase_tready => '0'
);
END dds_32b_8b_arch;
@@ -0,0 +1,67 @@
// (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
// DO NOT MODIFY THIS FILE.
// IP VLNV: xilinx.com:ip:blk_mem_gen:8.4
// IP Revision: 3
// The following must be inserted into your Verilog file for this
// core to be instantiated. Change the instance name and port connections
// (in parentheses) to your own signal names.
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
hop_rom your_instance_name (
.clka(clka), // input wire clka
.addra(addra), // input wire [7 : 0] addra
.douta(douta) // output wire [31 : 0] douta
);
// INST_TAG_END ------ End INSTANTIATION Template ---------
// You must compile the wrapper file hop_rom.v when simulating
// the core, hop_rom. When compiling the wrapper file, be sure to
// reference the Verilog simulation library.
@@ -0,0 +1,79 @@
-- (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
--
-- This file contains confidential and proprietary information
-- of Xilinx, Inc. and is protected under U.S. and
-- international copyright and other intellectual property
-- laws.
--
-- DISCLAIMER
-- This disclaimer is not a license and does not grant any
-- rights to the materials distributed herewith. Except as
-- otherwise provided in a valid license issued to you by
-- Xilinx, and to the maximum extent permitted by applicable
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
-- (2) Xilinx shall not be liable (whether in contract or tort,
-- including negligence, or under any other theory of
-- liability) for any loss or damage of any kind or nature
-- related to, arising under or in connection with these
-- materials, including for any direct, or any indirect,
-- special, incidental, or consequential loss or damage
-- (including loss of data, profits, goodwill, or any type of
-- loss or damage suffered as a result of any action brought
-- by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the
-- possibility of the same.
--
-- CRITICAL APPLICATIONS
-- Xilinx products are not designed or intended to be fail-
-- safe, or for use in any application requiring fail-safe
-- performance, such as life-support or safety devices or
-- systems, Class III medical devices, nuclear facilities,
-- applications related to the deployment of airbags, or any
-- other applications that could lead to death, personal
-- injury, or severe property or environmental damage
-- (individually and collectively, "Critical
-- Applications"). Customer assumes the sole risk and
-- liability of any use of Xilinx products in Critical
-- Applications, subject only to applicable laws and
-- regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
-- PART OF THIS FILE AT ALL TIMES.
--
-- DO NOT MODIFY THIS FILE.
-- IP VLNV: xilinx.com:ip:blk_mem_gen:8.4
-- IP Revision: 3
-- The following code must appear in the VHDL architecture header.
------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
COMPONENT hop_rom
PORT (
clka : IN STD_LOGIC;
addra : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
douta : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
);
END COMPONENT;
-- COMP_TAG_END ------ End COMPONENT Declaration ------------
-- The following code must appear in the VHDL architecture
-- body. Substitute your own instance name and net names.
------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
your_instance_name : hop_rom
PORT MAP (
clka => clka,
addra => addra,
douta => douta
);
-- INST_TAG_END ------ End INSTANTIATION Template ---------
-- You must compile the wrapper file hop_rom.vhd when simulating
-- the core, hop_rom. When compiling the wrapper file, be sure to
-- reference the VHDL simulation library.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,22 @@
// Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
// --------------------------------------------------------------------------------
// Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
// Date : Fri Mar 17 22:23:06 2023
// Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
// Command : write_verilog -force -mode synth_stub
// D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/hop_rom_synth_1/hop_rom_stub.v
// Design : hop_rom
// Purpose : Stub declaration of top-level module interface
// Device : xc7z100ffg900-2
// --------------------------------------------------------------------------------
// This empty module with port declaration file causes synthesis tools to infer a black box for IP.
// The synthesis directives are for Synopsys Synplify support to prevent IO buffer insertion.
// Please paste the declaration into a Verilog source file or add the file as an additional source.
(* x_core_info = "blk_mem_gen_v8_4_3,Vivado 2019.1.3" *)
module hop_rom(clka, addra, douta)
/* synthesis syn_black_box black_box_pad_pin="clka,addra[7:0],douta[31:0]" */;
input clka;
input [7:0]addra;
output [31:0]douta;
endmodule
@@ -0,0 +1,32 @@
-- Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
-- --------------------------------------------------------------------------------
-- Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
-- Date : Fri Mar 17 22:23:06 2023
-- Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
-- Command : write_vhdl -force -mode synth_stub
-- D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/hop_rom_synth_1/hop_rom_stub.vhdl
-- Design : hop_rom
-- Purpose : Stub declaration of top-level module interface
-- Device : xc7z100ffg900-2
-- --------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity hop_rom is
Port (
clka : in STD_LOGIC;
addra : in STD_LOGIC_VECTOR ( 7 downto 0 );
douta : out STD_LOGIC_VECTOR ( 31 downto 0 )
);
end hop_rom;
architecture stub of hop_rom is
attribute syn_black_box : boolean;
attribute black_box_pad_pin : string;
attribute syn_black_box of stub : architecture is true;
attribute black_box_pad_pin of stub : architecture is "clka,addra[7:0],douta[31:0]";
attribute x_core_info : string;
attribute x_core_info of stub : architecture is "blk_mem_gen_v8_4_3,Vivado 2019.1.3";
begin
end;
@@ -0,0 +1,211 @@
// (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
// DO NOT MODIFY THIS FILE.
// IP VLNV: xilinx.com:ip:blk_mem_gen:8.4
// IP Revision: 3
`timescale 1ns/1ps
(* DowngradeIPIdentifiedWarnings = "yes" *)
module hop_rom (
clka,
addra,
douta
);
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA CLK" *)
input wire clka;
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA ADDR" *)
input wire [7 : 0] addra;
(* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME BRAM_PORTA, MEM_SIZE 8192, MEM_WIDTH 32, MEM_ECC NONE, MASTER_TYPE OTHER, READ_LATENCY 1" *)
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA DOUT" *)
output wire [31 : 0] douta;
blk_mem_gen_v8_4_3 #(
.C_FAMILY("zynq"),
.C_XDEVICEFAMILY("zynq"),
.C_ELABORATION_DIR("./"),
.C_INTERFACE_TYPE(0),
.C_AXI_TYPE(1),
.C_AXI_SLAVE_TYPE(0),
.C_USE_BRAM_BLOCK(0),
.C_ENABLE_32BIT_ADDRESS(0),
.C_CTRL_ECC_ALGO("NONE"),
.C_HAS_AXI_ID(0),
.C_AXI_ID_WIDTH(4),
.C_MEM_TYPE(3),
.C_BYTE_SIZE(9),
.C_ALGORITHM(1),
.C_PRIM_TYPE(1),
.C_LOAD_INIT_FILE(1),
.C_INIT_FILE_NAME("hop_rom.mif"),
.C_INIT_FILE("hop_rom.mem"),
.C_USE_DEFAULT_DATA(0),
.C_DEFAULT_DATA("0"),
.C_HAS_RSTA(0),
.C_RST_PRIORITY_A("CE"),
.C_RSTRAM_A(0),
.C_INITA_VAL("0"),
.C_HAS_ENA(0),
.C_HAS_REGCEA(0),
.C_USE_BYTE_WEA(0),
.C_WEA_WIDTH(1),
.C_WRITE_MODE_A("WRITE_FIRST"),
.C_WRITE_WIDTH_A(32),
.C_READ_WIDTH_A(32),
.C_WRITE_DEPTH_A(256),
.C_READ_DEPTH_A(256),
.C_ADDRA_WIDTH(8),
.C_HAS_RSTB(0),
.C_RST_PRIORITY_B("CE"),
.C_RSTRAM_B(0),
.C_INITB_VAL("0"),
.C_HAS_ENB(0),
.C_HAS_REGCEB(0),
.C_USE_BYTE_WEB(0),
.C_WEB_WIDTH(1),
.C_WRITE_MODE_B("WRITE_FIRST"),
.C_WRITE_WIDTH_B(32),
.C_READ_WIDTH_B(32),
.C_WRITE_DEPTH_B(256),
.C_READ_DEPTH_B(256),
.C_ADDRB_WIDTH(8),
.C_HAS_MEM_OUTPUT_REGS_A(1),
.C_HAS_MEM_OUTPUT_REGS_B(0),
.C_HAS_MUX_OUTPUT_REGS_A(1),
.C_HAS_MUX_OUTPUT_REGS_B(0),
.C_MUX_PIPELINE_STAGES(0),
.C_HAS_SOFTECC_INPUT_REGS_A(0),
.C_HAS_SOFTECC_OUTPUT_REGS_B(0),
.C_USE_SOFTECC(0),
.C_USE_ECC(0),
.C_EN_ECC_PIPE(0),
.C_READ_LATENCY_A(1),
.C_READ_LATENCY_B(1),
.C_HAS_INJECTERR(0),
.C_SIM_COLLISION_CHECK("ALL"),
.C_COMMON_CLK(0),
.C_DISABLE_WARN_BHV_COLL(0),
.C_EN_SLEEP_PIN(0),
.C_USE_URAM(0),
.C_EN_RDADDRA_CHG(0),
.C_EN_RDADDRB_CHG(0),
.C_EN_DEEPSLEEP_PIN(0),
.C_EN_SHUTDOWN_PIN(0),
.C_EN_SAFETY_CKT(0),
.C_DISABLE_WARN_BHV_RANGE(0),
.C_COUNT_36K_BRAM("0"),
.C_COUNT_18K_BRAM("1"),
.C_EST_POWER_SUMMARY("Estimated Power for IP : 3.375199 mW")
) inst (
.clka(clka),
.rsta(1'D0),
.ena(1'D0),
.regcea(1'D0),
.wea(1'B0),
.addra(addra),
.dina(32'B0),
.douta(douta),
.clkb(1'D0),
.rstb(1'D0),
.enb(1'D0),
.regceb(1'D0),
.web(1'B0),
.addrb(8'B0),
.dinb(32'B0),
.doutb(),
.injectsbiterr(1'D0),
.injectdbiterr(1'D0),
.eccpipece(1'D0),
.sbiterr(),
.dbiterr(),
.rdaddrecc(),
.sleep(1'D0),
.deepsleep(1'D0),
.shutdown(1'D0),
.rsta_busy(),
.rstb_busy(),
.s_aclk(1'H0),
.s_aresetn(1'D0),
.s_axi_awid(4'B0),
.s_axi_awaddr(32'B0),
.s_axi_awlen(8'B0),
.s_axi_awsize(3'B0),
.s_axi_awburst(2'B0),
.s_axi_awvalid(1'D0),
.s_axi_awready(),
.s_axi_wdata(32'B0),
.s_axi_wstrb(1'B0),
.s_axi_wlast(1'D0),
.s_axi_wvalid(1'D0),
.s_axi_wready(),
.s_axi_bid(),
.s_axi_bresp(),
.s_axi_bvalid(),
.s_axi_bready(1'D0),
.s_axi_arid(4'B0),
.s_axi_araddr(32'B0),
.s_axi_arlen(8'B0),
.s_axi_arsize(3'B0),
.s_axi_arburst(2'B0),
.s_axi_arvalid(1'D0),
.s_axi_arready(),
.s_axi_rid(),
.s_axi_rdata(),
.s_axi_rresp(),
.s_axi_rlast(),
.s_axi_rvalid(),
.s_axi_rready(1'D0),
.s_axi_injectsbiterr(1'D0),
.s_axi_injectdbiterr(1'D0),
.s_axi_sbiterr(),
.s_axi_dbiterr(),
.s_axi_rdaddrecc()
);
endmodule
@@ -0,0 +1,261 @@
--------------------------------------------------------------------------------
-- (c) Copyright 2011 - 2013 Xilinx, Inc. All rights reserved.
--
-- This file contains confidential and proprietary information
-- of Xilinx, Inc. and is protected under U.S. and
-- international copyright and other intellectual property
-- laws.
--
-- DISCLAIMER
-- This disclaimer is not a license and does not grant any
-- rights to the materials distributed herewith. Except as
-- otherwise provided in a valid license issued to you by
-- Xilinx, and to the maximum extent permitted by applicable
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
-- (2) Xilinx shall not be liable (whether in contract or tort,
-- including negligence, or under any other theory of
-- liability) for any loss or damage of any kind or nature
-- related to, arising under or in connection with these
-- materials, including for any direct, or any indirect,
-- special, incidental, or consequential loss or damage
-- (including loss of data, profits, goodwill, or any type of
-- loss or damage suffered as a result of any action brought
-- by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the
-- possibility of the same.
--
-- CRITICAL APPLICATIONS
-- Xilinx products are not designed or intended to be fail-
-- safe, or for use in any application requiring fail-safe
-- performance, such as life-support or safety devices or
-- systems, Class III medical devices, nuclear facilities,
-- applications related to the deployment of airbags, or any
-- other applications that could lead to death, personal
-- injury, or severe property or environmental damage
-- (individually and collectively, "Critical
-- Applications"). Customer assumes the sole risk and
-- liability of any use of Xilinx products in Critical
-- Applications, subject only to applicable laws and
-- regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
-- PART OF THIS FILE AT ALL TIMES.
--------------------------------------------------------------------------------
-- Description:
-- This is an example testbench for the FIR Compiler IP core.
-- The testbench has been generated by Vivado to accompany the IP core
-- instance you have generated.
--
-- This testbench is for demonstration purposes only. See note below for
-- instructions on how to use it with your core.
--
-- See the FIR Compiler product guide for further information
-- about this core.
--
--------------------------------------------------------------------------------
-- Using this testbench
--
-- This testbench instantiates your generated FIR Compiler core
-- instance named "hrc_64_12_025".
--
-- Use Vivado's Run Simulation flow to run this testbench. See the Vivado
-- documentation for details.
--------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity tb_hrc_64_12_025 is
end tb_hrc_64_12_025;
architecture tb of tb_hrc_64_12_025 is
-----------------------------------------------------------------------
-- Timing constants
-----------------------------------------------------------------------
constant CLOCK_PERIOD : time := 100 ns;
constant T_HOLD : time := 10 ns;
constant T_STROBE : time := CLOCK_PERIOD - (1 ns);
-----------------------------------------------------------------------
-- DUT signals
-----------------------------------------------------------------------
-- General signals
signal aclk : std_logic := '0'; -- the master clock
-- Data slave channel signals
signal s_axis_data_tvalid : std_logic := '0'; -- payload is valid
signal s_axis_data_tready : std_logic := '1'; -- slave is ready
signal s_axis_data_tdata : std_logic_vector(7 downto 0) := (others => '0'); -- data payload
-- Data master channel signals
signal m_axis_data_tvalid : std_logic := '0'; -- payload is valid
signal m_axis_data_tdata : std_logic_vector(23 downto 0) := (others => '0'); -- data payload
-----------------------------------------------------------------------
-- Aliases for AXI channel TDATA and TUSER fields
-- These are a convenience for viewing data in a simulator waveform viewer.
-- If using ModelSim or Questa, add "-voptargs=+acc=n" to the vsim command
-- to prevent the simulator optimizing away these signals.
-----------------------------------------------------------------------
-- Data slave channel alias signals
signal s_axis_data_tdata_data : std_logic_vector(1 downto 0) := (others => '0');
-- Data master channel alias signals
signal m_axis_data_tdata_data : std_logic_vector(17 downto 0) := (others => '0');
begin
-----------------------------------------------------------------------
-- Instantiate the DUT
-----------------------------------------------------------------------
dut : entity work.hrc_64_12_025
port map (
aclk => aclk,
s_axis_data_tvalid => s_axis_data_tvalid,
s_axis_data_tready => s_axis_data_tready,
s_axis_data_tdata => s_axis_data_tdata,
m_axis_data_tvalid => m_axis_data_tvalid,
m_axis_data_tdata => m_axis_data_tdata
);
-----------------------------------------------------------------------
-- Generate clock
-----------------------------------------------------------------------
clock_gen : process
begin
aclk <= '0';
wait for CLOCK_PERIOD;
loop
aclk <= '0';
wait for CLOCK_PERIOD/2;
aclk <= '1';
wait for CLOCK_PERIOD/2;
end loop;
end process clock_gen;
-----------------------------------------------------------------------
-- Generate inputs
-----------------------------------------------------------------------
stimuli : process
-- Procedure to drive a number of input samples with specific data
-- data is the data value to drive on the tdata signal
-- samples is the number of zero-data input samples to drive
procedure drive_data ( data : std_logic_vector(7 downto 0);
samples : natural := 1 ) is
variable ip_count : integer := 0;
begin
ip_count := 0;
loop
s_axis_data_tvalid <= '1';
s_axis_data_tdata <= data;
loop
wait until rising_edge(aclk);
exit when s_axis_data_tready = '1';
end loop;
ip_count := ip_count + 1;
wait for T_HOLD;
-- Input rate is 1 input each 64 clock cycles: drive valid inputs at this rate
s_axis_data_tvalid <= '0';
wait for CLOCK_PERIOD * 63;
exit when ip_count >= samples;
end loop;
end procedure drive_data;
-- Procedure to drive a number of zero-data input samples
-- samples is the number of zero-data input samples to drive
procedure drive_zeros ( samples : natural := 1 ) is
begin
drive_data((others => '0'), samples);
end procedure drive_zeros;
-- Procedure to drive an impulse and let the impulse response emerge on the data master channel
-- samples is the number of input samples to drive; default is enough for impulse response output to emerge
procedure drive_impulse ( samples : natural := 901 ) is
variable impulse : std_logic_vector(7 downto 0);
begin
impulse := (others => '0'); -- initialize unused bits to zero
impulse(1 downto 0) := "01";
drive_data(impulse);
if samples > 1 then
drive_zeros(samples-1);
end if;
end procedure drive_impulse;
begin
-- Drive inputs T_HOLD time after rising edge of clock
wait until rising_edge(aclk);
wait for T_HOLD;
-- Drive a single impulse and let the impulse response emerge
drive_impulse;
-- Drive another impulse, during which demonstrate use and effect of AXI handshaking signals
drive_impulse(2); -- start of impulse; data is now zero
s_axis_data_tvalid <= '0';
wait for CLOCK_PERIOD * 320; -- provide no data for 5 input samples worth
drive_zeros(2); -- 2 normal input samples
s_axis_data_tvalid <= '1';
wait for CLOCK_PERIOD * 320; -- provide data as fast as the core can accept it for 5 input samples worth
drive_zeros(892); -- back to normal operation
-- End of test
report "Not a real failure. Simulation finished successfully. Test completed successfully" severity failure;
wait;
end process stimuli;
-----------------------------------------------------------------------
-- Check outputs
-----------------------------------------------------------------------
check_outputs : process
variable check_ok : boolean := true;
begin
-- Check outputs T_STROBE time after rising edge of clock
wait until rising_edge(aclk);
wait for T_STROBE;
-- Do not check the output payload values, as this requires the behavioral model
-- which would make this demonstration testbench unwieldy.
-- Instead, check the protocol of the master DATA channel:
-- check that the payload is valid (not X) when TVALID is high
if m_axis_data_tvalid = '1' then
if is_x(m_axis_data_tdata) then
report "ERROR: m_axis_data_tdata is invalid when m_axis_data_tvalid is high" severity error;
check_ok := false;
end if;
end if;
assert check_ok
report "ERROR: terminating test with failures." severity failure;
end process check_outputs;
-----------------------------------------------------------------------
-- Assign TDATA / TUSER fields to aliases, for easy simulator waveform viewing
-----------------------------------------------------------------------
-- Data slave channel alias signals
s_axis_data_tdata_data <= s_axis_data_tdata(1 downto 0);
-- Data master channel alias signals: update these only when they are valid
m_axis_data_tdata_data <= m_axis_data_tdata(17 downto 0) when m_axis_data_tvalid = '1';
end tb;
@@ -0,0 +1,70 @@
// (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
// DO NOT MODIFY THIS FILE.
// IP VLNV: xilinx.com:ip:fir_compiler:7.2
// IP Revision: 12
// The following must be inserted into your Verilog file for this
// core to be instantiated. Change the instance name and port connections
// (in parentheses) to your own signal names.
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
hrc_64_12_025 your_instance_name (
.aclk(aclk), // input wire aclk
.s_axis_data_tvalid(s_axis_data_tvalid), // input wire s_axis_data_tvalid
.s_axis_data_tready(s_axis_data_tready), // output wire s_axis_data_tready
.s_axis_data_tdata(s_axis_data_tdata), // input wire [7 : 0] s_axis_data_tdata
.m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata) // output wire [23 : 0] m_axis_data_tdata
);
// INST_TAG_END ------ End INSTANTIATION Template ---------
// You must compile the wrapper file hrc_64_12_025.v when simulating
// the core, hrc_64_12_025. When compiling the wrapper file, be sure to
// reference the Verilog simulation library.
@@ -0,0 +1,85 @@
-- (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
--
-- This file contains confidential and proprietary information
-- of Xilinx, Inc. and is protected under U.S. and
-- international copyright and other intellectual property
-- laws.
--
-- DISCLAIMER
-- This disclaimer is not a license and does not grant any
-- rights to the materials distributed herewith. Except as
-- otherwise provided in a valid license issued to you by
-- Xilinx, and to the maximum extent permitted by applicable
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
-- (2) Xilinx shall not be liable (whether in contract or tort,
-- including negligence, or under any other theory of
-- liability) for any loss or damage of any kind or nature
-- related to, arising under or in connection with these
-- materials, including for any direct, or any indirect,
-- special, incidental, or consequential loss or damage
-- (including loss of data, profits, goodwill, or any type of
-- loss or damage suffered as a result of any action brought
-- by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the
-- possibility of the same.
--
-- CRITICAL APPLICATIONS
-- Xilinx products are not designed or intended to be fail-
-- safe, or for use in any application requiring fail-safe
-- performance, such as life-support or safety devices or
-- systems, Class III medical devices, nuclear facilities,
-- applications related to the deployment of airbags, or any
-- other applications that could lead to death, personal
-- injury, or severe property or environmental damage
-- (individually and collectively, "Critical
-- Applications"). Customer assumes the sole risk and
-- liability of any use of Xilinx products in Critical
-- Applications, subject only to applicable laws and
-- regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
-- PART OF THIS FILE AT ALL TIMES.
--
-- DO NOT MODIFY THIS FILE.
-- IP VLNV: xilinx.com:ip:fir_compiler:7.2
-- IP Revision: 12
-- The following code must appear in the VHDL architecture header.
------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
COMPONENT hrc_64_12_025
PORT (
aclk : IN STD_LOGIC;
s_axis_data_tvalid : IN STD_LOGIC;
s_axis_data_tready : OUT STD_LOGIC;
s_axis_data_tdata : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
m_axis_data_tvalid : OUT STD_LOGIC;
m_axis_data_tdata : OUT STD_LOGIC_VECTOR(23 DOWNTO 0)
);
END COMPONENT;
-- COMP_TAG_END ------ End COMPONENT Declaration ------------
-- The following code must appear in the VHDL architecture
-- body. Substitute your own instance name and net names.
------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
your_instance_name : hrc_64_12_025
PORT MAP (
aclk => aclk,
s_axis_data_tvalid => s_axis_data_tvalid,
s_axis_data_tready => s_axis_data_tready,
s_axis_data_tdata => s_axis_data_tdata,
m_axis_data_tvalid => m_axis_data_tvalid,
m_axis_data_tdata => m_axis_data_tdata
);
-- INST_TAG_END ------ End INSTANTIATION Template ---------
-- You must compile the wrapper file hrc_64_12_025.vhd when simulating
-- the core, hrc_64_12_025. When compiling the wrapper file, be sure to
-- reference the VHDL simulation library.
@@ -0,0 +1,26 @@
// Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
// --------------------------------------------------------------------------------
// Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
// Date : Fri Mar 17 22:22:50 2023
// Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
// Command : write_verilog -force -mode synth_stub
// D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/hrc_64_12_025_synth_1/hrc_64_12_025_stub.v
// Design : hrc_64_12_025
// Purpose : Stub declaration of top-level module interface
// Device : xc7z100ffg900-2
// --------------------------------------------------------------------------------
// This empty module with port declaration file causes synthesis tools to infer a black box for IP.
// The synthesis directives are for Synopsys Synplify support to prevent IO buffer insertion.
// Please paste the declaration into a Verilog source file or add the file as an additional source.
(* x_core_info = "fir_compiler_v7_2_12,Vivado 2019.1.3" *)
module hrc_64_12_025(aclk, s_axis_data_tvalid, s_axis_data_tready,
s_axis_data_tdata, m_axis_data_tvalid, m_axis_data_tdata)
/* synthesis syn_black_box black_box_pad_pin="aclk,s_axis_data_tvalid,s_axis_data_tready,s_axis_data_tdata[7:0],m_axis_data_tvalid,m_axis_data_tdata[23:0]" */;
input aclk;
input s_axis_data_tvalid;
output s_axis_data_tready;
input [7:0]s_axis_data_tdata;
output m_axis_data_tvalid;
output [23:0]m_axis_data_tdata;
endmodule
@@ -0,0 +1,35 @@
-- Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
-- --------------------------------------------------------------------------------
-- Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
-- Date : Fri Mar 17 22:22:50 2023
-- Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
-- Command : write_vhdl -force -mode synth_stub
-- D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/hrc_64_12_025_synth_1/hrc_64_12_025_stub.vhdl
-- Design : hrc_64_12_025
-- Purpose : Stub declaration of top-level module interface
-- Device : xc7z100ffg900-2
-- --------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity hrc_64_12_025 is
Port (
aclk : in STD_LOGIC;
s_axis_data_tvalid : in STD_LOGIC;
s_axis_data_tready : out STD_LOGIC;
s_axis_data_tdata : in STD_LOGIC_VECTOR ( 7 downto 0 );
m_axis_data_tvalid : out STD_LOGIC;
m_axis_data_tdata : out STD_LOGIC_VECTOR ( 23 downto 0 )
);
end hrc_64_12_025;
architecture stub of hrc_64_12_025 is
attribute syn_black_box : boolean;
attribute black_box_pad_pin : string;
attribute syn_black_box of stub : architecture is true;
attribute black_box_pad_pin of stub : architecture is "aclk,s_axis_data_tvalid,s_axis_data_tready,s_axis_data_tdata[7:0],m_axis_data_tvalid,m_axis_data_tdata[23:0]";
attribute x_core_info : string;
attribute x_core_info of stub : architecture is "fir_compiler_v7_2_12,Vivado 2019.1.3";
begin
end;
@@ -0,0 +1,281 @@
-- (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
--
-- This file contains confidential and proprietary information
-- of Xilinx, Inc. and is protected under U.S. and
-- international copyright and other intellectual property
-- laws.
--
-- DISCLAIMER
-- This disclaimer is not a license and does not grant any
-- rights to the materials distributed herewith. Except as
-- otherwise provided in a valid license issued to you by
-- Xilinx, and to the maximum extent permitted by applicable
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
-- (2) Xilinx shall not be liable (whether in contract or tort,
-- including negligence, or under any other theory of
-- liability) for any loss or damage of any kind or nature
-- related to, arising under or in connection with these
-- materials, including for any direct, or any indirect,
-- special, incidental, or consequential loss or damage
-- (including loss of data, profits, goodwill, or any type of
-- loss or damage suffered as a result of any action brought
-- by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the
-- possibility of the same.
--
-- CRITICAL APPLICATIONS
-- Xilinx products are not designed or intended to be fail-
-- safe, or for use in any application requiring fail-safe
-- performance, such as life-support or safety devices or
-- systems, Class III medical devices, nuclear facilities,
-- applications related to the deployment of airbags, or any
-- other applications that could lead to death, personal
-- injury, or severe property or environmental damage
-- (individually and collectively, "Critical
-- Applications"). Customer assumes the sole risk and
-- liability of any use of Xilinx products in Critical
-- Applications, subject only to applicable laws and
-- regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
-- PART OF THIS FILE AT ALL TIMES.
--
-- DO NOT MODIFY THIS FILE.
-- IP VLNV: xilinx.com:ip:fir_compiler:7.2
-- IP Revision: 12
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
LIBRARY fir_compiler_v7_2_12;
USE fir_compiler_v7_2_12.fir_compiler_v7_2_12;
ENTITY hrc_64_12_025 IS
PORT (
aclk : IN STD_LOGIC;
s_axis_data_tvalid : IN STD_LOGIC;
s_axis_data_tready : OUT STD_LOGIC;
s_axis_data_tdata : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
m_axis_data_tvalid : OUT STD_LOGIC;
m_axis_data_tdata : OUT STD_LOGIC_VECTOR(23 DOWNTO 0)
);
END hrc_64_12_025;
ARCHITECTURE hrc_64_12_025_arch OF hrc_64_12_025 IS
ATTRIBUTE DowngradeIPIdentifiedWarnings : STRING;
ATTRIBUTE DowngradeIPIdentifiedWarnings OF hrc_64_12_025_arch: ARCHITECTURE IS "yes";
COMPONENT fir_compiler_v7_2_12 IS
GENERIC (
C_XDEVICEFAMILY : STRING;
C_ELABORATION_DIR : STRING;
C_COMPONENT_NAME : STRING;
C_COEF_FILE : STRING;
C_COEF_FILE_LINES : INTEGER;
C_FILTER_TYPE : INTEGER;
C_INTERP_RATE : INTEGER;
C_DECIM_RATE : INTEGER;
C_ZERO_PACKING_FACTOR : INTEGER;
C_SYMMETRY : INTEGER;
C_NUM_FILTS : INTEGER;
C_NUM_TAPS : INTEGER;
C_NUM_CHANNELS : INTEGER;
C_CHANNEL_PATTERN : STRING;
C_ROUND_MODE : INTEGER;
C_COEF_RELOAD : INTEGER;
C_NUM_RELOAD_SLOTS : INTEGER;
C_COL_MODE : INTEGER;
C_COL_PIPE_LEN : INTEGER;
C_COL_CONFIG : STRING;
C_OPTIMIZATION : INTEGER;
C_DATA_PATH_WIDTHS : STRING;
C_DATA_IP_PATH_WIDTHS : STRING;
C_DATA_PX_PATH_WIDTHS : STRING;
C_DATA_WIDTH : INTEGER;
C_COEF_PATH_WIDTHS : STRING;
C_COEF_WIDTH : INTEGER;
C_DATA_PATH_SRC : STRING;
C_COEF_PATH_SRC : STRING;
C_PX_PATH_SRC : STRING;
C_DATA_PATH_SIGN : STRING;
C_COEF_PATH_SIGN : STRING;
C_ACCUM_PATH_WIDTHS : STRING;
C_OUTPUT_WIDTH : INTEGER;
C_OUTPUT_PATH_WIDTHS : STRING;
C_ACCUM_OP_PATH_WIDTHS : STRING;
C_EXT_MULT_CNFG : STRING;
C_DATA_PATH_PSAMP_SRC : STRING;
C_OP_PATH_PSAMP_SRC : STRING;
C_NUM_MADDS : INTEGER;
C_OPT_MADDS : STRING;
C_OVERSAMPLING_RATE : INTEGER;
C_INPUT_RATE : INTEGER;
C_OUTPUT_RATE : INTEGER;
C_DATA_MEMTYPE : INTEGER;
C_COEF_MEMTYPE : INTEGER;
C_IPBUFF_MEMTYPE : INTEGER;
C_OPBUFF_MEMTYPE : INTEGER;
C_DATAPATH_MEMTYPE : INTEGER;
C_MEM_ARRANGEMENT : INTEGER;
C_DATA_MEM_PACKING : INTEGER;
C_COEF_MEM_PACKING : INTEGER;
C_FILTS_PACKED : INTEGER;
C_LATENCY : INTEGER;
C_HAS_ARESETn : INTEGER;
C_HAS_ACLKEN : INTEGER;
C_DATA_HAS_TLAST : INTEGER;
C_S_DATA_HAS_FIFO : INTEGER;
C_S_DATA_HAS_TUSER : INTEGER;
C_S_DATA_TDATA_WIDTH : INTEGER;
C_S_DATA_TUSER_WIDTH : INTEGER;
C_M_DATA_HAS_TREADY : INTEGER;
C_M_DATA_HAS_TUSER : INTEGER;
C_M_DATA_TDATA_WIDTH : INTEGER;
C_M_DATA_TUSER_WIDTH : INTEGER;
C_HAS_CONFIG_CHANNEL : INTEGER;
C_CONFIG_SYNC_MODE : INTEGER;
C_CONFIG_PACKET_SIZE : INTEGER;
C_CONFIG_TDATA_WIDTH : INTEGER;
C_RELOAD_TDATA_WIDTH : INTEGER
);
PORT (
aresetn : IN STD_LOGIC;
aclk : IN STD_LOGIC;
aclken : IN STD_LOGIC;
s_axis_data_tvalid : IN STD_LOGIC;
s_axis_data_tready : OUT STD_LOGIC;
s_axis_data_tlast : IN STD_LOGIC;
s_axis_data_tuser : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
s_axis_data_tdata : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
s_axis_config_tvalid : IN STD_LOGIC;
s_axis_config_tready : OUT STD_LOGIC;
s_axis_config_tlast : IN STD_LOGIC;
s_axis_config_tdata : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
s_axis_reload_tvalid : IN STD_LOGIC;
s_axis_reload_tready : OUT STD_LOGIC;
s_axis_reload_tlast : IN STD_LOGIC;
s_axis_reload_tdata : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
m_axis_data_tvalid : OUT STD_LOGIC;
m_axis_data_tready : IN STD_LOGIC;
m_axis_data_tlast : OUT STD_LOGIC;
m_axis_data_tuser : OUT STD_LOGIC_VECTOR(0 DOWNTO 0);
m_axis_data_tdata : OUT STD_LOGIC_VECTOR(23 DOWNTO 0);
event_s_data_tlast_missing : OUT STD_LOGIC;
event_s_data_tlast_unexpected : OUT STD_LOGIC;
event_s_data_chanid_incorrect : OUT STD_LOGIC;
event_s_config_tlast_missing : OUT STD_LOGIC;
event_s_config_tlast_unexpected : OUT STD_LOGIC;
event_s_reload_tlast_missing : OUT STD_LOGIC;
event_s_reload_tlast_unexpected : OUT STD_LOGIC
);
END COMPONENT fir_compiler_v7_2_12;
ATTRIBUTE X_INTERFACE_INFO : STRING;
ATTRIBUTE X_INTERFACE_PARAMETER : STRING;
ATTRIBUTE X_INTERFACE_INFO OF m_axis_data_tdata: SIGNAL IS "xilinx.com:interface:axis:1.0 M_AXIS_DATA TDATA";
ATTRIBUTE X_INTERFACE_PARAMETER OF m_axis_data_tvalid: SIGNAL IS "XIL_INTERFACENAME M_AXIS_DATA, TDATA_NUM_BYTES 3, TDEST_WIDTH 0, TID_WIDTH 0, TUSER_WIDTH 0, HAS_TREADY 0, HAS_TSTRB 0, HAS_TKEEP 0, HAS_TLAST 0, FREQ_HZ 100000000, PHASE 0.000, LAYERED_METADATA undef, INSERT_VIP 0";
ATTRIBUTE X_INTERFACE_INFO OF m_axis_data_tvalid: SIGNAL IS "xilinx.com:interface:axis:1.0 M_AXIS_DATA TVALID";
ATTRIBUTE X_INTERFACE_INFO OF s_axis_data_tdata: SIGNAL IS "xilinx.com:interface:axis:1.0 S_AXIS_DATA TDATA";
ATTRIBUTE X_INTERFACE_INFO OF s_axis_data_tready: SIGNAL IS "xilinx.com:interface:axis:1.0 S_AXIS_DATA TREADY";
ATTRIBUTE X_INTERFACE_PARAMETER OF s_axis_data_tvalid: SIGNAL IS "XIL_INTERFACENAME S_AXIS_DATA, TDATA_NUM_BYTES 1, TDEST_WIDTH 0, TID_WIDTH 0, TUSER_WIDTH 0, HAS_TREADY 1, HAS_TSTRB 0, HAS_TKEEP 0, HAS_TLAST 0, FREQ_HZ 100000000, PHASE 0.000, LAYERED_METADATA undef, INSERT_VIP 0";
ATTRIBUTE X_INTERFACE_INFO OF s_axis_data_tvalid: SIGNAL IS "xilinx.com:interface:axis:1.0 S_AXIS_DATA TVALID";
ATTRIBUTE X_INTERFACE_PARAMETER OF aclk: SIGNAL IS "XIL_INTERFACENAME aclk_intf, ASSOCIATED_BUSIF S_AXIS_CONFIG:M_AXIS_DATA:S_AXIS_DATA:S_AXIS_RELOAD, ASSOCIATED_RESET aresetn, ASSOCIATED_CLKEN aclken, FREQ_HZ 100000000, PHASE 0.000, INSERT_VIP 0";
ATTRIBUTE X_INTERFACE_INFO OF aclk: SIGNAL IS "xilinx.com:signal:clock:1.0 aclk_intf CLK";
BEGIN
U0 : fir_compiler_v7_2_12
GENERIC MAP (
C_XDEVICEFAMILY => "zynq",
C_ELABORATION_DIR => "./",
C_COMPONENT_NAME => "hrc_64_12_025",
C_COEF_FILE => "hrc_64_12_025.mif",
C_COEF_FILE_LINES => 448,
C_FILTER_TYPE => 2,
C_INTERP_RATE => 64,
C_DECIM_RATE => 1,
C_ZERO_PACKING_FACTOR => 1,
C_SYMMETRY => 1,
C_NUM_FILTS => 1,
C_NUM_TAPS => 769,
C_NUM_CHANNELS => 1,
C_CHANNEL_PATTERN => "fixed",
C_ROUND_MODE => 0,
C_COEF_RELOAD => 0,
C_NUM_RELOAD_SLOTS => 1,
C_COL_MODE => 1,
C_COL_PIPE_LEN => 4,
C_COL_CONFIG => "7",
C_OPTIMIZATION => 0,
C_DATA_PATH_WIDTHS => "2",
C_DATA_IP_PATH_WIDTHS => "2",
C_DATA_PX_PATH_WIDTHS => "2",
C_DATA_WIDTH => 2,
C_COEF_PATH_WIDTHS => "17",
C_COEF_WIDTH => 16,
C_DATA_PATH_SRC => "0",
C_COEF_PATH_SRC => "0",
C_PX_PATH_SRC => "0",
C_DATA_PATH_SIGN => "0",
C_COEF_PATH_SIGN => "0",
C_ACCUM_PATH_WIDTHS => "19",
C_OUTPUT_WIDTH => 18,
C_OUTPUT_PATH_WIDTHS => "18",
C_ACCUM_OP_PATH_WIDTHS => "18",
C_EXT_MULT_CNFG => "none",
C_DATA_PATH_PSAMP_SRC => "0",
C_OP_PATH_PSAMP_SRC => "0",
C_NUM_MADDS => 7,
C_OPT_MADDS => "none",
C_OVERSAMPLING_RATE => 1,
C_INPUT_RATE => 64,
C_OUTPUT_RATE => 1,
C_DATA_MEMTYPE => 0,
C_COEF_MEMTYPE => 2,
C_IPBUFF_MEMTYPE => 0,
C_OPBUFF_MEMTYPE => 2,
C_DATAPATH_MEMTYPE => 0,
C_MEM_ARRANGEMENT => 1,
C_DATA_MEM_PACKING => 0,
C_COEF_MEM_PACKING => 0,
C_FILTS_PACKED => 0,
C_LATENCY => 17,
C_HAS_ARESETn => 0,
C_HAS_ACLKEN => 0,
C_DATA_HAS_TLAST => 0,
C_S_DATA_HAS_FIFO => 0,
C_S_DATA_HAS_TUSER => 0,
C_S_DATA_TDATA_WIDTH => 8,
C_S_DATA_TUSER_WIDTH => 1,
C_M_DATA_HAS_TREADY => 0,
C_M_DATA_HAS_TUSER => 0,
C_M_DATA_TDATA_WIDTH => 24,
C_M_DATA_TUSER_WIDTH => 1,
C_HAS_CONFIG_CHANNEL => 0,
C_CONFIG_SYNC_MODE => 0,
C_CONFIG_PACKET_SIZE => 0,
C_CONFIG_TDATA_WIDTH => 1,
C_RELOAD_TDATA_WIDTH => 1
)
PORT MAP (
aresetn => '1',
aclk => aclk,
aclken => '1',
s_axis_data_tvalid => s_axis_data_tvalid,
s_axis_data_tready => s_axis_data_tready,
s_axis_data_tlast => '0',
s_axis_data_tuser => STD_LOGIC_VECTOR(TO_UNSIGNED(0, 1)),
s_axis_data_tdata => s_axis_data_tdata,
s_axis_config_tvalid => '0',
s_axis_config_tlast => '0',
s_axis_config_tdata => STD_LOGIC_VECTOR(TO_UNSIGNED(0, 1)),
s_axis_reload_tvalid => '0',
s_axis_reload_tlast => '0',
s_axis_reload_tdata => STD_LOGIC_VECTOR(TO_UNSIGNED(0, 1)),
m_axis_data_tvalid => m_axis_data_tvalid,
m_axis_data_tready => '1',
m_axis_data_tdata => m_axis_data_tdata
);
END hrc_64_12_025_arch;
@@ -0,0 +1,74 @@
// (c) Copyright 1995-2012 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
// DO NOT MODIFY THIS FILE.
// The following must be inserted into your Verilog file for this
// core to be instantiated. Change the instance name and port connections
// (in parentheses) to your own signal names.
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
ila_ctrl_signal your_instance_name (
.clk(clk), // input wire clk
.probe0(probe0), // input wire [0:0] probe0
.probe1(probe1), // input wire [0:0] probe1
.probe2(probe2), // input wire [0:0] probe2
.probe3(probe3), // input wire [0:0] probe3
.probe4(probe4), // input wire [0:0] probe4
.probe5(probe5) // input wire [0:0] probe5
);
// INST_TAG_END ------ End INSTANTIATION Template ---------
// You must compile the wrapper file ila_ctrl_signal when simulating
// the core, ila_ctrl_signal. When compiling the wrapper file, be sure to
// reference the Verilog simulation library.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,26 @@
// Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
// --------------------------------------------------------------------------------
// Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
// Date : Fri Mar 17 22:23:33 2023
// Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
// Command : write_verilog -force -mode synth_stub
// D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/ila_ctrl_signal_synth_1/ila_ctrl_signal_stub.v
// Design : ila_ctrl_signal
// Purpose : Stub declaration of top-level module interface
// Device : xc7z100ffg900-2
// --------------------------------------------------------------------------------
// This empty module with port declaration file causes synthesis tools to infer a black box for IP.
// The synthesis directives are for Synopsys Synplify support to prevent IO buffer insertion.
// Please paste the declaration into a Verilog source file or add the file as an additional source.
(* X_CORE_INFO = "ila,Vivado 2019.1.3" *)
module ila_ctrl_signal(clk, probe0, probe1, probe2, probe3, probe4, probe5)
/* synthesis syn_black_box black_box_pad_pin="clk,probe0[0:0],probe1[0:0],probe2[0:0],probe3[0:0],probe4[0:0],probe5[0:0]" */;
input clk;
input [0:0]probe0;
input [0:0]probe1;
input [0:0]probe2;
input [0:0]probe3;
input [0:0]probe4;
input [0:0]probe5;
endmodule
@@ -0,0 +1,36 @@
-- Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
-- --------------------------------------------------------------------------------
-- Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
-- Date : Fri Mar 17 22:23:33 2023
-- Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
-- Command : write_vhdl -force -mode synth_stub
-- D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/ila_ctrl_signal_synth_1/ila_ctrl_signal_stub.vhdl
-- Design : ila_ctrl_signal
-- Purpose : Stub declaration of top-level module interface
-- Device : xc7z100ffg900-2
-- --------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity ila_ctrl_signal is
Port (
clk : in STD_LOGIC;
probe0 : in STD_LOGIC_VECTOR ( 0 to 0 );
probe1 : in STD_LOGIC_VECTOR ( 0 to 0 );
probe2 : in STD_LOGIC_VECTOR ( 0 to 0 );
probe3 : in STD_LOGIC_VECTOR ( 0 to 0 );
probe4 : in STD_LOGIC_VECTOR ( 0 to 0 );
probe5 : in STD_LOGIC_VECTOR ( 0 to 0 )
);
end ila_ctrl_signal;
architecture stub of ila_ctrl_signal is
attribute syn_black_box : boolean;
attribute black_box_pad_pin : string;
attribute syn_black_box of stub : architecture is true;
attribute black_box_pad_pin of stub : architecture is "clk,probe0[0:0],probe1[0:0],probe2[0:0],probe3[0:0],probe4[0:0],probe5[0:0]";
attribute X_CORE_INFO : string;
attribute X_CORE_INFO of stub : architecture is "ila,Vivado 2019.1.3";
begin
end;
@@ -0,0 +1,72 @@
// (c) Copyright 1995-2012 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
// DO NOT MODIFY THIS FILE.
`timescale 1ns / 1ps
module ila_ctrl_signal (
clk,
probe0,
probe1,
probe2,
probe3,
probe4,
probe5
);
input clk;
input [0 : 0] probe0;
input [0 : 0] probe1;
input [0 : 0] probe2;
input [0 : 0] probe3;
input [0 : 0] probe4;
input [0 : 0] probe5;
endmodule
@@ -0,0 +1,76 @@
// (c) Copyright 1995-2012 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
// DO NOT MODIFY THIS FILE.
// The following must be inserted into your Verilog file for this
// core to be instantiated. Change the instance name and port connections
// (in parentheses) to your own signal names.
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
ila_tx_rx your_instance_name (
.clk(clk), // input wire clk
.probe0(probe0), // input wire [15:0] probe0
.probe1(probe1), // input wire [15:0] probe1
.probe2(probe2), // input wire [15:0] probe2
.probe3(probe3), // input wire [15:0] probe3
.probe4(probe4), // input wire [15:0] probe4
.probe5(probe5), // input wire [15:0] probe5
.probe6(probe6), // input wire [0:0] probe6
.probe7(probe7) // input wire [0:0] probe7
);
// INST_TAG_END ------ End INSTANTIATION Template ---------
// You must compile the wrapper file ila_tx_rx when simulating
// the core, ila_tx_rx. When compiling the wrapper file, be sure to
// reference the Verilog simulation library.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,29 @@
// Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
// --------------------------------------------------------------------------------
// Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
// Date : Fri Mar 17 22:27:10 2023
// Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
// Command : write_verilog -force -mode synth_stub
// D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/ila_tx_rx_synth_1/ila_tx_rx_stub.v
// Design : ila_tx_rx
// Purpose : Stub declaration of top-level module interface
// Device : xc7z100ffg900-2
// --------------------------------------------------------------------------------
// This empty module with port declaration file causes synthesis tools to infer a black box for IP.
// The synthesis directives are for Synopsys Synplify support to prevent IO buffer insertion.
// Please paste the declaration into a Verilog source file or add the file as an additional source.
(* X_CORE_INFO = "ila,Vivado 2019.1.3" *)
module ila_tx_rx(clk, probe0, probe1, probe2, probe3, probe4, probe5,
probe6, probe7)
/* synthesis syn_black_box black_box_pad_pin="clk,probe0[15:0],probe1[15:0],probe2[15:0],probe3[15:0],probe4[15:0],probe5[15:0],probe6[0:0],probe7[0:0]" */;
input clk;
input [15:0]probe0;
input [15:0]probe1;
input [15:0]probe2;
input [15:0]probe3;
input [15:0]probe4;
input [15:0]probe5;
input [0:0]probe6;
input [0:0]probe7;
endmodule
@@ -0,0 +1,38 @@
-- Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
-- --------------------------------------------------------------------------------
-- Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
-- Date : Fri Mar 17 22:27:10 2023
-- Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
-- Command : write_vhdl -force -mode synth_stub
-- D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/ila_tx_rx_synth_1/ila_tx_rx_stub.vhdl
-- Design : ila_tx_rx
-- Purpose : Stub declaration of top-level module interface
-- Device : xc7z100ffg900-2
-- --------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity ila_tx_rx is
Port (
clk : in STD_LOGIC;
probe0 : in STD_LOGIC_VECTOR ( 15 downto 0 );
probe1 : in STD_LOGIC_VECTOR ( 15 downto 0 );
probe2 : in STD_LOGIC_VECTOR ( 15 downto 0 );
probe3 : in STD_LOGIC_VECTOR ( 15 downto 0 );
probe4 : in STD_LOGIC_VECTOR ( 15 downto 0 );
probe5 : in STD_LOGIC_VECTOR ( 15 downto 0 );
probe6 : in STD_LOGIC_VECTOR ( 0 to 0 );
probe7 : in STD_LOGIC_VECTOR ( 0 to 0 )
);
end ila_tx_rx;
architecture stub of ila_tx_rx is
attribute syn_black_box : boolean;
attribute black_box_pad_pin : string;
attribute syn_black_box of stub : architecture is true;
attribute black_box_pad_pin of stub : architecture is "clk,probe0[15:0],probe1[15:0],probe2[15:0],probe3[15:0],probe4[15:0],probe5[15:0],probe6[0:0],probe7[0:0]";
attribute X_CORE_INFO : string;
attribute X_CORE_INFO of stub : architecture is "ila,Vivado 2019.1.3";
begin
end;
@@ -0,0 +1,76 @@
// (c) Copyright 1995-2012 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
// DO NOT MODIFY THIS FILE.
`timescale 1ns / 1ps
module ila_tx_rx (
clk,
probe0,
probe1,
probe2,
probe3,
probe4,
probe5,
probe6,
probe7
);
input clk;
input [15 : 0] probe0;
input [15 : 0] probe1;
input [15 : 0] probe2;
input [15 : 0] probe3;
input [15 : 0] probe4;
input [15 : 0] probe5;
input [0 : 0] probe6;
input [0 : 0] probe7;
endmodule
@@ -0,0 +1,92 @@
// file: sig_clk_gen.v
//
// (c) Copyright 2008 - 2013 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
//----------------------------------------------------------------------------
// User entered comments
//----------------------------------------------------------------------------
// None
//
//----------------------------------------------------------------------------
// Output Output Phase Duty Cycle Pk-to-Pk Phase
// Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps)
//----------------------------------------------------------------------------
// clk_out1___245.760______0.000______50.0______104.234_____96.012
//
//----------------------------------------------------------------------------
// Input Clock Freq (MHz) Input Jitter (UI)
//----------------------------------------------------------------------------
// __primary__________122.88____________0.010
`timescale 1ps/1ps
(* CORE_GENERATION_INFO = "sig_clk_gen,clk_wiz_v6_0_3_0_0,{component_name=sig_clk_gen,use_phase_alignment=true,use_min_o_jitter=false,use_max_i_jitter=false,use_dyn_phase_shift=false,use_inclk_switchover=false,use_dyn_reconfig=false,enable_axi=0,feedback_source=FDBK_AUTO,PRIMITIVE=MMCM,num_out_clk=1,clkin1_period=8.138,clkin2_period=10.000,use_power_down=false,use_reset=true,use_locked=true,use_inclk_stopped=false,feedback_type=SINGLE,CLOCK_MGR_TYPE=NA,manual_override=false}" *)
module sig_clk_gen
(
// Clock out ports
output clk_out1,
// Status and control signals
input reset,
output locked,
// Clock in ports
input clk_in1
);
sig_clk_gen_clk_wiz inst
(
// Clock out ports
.clk_out1(clk_out1),
// Status and control signals
.reset(reset),
.locked(locked),
// Clock in ports
.clk_in1(clk_in1)
);
endmodule
@@ -0,0 +1,80 @@
//
// (c) Copyright 2008 - 2013 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
//----------------------------------------------------------------------------
// User entered comments
//----------------------------------------------------------------------------
// None
//
//----------------------------------------------------------------------------
// Output Output Phase Duty Cycle Pk-to-Pk Phase
// Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps)
//----------------------------------------------------------------------------
// clk_out1___245.760______0.000______50.0______104.234_____96.012
//
//----------------------------------------------------------------------------
// Input Clock Freq (MHz) Input Jitter (UI)
//----------------------------------------------------------------------------
// __primary__________122.88____________0.010
// The following must be inserted into your Verilog file for this
// core to be instantiated. Change the instance name and port connections
// (in parentheses) to your own signal names.
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
sig_clk_gen instance_name
(
// Clock out ports
.clk_out1(clk_out1), // output clk_out1
// Status and control signals
.reset(reset), // input reset
.locked(locked), // output locked
// Clock in ports
.clk_in1(clk_in1)); // input clk_in1
// INST_TAG_END ------ End INSTANTIATION Template ---------
@@ -0,0 +1,204 @@
// file: sig_clk_gen.v
//
// (c) Copyright 2008 - 2013 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
//----------------------------------------------------------------------------
// User entered comments
//----------------------------------------------------------------------------
// None
//
//----------------------------------------------------------------------------
// Output Output Phase Duty Cycle Pk-to-Pk Phase
// Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps)
//----------------------------------------------------------------------------
// clk_out1___245.760______0.000______50.0______104.234_____96.012
//
//----------------------------------------------------------------------------
// Input Clock Freq (MHz) Input Jitter (UI)
//----------------------------------------------------------------------------
// __primary__________122.88____________0.010
`timescale 1ps/1ps
module sig_clk_gen_clk_wiz
(// Clock in ports
// Clock out ports
output clk_out1,
// Status and control signals
input reset,
output locked,
input clk_in1
);
// Input buffering
//------------------------------------
wire clk_in1_sig_clk_gen;
wire clk_in2_sig_clk_gen;
BUFG clkin1_bufg
(.O (clk_in1_sig_clk_gen),
.I (clk_in1));
// Clocking PRIMITIVE
//------------------------------------
// Instantiation of the MMCM PRIMITIVE
// * Unused inputs are tied off
// * Unused outputs are labeled unused
wire clk_out1_sig_clk_gen;
wire clk_out2_sig_clk_gen;
wire clk_out3_sig_clk_gen;
wire clk_out4_sig_clk_gen;
wire clk_out5_sig_clk_gen;
wire clk_out6_sig_clk_gen;
wire clk_out7_sig_clk_gen;
wire [15:0] do_unused;
wire drdy_unused;
wire psdone_unused;
wire locked_int;
wire clkfbout_sig_clk_gen;
wire clkfbout_buf_sig_clk_gen;
wire clkfboutb_unused;
wire clkout0b_unused;
wire clkout1_unused;
wire clkout1b_unused;
wire clkout2_unused;
wire clkout2b_unused;
wire clkout3_unused;
wire clkout3b_unused;
wire clkout4_unused;
wire clkout5_unused;
wire clkout6_unused;
wire clkfbstopped_unused;
wire clkinstopped_unused;
wire reset_high;
MMCME2_ADV
#(.BANDWIDTH ("OPTIMIZED"),
.CLKOUT4_CASCADE ("FALSE"),
.COMPENSATION ("ZHOLD"),
.STARTUP_WAIT ("FALSE"),
.DIVCLK_DIVIDE (1),
.CLKFBOUT_MULT_F (8.250),
.CLKFBOUT_PHASE (0.000),
.CLKFBOUT_USE_FINE_PS ("FALSE"),
.CLKOUT0_DIVIDE_F (4.125),
.CLKOUT0_PHASE (0.000),
.CLKOUT0_DUTY_CYCLE (0.500),
.CLKOUT0_USE_FINE_PS ("FALSE"),
.CLKIN1_PERIOD (8.138))
mmcm_adv_inst
// Output clocks
(
.CLKFBOUT (clkfbout_sig_clk_gen),
.CLKFBOUTB (clkfboutb_unused),
.CLKOUT0 (clk_out1_sig_clk_gen),
.CLKOUT0B (clkout0b_unused),
.CLKOUT1 (clkout1_unused),
.CLKOUT1B (clkout1b_unused),
.CLKOUT2 (clkout2_unused),
.CLKOUT2B (clkout2b_unused),
.CLKOUT3 (clkout3_unused),
.CLKOUT3B (clkout3b_unused),
.CLKOUT4 (clkout4_unused),
.CLKOUT5 (clkout5_unused),
.CLKOUT6 (clkout6_unused),
// Input clock control
.CLKFBIN (clkfbout_buf_sig_clk_gen),
.CLKIN1 (clk_in1_sig_clk_gen),
.CLKIN2 (1'b0),
// Tied to always select the primary input clock
.CLKINSEL (1'b1),
// Ports for dynamic reconfiguration
.DADDR (7'h0),
.DCLK (1'b0),
.DEN (1'b0),
.DI (16'h0),
.DO (do_unused),
.DRDY (drdy_unused),
.DWE (1'b0),
// Ports for dynamic phase shift
.PSCLK (1'b0),
.PSEN (1'b0),
.PSINCDEC (1'b0),
.PSDONE (psdone_unused),
// Other control and status signals
.LOCKED (locked_int),
.CLKINSTOPPED (clkinstopped_unused),
.CLKFBSTOPPED (clkfbstopped_unused),
.PWRDWN (1'b0),
.RST (reset_high));
assign reset_high = reset;
assign locked = locked_int;
// Clock Monitor clock assigning
//--------------------------------------
// Output buffering
//-----------------------------------
BUFG clkf_buf
(.O (clkfbout_buf_sig_clk_gen),
.I (clkfbout_sig_clk_gen));
BUFG clkout1_buf
(.O (clk_out1),
.I (clk_out1_sig_clk_gen));
endmodule
@@ -0,0 +1,240 @@
// Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
// --------------------------------------------------------------------------------
// Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
// Date : Fri Mar 17 22:22:33 2023
// Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
// Command : write_verilog -force -mode funcsim
// D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/sig_clk_gen_synth_1/sig_clk_gen_sim_netlist.v
// Design : sig_clk_gen
// Purpose : This verilog netlist is a functional simulation representation of the design and should not be modified
// or synthesized. This netlist cannot be used for SDF annotated simulation.
// Device : xc7z100ffg900-2
// --------------------------------------------------------------------------------
`timescale 1 ps / 1 ps
(* NotValidForBitStream *)
module sig_clk_gen
(clk_out1,
reset,
locked,
clk_in1);
output clk_out1;
input reset;
output locked;
input clk_in1;
wire clk_in1;
wire clk_out1;
wire locked;
wire reset;
sig_clk_gen_sig_clk_gen_clk_wiz inst
(.clk_in1(clk_in1),
.clk_out1(clk_out1),
.locked(locked),
.reset(reset));
endmodule
(* ORIG_REF_NAME = "sig_clk_gen_clk_wiz" *)
module sig_clk_gen_sig_clk_gen_clk_wiz
(clk_out1,
reset,
locked,
clk_in1);
output clk_out1;
input reset;
output locked;
input clk_in1;
wire clk_in1;
wire clk_in1_sig_clk_gen;
wire clk_out1;
wire clk_out1_sig_clk_gen;
wire clkfbout_buf_sig_clk_gen;
wire clkfbout_sig_clk_gen;
wire locked;
wire reset;
wire NLW_mmcm_adv_inst_CLKFBOUTB_UNCONNECTED;
wire NLW_mmcm_adv_inst_CLKFBSTOPPED_UNCONNECTED;
wire NLW_mmcm_adv_inst_CLKINSTOPPED_UNCONNECTED;
wire NLW_mmcm_adv_inst_CLKOUT0B_UNCONNECTED;
wire NLW_mmcm_adv_inst_CLKOUT1_UNCONNECTED;
wire NLW_mmcm_adv_inst_CLKOUT1B_UNCONNECTED;
wire NLW_mmcm_adv_inst_CLKOUT2_UNCONNECTED;
wire NLW_mmcm_adv_inst_CLKOUT2B_UNCONNECTED;
wire NLW_mmcm_adv_inst_CLKOUT3_UNCONNECTED;
wire NLW_mmcm_adv_inst_CLKOUT3B_UNCONNECTED;
wire NLW_mmcm_adv_inst_CLKOUT4_UNCONNECTED;
wire NLW_mmcm_adv_inst_CLKOUT5_UNCONNECTED;
wire NLW_mmcm_adv_inst_CLKOUT6_UNCONNECTED;
wire NLW_mmcm_adv_inst_DRDY_UNCONNECTED;
wire NLW_mmcm_adv_inst_PSDONE_UNCONNECTED;
wire [15:0]NLW_mmcm_adv_inst_DO_UNCONNECTED;
(* BOX_TYPE = "PRIMITIVE" *)
BUFG clkf_buf
(.I(clkfbout_sig_clk_gen),
.O(clkfbout_buf_sig_clk_gen));
(* BOX_TYPE = "PRIMITIVE" *)
BUFG clkin1_bufg
(.I(clk_in1),
.O(clk_in1_sig_clk_gen));
(* BOX_TYPE = "PRIMITIVE" *)
BUFG clkout1_buf
(.I(clk_out1_sig_clk_gen),
.O(clk_out1));
(* BOX_TYPE = "PRIMITIVE" *)
MMCME2_ADV #(
.BANDWIDTH("OPTIMIZED"),
.CLKFBOUT_MULT_F(8.250000),
.CLKFBOUT_PHASE(0.000000),
.CLKFBOUT_USE_FINE_PS("FALSE"),
.CLKIN1_PERIOD(8.138000),
.CLKIN2_PERIOD(0.000000),
.CLKOUT0_DIVIDE_F(4.125000),
.CLKOUT0_DUTY_CYCLE(0.500000),
.CLKOUT0_PHASE(0.000000),
.CLKOUT0_USE_FINE_PS("FALSE"),
.CLKOUT1_DIVIDE(1),
.CLKOUT1_DUTY_CYCLE(0.500000),
.CLKOUT1_PHASE(0.000000),
.CLKOUT1_USE_FINE_PS("FALSE"),
.CLKOUT2_DIVIDE(1),
.CLKOUT2_DUTY_CYCLE(0.500000),
.CLKOUT2_PHASE(0.000000),
.CLKOUT2_USE_FINE_PS("FALSE"),
.CLKOUT3_DIVIDE(1),
.CLKOUT3_DUTY_CYCLE(0.500000),
.CLKOUT3_PHASE(0.000000),
.CLKOUT3_USE_FINE_PS("FALSE"),
.CLKOUT4_CASCADE("FALSE"),
.CLKOUT4_DIVIDE(1),
.CLKOUT4_DUTY_CYCLE(0.500000),
.CLKOUT4_PHASE(0.000000),
.CLKOUT4_USE_FINE_PS("FALSE"),
.CLKOUT5_DIVIDE(1),
.CLKOUT5_DUTY_CYCLE(0.500000),
.CLKOUT5_PHASE(0.000000),
.CLKOUT5_USE_FINE_PS("FALSE"),
.CLKOUT6_DIVIDE(1),
.CLKOUT6_DUTY_CYCLE(0.500000),
.CLKOUT6_PHASE(0.000000),
.CLKOUT6_USE_FINE_PS("FALSE"),
.COMPENSATION("BUF_IN"),
.DIVCLK_DIVIDE(1),
.IS_CLKINSEL_INVERTED(1'b0),
.IS_PSEN_INVERTED(1'b0),
.IS_PSINCDEC_INVERTED(1'b0),
.IS_PWRDWN_INVERTED(1'b0),
.IS_RST_INVERTED(1'b0),
.REF_JITTER1(0.010000),
.REF_JITTER2(0.010000),
.SS_EN("FALSE"),
.SS_MODE("CENTER_HIGH"),
.SS_MOD_PERIOD(10000),
.STARTUP_WAIT("FALSE"))
mmcm_adv_inst
(.CLKFBIN(clkfbout_buf_sig_clk_gen),
.CLKFBOUT(clkfbout_sig_clk_gen),
.CLKFBOUTB(NLW_mmcm_adv_inst_CLKFBOUTB_UNCONNECTED),
.CLKFBSTOPPED(NLW_mmcm_adv_inst_CLKFBSTOPPED_UNCONNECTED),
.CLKIN1(clk_in1_sig_clk_gen),
.CLKIN2(1'b0),
.CLKINSEL(1'b1),
.CLKINSTOPPED(NLW_mmcm_adv_inst_CLKINSTOPPED_UNCONNECTED),
.CLKOUT0(clk_out1_sig_clk_gen),
.CLKOUT0B(NLW_mmcm_adv_inst_CLKOUT0B_UNCONNECTED),
.CLKOUT1(NLW_mmcm_adv_inst_CLKOUT1_UNCONNECTED),
.CLKOUT1B(NLW_mmcm_adv_inst_CLKOUT1B_UNCONNECTED),
.CLKOUT2(NLW_mmcm_adv_inst_CLKOUT2_UNCONNECTED),
.CLKOUT2B(NLW_mmcm_adv_inst_CLKOUT2B_UNCONNECTED),
.CLKOUT3(NLW_mmcm_adv_inst_CLKOUT3_UNCONNECTED),
.CLKOUT3B(NLW_mmcm_adv_inst_CLKOUT3B_UNCONNECTED),
.CLKOUT4(NLW_mmcm_adv_inst_CLKOUT4_UNCONNECTED),
.CLKOUT5(NLW_mmcm_adv_inst_CLKOUT5_UNCONNECTED),
.CLKOUT6(NLW_mmcm_adv_inst_CLKOUT6_UNCONNECTED),
.DADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}),
.DCLK(1'b0),
.DEN(1'b0),
.DI({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}),
.DO(NLW_mmcm_adv_inst_DO_UNCONNECTED[15:0]),
.DRDY(NLW_mmcm_adv_inst_DRDY_UNCONNECTED),
.DWE(1'b0),
.LOCKED(locked),
.PSCLK(1'b0),
.PSDONE(NLW_mmcm_adv_inst_PSDONE_UNCONNECTED),
.PSEN(1'b0),
.PSINCDEC(1'b0),
.PWRDWN(1'b0),
.RST(reset));
endmodule
`ifndef GLBL
`define GLBL
`timescale 1 ps / 1 ps
module glbl ();
parameter ROC_WIDTH = 100000;
parameter TOC_WIDTH = 0;
//-------- STARTUP Globals --------------
wire GSR;
wire GTS;
wire GWE;
wire PRLD;
tri1 p_up_tmp;
tri (weak1, strong0) PLL_LOCKG = p_up_tmp;
wire PROGB_GLBL;
wire CCLKO_GLBL;
wire FCSBO_GLBL;
wire [3:0] DO_GLBL;
wire [3:0] DI_GLBL;
reg GSR_int;
reg GTS_int;
reg PRLD_int;
//-------- JTAG Globals --------------
wire JTAG_TDO_GLBL;
wire JTAG_TCK_GLBL;
wire JTAG_TDI_GLBL;
wire JTAG_TMS_GLBL;
wire JTAG_TRST_GLBL;
reg JTAG_CAPTURE_GLBL;
reg JTAG_RESET_GLBL;
reg JTAG_SHIFT_GLBL;
reg JTAG_UPDATE_GLBL;
reg JTAG_RUNTEST_GLBL;
reg JTAG_SEL1_GLBL = 0;
reg JTAG_SEL2_GLBL = 0 ;
reg JTAG_SEL3_GLBL = 0;
reg JTAG_SEL4_GLBL = 0;
reg JTAG_USER_TDO1_GLBL = 1'bz;
reg JTAG_USER_TDO2_GLBL = 1'bz;
reg JTAG_USER_TDO3_GLBL = 1'bz;
reg JTAG_USER_TDO4_GLBL = 1'bz;
assign (strong1, weak0) GSR = GSR_int;
assign (strong1, weak0) GTS = GTS_int;
assign (weak1, weak0) PRLD = PRLD_int;
initial begin
GSR_int = 1'b1;
PRLD_int = 1'b1;
#(ROC_WIDTH)
GSR_int = 1'b0;
PRLD_int = 1'b0;
end
initial begin
GTS_int = 1'b1;
#(TOC_WIDTH)
GTS_int = 1'b0;
end
endmodule
`endif
@@ -0,0 +1,181 @@
-- Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
-- --------------------------------------------------------------------------------
-- Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
-- Date : Fri Mar 17 22:22:33 2023
-- Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
-- Command : write_vhdl -force -mode funcsim
-- D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/sig_clk_gen_synth_1/sig_clk_gen_sim_netlist.vhdl
-- Design : sig_clk_gen
-- Purpose : This VHDL netlist is a functional simulation representation of the design and should not be modified or
-- synthesized. This netlist cannot be used for SDF annotated simulation.
-- Device : xc7z100ffg900-2
-- --------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use UNISIM.VCOMPONENTS.ALL;
entity sig_clk_gen_sig_clk_gen_clk_wiz is
port (
clk_out1 : out STD_LOGIC;
reset : in STD_LOGIC;
locked : out STD_LOGIC;
clk_in1 : in STD_LOGIC
);
attribute ORIG_REF_NAME : string;
attribute ORIG_REF_NAME of sig_clk_gen_sig_clk_gen_clk_wiz : entity is "sig_clk_gen_clk_wiz";
end sig_clk_gen_sig_clk_gen_clk_wiz;
architecture STRUCTURE of sig_clk_gen_sig_clk_gen_clk_wiz is
signal clk_in1_sig_clk_gen : STD_LOGIC;
signal clk_out1_sig_clk_gen : STD_LOGIC;
signal clkfbout_buf_sig_clk_gen : STD_LOGIC;
signal clkfbout_sig_clk_gen : STD_LOGIC;
signal NLW_mmcm_adv_inst_CLKFBOUTB_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_CLKFBSTOPPED_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_CLKINSTOPPED_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_CLKOUT0B_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_CLKOUT1_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_CLKOUT1B_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_CLKOUT2_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_CLKOUT2B_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_CLKOUT3_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_CLKOUT3B_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_CLKOUT4_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_CLKOUT5_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_CLKOUT6_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_DRDY_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_PSDONE_UNCONNECTED : STD_LOGIC;
signal NLW_mmcm_adv_inst_DO_UNCONNECTED : STD_LOGIC_VECTOR ( 15 downto 0 );
attribute BOX_TYPE : string;
attribute BOX_TYPE of clkf_buf : label is "PRIMITIVE";
attribute BOX_TYPE of clkin1_bufg : label is "PRIMITIVE";
attribute BOX_TYPE of clkout1_buf : label is "PRIMITIVE";
attribute BOX_TYPE of mmcm_adv_inst : label is "PRIMITIVE";
begin
clkf_buf: unisim.vcomponents.BUFG
port map (
I => clkfbout_sig_clk_gen,
O => clkfbout_buf_sig_clk_gen
);
clkin1_bufg: unisim.vcomponents.BUFG
port map (
I => clk_in1,
O => clk_in1_sig_clk_gen
);
clkout1_buf: unisim.vcomponents.BUFG
port map (
I => clk_out1_sig_clk_gen,
O => clk_out1
);
mmcm_adv_inst: unisim.vcomponents.MMCME2_ADV
generic map(
BANDWIDTH => "OPTIMIZED",
CLKFBOUT_MULT_F => 8.250000,
CLKFBOUT_PHASE => 0.000000,
CLKFBOUT_USE_FINE_PS => false,
CLKIN1_PERIOD => 8.138000,
CLKIN2_PERIOD => 0.000000,
CLKOUT0_DIVIDE_F => 4.125000,
CLKOUT0_DUTY_CYCLE => 0.500000,
CLKOUT0_PHASE => 0.000000,
CLKOUT0_USE_FINE_PS => false,
CLKOUT1_DIVIDE => 1,
CLKOUT1_DUTY_CYCLE => 0.500000,
CLKOUT1_PHASE => 0.000000,
CLKOUT1_USE_FINE_PS => false,
CLKOUT2_DIVIDE => 1,
CLKOUT2_DUTY_CYCLE => 0.500000,
CLKOUT2_PHASE => 0.000000,
CLKOUT2_USE_FINE_PS => false,
CLKOUT3_DIVIDE => 1,
CLKOUT3_DUTY_CYCLE => 0.500000,
CLKOUT3_PHASE => 0.000000,
CLKOUT3_USE_FINE_PS => false,
CLKOUT4_CASCADE => false,
CLKOUT4_DIVIDE => 1,
CLKOUT4_DUTY_CYCLE => 0.500000,
CLKOUT4_PHASE => 0.000000,
CLKOUT4_USE_FINE_PS => false,
CLKOUT5_DIVIDE => 1,
CLKOUT5_DUTY_CYCLE => 0.500000,
CLKOUT5_PHASE => 0.000000,
CLKOUT5_USE_FINE_PS => false,
CLKOUT6_DIVIDE => 1,
CLKOUT6_DUTY_CYCLE => 0.500000,
CLKOUT6_PHASE => 0.000000,
CLKOUT6_USE_FINE_PS => false,
COMPENSATION => "BUF_IN",
DIVCLK_DIVIDE => 1,
IS_CLKINSEL_INVERTED => '0',
IS_PSEN_INVERTED => '0',
IS_PSINCDEC_INVERTED => '0',
IS_PWRDWN_INVERTED => '0',
IS_RST_INVERTED => '0',
REF_JITTER1 => 0.010000,
REF_JITTER2 => 0.010000,
SS_EN => "FALSE",
SS_MODE => "CENTER_HIGH",
SS_MOD_PERIOD => 10000,
STARTUP_WAIT => false
)
port map (
CLKFBIN => clkfbout_buf_sig_clk_gen,
CLKFBOUT => clkfbout_sig_clk_gen,
CLKFBOUTB => NLW_mmcm_adv_inst_CLKFBOUTB_UNCONNECTED,
CLKFBSTOPPED => NLW_mmcm_adv_inst_CLKFBSTOPPED_UNCONNECTED,
CLKIN1 => clk_in1_sig_clk_gen,
CLKIN2 => '0',
CLKINSEL => '1',
CLKINSTOPPED => NLW_mmcm_adv_inst_CLKINSTOPPED_UNCONNECTED,
CLKOUT0 => clk_out1_sig_clk_gen,
CLKOUT0B => NLW_mmcm_adv_inst_CLKOUT0B_UNCONNECTED,
CLKOUT1 => NLW_mmcm_adv_inst_CLKOUT1_UNCONNECTED,
CLKOUT1B => NLW_mmcm_adv_inst_CLKOUT1B_UNCONNECTED,
CLKOUT2 => NLW_mmcm_adv_inst_CLKOUT2_UNCONNECTED,
CLKOUT2B => NLW_mmcm_adv_inst_CLKOUT2B_UNCONNECTED,
CLKOUT3 => NLW_mmcm_adv_inst_CLKOUT3_UNCONNECTED,
CLKOUT3B => NLW_mmcm_adv_inst_CLKOUT3B_UNCONNECTED,
CLKOUT4 => NLW_mmcm_adv_inst_CLKOUT4_UNCONNECTED,
CLKOUT5 => NLW_mmcm_adv_inst_CLKOUT5_UNCONNECTED,
CLKOUT6 => NLW_mmcm_adv_inst_CLKOUT6_UNCONNECTED,
DADDR(6 downto 0) => B"0000000",
DCLK => '0',
DEN => '0',
DI(15 downto 0) => B"0000000000000000",
DO(15 downto 0) => NLW_mmcm_adv_inst_DO_UNCONNECTED(15 downto 0),
DRDY => NLW_mmcm_adv_inst_DRDY_UNCONNECTED,
DWE => '0',
LOCKED => locked,
PSCLK => '0',
PSDONE => NLW_mmcm_adv_inst_PSDONE_UNCONNECTED,
PSEN => '0',
PSINCDEC => '0',
PWRDWN => '0',
RST => reset
);
end STRUCTURE;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use UNISIM.VCOMPONENTS.ALL;
entity sig_clk_gen is
port (
clk_out1 : out STD_LOGIC;
reset : in STD_LOGIC;
locked : out STD_LOGIC;
clk_in1 : in STD_LOGIC
);
attribute NotValidForBitStream : boolean;
attribute NotValidForBitStream of sig_clk_gen : entity is true;
end sig_clk_gen;
architecture STRUCTURE of sig_clk_gen is
begin
inst: entity work.sig_clk_gen_sig_clk_gen_clk_wiz
port map (
clk_in1 => clk_in1,
clk_out1 => clk_out1,
locked => locked,
reset => reset
);
end STRUCTURE;
@@ -0,0 +1,22 @@
// Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
// --------------------------------------------------------------------------------
// Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
// Date : Fri Mar 17 22:22:33 2023
// Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
// Command : write_verilog -force -mode synth_stub
// D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/sig_clk_gen_synth_1/sig_clk_gen_stub.v
// Design : sig_clk_gen
// Purpose : Stub declaration of top-level module interface
// Device : xc7z100ffg900-2
// --------------------------------------------------------------------------------
// This empty module with port declaration file causes synthesis tools to infer a black box for IP.
// The synthesis directives are for Synopsys Synplify support to prevent IO buffer insertion.
// Please paste the declaration into a Verilog source file or add the file as an additional source.
module sig_clk_gen(clk_out1, reset, locked, clk_in1)
/* synthesis syn_black_box black_box_pad_pin="clk_out1,reset,locked,clk_in1" */;
output clk_out1;
input reset;
output locked;
input clk_in1;
endmodule
@@ -0,0 +1,31 @@
-- Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
-- --------------------------------------------------------------------------------
-- Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
-- Date : Fri Mar 17 22:22:33 2023
-- Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
-- Command : write_vhdl -force -mode synth_stub
-- D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/sig_clk_gen_synth_1/sig_clk_gen_stub.vhdl
-- Design : sig_clk_gen
-- Purpose : Stub declaration of top-level module interface
-- Device : xc7z100ffg900-2
-- --------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity sig_clk_gen is
Port (
clk_out1 : out STD_LOGIC;
reset : in STD_LOGIC;
locked : out STD_LOGIC;
clk_in1 : in STD_LOGIC
);
end sig_clk_gen;
architecture stub of sig_clk_gen is
attribute syn_black_box : boolean;
attribute black_box_pad_pin : string;
attribute syn_black_box of stub : architecture is true;
attribute black_box_pad_pin of stub : architecture is "clk_out1,reset,locked,clk_in1";
begin
end;
@@ -0,0 +1,283 @@
`pragma protect begin_protected
`pragma protect version = 1
`pragma protect encrypt_agent = "XILINX"
`pragma protect encrypt_agent_info = "Xilinx Encryption Tool 2019.1"
`pragma protect key_keyowner = "Cadence Design Systems.", key_keyname = "cds_rsa_key", key_method = "rsa"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 64)
`pragma protect key_block
GbQWy7xyRnDVKNEgu/syxcQSo3KIIWjSBPIwi/pSAYCe9sIQf1xA0ykhHf7s3r7GRWRS+sel+0Xx
XWe4lBDDrw==
`pragma protect key_keyowner = "Synopsys", key_keyname = "SNPS-VCS-RSA-2", key_method = "rsa"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 128)
`pragma protect key_block
rLh670IEMVEjBamdsB+LhhoxrK6I5H9wfmPCOFqaLelJt08QWbH7WNvjIhNNz7hnkT7w+wDWT6AH
9ZJgOGPSJmj9pWoXHAojkkRBTIXpFT11+IDyFQ4FgN2TPXWILoYGY+uZG1GlGN7dsEIm5HUCUy2c
eVhT3XSIJDvufMyiJUc=
`pragma protect key_keyowner = "Aldec", key_keyname = "ALDEC15_001", key_method = "rsa"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 256)
`pragma protect key_block
KgKxjU+tI9TXRZLkaaosEf4JcTfzGtF82aOinFlVe78eUyHdMvwHHcKsxUKAjkhYW491bZ0jTKit
pNc3Ov7QvW8kjTq3JHFuCf7SmCYRrmElQv0XobTk6mnMb4khaXw9wTP8YMS0XAqk3Bksal+aKfvX
LL/afyM4UwBfiIb04ZgvhdOlp/dkCqWqZyDL2qVScyGrZcDCW3CCZTVQO29hqMLZP5S82keXpBv3
5J7nHHbQ3n4dxsRykYtJtwg7JDyqGHiwhj1HDtjhG+LX9ry1wy5YgvxrzSfKoouAeHCKXcG7TY0a
sz4nRUsC3Yg3/CybYyPjvVJDirIzWRzSD6l1DQ==
`pragma protect key_keyowner = "ATRENTA", key_keyname = "ATR-SG-2015-RSA-3", key_method = "rsa"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 256)
`pragma protect key_block
ItrqCM44kZl0WwWeSAjetSYD0fPwYZdVjFp5cRl5XZyoYOMWKCVEXncinM06x/MDVlkYiXgz2Xqn
6ui7jR7RwOKALvqoqdehIoXZUA/5yPMntFpxPcFIY1DonBI4CuMjhqCuB2RkxKNIco5Z7/QxCk49
MCUlvIFRd2MXM+zvhCRdja7e9blnwJEUETukq+EKuAwuR3+VN3uzCXsNtgBqMZa2CyM6Z60fStuc
v1eiDP/hxOimuSfsS7evakl5WMjgZuj4Jld1+y5hTOuPvw4+s3KIb2ejIH2r/I7ui7sWUZTah36a
4QexKWP16Ghv319FCz4KExZ6lY+7HuoO55lf4A==
`pragma protect key_keyowner = "Xilinx", key_keyname = "xilinxt_2019_02", key_method = "rsa"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 256)
`pragma protect key_block
FGUAaXx6dK7W5dgDUXY6j9xLpCHdbPvbaH+O+ozu9kcNjL5BJcGWnTdooAxaZdBsOZBvrVuXUU4v
ev5owQI9+5/+8aoXfeX2zZHp++ESqotCFj5ykw8BPjwCOCZz+tiV1Q8ISqf/NCuDNU2KJyvQUsFX
cOXAwCPvrI5SwQ04u9sVTaHwAuTuRw3j6nkt6BHWrjKpq9pUfNH4L04ag/tUGVpnlcSBGewN0ieC
xkzVV1mPCyCu/thxu0k0yda5pS/u3MFeC1N8rTrSsLEZMUiPYg/BwwWGT7D/s9FCMbbM2kyoUXpa
draqn+K8c06CQxLI+ieilCd38M25buwOc3ANjg==
`pragma protect key_keyowner = "Mentor Graphics Corporation", key_keyname = "MGC-VELOCE-RSA", key_method = "rsa"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 128)
`pragma protect key_block
ucIv1ZvudBg6K9ubpyCObknzSo2JKwxETiac5kbTyw0xwj34bo+xJ/DnUCoAdEVHZcAwDc9Fhbhv
j5a7MwnHY+TpzDjhwdN75A97jOZ4V65wcuFErbH19OSacDchGykcwXCiaA5haDJK2hF1qPxu7TtO
R19uHYIhWP+7IpmjTiQ=
`pragma protect key_keyowner = "Mentor Graphics Corporation", key_keyname = "MGC-VERIF-SIM-RSA-2", key_method = "rsa"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 256)
`pragma protect key_block
AI09c0Va0j6swrG6tMKXPaWcjMpXDnvuIze3bAe9Cj0tCXFumugM/pZL81X53kMwmKPvRCpTi8DM
kLLATubglrp6DudyaIY943skTmlH+as6fKaHODrTcy4CDIP4kKrok/7y1rBI6+YAfN3ZIW+45MiV
cHuhXHXxxXblzCT6obAZK5QUCP2qZKgO0jjI1RD7ZEJuS/mX5wkIAvOe8L1HBkyUsRq6Cu30W6u9
7VI3LOy7TZqb6Nix6Ok85ylO82KP12tdXY2IRivakKu4fdWQ6vc3ARiefSR0+RDmE/eZzhzQbt26
mf7t4ZoEITJYnmd5zcenAnw+6AO3fUwtTLT81Q==
`pragma protect data_method = "AES128-CBC"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 12464)
`pragma protect data_block
vLDJJUgjrlRfGtI6e1+Byt5lDBB9Oezy8FH9Uy/Lem9icZpnVjts8rEqPHcw31BJ5u3y4ePWkCUm
QQfQ8vh3WaO2dCX+QhbDMTmPaIe/t8nHJKefrbW5OY3eRKkptlVSIFCFITpJlzyfpSe0CsF+dWLc
F4J0aJzlQEKkTcCFk2ey1erWcvHgIf6eCwkGouO/COjRPomcaMzJt3ty3PwhKodmumGUICNXKjG/
lH5VI4pSkr0hpeNp/WZhHstrrYJB7GSwMCqfL0IH36wCF3R29Yjp7ouoogJ4+imS5vnMJpU2Czmi
PFyY3LiBeZ4VP5b8Iv0AK4XoJtM3XG9iTBAC/oslCJUtBhINFPia8EueAVn178qtq+htmZXlEAbM
O43w6xZ55fggub8NiHe8M4qAhDC0nwv3LBVndn8xEKF+13iwSiqhLjU1Cya8z+0j0TUExIeVQyri
OXh0d9oxCJ2lfPtNjHZ3LkjbMLvzdJG8pBuDtx5952IJrwkJIaT76aOEs7XK8O+cfrtfhh1fPpY1
XTzoMx95+Qp7Ay2J8NObIZHBuUKX2ORE3b7zSBW5FPRjaxTibHQ2blQzoAbo5y5f30hxOHsi0+Xe
D4bwHKzoBpsdKAyvlKom17BBx5Q5KccIElz3z9ulgthM6zwAWmMVPzQnJAhmz3Hl3t0m7+YNA4Ia
cg/H8tiXcV6CEnRuaFRr8dvkZAlT16o4u+tEwi85XgpkoApFQ7EytG673+LigwZbb2C7khwEoIiw
1LN4Eh9i2WsLPaEipn3q58x1rH4/MEzwsGw7loWE4BkCf+n5QAWYc/nk4xfSwFTBvxs6sPejsrRX
qbtO8ZOnKuVTT2ZLwEtvGrf+Ii1Xymt1JsQt7Z0QBWTykLt0ZhWTrPnMg/zcRxyRCDNYWVJx8JKC
Fjg1XzSDYIYff4HaLPjmiu5sPEXaKTQJvaZa52Dq87oKwWI0A3g0ymKK7UVXrmX/odtLOlHIxuhy
JnruUntWueD34KJMT2lBO7AP0g/OmHDI6v72Q/2Tk66QaWfnnDJl6qRN2WDuGyNuwSflbEGQiK02
vyM4a6K9KN70ev9aLX4d2m7Uo9n4GFbdvjakrlHDS/K+TRs6XmOa+y8ErWxn9Pfy9UyRrFg1TdQb
Zk69XUdoQZ6CNWoKazZHaJ5p5+6nk/G0nm8LR039U2sqH+B1hJMuvFvsx4NzEoYpE1jNsiy4B9Ta
ArVNSpGuZCA4Juifia1UC8m+mMYsLBACf9YX/Uua3EeOfU2CEi5koPuBzR/QKb/1oRa3x2oux2Cf
+p+HcJdQfSOpF6AkpWZLChsoTMd2F24Ztmjz3/vNIapPf4rcObfDEJwayu7hSrsslcCIcoXdojo4
VXLn2QFVUYMgSq3pYGFywvmQTA5x/JAfOcWO8IBKdixvS3F6xSTwH8JaKocC0735inh65PwNjS9F
2KIwvgHQvLpCxNny+0NvSQ7ETTouC6xXj+EUv4bGpml7J3HNjixHtTPfYXf7cl0mqQmUDJu0wLkp
WuvXFDvCxpwSZ5qw+1H5MPeue3MeB1Z6Ibu51Fs1EwnAe/g9C0Mo1XDCD6LfVjvpZYE62HzlzF/K
IJoLfeJT0O0VhjqhC3+M3TGXHNYm6chuUtfNR31cC7WgG/QiHYOVySvp3zljDZWrxsgHO+JwhbQC
n8ALL+g50X6+uS5w/HkFBsxwCIocmViJb0ojg1j2ncsUjwwEqkDBprVPYFh6Zimk5SJ9f3RO6pQj
saDd3hitIgpMf1ha8rpCYBkwqBTogxXfwijLMplBdGWVGSSSnnp6jTnWb0sV2VPA1l2X6Iq+pomM
jilYYfQ2dBuXFEMpQpwDC3/8N4YxpDZWX3gtyK2XV+2BcRONvrl/naflTsXxuXAhSxOBqggJw7pL
HvsOGKk0ng6uKC5yQPc6Q0SbWwwT54D9vLM4U1OiRKPpL9S1YXak+W8ZCXqdHkQNlUlm21ssL4dl
Et7q9IF5Vil/wnUjm0nJxVZ4QJU/uN7icrtnrvAf1gVLwK3fpC0ed6ku9s7Lq1KvNb7NEPDrOu3Q
hg+xhyl9MJTquidnbUsYlHdTvVzxIkI4q/1kx5mkbEjiIWG0R+haIwSqhTCdxpxxTgm+LGAtWJ4W
lEuCQ2VEu3cyamx3PWNKPt+CE1VayIkgGqEBXIaGpwkymL0y6hkgrA+q+2msQq245iR7XC83U26E
yb3da4UnYxL7g5WjJCSfCdNVOkKS1Yl9VZ6XSW5RFwWIdURQyewZxfPKaJWsDAGfpRftpZ2mOfIl
DP1TwLOJrgsh3QI82hOYlUbHmcPIFMH3Pqp4OpbOBRcPcZhabwMA3pidOtbloqo5pRGblsO79JSJ
OdbTH0XVln2LAlQ0bOmaMt9/rOwfexnMgActW5gvaaxAXuYDKRM1UMECbAxeXCwqzS0dc0V8ypcG
fteDGHXMo0F/XAmGvVeyXJ9wCk8OaNq3QfJv7J98GeFlsisK3g+DzyHnma8+DPiQz5fXZYlWQATB
TYmRqvJl1KzKtTAluhm7MMLb3F8xL2NDeGuxLbfrf6E9zY45m5mPjZ9RgD7Lp/aRq3yRGIHZT/Hj
UOW9tPIFXsnd71c0SWPBukdkw6Iu4mmRap139EPPn1NbxII0Kx4bXAFSaRSVv/XzPy5uqO62NQBW
NGvw4f1JGumSY/O23vkXjZaGvN+S0bz8EKrqST2JR7xwKXiyc1EiBTO4wNbd6azULsK4LQc7wEe9
fLtkLqeh1/tDw12z4e/cGuujh09rf8Olns7hcq6KvzDyM4MT1hSizKeViDqgTaWsim2icOPXIWGf
sFNi0Bc38qKoDMEnsp36riwZe+y4DdFzqzq0Yrr9+0B5ByNMyLSvi4M65KZswrHoq1MwgubuGmRu
bnAcGsxnoNMIlXHHBxS1+kIY2Dh9+Op3PVTHiBM/kexi6XMyY9pwe8I7Fd+L4PTexmvNKi2x2UOL
UB7l3OgfCdwQ1+9QgliX4xN46NNnISm8EFE0zpn4SAV7B38UDLL5XBcO4aOW2/+q4crLHtw/9GsO
Y/Cx5SaOa3cx/2UTFnVpxTvDICQyosM7R93SgxQmmXswXIdh8L2v/X/bojwYGYza/K+ZJ0+GVEmn
nCagAUyAPO9aMwlnCcidIDOIx639+B7IWa8jTYsObePK4Ghp0//E3pFZ5vIkTWsQXfAYwjvWp2BP
uzZRqK+C5GbLkw7SZrUlFK5w4BI7ABx4bYqP78Tc95Ps8aGL0SCwiBy9wMXqlvcjOpsy2CWJcBBL
No8TvQKlYRdWealaPFJO9gB0RF3LDIjFwXgnEoKX0BxHOftGEX13le2Gj+dqsFGgktTXoPqVXMnL
PadND3iSF8Mff8/7uoQGaAyV9g5DOJqmQLnj0eF2QyoBvRGXBL/bKGoIll//kBqaNk12RuOHWHbT
U3iLXaTrhf6yOmDHZS38ocYG3lcoaDi9EBU0SpzR2m/JSjAWViDRbV14QeUf5lflN3TECF/z/MKo
gEjxx6dUwsjIVt7BIZZgOL80YeU3xkS37nzrv3xyl2G0JIC9mpKwrIQHkyP7JC87DWrMHJOYHtjt
PEi+zZL25OwIqRTZP4gg6kmeS8iRsBEL+Wk7s2gqpe8V4NTQSt2HTXZp5AmCgTmS8a0DR/A75FTA
oqGCUEQmrmej2XJT/KbkzAsUiZnJmY1k7SGAZTnNXaPuj9i/AAUayAg/URaLLS0rwvoFuiQ+er1J
ybk7ldZcUYpebiVjfe0oBAa2KcW2qf5kI099lfylsrU1uO6XEmh1+VbtTRbuUrmEwJVG4p9UoubF
AJ5DHGvb54gwpkLa3TRT+DjjpI8s0l7qUFB7R0tizSDuDX64GDdpM1pVSkFBUHll+6mks5or2/VB
Hln3g/I8AdHS0Ee5lAgRL5Vgy+KWSBTLnjmXLh2PLn57BNiULh7VPy829wKrZJzgBOYcGlMu5kVN
i+q/xu2QYwfcgRXDwljWcFOQvoqkcg/ohyPA25kU5XTO426LkqCkp2B0LjwS6Ru0LFCAT9VD7Xfs
gC577whnyCFKF02by8lumThgKPi3e+MFtFtUUP4NqrLVuoSbDZsRwrNLyTJF5CT1Wl+aOJGzBGLb
aL2kFLF94YfyykQ0o02bH63Eq/QsrvKdm76fU02BuG8sPH+GK1L5aPAurh/ab5w1JeJBFY5pOKJT
4fTwDyIeEAJz40vvDBQETJqKAhx9slR77zV2TVAcxQmhXXAIqZXXBO4UNgOILVyLPm8NKFZWdS12
5rxQdEE0s8y1Rlg7X+kk8gHu6a/p0FivgMMDJuguKcf9ny0SGFHsgKO10TL3rr9swBrfjeJFqAHl
8W0pH40VE7s+aSVwYDpLrNXaIj1huF7Nq8R6N7mAzihrKyJtqe2DPGthc3b84plrtQYyABnDsPcV
XbMi+Hx7t/RKzR8L4kpXW5iFnOd7LF1uNCDdhIKWpoUxHnK6vKemXGK9h0pRsFZVohQ5sopKQOyf
tJ1isqkEpBP6oxCvnVnRbFV98aHA/yOywevf5nDEJAphXQxOPUg1wSrYQYyqMfwqvWNmTDuqN1go
rW1nqIaOkZREKe0NScx7qC3I+8/ez+12dTJjqyv77G91cucF7CB+uApoocTDq4tPa8LQlR3qLjzq
AxZ8CVJ3uVUgYv9lp/EI5Gb0GrZC3APt8tbR5WZC1E54EoOkj5prTRaon3PVL45oSNcPWZAcx/Gh
sXORdqYB6CW8+sC1kSQfKQJifA+ZAyRCvvQihld8XSpwx1zUa+LM6lPLA7wlphZ49dGLYr2CkQY2
tXqToNQ3zSltn097FYtScosgXjCeZGa/4TktbJTpJgvxNpDtJqmRtfQE1ADqwSLMbBavYK7FGTw8
XgWElR1F/Qub/wupGjRfM9hciZyVh2psk5atHuL8/U/OeXSZaiirana5yKNG9ML4neG+c3Ffrvrw
dgdUbozDo1QV/0Cg87j8rLVdFRgM4BRWPCmhg1tVdr8IMCd/UzggMBXmb7mbXAYbnVAu1Vqxb8/i
EbdzYB08pVdUn7jlTr6MeLNinFYRTq0d2j8xKP0hCTHVXHNbqU39kREEe68c6FOF3SiJXOX8qtnL
D8YZlKOOiqCzd43er0Ysy61SsfAstKPe+dg9vZmsoE8/xcD/3/4sALY7BlWJz68btYgaBASDCU//
6gqk28sSeHQARhFY18vCNuLAf+dRD7Zze1Ya6kt22/nstLou1lRgGmDjNm2O3iXExXIPG/C6YYIm
+ZMypy+ZdUCkzpEzpaGk/3BrdaFKH2s1N5sE3fWaA/BIIFxLNPVf897o7Ij03t+Bf71s+JBR3BUV
9y7JJhslPI2/daCPSJ3oktvJIGYwLLp3qfznlcZuqdPdzlhN1T5TWVZZbXFFaL9FGo+rPo0dKrbM
Wo6hmW310X/qVlc3ctYz0lvVkYns67UDHVrVP/SBQPIYETmt2hsWlzJU1CRCby4uBBsIZXwe+j2b
9PW9ETn2gyplsyBWewR0f5/xsB1q6Qn9zG0usHhxK9SGLeohwJlDS5YOLB3+gn57VvtBcOCMY8Rr
UEG+pgmDhvBxacswIQ8EI05LKINgsIRhfgBpZW0mz5m2q8kIOz2BAJCvpJgP0FPevu5Aqp8mIQPP
XbnfppOC204x9UzilksaVjLDZ//txnmXZ8uhv62NP6MTQLNvbL15Pu8l31x1sbOV1qYZx3PAsTXJ
vllgzGP9ABfPyx7JUpV2evLblwFrNERmZ2+zXXJpqrC1Y+Ov+y8h2uwKsK4lKHdlBbHwThPq2cTq
KTkMYt6RebsvxZFGgJ6yCPdBhTx2ChLIQcmCPTj/Cm7ObdneYwd95jdv9iHg/d9pfG86QOUU2C5G
xLGBVWEFe99YFTQQ6P56UzhgKPwJw+xgM/aTnoym0USW+WRbpF8pO5vXSa0UfxGAGTv9q7JqkHKr
4iTBPPXJtWBhNl5rzUh8OJSTjMKQTLIv+btrrmsLhWk8Nfwa1GcpBoLBrZOxrwP2f7flQSnVnpz+
4xasi+5di7/V6xOZemXcfgKGWI4wjehafy0oCnRFIPOfEiWVQid2K5nodgxJK4q89nYXd9OoqRTD
AdyqlFa/Jluk0IikDwurqAU+Xup9pJI3C67dOMX7naeOYGZujxknSJUCO7Kua3mygTXk3bUyk40U
doNI6/wljhhP3iWlzB+n/kaUg4HNcwZmZ74uX9jpIunTr5tASrGmrQO/VC9CHD6+Em9UYj8cNhKF
7CqnnxKng0r5zt4/aG9G/y722aeAk16U+4hze9jyqG2axwKnNxd/UVmw+GbZLsCDlXr7zSZoxW4x
sM64LaY1oGJobMVrrqdby+Y5r+5hKeMT/44jo/aNf+6eMxDYoYTH3epAwlH7bOCmeamTo1huxBZT
XThu+Q07lQaDFZqLTAblck8J0qkr2HpxzQgqYJrlacxkUALRTyrw+jH+IZA8N/FT6RuQf0+PbN78
VIRBJSqCQl02jGtP5rsSn/HycL5Ox04HkdfIH8QYThUzR5+udvtklkxOZtOHBUdzBW8Opljffh/5
k3+es50uiyKTgL5O+iYOSDkjVhojw4mQAEH/PJAlPXfy8VPE8QqCTWW7Ed2huLNU2naH5iS1T/Le
ShJB+/lO4hv7daACsQUBy3CvVJ2+ruK9QJnWshHcq/0FuZ1LJF76ux4HdJ9RoVyOwBD6tIUP+XZK
cr2VOw4e5FYEpZpZjXVEx1/ENgiBeGAcr/UKTpt4voXTk6ea5eBtmIgEcPeWZU2cKBgG/QaO1SXa
xSWK6eU+7InXUItxijDl/lnWPx9CVPV1BCfUOkcz3EQ/HL0UeaAXmhzyJvka0zEnjPrrQkztRCge
t4yP57MciI/K3OUQ45ZORC+vL/6bD9juHR12kKn93LtWileJJ15bGSrOtGJIoaTR7F29WCDSEB5z
yjzl5n/WSWcSDiqAR+S/ZC9uWpkQXhSD1oPCwsQSU9eEce9nvDm2E+f4apRAzWlwpci6r6gdbGTL
h4dTrEIgEqJVmEP9Svu+2xHIVYTcbd8Abkz8JYgHyGH5tifzu6UWSu2G9pIY0r8dBelnxZdNheLp
iiyUBgnPMv2M7VCFZLpbbJzBF1MFN/7jEPHiW5dA/nwvL5v46yg/fYSA9zV8Tz+aYVAMxd55bFTz
Ws/PjjIQrtifnNGtyR63clFuegIt+ftcNC34dPtQqTqgoXwcXUG29idHgfvU76Fhm87ldyWopnsk
aFdduRQA3+ZPnXMIEmNvEf3iiW3DWFaUbP1d8kCgrwRBfE8+v7HHMI1QJP8mTgPv4Iy7l1elI0y/
Ax6MbQaR7bAvQlBb2iu/LJF++LJQsWnfHNyTBe9h85NaH6zRuZjpc29RX9JjnCO4nBRYDSyuSDSe
fsX4pIWp7xhlkhE8Vq6kJQPd+LoekUz7mOchfv4TirPuh3HquJBF8XAGmgdE9tDWE3CiXJIgkQVp
dbrFhqkwem4OlipJUY7yZKEzOmtHtwi8BeN3RaiOX+rUpuAa4knsAG0XF8OAGljke9T0nkX+bQ6Q
kMLmcx1ZLotyx+dwituzYg3n3/2rLoNaDCrxdv7eGSiwEwAQaGTE91GfsK/bW3LilAlBF4slbiHO
Gr5i3euR71fgubMoEbFNK/CTI56XnhBZKGNsezvyNZhTIctMPxggNQ/BgJe71lsPcLznK44PV4aj
7Q4qiQ8dRtlJTgS3IAQvtTAqvLDcUSPnq7AWHavmljjJT5QX+rDJsNvJXfrcy4RGQudCauFNIxqe
GWq40gIpsl5qdSLuOy9j1vP3uBz2ioorlCf0AE/TCs+XZBX0M4iQo97CSqrRVsVb/ycyRjzqFKDk
ff9/m6kuAdIqU/8DWoq9bmb9RKRZqwG0jGteggwkv3Qu7OwYzYczHpW8QHqMxSg5VQuP2bRXb9J8
WGm80TYiii+TWVBifZUrikX1sIO6gpBP2xRZDybWn67xaxQ4aUoMVR9F3tLo+pH3M06QuwRc8UVw
NJnDRG3sgmR6i53cvdLTfYzi8WNesxlcL99IRwZ+8XrSPr8bDyibEJVtCkpNthFHvQ+BGtQlt7M1
BWgz4VlLW5XG9g31idaWDyM1TJPGgZjePDguHn3s+cowoTgl8RjcwaO8fXqNIDNc7Nqw7DhCJXxf
OOErW0Bj+5za1YjEQ+MHEgLWJm7vOeWxPzNwQFslWXWeypM02ONdpqRj20w95++SlZ2zKvh6dopw
3uNDXuMirFALSIbwUDMYypbRHPbGhRoyUYQ1gyRo55xdGUgMTNmbWWDE6UMCp1mW80oGpR6OWmdO
VwFKsuzeGs1ALnTweVm36FPemaFSzk3pc7rPiZmdhs1v7+dw9FYjBttfkwcf/Iy7nk0Ev8oSFRZ/
ex1zi6BXYS3bILREFMpWuRTw7HtE6I3RpaA/k3OzHdMzZFml4Xkn7f2j7gkhPHzXToR52p6f/P2G
oPD3blyogU6TUQ3LKFTqNiqQZenz1x3XdwqscEp/4i5w4fux9cjWwrVI1Dx6mPJ1tCNCi1kEIAZQ
zOdUeZKKPJ+gu3/PfZBDdCZTZsGI2XIoYJ0Vk64K48gnuUCK08d1pNCABh8YBXF2zT5pPp9A99on
j4mRR/u91Cel2mHReNJEynTJHMuZzf4BmXj76H/01YrVKaWyLJs5zSdAykxhA2h/LGnYEaiNBPWb
39te0WIrUs+IG2dO91DB0USld72iU4jEwSVZzvyPNPL33uNtNSZYayM+g2cYg7U4bPcmdzW5YUJR
alsYJPrDv+KlKSqyj3EulKAAql50npg0tCM85ZMPE/zz6d0uC4cGWi2AkUGX/9dSBE1/0xgfQveU
0+OtofanGvTY66DLwOtQegffJlegmLvWyBa12w7NxGVhm8RfpdDvLyVdc4sBxzM6zKVpwcuSZy/k
seYqXFSq6WE9rb/d4VC8Ta6QLg716zEh+OklBSyeF/tbD/neWeVcJkZMzQ6w1VjihYLGqOnDBNlD
UB3KNJuEqvyyTK1zMVBmluGZhspXj1yq8ZV2xfkxiEMLL7NpdSSItMlZTamNo9nGYpLMFzxKMAxR
teItxoLs9ZKVWd8fW/P1iTMKayoh+aTg2lxH0ZCcdyp2NOEjCmkTAAXr18ZRN+WOhhzMw3uqwzNd
6HBsbnlER/M8VsNgP+VBgmuvRNBlUMuJT+usv/p4Q9Bh7yFI6XhArqBq1teX6H2scn8Tn2WNKBeb
9u/30RygW02pSX1vxKKLkx+ytrAnPVpiMinMiRLu32R4tOaI5jj0l0kZabn2uIArfZv4P85wG5FT
LK5kniV1MkMOL+x3zk2BUaDB14bStOfLzZSbrj4wKri0MFKlqzWzTUG83q18kJTF5Gtm2NuaZZ6U
W2WilwcqBSs+I4Tg0npMEzVxjngyw8DHp+eYEmrELjH1sGAaF4zTqFcc0K3Sd090sJPnl8P/Zab4
CILx8N+ma0flJZWl9A9ONOokCHPJopFlVzikH/EO+/v6KJN3fkOnxGOCqp0F/UjxA1dAU09O3saX
DupicKgsOh56WdrVad7VIggWzKI+HlYW4BWhFFtoZQTMdGg5OHzYiaCi9Bui1Zsqp/wPy8T1KD0e
jBQPyxGZ/sq+ul19GWt6clKGKbMWgewsWBqAR/jgfIAIMkTkvG0CCdUkVCYBqtC/7M8fPAihKZ9p
Xpqo3FDK7g9NjRYqnH+db+SOrt8GTSZabN5cgWW+D/LOOOAEhDCNwyDKGJXLKLTyjTd0gwfXrcfQ
PnW526o0e2U4sP2hYSNWZ9fIJMlSKDfn45b/LgMj+uLkcnSu07pbcJIC9tad9d9vd4JMVPZj7W4d
xz4JQjCqZyZOrXaceYrYee5H/BbJSTiHq6/gr9tNJscIybuvKAHDTl2plPuESjfVlczmANiPcQEF
Evn0dqw7zpblg3aExbLNpjLLX8IcEpjfXD/Qz/hfk/UPE41U6UviUwzkSHE0c9xHVqb7nHfSfo9S
7pkoZKV6Cj6RmsmKPnjf7/WLgoDeGBEm4Mde9fhovbwmrlpI2QcYsuO0dg6vo2Q+DeC7SO9wzGOe
TmmxM3WXjhDy2uiDyls8ZUwruC7Bh0T+zHljR47iWDw4A9RnLWU4GzBzuS2TR1LWbP0Khrz6DwFs
nHD+b8yGBFdI8rUA9r+LJNBy46oo6pg4bwkhPrZGGvJdpZkXFQ9itfGlsN/TZ/Jo64v0Z5ocEEkN
Of0nVQpDnBsPhDDgj96Tx+f8sX0au2/KIPzZzV1hivOmWnIqgl44ZWLxVoy0ns/w3kF5NoKo0LQU
s14F/NE32TD/u23zSOJiDe1LnTKJgO/0T6ulhs1iw5upeq6rCMEEdFOIxQcLbCsY2A73mJRnPHmR
lHN9yNCDpuhxCFiDeL5/Shm+lxStfHBLHmUb2f/jVXorCS5SQFFgpOGYef6qyQPSBNXciZf9Sbdr
Qnu10CkltDgf/0saImmVuvpWrho3booiXFEVOSPDxOBZezF43Y+zyuFNrvkDoo0z0vAn7pRctJ+M
en5InchEyM7kTpQo816yPYhq932YEWpT/BL/XthZxXuC6cRq3rxmyHES/t5XlqEKFyok9/OqyJns
l0KYVQijY1toOhWysECQ//wIdzHJAKPd/LnAq1VQd7p73mbHc8zvFaG+hPNeG5PCmEv0NbxWIkSk
EyHj2QblPQi+vdwOA8/lLZJTLn9k5HEB0LK2i1qn6SbzyamgTMgrK4+Yz0oLi8XRq5x0Ebx7e7Mg
m4HXSRNragMZA12zvzHaepmX2YTHdmaLXmAq1lbh2wxbo/KXmFBLJ8E1RxubY6ZNznO/We3bqSE3
xyaKhdt0VzCU6ZwJNsK0N5xOqFn43zajLltRs1zmPrZ+BGj3fBfNBtu2ZPJBkiraJG76VhuBa3HN
AwljiAVWWeXuVTOQC+SoPDceebdL21D+TUSDg3hEAM0RjIyYv19Han2s7BbaaXpsrYqsLHv4+VbA
qOwJVIli+TaoCNYkfLwTLQVuD1wv01kV4qq5wZrjOBv9eq5vywskXrvNi7vr4x21UjQqYTFmkEPs
Sy9tiL0DgA3pRch8vk3D2xaf4Z9sK5zR8YqugMVsAQ8sTn6hN25znEucHWxIZA6OTbAqe3SjSEPo
yscvFEtiZGMpSaO1BeWc70tM1JSv3Mq74tWLOjnUxdAMXr2eXwf83R8C+r/C2VHXpKZlbNuSptyQ
r+TC6oJKmjBTiViyKAtMUkNX/puBz/fkHDAPPQe+eNb4MFxvkJvl1zb+Jyb57d8mCYyhz19+TZ0s
EOB7MpKqqQjz/AlDHzIYSltJ8wnIVsd2Neqy8y6OOYoyYTN27vPyWk7G+h0Mgg4EtmAWY/h55Pyl
5YlNP4Ll39xGxdlk1xq5Bt2kD4b4e3laUAvM1h2hoLD0ouVwkcmdPTAL1bcbfQlQ7F8QWd1WrDfw
L3a1w1cqgUVYKSmnsg6NJ+oLOlJQGy8wY7yUvXmZfFDySiY+avUR/t2i4XWwX+lRh08bQ6ec/tt3
SVbDklDfgVoRVmrbxv4sQad5EVH9Nn511AAa9lWrJLYdIRC0/LoNczEgM0uaMYb46hxrrwJ5fGef
uolQ4Gs77vx9keudHpiqRJO62BdHgDCaYDUltxrknlVzb6j0VRqRd3YD8a/N8KX8njOn2UMU+tsz
EfJoQeB/SamZ5cjNe3DOHG9fptHNhpH3AgupdeHZhOa6s3Qh+1QJsFn04Uy9otihMXyHUfD14HHn
TTGHg6eEuDH9RjVLpJ9OMP0BhvkFRRVwT9blnY+V8/LU8a0guNCUwAfEKEQx99yUC2mWSa5/bJxy
Z+Nfl3wmXF9gLlhmCEIlqHFCPTaL6g6tVjtT6KwqxKfFdeQ842GhWblC1+gT7NwiLjntx6UxXdHP
jWyovNmstdoZGvlaiC0UPxdHXmC53mEE7xslGTy3x/GfvwD9Wdb0QyB0pn0wFU4dYg+HuuJ2tZk9
e5N/9xEIk7/etVr6+gwmhLy6HVukFRqCEk8+2plhAjmVF94UUrLRm0eTWKmgu/mi8ertCPhxhmoX
ByW+bhc+mQ1X0Q4zeO3YljMM51iXstIO/2gR0Re7khCmgQ5g9AdkHaPvBxRxZXaPoCw70Ir0PXLE
dE7UDCznrXz/BitxSJgNJcmaJHoBVskzEOegQhAhAkyAV6SZ22S4AKMxb4Mb8BpkZkKNz4j3wDbl
CRUy3zK6Tjc4Nqy8jfhYaRynMhBQvSCPclmmSen4vNnqXI6aQhYXR7Z2AgOP+Ap56ss4IbTy9KKi
OPkun2RaUDAGa2Lwjc+PzMvdbSEnnlvTleo/uFqy09UJ5OyrjkIJNBxDxfHJ7IyNGdoaW3IefWAX
rKaL7xvop3b5BPqWMvXXRSqysOzyGN/s0f8fiCrtHI6ym2xolwawx6zQZqKKv3Be+wKvTgRT2sh6
xDJfQ3A00hem1RnQoVtPumBwow1QQbuVd8TNu7arV8oM5rKM6NMVecmND12ayeEVgKK0N/3IdsYO
F4MLdAOd4MebirS+NMRdcxb2hdfFbA9dMw9Rce7q10x4IiVU3DT7Vo7IKHnwPOso4A2+hWaTt5Hs
gNH6nqK1WaFHx8HIBktEg9tGl9ifBfYSuisgMUHs+1/e8ZwMmn78iBvMaUkXR/1m1SAK13gDrPOV
2KRk1f8MuUONuZtRHbsSsoRzeEEj2MblEFIUkXKPGSnGtpyaIqcLKu7qSNqEWbd3Mi6iqZyAF9ur
S6PrT631ucYj4KsgxamK3CkcPnro6JRXoW0bhfZ+FXdUMudyp9ciMAmR0Xm2CUwwoLb8BERVr9fi
VraW1mYpdUtEgGUyYF8wK/m9DtCWErSUVF7KTwXcQ1v7cC9UYluD4y3/NQoOAkmLp3q4iMvI6Kr9
wXPu3xTOgClz/Ske9d5zj9FHXX17ahUlM6L4CEP5hQa6NsPaBp1uykxeRkQ7/DTbuP2TeFNFCSNB
c0MrXeXL8l3KuVjnQPG3zoxDIZcDyRavpLLamqDLergVscng6L68Yawbsp/7V39jWYmit6uTXmp2
f2ncjHWTjL0XwQzypjcAELV1+oztimMwLbjSVD0phFRes9iBRK72DYxyumFEUz71wn48hrTVPyiv
OwqNkS3IVQ89yHXEHjlbn5mG1QvvTrFhVsa8HMvSsvRw3YKji+5g6VSsKfWFwD9+L2uVb28OKpTJ
cKL7M17lzF20jyOi3otlBI58p9xkdw3EStQRCVsBu0Ndv03deh078hmZ0HxBYx2WihCnp7pqf5ok
H2b3GMbtmM8HuFKmstioDyd3wGfzUisb9394+do1aViRsEnfX1JytHtrbZHtBkDBMDeu1xemX4RH
SdEqzvwXjLHrXR0y9WJvAzoedZz31pBbDzvZXkzRmKdAeszVYf0oVkXChUa0Iv/fPpw86N6/8+P2
VPHGAVW7HHD5O5/fILc/OnzuPP7FNctlbjeoXoOpkoPgnSE25bSDEIpWkNwEdV/jnkHnsJYphp6k
GbnBCj/5xIP7oYaDOoWLK+nDtwjEUMItMNNxVXBECuBo4DxxKp6DbWP3yF2tpzAg9w9j9AnlQB7J
eNz3s1yPJ3QJSu0WFonPDcE9fepllJZXjtlCVe9M5BMOBowY+hjvgQhE7FNblFZvEithQ82dDAqa
s/GpNPeczJVmzSB5su0G35o8nGfK4ZoWmOHqqsPhmE4r8lRR6fceHsT0/uNOI0wER6O7UFOOe33j
VZkt3M8yIRuUIxBlBHOaSgluYveHryPMo6BXQKlRL9sauqc7TpLDMGby2i2Vs6oGBK846hXuVC7t
V2dYDayv1u0Ge1HTHsN5qkXY+d5Om9Gbv+o1P4aeDW/Hq5FEGeM+M21cI5zWdkxenxRa83hUEj26
v2Zlt80v4XT2YrJXwrSv9/s4r13D1nQxa+OLtCkswaew9xoNRGKjcvpq4UQCp6tbkxD0vb8CkoNM
cdPJFZZywgON5pFzzafo6o6alG9UEROYK564Ukp+wv4Xt/7IQpzGf9dbB6yFYp2L1URdlebTvLx5
hM1L2n1ND+QZU0JGytXefsrxRaxRx4C6HUnkYDc7xb6GgHZIMN1h5iClg9Cd3dAMkE9UAp3DM3/x
ISJz9CaphM74pPa5dKbqvkS5pJO4kbGJkHEJVLr1l8GcOQyUxnghqEZ1zyCNaapf8lZxkfpfgq6x
DGgZqwf5LUAsp48H/3MZd95X8QsJUy7DRXHRmkfxf+186QNCmLzbhEhQHSyA9c/odoKhHfbzDrzz
/IkHBHBTn0eLBJLKJaa76hdRhBNJ7sQHHAH0fbKOeN2RJKXMXcw/XYRjOTQmsFCpT3NBHmOQiJgh
3CdDOALtnNy4biZgOYL35bnbtFd1xUqTqC+RUgy7s3hy2qYtRkmVym6UV30Gj5TIhX2yyeiLDr3/
jh8oFVLi0vc0q9Cc8e/OgV2APtbhFKtmd0nf+qDwJNcP//aElllnka5RtY8szPGbEOnaoDRJh56V
hQh7aYlaHiSTBUYkTqZAtZmddvPDoR5MYP6eHmspahZP3r5gPnGg9dEPZYniwa9R4AyIBG6CLzl7
VAb4Up6hlQbSbazZAxSnm+D37Vepi02N1mUN+kZLkuXoE+8bSkCLkoUHAggz6A1FFZrVFBOZJFF3
yanmQKRKVeV/RYWvCiCWK+NMHrKLjqwXE7BuzG4+kwJz4yptIZG7+QQ9/y++9K2qfGzpFAKOvYVA
QoivjQTdF68auy5ncT6ZGGsg1KSWqiU6r5yQQE7+0086p9DpxCfeFinvElNbr/k1SeAAgX0mCiNN
dXHULePP/Gipl82oGh1JJCdAQ9LDpey65p0KEjYXXANeTZwhPYOga4BHA0oN4pwOdnTeCb5A4iZ/
heS3mgFhvHAhevmsEhIK2h2zSF3Akf5BwgPCbpnCYkYb+ME0TdvNEiJCphU9jUE4p5X9A9dSGDJj
khYzrG0vqQ5aTHUtA/ettxOdp4eUS7ysX0thI24EuES+7VvT4f8wgeSqBHZFzQ/CElgrRx4ExPs7
D0v5Ej5wagiorCgqq7nJ+WVo4jzSjwP1YPz0OorE1bZuBq7lGr3Rbp63T09vP9TTzlMsJSWxGHqT
JeKFlv86ZJ1h39w2Zj+8gJ4U4AZbOygG4bLImMVZigruDqvkaOxNreC1k+1vLgOPtZ/kWzXOwH+O
/KlC0MjIWmtLxc4WQHgphsph364TvIk2pNXhw0kVpwDtyTQQTZ0uelX9+IewGOhxjBSp71WJ3KS6
vd6oUylWNSjtHxK7eVyclTxCvy8AwzP5K+8lwRzhDkWw2j7nriqzZ6sBQ8sc55H3/PkQ1nhDvP3S
Y4mETg95nQKorrqSDgb6WO6YmD7apM6gCf2H5/4poh7YLqjOw7ajEzyPcoHqdJRC+6dswNNb8pdu
Eynk1RGGG3fnXVSGn5SSGA2S8xxJpeOPXqhwWm47l709TR53pdlNgeNlLSat/LE3Yr6f3dzCO3+M
mLQSSv4FDwGW+hU2bHZPiUhUUQSmaa9T19pbpa6s8ZJ0xLEbS3z1xEajwM0bFGEGE+lodnN0Ziu+
StlkG0O7ozjg6V6hRnz8KkJqNDirqESfbjE6WMHtc599lGztc/77jnBfdHd3VIuf4IgUcezITMqj
5MGygT2/VAEb4BZAbcRxPGqKcLfYnJZ63t3QEqbgblMA1vFo4VgSV1ajLUyoDGBGLV28ExlwTut1
HzIaED7RvsGxFpR26+1akJ1/8bReaeZFhca9QQVHRvj1X698r4C/XUsrSc+05XtjMx6HM5q1yZwu
pU7X3s5l0gEMjqTKe4cxHPW2hjvKhiEEb66pzjN7HK0y5nrjMJxzwtfqbNV7b76TcDtX27W08c9U
hsEprM3gDA7yAWiwAy3nxW57jdofbM5LfU0HVc1mK3FN0pfA/Fg0HWk0RX6K1vbYorZ2YFYwkpIK
Spx8l1Y/4Kpd/0yvO9c4f8OcsEc6LfaQSV83l2H8v6NalHbhaZ2gKxmDZi/k03xDyL8v6GCn18bp
dB5LUUJUKbnsl6q5E9b8DkJqSnAaHRLJDnEvMp6EfGlpc52On3lCg0wI5XERerziamjcMH44VZfd
j8z1WUyHlyOSmkvZdJ66PfYWu5BxCG7hfdtSGROPtIxs36iLmesyYm4yHKwwbWgNIrLgra92DF2L
R6e0RM1WWkcJHei4v89Nmwym4k0dKMTX1HkfTogoprrdIyDYj4qMmeTqfl0U8pRehVs6/zy4x8HS
0V2+smFFQ/BZxLQ4eV8NHKeszc4kI6jJ3OCncsP57tfkE6TmVTtWKiimERISYB4KhUpblsbN6zyX
Bni5ezNwl9XdaBq9c90k+QQmaMGeyQbczdGy9ufcC269vB1FU5+a67Ew8h0jPAPeYHvsw4kGsTSh
xnhGNUHRuPoNmQYBjI2LztvnbGuoucUVntUi5quKpKAK1fOZerZTh+kr5PjaW0YlozpL5CtElvS3
eqqkVT8a5mdW+sWTxJxTjqronag0QACsSwbA9qurCW9IdcOO+0D7nzfIJIFrWKx+D71JhKNvOmUa
NmCy9l+wzdpcLs1zvS3o3zwEgUWOOHzITgzOxtDhIuBcJkg9lS+o5b+W+U9fplCbVFjYd5ZDa2sX
90/8XCJA0a9VcsSrh1LoO0V3YX80VWdNPY79OUOlqftl3rNXVXE=
`pragma protect end_protected
@@ -0,0 +1,68 @@
// (c) Copyright 1995-2013 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
// DO NOT MODIFY THIS FILE.
`timescale 1ns / 1ps
module vio_manual_ctrl (
clk,
probe_out0,
probe_out1,
probe_out2,
probe_out3,
probe_out4
);
input clk;
output reg [1 : 0] probe_out0 = 'h0 ;
output reg [0 : 0] probe_out1 = 'h0 ;
output reg [31 : 0] probe_out2 = 'h00000000 ;
output reg [1 : 0] probe_out3 = 'h3 ;
output reg [3 : 0] probe_out4 = 'h0 ;
endmodule
@@ -0,0 +1,70 @@
// (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
// DO NOT MODIFY THIS FILE.
// IP VLNV: xilinx.com:ip:vio:3.0
// IP Revision: 20
// The following must be inserted into your Verilog file for this
// core to be instantiated. Change the instance name and port connections
// (in parentheses) to your own signal names.
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
vio_manual_ctrl your_instance_name (
.clk(clk), // input wire clk
.probe_out0(probe_out0), // output wire [1 : 0] probe_out0
.probe_out1(probe_out1), // output wire [0 : 0] probe_out1
.probe_out2(probe_out2), // output wire [31 : 0] probe_out2
.probe_out3(probe_out3), // output wire [1 : 0] probe_out3
.probe_out4(probe_out4) // output wire [3 : 0] probe_out4
);
// INST_TAG_END ------ End INSTANTIATION Template ---------
// You must compile the wrapper file vio_manual_ctrl.v when simulating
// the core, vio_manual_ctrl. When compiling the wrapper file, be sure to
// reference the Verilog simulation library.
@@ -0,0 +1,85 @@
-- (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
--
-- This file contains confidential and proprietary information
-- of Xilinx, Inc. and is protected under U.S. and
-- international copyright and other intellectual property
-- laws.
--
-- DISCLAIMER
-- This disclaimer is not a license and does not grant any
-- rights to the materials distributed herewith. Except as
-- otherwise provided in a valid license issued to you by
-- Xilinx, and to the maximum extent permitted by applicable
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
-- (2) Xilinx shall not be liable (whether in contract or tort,
-- including negligence, or under any other theory of
-- liability) for any loss or damage of any kind or nature
-- related to, arising under or in connection with these
-- materials, including for any direct, or any indirect,
-- special, incidental, or consequential loss or damage
-- (including loss of data, profits, goodwill, or any type of
-- loss or damage suffered as a result of any action brought
-- by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the
-- possibility of the same.
--
-- CRITICAL APPLICATIONS
-- Xilinx products are not designed or intended to be fail-
-- safe, or for use in any application requiring fail-safe
-- performance, such as life-support or safety devices or
-- systems, Class III medical devices, nuclear facilities,
-- applications related to the deployment of airbags, or any
-- other applications that could lead to death, personal
-- injury, or severe property or environmental damage
-- (individually and collectively, "Critical
-- Applications"). Customer assumes the sole risk and
-- liability of any use of Xilinx products in Critical
-- Applications, subject only to applicable laws and
-- regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
-- PART OF THIS FILE AT ALL TIMES.
--
-- DO NOT MODIFY THIS FILE.
-- IP VLNV: xilinx.com:ip:vio:3.0
-- IP Revision: 20
-- The following code must appear in the VHDL architecture header.
------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
COMPONENT vio_manual_ctrl
PORT (
clk : IN STD_LOGIC;
probe_out0 : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
probe_out1 : OUT STD_LOGIC_VECTOR(0 DOWNTO 0);
probe_out2 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
probe_out3 : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
probe_out4 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
END COMPONENT;
-- COMP_TAG_END ------ End COMPONENT Declaration ------------
-- The following code must appear in the VHDL architecture
-- body. Substitute your own instance name and net names.
------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
your_instance_name : vio_manual_ctrl
PORT MAP (
clk => clk,
probe_out0 => probe_out0,
probe_out1 => probe_out1,
probe_out2 => probe_out2,
probe_out3 => probe_out3,
probe_out4 => probe_out4
);
-- INST_TAG_END ------ End INSTANTIATION Template ---------
-- You must compile the wrapper file vio_manual_ctrl.vhd when simulating
-- the core, vio_manual_ctrl. When compiling the wrapper file, be sure to
-- reference the VHDL simulation library.
File diff suppressed because one or more lines are too long
@@ -0,0 +1,26 @@
// Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
// --------------------------------------------------------------------------------
// Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
// Date : Fri Mar 17 22:22:39 2023
// Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
// Command : write_verilog -force -mode synth_stub
// D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/vio_manual_ctrl_synth_1/vio_manual_ctrl_stub.v
// Design : vio_manual_ctrl
// Purpose : Stub declaration of top-level module interface
// Device : xc7z100ffg900-2
// --------------------------------------------------------------------------------
// This empty module with port declaration file causes synthesis tools to infer a black box for IP.
// The synthesis directives are for Synopsys Synplify support to prevent IO buffer insertion.
// Please paste the declaration into a Verilog source file or add the file as an additional source.
(* X_CORE_INFO = "vio,Vivado 2019.1.3" *)
module vio_manual_ctrl(clk, probe_out0, probe_out1, probe_out2,
probe_out3, probe_out4)
/* synthesis syn_black_box black_box_pad_pin="clk,probe_out0[1:0],probe_out1[0:0],probe_out2[31:0],probe_out3[1:0],probe_out4[3:0]" */;
input clk;
output [1:0]probe_out0;
output [0:0]probe_out1;
output [31:0]probe_out2;
output [1:0]probe_out3;
output [3:0]probe_out4;
endmodule
@@ -0,0 +1,35 @@
-- Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
-- --------------------------------------------------------------------------------
-- Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
-- Date : Fri Mar 17 22:22:39 2023
-- Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
-- Command : write_vhdl -force -mode synth_stub
-- D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/vio_manual_ctrl_synth_1/vio_manual_ctrl_stub.vhdl
-- Design : vio_manual_ctrl
-- Purpose : Stub declaration of top-level module interface
-- Device : xc7z100ffg900-2
-- --------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity vio_manual_ctrl is
Port (
clk : in STD_LOGIC;
probe_out0 : out STD_LOGIC_VECTOR ( 1 downto 0 );
probe_out1 : out STD_LOGIC_VECTOR ( 0 to 0 );
probe_out2 : out STD_LOGIC_VECTOR ( 31 downto 0 );
probe_out3 : out STD_LOGIC_VECTOR ( 1 downto 0 );
probe_out4 : out STD_LOGIC_VECTOR ( 3 downto 0 )
);
end vio_manual_ctrl;
architecture stub of vio_manual_ctrl is
attribute syn_black_box : boolean;
attribute black_box_pad_pin : string;
attribute syn_black_box of stub : architecture is true;
attribute black_box_pad_pin of stub : architecture is "clk,probe_out0[1:0],probe_out1[0:0],probe_out2[31:0],probe_out3[1:0],probe_out4[3:0]";
attribute X_CORE_INFO : string;
attribute X_CORE_INFO of stub : architecture is "vio,Vivado 2019.1.3";
begin
end;
@@ -0,0 +1,283 @@
`pragma protect begin_protected
`pragma protect version = 1
`pragma protect encrypt_agent = "XILINX"
`pragma protect encrypt_agent_info = "Xilinx Encryption Tool 2019.1"
`pragma protect key_keyowner = "Cadence Design Systems.", key_keyname = "cds_rsa_key", key_method = "rsa"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 64)
`pragma protect key_block
GbQWy7xyRnDVKNEgu/syxcQSo3KIIWjSBPIwi/pSAYCe9sIQf1xA0ykhHf7s3r7GRWRS+sel+0Xx
XWe4lBDDrw==
`pragma protect key_keyowner = "Synopsys", key_keyname = "SNPS-VCS-RSA-2", key_method = "rsa"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 128)
`pragma protect key_block
rLh670IEMVEjBamdsB+LhhoxrK6I5H9wfmPCOFqaLelJt08QWbH7WNvjIhNNz7hnkT7w+wDWT6AH
9ZJgOGPSJmj9pWoXHAojkkRBTIXpFT11+IDyFQ4FgN2TPXWILoYGY+uZG1GlGN7dsEIm5HUCUy2c
eVhT3XSIJDvufMyiJUc=
`pragma protect key_keyowner = "Aldec", key_keyname = "ALDEC15_001", key_method = "rsa"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 256)
`pragma protect key_block
KgKxjU+tI9TXRZLkaaosEf4JcTfzGtF82aOinFlVe78eUyHdMvwHHcKsxUKAjkhYW491bZ0jTKit
pNc3Ov7QvW8kjTq3JHFuCf7SmCYRrmElQv0XobTk6mnMb4khaXw9wTP8YMS0XAqk3Bksal+aKfvX
LL/afyM4UwBfiIb04ZgvhdOlp/dkCqWqZyDL2qVScyGrZcDCW3CCZTVQO29hqMLZP5S82keXpBv3
5J7nHHbQ3n4dxsRykYtJtwg7JDyqGHiwhj1HDtjhG+LX9ry1wy5YgvxrzSfKoouAeHCKXcG7TY0a
sz4nRUsC3Yg3/CybYyPjvVJDirIzWRzSD6l1DQ==
`pragma protect key_keyowner = "ATRENTA", key_keyname = "ATR-SG-2015-RSA-3", key_method = "rsa"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 256)
`pragma protect key_block
ItrqCM44kZl0WwWeSAjetSYD0fPwYZdVjFp5cRl5XZyoYOMWKCVEXncinM06x/MDVlkYiXgz2Xqn
6ui7jR7RwOKALvqoqdehIoXZUA/5yPMntFpxPcFIY1DonBI4CuMjhqCuB2RkxKNIco5Z7/QxCk49
MCUlvIFRd2MXM+zvhCRdja7e9blnwJEUETukq+EKuAwuR3+VN3uzCXsNtgBqMZa2CyM6Z60fStuc
v1eiDP/hxOimuSfsS7evakl5WMjgZuj4Jld1+y5hTOuPvw4+s3KIb2ejIH2r/I7ui7sWUZTah36a
4QexKWP16Ghv319FCz4KExZ6lY+7HuoO55lf4A==
`pragma protect key_keyowner = "Xilinx", key_keyname = "xilinxt_2019_02", key_method = "rsa"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 256)
`pragma protect key_block
FGUAaXx6dK7W5dgDUXY6j9xLpCHdbPvbaH+O+ozu9kcNjL5BJcGWnTdooAxaZdBsOZBvrVuXUU4v
ev5owQI9+5/+8aoXfeX2zZHp++ESqotCFj5ykw8BPjwCOCZz+tiV1Q8ISqf/NCuDNU2KJyvQUsFX
cOXAwCPvrI5SwQ04u9sVTaHwAuTuRw3j6nkt6BHWrjKpq9pUfNH4L04ag/tUGVpnlcSBGewN0ieC
xkzVV1mPCyCu/thxu0k0yda5pS/u3MFeC1N8rTrSsLEZMUiPYg/BwwWGT7D/s9FCMbbM2kyoUXpa
draqn+K8c06CQxLI+ieilCd38M25buwOc3ANjg==
`pragma protect key_keyowner = "Mentor Graphics Corporation", key_keyname = "MGC-VELOCE-RSA", key_method = "rsa"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 128)
`pragma protect key_block
ucIv1ZvudBg6K9ubpyCObknzSo2JKwxETiac5kbTyw0xwj34bo+xJ/DnUCoAdEVHZcAwDc9Fhbhv
j5a7MwnHY+TpzDjhwdN75A97jOZ4V65wcuFErbH19OSacDchGykcwXCiaA5haDJK2hF1qPxu7TtO
R19uHYIhWP+7IpmjTiQ=
`pragma protect key_keyowner = "Mentor Graphics Corporation", key_keyname = "MGC-VERIF-SIM-RSA-2", key_method = "rsa"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 256)
`pragma protect key_block
AI09c0Va0j6swrG6tMKXPaWcjMpXDnvuIze3bAe9Cj0tCXFumugM/pZL81X53kMwmKPvRCpTi8DM
kLLATubglrp6DudyaIY943skTmlH+as6fKaHODrTcy4CDIP4kKrok/7y1rBI6+YAfN3ZIW+45MiV
cHuhXHXxxXblzCT6obAZK5QUCP2qZKgO0jjI1RD7ZEJuS/mX5wkIAvOe8L1HBkyUsRq6Cu30W6u9
7VI3LOy7TZqb6Nix6Ok85ylO82KP12tdXY2IRivakKu4fdWQ6vc3ARiefSR0+RDmE/eZzhzQbt26
mf7t4ZoEITJYnmd5zcenAnw+6AO3fUwtTLT81Q==
`pragma protect data_method = "AES128-CBC"
`pragma protect encoding = (enctype = "BASE64", line_length = 76, bytes = 12464)
`pragma protect data_block
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
hsEprM3gDA7yAWiwAy3nxW57jdofbM5LfU0HVc1mK3FN0pfA/Fg0HWk0RX6K1vbYorZ2YFYwkpIK
Spx8l1Y/4Kpd/0yvO9c4f8OcsEc6LfaQSV83l2H8v6NalHbhaZ2gKxmDZi/k03xDyL8v6GCn18bp
dB5LUUJUKbnsl6q5E9b8DkJqSnAaHRLJDnEvMp6EfGlpc52On3lCg0wI5XERerziamjcMH44VZfd
j8z1WUyHlyOSmkvZdJ66PfYWu5BxCG7hfdtSGROPtIxs36iLmesyYm4yHKwwbWgNIrLgra92DF2L
R6e0RM1WWkcJHei4v89Nmwym4k0dKMTX1HkfTogoprrdIyDYj4qMmeTqfl0U8pRehVs6/zy4x8HS
0V2+smFFQ/BZxLQ4eV8NHKeszc4kI6jJ3OCncsP57tfkE6TmVTtWKiimERISYB4KhUpblsbN6zyX
Bni5ezNwl9XdaBq9c90k+QQmaMGeyQbczdGy9ufcC269vB1FU5+a67Ew8h0jPAPeYHvsw4kGsTSh
xnhGNUHRuPoNmQYBjI2LztvnbGuoucUVntUi5quKpKAK1fOZerZTh+kr5PjaW0YlozpL5CtElvS3
eqqkVT8a5mdW+sWTxJxTjqronag0QACsSwbA9qurCW9IdcOO+0D7nzfIJIFrWKx+D71JhKNvOmUa
NmCy9l+wzdpcLs1zvS3o3zwEgUWOOHzITgzOxtDhIuBcJkg9lS+o5b+W+U9fplCbVFjYd5ZDa2sX
90/8XCJA0a9VcsSrh1LoO0V3YX80VWdNPY79OUOlqftl3rNXVXE=
`pragma protect end_protected
@@ -0,0 +1,76 @@
// (c) Copyright 1995-2013 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
// DO NOT MODIFY THIS FILE.
`timescale 1ns / 1ps
module vio_rf_control (
clk,
probe_out0,
probe_out1,
probe_out2,
probe_out3,
probe_out4,
probe_out5,
probe_out6,
probe_out7,
probe_out8
);
input clk;
output reg [0 : 0] probe_out0 = 'h0 ;
output reg [1 : 0] probe_out1 = 'h0 ;
output reg [0 : 0] probe_out2 = 'h0 ;
output reg [5 : 0] probe_out3 = 'h08 ;
output reg [5 : 0] probe_out4 = 'h38 ;
output reg [10 : 0] probe_out5 = 'h3E8 ;
output reg [0 : 0] probe_out6 = 'h0 ;
output reg [0 : 0] probe_out7 = 'h0 ;
output reg [0 : 0] probe_out8 = 'h0 ;
endmodule
@@ -0,0 +1,74 @@
// (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
// DO NOT MODIFY THIS FILE.
// IP VLNV: xilinx.com:ip:vio:3.0
// IP Revision: 20
// The following must be inserted into your Verilog file for this
// core to be instantiated. Change the instance name and port connections
// (in parentheses) to your own signal names.
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
vio_rf_control your_instance_name (
.clk(clk), // input wire clk
.probe_out0(probe_out0), // output wire [0 : 0] probe_out0
.probe_out1(probe_out1), // output wire [1 : 0] probe_out1
.probe_out2(probe_out2), // output wire [0 : 0] probe_out2
.probe_out3(probe_out3), // output wire [5 : 0] probe_out3
.probe_out4(probe_out4), // output wire [5 : 0] probe_out4
.probe_out5(probe_out5), // output wire [10 : 0] probe_out5
.probe_out6(probe_out6), // output wire [0 : 0] probe_out6
.probe_out7(probe_out7), // output wire [0 : 0] probe_out7
.probe_out8(probe_out8) // output wire [0 : 0] probe_out8
);
// INST_TAG_END ------ End INSTANTIATION Template ---------
// You must compile the wrapper file vio_rf_control.v when simulating
// the core, vio_rf_control. When compiling the wrapper file, be sure to
// reference the Verilog simulation library.
@@ -0,0 +1,93 @@
-- (c) Copyright 1995-2023 Xilinx, Inc. All rights reserved.
--
-- This file contains confidential and proprietary information
-- of Xilinx, Inc. and is protected under U.S. and
-- international copyright and other intellectual property
-- laws.
--
-- DISCLAIMER
-- This disclaimer is not a license and does not grant any
-- rights to the materials distributed herewith. Except as
-- otherwise provided in a valid license issued to you by
-- Xilinx, and to the maximum extent permitted by applicable
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
-- (2) Xilinx shall not be liable (whether in contract or tort,
-- including negligence, or under any other theory of
-- liability) for any loss or damage of any kind or nature
-- related to, arising under or in connection with these
-- materials, including for any direct, or any indirect,
-- special, incidental, or consequential loss or damage
-- (including loss of data, profits, goodwill, or any type of
-- loss or damage suffered as a result of any action brought
-- by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the
-- possibility of the same.
--
-- CRITICAL APPLICATIONS
-- Xilinx products are not designed or intended to be fail-
-- safe, or for use in any application requiring fail-safe
-- performance, such as life-support or safety devices or
-- systems, Class III medical devices, nuclear facilities,
-- applications related to the deployment of airbags, or any
-- other applications that could lead to death, personal
-- injury, or severe property or environmental damage
-- (individually and collectively, "Critical
-- Applications"). Customer assumes the sole risk and
-- liability of any use of Xilinx products in Critical
-- Applications, subject only to applicable laws and
-- regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
-- PART OF THIS FILE AT ALL TIMES.
--
-- DO NOT MODIFY THIS FILE.
-- IP VLNV: xilinx.com:ip:vio:3.0
-- IP Revision: 20
-- The following code must appear in the VHDL architecture header.
------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
COMPONENT vio_rf_control
PORT (
clk : IN STD_LOGIC;
probe_out0 : OUT STD_LOGIC_VECTOR(0 DOWNTO 0);
probe_out1 : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
probe_out2 : OUT STD_LOGIC_VECTOR(0 DOWNTO 0);
probe_out3 : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
probe_out4 : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
probe_out5 : OUT STD_LOGIC_VECTOR(10 DOWNTO 0);
probe_out6 : OUT STD_LOGIC_VECTOR(0 DOWNTO 0);
probe_out7 : OUT STD_LOGIC_VECTOR(0 DOWNTO 0);
probe_out8 : OUT STD_LOGIC_VECTOR(0 DOWNTO 0)
);
END COMPONENT;
-- COMP_TAG_END ------ End COMPONENT Declaration ------------
-- The following code must appear in the VHDL architecture
-- body. Substitute your own instance name and net names.
------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
your_instance_name : vio_rf_control
PORT MAP (
clk => clk,
probe_out0 => probe_out0,
probe_out1 => probe_out1,
probe_out2 => probe_out2,
probe_out3 => probe_out3,
probe_out4 => probe_out4,
probe_out5 => probe_out5,
probe_out6 => probe_out6,
probe_out7 => probe_out7,
probe_out8 => probe_out8
);
-- INST_TAG_END ------ End INSTANTIATION Template ---------
-- You must compile the wrapper file vio_rf_control.vhd when simulating
-- the core, vio_rf_control. When compiling the wrapper file, be sure to
-- reference the VHDL simulation library.
File diff suppressed because one or more lines are too long
@@ -0,0 +1,30 @@
// Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
// --------------------------------------------------------------------------------
// Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
// Date : Fri Mar 17 22:22:40 2023
// Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
// Command : write_verilog -force -mode synth_stub
// D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/vio_rf_control_synth_1/vio_rf_control_stub.v
// Design : vio_rf_control
// Purpose : Stub declaration of top-level module interface
// Device : xc7z100ffg900-2
// --------------------------------------------------------------------------------
// This empty module with port declaration file causes synthesis tools to infer a black box for IP.
// The synthesis directives are for Synopsys Synplify support to prevent IO buffer insertion.
// Please paste the declaration into a Verilog source file or add the file as an additional source.
(* X_CORE_INFO = "vio,Vivado 2019.1.3" *)
module vio_rf_control(clk, probe_out0, probe_out1, probe_out2,
probe_out3, probe_out4, probe_out5, probe_out6, probe_out7, probe_out8)
/* synthesis syn_black_box black_box_pad_pin="clk,probe_out0[0:0],probe_out1[1:0],probe_out2[0:0],probe_out3[5:0],probe_out4[5:0],probe_out5[10:0],probe_out6[0:0],probe_out7[0:0],probe_out8[0:0]" */;
input clk;
output [0:0]probe_out0;
output [1:0]probe_out1;
output [0:0]probe_out2;
output [5:0]probe_out3;
output [5:0]probe_out4;
output [10:0]probe_out5;
output [0:0]probe_out6;
output [0:0]probe_out7;
output [0:0]probe_out8;
endmodule
@@ -0,0 +1,39 @@
-- Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
-- --------------------------------------------------------------------------------
-- Tool Version: Vivado v.2019.1.3 (win64) Build 2644227 Wed Sep 4 09:45:24 MDT 2019
-- Date : Fri Mar 17 22:22:40 2023
-- Host : JOSH-ASUS-Z690 running 64-bit major release (build 9200)
-- Command : write_vhdl -force -mode synth_stub
-- D:/vivado-git/datalink_814/ip/managed_ip_project/managed_ip_project.runs/vio_rf_control_synth_1/vio_rf_control_stub.vhdl
-- Design : vio_rf_control
-- Purpose : Stub declaration of top-level module interface
-- Device : xc7z100ffg900-2
-- --------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity vio_rf_control is
Port (
clk : in STD_LOGIC;
probe_out0 : out STD_LOGIC_VECTOR ( 0 to 0 );
probe_out1 : out STD_LOGIC_VECTOR ( 1 downto 0 );
probe_out2 : out STD_LOGIC_VECTOR ( 0 to 0 );
probe_out3 : out STD_LOGIC_VECTOR ( 5 downto 0 );
probe_out4 : out STD_LOGIC_VECTOR ( 5 downto 0 );
probe_out5 : out STD_LOGIC_VECTOR ( 10 downto 0 );
probe_out6 : out STD_LOGIC_VECTOR ( 0 to 0 );
probe_out7 : out STD_LOGIC_VECTOR ( 0 to 0 );
probe_out8 : out STD_LOGIC_VECTOR ( 0 to 0 )
);
end vio_rf_control;
architecture stub of vio_rf_control is
attribute syn_black_box : boolean;
attribute black_box_pad_pin : string;
attribute syn_black_box of stub : architecture is true;
attribute black_box_pad_pin of stub : architecture is "clk,probe_out0[0:0],probe_out1[1:0],probe_out2[0:0],probe_out3[5:0],probe_out4[5:0],probe_out5[10:0],probe_out6[0:0],probe_out7[0:0],probe_out8[0:0]";
attribute X_CORE_INFO : string;
attribute X_CORE_INFO of stub : architecture is "vio,Vivado 2019.1.3";
begin
end;
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,418 @@
`protect begin_protected
`protect version = 1
`protect encrypt_agent = "XILINX"
`protect encrypt_agent_info = "Xilinx Encryption Tool 2019.1"
`protect key_keyowner = "Cadence Design Systems.", key_keyname = "cds_rsa_key", key_method = "rsa"
`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 64)
`protect key_block
IijDYFYeRdzkel5iYnZFe2NzgYX9UDO+g6PdWiHeOm5P1+m9Kt//ktx0y9l3PqUsSWKKIi5tWbDg
OqtBZeM3zQ==
`protect key_keyowner = "Synopsys", key_keyname = "SNPS-VCS-RSA-2", key_method = "rsa"
`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 128)
`protect key_block
TXFD8G5gE6CUfZ/9/aBQvAaQuQ9Q6vcW5KJtFkYqsiROk19a5PsS1gCxUXtSJ+Xt20njQCTMz6jx
UaSmsNRyiV6PuCAgdQYvfeJWiNmQq7kXQnkYSjycSJyNe/xoXEYIK0mHX7J2x9ouXxNx6jQFR5Lm
jxY8fR7N9m3PTkCqNTI=
`protect key_keyowner = "Aldec", key_keyname = "ALDEC15_001", key_method = "rsa"
`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 256)
`protect key_block
0bdD7I2gr0nFDramUUXzPCEqtk/eE+vK1bghpNlKE+S5t5/NbqJI7gNd3XLwYh6qEIInU1StLpm1
ZEERnCmEf4+rQBAW7x7u7nIsJjSOmPWtDc9DLn5S3e1Tg+IzLUqT0rFFh5TiwuYq9A6oIvI4ufWQ
WwoeY/gITSdj6C0JQ3GFyIRhxG7psQKO9U4fj8El/Lb3YXG1+IGuXZsygyLPjjOU5LRXKo6kKsub
X1PFDvdm4rWaB9AqoPLCqp654KCyKSCoufeM/jiWRTNXwf6kL56WQKDXuyAhrasBOno4KOT3c5VP
WEHGNdGBSdU4oUFYiOmAKlCKGeUNCxMxx765QA==
`protect key_keyowner = "ATRENTA", key_keyname = "ATR-SG-2015-RSA-3", key_method = "rsa"
`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 256)
`protect key_block
ppkak8ss4yKmNiAZjxFq8nn58TDV/6CNcvQivN+uaaTC1viFh2EDUvJp8zqZ2dJOE2mTN9WJY0VD
93fjF/bEPMptIxFj5D6ldjwJu+xdHqS9FJ9Wajnbu++DCTUtAQE+y05rqhCz8aZWKGNejsRfG8bE
xGYNUIbFoZ9PYrDIdRcDSdZRUBadrAC+WcEM6+/HxxJq4Ly/w0BVbiEq22B0+4wVDXszrocC0mKJ
RPXzPj9v5D5aBX2ijUGbICpT6JkVGAjlIEP7HZoc+Ooxppwgc01k8snVnPVI4IVVYOjjlTQgT/qU
t0doYgFMU9nD5a1hefzXRkszYn9RHVZE5bl6NA==
`protect key_keyowner = "Xilinx", key_keyname = "xilinxt_2019_02", key_method = "rsa"
`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 256)
`protect key_block
KtmDUKyPqH21pzMoqq9CPc/SXFhh6Oz2JrLSFRZBS3mGc7ebGc8cQjlvJpJA0WNJlGqACicdvN1t
A7mG3V1xKtoRdR+2MhucMQ7loisN8yDj3+zqgbM5bAdlz+62WovuGfaM4EK24l8CXSfBLVGQ35JP
2zB0abBrel1cOw3DxvSIS/5wueR9/Ul+GoLmD6yF7cV2ne7eGwNXQ2OsCqdcb9wK8gNO1YfC3kE6
WwdUtjutDvyXnV49wmg6nCC8RAPNWbIhHiMMtpDjux6E1Rkd3xdCMDrxrupZyNQNtVmzcN8ITAn5
BYoTBON1CKVljCmLov84lxcdcXGcSaBAtLIiAg==
`protect key_keyowner = "Mentor Graphics Corporation", key_keyname = "MGC-VELOCE-RSA", key_method = "rsa"
`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 128)
`protect key_block
sjMrK19OPSOpuNhtGVc8GPvvQoA4nRSUShUtMXVan8pbxWL4SmeH0c+Lr407Kf0YXDBqUDDkheov
bvkczAmQfT+dVPmRtr9F/s03c46gcXSPX3D/EHROl21MVjaptRm/lAFzU2JR3vIcBrSyn9KnB+G8
cTUA3hZ8VcZWUlsE5EU=
`protect key_keyowner = "Mentor Graphics Corporation", key_keyname = "MGC-VERIF-SIM-RSA-2", key_method = "rsa"
`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 256)
`protect key_block
KDe/Bg6fHbQcPjNnYiQKwKjMy4sdSqf+Gty0JJ0Cl1tXsbqDCM+FOd30mp8wMVyuqAm1Cs7QT211
JO6FwTQoTSe1+Ag2KZe6AMFgHaNj0EL+M24h7wdNN5Wj8M9n4Zw2cVNCAcQuMAGYbxaWpNTrYMXH
BpdQ50EQ9/kLpocWC2JhjoxshWpofJ0tpp9WlfLUPTm7TftCudU0M3dMNjnbl+Mfa3yuTHWt8aDY
6w/HgH82FHAd70Mwbh6CrcIChQUulExaSON/uCwutX0SehA5/ooAAlnWv19O8kXTawUeKwYKQikK
PjngB0eHiTimSxjDCZaaor8VbS4WfO6DyMwmEg==
`protect data_method = "AES128-CBC"
`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 20128)
`protect data_block
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
KnmRsadIXQ==
`protect end_protected
@@ -0,0 +1,671 @@
///////////////////////////////////////////////////////////////////////////////
//
// Company: Xilinx
// Engineer: Jim Tatsukawa, Karl Kurbjun and Carl Ribbing
// Date: 7/30/2014
// Design Name: MMCME2 DRP
// Module Name: mmcme2_drp_func.h
// Version: 1.04
// Target Devices: 7 Series || MMCM
// Tool versions: 2014.3
// Description: This header provides the functions necessary to
// calculate the DRP register values for the V6 MMCM.
//
// Revision Notes: 3/12 - Updating lookup_low/lookup_high (CR)
// 4/13 - Fractional divide function in mmcm_frac_count_calc function. CRS610807
//
// Disclaimer: XILINX IS PROVIDING THIS DESIGN, CODE, OR
// INFORMATION "AS IS" SOLELY FOR USE IN DEVELOPING
// PROGRAMS AND SOLUTIONS FOR XILINX DEVICES. BY
// PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,
// APPLICATION OR STANDARD, XILINX IS MAKING NO
// REPRESENTATION THAT THIS IMPLEMENTATION IS FREE
// FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE
// RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY
// REQUIRE FOR YOUR IMPLEMENTATION. XILINX
// EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH
// RESPECT TO THE ADEQUACY OF THE IMPLEMENTATION,
// INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR
// REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE.
//
// (c) Copyright 2009-2010 Xilinx, Inc.
// All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
// These are user functions that should not be modified. Changes to the defines
// or code within the functions may alter the accuracy of the calculations.
// Define debug to provide extra messages durring elaboration
//`define DEBUG 1
// FRAC_PRECISION describes the width of the fractional portion of the fixed
// point numbers. These should not be modified, they are for development
// only
`define FRAC_PRECISION 10
// FIXED_WIDTH describes the total size for fixed point calculations(int+frac).
// Warning: L.50 and below will not calculate properly with FIXED_WIDTHs
// greater than 32
`define FIXED_WIDTH 32
// This function takes a fixed point number and rounds it to the nearest
// fractional precision bit.
function [`FIXED_WIDTH:1] round_frac
(
// Input is (FIXED_WIDTH-FRAC_PRECISION).FRAC_PRECISION fixed point number
input [`FIXED_WIDTH:1] decimal,
// This describes the precision of the fraction, for example a value
// of 1 would modify the fractional so that instead of being a .16
// fractional, it would be a .1 (rounded to the nearest 0.5 in turn)
input [`FIXED_WIDTH:1] precision
);
begin
`ifdef DEBUG
$display("round_frac - decimal: %h, precision: %h", decimal, precision);
`endif
// If the fractional precision bit is high then round up
if( decimal[(`FRAC_PRECISION-precision)] == 1'b1) begin
round_frac = decimal + (1'b1 << (`FRAC_PRECISION-precision));
end else begin
round_frac = decimal;
end
`ifdef DEBUG
$display("round_frac: %h", round_frac);
`endif
end
endfunction
// This function calculates high_time, low_time, w_edge, and no_count
// of a non-fractional counter based on the divide and duty cycle
//
// NOTE: high_time and low_time are returned as integers between 0 and 63
// inclusive. 64 should equal 6'b000000 (in other words it is okay to
// ignore the overflow)
function [13:0] mmcm_pll_divider
(
input [7:0] divide, // Max divide is 128
input [31:0] duty_cycle // Duty cycle is multiplied by 100,000
);
reg [`FIXED_WIDTH:1] duty_cycle_fix;
// High/Low time is initially calculated with a wider integer to prevent a
// calculation error when it overflows to 64.
reg [6:0] high_time;
reg [6:0] low_time;
reg w_edge;
reg no_count;
reg [`FIXED_WIDTH:1] temp;
begin
// Duty Cycle must be between 0 and 1,000
if(duty_cycle <=0 || duty_cycle >= 100000) begin
`ifndef SYNTHESIS
$display("ERROR: duty_cycle: %d is invalid", duty_cycle);
`endif
$finish;
end
// Convert to FIXED_WIDTH-FRAC_PRECISION.FRAC_PRECISION fixed point
duty_cycle_fix = (duty_cycle << `FRAC_PRECISION) / 100_000;
`ifdef DEBUG
$display("duty_cycle_fix: %h", duty_cycle_fix);
`endif
// If the divide is 1 nothing needs to be set except the no_count bit.
// Other values are dummies
if(divide == 7'h01) begin
high_time = 7'h01;
w_edge = 1'b0;
low_time = 7'h01;
no_count = 1'b1;
end else begin
temp = round_frac(duty_cycle_fix*divide, 1);
// comes from above round_frac
high_time = temp[`FRAC_PRECISION+7:`FRAC_PRECISION+1];
// If the duty cycle * divide rounded is .5 or greater then this bit
// is set.
w_edge = temp[`FRAC_PRECISION]; // comes from round_frac
// If the high time comes out to 0, it needs to be set to at least 1
// and w_edge set to 0
if(high_time == 7'h00) begin
high_time = 7'h01;
w_edge = 1'b0;
end
if(high_time == divide) begin
high_time = divide - 1;
w_edge = 1'b1;
end
// Calculate low_time based on the divide setting and set no_count to
// 0 as it is only used when divide is 1.
low_time = divide - high_time;
no_count = 1'b0;
end
// Set the return value.
mmcm_pll_divider = {w_edge,no_count,high_time[5:0],low_time[5:0]};
end
endfunction
// This function calculates mx, delay_time, and phase_mux
// of a non-fractional counter based on the divide and phase
//
// NOTE: The only valid value for the MX bits is 2'b00 to ensure the coarse mux
// is used.
function [10:0] mmcm_pll_phase
(
// divide must be an integer (use fractional if not)
// assumed that divide already checked to be valid
input [7:0] divide, // Max divide is 128
// Phase is given in degrees (-360,000 to 360,000)
input signed [31:0] phase
);
reg [`FIXED_WIDTH:1] phase_in_cycles;
reg [`FIXED_WIDTH:1] phase_fixed;
reg [1:0] mx;
reg [5:0] delay_time;
reg [2:0] phase_mux;
reg [`FIXED_WIDTH:1] temp;
begin
`ifdef DEBUG
$display("mmcm_pll_phase-divide:%d,phase:%d",
divide, phase);
`endif
if ((phase < -360000) || (phase > 360000)) begin
`ifndef SYNTHESIS
$display("ERROR: phase of $phase is not between -360000 and 360000");
`endif
$finish;
end
// If phase is less than 0, convert it to a positive phase shift
// Convert to (FIXED_WIDTH-FRAC_PRECISION).FRAC_PRECISION fixed point
if(phase < 0) begin
phase_fixed = ( (phase + 360000) << `FRAC_PRECISION ) / 1000;
end else begin
phase_fixed = ( phase << `FRAC_PRECISION ) / 1000;
end
// Put phase in terms of decimal number of vco clock cycles
phase_in_cycles = ( phase_fixed * divide ) / 360;
`ifdef DEBUG
$display("phase_in_cycles: %h", phase_in_cycles);
`endif
temp = round_frac(phase_in_cycles, 3);
// set mx to 2'b00 that the phase mux from the VCO is enabled
mx = 2'b00;
phase_mux = temp[`FRAC_PRECISION:`FRAC_PRECISION-2];
delay_time = temp[`FRAC_PRECISION+6:`FRAC_PRECISION+1];
`ifdef DEBUG
$display("temp: %h", temp);
`endif
// Setup the return value
mmcm_pll_phase={mx, phase_mux, delay_time};
end
endfunction
// This function takes the divide value and outputs the necessary lock values
function [39:0] mmcm_pll_lock_lookup
(
input [6:0] divide // Max divide is 64
);
reg [2559:0] lookup;
begin
lookup = {
// This table is composed of:
// LockRefDly_LockFBDly_LockCnt_LockSatHigh_UnlockCnt
40'b00110_00110_1111101000_1111101001_0000000001,
40'b00110_00110_1111101000_1111101001_0000000001,
40'b01000_01000_1111101000_1111101001_0000000001,
40'b01011_01011_1111101000_1111101001_0000000001,
40'b01110_01110_1111101000_1111101001_0000000001,
40'b10001_10001_1111101000_1111101001_0000000001,
40'b10011_10011_1111101000_1111101001_0000000001,
40'b10110_10110_1111101000_1111101001_0000000001,
40'b11001_11001_1111101000_1111101001_0000000001,
40'b11100_11100_1111101000_1111101001_0000000001,
40'b11111_11111_1110000100_1111101001_0000000001,
40'b11111_11111_1100111001_1111101001_0000000001,
40'b11111_11111_1011101110_1111101001_0000000001,
40'b11111_11111_1010111100_1111101001_0000000001,
40'b11111_11111_1010001010_1111101001_0000000001,
40'b11111_11111_1001110001_1111101001_0000000001,
40'b11111_11111_1000111111_1111101001_0000000001,
40'b11111_11111_1000100110_1111101001_0000000001,
40'b11111_11111_1000001101_1111101001_0000000001,
40'b11111_11111_0111110100_1111101001_0000000001,
40'b11111_11111_0111011011_1111101001_0000000001,
40'b11111_11111_0111000010_1111101001_0000000001,
40'b11111_11111_0110101001_1111101001_0000000001,
40'b11111_11111_0110010000_1111101001_0000000001,
40'b11111_11111_0110010000_1111101001_0000000001,
40'b11111_11111_0101110111_1111101001_0000000001,
40'b11111_11111_0101011110_1111101001_0000000001,
40'b11111_11111_0101011110_1111101001_0000000001,
40'b11111_11111_0101000101_1111101001_0000000001,
40'b11111_11111_0101000101_1111101001_0000000001,
40'b11111_11111_0100101100_1111101001_0000000001,
40'b11111_11111_0100101100_1111101001_0000000001,
40'b11111_11111_0100101100_1111101001_0000000001,
40'b11111_11111_0100010011_1111101001_0000000001,
40'b11111_11111_0100010011_1111101001_0000000001,
40'b11111_11111_0100010011_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001
};
// Set lookup_entry with the explicit bits from lookup with a part select
mmcm_pll_lock_lookup = lookup[ ((64-divide)*40) +: 40];
`ifdef DEBUG
$display("lock_lookup: %b", mmcm_pll_lock_lookup);
`endif
end
endfunction
// This function takes the divide value and the bandwidth setting of the MMCM
// and outputs the digital filter settings necessary.
function [9:0] mmcm_pll_filter_lookup
(
input [6:0] divide, // Max divide is 64
input [8*9:0] BANDWIDTH
);
reg [639:0] lookup_low;
reg [639:0] lookup_high;
reg [9:0] lookup_entry;
begin
lookup_low = {
// CP_RES_LFHF
10'b0010_1111_00,
10'b0010_1111_00,
10'b0010_1111_00,
10'b0010_1111_00,
10'b0010_0111_00,
10'b0010_1011_00,
10'b0010_1101_00,
10'b0010_0011_00,
10'b0010_0101_00,
10'b0010_0101_00,
10'b0010_1001_00,
10'b0010_1110_00,
10'b0010_1110_00,
10'b0010_1110_00,
10'b0010_1110_00,
10'b0010_0001_00,
10'b0010_0001_00,
10'b0010_0001_00,
10'b0010_0110_00,
10'b0010_0110_00,
10'b0010_0110_00,
10'b0010_0110_00,
10'b0010_0110_00,
10'b0010_0110_00,
10'b0010_0110_00,
10'b0010_1010_00,
10'b0010_1010_00,
10'b0010_1010_00,
10'b0010_1010_00,
10'b0010_1010_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00
};
lookup_high = {
// CP_RES_LFHF
10'b0010_1111_00,
10'b0100_1111_00,
10'b0101_1011_00,
10'b0111_0111_00,
10'b1101_0111_00,
10'b1110_1011_00,
10'b1110_1101_00,
10'b1111_0011_00,
10'b1110_0101_00,
10'b1111_0101_00,
10'b1111_1001_00,
10'b1101_0001_00,
10'b1111_1001_00,
10'b1111_1001_00,
10'b1111_1001_00,
10'b1111_1001_00,
10'b1111_0101_00,
10'b1111_0101_00,
10'b1100_0001_00,
10'b1100_0001_00,
10'b1100_0001_00,
10'b0101_1100_00,
10'b0101_1100_00,
10'b0101_1100_00,
10'b0101_1100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0011_0100_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0111_0001_00,
10'b0111_0001_00,
10'b0100_1100_00,
10'b0100_1100_00,
10'b0100_1100_00,
10'b0100_1100_00,
10'b0110_0001_00,
10'b0110_0001_00,
10'b0101_0110_00,
10'b0101_0110_00,
10'b0101_0110_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0100_1010_00,
10'b0011_1100_00,
10'b0011_1100_00
};
// Set lookup_entry with the explicit bits from lookup with a part select
if(BANDWIDTH == "LOW") begin
// Low Bandwidth
mmcm_pll_filter_lookup = lookup_low[ ((64-divide)*10) +: 10];
end else begin
// High or optimized bandwidth
mmcm_pll_filter_lookup = lookup_high[ ((64-divide)*10) +: 10];
end
`ifdef DEBUG
$display("filter_lookup: %b", mmcm_pll_filter_lookup);
`endif
end
endfunction
// This function takes in the divide, phase, and duty cycle
// setting to calculate the upper and lower counter registers.
function [37:0] mmcm_pll_count_calc
(
input [7:0] divide, // Max divide is 128
input signed [31:0] phase,
input [31:0] duty_cycle // Multiplied by 100,000
);
reg [13:0] div_calc;
reg [16:0] phase_calc;
begin
`ifdef DEBUG
$display("mmcm_pll_count_calc- divide:%h, phase:%d, duty_cycle:%d",
divide, phase, duty_cycle);
`endif
// w_edge[13], no_count[12], high_time[11:6], low_time[5:0]
div_calc = mmcm_pll_divider(divide, duty_cycle);
// mx[10:9], pm[8:6], dt[5:0]
phase_calc = mmcm_pll_phase(divide, phase);
// Return value is the upper and lower address of counter
// Upper address is:
// RESERVED [31:26]
// MX [25:24]
// EDGE [23]
// NOCOUNT [22]
// DELAY_TIME [21:16]
// Lower Address is:
// PHASE_MUX [15:13]
// RESERVED [12]
// HIGH_TIME [11:6]
// LOW_TIME [5:0]
`ifdef DEBUG
$display("div:%d dc:%d phase:%d ht:%d lt:%d ed:%d nc:%d mx:%d dt:%d pm:%d",
divide, duty_cycle, phase, div_calc[11:6], div_calc[5:0],
div_calc[13], div_calc[12],
phase_calc[16:15], phase_calc[5:0], phase_calc[14:12]);
`endif
mmcm_pll_count_calc =
{
// Upper Address
6'h00, phase_calc[10:9], div_calc[13:12], phase_calc[5:0],
// Lower Address
phase_calc[8:6], 1'b0, div_calc[11:0]
};
end
endfunction
// This function takes in the divide, phase, and duty cycle
// setting to calculate the upper and lower counter registers.
// for fractional multiply/divide functions.
//
//
function [37:0] mmcm_frac_count_calc
(
input [7:0] divide, // Max divide is 128
input signed [31:0] phase,
input [31:0] duty_cycle, // Multiplied by 1,000
input [9:0] frac // Multiplied by 1000
);
//Required for fractional divide calculations
reg [7:0] lt_frac;
reg [7:0] ht_frac;
reg /*[7:0]*/ wf_fall_frac;
reg /*[7:0]*/ wf_rise_frac;
reg [31:0] a;
reg [7:0] pm_rise_frac_filtered ;
reg [7:0] pm_fall_frac_filtered ;
reg [7:0] clkout0_divide_int;
reg [2:0] clkout0_divide_frac;
reg [7:0] even_part_high;
reg [7:0] even_part_low;
reg [7:0] odd;
reg [7:0] odd_and_frac;
reg [7:0] pm_fall;
reg [7:0] pm_rise;
reg [7:0] dt;
reg [7:0] dt_int;
reg [63:0] dt_calc;
reg [7:0] pm_rise_frac;
reg [7:0] pm_fall_frac;
reg [31:0] a_per_in_octets;
reg [31:0] a_phase_in_cycles;
parameter precision = 0.125;
reg [31:0] phase_fixed; // changed to 31:0 from 32:1 jt 5/2/11
reg [31: 0] phase_pos;
reg [31: 0] phase_vco;
reg [31:0] temp;// changed to 31:0 from 32:1 jt 5/2/11
reg [13:0] div_calc;
reg [16:0] phase_calc;
begin
`ifdef DEBUG
$display("mmcm_frac_count_calc- divide:%h, phase:%d, duty_cycle:%d",
divide, phase, duty_cycle);
`endif
//convert phase to fixed
if ((phase < -360000) || (phase > 360000)) begin
`ifndef SYNTHESIS
$display("ERROR: phase of $phase is not between -360000 and 360000");
`endif
$finish;
end
// Return value is
// Transfer data
// RESERVED [37:36]
// FRAC_TIME [35:33]
// FRAC_WF_FALL [32]
// Upper address is:
// RESERVED [31:26]
// MX [25:24]
// EDGE [23]
// NOCOUNT [22]
// DELAY_TIME [21:16]
// Lower Address is:
// PHASE_MUX [15:13]
// RESERVED [12]
// HIGH_TIME [11:6]
// LOW_TIME [5:0]
clkout0_divide_frac = frac / 125;
clkout0_divide_int = divide;
even_part_high = clkout0_divide_int >> 1;//$rtoi(clkout0_divide_int / 2);
even_part_low = even_part_high;
odd = clkout0_divide_int - even_part_high - even_part_low;
odd_and_frac = (8*odd) + clkout0_divide_frac;
lt_frac = even_part_high - (odd_and_frac <= 9);//IF(odd_and_frac>9,even_part_high, even_part_high - 1)
ht_frac = even_part_low - (odd_and_frac <= 8);//IF(odd_and_frac>8,even_part_low, even_part_low- 1)
pm_fall = {odd[6:0],2'b00} + {6'h00, clkout0_divide_frac[2:1]}; // using >> instead of clkout0_divide_frac / 2
pm_rise = 0; //0
wf_fall_frac = ((odd_and_frac >=2) && (odd_and_frac <=9)) || ((clkout0_divide_frac == 1) && (clkout0_divide_int == 2));//CRS610807
wf_rise_frac = (odd_and_frac >=1) && (odd_and_frac <=8);//IF(odd_and_frac>=1,IF(odd_and_frac <= 8,1,0),0)
//Calculate phase in fractional cycles
a_per_in_octets = (8 * divide) + (frac / 125) ;
a_phase_in_cycles = (phase+10) * a_per_in_octets / 360000 ;//Adding 1 due to rounding errors
pm_rise_frac = (a_phase_in_cycles[7:0] ==8'h00)?8'h00:a_phase_in_cycles[7:0] - {a_phase_in_cycles[7:3],3'b000};
dt_calc = ((phase+10) * a_per_in_octets / 8 )/360000 ;//TRUNC(phase* divide / 360); //or_simply (a_per_in_octets / 8)
dt = dt_calc[7:0];
pm_rise_frac_filtered = (pm_rise_frac >=8) ? (pm_rise_frac ) - 8: pm_rise_frac ; //((phase_fixed * (divide + frac / 1000)) / 360) - {pm_rise_frac[7:3],3'b000};//$rtoi(clkout0_phase * clkout0_divide / 45);//a;
dt_int = dt + (& pm_rise_frac[7:4]); //IF(pm_rise_overwriting>7,dt+1,dt)
pm_fall_frac = pm_fall + pm_rise_frac;
pm_fall_frac_filtered = pm_fall + pm_rise_frac - {pm_fall_frac[7:3], 3'b000};
div_calc = mmcm_pll_divider(divide, duty_cycle); //Use to determine edge[7], no count[6]
phase_calc = mmcm_pll_phase(divide, phase);// returns{mx[1:0], phase_mux[2:0], delay_time[5:0]}
mmcm_frac_count_calc[37:0] =
{ 2'b00, pm_fall_frac_filtered[2:0], wf_fall_frac,
1'b0, clkout0_divide_frac[2:0], 1'b1, wf_rise_frac, phase_calc[10:9], div_calc[13:12], dt[5:0],
pm_rise_frac_filtered[2], pm_rise_frac_filtered[1], pm_rise_frac_filtered[0], 1'b0, ht_frac[5:0], lt_frac[5:0]
} ;
`ifdef DEBUG
$display("-%d.%d p%d>> :DADDR_9_15 frac30to28.frac_en.wf_r_frac.dt:%b%d%d_%b:DADDR_7_13 pm_f_frac_filtered_29to27.wf_f_frac_26:%b%d:DADDR_8_14.pm_r_frac_filt_15to13.ht_frac.lt_frac:%b%b%b:", divide, frac, phase, clkout0_divide_frac, 1, wf_rise_frac, dt, pm_fall_frac_filtered, wf_fall_frac, pm_rise_frac_filtered, ht_frac, lt_frac);
`endif
end
endfunction
@@ -0,0 +1,531 @@
///////////////////////////////////////////////////////////////////////////////
//
// Company: Xilinx
// Engineer: Jim Tatsukawa, Karl Kurbjun and Carl Ribbing
// Date: 7/30/2014
// Design Name: PLLE2 DRP
// Module Name: plle2_drp_func.h
// Version: 2.00
// Target Devices: 7 Series || PLL
// Tool versions: 2014.3
// Description: This header provides the functions necessary to
// calculate the DRP register values for the V6 PLL.
// Updated for CR663854.
//
// Disclaimer: XILINX IS PROVIDING THIS DESIGN, CODE, OR
// INFORMATION "AS IS" SOLELY FOR USE IN DEVELOPING
// PROGRAMS AND SOLUTIONS FOR XILINX DEVICES. BY
// PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,
// APPLICATION OR STANDARD, XILINX IS MAKING NO
// REPRESENTATION THAT THIS IMPLEMENTATION IS FREE
// FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE
// RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY
// REQUIRE FOR YOUR IMPLEMENTATION. XILINX
// EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH
// RESPECT TO THE ADEQUACY OF THE IMPLEMENTATION,
// INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR
// REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE.
//
// (c) Copyright 2009-2010 Xilinx, Inc.
// All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
// These are user functions that should not be modified. Changes to the defines
// or code within the functions may alter the accuracy of the calculations.
// Define debug to provide extra messages durring elaboration
//`define DEBUG 1
// FRAC_PRECISION describes the width of the fractional portion of the fixed
// point numbers. These should not be modified, they are for development
// only
`define FRAC_PRECISION 10
// FIXED_WIDTH describes the total size for fixed point calculations(int+frac).
// Warning: L.50 and below will not calculate properly with FIXED_WIDTHs
// greater than 32
`define FIXED_WIDTH 32
// This function takes a fixed point number and rounds it to the nearest
// fractional precision bit.
function [`FIXED_WIDTH:1] round_frac
(
// Input is (FIXED_WIDTH-FRAC_PRECISION).FRAC_PRECISION fixed point number
input [`FIXED_WIDTH:1] decimal,
// This describes the precision of the fraction, for example a value
// of 1 would modify the fractional so that instead of being a .16
// fractional, it would be a .1 (rounded to the nearest 0.5 in turn)
input [`FIXED_WIDTH:1] precision
);
begin
`ifdef DEBUG
$display("round_frac - decimal: %h, precision: %h", decimal, precision);
`endif
// If the fractional precision bit is high then round up
if( decimal[(`FRAC_PRECISION-precision)] == 1'b1) begin
round_frac = decimal + (1'b1 << (`FRAC_PRECISION-precision));
end else begin
round_frac = decimal;
end
`ifdef DEBUG
$display("round_frac: %h", round_frac);
`endif
end
endfunction
// This function calculates high_time, low_time, w_edge, and no_count
// of a non-fractional counter based on the divide and duty cycle
//
// NOTE: high_time and low_time are returned as integers between 0 and 63
// inclusive. 64 should equal 6'b000000 (in other words it is okay to
// ignore the overflow)
function [13:0] mmcm_pll_divider
(
input [7:0] divide, // Max divide is 128
input [31:0] duty_cycle // Duty cycle is multiplied by 100,000
);
reg [`FIXED_WIDTH:1] duty_cycle_fix;
// High/Low time is initially calculated with a wider integer to prevent a
// calculation error when it overflows to 64.
reg [6:0] high_time;
reg [6:0] low_time;
reg w_edge;
reg no_count;
reg [`FIXED_WIDTH:1] temp;
begin
// Duty Cycle must be between 0 and 1,000
if(duty_cycle <=0 || duty_cycle >= 100000) begin
`ifndef SYNTHESIS
$display("ERROR: duty_cycle: %d is invalid", duty_cycle);
`endif
$finish;
end
// Convert to FIXED_WIDTH-FRAC_PRECISION.FRAC_PRECISION fixed point
duty_cycle_fix = (duty_cycle << `FRAC_PRECISION) / 100_000;
`ifdef DEBUG
$display("duty_cycle_fix: %h", duty_cycle_fix);
`endif
// If the divide is 1 nothing needs to be set except the no_count bit.
// Other values are dummies
if(divide == 7'h01) begin
high_time = 7'h01;
w_edge = 1'b0;
low_time = 7'h01;
no_count = 1'b1;
end else begin
temp = round_frac(duty_cycle_fix*divide, 1);
// comes from above round_frac
high_time = temp[`FRAC_PRECISION+7:`FRAC_PRECISION+1];
// If the duty cycle * divide rounded is .5 or greater then this bit
// is set.
w_edge = temp[`FRAC_PRECISION]; // comes from round_frac
// If the high time comes out to 0, it needs to be set to at least 1
// and w_edge set to 0
if(high_time == 7'h00) begin
high_time = 7'h01;
w_edge = 1'b0;
end
if(high_time == divide) begin
high_time = divide - 1;
w_edge = 1'b1;
end
// Calculate low_time based on the divide setting and set no_count to
// 0 as it is only used when divide is 1.
low_time = divide - high_time;
no_count = 1'b0;
end
// Set the return value.
mmcm_pll_divider = {w_edge,no_count,high_time[5:0],low_time[5:0]};
end
endfunction
// This function calculates mx, delay_time, and phase_mux
// of a non-fractional counter based on the divide and phase
//
// NOTE: The only valid value for the MX bits is 2'b00 to ensure the coarse mux
// is used.
function [10:0] mmcm_pll_phase
(
// divide must be an integer (use fractional if not)
// assumed that divide already checked to be valid
input [7:0] divide, // Max divide is 128
// Phase is given in degrees (-360,000 to 360,000)
input signed [31:0] phase
);
reg [`FIXED_WIDTH:1] phase_in_cycles;
reg [`FIXED_WIDTH:1] phase_fixed;
reg [1:0] mx;
reg [5:0] delay_time;
reg [2:0] phase_mux;
reg [`FIXED_WIDTH:1] temp;
begin
`ifdef DEBUG
$display("mmcm_pll_phase-divide:%d,phase:%d",
divide, phase);
`endif
if ((phase < -360000) || (phase > 360000)) begin
`ifndef SYNTHESIS
$display("ERROR: phase of $phase is not between -360000 and 360000");
`endif
$finish;
end
// If phase is less than 0, convert it to a positive phase shift
// Convert to (FIXED_WIDTH-FRAC_PRECISION).FRAC_PRECISION fixed point
if(phase < 0) begin
phase_fixed = ( (phase + 360000) << `FRAC_PRECISION ) / 1000;
end else begin
phase_fixed = ( phase << `FRAC_PRECISION ) / 1000;
end
// Put phase in terms of decimal number of vco clock cycles
phase_in_cycles = ( phase_fixed * divide ) / 360;
`ifdef DEBUG
$display("phase_in_cycles: %h", phase_in_cycles);
`endif
temp = round_frac(phase_in_cycles, 3);
// set mx to 2'b00 that the phase mux from the VCO is enabled
mx = 2'b00;
phase_mux = temp[`FRAC_PRECISION:`FRAC_PRECISION-2];
delay_time = temp[`FRAC_PRECISION+6:`FRAC_PRECISION+1];
`ifdef DEBUG
$display("temp: %h", temp);
`endif
// Setup the return value
mmcm_pll_phase={mx, phase_mux, delay_time};
end
endfunction
// This function takes the divide value and outputs the necessary lock values
function [39:0] mmcm_pll_lock_lookup
(
input [6:0] divide // Max divide is 64
);
reg [2559:0] lookup;
begin
lookup = {
// This table is composed of:
// LockRefDly_LockFBDly_LockCnt_LockSatHigh_UnlockCnt
40'b00110_00110_1111101000_1111101001_0000000001,
40'b00110_00110_1111101000_1111101001_0000000001,
40'b01000_01000_1111101000_1111101001_0000000001,
40'b01011_01011_1111101000_1111101001_0000000001,
40'b01110_01110_1111101000_1111101001_0000000001,
40'b10001_10001_1111101000_1111101001_0000000001,
40'b10011_10011_1111101000_1111101001_0000000001,
40'b10110_10110_1111101000_1111101001_0000000001,
40'b11001_11001_1111101000_1111101001_0000000001,
40'b11100_11100_1111101000_1111101001_0000000001,
40'b11111_11111_1110000100_1111101001_0000000001,
40'b11111_11111_1100111001_1111101001_0000000001,
40'b11111_11111_1011101110_1111101001_0000000001,
40'b11111_11111_1010111100_1111101001_0000000001,
40'b11111_11111_1010001010_1111101001_0000000001,
40'b11111_11111_1001110001_1111101001_0000000001,
40'b11111_11111_1000111111_1111101001_0000000001,
40'b11111_11111_1000100110_1111101001_0000000001,
40'b11111_11111_1000001101_1111101001_0000000001,
40'b11111_11111_0111110100_1111101001_0000000001,
40'b11111_11111_0111011011_1111101001_0000000001,
40'b11111_11111_0111000010_1111101001_0000000001,
40'b11111_11111_0110101001_1111101001_0000000001,
40'b11111_11111_0110010000_1111101001_0000000001,
40'b11111_11111_0110010000_1111101001_0000000001,
40'b11111_11111_0101110111_1111101001_0000000001,
40'b11111_11111_0101011110_1111101001_0000000001,
40'b11111_11111_0101011110_1111101001_0000000001,
40'b11111_11111_0101000101_1111101001_0000000001,
40'b11111_11111_0101000101_1111101001_0000000001,
40'b11111_11111_0100101100_1111101001_0000000001,
40'b11111_11111_0100101100_1111101001_0000000001,
40'b11111_11111_0100101100_1111101001_0000000001,
40'b11111_11111_0100010011_1111101001_0000000001,
40'b11111_11111_0100010011_1111101001_0000000001,
40'b11111_11111_0100010011_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001
};
// Set lookup_entry with the explicit bits from lookup with a part select
mmcm_pll_lock_lookup = lookup[ ((64-divide)*40) +: 40];
`ifdef DEBUG
$display("lock_lookup: %b", mmcm_pll_lock_lookup);
`endif
end
endfunction
// This function takes the divide value and the bandwidth setting of the PLL
// and outputs the digital filter settings necessary.
function [9:0] mmcm_pll_filter_lookup
(
input [6:0] divide, // Max divide is 64
input [8*9:0] BANDWIDTH
);
reg [639:0] lookup_low;
reg [639:0] lookup_high;
reg [9:0] lookup_entry;
begin
lookup_low = {
// CP_RES_LFHF
10'b0010_1111_00,
10'b0010_1111_00,
10'b0010_0111_00,
10'b0010_1101_00,
10'b0010_0101_00,
10'b0010_0101_00,
10'b0010_1001_00,
10'b0010_1110_00,
10'b0010_1110_00,
10'b0010_0001_00,
10'b0010_0001_00,
10'b0010_0110_00,
10'b0010_0110_00,
10'b0010_0110_00,
10'b0010_0110_00,
10'b0010_1010_00,
10'b0010_1010_00,
10'b0010_1010_00,
10'b0010_1010_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_1100_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0010_0010_00,
10'b0011_1100_00,
10'b0011_1100_00,
10'b0011_1100_00,
10'b0011_1100_00,
10'b0011_1100_00,
10'b0011_1100_00,
10'b0011_1100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00
};
lookup_high = {
// CP_RES_LFHF
10'b0011_0111_00,
10'b0011_0111_00,
10'b0101_1111_00,
10'b0111_1111_00,
10'b0111_1011_00,
10'b1101_0111_00,
10'b1110_1011_00,
10'b1110_1101_00,
10'b1111_1101_00,
10'b1111_0111_00,
10'b1111_1011_00,
10'b1111_1101_00,
10'b1111_0011_00,
10'b1110_0101_00,
10'b1111_0101_00,
10'b1111_0101_00,
10'b1111_0101_00,
10'b1111_0101_00,
10'b0111_0110_00,
10'b0111_0110_00,
10'b0111_0110_00,
10'b0111_0110_00,
10'b0101_1100_00,
10'b0101_1100_00,
10'b0101_1100_00,
10'b1100_0001_00,
10'b1100_0001_00,
10'b1100_0001_00,
10'b1100_0001_00,
10'b1100_0001_00,
10'b1100_0001_00,
10'b1100_0001_00,
10'b1100_0001_00,
10'b0100_0010_00,
10'b0100_0010_00,
10'b0100_0010_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0011_0100_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0010_1000_00,
10'b0100_1100_00,
10'b0100_1100_00,
10'b0100_1100_00,
10'b0100_1100_00,
10'b0100_1100_00,
10'b0100_1100_00,
10'b0100_1100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00,
10'b0010_0100_00
};
// Set lookup_entry with the explicit bits from lookup with a part select
if(BANDWIDTH == "LOW") begin
// Low Bandwidth
mmcm_pll_filter_lookup = lookup_low[ ((64-divide)*10) +: 10];
end else begin
// High or optimized bandwidth
mmcm_pll_filter_lookup = lookup_high[ ((64-divide)*10) +: 10];
end
`ifdef DEBUG
$display("filter_lookup: %b", mmcm_pll_filter_lookup);
`endif
end
endfunction
// This function takes in the divide, phase, and duty cycle
// setting to calculate the upper and lower counter registers.
function [37:0] mmcm_pll_count_calc
(
input [7:0] divide, // Max divide is 128
input signed [31:0] phase,
input [31:0] duty_cycle // Multiplied by 100,000
);
reg [13:0] div_calc;
reg [16:0] phase_calc;
begin
`ifdef DEBUG
$display("mmcm_pll_count_calc- divide:%h, phase:%d, duty_cycle:%d",
divide, phase, duty_cycle);
`endif
// w_edge[13], no_count[12], high_time[11:6], low_time[5:0]
div_calc = mmcm_pll_divider(divide, duty_cycle);
// mx[10:9], pm[8:6], dt[5:0]
phase_calc = mmcm_pll_phase(divide, phase);
// Return value is the upper and lower address of counter
// Upper address is:
// RESERVED [31:26]
// MX [25:24]
// EDGE [23]
// NOCOUNT [22]
// DELAY_TIME [21:16]
// Lower Address is:
// PHASE_MUX [15:13]
// RESERVED [12]
// HIGH_TIME [11:6]
// LOW_TIME [5:0]
`ifdef DEBUG
$display("div:%d dc:%d phase:%d ht:%d lt:%d ed:%d nc:%d mx:%d dt:%d pm:%d",
divide, duty_cycle, phase, div_calc[11:6], div_calc[5:0],
div_calc[13], div_calc[12],
phase_calc[16:15], phase_calc[5:0], phase_calc[14:12]);
`endif
mmcm_pll_count_calc =
{
// Upper Address
6'h00, phase_calc[10:9], div_calc[13:12], phase_calc[5:0],
// Lower Address
phase_calc[8:6], 1'b0, div_calc[11:0]
};
end
endfunction
@@ -0,0 +1,671 @@
///////////////////////////////////////////////////////////////////////////////
//
// Company: Xilinx
// Engineer: Jim Tatsukawa
// Date: 7/30/2014
// Design Name: MMCME2 DRP
// Module Name: mmcme2_drp_func.h
// Version: 1.04
// Target Devices: UltraScale Architecture || MMCM
// Tool versions: 2014.3
// Description: This header provides the functions necessary to
// calculate the DRP register values for the V6 MMCM.
//
// Revision Notes: 3/22 - Updating lookup_low/lookup_high (CR)
// 4/13 - Fractional divide function in mmcm_frac_count_calc function. CRS610807
//
// Disclaimer: XILINX IS PROVIDING THIS DESIGN, CODE, OR
// INFORMATION "AS IS" SOLELY FOR USE IN DEVELOPING
// PROGRAMS AND SOLUTIONS FOR XILINX DEVICES. BY
// PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,
// APPLICATION OR STANDARD, XILINX IS MAKING NO
// REPRESENTATION THAT THIS IMPLEMENTATION IS FREE
// FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE
// RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY
// REQUIRE FOR YOUR IMPLEMENTATION. XILINX
// EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH
// RESPECT TO THE ADEQUACY OF THE IMPLEMENTATION,
// INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR
// REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE.
//
// (c) Copyright 2009-2010 Xilinx, Inc.
// All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
// These are user functions that should not be modified. Changes to the defines
// or code within the functions may alter the accuracy of the calculations.
// Define debug to provide extra messages durring elaboration
//`define DEBUG 1
// FRAC_PRECISION describes the width of the fractional portion of the fixed
// point numbers. These should not be modified, they are for development
// only
`define FRAC_PRECISION 10
// FIXED_WIDTH describes the total size for fixed point calculations(int+frac).
// Warning: L.50 and below will not calculate properly with FIXED_WIDTHs
// greater than 32
`define FIXED_WIDTH 32
// This function takes a fixed point number and rounds it to the nearest
// fractional precision bit.
function [`FIXED_WIDTH:1] round_frac
(
// Input is (FIXED_WIDTH-FRAC_PRECISION).FRAC_PRECISION fixed point number
input [`FIXED_WIDTH:1] decimal,
// This describes the precision of the fraction, for example a value
// of 1 would modify the fractional so that instead of being a .16
// fractional, it would be a .1 (rounded to the nearest 0.5 in turn)
input [`FIXED_WIDTH:1] precision
);
begin
`ifdef DEBUG
$display("round_frac - decimal: %h, precision: %h", decimal, precision);
`endif
// If the fractional precision bit is high then round up
if( decimal[(`FRAC_PRECISION-precision)] == 1'b1) begin
round_frac = decimal + (1'b1 << (`FRAC_PRECISION-precision));
end else begin
round_frac = decimal;
end
`ifdef DEBUG
$display("round_frac: %h", round_frac);
`endif
end
endfunction
// This function calculates high_time, low_time, w_edge, and no_count
// of a non-fractional counter based on the divide and duty cycle
//
// NOTE: high_time and low_time are returned as integers between 0 and 63
// inclusive. 64 should equal 6'b000000 (in other words it is okay to
// ignore the overflow)
function [13:0] mmcm_pll_divider
(
input [7:0] divide, // Max divide is 128
input [31:0] duty_cycle // Duty cycle is multiplied by 100,000
);
reg [`FIXED_WIDTH:1] duty_cycle_fix;
// High/Low time is initially calculated with a wider integer to prevent a
// calculation error when it overflows to 64.
reg [6:0] high_time;
reg [6:0] low_time;
reg w_edge;
reg no_count;
reg [`FIXED_WIDTH:1] temp;
begin
// Duty Cycle must be between 0 and 1,000
if(duty_cycle <=0 || duty_cycle >= 100000) begin
`ifndef SYNTHESIS
$display("ERROR: duty_cycle: %d is invalid", duty_cycle);
`endif
$finish;
end
// Convert to FIXED_WIDTH-FRAC_PRECISION.FRAC_PRECISION fixed point
duty_cycle_fix = (duty_cycle << `FRAC_PRECISION) / 100_000;
`ifdef DEBUG
$display("duty_cycle_fix: %h", duty_cycle_fix);
`endif
// If the divide is 1 nothing needs to be set except the no_count bit.
// Other values are dummies
if(divide == 7'h01) begin
high_time = 7'h01;
w_edge = 1'b0;
low_time = 7'h01;
no_count = 1'b1;
end else begin
temp = round_frac(duty_cycle_fix*divide, 1);
// comes from above round_frac
high_time = temp[`FRAC_PRECISION+7:`FRAC_PRECISION+1];
// If the duty cycle * divide rounded is .5 or greater then this bit
// is set.
w_edge = temp[`FRAC_PRECISION]; // comes from round_frac
// If the high time comes out to 0, it needs to be set to at least 1
// and w_edge set to 0
if(high_time == 7'h00) begin
high_time = 7'h01;
w_edge = 1'b0;
end
if(high_time == divide) begin
high_time = divide - 1;
w_edge = 1'b1;
end
// Calculate low_time based on the divide setting and set no_count to
// 0 as it is only used when divide is 1.
low_time = divide - high_time;
no_count = 1'b0;
end
// Set the return value.
mmcm_pll_divider = {w_edge,no_count,high_time[5:0],low_time[5:0]};
end
endfunction
// This function calculates mx, delay_time, and phase_mux
// of a non-fractional counter based on the divide and phase
//
// NOTE: The only valid value for the MX bits is 2'b00 to ensure the coarse mux
// is used.
function [10:0] mmcm_pll_phase
(
// divide must be an integer (use fractional if not)
// assumed that divide already checked to be valid
input [7:0] divide, // Max divide is 128
// Phase is given in degrees (-360,000 to 360,000)
input signed [31:0] phase
);
reg [`FIXED_WIDTH:1] phase_in_cycles;
reg [`FIXED_WIDTH:1] phase_fixed;
reg [1:0] mx;
reg [5:0] delay_time;
reg [2:0] phase_mux;
reg [`FIXED_WIDTH:1] temp;
begin
`ifdef DEBUG
$display("mmcm_pll_phase-divide:%d,phase:%d",
divide, phase);
`endif
if ((phase < -360000) || (phase > 360000)) begin
`ifndef SYNTHESIS
$display("ERROR: phase of $phase is not between -360000 and 360000");
`endif
$finish;
end
// If phase is less than 0, convert it to a positive phase shift
// Convert to (FIXED_WIDTH-FRAC_PRECISION).FRAC_PRECISION fixed point
if(phase < 0) begin
phase_fixed = ( (phase + 360000) << `FRAC_PRECISION ) / 1000;
end else begin
phase_fixed = ( phase << `FRAC_PRECISION ) / 1000;
end
// Put phase in terms of decimal number of vco clock cycles
phase_in_cycles = ( phase_fixed * divide ) / 360;
`ifdef DEBUG
$display("phase_in_cycles: %h", phase_in_cycles);
`endif
temp = round_frac(phase_in_cycles, 3);
// set mx to 2'b00 that the phase mux from the VCO is enabled
mx = 2'b00;
phase_mux = temp[`FRAC_PRECISION:`FRAC_PRECISION-2];
delay_time = temp[`FRAC_PRECISION+6:`FRAC_PRECISION+1];
`ifdef DEBUG
$display("temp: %h", temp);
`endif
// Setup the return value
mmcm_pll_phase={mx, phase_mux, delay_time};
end
endfunction
// This function takes the divide value and outputs the necessary lock values
function [39:0] mmcm_pll_lock_lookup
(
input [6:0] divide // Max divide is 64
);
reg [2559:0] lookup;
begin
lookup = {
// This table is composed of:
// LockRefDly_LockFBDly_LockCnt_LockSatHigh_UnlockCnt
40'b00110_00110_1111101000_1111101001_0000000001,
40'b00110_00110_1111101000_1111101001_0000000001,
40'b01000_01000_1111101000_1111101001_0000000001,
40'b01011_01011_1111101000_1111101001_0000000001,
40'b01110_01110_1111101000_1111101001_0000000001,
40'b10001_10001_1111101000_1111101001_0000000001,
40'b10011_10011_1111101000_1111101001_0000000001,
40'b10110_10110_1111101000_1111101001_0000000001,
40'b11001_11001_1111101000_1111101001_0000000001,
40'b11100_11100_1111101000_1111101001_0000000001,
40'b11111_11111_1110000100_1111101001_0000000001,
40'b11111_11111_1100111001_1111101001_0000000001,
40'b11111_11111_1011101110_1111101001_0000000001,
40'b11111_11111_1010111100_1111101001_0000000001,
40'b11111_11111_1010001010_1111101001_0000000001,
40'b11111_11111_1001110001_1111101001_0000000001,
40'b11111_11111_1000111111_1111101001_0000000001,
40'b11111_11111_1000100110_1111101001_0000000001,
40'b11111_11111_1000001101_1111101001_0000000001,
40'b11111_11111_0111110100_1111101001_0000000001,
40'b11111_11111_0111011011_1111101001_0000000001,
40'b11111_11111_0111000010_1111101001_0000000001,
40'b11111_11111_0110101001_1111101001_0000000001,
40'b11111_11111_0110010000_1111101001_0000000001,
40'b11111_11111_0110010000_1111101001_0000000001,
40'b11111_11111_0101110111_1111101001_0000000001,
40'b11111_11111_0101011110_1111101001_0000000001,
40'b11111_11111_0101011110_1111101001_0000000001,
40'b11111_11111_0101000101_1111101001_0000000001,
40'b11111_11111_0101000101_1111101001_0000000001,
40'b11111_11111_0100101100_1111101001_0000000001,
40'b11111_11111_0100101100_1111101001_0000000001,
40'b11111_11111_0100101100_1111101001_0000000001,
40'b11111_11111_0100010011_1111101001_0000000001,
40'b11111_11111_0100010011_1111101001_0000000001,
40'b11111_11111_0100010011_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001
};
// Set lookup_entry with the explicit bits from lookup with a part select
mmcm_pll_lock_lookup = lookup[ ((64-divide)*40) +: 40];
`ifdef DEBUG
$display("lock_lookup: %b", mmcm_pll_lock_lookup);
`endif
end
endfunction
// This function takes the divide value and the bandwidth setting of the MMCM
// and outputs the digital filter settings necessary.
function [9:0] mmcm_pll_filter_lookup
(
input [6:0] divide, // Max divide is 64
input [8*9:0] BANDWIDTH
);
reg [639:0] lookup_low;
reg [639:0] lookup_high;
reg [9:0] lookup_entry;
begin
lookup_low = {
// CP_RES_LFHF
10'b0010_1111_11,
10'b0010_1111_11,
10'b0010_1111_11,
10'b0010_1111_11,
10'b0010_1111_11,
10'b0010_1111_11,
10'b0010_0111_11,
10'b0010_0111_11,
10'b0010_0111_11,
10'b0010_1101_11,
10'b0010_1101_11,
10'b0010_1101_11,
10'b0010_0011_11,
10'b0010_0101_11,
10'b0010_0101_11,
10'b0010_0101_11,
10'b0010_1001_11,
10'b0010_1001_11,
10'b0010_1110_11,
10'b0010_1110_11,
10'b0010_1110_11,
10'b0010_1110_11,
10'b0010_1110_11,
10'b0010_1110_11,
10'b0010_0001_11,
10'b0010_0001_11,
10'b0010_0001_11,
10'b0010_0001_11,
10'b0010_0001_11,
10'b0010_0110_11,
10'b0010_0110_11,
10'b0010_0110_11,
10'b0010_0110_11,
10'b0010_0110_11,
10'b0010_0110_11,
10'b0010_0110_11,
10'b0010_0110_11,
10'b0010_0110_11,
10'b0010_0110_11,
10'b0010_1010_11,
10'b0010_1010_11,
10'b0010_1010_11,
10'b0010_1010_11,
10'b0010_1010_11,
10'b0010_1010_11,
10'b0010_1010_11,
10'b0010_1010_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11,
10'b0010_1100_11
};
lookup_high = {
// CP_RES_LFHF
10'b0010_1111_11,
10'b0010_1111_11,
10'b0010_1011_11,
10'b0011_1111_11,
10'b0100_1111_11,
10'b0100_1111_11,
10'b0101_1111_11,
10'b0110_1111_11,
10'b0111_1111_11,
10'b0111_1111_11,
10'b1100_1111_11,
10'b1101_1111_11,
10'b1110_1111_11,
10'b1111_1111_11,
10'b1111_1111_11,
10'b1110_0111_11,
10'b1110_1011_11,
10'b1111_0111_11,
10'b1111_1011_11,
10'b1111_1011_11,
10'b1110_1101_11,
10'b1111_1101_11,
10'b1111_1101_11,
10'b1111_0011_11,
10'b1111_0011_11,
10'b1111_0011_11,
10'b1110_0101_11,
10'b1110_0101_11,
10'b1110_0101_11,
10'b1111_0101_11,
10'b1111_0101_11,
10'b1111_0101_11,
10'b1111_1001_11,
10'b1111_1001_11,
10'b1111_1001_11,
10'b1111_1001_11,
10'b1111_1001_11,
10'b1110_1110_11,
10'b1110_1110_11,
10'b1110_1110_11,
10'b1110_1110_11,
10'b1111_1110_11,
10'b1111_1110_11,
10'b1111_1110_11,
10'b1111_1110_11,
10'b1111_1110_11,
10'b1111_1110_11,
10'b1111_1110_11,
10'b1110_0001_11,
10'b1110_0001_11,
10'b1110_0001_11,
10'b1110_0001_11,
10'b1110_0001_11,
10'b1100_0110_11,
10'b1100_0110_11,
10'b1100_0110_11,
10'b1100_0110_11,
10'b1100_0110_11,
10'b1100_0110_11,
10'b1100_0110_11,
10'b1100_1010_11,
10'b1100_1010_11,
10'b1100_1010_11,
10'b1100_1010_11
};
// Set lookup_entry with the explicit bits from lookup with a part select
if(BANDWIDTH == "LOW") begin
// Low Bandwidth
mmcm_pll_filter_lookup = lookup_low[ ((64-divide)*10) +: 10];
end else begin
// High or optimized bandwidth
mmcm_pll_filter_lookup = lookup_high[ ((64-divide)*10) +: 10];
end
`ifdef DEBUG
$display("filter_lookup: %b", mmcm_pll_filter_lookup);
`endif
end
endfunction
// This function takes in the divide, phase, and duty cycle
// setting to calculate the upper and lower counter registers.
function [37:0] mmcm_pll_count_calc
(
input [7:0] divide, // Max divide is 128
input signed [31:0] phase,
input [31:0] duty_cycle // Multiplied by 100,000
);
reg [13:0] div_calc;
reg [16:0] phase_calc;
begin
`ifdef DEBUG
$display("mmcm_pll_count_calc- divide:%h, phase:%d, duty_cycle:%d",
divide, phase, duty_cycle);
`endif
// w_edge[13], no_count[12], high_time[11:6], low_time[5:0]
div_calc = mmcm_pll_divider(divide, duty_cycle);
// mx[10:9], pm[8:6], dt[5:0]
phase_calc = mmcm_pll_phase(divide, phase);
// Return value is the upper and lower address of counter
// Upper address is:
// RESERVED [31:26]
// MX [25:24]
// EDGE [23]
// NOCOUNT [22]
// DELAY_TIME [21:16]
// Lower Address is:
// PHASE_MUX [15:13]
// RESERVED [12]
// HIGH_TIME [11:6]
// LOW_TIME [5:0]
`ifdef DEBUG
$display("div:%d dc:%d phase:%d ht:%d lt:%d ed:%d nc:%d mx:%d dt:%d pm:%d",
divide, duty_cycle, phase, div_calc[11:6], div_calc[5:0],
div_calc[13], div_calc[12],
phase_calc[16:15], phase_calc[5:0], phase_calc[14:12]);
`endif
mmcm_pll_count_calc =
{
// Upper Address
6'h00, phase_calc[10:9], div_calc[13:12], phase_calc[5:0],
// Lower Address
phase_calc[8:6], 1'b0, div_calc[11:0]
};
end
endfunction
// This function takes in the divide, phase, and duty cycle
// setting to calculate the upper and lower counter registers.
// for fractional multiply/divide functions.
//
//
function [37:0] mmcm_frac_count_calc
(
input [7:0] divide, // Max divide is 128
input signed [31:0] phase,
input [31:0] duty_cycle, // Multiplied by 1,000
input [9:0] frac // Multiplied by 1000
);
//Required for fractional divide calculations
reg [7:0] lt_frac;
reg [7:0] ht_frac;
reg /*[7:0]*/ wf_fall_frac;
reg /*[7:0]*/ wf_rise_frac;
reg [31:0] a;
reg [7:0] pm_rise_frac_filtered ;
reg [7:0] pm_fall_frac_filtered ;
reg [7:0] clkout0_divide_int;
reg [2:0] clkout0_divide_frac;
reg [7:0] even_part_high;
reg [7:0] even_part_low;
reg [7:0] odd;
reg [7:0] odd_and_frac;
reg [7:0] pm_fall;
reg [7:0] pm_rise;
reg [7:0] dt;
reg [7:0] dt_int;
reg [63:0] dt_calc;
reg [7:0] pm_rise_frac;
reg [7:0] pm_fall_frac;
reg [31:0] a_per_in_octets;
reg [31:0] a_phase_in_cycles;
parameter precision = 0.125;
reg [31:0] phase_fixed; // changed to 31:0 from 32:1 jt 5/2/11
reg [31: 0] phase_pos;
reg [31: 0] phase_vco;
reg [31:0] temp;// changed to 31:0 from 32:1 jt 5/2/11
reg [13:0] div_calc;
reg [16:0] phase_calc;
begin
`ifdef DEBUG
$display("mmcm_frac_count_calc- divide:%h, phase:%d, duty_cycle:%d",
divide, phase, duty_cycle);
`endif
//convert phase to fixed
if ((phase < -360000) || (phase > 360000)) begin
`ifndef SYNTHESIS
$display("ERROR: phase of $phase is not between -360000 and 360000");
`endif
$finish;
end
// Return value is
// Transfer data
// RESERVED [37:36]
// FRAC_TIME [35:33]
// FRAC_WF_FALL [32]
// Upper address is:
// RESERVED [31:26]
// MX [25:24]
// EDGE [23]
// NOCOUNT [22]
// DELAY_TIME [21:16]
// Lower Address is:
// PHASE_MUX [15:13]
// RESERVED [12]
// HIGH_TIME [11:6]
// LOW_TIME [5:0]
clkout0_divide_frac = frac / 125;
clkout0_divide_int = divide;
even_part_high = clkout0_divide_int >> 1;//$rtoi(clkout0_divide_int / 2);
even_part_low = even_part_high;
odd = clkout0_divide_int - even_part_high - even_part_low;
odd_and_frac = (8*odd) + clkout0_divide_frac;
lt_frac = even_part_high - (odd_and_frac <= 9);//IF(odd_and_frac>9,even_part_high, even_part_high - 1)
ht_frac = even_part_low - (odd_and_frac <= 8);//IF(odd_and_frac>8,even_part_low, even_part_low- 1)
pm_fall = {odd[6:0],2'b00} + {6'h00, clkout0_divide_frac[2:1]}; // using >> instead of clkout0_divide_frac / 2
pm_rise = 0; //0
wf_fall_frac = ((odd_and_frac >=2) && (odd_and_frac <=9)) || ((clkout0_divide_frac == 1) && (clkout0_divide_int == 2));//CRS610807
wf_rise_frac = (odd_and_frac >=1) && (odd_and_frac <=8);//IF(odd_and_frac>=1,IF(odd_and_frac <= 8,1,0),0)
//Calculate phase in fractional cycles
a_per_in_octets = (8 * divide) + (frac / 125) ;
a_phase_in_cycles = (phase+10) * a_per_in_octets / 360000 ;//Adding 1 due to rounding errors
pm_rise_frac = (a_phase_in_cycles[7:0] ==8'h00)?8'h00:a_phase_in_cycles[7:0] - {a_phase_in_cycles[7:3],3'b000};
dt_calc = ((phase+10) * a_per_in_octets / 8 )/360000 ;//TRUNC(phase* divide / 360); //or_simply (a_per_in_octets / 8)
dt = dt_calc[7:0];
pm_rise_frac_filtered = (pm_rise_frac >=8) ? (pm_rise_frac ) - 8: pm_rise_frac ; //((phase_fixed * (divide + frac / 1000)) / 360) - {pm_rise_frac[7:3],3'b000};//$rtoi(clkout0_phase * clkout0_divide / 45);//a;
dt_int = dt + (& pm_rise_frac[7:4]); //IF(pm_rise_overwriting>7,dt+1,dt)
pm_fall_frac = pm_fall + pm_rise_frac;
pm_fall_frac_filtered = pm_fall + pm_rise_frac - {pm_fall_frac[7:3], 3'b000};
div_calc = mmcm_pll_divider(divide, duty_cycle); //Use to determine edge[7], no count[6]
phase_calc = mmcm_pll_phase(divide, phase);// returns{mx[1:0], phase_mux[2:0], delay_time[5:0]}
mmcm_frac_count_calc[37:0] =
{ 2'b00, pm_fall_frac_filtered[2:0], wf_fall_frac,
1'b0, clkout0_divide_frac[2:0], 1'b1, wf_rise_frac, phase_calc[10:9], div_calc[13:12], dt[5:0],
pm_rise_frac_filtered[2], pm_rise_frac_filtered[1], pm_rise_frac_filtered[0], 1'b0, ht_frac[5:0], lt_frac[5:0]
} ;
`ifdef DEBUG
$display("-%d.%d p%d>> :DADDR_9_15 frac30to28.frac_en.wf_r_frac.dt:%b%d%d_%b:DADDR_7_13 pm_f_frac_filtered_29to27.wf_f_frac_26:%b%d:DADDR_8_14.pm_r_frac_filt_15to13.ht_frac.lt_frac:%b%b%b:", divide, frac, phase, clkout0_divide_frac, 1, wf_rise_frac, dt, pm_fall_frac_filtered, wf_fall_frac, pm_rise_frac_filtered, ht_frac, lt_frac);
`endif
end
endfunction
@@ -0,0 +1,530 @@
///////////////////////////////////////////////////////////////////////////////
//
// Company: Xilinx
// Engineer: Jim Tatsukawa
// Date: 6/15/2015
// Design Name: PLLE3 DRP
// Module Name: plle3_drp_func.h
// Version: 1.10
// Target Devices: UltraScale Architecture
// Tool versions: 2015.1
// Description: This header provides the functions necessary to
// calculate the DRP register values for the V6 PLL.
//
// Revision Notes: 8/11 - PLLE3 updated for PLLE3 file 4564419
// Revision Notes: 6/15 - pll_filter_lookup fixed for max M of 19
// PM_Rise bits have been removed for PLLE3
//
// Disclaimer: XILINX IS PROVIDING THIS DESIGN, CODE, OR
// INFORMATION "AS IS" SOLELY FOR USE IN DEVELOPING
// PROGRAMS AND SOLUTIONS FOR XILINX DEVICES. BY
// PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,
// APPLICATION OR STANDARD, XILINX IS MAKING NO
// REPRESENTATION THAT THIS IMPLEMENTATION IS FREE
// FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE
// RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY
// REQUIRE FOR YOUR IMPLEMENTATION. XILINX
// EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH
// RESPECT TO THE ADEQUACY OF THE IMPLEMENTATION,
// INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR
// REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE.
//
// (c) Copyright 2009-2010 Xilinx, Inc.
// All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
// These are user functions that should not be modified. Changes to the defines
// or code within the functions may alter the accuracy of the calculations.
// Define debug to provide extra messages durring elaboration
//`define DEBUG 1
// FRAC_PRECISION describes the width of the fractional portion of the fixed
// point numbers. These should not be modified, they are for development
// only
`define FRAC_PRECISION 10
// FIXED_WIDTH describes the total size for fixed point calculations(int+frac).
// Warning: L.50 and below will not calculate properly with FIXED_WIDTHs
// greater than 32
`define FIXED_WIDTH 32
// This function takes a fixed point number and rounds it to the nearest
// fractional precision bit.
function [`FIXED_WIDTH:1] round_frac
(
// Input is (FIXED_WIDTH-FRAC_PRECISION).FRAC_PRECISION fixed point number
input [`FIXED_WIDTH:1] decimal,
// This describes the precision of the fraction, for example a value
// of 1 would modify the fractional so that instead of being a .16
// fractional, it would be a .1 (rounded to the nearest 0.5 in turn)
input [`FIXED_WIDTH:1] precision
);
begin
`ifdef DEBUG
$display("round_frac - decimal: %h, precision: %h", decimal, precision);
`endif
// If the fractional precision bit is high then round up
if( decimal[(`FRAC_PRECISION-precision)] == 1'b1) begin
round_frac = decimal + (1'b1 << (`FRAC_PRECISION-precision));
end else begin
round_frac = decimal;
end
`ifdef DEBUG
$display("round_frac: %h", round_frac);
`endif
end
endfunction
// This function calculates high_time, low_time, w_edge, and no_count
// of a non-fractional counter based on the divide and duty cycle
//
// NOTE: high_time and low_time are returned as integers between 0 and 63
// inclusive. 64 should equal 6'b000000 (in other words it is okay to
// ignore the overflow)
function [13:0] mmcm_pll_divider
(
input [7:0] divide, // Max divide is 128
input [31:0] duty_cycle // Duty cycle is multiplied by 100,000
);
reg [`FIXED_WIDTH:1] duty_cycle_fix;
// High/Low time is initially calculated with a wider integer to prevent a
// calculation error when it overflows to 64.
reg [6:0] high_time;
reg [6:0] low_time;
reg w_edge;
reg no_count;
reg [`FIXED_WIDTH:1] temp;
begin
// Duty Cycle must be between 0 and 1,000
if(duty_cycle <=0 || duty_cycle >= 100000) begin
`ifndef SYNTHESIS
$display("ERROR: duty_cycle: %d is invalid", duty_cycle);
`endif
$finish;
end
// Convert to FIXED_WIDTH-FRAC_PRECISION.FRAC_PRECISION fixed point
duty_cycle_fix = (duty_cycle << `FRAC_PRECISION) / 100_000;
`ifdef DEBUG
$display("duty_cycle_fix: %h", duty_cycle_fix);
`endif
// If the divide is 1 nothing needs to be set except the no_count bit.
// Other values are dummies
if(divide == 7'h01) begin
high_time = 7'h01;
w_edge = 1'b0;
low_time = 7'h01;
no_count = 1'b1;
end else begin
temp = round_frac(duty_cycle_fix*divide, 1);
// comes from above round_frac
high_time = temp[`FRAC_PRECISION+7:`FRAC_PRECISION+1];
// If the duty cycle * divide rounded is .5 or greater then this bit
// is set.
w_edge = temp[`FRAC_PRECISION]; // comes from round_frac
// If the high time comes out to 0, it needs to be set to at least 1
// and w_edge set to 0
if(high_time == 7'h00) begin
high_time = 7'h01;
w_edge = 1'b0;
end
if(high_time == divide) begin
high_time = divide - 1;
w_edge = 1'b1;
end
// Calculate low_time based on the divide setting and set no_count to
// 0 as it is only used when divide is 1.
low_time = divide - high_time;
no_count = 1'b0;
end
// Set the return value.
mmcm_pll_divider = {w_edge,no_count,high_time[5:0],low_time[5:0]};
end
endfunction
// This function calculates mx, delay_time, and phase_mux
// of a non-fractional counter based on the divide and phase
//
// NOTE: The only valid value for the MX bits is 2'b00 to ensure the coarse mux
// is used.
function [10:0] mmcm_pll_phase
(
// divide must be an integer (use fractional if not)
// assumed that divide already checked to be valid
input [7:0] divide, // Max divide is 128
// Phase is given in degrees (-360,000 to 360,000)
input signed [31:0] phase
);
reg [`FIXED_WIDTH:1] phase_in_cycles;
reg [`FIXED_WIDTH:1] phase_fixed;
reg [1:0] mx;
reg [5:0] delay_time;
reg [2:0] phase_mux;
reg [`FIXED_WIDTH:1] temp;
begin
`ifdef DEBUG
$display("mmcm_pll_phase-divide:%d,phase:%d",
divide, phase);
`endif
if ((phase < -360000) || (phase > 360000)) begin
`ifndef SYNTHESIS
$display("ERROR: phase of $phase is not between -360000 and 360000");
`endif
$finish;
end
// If phase is less than 0, convert it to a positive phase shift
// Convert to (FIXED_WIDTH-FRAC_PRECISION).FRAC_PRECISION fixed point
if(phase < 0) begin
phase_fixed = ( (phase + 360000) << `FRAC_PRECISION ) / 1000;
end else begin
phase_fixed = ( phase << `FRAC_PRECISION ) / 1000;
end
// Put phase in terms of decimal number of vco clock cycles
phase_in_cycles = ( phase_fixed * divide ) / 360;
`ifdef DEBUG
$display("phase_in_cycles: %h", phase_in_cycles);
`endif
temp = round_frac(phase_in_cycles, 3);
// set mx to 2'b00 that the phase mux from the VCO is enabled
mx = 2'b00;
phase_mux = temp[`FRAC_PRECISION:`FRAC_PRECISION-2];
delay_time = temp[`FRAC_PRECISION+6:`FRAC_PRECISION+1];
`ifdef DEBUG
$display("temp: %h", temp);
`endif
// Setup the return value
mmcm_pll_phase={mx, phase_mux, delay_time};
end
endfunction
// This function takes the divide value and outputs the necessary lock values
function [39:0] mmcm_pll_lock_lookup
(
input [6:0] divide // Max divide is 64
);
reg [759:0] lookup;
begin
lookup = {
// This table is composed of:
// LockRefDly_LockFBDly_LockCnt_LockSatHigh_UnlockCnt
40'b00110_00110_1111101000_1111101001_0000000001, //1
40'b00110_00110_1111101000_1111101001_0000000001, //2
40'b01000_01000_1111101000_1111101001_0000000001, //3
40'b01011_01011_1111101000_1111101001_0000000001, //4
40'b01110_01110_1111101000_1111101001_0000000001, //5
40'b10001_10001_1111101000_1111101001_0000000001, //6
40'b10011_10011_1111101000_1111101001_0000000001, //7
40'b10110_10110_1111101000_1111101001_0000000001, //8
40'b11001_11001_1111101000_1111101001_0000000001, //9
40'b11100_11100_1111101000_1111101001_0000000001, //10
40'b11111_11111_1110000100_1111101001_0000000001, //11
40'b11111_11111_1100111001_1111101001_0000000001, //12
40'b11111_11111_1011101110_1111101001_0000000001, //13
40'b11111_11111_1010111100_1111101001_0000000001, //14
40'b11111_11111_1010001010_1111101001_0000000001, //15
40'b11111_11111_1001110001_1111101001_0000000001, //16
40'b11111_11111_1000111111_1111101001_0000000001, //17
40'b11111_11111_1000100110_1111101001_0000000001, //18
40'b11111_11111_1000001101_1111101001_0000000001 //19
};
// Set lookup_entry with the explicit bits from lookup with a part select
mmcm_pll_lock_lookup = lookup[ ((19-divide)*40) +: 40];
`ifdef DEBUG
$display("lock_lookup: %b", mmcm_pll_lock_lookup);
`endif
end
endfunction
// This function takes the divide value and the bandwidth setting of the PLL
// and outputs the digital filter settings necessary. Removing bandwidth setting for PLLE3.
function [9:0] mmcm_pll_filter_lookup
(
input [6:0] divide // Max divide is 19
);
reg [639:0] lookup;
reg [9:0] lookup_entry;
begin
lookup = {
// CP_RES_LFHF
10'b0010_1111_01, //1
10'b0010_0011_11, //2
10'b0011_0011_11, //3
10'b0010_0001_11, //4
10'b0010_0110_11, //5
10'b0010_1010_11, //6
10'b0010_1010_11, //7
10'b0011_0110_11, //8
10'b0010_1100_11, //9
10'b0010_1100_11, //10
10'b0010_1100_11, //11
10'b0010_0010_11, //12
10'b0011_1100_11, //13
10'b0011_1100_11, //14
10'b0011_1100_11, //15
10'b0011_1100_11, //16
10'b0011_0010_11, //17
10'b0011_0010_11, //18
10'b0011_0010_11 //19
};
mmcm_pll_filter_lookup = lookup [ ((19-divide)*10) +: 10];
`ifdef DEBUG
$display("filter_lookup: %b", mmcm_pll_filter_lookup);
`endif
end
endfunction
// This function set the CLKOUTPHY divide settings to match
// the desired CLKOUTPHY_MODE setting. To create VCO_X2, then
// the CLKOUTPHY will be set to 2'b00 since the VCO is internally
// doubled and 2'b00 will represent divide by 1. Similarly "VCO" // will need to divide the doubled clock VCO clock frequency by // 2 therefore 2'b01 will match a divide by 2.And VCO_HALF will // need to divide the doubled VCO by 4, therefore 2'b10
function [9:0] mmcm_pll_clkoutphy_calc
(
input [8*9:0] CLKOUTPHY_MODE
);
if(CLKOUTPHY_MODE == "VCO_X2") begin
mmcm_pll_clkoutphy_calc= 2'b00;
end else if(CLKOUTPHY_MODE == "VCO") begin
mmcm_pll_clkoutphy_calc= 2'b01;
end else if(CLKOUTPHY_MODE == "CLKIN") begin
mmcm_pll_clkoutphy_calc= 2'b11;
end else begin // Assume "VCO_HALF"
mmcm_pll_clkoutphy_calc= 2'b10;
end
endfunction
// This function takes in the divide, phase, and duty cycle
// setting to calculate the upper and lower counter registers.
function [37:0] mmcm_pll_count_calc
(
input [7:0] divide, // Max divide is 128
input signed [31:0] phase,
input [31:0] duty_cycle // Multiplied by 100,000
);
reg [13:0] div_calc;
reg [16:0] phase_calc;
begin
`ifdef DEBUG
$display("mmcm_pll_count_calc- divide:%h, phase:%d, duty_cycle:%d",
divide, phase, duty_cycle);
`endif
// w_edge[13], no_count[12], high_time[11:6], low_time[5:0]
div_calc = mmcm_pll_divider(divide, duty_cycle);
// mx[10:9], pm[8:6], dt[5:0]
phase_calc = mmcm_pll_phase(divide, phase);
// Return value is the upper and lower address of counter
// Upper address is:
// RESERVED [31:26]
// MX [25:24]
// EDGE [23]
// NOCOUNT [22]
// DELAY_TIME [21:16]
// Lower Address is:
// PHASE_MUX [15:13]
// RESERVED [12]
// HIGH_TIME [11:6]
// LOW_TIME [5:0]
`ifdef DEBUG
$display("div:%d dc:%d phase:%d ht:%d lt:%d ed:%d nc:%d mx:%d dt:%d pm:%d",
divide, duty_cycle, phase, div_calc[11:6], div_calc[5:0],
div_calc[13], div_calc[12],
phase_calc[16:15], phase_calc[5:0], 3'b000);//Removed PM_Rise bits
`endif
mmcm_pll_count_calc =
{
// Upper Address
6'h00, phase_calc[10:9], div_calc[13:12], phase_calc[5:0],
// Lower Address
phase_calc[8:6], 1'b0, div_calc[11:0]
};
end
endfunction
// This function takes in the divide, phase, and duty cycle
// setting to calculate the upper and lower counter registers.
// for fractional multiply/divide functions.
//
//
function [37:0] mmcm_pll_frac_count_calc
(
input [7:0] divide, // Max divide is 128
input signed [31:0] phase,
input [31:0] duty_cycle, // Multiplied by 1,000
input [9:0] frac // Multiplied by 1000
);
//Required for fractional divide calculations
reg [7:0] lt_frac;
reg [7:0] ht_frac;
reg /*[7:0]*/ wf_fall_frac;
reg /*[7:0]*/ wf_rise_frac;
reg [31:0] a;
reg [7:0] pm_rise_frac_filtered ;
reg [7:0] pm_fall_frac_filtered ;
reg [7:0] clkout0_divide_int;
reg [2:0] clkout0_divide_frac;
reg [7:0] even_part_high;
reg [7:0] even_part_low;
reg [7:0] odd;
reg [7:0] odd_and_frac;
reg [7:0] pm_fall;
reg [7:0] pm_rise;
reg [7:0] dt;
reg [7:0] dt_int;
reg [63:0] dt_calc;
reg [7:0] pm_rise_frac;
reg [7:0] pm_fall_frac;
reg [31:0] a_per_in_octets;
reg [31:0] a_phase_in_cycles;
parameter precision = 0.125;
reg [31:0] phase_fixed; // changed to 31:0 from 32:1 jt 5/2/11
reg [31: 0] phase_pos;
reg [31: 0] phase_vco;
reg [31:0] temp;// changed to 31:0 from 32:1 jt 5/2/11
reg [13:0] div_calc;
reg [16:0] phase_calc;
begin
`ifdef DEBUG
$display("mmcm_pll_frac_count_calc- divide:%h, phase:%d, duty_cycle:%d",
divide, phase, duty_cycle);
`endif
//convert phase to fixed
if ((phase < -360000) || (phase > 360000)) begin
`ifndef SYNTHESIS
$display("ERROR: phase of $phase is not between -360000 and 360000");
`endif
$finish;
end
// Return value is
// Transfer data
// RESERVED [37:36]
// FRAC_TIME [35:33]
// FRAC_WF_FALL [32]
// Upper address is:
// RESERVED [31:26]
// MX [25:24]
// EDGE [23]
// NOCOUNT [22]
// DELAY_TIME [21:16]
// Lower Address is:
// PHASE_MUX [15:13]
// RESERVED [12]
// HIGH_TIME [11:6]
// LOW_TIME [5:0]
clkout0_divide_frac = frac / 125;
clkout0_divide_int = divide;
even_part_high = clkout0_divide_int >> 1;//$rtoi(clkout0_divide_int / 2);
even_part_low = even_part_high;
odd = clkout0_divide_int - even_part_high - even_part_low;
odd_and_frac = (8*odd) + clkout0_divide_frac;
lt_frac = even_part_high - (odd_and_frac <= 9);//IF(odd_and_frac>9,even_part_high, even_part_high - 1)
ht_frac = even_part_low - (odd_and_frac <= 8);//IF(odd_and_frac>8,even_part_low, even_part_low- 1)
pm_fall = {odd[6:0],2'b00} + {6'h00, clkout0_divide_frac[2:1]}; // using >> instead of clkout0_divide_frac / 2
pm_rise = 0; //0
wf_fall_frac = (odd_and_frac >=2) && (odd_and_frac <=9);//IF(odd_and_frac>=2,IF(odd_and_frac <= 9,1,0),0)
wf_rise_frac = (odd_and_frac >=1) && (odd_and_frac <=8);//IF(odd_and_frac>=1,IF(odd_and_frac <= 8,1,0),0)
//Calculate phase in fractional cycles
a_per_in_octets = (8 * divide) + (frac / 125) ;
a_phase_in_cycles = (phase+10) * a_per_in_octets / 360000 ;//Adding 1 due to rounding errors
pm_rise_frac = (a_phase_in_cycles[7:0] ==8'h00)?8'h00:a_phase_in_cycles[7:0] - {a_phase_in_cycles[7:3],3'b000};
dt_calc = ((phase+10) * a_per_in_octets / 8 )/360000 ;//TRUNC(phase* divide / 360); //or_simply (a_per_in_octets / 8)
dt = dt_calc[7:0];
pm_rise_frac_filtered = (pm_rise_frac >=8) ? (pm_rise_frac ) - 8: pm_rise_frac ; //((phase_fixed * (divide + frac / 1000)) / 360) - {pm_rise_frac[7:3],3'b000};//$rtoi(clkout0_phase * clkout0_divide / 45);//a;
dt_int = dt + (& pm_rise_frac[7:4]); //IF(pm_rise_overwriting>7,dt+1,dt)
pm_fall_frac = pm_fall + pm_rise_frac;
pm_fall_frac_filtered = pm_fall + pm_rise_frac - {pm_fall_frac[7:3], 3'b000};
div_calc = mmcm_pll_divider(divide, duty_cycle); //Use to determine edge[7], no count[6]
phase_calc = mmcm_pll_phase(divide, phase);// returns{mx[1:0], phase_mux[2:0], delay_time[5:0]}
mmcm_pll_frac_count_calc[37:0] =
{ 2'b00, pm_fall_frac_filtered[2:0], wf_fall_frac,
1'b0, clkout0_divide_frac[2:0], 1'b1, wf_rise_frac, phase_calc[10:9], div_calc[13:12], dt[5:0],
3'b000, 1'b0, ht_frac[5:0], lt_frac[5:0] //Removed PM_Rise bits
// pm_rise_frac_filtered[2], pm_rise_frac_filtered[1], pm_rise_frac_filtered[0], 1'b0, ht_frac[5:0], lt_frac[5:0]
} ;
`ifdef DEBUG
$display("-%d.%d p%d>> :DADDR_9_15 frac30to28.frac_en.wf_r_frac.dt:%b%d%d_%b:DADDR_7_13 pm_f_frac_filtered_29to27.wf_f_frac_26:%b%d:DADDR_8_14.pm_r_frac_filt_15to13.ht_frac.lt_frac:%b%b%b:", divide, frac, phase, clkout0_divide_frac, 1, wf_rise_frac, dt, pm_fall_frac_filtered, wf_fall_frac, 3'b000, ht_frac, lt_frac);
`endif
end
endfunction
@@ -0,0 +1,861 @@
///////////////////////////////////////////////////////////////////////////////
//
// Company: Xilinx
// Engineer: Jim Tatsukawa. Updated by Ralf Krueger
// Date: 7/30/2014
// Design Name: MMCME4 DRP
// Module Name: mmcme4_drp_func.h
// Version: 1.31
// Target Devices: UltraScale Plus Architecture
// Tool versions: 2017.1
// Description: This header provides the functions necessary to
// calculate the DRP register values for UltraScal+ MMCM.
//
// Revision Notes: 3/22 - Updating lookup_low/lookup_high (CR)
// 4/13 - Fractional divide function in mmcm_frac_count_calc function
// 2/28/17 - Updated for Ultrascale Plus
//
// Disclaimer: XILINX IS PROVIDING THIS DESIGN, CODE, OR
// INFORMATION "AS IS" SOLELY FOR USE IN DEVELOPING
// PROGRAMS AND SOLUTIONS FOR XILINX DEVICES. BY
// PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,
// APPLICATION OR STANDARD, XILINX IS MAKING NO
// REPRESENTATION THAT THIS IMPLEMENTATION IS FREE
// FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE
// RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY
// REQUIRE FOR YOUR IMPLEMENTATION. XILINX
// EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH
// RESPECT TO THE ADEQUACY OF THE IMPLEMENTATION,
// INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR
// REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE.
//
// (c) Copyright 2009-2017 Xilinx, Inc.
// All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
// These are user functions that should not be modified. Changes to the defines
// or code within the functions may alter the accuracy of the calculations.
// Define debug to provide extra messages during elaboration
//`define DEBUG 1
// FRAC_PRECISION describes the width of the fractional portion of the fixed
// point numbers. These should not be modified, they are for development only
`define FRAC_PRECISION 10
// FIXED_WIDTH describes the total size for fixed point calculations(int+frac).
// Warning: L.50 and below will not calculate properly with FIXED_WIDTHs
// greater than 32
`define FIXED_WIDTH 32
// This function takes a fixed point number and rounds it to the nearest
// fractional precision bit.
function [`FIXED_WIDTH:1] round_frac
(
// Input is (FIXED_WIDTH-FRAC_PRECISION).FRAC_PRECISION fixed point number
input [`FIXED_WIDTH:1] decimal,
// This describes the precision of the fraction, for example a value
// of 1 would modify the fractional so that instead of being a .16
// fractional, it would be a .1 (rounded to the nearest 0.5 in turn)
input [`FIXED_WIDTH:1] precision
);
begin
`ifdef DEBUG
$display("round_frac - decimal: %h, precision: %h", decimal, precision);
`endif
// If the fractional precision bit is high then round up
if( decimal[(`FRAC_PRECISION-precision)] == 1'b1) begin
round_frac = decimal + (1'b1 << (`FRAC_PRECISION-precision));
end else begin
round_frac = decimal;
end
`ifdef DEBUG
$display("round_frac: %h", round_frac);
`endif
end
endfunction
// This function calculates high_time, low_time, w_edge, and no_count
// of a non-fractional counter based on the divide and duty cycle
//
// NOTE: high_time and low_time are returned as integers between 0 and 63
// inclusive. 64 should equal 6'b000000 (in other words it is okay to
// ignore the overflow)
function [13:0] mmcm_pll_divider
(
input [7:0] divide, // Max divide is 128
input [31:0] duty_cycle // Duty cycle is multiplied by 100,000
);
reg [`FIXED_WIDTH:1] duty_cycle_fix;
// High/Low time is initially calculated with a wider integer to prevent a
// calculation error when it overflows to 64.
reg [6:0] high_time;
reg [6:0] low_time;
reg w_edge;
reg no_count;
reg [`FIXED_WIDTH:1] temp;
begin
// Duty Cycle must be between 0 and 1,000
if(duty_cycle <=0 || duty_cycle >= 100000) begin
`ifndef SYNTHESIS
$display("ERROR: duty_cycle: %d is invalid", duty_cycle);
`endif
$finish;
end
// Convert to FIXED_WIDTH-FRAC_PRECISION.FRAC_PRECISION fixed point
duty_cycle_fix = (duty_cycle << `FRAC_PRECISION) / 100_000;
`ifdef DEBUG
$display("duty_cycle_fix: %h", duty_cycle_fix);
`endif
// If the divide is 1 nothing needs to be set except the no_count bit.
// Other values are dummies
if(divide == 7'h01) begin
high_time = 7'h01;
w_edge = 1'b0;
low_time = 7'h01;
no_count = 1'b1;
end else begin
temp = round_frac(duty_cycle_fix*divide, 1);
// comes from above round_frac
high_time = temp[`FRAC_PRECISION+7:`FRAC_PRECISION+1];
// If the duty cycle * divide rounded is .5 or greater then this bit
// is set.
w_edge = temp[`FRAC_PRECISION]; // comes from round_frac
// If the high time comes out to 0, it needs to be set to at least 1
// and w_edge set to 0
if(high_time == 7'h00) begin
high_time = 7'h01;
w_edge = 1'b0;
end
if(high_time == divide) begin
high_time = divide - 1;
w_edge = 1'b1;
end
// Calculate low_time based on the divide setting and set no_count to
// 0 as it is only used when divide is 1.
low_time = divide - high_time;
no_count = 1'b0;
end
// Set the return value.
mmcm_pll_divider = {w_edge,no_count,high_time[5:0],low_time[5:0]};
end
endfunction
// This function calculates mx, delay_time, and phase_mux
// of a non-fractional counter based on the divide and phase
//
// NOTE: The only valid value for the MX bits is 2'b00 to ensure the coarse mux
// is used.
function [10:0] mmcm_pll_phase
(
// divide must be an integer (use fractional if not)
// assumed that divide already checked to be valid
input [7:0] divide, // Max divide is 128
// Phase is given in degrees (-360,000 to 360,000)
input signed [31:0] phase
);
reg [`FIXED_WIDTH:1] phase_in_cycles;
reg [`FIXED_WIDTH:1] phase_fixed;
reg [1:0] mx;
reg [5:0] delay_time;
reg [2:0] phase_mux;
reg [`FIXED_WIDTH:1] temp;
begin
`ifdef DEBUG
$display("mmcm_phase-divide:%d,phase:%d", divide, phase);
`endif
if ((phase < -360000) || (phase > 360000)) begin
`ifndef SYNTHESIS
$display("ERROR: phase of $phase is not between -360000 and 360000");
`endif
$finish;
end
// If phase is less than 0, convert it to a positive phase shift
// Convert to (FIXED_WIDTH-FRAC_PRECISION).FRAC_PRECISION fixed point
if(phase < 0) begin
phase_fixed = ( (phase + 360000) << `FRAC_PRECISION ) / 1000;
end else begin
phase_fixed = ( phase << `FRAC_PRECISION ) / 1000;
end
// Put phase in terms of decimal number of vco clock cycles
phase_in_cycles = ( phase_fixed * divide ) / 360;
`ifdef DEBUG
$display("phase_in_cycles: %h", phase_in_cycles);
`endif
temp = round_frac(phase_in_cycles, 3);
// set mx to 2'b00 that the phase mux from the VCO is enabled
mx = 2'b00;
phase_mux = temp[`FRAC_PRECISION:`FRAC_PRECISION-2];
delay_time = temp[`FRAC_PRECISION+6:`FRAC_PRECISION+1];
`ifdef DEBUG
$display("temp: %h", temp);
`endif
// Setup the return value
mmcm_pll_phase={mx, phase_mux, delay_time};
end
endfunction
// This function takes the divide value and outputs the necessary lock values
function [39:0] mmcm_pll_lock_lookup
(
input [7:0] divide // Max M divide is 128 in UltrascalePlus
);
reg [5119:0] lookup;
begin
lookup = {
// This table is composed of:
// LockRefDly_LockFBDly_LockCnt_LockSatHigh_UnlockCnt
40'b00110_00110_1111101000_1111101001_0000000001, // M=1 (not allowed)
40'b00110_00110_1111101000_1111101001_0000000001, // M=2
40'b01000_01000_1111101000_1111101001_0000000001, // M=3
40'b01011_01011_1111101000_1111101001_0000000001, // M=4
40'b01110_01110_1111101000_1111101001_0000000001, // M=5
40'b10001_10001_1111101000_1111101001_0000000001, // M=6
40'b10011_10011_1111101000_1111101001_0000000001, // M=7
40'b10110_10110_1111101000_1111101001_0000000001,
40'b11001_11001_1111101000_1111101001_0000000001,
40'b11100_11100_1111101000_1111101001_0000000001,
40'b11111_11111_1110000100_1111101001_0000000001,
40'b11111_11111_1100111001_1111101001_0000000001,
40'b11111_11111_1011101110_1111101001_0000000001,
40'b11111_11111_1010111100_1111101001_0000000001,
40'b11111_11111_1010001010_1111101001_0000000001,
40'b11111_11111_1001110001_1111101001_0000000001,
40'b11111_11111_1000111111_1111101001_0000000001,
40'b11111_11111_1000100110_1111101001_0000000001,
40'b11111_11111_1000001101_1111101001_0000000001,
40'b11111_11111_0111110100_1111101001_0000000001,
40'b11111_11111_0111011011_1111101001_0000000001,
40'b11111_11111_0111000010_1111101001_0000000001,
40'b11111_11111_0110101001_1111101001_0000000001,
40'b11111_11111_0110010000_1111101001_0000000001,
40'b11111_11111_0110010000_1111101001_0000000001,
40'b11111_11111_0101110111_1111101001_0000000001,
40'b11111_11111_0101011110_1111101001_0000000001,
40'b11111_11111_0101011110_1111101001_0000000001,
40'b11111_11111_0101000101_1111101001_0000000001,
40'b11111_11111_0101000101_1111101001_0000000001,
40'b11111_11111_0100101100_1111101001_0000000001,
40'b11111_11111_0100101100_1111101001_0000000001,
40'b11111_11111_0100101100_1111101001_0000000001,
40'b11111_11111_0100010011_1111101001_0000000001,
40'b11111_11111_0100010011_1111101001_0000000001,
40'b11111_11111_0100010011_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001,
40'b11111_11111_0011111010_1111101001_0000000001, // M=127
40'b11111_11111_0011111010_1111101001_0000000001 // M=128
};
// Set lookup_entry with the explicit bits from lookup with a part select
mmcm_pll_lock_lookup = lookup[ ((128-divide)*40) +: 40];
`ifdef DEBUG
$display("lock_lookup: %b", mmcm_pll_lock_lookup);
`endif
end
endfunction
// This function takes the divide value and the bandwidth setting of the MMCM
// and outputs the digital filter settings necessary.
function [9:0] mmcm_pll_filter_lookup
(
input [7:0] divide, // input [7:0] divide // Max M divide is 128 in UltraScalePlus
input [8*9:0] BANDWIDTH
);
reg [1279:0] lookup_low;
reg [1279:0] lookup_high;
reg [9:0] lookup_entry;
begin
lookup_low = {
// CP_RES_LFHF
10'b0011_1111_11, // M=1 - not legal
10'b0011_1111_11, // M=2
10'b0011_1101_11, // M=3
10'b0011_0101_11, // M=4
10'b0011_1001_11, // M=5
10'b0011_1110_11, // M=6
10'b0011_1110_11, // M=7
10'b0011_0001_11,
10'b0011_0110_11,
10'b0011_0110_11,
10'b0011_0110_11,
10'b0011_1010_11,
10'b0011_1010_11,
10'b0011_1010_11,
10'b0100_0110_11,
10'b0011_1100_11,
10'b1110_0110_11,
10'b1111_0110_11,
10'b1110_1010_11,
10'b1110_1010_11,
10'b1111_1010_11,
10'b1111_1010_11,
10'b1111_1010_11,
10'b1111_1010_11,
10'b1111_1010_11,
10'b1101_1100_11,
10'b1101_1100_11,
10'b1101_1100_11,
10'b1110_1100_11,
10'b1110_1100_11,
10'b1110_1100_11,
10'b1111_1100_11,
10'b1111_1100_11,
10'b1111_1100_11,
10'b1111_1100_11,
10'b1111_1100_11,
10'b1111_1100_11,
10'b1110_0010_11,
10'b1110_0010_11,
10'b1110_0010_11,
10'b1110_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1100_0100_11,
10'b1100_0100_11,
10'b1100_0100_11,
10'b1100_0100_11,
10'b1100_0100_11,
10'b1100_0100_11,
10'b1100_0100_11,
10'b1100_0100_11,
10'b1101_0100_11,
10'b1101_0100_11,
10'b1101_0100_11,
10'b1101_0100_11,
10'b1101_0100_11,
10'b1101_0100_11,
10'b1101_0100_11,
10'b1110_0100_11,
10'b1110_0100_11,
10'b1110_0100_11,
10'b1110_0100_11,
10'b1110_0100_11,
10'b1110_0100_11,
10'b1110_0100_11,
10'b1110_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1101_1000_11,
10'b1101_1000_11,
10'b1101_1000_11,
10'b1101_1000_11,
10'b1101_1000_11,
10'b1101_1000_11,
10'b1101_1000_11,
10'b1101_1000_11, // M=127
10'b1101_1000_11 // M=128
};
lookup_high = {
// CP_RES_LFHF
10'b0111_1111_11, // M=1 - not legal
10'b0111_1111_11, // M=2
10'b1110_1111_11, // M=3
10'b1111_1111_11, // M=4
10'b1111_1011_11, // M=5
10'b1111_1101_11, // M=6
10'b1111_0011_11, // M=7
10'b1110_0101_11,
10'b1111_1001_11,
10'b1111_1001_11,
10'b1110_1110_11,
10'b1111_1110_11,
10'b1111_0001_11,
10'b1111_0001_11,
10'b1111_0001_11,
10'b1110_0110_11,
10'b1110_0110_11,
10'b1111_0110_11,
10'b1110_1010_11,
10'b1110_1010_11,
10'b1111_1010_11,
10'b1111_1010_11,
10'b1111_1010_11,
10'b1111_1010_11,
10'b1111_1010_11,
10'b1101_1100_11,
10'b1101_1100_11,
10'b1101_1100_11,
10'b1110_1100_11,
10'b1110_1100_11,
10'b1110_1100_11,
10'b1111_1100_11,
10'b1111_1100_11,
10'b1111_1100_11,
10'b1111_1100_11,
10'b1111_1100_11,
10'b1111_1100_11,
10'b1110_0010_11,
10'b1110_0010_11,
10'b1110_0010_11,
10'b1110_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1111_0010_11,
10'b1100_0100_11,
10'b1100_0100_11,
10'b1100_0100_11,
10'b1100_0100_11,
10'b1100_0100_11,
10'b1100_0100_11,
10'b1100_0100_11,
10'b1100_0100_11,
10'b1101_0100_11,
10'b1101_0100_11,
10'b1101_0100_11,
10'b1101_0100_11,
10'b1101_0100_11,
10'b1101_0100_11,
10'b1101_0100_11,
10'b1110_0100_11,
10'b1110_0100_11,
10'b1110_0100_11,
10'b1110_0100_11,
10'b1110_0100_11,
10'b1110_0100_11,
10'b1110_0100_11,
10'b1110_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1111_0100_11,
10'b1101_1000_11,
10'b1101_1000_11,
10'b1101_1000_11,
10'b1101_1000_11,
10'b1101_1000_11,
10'b1101_1000_11,
10'b1101_1000_11,
10'b1101_1000_11,
10'b1101_1000_11 // M=128
};
// Set lookup_entry with the explicit bits from lookup with a part select
if(BANDWIDTH == "LOW") begin
// Low Bandwidth
mmcm_pll_filter_lookup = lookup_low[ ((128-divide)*10) +: 10];
end else begin
// High or optimized bandwidth
mmcm_pll_filter_lookup = lookup_high[ ((128-divide)*10) +: 10];
end
`ifdef DEBUG
$display("filter_lookup: %b", mmcm_pll_filter_lookup);
`endif
end
endfunction
// This function takes in the divide, phase, and duty cycle
// setting to calculate the upper and lower counter registers.
function [37:0] mmcm_pll_count_calc
(
input [7:0] divide, // Max divide is 128
input signed [31:0] phase,
input [31:0] duty_cycle // Multiplied by 100,000
);
reg [13:0] div_calc;
reg [16:0] phase_calc;
begin
`ifdef DEBUG
$display("mmcm_pll_count_calc- divide:%h, phase:%d, duty_cycle:%d",
divide, phase, duty_cycle);
`endif
// w_edge[13], no_count[12], high_time[11:6], low_time[5:0]
div_calc = mmcm_pll_divider(divide, duty_cycle);
// mx[10:9], pm[8:6], dt[5:0]
phase_calc = mmcm_pll_phase(divide, phase);
// Return value is the upper and lower address of counter
// Upper address is:
// RESERVED [31:26]
// MX [25:24]
// EDGE [23]
// NOCOUNT [22]
// DELAY_TIME [21:16]
// Lower Address is:
// PHASE_MUX [15:13]
// RESERVED [12]
// HIGH_TIME [11:6]
// LOW_TIME [5:0]
`ifdef DEBUG
$display("div:%d dc:%d phase:%d ht:%d lt:%d ed:%d nc:%d mx:%d dt:%d pm:%d",
divide, duty_cycle, phase, div_calc[11:6], div_calc[5:0],
div_calc[13], div_calc[12],
phase_calc[16:15], phase_calc[5:0], phase_calc[14:12]);
`endif
mmcm_pll_count_calc =
{
// Upper Address
6'h00, phase_calc[10:9], div_calc[13:12], phase_calc[5:0],
// Lower Address
phase_calc[8:6], 1'b0, div_calc[11:0]
};
end
endfunction
// This function takes in the divide, phase, and duty cycle
// setting to calculate the upper and lower counter registers.
// for fractional multiply/divide functions.
//
//
function [37:0] mmcm_frac_count_calc
(
input [7:0] divide, // Max divide is 128
input signed [31:0] phase,
input [31:0] duty_cycle, // Multiplied by 100,000. Not programmable in fractional
input [9:0] frac // Multiplied by 1000
);
//Required for fractional divide calculations
reg [7:0] lt_frac;
reg [7:0] ht_frac;
reg /*[7:0]*/ wf_fall_frac;
reg /*[7:0]*/ wf_rise_frac;
reg [31:0] a;
reg [7:0] pm_rise_frac_filtered ;
reg [7:0] pm_fall_frac_filtered ;
reg [7:0] clkout0_divide_int;
reg [2:0] clkout0_divide_frac;
reg [7:0] even_part_high;
reg [7:0] even_part_low;
reg [7:0] odd;
reg [7:0] odd_and_frac;
reg [7:0] pm_fall;
reg [7:0] pm_rise;
reg [7:0] dt;
reg [7:0] dt_int;
reg [63:0] dt_calc;
reg [7:0] pm_rise_frac;
reg [7:0] pm_fall_frac;
reg [31:0] a_per_in_octets;
reg [31:0] a_phase_in_cycles;
parameter precision = 0.125;
reg [31:0] phase_fixed; // changed to 31:0 from 32:1 jt 5/2/11
reg [31: 0] phase_pos;
reg [31: 0] phase_vco;
reg [31:0] temp;// changed to 31:0 from 32:1 jt 5/2/11
reg [13:0] div_calc;
reg [16:0] phase_calc;
begin
`ifdef DEBUG
$display("mmcm_frac_count_calc- divide:%h, phase:%d, duty_cycle:%d",
divide, phase, duty_cycle);
`endif
//convert phase to fixed
if ((phase < -360000) || (phase > 360000)) begin
`ifndef SYNTHESIS
$display("ERROR: phase of $phase is not between -360000 and 360000");
`endif
$finish;
end
// Return value is
// Transfer data
// RESERVED [37:36]
// FRAC_TIME [35:33]
// FRAC_WF_FALL [32]
// Upper address is:
// RESERVED [31:26]
// MX [25:24]
// EDGE [23]
// NOCOUNT [22]
// DELAY_TIME [21:16]
// Lower Address is:
// PHASE_MUX [15:13]
// RESERVED [12]
// HIGH_TIME [11:6]
// LOW_TIME [5:0]
clkout0_divide_frac = frac / 125;
clkout0_divide_int = divide;
even_part_high = clkout0_divide_int >> 1;//$rtoi(clkout0_divide_int / 2);
even_part_low = even_part_high;
odd = clkout0_divide_int - even_part_high - even_part_low;
odd_and_frac = (8*odd) + clkout0_divide_frac;
lt_frac = even_part_high - (odd_and_frac <= 9);//IF(odd_and_frac>9,even_part_high, even_part_high - 1)
ht_frac = even_part_low - (odd_and_frac <= 8);//IF(odd_and_frac>8,even_part_low, even_part_low- 1)
pm_fall = {odd[6:0],2'b00} + {6'h00, clkout0_divide_frac[2:1]}; // using >> instead of clkout0_divide_frac / 2
pm_rise = 0; //0
wf_fall_frac = ((odd_and_frac >=2) && (odd_and_frac <=9)) || (clkout0_divide_int == 2 && clkout0_divide_frac == 1); //IF(odd_and_frac>=2,IF(odd_and_frac <= 9,1,0),0)
wf_rise_frac = (odd_and_frac >=1) && (odd_and_frac <=8); //IF(odd_and_frac>=1,IF(odd_and_frac <= 8,1,0),0)
//Calculate phase in fractional cycles
a_per_in_octets = (8 * divide) + (frac / 125) ;
a_phase_in_cycles = (phase+10) * a_per_in_octets / 360000 ;//Adding 1 due to rounding errors
pm_rise_frac = (a_phase_in_cycles[7:0] ==8'h00)?8'h00:a_phase_in_cycles[7:0] - {a_phase_in_cycles[7:3],3'b000};
dt_calc = ((phase+10) * a_per_in_octets / 8 )/360000 ;//TRUNC(phase* divide / 360); //or_simply (a_per_in_octets / 8)
dt = dt_calc[7:0];
pm_rise_frac_filtered = (pm_rise_frac >=8) ? (pm_rise_frac ) - 8: pm_rise_frac ; //((phase_fixed * (divide + frac / 1000)) / 360) - {pm_rise_frac[7:3],3'b000};//$rtoi(clkout0_phase * clkout0_divide / 45);//a;
dt_int = dt + (& pm_rise_frac[7:4]); //IF(pm_rise_overwriting>7,dt+1,dt)
pm_fall_frac = pm_fall + pm_rise_frac;
pm_fall_frac_filtered = pm_fall + pm_rise_frac - {pm_fall_frac[7:3], 3'b000};
div_calc = mmcm_pll_divider(divide, duty_cycle); //Use to determine edge[7], no count[6]
phase_calc = mmcm_pll_phase(divide, phase);// returns{mx[1:0], phase_mux[2:0], delay_time[5:0]}
mmcm_frac_count_calc[37:0] =
{ 2'b00, pm_fall_frac_filtered[2:0], wf_fall_frac,
1'b0, clkout0_divide_frac[2:0], 1'b1, wf_rise_frac, phase_calc[10:9], 2'b00, dt[5:0],
pm_rise_frac_filtered[2], pm_rise_frac_filtered[1], pm_rise_frac_filtered[0], 1'b0, ht_frac[5:0], lt_frac[5:0]
} ;
`ifdef DEBUG
$display("-%d.%d p%d>> :DADDR_9_15 frac30to28.frac_en.wf_r_frac.dt:%b%d%d_%b:DADDR_7_13 pm_f_frac_filtered_29to27.wf_f_frac_26:%b%d:DADDR_8_14.pm_r_frac_filt_15to13.ht_frac.lt_frac:%b%b%b:", divide, frac, phase, clkout0_divide_frac, 1, wf_rise_frac, dt, pm_fall_frac_filtered, wf_fall_frac, pm_rise_frac_filtered, ht_frac, lt_frac);
`endif
end
endfunction
@@ -0,0 +1,536 @@
///////////////////////////////////////////////////////////////////////////////
//
// Company: Xilinx
// Engineer: Jim Tatsukawa, Ralf Krueger, updated for Ultrascale+
// Date: 6/15/2015
// Design Name: PLLE4 DRP
// Module Name: plle4_drp_func.h
// Version: 2.0
// Target Devices: UltraScale+ Architecture
// Tool versions: 2017.1
// Description: This header provides the functions necessary to
// calculate the DRP register values for the V6 PLL.
//
// Revision Notes: 8/11 - PLLE3 updated for PLLE3 file 4564419
// Revision Notes: 6/15 - pll_filter_lookup fixed for max M of 19
// M_Rise bits have been removed for PLLE3
// Revision Notes: 2/28/17 - pll_filter_lookup and CPRES updated for
// Ultrascale+ and for max M of 21
//
// Disclaimer: XILINX IS PROVIDING THIS DESIGN, CODE, OR
// INFORMATION "AS IS" SOLELY FOR USE IN DEVELOPING
// PROGRAMS AND SOLUTIONS FOR XILINX DEVICES. BY
// PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,
// APPLICATION OR STANDARD, XILINX IS MAKING NO
// REPRESENTATION THAT THIS IMPLEMENTATION IS FREE
// FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE
// RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY
// REQUIRE FOR YOUR IMPLEMENTATION. XILINX
// EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH
// RESPECT TO THE ADEQUACY OF THE IMPLEMENTATION,
// INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR
// REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE.
//
// (c) Copyright 2009-2017 Xilinx, Inc.
// All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
// These are user functions that should not be modified. Changes to the defines
// or code within the functions may alter the accuracy of the calculations.
// Define debug to provide extra messages durring elaboration
//`define DEBUG 1
// FRAC_PRECISION describes the width of the fractional portion of the fixed
// point numbers. These should not be modified, they are for development
// only
`define FRAC_PRECISION 10
// FIXED_WIDTH describes the total size for fixed point calculations(int+frac).
// Warning: L.50 and below will not calculate properly with FIXED_WIDTHs
// greater than 32
`define FIXED_WIDTH 32
// This function takes a fixed point number and rounds it to the nearest
// fractional precision bit.
function [`FIXED_WIDTH:1] round_frac
(
// Input is (FIXED_WIDTH-FRAC_PRECISION).FRAC_PRECISION fixed point number
input [`FIXED_WIDTH:1] decimal,
// This describes the precision of the fraction, for example a value
// of 1 would modify the fractional so that instead of being a .16
// fractional, it would be a .1 (rounded to the nearest 0.5 in turn)
input [`FIXED_WIDTH:1] precision
);
begin
`ifdef DEBUG
$display("round_frac - decimal: %h, precision: %h", decimal, precision);
`endif
// If the fractional precision bit is high then round up
if( decimal[(`FRAC_PRECISION-precision)] == 1'b1) begin
round_frac = decimal + (1'b1 << (`FRAC_PRECISION-precision));
end else begin
round_frac = decimal;
end
`ifdef DEBUG
$display("round_frac: %h", round_frac);
`endif
end
endfunction
// This function calculates high_time, low_time, w_edge, and no_count
// of a non-fractional counter based on the divide and duty cycle
//
// NOTE: high_time and low_time are returned as integers between 0 and 63
// inclusive. 64 should equal 6'b000000 (in other words it is okay to
// ignore the overflow)
function [13:0] mmcm_pll_divider
(
input [7:0] divide, // Max divide is 128
input [31:0] duty_cycle // Duty cycle is multiplied by 100,000
);
reg [`FIXED_WIDTH:1] duty_cycle_fix;
// High/Low time is initially calculated with a wider integer to prevent a
// calculation error when it overflows to 64.
reg [6:0] high_time;
reg [6:0] low_time;
reg w_edge;
reg no_count;
reg [`FIXED_WIDTH:1] temp;
begin
// Duty Cycle must be between 0 and 1,000
if(duty_cycle <=0 || duty_cycle >= 100000) begin
`ifndef SYNTHESIS
$display("ERROR: duty_cycle: %d is invalid", duty_cycle);
`endif
$finish;
end
// Convert to FIXED_WIDTH-FRAC_PRECISION.FRAC_PRECISION fixed point
duty_cycle_fix = (duty_cycle << `FRAC_PRECISION) / 100_000;
`ifdef DEBUG
$display("duty_cycle_fix: %h", duty_cycle_fix);
`endif
// If the divide is 1 nothing needs to be set except the no_count bit.
// Other values are dummies
if(divide == 7'h01) begin
high_time = 7'h01;
w_edge = 1'b0;
low_time = 7'h01;
no_count = 1'b1;
end else begin
temp = round_frac(duty_cycle_fix*divide, 1);
// comes from above round_frac
high_time = temp[`FRAC_PRECISION+7:`FRAC_PRECISION+1];
// If the duty cycle * divide rounded is .5 or greater then this bit
// is set.
w_edge = temp[`FRAC_PRECISION]; // comes from round_frac
// If the high time comes out to 0, it needs to be set to at least 1
// and w_edge set to 0
if(high_time == 7'h00) begin
high_time = 7'h01;
w_edge = 1'b0;
end
if(high_time == divide) begin
high_time = divide - 1;
w_edge = 1'b1;
end
// Calculate low_time based on the divide setting and set no_count to
// 0 as it is only used when divide is 1.
low_time = divide - high_time;
no_count = 1'b0;
end
// Set the return value.
mmcm_pll_divider = {w_edge,no_count,high_time[5:0],low_time[5:0]};
end
endfunction
// This function calculates mx, delay_time, and phase_mux
// of a non-fractional counter based on the divide and phase
//
// NOTE: The only valid value for the MX bits is 2'b00 to ensure the coarse mux
// is used.
function [10:0] mmcm_pll_phase
(
// divide must be an integer (use fractional if not)
// assumed that divide already checked to be valid
input [7:0] divide, // Max divide is 128
// Phase is given in degrees (-360,000 to 360,000)
input signed [31:0] phase
);
reg [`FIXED_WIDTH:1] phase_in_cycles;
reg [`FIXED_WIDTH:1] phase_fixed;
reg [1:0] mx;
reg [5:0] delay_time;
reg [2:0] phase_mux;
reg [`FIXED_WIDTH:1] temp;
begin
`ifdef DEBUG
$display("pll_phase-divide:%d,phase:%d",
divide, phase);
`endif
if ((phase < -360000) || (phase > 360000)) begin
`ifndef SYNTHESIS
$display("ERROR: phase of $phase is not between -360000 and 360000");
`endif
$finish;
end
// If phase is less than 0, convert it to a positive phase shift
// Convert to (FIXED_WIDTH-FRAC_PRECISION).FRAC_PRECISION fixed point
if(phase < 0) begin
phase_fixed = ( (phase + 360000) << `FRAC_PRECISION ) / 1000;
end else begin
phase_fixed = ( phase << `FRAC_PRECISION ) / 1000;
end
// Put phase in terms of decimal number of vco clock cycles
phase_in_cycles = ( phase_fixed * divide ) / 360;
`ifdef DEBUG
$display("phase_in_cycles: %h", phase_in_cycles);
`endif
temp = round_frac(phase_in_cycles, 3);
// set mx to 2'b00 that the phase mux from the VCO is enabled
mx = 2'b00;
phase_mux = temp[`FRAC_PRECISION:`FRAC_PRECISION-2];
delay_time = temp[`FRAC_PRECISION+6:`FRAC_PRECISION+1];
`ifdef DEBUG
$display("temp: %h", temp);
`endif
// Setup the return value
mmcm_pll_phase={mx, phase_mux, delay_time};
end
endfunction
// This function takes the divide value and outputs the necessary lock values
function [39:0] mmcm_pll_lock_lookup
(
input [6:0] divide // Max divide is 21
);
reg [839:0] lookup;
begin
lookup = {
// This table is composed of:
// LockRefDly_LockFBDly_LockCnt_LockSatHigh_UnlockCnt
40'b00110_00110_1111101000_1111101001_0000000001, //1 illegal in Ultrascale+
40'b00110_00110_1111101000_1111101001_0000000001, //2
40'b01000_01000_1111101000_1111101001_0000000001, //3
40'b01011_01011_1111101000_1111101001_0000000001, //4
40'b01110_01110_1111101000_1111101001_0000000001, //5
40'b10001_10001_1111101000_1111101001_0000000001, //6
40'b10011_10011_1111101000_1111101001_0000000001, //7
40'b10110_10110_1111101000_1111101001_0000000001, //8
40'b11001_11001_1111101000_1111101001_0000000001, //9
40'b11100_11100_1111101000_1111101001_0000000001, //10
40'b11111_11111_1110000100_1111101001_0000000001, //11
40'b11111_11111_1100111001_1111101001_0000000001, //12
40'b11111_11111_1011101110_1111101001_0000000001, //13
40'b11111_11111_1010111100_1111101001_0000000001, //14
40'b11111_11111_1010001010_1111101001_0000000001, //15
40'b11111_11111_1001110001_1111101001_0000000001, //16
40'b11111_11111_1000111111_1111101001_0000000001, //17
40'b11111_11111_1000100110_1111101001_0000000001, //18
40'b11111_11111_1000001101_1111101001_0000000001, //19
40'b11111_11111_0111110100_1111101001_0000000001, //20
40'b11111_11111_0111011011_1111101001_0000000001 //21
};
// Set lookup_entry with the explicit bits from lookup with a part select
mmcm_pll_lock_lookup = lookup[ ((21-divide)*40) +: 40];
`ifdef DEBUG
$display("lock_lookup: %b", pll_lock_lookup);
`endif
end
endfunction
// This function takes the divide value and the bandwidth setting of the PLL
// and outputs the digital filter settings necessary. Removing bandwidth setting for PLLE3.
function [9:0] mmcm_pll_filter_lookup
(
input [6:0] divide // Max divide is 21
);
reg [209:0] lookup;
reg [9:0] lookup_entry;
begin
lookup = {
// CP_RES_LFHF
10'b0011_0111_11, //1 not legal in Ultrascale+
10'b0011_0111_11, //2
10'b0011_0011_11, //3
10'b0011_1001_11, //4
10'b0011_0001_11, //5
10'b0100_1110_11, //6
10'b0011_0110_11, //7
10'b0011_1010_11, //8
10'b0111_1001_11, //9
10'b0111_1001_11, //10
10'b0101_0110_11, //11
10'b1100_0101_11, //12
10'b0101_1010_11, //13
10'b0110_0110_11, //14
10'b0110_1010_11, //15
10'b0111_0110_11, //16
10'b1111_0101_11, //17
10'b1100_0110_11, //18
10'b1110_0001_11, //19
10'b1101_0110_11, //20
10'b1111_0001_11 //21
};
mmcm_pll_filter_lookup = lookup [ ((21-divide)*10) +: 10];
`ifdef DEBUG
$display("filter_lookup: %b", pll_filter_lookup);
`endif
end
endfunction
// This function set the CLKOUTPHY divide settings to match
// the desired CLKOUTPHY_MODE setting. To create VCO_X2, then
// the CLKOUTPHY will be set to 2'b00 since the VCO is internally
// doubled and 2'b00 will represent divide by 1. Similarly "VCO"
// will need to divide the doubled clock VCO clock frequency by
// 2 therefore 2'b01 will match a divide by 2.And VCO_HALF will
// need to divide the doubled VCO by 4, therefore 2'b10
function [9:0] mmcm_pll_clkoutphy_calc
(
input [8*9:0] CLKOUTPHY_MODE
);
if(CLKOUTPHY_MODE == "VCO_X2") begin
mmcm_pll_clkoutphy_calc= 2'b00;
end else if(CLKOUTPHY_MODE == "VCO") begin
mmcm_pll_clkoutphy_calc= 2'b01;
end else if(CLKOUTPHY_MODE == "CLKIN") begin
mmcm_pll_clkoutphy_calc= 2'b11;
end else begin // Assume "VCO_HALF"
mmcm_pll_clkoutphy_calc= 2'b10;
end
endfunction
// This function takes in the divide, phase, and duty cycle
// setting to calculate the upper and lower counter registers.
function [37:0] mmcm_pll_count_calc
(
input [7:0] divide, // Max divide is 128
input signed [31:0] phase,
input [31:0] duty_cycle // Multiplied by 100,000
);
reg [13:0] div_calc;
reg [16:0] phase_calc;
begin
`ifdef DEBUG
$display("pll_count_calc- divide:%h, phase:%d, duty_cycle:%d",
divide, phase, duty_cycle);
`endif
// w_edge[13], no_count[12], high_time[11:6], low_time[5:0]
div_calc = mmcm_pll_divider(divide, duty_cycle);
// mx[10:9], pm[8:6], dt[5:0]
phase_calc = mmcm_pll_phase(divide, phase);
// Return value is the upper and lower address of counter
// Upper address is:
// RESERVED [31:26]
// MX [25:24]
// EDGE [23]
// NOCOUNT [22]
// DELAY_TIME [21:16]
// Lower Address is:
// PHASE_MUX [15:13]
// RESERVED [12]
// HIGH_TIME [11:6]
// LOW_TIME [5:0]
`ifdef DEBUG
$display("div:%d dc:%d phase:%d ht:%d lt:%d ed:%d nc:%d mx:%d dt:%d pm:%d",
divide, duty_cycle, phase, div_calc[11:6], div_calc[5:0],
div_calc[13], div_calc[12],
phase_calc[16:15], phase_calc[5:0], 3'b000); //Removed PM_Rise bits
`endif
mmcm_pll_count_calc =
{
// Upper Address
6'h00, phase_calc[10:9], div_calc[13:12], phase_calc[5:0],
// Lower Address
phase_calc[8:6], 1'b0, div_calc[11:0]
};
end
endfunction
// This function takes in the divide, phase, and duty cycle
// setting to calculate the upper and lower counter registers.
// for fractional multiply/divide functions.
//
//
function [37:0] mmcm_pll_frac_count_calc
(
input [7:0] divide, // Max divide is 128
input signed [31:0] phase,
input [31:0] duty_cycle, // Multiplied by 1,000
input [9:0] frac // Multiplied by 1000
);
//Required for fractional divide calculations
reg [7:0] lt_frac;
reg [7:0] ht_frac;
reg /*[7:0]*/ wf_fall_frac;
reg /*[7:0]*/ wf_rise_frac;
reg [31:0] a;
reg [7:0] pm_rise_frac_filtered ;
reg [7:0] pm_fall_frac_filtered ;
reg [7:0] clkout0_divide_int;
reg [2:0] clkout0_divide_frac;
reg [7:0] even_part_high;
reg [7:0] even_part_low;
reg [7:0] odd;
reg [7:0] odd_and_frac;
reg [7:0] pm_fall;
reg [7:0] pm_rise;
reg [7:0] dt;
reg [7:0] dt_int;
reg [63:0] dt_calc;
reg [7:0] pm_rise_frac;
reg [7:0] pm_fall_frac;
reg [31:0] a_per_in_octets;
reg [31:0] a_phase_in_cycles;
parameter precision = 0.125;
reg [31:0] phase_fixed; // changed to 31:0 from 32:1 jt 5/2/11
reg [31: 0] phase_pos;
reg [31: 0] phase_vco;
reg [31:0] temp;// changed to 31:0 from 32:1 jt 5/2/11
reg [13:0] div_calc;
reg [16:0] phase_calc;
begin
`ifdef DEBUG
$display("pll_frac_count_calc- divide:%h, phase:%d, duty_cycle:%d",
divide, phase, duty_cycle);
`endif
//convert phase to fixed
if ((phase < -360000) || (phase > 360000)) begin
`ifndef SYNTHESIS
$display("ERROR: phase of $phase is not between -360000 and 360000");
`endif
$finish;
end
// Return value is
// Transfer data
// RESERVED [37:36]
// FRAC_TIME [35:33]
// FRAC_WF_FALL [32]
// Upper address is:
// RESERVED [31:26]
// MX [25:24]
// EDGE [23]
// NOCOUNT [22]
// DELAY_TIME [21:16]
// Lower Address is:
// PHASE_MUX [15:13]
// RESERVED [12]
// HIGH_TIME [11:6]
// LOW_TIME [5:0]
clkout0_divide_frac = frac / 125;
clkout0_divide_int = divide;
even_part_high = clkout0_divide_int >> 1;//$rtoi(clkout0_divide_int / 2);
even_part_low = even_part_high;
odd = clkout0_divide_int - even_part_high - even_part_low;
odd_and_frac = (8*odd) + clkout0_divide_frac;
lt_frac = even_part_high - (odd_and_frac <= 9);//IF(odd_and_frac>9,even_part_high, even_part_high - 1)
ht_frac = even_part_low - (odd_and_frac <= 8);//IF(odd_and_frac>8,even_part_low, even_part_low- 1)
pm_fall = {odd[6:0],2'b00} + {6'h00, clkout0_divide_frac[2:1]}; // using >> instead of clkout0_divide_frac / 2
pm_rise = 0; //0
wf_fall_frac = (odd_and_frac >=2) && (odd_and_frac <=9);//IF(odd_and_frac>=2,IF(odd_and_frac <= 9,1,0),0)
wf_rise_frac = (odd_and_frac >=1) && (odd_and_frac <=8);//IF(odd_and_frac>=1,IF(odd_and_frac <= 8,1,0),0)
//Calculate phase in fractional cycles
a_per_in_octets = (8 * divide) + (frac / 125) ;
a_phase_in_cycles = (phase+10) * a_per_in_octets / 360000 ;//Adding 1 due to rounding errors
pm_rise_frac = (a_phase_in_cycles[7:0] ==8'h00)?8'h00:a_phase_in_cycles[7:0] - {a_phase_in_cycles[7:3],3'b000};
dt_calc = ((phase+10) * a_per_in_octets / 8 )/360000 ;//TRUNC(phase* divide / 360); //or_simply (a_per_in_octets / 8)
dt = dt_calc[7:0];
pm_rise_frac_filtered = (pm_rise_frac >=8) ? (pm_rise_frac ) - 8: pm_rise_frac ; //((phase_fixed * (divide + frac / 1000)) / 360) - {pm_rise_frac[7:3],3'b000};//$rtoi(clkout0_phase * clkout0_divide / 45);//a;
dt_int = dt + (& pm_rise_frac[7:4]); //IF(pm_rise_overwriting>7,dt+1,dt)
pm_fall_frac = pm_fall + pm_rise_frac;
pm_fall_frac_filtered = pm_fall + pm_rise_frac - {pm_fall_frac[7:3], 3'b000};
div_calc = mmcm_pll_divider(divide, duty_cycle); //Use to determine edge[7], no count[6]
phase_calc = mmcm_pll_phase(divide, phase);// returns{mx[1:0], phase_mux[2:0], delay_time[5:0]}
mmcm_pll_frac_count_calc[37:0] =
{ 2'b00, pm_fall_frac_filtered[2:0], wf_fall_frac,
1'b0, clkout0_divide_frac[2:0], 1'b1, wf_rise_frac, phase_calc[10:9], div_calc[13:12], dt[5:0],
3'b000, 1'b0, ht_frac[5:0], lt_frac[5:0] //Removed PM_Rise bits
} ;
`ifdef DEBUG
$display("-%d.%d p%d>> :DADDR_9_15 frac30to28.frac_en.wf_r_frac.dt:%b%d%d_%b:DADDR_7_13 pm_f_frac_filtered_29to27.wf_f_frac_26:%b%d:DADDR_8_14.pm_r_frac_filt_15to13.ht_frac.lt_frac:%b%b%b:", divide, frac, phase, clkout0_divide_frac, 1, wf_rise_frac, dt, pm_fall_frac_filtered, wf_fall_frac, 3'b000, ht_frac, lt_frac);
`endif
end
endfunction
@@ -0,0 +1,256 @@
10000000000000000000000000000001
10000001000000010000000100000010
10000010000000100000001000000011
10000011000000110000001100000100
10000100000001000000010000000101
10000101000001010000010100000110
10000110000001100000011000000111
10000111000001110000011100001000
10001000000010000000100000001001
10001001000010010000100100001010
10001010000010100000101000001011
10001011000010110000101100001100
10001100000011000000110000001101
10001101000011010000110100001110
10001110000011100000111000001111
10001111000011110000111100010000
10010000000100000001000000010001
10010001000100010001000100010010
10010010000100100001001000010011
10010011000100110001001100010100
10010100000101000001010000010101
10010101000101010001010100010110
10010110000101100001011000010111
10010111000101110001011100011000
10011000000110000001100000011001
10011001000110010001100100011010
10011010000110100001101000011011
10011011000110110001101100011100
10011100000111000001110000011101
10011101000111010001110100011110
10011110000111100001111000011111
10011111000111110001111100100000
10100000001000000010000000100001
10100001001000010010000100100010
10100010001000100010001000100011
10100011001000110010001100100100
10100100001001000010010000100101
10100101001001010010010100100110
10100110001001100010011000100111
10100111001001110010011100101000
10101000001010000010100000101001
10101001001010010010100100101010
10101010001010100010101000101011
10101011001010110010101100101100
10101100001011000010110000101101
10101101001011010010110100101110
10101110001011100010111000101111
10101111001011110010111100110000
10110000001100000011000000110001
10110001001100010011000100110010
10110010001100100011001000110011
10110011001100110011001100110100
10110100001101000011010000110101
10110101001101010011010100110110
10110110001101100011011000110111
10110111001101110011011100111000
10111000001110000011100000111001
10111001001110010011100100111010
10111010001110100011101000111011
10111011001110110011101100111100
10111100001111000011110000111101
10111101001111010011110100111110
10111110001111100011111000111111
10111111001111110011111101000000
11000000010000000100000001000001
11000001010000010100000101000010
11000010010000100100001001000011
11000011010000110100001101000100
11000100010001000100010001000101
11000101010001010100010101000110
11000110010001100100011001000111
11000111010001110100011101001000
11001000010010000100100001001001
11001001010010010100100101001010
11001010010010100100101001001011
11001011010010110100101101001100
11001100010011000100110001001101
11001101010011010100110101001110
11001110010011100100111001001111
11001111010011110100111101010000
11010000010100000101000001010001
11010001010100010101000101010010
11010010010100100101001001010011
11010011010100110101001101010100
11010100010101000101010001010101
11010101010101010101010101010110
11010110010101100101011001010111
11010111010101110101011101011000
11011000010110000101100001011001
11011001010110010101100101011010
11011010010110100101101001011011
11011011010110110101101101011100
11011100010111000101110001011101
11011101010111010101110101011110
11011110010111100101111001011111
11011111010111110101111101100000
11100000011000000110000001100001
11100001011000010110000101100010
11100010011000100110001001100011
11100011011000110110001101100100
11100100011001000110010001100101
11100101011001010110010101100110
11100110011001100110011001100111
11100111011001110110011101101000
11101000011010000110100001101001
11101001011010010110100101101010
11101010011010100110101001101011
11101011011010110110101101101100
11101100011011000110110001101101
11101101011011010110110101101110
11101110011011100110111001101111
11101111011011110110111101110000
11110000011100000111000001110001
11110001011100010111000101110010
11110010011100100111001001110011
11110011011100110111001101110100
11110100011101000111010001110101
11110101011101010111010101110110
11110110011101100111011001110111
11110111011101110111011101111000
11111000011110000111100001111001
11111001011110010111100101111010
11111010011110100111101001111011
11111011011110110111101101111100
11111100011111000111110001111101
11111101011111010111110101111110
11111110011111100111111001111111
11111111011111110111111110000000
00000000100000001000000010000000
00000001100000011000000110000001
00000010100000101000001010000010
00000011100000111000001110000011
00000100100001001000010010000100
00000101100001011000010110000101
00000110100001101000011010000110
00000111100001111000011110000111
00001000100010001000100010001000
00001001100010011000100110001001
00001010100010101000101010001010
00001011100010111000101110001011
00001100100011001000110010001100
00001101100011011000110110001101
00001110100011101000111010001110
00001111100011111000111110001111
00010000100100001001000010010000
00010001100100011001000110010001
00010010100100101001001010010010
00010011100100111001001110010011
00010100100101001001010010010100
00010101100101011001010110010101
00010110100101101001011010010110
00010111100101111001011110010111
00011000100110001001100010011000
00011001100110011001100110011001
00011010100110101001101010011010
00011011100110111001101110011011
00011100100111001001110010011100
00011101100111011001110110011101
00011110100111101001111010011110
00011111100111111001111110011111
00100000101000001010000010100000
00100001101000011010000110100001
00100010101000101010001010100010
00100011101000111010001110100011
00100100101001001010010010100100
00100101101001011010010110100101
00100110101001101010011010100110
00100111101001111010011110100111
00101000101010001010100010101000
00101001101010011010100110101001
00101010101010101010101010101010
00101011101010111010101110101011
00101100101011001010110010101100
00101101101011011010110110101101
00101110101011101010111010101110
00101111101011111010111110101111
00110000101100001011000010110000
00110001101100011011000110110001
00110010101100101011001010110010
00110011101100111011001110110011
00110100101101001011010010110100
00110101101101011011010110110101
00110110101101101011011010110110
00110111101101111011011110110111
00111000101110001011100010111000
00111001101110011011100110111001
00111010101110101011101010111010
00111011101110111011101110111011
00111100101111001011110010111100
00111101101111011011110110111101
00111110101111101011111010111110
00111111101111111011111110111111
01000000110000001100000011000000
01000001110000011100000111000001
01000010110000101100001011000010
01000011110000111100001111000011
01000100110001001100010011000100
01000101110001011100010111000101
01000110110001101100011011000110
01000111110001111100011111000111
01001000110010001100100011001000
01001001110010011100100111001001
01001010110010101100101011001010
01001011110010111100101111001011
01001100110011001100110011001100
01001101110011011100110111001101
01001110110011101100111011001110
01001111110011111100111111001111
01010000110100001101000011010000
01010001110100011101000111010001
01010010110100101101001011010010
01010011110100111101001111010011
01010100110101001101010011010100
01010101110101011101010111010101
01010110110101101101011011010110
01010111110101111101011111010111
01011000110110001101100011011000
01011001110110011101100111011001
01011010110110101101101011011010
01011011110110111101101111011011
01011100110111001101110011011100
01011101110111011101110111011101
01011110110111101101111011011110
01011111110111111101111111011111
01100000111000001110000011100000
01100001111000011110000111100001
01100010111000101110001011100010
01100011111000111110001111100011
01100100111001001110010011100100
01100101111001011110010111100101
01100110111001101110011011100110
01100111111001111110011111100111
01101000111010001110100011101000
01101001111010011110100111101001
01101010111010101110101011101010
01101011111010111110101111101011
01101100111011001110110011101100
01101101111011011110110111101101
01101110111011101110111011101110
01101111111011111110111111101111
01110000111100001111000011110000
01110001111100011111000111110001
01110010111100101111001011110010
01110011111100111111001111110011
01110100111101001111010011110100
01110101111101011111010111110101
01110110111101101111011011110110
01110111111101111111011111110111
01111000111110001111100011111000
01111001111110011111100111111001
01111010111110101111101011111010
01111011111110111111101111111011
01111100111111001111110011111100
01111101111111011111110111111101
01111110111111101111111011111110
01111111111111111111111111111111
@@ -0,0 +1,771 @@
RADIX = 10;
COEFDATA =
-47,
-30,
-13,
4,
21,
38,
56,
73,
89,
106,
122,
138,
153,
168,
182,
196,
209,
221,
232,
243,
252,
261,
268,
275,
281,
285,
289,
291,
292,
292,
291,
288,
285,
280,
274,
267,
259,
249,
239,
228,
215,
202,
187,
172,
156,
139,
122,
104,
85,
66,
46,
26,
5,
-15,
-36,
-56,
-77,
-98,
-118,
-138,
-158,
-177,
-195,
-213,
-231,
-247,
-263,
-277,
-291,
-303,
-314,
-325,
-333,
-341,
-347,
-351,
-354,
-356,
-356,
-354,
-351,
-346,
-340,
-332,
-322,
-311,
-298,
-284,
-268,
-250,
-231,
-211,
-189,
-166,
-142,
-117,
-90,
-63,
-35,
-6,
24,
54,
85,
116,
147,
179,
210,
242,
273,
304,
334,
363,
392,
420,
447,
473,
497,
520,
542,
562,
580,
596,
611,
623,
633,
641,
647,
650,
650,
649,
644,
637,
627,
615,
600,
582,
562,
538,
513,
484,
453,
419,
383,
345,
304,
261,
216,
169,
119,
69,
16,
-38,
-93,
-150,
-207,
-265,
-324,
-383,
-443,
-502,
-562,
-621,
-679,
-736,
-793,
-848,
-902,
-954,
-1004,
-1052,
-1097,
-1140,
-1181,
-1218,
-1252,
-1283,
-1310,
-1333,
-1353,
-1369,
-1380,
-1387,
-1389,
-1387,
-1381,
-1369,
-1353,
-1332,
-1306,
-1274,
-1238,
-1197,
-1151,
-1100,
-1044,
-983,
-918,
-848,
-773,
-694,
-611,
-524,
-432,
-337,
-239,
-137,
-33,
74,
184,
296,
410,
525,
642,
759,
877,
995,
1113,
1230,
1346,
1461,
1575,
1686,
1794,
1900,
2002,
2101,
2195,
2285,
2371,
2451,
2525,
2593,
2655,
2711,
2759,
2800,
2833,
2859,
2876,
2885,
2886,
2877,
2860,
2833,
2798,
2752,
2698,
2633,
2559,
2476,
2382,
2280,
2168,
2046,
1915,
1775,
1627,
1469,
1304,
1130,
948,
759,
563,
360,
151,
-64,
-284,
-509,
-739,
-972,
-1208,
-1447,
-1687,
-1929,
-2172,
-2414,
-2656,
-2896,
-3133,
-3368,
-3600,
-3826,
-4048,
-4263,
-4472,
-4673,
-4866,
-5050,
-5224,
-5387,
-5539,
-5679,
-5807,
-5920,
-6020,
-6104,
-6173,
-6226,
-6262,
-6281,
-6282,
-6264,
-6228,
-6171,
-6096,
-5999,
-5882,
-5745,
-5585,
-5405,
-5203,
-4978,
-4732,
-4464,
-4174,
-3861,
-3527,
-3170,
-2792,
-2392,
-1971,
-1529,
-1066,
-582,
-79,
444,
985,
1545,
2123,
2717,
3328,
3955,
4597,
5253,
5921,
6603,
7295,
7998,
8711,
9432,
10160,
10895,
11635,
12379,
13126,
13875,
14624,
15374,
16121,
16866,
17607,
18342,
19071,
19793,
20505,
21208,
21900,
22579,
23245,
23896,
24532,
25151,
25752,
26334,
26896,
27438,
27957,
28455,
28928,
29377,
29801,
30200,
30571,
30915,
31232,
31520,
31779,
32009,
32209,
32379,
32518,
32627,
32704,
32751,
32767,
32751,
32704,
32627,
32518,
32379,
32209,
32009,
31779,
31520,
31232,
30915,
30571,
30200,
29801,
29377,
28928,
28455,
27957,
27438,
26896,
26334,
25752,
25151,
24532,
23896,
23245,
22579,
21900,
21208,
20505,
19793,
19071,
18342,
17607,
16866,
16121,
15374,
14624,
13875,
13126,
12379,
11635,
10895,
10160,
9432,
8711,
7998,
7295,
6603,
5921,
5253,
4597,
3955,
3328,
2717,
2123,
1545,
985,
444,
-79,
-582,
-1066,
-1529,
-1971,
-2392,
-2792,
-3170,
-3527,
-3861,
-4174,
-4464,
-4732,
-4978,
-5203,
-5405,
-5585,
-5745,
-5882,
-5999,
-6096,
-6171,
-6228,
-6264,
-6282,
-6281,
-6262,
-6226,
-6173,
-6104,
-6020,
-5920,
-5807,
-5679,
-5539,
-5387,
-5224,
-5050,
-4866,
-4673,
-4472,
-4263,
-4048,
-3826,
-3600,
-3368,
-3133,
-2896,
-2656,
-2414,
-2172,
-1929,
-1687,
-1447,
-1208,
-972,
-739,
-509,
-284,
-64,
151,
360,
563,
759,
948,
1130,
1304,
1469,
1627,
1775,
1915,
2046,
2168,
2280,
2382,
2476,
2559,
2633,
2698,
2752,
2798,
2833,
2860,
2877,
2886,
2885,
2876,
2859,
2833,
2800,
2759,
2711,
2655,
2593,
2525,
2451,
2371,
2285,
2195,
2101,
2002,
1900,
1794,
1686,
1575,
1461,
1346,
1230,
1113,
995,
877,
759,
642,
525,
410,
296,
184,
74,
-33,
-137,
-239,
-337,
-432,
-524,
-611,
-694,
-773,
-848,
-918,
-983,
-1044,
-1100,
-1151,
-1197,
-1238,
-1274,
-1306,
-1332,
-1353,
-1369,
-1381,
-1387,
-1389,
-1387,
-1380,
-1369,
-1353,
-1333,
-1310,
-1283,
-1252,
-1218,
-1181,
-1140,
-1097,
-1052,
-1004,
-954,
-902,
-848,
-793,
-736,
-679,
-621,
-562,
-502,
-443,
-383,
-324,
-265,
-207,
-150,
-93,
-38,
16,
69,
119,
169,
216,
261,
304,
345,
383,
419,
453,
484,
513,
538,
562,
582,
600,
615,
627,
637,
644,
649,
650,
650,
647,
641,
633,
623,
611,
596,
580,
562,
542,
520,
497,
473,
447,
420,
392,
363,
334,
304,
273,
242,
210,
179,
147,
116,
85,
54,
24,
-6,
-35,
-63,
-90,
-117,
-142,
-166,
-189,
-211,
-231,
-250,
-268,
-284,
-298,
-311,
-322,
-332,
-340,
-346,
-351,
-354,
-356,
-356,
-354,
-351,
-347,
-341,
-333,
-325,
-314,
-303,
-291,
-277,
-263,
-247,
-231,
-213,
-195,
-177,
-158,
-138,
-118,
-98,
-77,
-56,
-36,
-15,
5,
26,
46,
66,
85,
104,
122,
139,
156,
172,
187,
202,
215,
228,
239,
249,
259,
267,
274,
280,
285,
288,
291,
292,
292,
291,
289,
285,
281,
275,
268,
261,
252,
243,
232,
221,
209,
196,
182,
168,
153,
138,
122,
106,
89,
73,
56,
38,
21,
4,
-13,
-30,
-47;
@@ -0,0 +1,448 @@
00000000 0 0 0 2 0 62
00000000 0 0 0 1 0 62
00000000 0 0 0 2 1 61
00000000 0 0 0 1 1 61
00000000 0 0 0 2 2 60
00000000 0 0 0 1 2 60
00000000 0 0 0 2 3 59
00000000 0 0 0 1 3 59
00000000 0 0 0 2 4 58
00000000 0 0 0 1 4 58
00000000 0 0 0 2 5 57
00000000 0 0 0 1 5 57
00000000 0 0 0 2 6 56
00000000 0 0 0 1 6 56
00000000 0 0 0 2 7 55
00000000 0 0 0 1 7 55
00000000 0 0 0 2 8 54
00000000 0 0 0 1 8 54
00000000 0 0 0 2 9 53
00000000 0 0 0 1 9 53
00000000 0 0 0 2 10 52
00000000 0 0 0 1 10 52
00000000 0 0 0 2 11 51
00000000 0 0 0 1 11 51
00000000 0 0 0 2 12 50
00000000 0 0 0 1 12 50
00000000 0 0 0 2 13 49
00000000 0 0 0 1 13 49
00000000 0 0 0 2 14 48
00000000 0 0 0 1 14 48
00000000 0 0 0 2 15 47
00000000 0 0 0 1 15 47
00000000 0 0 0 2 16 46
00000000 0 0 0 1 16 46
00000000 0 0 0 2 17 45
00000000 0 0 0 1 17 45
00000000 0 0 0 2 18 44
00000000 0 0 0 1 18 44
00000000 0 0 0 2 19 43
00000000 0 0 0 1 19 43
00000000 0 0 0 2 20 42
00000000 0 0 0 1 20 42
00000000 0 0 0 2 21 41
00000000 0 0 0 1 21 41
00000000 0 0 0 2 22 40
00000000 0 0 0 1 22 40
00000000 0 0 0 2 23 39
00000000 0 0 0 1 23 39
00000000 0 0 0 2 24 38
00000000 0 0 0 1 24 38
00000000 0 0 0 2 25 37
00000000 0 0 0 1 25 37
00000000 0 0 0 2 26 36
00000000 0 0 0 1 26 36
00000000 0 0 0 2 27 35
00000000 0 0 0 1 27 35
00000000 0 0 0 2 28 34
00000000 0 0 0 1 28 34
00000000 0 0 0 2 29 33
00000000 0 0 0 1 29 33
00000000 0 0 0 2 30 32
00000000 0 0 0 1 30 32
00000000 0 0 0 0 31 0
ffffffd1 0 0 0 0 63 0
000000b7 0 1 0 2 64 126
ffffff0d 0 1 0 1 64 126
000000b6 0 1 0 2 65 125
ffffff30 0 1 0 1 65 125
000000b5 0 1 0 2 66 124
ffffff53 0 1 0 1 66 124
000000b3 0 1 0 2 67 123
ffffff77 0 1 0 1 67 123
000000b0 0 1 0 2 68 122
ffffff9c 0 1 0 1 68 122
000000ae 0 1 0 2 69 121
ffffffc2 0 1 0 1 69 121
000000ab 0 1 0 2 70 120
ffffffe7 0 1 0 1 70 120
000000a6 0 1 0 2 71 119
0000000c 0 1 0 1 71 119
000000a2 0 1 0 2 72 118
00000032 0 1 0 1 72 118
0000009e 0 1 0 2 73 117
00000056 0 1 0 1 73 117
00000099 0 1 0 2 74 116
0000007b 0 1 0 1 74 116
00000094 0 1 0 2 75 115
0000009e 0 1 0 1 75 115
0000008e 0 1 0 2 76 114
000000c2 0 1 0 1 76 114
00000088 0 1 0 2 77 113
000000e4 0 1 0 1 77 113
00000082 0 1 0 2 78 112
00000106 0 1 0 1 78 112
0000007c 0 1 0 2 79 111
00000126 0 1 0 1 79 111
00000075 0 1 0 2 80 110
00000145 0 1 0 1 80 110
0000006e 0 1 0 2 81 109
00000162 0 1 0 1 81 109
00000068 0 1 0 2 82 108
0000017e 0 1 0 1 82 108
00000060 0 1 0 2 83 107
00000198 0 1 0 1 83 107
00000059 0 1 0 2 84 106
000001b1 0 1 0 1 84 106
00000051 0 1 0 2 85 105
000001c7 0 1 0 1 85 105
00000049 0 1 0 2 86 104
000001dd 0 1 0 1 86 104
00000042 0 1 0 2 87 103
000001f0 0 1 0 1 87 103
00000039 0 1 0 2 88 102
00000201 0 1 0 1 88 102
00000032 0 1 0 2 89 101
00000210 0 1 0 1 89 101
0000002a 0 1 0 2 90 100
0000021c 0 1 0 1 90 100
00000021 0 1 0 2 91 99
00000227 0 1 0 1 91 99
00000019 0 1 0 2 92 98
0000022f 0 1 0 1 92 98
00000011 0 1 0 2 93 97
00000235 0 1 0 1 93 97
00000008 0 1 0 2 94 96
00000238 0 1 0 1 94 96
0000011d 0 1 0 0 95 0
ffffff19 0 1 0 0 127 0
fffffc7f 0 2 0 2 128 190
00000193 0 2 0 1 128 190
fffffc72 0 2 0 2 129 189
00000180 0 2 0 1 129 189
fffffc6a 0 2 0 2 130 188
0000016c 0 2 0 1 130 188
fffffc64 0 2 0 2 131 187
00000156 0 2 0 1 131 187
fffffc62 0 2 0 2 132 186
00000140 0 2 0 1 132 186
fffffc63 0 2 0 2 133 185
00000129 0 2 0 1 133 185
fffffc67 0 2 0 2 134 184
0000010f 0 2 0 1 134 184
fffffc6f 0 2 0 2 135 183
000000f7 0 2 0 1 135 183
fffffc79 0 2 0 2 136 182
000000dd 0 2 0 1 136 182
fffffc87 0 2 0 2 137 181
000000c3 0 2 0 1 137 181
fffffc99 0 2 0 2 138 180
000000a9 0 2 0 1 138 180
fffffcad 0 2 0 2 139 179
0000008f 0 2 0 1 139 179
fffffcc3 0 2 0 2 140 178
00000075 0 2 0 1 140 178
fffffcdd 0 2 0 2 141 177
0000005b 0 2 0 1 141 177
fffffcfa 0 2 0 2 142 176
00000042 0 2 0 1 142 176
fffffd19 0 2 0 2 143 175
00000029 0 2 0 1 143 175
fffffd3b 0 2 0 2 144 174
00000011 0 2 0 1 144 174
fffffd5e 0 2 0 2 145 173
fffffffa 0 2 0 1 145 173
fffffd84 0 2 0 2 146 172
ffffffe4 0 2 0 1 146 172
fffffdad 0 2 0 2 147 171
ffffffcf 0 2 0 1 147 171
fffffdd7 0 2 0 2 148 170
ffffffbb 0 2 0 1 148 170
fffffe04 0 2 0 2 149 169
ffffffa8 0 2 0 1 149 169
fffffe31 0 2 0 2 150 168
ffffff97 0 2 0 1 150 168
fffffe61 0 2 0 2 151 167
ffffff87 0 2 0 1 151 167
fffffe92 0 2 0 2 152 166
ffffff7a 0 2 0 1 152 166
fffffec4 0 2 0 2 153 165
ffffff6e 0 2 0 1 153 165
fffffef7 0 2 0 2 154 164
ffffff63 0 2 0 1 154 164
ffffff2b 0 2 0 2 155 163
ffffff5b 0 2 0 1 155 163
ffffff60 0 2 0 2 156 162
ffffff54 0 2 0 1 156 162
ffffff95 0 2 0 2 157 161
ffffff4f 0 2 0 1 157 161
ffffffca 0 2 0 2 158 160
ffffff4c 0 2 0 1 158 160
ffffffa6 0 2 0 0 159 0
0000028a 0 2 0 0 191 0
00000736 0 3 0 2 192 254
fffffddc 0 3 0 1 192 254
0000075a 0 3 0 2 193 253
fffffdae 0 3 0 1 193 253
00000777 0 3 0 2 194 252
fffffd83 0 3 0 1 194 252
0000078d 0 3 0 2 195 251
fffffd59 0 3 0 1 195 251
0000079b 0 3 0 2 196 250
fffffd33 0 3 0 1 196 250
000007a1 0 3 0 2 197 249
fffffd0f 0 3 0 1 197 249
0000079f 0 3 0 2 198 248
fffffced 0 3 0 1 198 248
00000797 0 3 0 2 199 247
fffffccd 0 3 0 1 199 247
00000785 0 3 0 2 200 246
fffffcaf 0 3 0 1 200 246
0000076e 0 3 0 2 201 245
fffffc94 0 3 0 1 201 245
0000074f 0 3 0 2 202 244
fffffc79 0 3 0 1 202 244
00000729 0 3 0 2 203 243
fffffc61 0 3 0 1 203 243
000006fc 0 3 0 2 204 242
fffffc4a 0 3 0 1 204 242
000006c8 0 3 0 2 205 241
fffffc36 0 3 0 1 205 241
0000068e 0 3 0 2 206 240
fffffc24 0 3 0 1 206 240
0000064e 0 3 0 2 207 239
fffffc12 0 3 0 1 207 239
00000608 0 3 0 2 208 238
fffffc02 0 3 0 1 208 238
000005bc 0 3 0 2 209 237
fffffbf4 0 3 0 1 209 237
0000056b 0 3 0 2 210 236
fffffbe7 0 3 0 1 210 236
00000514 0 3 0 2 211 235
fffffbda 0 3 0 1 211 235
000004b9 0 3 0 2 212 234
fffffbd1 0 3 0 1 212 234
00000459 0 3 0 2 213 233
fffffbc7 0 3 0 1 213 233
000003f6 0 3 0 2 214 232
fffffbbe 0 3 0 1 214 232
0000038f 0 3 0 2 215 231
fffffbb7 0 3 0 1 215 231
00000324 0 3 0 2 216 230
fffffbb0 0 3 0 1 216 230
000002b7 0 3 0 2 217 229
fffffbab 0 3 0 1 217 229
00000247 0 3 0 2 218 228
fffffba7 0 3 0 1 218 228
000001d5 0 3 0 2 219 227
fffffba3 0 3 0 1 219 227
00000161 0 3 0 2 220 226
fffffba1 0 3 0 1 220 226
000000ec 0 3 0 2 221 225
fffffb9e 0 3 0 1 221 225
00000077 0 3 0 2 222 224
fffffb9d 0 3 0 1 222 224
fffffdce 0 3 0 0 223 0
fffffb81 0 3 0 0 255 0
fffff4c5 0 4 0 2 256 318
000002a3 0 4 0 1 256 318
fffff471 0 4 0 2 257 317
00000367 0 4 0 1 257 317
fffff42b 0 4 0 2 258 316
00000427 0 4 0 1 258 316
fffff3f2 0 4 0 2 259 315
000004e2 0 4 0 1 259 315
fffff3c8 0 4 0 2 260 314
00000598 0 4 0 1 260 314
fffff3ad 0 4 0 2 261 313
00000649 0 4 0 1 261 313
fffff39e 0 4 0 2 262 312
000006f6 0 4 0 1 262 312
fffff39e 0 4 0 2 263 311
0000079c 0 4 0 1 263 311
fffff3ab 0 4 0 2 264 310
0000083d 0 4 0 1 264 310
fffff3c6 0 4 0 2 265 309
000008da 0 4 0 1 265 309
fffff3ef 0 4 0 2 266 308
0000096f 0 4 0 1 266 308
fffff423 0 4 0 2 267 307
000009ff 0 4 0 1 267 307
fffff466 0 4 0 2 268 306
00000a88 0 4 0 1 268 306
fffff4b3 0 4 0 2 269 305
00000b0b 0 4 0 1 269 305
fffff50d 0 4 0 2 270 304
00000b87 0 4 0 1 270 304
fffff572 0 4 0 2 271 303
00000bfe 0 4 0 1 271 303
fffff5e3 0 4 0 2 272 302
00000c6d 0 4 0 1 272 302
fffff65e 0 4 0 2 273 301
00000cd6 0 4 0 1 273 301
fffff6e2 0 4 0 2 274 300
00000d38 0 4 0 1 274 300
fffff771 0 4 0 2 275 299
00000d93 0 4 0 1 275 299
fffff807 0 4 0 2 276 298
00000de7 0 4 0 1 276 298
fffff8a6 0 4 0 2 277 297
00000e34 0 4 0 1 277 297
fffff94c 0 4 0 2 278 296
00000e7a 0 4 0 1 278 296
fffff9fa 0 4 0 2 279 295
00000eb8 0 4 0 1 279 295
fffffaad 0 4 0 2 280 294
00000eef 0 4 0 1 280 294
fffffb65 0 4 0 2 281 293
00000f1f 0 4 0 1 281 293
fffffc22 0 4 0 2 282 292
00000f48 0 4 0 1 282 292
fffffce4 0 4 0 2 283 291
00000f6a 0 4 0 1 283 291
fffffda9 0 4 0 2 284 290
00000f83 0 4 0 1 284 290
fffffe6f 0 4 0 2 285 289
00000f95 0 4 0 1 285 289
ffffff37 0 4 0 2 286 288
00000fa1 0 4 0 1 286 288
000007d2 0 4 0 0 287 0
0000065b 0 4 0 0 319 0
00000f15 0 5 0 2 320 382
fffffc65 0 5 0 1 320 382
00001000 0 5 0 2 321 381
fffffa30 0 5 0 1 321 381
000010cc 0 5 0 2 322 380
fffff808 0 5 0 1 322 380
0000117b 0 5 0 2 323 379
fffff5ed 0 5 0 1 323 379
0000120c 0 5 0 2 324 378
fffff3e2 0 5 0 1 324 378
00001281 0 5 0 2 325 377
fffff1e5 0 5 0 1 325 377
000012d8 0 5 0 2 326 376
ffffeff8 0 5 0 1 326 376
00001313 0 5 0 2 327 375
ffffee1b 0 5 0 1 327 375
00001332 0 5 0 2 328 374
ffffec4e 0 5 0 1 328 374
00001337 0 5 0 2 329 373
ffffea91 0 5 0 1 329 373
00001320 0 5 0 2 330 372
ffffe8e6 0 5 0 1 330 372
000012ee 0 5 0 2 331 371
ffffe74c 0 5 0 1 331 371
000012a5 0 5 0 2 332 370
ffffe5c3 0 5 0 1 332 370
00001242 0 5 0 2 333 369
ffffe44e 0 5 0 1 333 369
000011c8 0 5 0 2 334 368
ffffe2ea 0 5 0 1 334 368
00001139 0 5 0 2 335 367
ffffe199 0 5 0 1 335 367
00001092 0 5 0 2 336 366
ffffe05c 0 5 0 1 336 366
00000fd8 0 5 0 2 337 365
ffffdf30 0 5 0 1 337 365
00000f0a 0 5 0 2 338 364
ffffde1a 0 5 0 1 338 364
00000e2a 0 5 0 2 339 363
ffffdd16 0 5 0 1 339 363
00000d39 0 5 0 2 340 362
ffffdc27 0 5 0 1 340 362
00000c39 0 5 0 2 341 361
ffffdb4d 0 5 0 1 341 361
00000b2a 0 5 0 2 342 360
ffffda86 0 5 0 1 342 360
00000a0d 0 5 0 2 343 359
ffffd9d3 0 5 0 1 343 359
000008e6 0 5 0 2 344 358
ffffd936 0 5 0 1 344 358
000007b4 0 5 0 2 345 357
ffffd8ac 0 5 0 1 345 357
00000679 0 5 0 2 346 356
ffffd839 0 5 0 1 346 356
00000537 0 5 0 2 347 355
ffffd7d9 0 5 0 1 347 355
000003ee 0 5 0 2 348 354
ffffd790 0 5 0 1 348 354
000002a1 0 5 0 2 349 353
ffffd75b 0 5 0 1 349 353
00000151 0 5 0 2 350 352
ffffd73b 0 5 0 1 350 352
ffffeb98 0 5 0 0 351 0
fffff84d 0 5 0 0 383 0
ffff7a18 0 6 0 2 384 446
000079f6 0 6 0 1 384 446
ffff7c16 0 6 0 2 385 445
00007b96 0 6 0 1 385 445
ffff7e47 0 6 0 2 386 444
00007d2d 0 6 0 1 386 444
ffff80ab 0 6 0 2 387 443
00007eb7 0 6 0 1 387 443
ffff8341 0 6 0 2 388 442
00008037 0 6 0 1 388 442
ffff8608 0 6 0 2 389 441
000081aa 0 6 0 1 389 441
ffff8900 0 6 0 2 390 440
00008312 0 6 0 1 390 440
ffff8c28 0 6 0 2 391 439
0000846e 0 6 0 1 391 439
ffff8f7d 0 6 0 2 392 438
000085bd 0 6 0 1 392 438
ffff9300 0 6 0 2 393 437
00008700 0 6 0 1 393 437
ffff96b0 0 6 0 2 394 436
00008836 0 6 0 1 394 436
ffff9a8a 0 6 0 2 395 435
00008960 0 6 0 1 395 435
ffff9e8d 0 6 0 2 396 434
00008a7d 0 6 0 1 396 434
ffffa2b8 0 6 0 2 397 433
00008b8a 0 6 0 1 397 433
ffffa70a 0 6 0 2 398 432
00008c8c 0 6 0 1 398 432
ffffab7f 0 6 0 2 399 431
00008d7f 0 6 0 1 399 431
ffffb017 0 6 0 2 400 430
00008e65 0 6 0 1 400 430
ffffb4d2 0 6 0 2 401 429
00008f3c 0 6 0 1 401 429
ffffb9aa 0 6 0 2 402 428
00009006 0 6 0 1 402 428
ffffbea0 0 6 0 2 403 427
000090c0 0 6 0 1 403 427
ffffc3b1 0 6 0 2 404 426
0000916d 0 6 0 1 404 426
ffffc8db 0 6 0 2 405 425
0000920b 0 6 0 1 405 425
ffffce1c 0 6 0 2 406 424
0000929a 0 6 0 1 406 424
ffffd372 0 6 0 2 407 423
0000931a 0 6 0 1 407 423
ffffd8db 0 6 0 2 408 422
0000938b 0 6 0 1 408 422
ffffde53 0 6 0 2 409 421
000093ed 0 6 0 1 409 421
ffffe3db 0 6 0 2 410 420
00009441 0 6 0 1 410 420
ffffe96d 0 6 0 2 411 419
00009485 0 6 0 1 411 419
ffffef0a 0 6 0 2 412 418
000094ba 0 6 0 1 412 418
fffff4ae 0 6 0 2 413 417
000094e0 0 6 0 1 413 417
fffffa55 0 6 0 2 414 416
000094f7 0 6 0 1 414 416
00004a7f 0 6 0 0 415 0
00007fff 0 6 0 0 447 0
@@ -0,0 +1,258 @@
MEMORY_INITIALIZATION_RADIX = 10;
MEMORY_INITIALIZATION_VECTOR =
-2147483647,
-2130640638,
-2113797629,
-2096954620,
-2080111611,
-2063268602,
-2046425593,
-2029582584,
-2012739575,
-1995896566,
-1979053557,
-1962210548,
-1945367539,
-1928524530,
-1911681521,
-1894838512,
-1877995503,
-1861152494,
-1844309485,
-1827466476,
-1810623467,
-1793780458,
-1776937449,
-1760094440,
-1743251431,
-1726408422,
-1709565413,
-1692722404,
-1675879395,
-1659036386,
-1642193377,
-1625350368,
-1608507359,
-1591664350,
-1574821341,
-1557978332,
-1541135323,
-1524292314,
-1507449305,
-1490606296,
-1473763287,
-1456920278,
-1440077269,
-1423234260,
-1406391251,
-1389548242,
-1372705233,
-1355862224,
-1339019215,
-1322176206,
-1305333197,
-1288490188,
-1271647179,
-1254804170,
-1237961161,
-1221118152,
-1204275143,
-1187432134,
-1170589125,
-1153746116,
-1136903107,
-1120060098,
-1103217089,
-1086374080,
-1069531071,
-1052688062,
-1035845053,
-1019002044,
-1002159035,
-985316026,
-968473017,
-951630008,
-934786999,
-917943990,
-901100981,
-884257972,
-867414963,
-850571954,
-833728945,
-816885936,
-800042927,
-783199918,
-766356909,
-749513900,
-732670891,
-715827882,
-698984873,
-682141864,
-665298855,
-648455846,
-631612837,
-614769828,
-597926819,
-581083810,
-564240801,
-547397792,
-530554783,
-513711774,
-496868765,
-480025756,
-463182747,
-446339738,
-429496729,
-412653720,
-395810711,
-378967702,
-362124693,
-345281684,
-328438675,
-311595666,
-294752657,
-277909648,
-261066639,
-244223630,
-227380621,
-210537612,
-193694603,
-176851594,
-160008585,
-143165576,
-126322567,
-109479558,
-92636549,
-75793540,
-58950531,
-42107522,
-25264513,
-8421504,
8421504,
25264513,
42107522,
58950531,
75793540,
92636549,
109479558,
126322567,
143165576,
160008585,
176851594,
193694603,
210537612,
227380621,
244223630,
261066639,
277909648,
294752657,
311595666,
328438675,
345281684,
362124693,
378967702,
395810711,
412653720,
429496729,
446339738,
463182747,
480025756,
496868765,
513711774,
530554783,
547397792,
564240801,
581083810,
597926819,
614769828,
631612837,
648455846,
665298855,
682141864,
698984873,
715827882,
732670891,
749513900,
766356909,
783199918,
800042927,
816885936,
833728945,
850571954,
867414963,
884257972,
901100981,
917943990,
934786999,
951630008,
968473017,
985316026,
1002159035,
1019002044,
1035845053,
1052688062,
1069531071,
1086374080,
1103217089,
1120060098,
1136903107,
1153746116,
1170589125,
1187432134,
1204275143,
1221118152,
1237961161,
1254804170,
1271647179,
1288490188,
1305333197,
1322176206,
1339019215,
1355862224,
1372705233,
1389548242,
1406391251,
1423234260,
1440077269,
1456920278,
1473763287,
1490606296,
1507449305,
1524292314,
1541135323,
1557978332,
1574821341,
1591664350,
1608507359,
1625350368,
1642193377,
1659036386,
1675879395,
1692722404,
1709565413,
1726408422,
1743251431,
1760094440,
1776937449,
1793780458,
1810623467,
1827466476,
1844309485,
1861152494,
1877995503,
1894838512,
1911681521,
1928524530,
1945367539,
1962210548,
1979053557,
1995896566,
2012739575,
2029582584,
2046425593,
2063268602,
2080111611,
2096954620,
2113797629,
2130640638,
2147483647;

Some files were not shown because too many files have changed in this diff Show More