From 40a588fb2c1fd489203890c83b71424adccd51ee Mon Sep 17 00:00:00 2001 From: Tomserv-512 <82932795+Tomserv-512@users.noreply.github.com> Date: Sat, 10 May 2025 08:02:21 +0300 Subject: [PATCH] Add xcau15p (xcau15p_ffvb676) support (#547) Co-authored-by: vbuitvydas --- spiOverJtag/Makefile | 3 ++- spiOverJtag/build.py | 5 ++++- spiOverJtag/constr_xcau15p_ffvb676.xdc | 7 +++++++ spiOverJtag/spiOverJtag_xcau15p-ffvb676.bit.gz | Bin 0 -> 48384 bytes spiOverJtag/xilinx_spiOverJtag.v | 1 + 5 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 spiOverJtag/constr_xcau15p_ffvb676.xdc create mode 100644 spiOverJtag/spiOverJtag_xcau15p-ffvb676.bit.gz diff --git a/spiOverJtag/Makefile b/spiOverJtag/Makefile index 478a50c..d1dec0d 100644 --- a/spiOverJtag/Makefile +++ b/spiOverJtag/Makefile @@ -18,7 +18,8 @@ XILINX_PARTS := xc3s500evq100 \ xc7vx330tffg1157 \ xcku040-ffva1156 xcku060-ffva1156 \ xcku5p-ffvb676 \ - xcvu9p-flga2104 xcvu37p-fsvh2892 + xcvu9p-flga2104 xcvu37p-fsvh2892 \ + xcau15p-ffvb676 XILINX_BIT_FILES := $(addsuffix .bit.gz,$(addprefix spiOverJtag_, $(XILINX_PARTS))) ALTERA_PARTS := 10cl025256 10cl016484 10cl055484 \ diff --git a/spiOverJtag/build.py b/spiOverJtag/build.py index 08b9b7e..534a350 100755 --- a/spiOverJtag/build.py +++ b/spiOverJtag/build.py @@ -67,7 +67,7 @@ elif subpart == "xc6v": family = "Virtex6" tool = "ise" speed = -1 -elif subpart in ["xcvu", "xcku"]: +elif subpart in ["xcvu", "xcku", "xcau"]: family = "Xilinx UltraScale" tool = "vivado" else: @@ -126,6 +126,7 @@ if tool in ["ise", "vivado"]: "xcvu37p-fsvh2892" : "xcvu37p_fsvh2892", "xcku3p-ffva676" : "xcku3p_ffva676", "xcku5p-ffvb676" : "xcku5p_ffvb676", + "xcau15p-ffvb676" : "xcau15p_ffvb676", }[part] if tool == "ise": cst_type = "UCF" @@ -189,6 +190,8 @@ if tool in ["ise", "vivado"]: 'paramtype': 'vlogdefine', 'description': 'secondary flash', 'default': 1} + elif part == "xcau15p-ffvb676": + tool_options = {'part': part + '-2-e'} else: tool_options = {'part': part + '-1'} cst_file = currDir + "constr_" + pkg_name + "." + cst_type.lower() diff --git a/spiOverJtag/constr_xcau15p_ffvb676.xdc b/spiOverJtag/constr_xcau15p_ffvb676.xdc new file mode 100644 index 0000000..bc4bb4a --- /dev/null +++ b/spiOverJtag/constr_xcau15p_ffvb676.xdc @@ -0,0 +1,7 @@ +set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] +set_property CONFIG_VOLTAGE 1.8 [current_design] +# Table 1-2 from UG570 +set_property CFGBVS GND [current_design] + +# Primary QSPI flash +# Connection done through the STARTUPE3 block diff --git a/spiOverJtag/spiOverJtag_xcau15p-ffvb676.bit.gz b/spiOverJtag/spiOverJtag_xcau15p-ffvb676.bit.gz new file mode 100644 index 0000000000000000000000000000000000000000..014eafe9775f7d6541fb06d20b63daddbfb7e6e4 GIT binary patch literal 48384 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