-
Notifications
You must be signed in to change notification settings - Fork 710
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add HTG-9200 + HTG 6x QSFP28 example design
Signed-off-by: Alex Forencich <[email protected]>
- Loading branch information
1 parent
6bf727d
commit f4a8561
Showing
23 changed files
with
12,893 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,28 @@ | ||
# Verilog Ethernet HTG-9200 + HTG 6x QSFP28 FMC+ Example Design | ||
|
||
## Introduction | ||
|
||
This example design targets the HiTech Global HTG-9200 FPGA board with the HiTech Global HTG-FMC-X6QSFP28 FMC+ board installed on J9. | ||
|
||
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 is configured to run all 15 QSFP28 modules synchronous to the GTY reference oscillator (U47) on the HTG-9200. 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-flgb2104-2-e | ||
* PHY: 10G 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 HTG-9200 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 |
137 changes: 137 additions & 0 deletions
137
example/HTG9200/fpga_fmc_htg_6qsfp_25g/common/vivado.mk
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.