-
Notifications
You must be signed in to change notification settings - Fork 722
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add KR260 fpga_10g_ddr reference design
Signed-off-by: Víctor Mayoral Vilches <[email protected]>
- Loading branch information
Showing
20 changed files
with
2,680 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,25 @@ | ||
# Targets | ||
TARGETS:= | ||
|
||
# Subdirectories | ||
SUBDIRS = fpga | ||
SUBDIRS_CLEAN = $(patsubst %,%.clean,$(SUBDIRS)) | ||
|
||
# Rules | ||
.PHONY: all | ||
all: $(SUBDIRS) $(TARGETS) | ||
|
||
.PHONY: $(SUBDIRS) | ||
$(SUBDIRS): | ||
cd $@ && $(MAKE) | ||
|
||
.PHONY: $(SUBDIRS_CLEAN) | ||
$(SUBDIRS_CLEAN): | ||
cd $(@:.clean=) && $(MAKE) clean | ||
|
||
.PHONY: clean | ||
clean: $(SUBDIRS_CLEAN) | ||
-rm -rf $(TARGETS) | ||
|
||
program: | ||
#djtgcfg prog -d Atlys --index 0 --file fpga/fpga.bit |
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,29 @@ | ||
# Verilog Ethernet KR260 Example Design | ||
|
||
## Introduction | ||
|
||
This example design targets the AMD KR260 FPGA SoC board. | ||
|
||
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. | ||
|
||
* FPGA: `XCK26-SFVC784-2LV-C` (or `-I`, if industrial-grade) | ||
* 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 | ||
|
||
Program the KR260 board with Vivado's Hardware Device Manager (via JTAG). Connect the KR260 SFP+ port to a 10G Ethernet NIC in your host. Then run in your host machine: | ||
|
||
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 |
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,131 @@ | ||
################################################################### | ||
# | ||
# 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: clean fpga | ||
|
||
# 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 = $(patsubst %, ../%, $(SYN_FILES)) | ||
INC_FILES_REL = $(patsubst %, ../%, $(INC_FILES)) | ||
XCI_FILES_REL = $(patsubst %, ../%, $(XCI_FILES)) | ||
IP_TCL_FILES_REL = $(patsubst %, ../%, $(IP_TCL_FILES)) | ||
|
||
ifdef XDC_FILES | ||
XDC_FILES_REL = $(patsubst %, ../%, $(XDC_FILES)) | ||
else | ||
XDC_FILES_REL = $(FPGA_TOP).xdc | ||
endif | ||
|
||
################################################################### | ||
# Main Targets | ||
# | ||
# all: build everything | ||
# clean: remove output files and project files | ||
################################################################### | ||
|
||
all: fpga | ||
|
||
fpga: $(FPGA_TOP).bit | ||
|
||
vivado: $(FPGA_TOP).xpr | ||
vivado $(FPGA_TOP).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 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 | ||
|
||
$(PROJECT).xpr: create_project.tcl | ||
vivado -nojournal -nolog -mode batch $(foreach x,$?,-source $x) | ||
|
||
# synthesis run | ||
$(PROJECT).runs/synth_1/$(PROJECT).dcp: $(PROJECT).xpr $(SYN_FILES_REL) $(INC_FILES_REL) $(XDC_FILES_REL) | ||
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 |
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,35 @@ | ||
# XDC constraints for the AMD KR260 board | ||
# part: XCK26-SFVC784-2LV-C/I | ||
|
||
# General configuration | ||
set_property BITSTREAM.GENERAL.COMPRESS true [current_design] | ||
|
||
# System clocks | ||
# | ||
# use the 25 MHz clock outputs to the PL from U91 | ||
# and feed that into a PLL to convert it to 125 MHz | ||
set_property -dict {LOC C3 IOSTANDARD LVCMOS18} [get_ports clk_25mhz_ref] ;# HPA_CLK0P_CLK, HPA_CLK0_P, via U91, SOM240_1 A6 | ||
create_clock -period 40.000 -name clk_25mhz [get_ports clk_25mhz_ref] | ||
|
||
# LEDs | ||
set_property -dict {LOC F8 IOSTANDARD LVCMOS18 SLEW SLOW DRIVE 8} [get_ports {led[0]}] ;# HPA14P, HPA14_P, som240_1_d13, VCCO - som240_1_d1 | ||
set_property -dict {LOC E8 IOSTANDARD LVCMOS18 SLEW SLOW DRIVE 8} [get_ports {led[1]}] ;# HPA14N, HPA14_N, som240_1_d14, VCCO - som240_1_d1 | ||
|
||
set_false_path -to [get_ports {led[*]}] | ||
set_output_delay 0 [get_ports {led[*]}] | ||
|
||
# SFP+ Interface | ||
set_property -dict {LOC T2 } [get_ports sfp0_rx_p] ;# GTH_DP2_C2M_P, som240_2_b1 | ||
set_property -dict {LOC T1 } [get_ports sfp0_rx_n] ;# GTH_DP2_C2M_N, som240_2_b2 | ||
set_property -dict {LOC R4 } [get_ports sfp0_tx_p] ;# GTH_DP2_M2C_P, som240_2_b5 | ||
set_property -dict {LOC R3 } [get_ports sfp0_tx_n] ;# GTH_DP2_M2C_N, som240_2_b6 | ||
|
||
set_property -dict {LOC Y6 } [get_ports sfp_mgt_refclk_0_p] ;# GTH_REFCLK0_C2M_P via U90, SOM240_2 C3 | ||
set_property -dict {LOC Y5 } [get_ports sfp_mgt_refclk_0_n] ;# GTH_REFCLK0_C2M_N via U90, SOM240_2 C4 | ||
set_property -dict {LOC Y10 IOSTANDARD LVCMOS18 SLEW SLOW DRIVE 8 } [get_ports sfp0_tx_disable_b] ;# HDB19, SOM240_2_A47 | ||
|
||
# 156.25 MHz MGT reference clock | ||
create_clock -period 6.400 -name sfp_mgt_refclk_0 [get_ports sfp_mgt_refclk_0_p] | ||
|
||
set_false_path -to [get_ports {sfp0_tx_disable_b}] | ||
set_output_delay 0 [get_ports {sfp0_tx_disable_b}] |
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,3 @@ | ||
* | ||
!.gitignore | ||
!.Makefile |
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,76 @@ | ||
# Copyright (c) 2021 Alex Forencich | ||
# | ||
# Permission is hereby granted, free of charge, to any person obtaining a copy | ||
# of this software and associated documentation files (the "Software"), to deal | ||
# in the Software without restriction, including without limitation the rights | ||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
# copies of the Software, and to permit persons to whom the Software is | ||
# furnished to do so, subject to the following conditions: | ||
# | ||
# The above copyright notice and this permission notice shall be included in | ||
# all copies or substantial portions of the Software. | ||
# | ||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY | ||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
# THE SOFTWARE. | ||
|
||
set base_name {eth_xcvr_gt} | ||
|
||
set preset {GTH-10GBASE-R} | ||
|
||
set freerun_freq {125} | ||
set line_rate {10.3125} | ||
set refclk_freq {156.25} | ||
set qpll_fracn [expr {int(fmod($line_rate*1000/2 / $refclk_freq, 1)*pow(2, 24))}] | ||
set user_data_width {64} | ||
set int_data_width {32} | ||
set extra_ports [list] | ||
set extra_pll_ports [list {qpll0lock_out}] | ||
|
||
set config [dict create] | ||
|
||
dict set config TX_LINE_RATE $line_rate | ||
dict set config TX_REFCLK_FREQUENCY $refclk_freq | ||
dict set config TX_QPLL_FRACN_NUMERATOR $qpll_fracn | ||
dict set config TX_USER_DATA_WIDTH $user_data_width | ||
dict set config TX_INT_DATA_WIDTH $int_data_width | ||
dict set config RX_LINE_RATE $line_rate | ||
dict set config RX_REFCLK_FREQUENCY $refclk_freq | ||
dict set config RX_QPLL_FRACN_NUMERATOR $qpll_fracn | ||
dict set config RX_USER_DATA_WIDTH $user_data_width | ||
dict set config RX_INT_DATA_WIDTH $int_data_width | ||
dict set config ENABLE_OPTIONAL_PORTS $extra_ports | ||
dict set config LOCATE_COMMON {CORE} | ||
dict set config LOCATE_RESET_CONTROLLER {CORE} | ||
dict set config LOCATE_TX_USER_CLOCKING {CORE} | ||
dict set config LOCATE_RX_USER_CLOCKING {CORE} | ||
dict set config LOCATE_USER_DATA_WIDTH_SIZING {CORE} | ||
dict set config FREERUN_FREQUENCY $freerun_freq | ||
dict set config DISABLE_LOC_XDC {1} | ||
|
||
proc create_gtwizard_ip {name preset config} { | ||
create_ip -name gtwizard_ultrascale -vendor xilinx.com -library ip -module_name $name | ||
set ip [get_ips $name] | ||
set_property CONFIG.preset $preset $ip | ||
set config_list {} | ||
dict for {name value} $config { | ||
lappend config_list "CONFIG.${name}" $value | ||
} | ||
set_property -dict $config_list $ip | ||
} | ||
|
||
# variant with channel and common | ||
dict set config ENABLE_OPTIONAL_PORTS [concat $extra_pll_ports $extra_ports] | ||
dict set config LOCATE_COMMON {CORE} | ||
|
||
create_gtwizard_ip "${base_name}_full" $preset $config | ||
|
||
# variant with channel only | ||
dict set config ENABLE_OPTIONAL_PORTS $extra_ports | ||
dict set config LOCATE_COMMON {EXAMPLE_DESIGN} | ||
|
||
create_gtwizard_ip "${base_name}_channel" $preset $config |
Oops, something went wrong.