-
Notifications
You must be signed in to change notification settings - Fork 711
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add VCU118 + HTG 6x QSFP28 example design
Signed-off-by: Alex Forencich <[email protected]>
- Loading branch information
1 parent
3190175
commit 6bf727d
Showing
23 changed files
with
10,221 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
# Verilog Ethernet VCU118 + HTG 6x QSFP28 FMC+ Example Design | ||
|
||
## Introduction | ||
|
||
This example design targets the Xilinx VCU118 FPGA board with the HiTech Global HTG-FMC-X6QSFP28 FMC+ board installed on J22. | ||
|
||
The design by default listens to UDP port 1234 at IP address 192.168.1.128 and will echo back any packets received. The design will also respond correctly to ARP requests. The design also enables the gigabit Ethernet interface for testing with a QSFP loopback adapter. | ||
|
||
The design is configured to run all 8 QSFP28 modules synchronous to the QSFP Si570 (U38) on the VCU118. This is done by forwarding the MGT reference clock for QSFP1 through the FPGA to the SYNC_C2M pins on the FMC+, which is connected as a reference input to the Si5341 PLL (U7) on the FMC+. | ||
|
||
* FPGA: xcvu9p-flga2104-2L-e | ||
* PHY: 25G BASE-R PHY IP core and internal GTY transceiver | ||
|
||
## How to build | ||
|
||
Run make to build. Ensure that the Xilinx Vivado toolchain components are in PATH. | ||
|
||
## How to test | ||
|
||
Run make program to program the VCU118 board with Vivado. Then run | ||
|
||
netcat -u 192.168.1.128 1234 | ||
|
||
to open a UDP connection to port 1234. Any text entered into netcat will be echoed back after pressing enter. | ||
|
||
It is also possible to use hping to test the design by running | ||
|
||
hping 192.168.1.128 -2 -p 1234 -d 1024 | ||
|
||
Note that the gigabit PHY is also enabled for debugging. The gigabit port can be inserted into the 25G data path between the 25G MAC and 25G PHY so that the 25G interface can be tested with a QSFP loopback adapter. Turn on SW12.1 to insert the gigabit port into the 25G data path, or off to bypass the gigabit port. Turn on SW12.2 to place the port in the TX path or off to place the port in the RX path. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
################################################################### | ||
# | ||
# Xilinx Vivado FPGA Makefile | ||
# | ||
# Copyright (c) 2016 Alex Forencich | ||
# | ||
################################################################### | ||
# | ||
# Parameters: | ||
# FPGA_TOP - Top module name | ||
# FPGA_FAMILY - FPGA family (e.g. VirtexUltrascale) | ||
# FPGA_DEVICE - FPGA device (e.g. xcvu095-ffva2104-2-e) | ||
# SYN_FILES - space-separated list of source files | ||
# INC_FILES - space-separated list of include files | ||
# XDC_FILES - space-separated list of timing constraint files | ||
# XCI_FILES - space-separated list of IP XCI files | ||
# | ||
# Example: | ||
# | ||
# FPGA_TOP = fpga | ||
# FPGA_FAMILY = VirtexUltrascale | ||
# FPGA_DEVICE = xcvu095-ffva2104-2-e | ||
# SYN_FILES = rtl/fpga.v | ||
# XDC_FILES = fpga.xdc | ||
# XCI_FILES = ip/pcspma.xci | ||
# include ../common/vivado.mk | ||
# | ||
################################################################### | ||
|
||
# phony targets | ||
.PHONY: fpga vivado tmpclean clean distclean | ||
|
||
# prevent make from deleting intermediate files and reports | ||
.PRECIOUS: %.xpr %.bit %.mcs %.prm | ||
.SECONDARY: | ||
|
||
CONFIG ?= config.mk | ||
-include ../$(CONFIG) | ||
|
||
FPGA_TOP ?= fpga | ||
PROJECT ?= $(FPGA_TOP) | ||
|
||
SYN_FILES_REL = $(foreach p,$(SYN_FILES),$(if $(filter /% ./%,$p),$p,../$p)) | ||
INC_FILES_REL = $(foreach p,$(INC_FILES),$(if $(filter /% ./%,$p),$p,../$p)) | ||
XCI_FILES_REL = $(foreach p,$(XCI_FILES),$(if $(filter /% ./%,$p),$p,../$p)) | ||
IP_TCL_FILES_REL = $(foreach p,$(IP_TCL_FILES),$(if $(filter /% ./%,$p),$p,../$p)) | ||
CONFIG_TCL_FILES_REL = $(foreach p,$(CONFIG_TCL_FILES),$(if $(filter /% ./%,$p),$p,../$p)) | ||
|
||
ifdef XDC_FILES | ||
XDC_FILES_REL = $(foreach p,$(XDC_FILES),$(if $(filter /% ./%,$p),$p,../$p)) | ||
else | ||
XDC_FILES_REL = $(PROJECT).xdc | ||
endif | ||
|
||
################################################################### | ||
# Main Targets | ||
# | ||
# all: build everything | ||
# clean: remove output files and project files | ||
################################################################### | ||
|
||
all: fpga | ||
|
||
fpga: $(PROJECT).bit | ||
|
||
vivado: $(PROJECT).xpr | ||
vivado $(PROJECT).xpr | ||
|
||
tmpclean:: | ||
-rm -rf *.log *.jou *.cache *.gen *.hbs *.hw *.ip_user_files *.runs *.xpr *.html *.xml *.sim *.srcs *.str .Xil defines.v | ||
-rm -rf create_project.tcl update_config.tcl run_synth.tcl run_impl.tcl generate_bit.tcl | ||
|
||
clean:: tmpclean | ||
-rm -rf *.bit *.ltx program.tcl generate_mcs.tcl *.mcs *.prm flash.tcl | ||
-rm -rf *_utilization.rpt *_utilization_hierarchical.rpt | ||
|
||
distclean:: clean | ||
-rm -rf rev | ||
|
||
################################################################### | ||
# Target implementations | ||
################################################################### | ||
|
||
# Vivado project file | ||
create_project.tcl: Makefile $(XCI_FILES_REL) $(IP_TCL_FILES_REL) | ||
rm -rf defines.v | ||
touch defines.v | ||
for x in $(DEFS); do echo '`define' $$x >> defines.v; done | ||
echo "create_project -force -part $(FPGA_PART) $(PROJECT)" > $@ | ||
echo "add_files -fileset sources_1 defines.v $(SYN_FILES_REL)" >> $@ | ||
echo "set_property top $(FPGA_TOP) [current_fileset]" >> $@ | ||
echo "add_files -fileset constrs_1 $(XDC_FILES_REL)" >> $@ | ||
for x in $(XCI_FILES_REL); do echo "import_ip $$x" >> $@; done | ||
for x in $(IP_TCL_FILES_REL); do echo "source $$x" >> $@; done | ||
for x in $(CONFIG_TCL_FILES_REL); do echo "source $$x" >> $@; done | ||
|
||
update_config.tcl: $(CONFIG_TCL_FILES_REL) $(SYN_FILES_REL) $(INC_FILES_REL) $(XDC_FILES_REL) | ||
echo "open_project -quiet $(PROJECT).xpr" > $@ | ||
for x in $(CONFIG_TCL_FILES_REL); do echo "source $$x" >> $@; done | ||
|
||
$(PROJECT).xpr: create_project.tcl update_config.tcl | ||
vivado -nojournal -nolog -mode batch $(foreach x,$?,-source $x) | ||
|
||
# synthesis run | ||
$(PROJECT).runs/synth_1/$(PROJECT).dcp: create_project.tcl update_config.tcl $(SYN_FILES_REL) $(INC_FILES_REL) $(XDC_FILES_REL) | $(PROJECT).xpr | ||
echo "open_project $(PROJECT).xpr" > run_synth.tcl | ||
echo "reset_run synth_1" >> run_synth.tcl | ||
echo "launch_runs -jobs 4 synth_1" >> run_synth.tcl | ||
echo "wait_on_run synth_1" >> run_synth.tcl | ||
vivado -nojournal -nolog -mode batch -source run_synth.tcl | ||
|
||
# implementation run | ||
$(PROJECT).runs/impl_1/$(PROJECT)_routed.dcp: $(PROJECT).runs/synth_1/$(PROJECT).dcp | ||
echo "open_project $(PROJECT).xpr" > run_impl.tcl | ||
echo "reset_run impl_1" >> run_impl.tcl | ||
echo "launch_runs -jobs 4 impl_1" >> run_impl.tcl | ||
echo "wait_on_run impl_1" >> run_impl.tcl | ||
echo "open_run impl_1" >> run_impl.tcl | ||
echo "report_utilization -file $(PROJECT)_utilization.rpt" >> run_impl.tcl | ||
echo "report_utilization -hierarchical -file $(PROJECT)_utilization_hierarchical.rpt" >> run_impl.tcl | ||
vivado -nojournal -nolog -mode batch -source run_impl.tcl | ||
|
||
# bit file | ||
$(PROJECT).bit $(PROJECT).ltx: $(PROJECT).runs/impl_1/$(PROJECT)_routed.dcp | ||
echo "open_project $(PROJECT).xpr" > generate_bit.tcl | ||
echo "open_run impl_1" >> generate_bit.tcl | ||
echo "write_bitstream -force $(PROJECT).runs/impl_1/$(PROJECT).bit" >> generate_bit.tcl | ||
echo "write_debug_probes -force $(PROJECT).runs/impl_1/$(PROJECT).ltx" >> generate_bit.tcl | ||
vivado -nojournal -nolog -mode batch -source generate_bit.tcl | ||
ln -f -s $(PROJECT).runs/impl_1/$(PROJECT).bit . | ||
if [ -e $(PROJECT).runs/impl_1/$(PROJECT).ltx ]; then ln -f -s $(PROJECT).runs/impl_1/$(PROJECT).ltx .; fi | ||
mkdir -p rev | ||
COUNT=100; \ | ||
while [ -e rev/$(PROJECT)_rev$$COUNT.bit ]; \ | ||
do COUNT=$$((COUNT+1)); done; \ | ||
cp -pv $(PROJECT).runs/impl_1/$(PROJECT).bit rev/$(PROJECT)_rev$$COUNT.bit; \ | ||
if [ -e $(PROJECT).runs/impl_1/$(PROJECT).ltx ]; then cp -pv $(PROJECT).runs/impl_1/$(PROJECT).ltx rev/$(PROJECT)_rev$$COUNT.ltx; fi |
Oops, something went wrong.