diff --git a/libraries/technology/fifo/hdllib.cfg b/libraries/technology/fifo/hdllib.cfg
index e8bd853aafbd62706a63a2e6daabdef02571149b..292b8492dd0f004cecd8a519e9e270e34223d0ee 100644
--- a/libraries/technology/fifo/hdllib.cfg
+++ b/libraries/technology/fifo/hdllib.cfg
@@ -1,6 +1,6 @@
 hdl_lib_name = tech_fifo
 hdl_library_clause_name = tech_fifo_lib
-hdl_lib_uses_synth = technology ip_stratixiv_fifo ip_arria10_fifo ip_arria10_e3sge3_fifo ip_arria10_e1sg_fifo ip_arria10_e2sg_fifo
+hdl_lib_uses_synth = technology ip_stratixiv_fifo ip_arria10_fifo ip_arria10_e3sge3_fifo ip_arria10_e1sg_fifo ip_arria10_e2sg_fifo ip_ultrascale_fifo
 hdl_lib_uses_sim = 
 hdl_lib_technology = 
 hdl_lib_disclose_library_clause_names =
@@ -9,6 +9,7 @@ hdl_lib_disclose_library_clause_names =
     ip_arria10_e3sge3_fifo ip_arria10_e3sge3_fifo_lib
     ip_arria10_e1sg_fifo   ip_arria10_e1sg_fifo_lib
     ip_arria10_e2sg_fifo   ip_arria10_e2sg_fifo_lib
+    ip_ultrascale_fifo     ip_arria10_ultrascale_lib
 
 synth_files =
     tech_fifo_component_pkg.vhd
diff --git a/libraries/technology/fifo/tech_fifo_component_pkg.vhd b/libraries/technology/fifo/tech_fifo_component_pkg.vhd
index f325b78e7b904474735804721fbd1ddf1435034f..81efaf41d69922bf149028fa9f31423bd9e15a69 100644
--- a/libraries/technology/fifo/tech_fifo_component_pkg.vhd
+++ b/libraries/technology/fifo/tech_fifo_component_pkg.vhd
@@ -287,7 +287,7 @@ PACKAGE tech_fifo_component_pkg IS
   );
   END COMPONENT;
   
-   -----------------------------------------------------------------------------
+  -----------------------------------------------------------------------------
   -- ip_arria10_e2sg
   -----------------------------------------------------------------------------
   
@@ -351,6 +351,68 @@ PACKAGE tech_fifo_component_pkg IS
     wrusedw : OUT STD_LOGIC_VECTOR (tech_ceil_log2(g_nof_words)-1 DOWNTO 0)
   );
   END COMPONENT;
+   
+  -----------------------------------------------------------------------------
+  -- ip_ultrascale
+  -----------------------------------------------------------------------------
+  
+  COMPONENT ip_ultrascale_fifo_sc IS
+  GENERIC (
+    g_dat_w     : NATURAL := 20;
+    g_nof_words : NATURAL := 1024
+  );
+  PORT (
+    aclr    : IN STD_LOGIC ;
+    clock   : IN STD_LOGIC ;
+    data    : IN STD_LOGIC_VECTOR (g_dat_w-1 DOWNTO 0);
+    rdreq   : IN STD_LOGIC ;
+    wrreq   : IN STD_LOGIC ;
+    empty   : OUT STD_LOGIC ;
+    full    : OUT STD_LOGIC ;
+    q       : OUT STD_LOGIC_VECTOR (g_dat_w-1 DOWNTO 0) ;
+    usedw   : OUT STD_LOGIC_VECTOR (tech_ceil_log2(g_nof_words)-1 DOWNTO 0)
+  );
+  END COMPONENT;
+
+  COMPONENT ip_ultrascale_fifo_dc IS
+  GENERIC (
+    g_dat_w     : NATURAL := 20;
+    g_nof_words : NATURAL := 1024
+  );
+  PORT (
+    aclr    : IN STD_LOGIC  := '0';
+    data    : IN STD_LOGIC_VECTOR (g_dat_w-1 DOWNTO 0);
+    rdclk   : IN STD_LOGIC ;
+    rdreq   : IN STD_LOGIC ;
+    wrclk   : IN STD_LOGIC ;
+    wrreq   : IN STD_LOGIC ;
+    q       : OUT STD_LOGIC_VECTOR (g_dat_w-1 DOWNTO 0);
+    rdempty : OUT STD_LOGIC ;
+    rdusedw : OUT STD_LOGIC_VECTOR (tech_ceil_log2(g_nof_words)-1 DOWNTO 0);
+    wrfull  : OUT STD_LOGIC ;
+    wrusedw : OUT STD_LOGIC_VECTOR (tech_ceil_log2(g_nof_words)-1 DOWNTO 0)
+  );
+  END COMPONENT;
+  
+  COMPONENT ip_ultrascale_fifo_dc_mixed_widths IS
+  GENERIC (
+    g_nof_words : NATURAL := 1024;  -- FIFO size in nof wr_dat words
+    g_wrdat_w   : NATURAL := 20;
+    g_rddat_w   : NATURAL := 10
+  );
+  PORT (
+    aclr    : IN STD_LOGIC  := '0';
+    data    : IN STD_LOGIC_VECTOR (g_wrdat_w-1 DOWNTO 0);
+    rdclk   : IN STD_LOGIC ;
+    rdreq   : IN STD_LOGIC ;
+    wrclk   : IN STD_LOGIC ;
+    wrreq   : IN STD_LOGIC ;
+    q       : OUT STD_LOGIC_VECTOR (g_rddat_w-1 DOWNTO 0);
+    rdempty : OUT STD_LOGIC ;
+    rdusedw : OUT STD_LOGIC_VECTOR (tech_ceil_log2(g_nof_words*g_wrdat_w/g_rddat_w)-1 DOWNTO 0);
+    wrfull  : OUT STD_LOGIC ;
+    wrusedw : OUT STD_LOGIC_VECTOR (tech_ceil_log2(g_nof_words)-1 DOWNTO 0)
+  );
+  END COMPONENT;
   
- 
 END tech_fifo_component_pkg;
diff --git a/libraries/technology/fifo/tech_fifo_dc.vhd b/libraries/technology/fifo/tech_fifo_dc.vhd
index 179aa1ff4cc2c73789dd245c1e5ef38871766008..08fd6a67589cb527a4140aae253efe34e63bf22e 100644
--- a/libraries/technology/fifo/tech_fifo_dc.vhd
+++ b/libraries/technology/fifo/tech_fifo_dc.vhd
@@ -31,6 +31,7 @@ LIBRARY ip_arria10_fifo_lib;
 LIBRARY ip_arria10_e3sge3_fifo_lib;
 LIBRARY ip_arria10_e1sg_fifo_lib;
 LIBRARY ip_arria10_e2sg_fifo_lib;
+LIBRARY ip_ultrascale_fifo_lib;
 
 ENTITY tech_fifo_dc IS
   GENERIC (
@@ -89,4 +90,10 @@ BEGIN
     PORT MAP (aclr, data, rdclk, rdreq, wrclk, wrreq, q, rdempty, rdusedw, wrfull, wrusedw);
   END GENERATE;
 
+  gen_ip_ultrascale : IF g_technology=c_tech_ultrascale GENERATE
+    u0 : ip_ultrascale_fifo_dc
+    GENERIC MAP (g_dat_w, g_nof_words)
+    PORT MAP (aclr, data, rdclk, rdreq, wrclk, wrreq, q, rdempty, rdusedw, wrfull, wrusedw);
+  END GENERATE;
+
 END ARCHITECTURE;
diff --git a/libraries/technology/fifo/tech_fifo_dc_mixed_widths.vhd b/libraries/technology/fifo/tech_fifo_dc_mixed_widths.vhd
index 58352cd3a6d44119d28b98925d9dff48a8a28a33..d3a654dfdcc72953d6f39a81e41219d8d528b0fc 100644
--- a/libraries/technology/fifo/tech_fifo_dc_mixed_widths.vhd
+++ b/libraries/technology/fifo/tech_fifo_dc_mixed_widths.vhd
@@ -31,6 +31,7 @@ LIBRARY ip_arria10_fifo_lib;
 LIBRARY ip_arria10_e3sge3_fifo_lib;
 LIBRARY ip_arria10_e1sg_fifo_lib;
 LIBRARY ip_arria10_e2sg_fifo_lib;
+LIBRARY ip_ultrascale_fifo_lib;
 
 ENTITY tech_fifo_dc_mixed_widths IS
   GENERIC (
@@ -89,4 +90,10 @@ BEGIN
     PORT MAP (aclr, data, rdclk, rdreq, wrclk, wrreq, q, rdempty, rdusedw, wrfull, wrusedw);
   END GENERATE;
  
+  gen_ip_ultrascale : IF g_technology=c_tech_ultrascale GENERATE
+    u0 : ip_ultrascale_fifo_dc_mixed_widths
+    GENERIC MAP (g_nof_words, g_wrdat_w, g_rddat_w)
+    PORT MAP (aclr, data, rdclk, rdreq, wrclk, wrreq, q, rdempty, rdusedw, wrfull, wrusedw);
+  END GENERATE;
+
 END ARCHITECTURE;
diff --git a/libraries/technology/fifo/tech_fifo_sc.vhd b/libraries/technology/fifo/tech_fifo_sc.vhd
index 2694bc2e8b95d2baaa56cb590d57509abf075d3d..b2543bd5ce9a9e6ff76a6591197cd8a09dd629d7 100644
--- a/libraries/technology/fifo/tech_fifo_sc.vhd
+++ b/libraries/technology/fifo/tech_fifo_sc.vhd
@@ -31,6 +31,7 @@ LIBRARY ip_arria10_fifo_lib;
 LIBRARY ip_arria10_e3sge3_fifo_lib;
 LIBRARY ip_arria10_e1sg_fifo_lib;
 LIBRARY ip_arria10_e2sg_fifo_lib;
+LIBRARY ip_ultrascale_fifo_lib;
 
 ENTITY tech_fifo_sc IS
   GENERIC (
@@ -87,4 +88,10 @@ BEGIN
     PORT MAP (aclr, clock, data, rdreq, wrreq, empty, full, q, usedw);
   END GENERATE;
   
+  gen_ip_ultrascale : IF g_technology=c_tech_ultrascale GENERATE
+    u0 : ip_ultrascale_fifo_sc
+    GENERIC MAP (g_dat_w, g_nof_words)
+    PORT MAP (aclr, clock, data, rdreq, wrreq, empty, full, q, usedw);
+  END GENERATE;
+
 END ARCHITECTURE;
diff --git a/libraries/technology/ip_ultrascale/fifo/README.txt b/libraries/technology/ip_ultrascale/fifo/README.txt
new file mode 100755
index 0000000000000000000000000000000000000000..bcf8b55de24242e455a4481c6c64b948f0d04797
--- /dev/null
+++ b/libraries/technology/ip_ultrascale/fifo/README.txt
@@ -0,0 +1,61 @@
+README.txt for $HDL_WORK/libraries/technology/ip_arria10/fifo
+
+Contents:
+
+1) FIFO components
+2) Arria10 IP
+3) Implementation options (LUTs or block RAM)
+4) Synthesis trials
+5) Issues
+
+
+1) FIFO components:
+
+  ip_arria10_fifo_sc              = Single clock FIFO
+  ip_arria10_fifo_dc              = Dual clock FIFO
+  ip_arria10_fifo_dc_mixed_widths = Dual clock FIFO with different read and write data widths (ratio power of 2)
+  
+
+2) Arria10 IP
+
+  The IP was ported from Stratix IV by:
+  
+    . copy original MegaWizard <fifo_name>.vhd file
+    . rename <fifo_name>.vhd into ip_arria10_<fifo_name>.vhd (also replace name inside the file)
+    . commit the fifo/ip_arria10_<fifo_name>.vhd to preserve the MegaWizard original
+    . open in to Quartus 14, set device family to Arria10 and finish automatically convert to Qsys
+    . then generate HDL (select VHDL for both sim and synth) and finish to save it as ip_arria10_<fifo_name>.qsys
+    
+  this yields:
+  
+    ip_arria10_fifo_sc.qsys
+    ip_arria10_fifo_dc.qsys
+    ip_arria10_fifo_dc_mixed_widths.qsys
+  
+  The Arria10 FIFO IP still uses the altera_mf package (so not the altera_lnsim package as with the block RAM). The
+  FIFOs map to the altera_mf components to scfifo, dcfifo and dcfifo_mixed_widths.
+  
+  The IP only needs to be generated with ./generate_ip.sh if it need to be modified, because the ip_arria10_fifo_*.vhd
+  directly instantiates the altera_mf component.
+  
+  The instantiation is copied manually from the ip_arria10_fifo_*/fifo_140/sim/ip_arria10_fifo_*.vhd and 
+  saved in the <fifo_name>.vhd file. So then the MegaWizard vhd file is overwritten, but that is fine because it is 
+  no longer needed, it could easily be derived from the original in $UNB and it is still as a previous verion in SVN.
+   
+
+3) Implementation options (LUTs or block RAM)
+
+  The IP FIFO can be set to use LUTs (MLAB) or block RAM (M20K) via g_use_eab.
+  
+
+4) Synthesis trials
+
+  The quartus/fifo.qpf Quartus project was used to verify that the FIFO IP actually synthesise to the appropriate FPGA resources.
+  Use the Quartus GUI to manually select a top level component for synthesis e.g. by right clicking the entity vhd file
+  in the file tab of the Quartus project navigator window.
+  Then check the resource usage in the synthesis and fitter reports.
+
+
+5) Issues
+
+  No issues.
\ No newline at end of file
diff --git a/libraries/technology/ip_ultrascale/fifo/hdllib.cfg b/libraries/technology/ip_ultrascale/fifo/hdllib.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..2fac5fdfdd043644c8d2a51341b30723d4e08dc1
--- /dev/null
+++ b/libraries/technology/ip_ultrascale/fifo/hdllib.cfg
@@ -0,0 +1,19 @@
+hdl_lib_name = ip_ultrascale_fifo
+hdl_library_clause_name = ip_ultrascale_fifo_lib
+hdl_lib_uses_synth = technology
+hdl_lib_uses_sim = 
+hdl_lib_technology = ip_ultrascale
+
+synth_files =
+    ip_ultrascale_fifo_sc.vhd
+    ip_ultrascale_fifo_dc.vhd
+    ip_ultrascale_fifo_dc_mixed_widths.vhd
+    
+test_bench_files =
+
+
+[modelsim_project_file]
+
+
+[quartus_project_file]
+
diff --git a/libraries/technology/ip_ultrascale/fifo/ip_ultrascale_fifo_dc.vhd b/libraries/technology/ip_ultrascale/fifo/ip_ultrascale_fifo_dc.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..3f95a96d735e2aa5d819d136f3bb87355d839b25
--- /dev/null
+++ b/libraries/technology/ip_ultrascale/fifo/ip_ultrascale_fifo_dc.vhd
@@ -0,0 +1,180 @@
+-------------------------------------------------------------------------------
+--
+-- Copyright 2023
+-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-------------------------------------------------------------------------------
+-- Purpose: Instantiate FIFO IP with generics
+-- Description:
+--   Copied component instantiation from Vivado XPM template
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.all;
+
+LIBRARY technology_lib;
+USE technology_lib.technology_pkg.ALL;
+
+LIBRARY xpm;
+USE xpm.vcomponents.ALL;
+
+ENTITY ip_ultrascale_fifo_dc IS
+  GENERIC (
+    g_dat_w     : NATURAL := 20;
+    g_nof_words : NATURAL := 1024
+  );
+  PORT (
+    aclr    : IN STD_LOGIC  := '0';
+    data    : IN STD_LOGIC_VECTOR (g_dat_w-1 DOWNTO 0);
+    rdclk   : IN STD_LOGIC ;
+    rdreq   : IN STD_LOGIC ;
+    wrclk   : IN STD_LOGIC ;
+    wrreq   : IN STD_LOGIC ;
+    q       : OUT STD_LOGIC_VECTOR (g_dat_w-1 DOWNTO 0);
+    rdempty : OUT STD_LOGIC ;
+    rdusedw : OUT STD_LOGIC_VECTOR (tech_ceil_log2(g_nof_words)-1 DOWNTO 0);
+    wrfull  : OUT STD_LOGIC ;
+    wrusedw : OUT STD_LOGIC_VECTOR (tech_ceil_log2(g_nof_words)-1 DOWNTO 0)
+  );
+END ip_ultrascale_fifo_dc;
+
+
+ARCHITECTURE SYN OF ip_ultrascale_fifo_dc IS
+
+BEGIN
+
+   -- xpm_fifo_async: Asynchronous FIFO
+   -- Xilinx Parameterized Macro, version 2022.1
+
+   xpm_fifo_async_inst : xpm_fifo_async
+   generic map (
+      CASCADE_HEIGHT => 0,        -- DECIMAL
+      CDC_SYNC_STAGES => 3,       -- DECIMAL
+      DOUT_RESET_VALUE => "0",    -- String
+      ECC_MODE => "no_ecc",       -- String
+      FIFO_MEMORY_TYPE => "auto", -- String
+      FIFO_READ_LATENCY => 1,     -- DECIMAL
+      FIFO_WRITE_DEPTH => g_nof_words,   -- DECIMAL
+      FULL_RESET_VALUE => 0,      -- DECIMAL
+      PROG_EMPTY_THRESH => 10,    -- DECIMAL
+      PROG_FULL_THRESH => 10,     -- DECIMAL
+      RD_DATA_COUNT_WIDTH => tech_ceil_log2(g_nof_words),   -- DECIMAL
+      READ_DATA_WIDTH => g_dat_w,  -- DECIMAL
+      READ_MODE => "std",          -- String
+      RELATED_CLOCKS => 0,         -- DECIMAL
+      SIM_ASSERT_CHK => 0,         -- DECIMAL; 0=disable simulation messages, 1=enable simulation messages
+      USE_ADV_FEATURES => "0404",  -- String
+      WAKEUP_TIME => 0,            -- DECIMAL
+      WRITE_DATA_WIDTH => g_dat_w, -- DECIMAL
+      WR_DATA_COUNT_WIDTH => tech_ceil_log2(g_nof_words)    -- DECIMAL
+   )
+   port map (
+      almost_empty => OPEN,        -- 1-bit output: Almost Empty : When asserted, this signal indicates that
+                                      -- only one more read can be performed before the FIFO goes to empty.
+
+      almost_full => OPEN,     -- 1-bit output: Almost Full: When asserted, this signal indicates that
+                                      -- only one more write can be performed before the FIFO is full.
+
+      data_valid => OPEN,       -- 1-bit output: Read Data Valid: When asserted, this signal indicates
+                                      -- that valid data is available on the output bus (dout).
+
+      dbiterr => OPEN,             -- 1-bit output: Double Bit Error: Indicates that the ECC decoder
+                                      -- detected a double-bit error and data in the FIFO core is corrupted.
+
+      dout => q,                      -- READ_DATA_WIDTH-bit output: Read Data: The output data bus is driven
+                                      -- when reading the FIFO.
+
+      empty => rdempty,               -- 1-bit output: Empty Flag: When asserted, this signal indicates that
+                                      -- the FIFO is empty. Read requests are ignored when the FIFO is empty,
+                                      -- initiating a read while empty is not destructive to the FIFO.
+
+      full => wrfull,                 -- 1-bit output: Full Flag: When asserted, this signal indicates that the
+                                      -- FIFO is full. Write requests are ignored when the FIFO is full,
+                                      -- initiating a write when the FIFO is full is not destructive to the
+                                      -- contents of the FIFO.
+
+      overflow => OPEN,               -- 1-bit output: Overflow: This signal indicates that a write request
+                                      -- (wren) during the prior clock cycle was rejected, because the FIFO is
+                                      -- full. Overflowing the FIFO is not destructive to the contents of the
+                                      -- FIFO.
+
+      prog_empty => OPEN,             -- 1-bit output: Programmable Empty: This signal is asserted when the
+                                      -- number of words in the FIFO is less than or equal to the programmable
+                                      -- empty threshold value. It is de-asserted when the number of words in
+                                      -- the FIFO exceeds the programmable empty threshold value.
+
+      prog_full => OPEN,              -- 1-bit output: Programmable Full: This signal is asserted when the
+                                      -- number of words in the FIFO is greater than or equal to the
+                                      -- programmable full threshold value. It is de-asserted when the number
+                                      -- of words in the FIFO is less than the programmable full threshold
+                                      -- value.
+
+      rd_data_count => rdusedw,       -- RD_DATA_COUNT_WIDTH-bit output: Read Data Count: This bus indicates
+                                      -- the number of words read from the FIFO.
+
+      rd_rst_busy => OPEN,            -- 1-bit output: Read Reset Busy: Active-High indicator that the FIFO
+                                      -- read domain is currently in a reset state.
+
+      sbiterr => OPEN,                -- 1-bit output: Single Bit Error: Indicates that the ECC decoder
+                                      -- detected and fixed a single-bit error.
+
+      underflow => OPEN,              -- 1-bit output: Underflow: Indicates that the read request (rd_en)
+                                      -- during the previous clock cycle was rejected because the FIFO is
+                                      -- empty. Under flowing the FIFO is not destructive to the FIFO.
+
+      wr_ack => OPEN,                 -- 1-bit output: Write Acknowledge: This signal indicates that a write
+                                      -- request (wr_en) during the prior clock cycle is succeeded.
+
+      wr_data_count => wrusedw,       -- WR_DATA_COUNT_WIDTH-bit output: Write Data Count: This bus indicates
+                                      -- the number of words written into the FIFO.
+
+      wr_rst_busy => OPEN,            -- 1-bit output: Write Reset Busy: Active-High indicator that the FIFO
+                                      -- write domain is currently in a reset state.
+
+      din => data,                    -- WRITE_DATA_WIDTH-bit input: Write Data: The input data bus used when
+                                      -- writing the FIFO.
+
+      injectdbiterr => '0',           -- 1-bit input: Double Bit Error Injection: Injects a double bit error if
+                                      -- the ECC feature is used on block RAMs or UltraRAM macros.
+
+      injectsbiterr => '0',           -- 1-bit input: Single Bit Error Injection: Injects a single bit error if
+                                      -- the ECC feature is used on block RAMs or UltraRAM macros.
+
+      rd_clk => rdclk,                -- 1-bit input: Read clock: Used for read operation. rd_clk must be a
+                                      -- free running clock.
+
+      rd_en => rdreq,                 -- 1-bit input: Read Enable: If the FIFO is not empty, asserting this
+                                      -- signal causes data (on dout) to be read from the FIFO. Must be held
+                                      -- active-low when rd_rst_busy is active high.
+
+      rst => aclr,                     -- 1-bit input: Reset: Must be synchronous to wr_clk. The clock(s) can be
+                                      -- unstable at the time of applying reset, but reset must be released
+                                      -- only after the clock(s) is/are stable.
+
+      sleep => '0',                   -- 1-bit input: Dynamic power saving: If sleep is High, the memory/fifo
+                                      -- block is in power saving mode.
+
+      wr_clk => wrclk,                -- 1-bit input: Write clock: Used for write operation. wr_clk must be a
+                                      -- free running clock.
+
+      wr_en => wrreq                  -- 1-bit input: Write Enable: If the FIFO is not full, asserting this
+                                      -- signal causes data (on din) to be written to the FIFO. Must be held
+                                      -- active-low when rst or wr_rst_busy is active high.
+
+   );
+
+   -- End of xpm_fifo_async_inst instantiation
+
+END SYN;
diff --git a/libraries/technology/ip_ultrascale/fifo/ip_ultrascale_fifo_dc_mixed_widths.vhd b/libraries/technology/ip_ultrascale/fifo/ip_ultrascale_fifo_dc_mixed_widths.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..5ca23625aa3ab7b625f9287ce225e657ba4645c3
--- /dev/null
+++ b/libraries/technology/ip_ultrascale/fifo/ip_ultrascale_fifo_dc_mixed_widths.vhd
@@ -0,0 +1,185 @@
+-------------------------------------------------------------------------------
+--
+-- Copyright 2023
+-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-------------------------------------------------------------------------------
+-- Purpose: Instantiate FIFO IP with generics
+-- Description:
+--   Copied component instantiation from Vivado XPM template
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.all;
+
+LIBRARY technology_lib;
+USE technology_lib.technology_pkg.ALL;
+
+LIBRARY xpm;
+USE xpm.vcomponents.ALL;
+
+ENTITY ip_ultrascale_fifo_dc_mixed_widths IS
+  GENERIC (
+    g_nof_words : NATURAL := 1024;  -- FIFO size in nof wr_dat words
+    g_wrdat_w   : NATURAL := 20;
+    g_rddat_w   : NATURAL := 10
+  );
+  PORT (
+    aclr    : IN STD_LOGIC  := '0';
+    data    : IN STD_LOGIC_VECTOR (g_wrdat_w-1 DOWNTO 0);
+    rdclk   : IN STD_LOGIC ;
+    rdreq   : IN STD_LOGIC ;
+    wrclk   : IN STD_LOGIC ;
+    wrreq   : IN STD_LOGIC ;
+    q       : OUT STD_LOGIC_VECTOR (g_rddat_w-1 DOWNTO 0);
+    rdempty : OUT STD_LOGIC ;
+    rdusedw : OUT STD_LOGIC_VECTOR (tech_ceil_log2(g_nof_words*g_wrdat_w/g_rddat_w)-1 DOWNTO 0);
+    wrfull  : OUT STD_LOGIC ;
+    wrusedw : OUT STD_LOGIC_VECTOR (tech_ceil_log2(g_nof_words)-1 DOWNTO 0)
+  );
+END ip_ultrascale_fifo_dc_mixed_widths;
+
+
+ARCHITECTURE SYN OF ip_ultrascale_fifo_dc_mixed_widths IS
+
+    
+BEGIN
+
+
+
+   -- xpm_fifo_async: Asynchronous FIFO
+   -- Xilinx Parameterized Macro, version 2022.1
+
+   xpm_fifo_async_inst : xpm_fifo_async
+   generic map (
+      CASCADE_HEIGHT => 0,        -- DECIMAL
+      CDC_SYNC_STAGES => 3,       -- DECIMAL
+      DOUT_RESET_VALUE => "0",    -- String
+      ECC_MODE => "no_ecc",       -- String
+      FIFO_MEMORY_TYPE => "auto", -- String
+      FIFO_READ_LATENCY => 1,     -- DECIMAL
+      FIFO_WRITE_DEPTH => g_nof_words,   -- DECIMAL
+      FULL_RESET_VALUE => 0,      -- DECIMAL
+      PROG_EMPTY_THRESH => 10,    -- DECIMAL
+      PROG_FULL_THRESH => 10,     -- DECIMAL
+      RD_DATA_COUNT_WIDTH => tech_ceil_log2(g_nof_words*g_wrdat_w/g_rddat_w),   -- DECIMAL
+      READ_DATA_WIDTH => g_rddat_w,      -- DECIMAL
+      READ_MODE => "std",         -- String
+      RELATED_CLOCKS => 0,        -- DECIMAL
+      SIM_ASSERT_CHK => 0,        -- DECIMAL; 0=disable simulation messages, 1=enable simulation messages
+      USE_ADV_FEATURES => "0404", -- String
+      WAKEUP_TIME => 0,           -- DECIMAL
+      WRITE_DATA_WIDTH => g_wrdat_w,     -- DECIMAL
+      WR_DATA_COUNT_WIDTH => tech_ceil_log2(g_nof_words)    -- DECIMAL
+   )
+   port map (
+      almost_empty => OPEN,        -- 1-bit output: Almost Empty : When asserted, this signal indicates that
+                                      -- only one more read can be performed before the FIFO goes to empty.
+
+      almost_full => OPEN,     -- 1-bit output: Almost Full: When asserted, this signal indicates that
+                                      -- only one more write can be performed before the FIFO is full.
+
+      data_valid => OPEN,       -- 1-bit output: Read Data Valid: When asserted, this signal indicates
+                                      -- that valid data is available on the output bus (dout).
+
+      dbiterr => OPEN,             -- 1-bit output: Double Bit Error: Indicates that the ECC decoder
+                                      -- detected a double-bit error and data in the FIFO core is corrupted.
+
+      dout => q,                      -- READ_DATA_WIDTH-bit output: Read Data: The output data bus is driven
+                                      -- when reading the FIFO.
+
+      empty => rdempty,               -- 1-bit output: Empty Flag: When asserted, this signal indicates that
+                                      -- the FIFO is empty. Read requests are ignored when the FIFO is empty,
+                                      -- initiating a read while empty is not destructive to the FIFO.
+
+      full => wrfull,                 -- 1-bit output: Full Flag: When asserted, this signal indicates that the
+                                      -- FIFO is full. Write requests are ignored when the FIFO is full,
+                                      -- initiating a write when the FIFO is full is not destructive to the
+                                      -- contents of the FIFO.
+
+      overflow => OPEN,               -- 1-bit output: Overflow: This signal indicates that a write request
+                                      -- (wren) during the prior clock cycle was rejected, because the FIFO is
+                                      -- full. Overflowing the FIFO is not destructive to the contents of the
+                                      -- FIFO.
+
+      prog_empty => OPEN,             -- 1-bit output: Programmable Empty: This signal is asserted when the
+                                      -- number of words in the FIFO is less than or equal to the programmable
+                                      -- empty threshold value. It is de-asserted when the number of words in
+                                      -- the FIFO exceeds the programmable empty threshold value.
+
+      prog_full => OPEN,              -- 1-bit output: Programmable Full: This signal is asserted when the
+                                      -- number of words in the FIFO is greater than or equal to the
+                                      -- programmable full threshold value. It is de-asserted when the number
+                                      -- of words in the FIFO is less than the programmable full threshold
+                                      -- value.
+
+      rd_data_count => rdusedw,       -- RD_DATA_COUNT_WIDTH-bit output: Read Data Count: This bus indicates
+                                      -- the number of words read from the FIFO.
+
+      rd_rst_busy => OPEN,            -- 1-bit output: Read Reset Busy: Active-High indicator that the FIFO
+                                      -- read domain is currently in a reset state.
+
+      sbiterr => OPEN,                -- 1-bit output: Single Bit Error: Indicates that the ECC decoder
+                                      -- detected and fixed a single-bit error.
+
+      underflow => OPEN,              -- 1-bit output: Underflow: Indicates that the read request (rd_en)
+                                      -- during the previous clock cycle was rejected because the FIFO is
+                                      -- empty. Under flowing the FIFO is not destructive to the FIFO.
+
+      wr_ack => OPEN,                 -- 1-bit output: Write Acknowledge: This signal indicates that a write
+                                      -- request (wr_en) during the prior clock cycle is succeeded.
+
+      wr_data_count => wrusedw,       -- WR_DATA_COUNT_WIDTH-bit output: Write Data Count: This bus indicates
+                                      -- the number of words written into the FIFO.
+
+      wr_rst_busy => OPEN,            -- 1-bit output: Write Reset Busy: Active-High indicator that the FIFO
+                                      -- write domain is currently in a reset state.
+
+      din => data,                    -- WRITE_DATA_WIDTH-bit input: Write Data: The input data bus used when
+                                      -- writing the FIFO.
+
+      injectdbiterr => '0',           -- 1-bit input: Double Bit Error Injection: Injects a double bit error if
+                                      -- the ECC feature is used on block RAMs or UltraRAM macros.
+
+      injectsbiterr => '0',           -- 1-bit input: Single Bit Error Injection: Injects a single bit error if
+                                      -- the ECC feature is used on block RAMs or UltraRAM macros.
+
+      rd_clk => rdclk,                -- 1-bit input: Read clock: Used for read operation. rd_clk must be a
+                                      -- free running clock.
+
+      rd_en => rdreq,                 -- 1-bit input: Read Enable: If the FIFO is not empty, asserting this
+                                      -- signal causes data (on dout) to be read from the FIFO. Must be held
+                                      -- active-low when rd_rst_busy is active high.
+
+      rst => aclr,                     -- 1-bit input: Reset: Must be synchronous to wr_clk. The clock(s) can be
+                                      -- unstable at the time of applying reset, but reset must be released
+                                      -- only after the clock(s) is/are stable.
+
+      sleep => '0',                   -- 1-bit input: Dynamic power saving: If sleep is High, the memory/fifo
+                                      -- block is in power saving mode.
+
+      wr_clk => wrclk,                -- 1-bit input: Write clock: Used for write operation. wr_clk must be a
+                                      -- free running clock.
+
+      wr_en => wrreq                  -- 1-bit input: Write Enable: If the FIFO is not full, asserting this
+                                      -- signal causes data (on din) to be written to the FIFO. Must be held
+                                      -- active-low when rst or wr_rst_busy is active high.
+
+   );
+
+   -- End of xpm_fifo_async_inst instantiation
+
+
+END SYN;
diff --git a/libraries/technology/ip_ultrascale/fifo/ip_ultrascale_fifo_sc.vhd b/libraries/technology/ip_ultrascale/fifo/ip_ultrascale_fifo_sc.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..3d9d78d0ff0b17f16a4cf86e4984aaa51cdc6f36
--- /dev/null
+++ b/libraries/technology/ip_ultrascale/fifo/ip_ultrascale_fifo_sc.vhd
@@ -0,0 +1,173 @@
+-------------------------------------------------------------------------------
+--
+-- Copyright 2023
+-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-------------------------------------------------------------------------------
+-- Purpose: Instantiate FIFO IP with generics
+-- Description:
+--   Copied component instantiation from Vivado XPM template
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.all;
+
+LIBRARY technology_lib;
+USE technology_lib.technology_pkg.ALL;
+
+LIBRARY xpm;
+USE xpm.vcomponents.ALL;
+
+ENTITY ip_ultrascale_fifo_sc IS
+  GENERIC (
+    g_dat_w     : NATURAL := 20;
+    g_nof_words : NATURAL := 1024
+  );
+  PORT (
+    aclr    : IN STD_LOGIC ;
+    clock   : IN STD_LOGIC ;
+    data    : IN STD_LOGIC_VECTOR (g_dat_w-1 DOWNTO 0);
+    rdreq   : IN STD_LOGIC ;
+    wrreq   : IN STD_LOGIC ;
+    empty   : OUT STD_LOGIC ;
+    full    : OUT STD_LOGIC ;
+    q       : OUT STD_LOGIC_VECTOR (g_dat_w-1 DOWNTO 0) ;
+    usedw   : OUT STD_LOGIC_VECTOR (tech_ceil_log2(g_nof_words)-1 DOWNTO 0)
+  );
+END ip_ultrascale_fifo_sc;
+
+
+ARCHITECTURE SYN OF ip_ultrascale_fifo_sc IS
+
+BEGIN
+   -- xpm_fifo_sync: Synchronous FIFO
+   -- Xilinx Parameterized Macro, version 2022.1
+
+   xpm_fifo_sync_inst : xpm_fifo_sync
+   generic map (
+      CASCADE_HEIGHT => 0,        -- DECIMAL
+      DOUT_RESET_VALUE => "0",    -- String
+      ECC_MODE => "no_ecc",       -- String
+      FIFO_MEMORY_TYPE => "auto", -- String
+      FIFO_READ_LATENCY => 1,     -- DECIMAL
+      FIFO_WRITE_DEPTH => g_nof_words,   -- DECIMAL
+      FULL_RESET_VALUE => 0,      -- DECIMAL
+      PROG_EMPTY_THRESH => 10,    -- DECIMAL
+      PROG_FULL_THRESH => 10,     -- DECIMAL
+      RD_DATA_COUNT_WIDTH => tech_ceil_log2(g_nof_words),   -- DECIMAL
+      READ_DATA_WIDTH => g_dat_w,  -- DECIMAL
+      READ_MODE => "std",         -- String
+      SIM_ASSERT_CHK => 0,        -- DECIMAL; 0=disable simulation messages, 1=enable simulation messages
+      USE_ADV_FEATURES => "0404",  -- String
+      WAKEUP_TIME => 0,           -- DECIMAL
+      WRITE_DATA_WIDTH => g_dat_w, -- DECIMAL
+      WR_DATA_COUNT_WIDTH => tech_ceil_log2(g_nof_words)    -- DECIMAL
+
+   )
+   port map (
+      almost_empty => OPEN,           -- 1-bit output: Almost Empty : When asserted, this signal indicates that
+                                      -- only one more read can be performed before the FIFO goes to empty.
+
+      almost_full => OPEN,            -- 1-bit output: Almost Full: When asserted, this signal indicates that
+                                      -- only one more write can be performed before the FIFO is full.
+
+      data_valid => OPEN,             -- 1-bit output: Read Data Valid: When asserted, this signal indicates
+                                      -- that valid data is available on the output bus (dout).
+
+      dbiterr => OPEN,                -- 1-bit output: Double Bit Error: Indicates that the ECC decoder
+                                      -- detected a double-bit error and data in the FIFO core is corrupted.
+
+      dout => q,                      -- READ_DATA_WIDTH-bit output: Read Data: The output data bus is driven
+                                      -- when reading the FIFO.
+
+      empty => empty,                 -- 1-bit output: Empty Flag: When asserted, this signal indicates that
+                                      -- the FIFO is empty. Read requests are ignored when the FIFO is empty,
+                                      -- initiating a read while empty is not destructive to the FIFO.
+
+      full => full,                   -- 1-bit output: Full Flag: When asserted, this signal indicates that the
+                                      -- FIFO is full. Write requests are ignored when the FIFO is full,
+                                      -- initiating a write when the FIFO is full is not destructive to the
+                                      -- contents of the FIFO.
+
+      overflow => OPEN,               -- 1-bit output: Overflow: This signal indicates that a write request
+                                      -- (wren) during the prior clock cycle was rejected, because the FIFO is
+                                      -- full. Overflowing the FIFO is not destructive to the contents of the
+                                      -- FIFO.
+
+      prog_empty => OPEN,             -- 1-bit output: Programmable Empty: This signal is asserted when the
+                                      -- number of words in the FIFO is less than or equal to the programmable
+                                      -- empty threshold value. It is de-asserted when the number of words in
+                                      -- the FIFO exceeds the programmable empty threshold value.
+
+      prog_full => OPEN,              -- 1-bit output: Programmable Full: This signal is asserted when the
+                                      -- number of words in the FIFO is greater than or equal to the
+                                      -- programmable full threshold value. It is de-asserted when the number
+                                      -- of words in the FIFO is less than the programmable full threshold
+                                      -- value.
+
+      rd_data_count => OPEN,          -- RD_DATA_COUNT_WIDTH-bit output: Read Data Count: This bus indicates
+                                      -- the number of words read from the FIFO.
+
+      rd_rst_busy => OPEN,            -- 1-bit output: Read Reset Busy: Active-High indicator that the FIFO
+                                      -- read domain is currently in a reset state.
+
+      sbiterr => OPEN,                -- 1-bit output: Single Bit Error: Indicates that the ECC decoder
+                                      -- detected and fixed a single-bit error.
+
+      underflow => OPEN,              -- 1-bit output: Underflow: Indicates that the read request (rd_en)
+                                      -- during the previous clock cycle was rejected because the FIFO is
+                                      -- empty. Under flowing the FIFO is not destructive to the FIFO.
+
+      wr_ack => OPEN,                 -- 1-bit output: Write Acknowledge: This signal indicates that a write
+                                      -- request (wr_en) during the prior clock cycle is succeeded.
+
+      wr_data_count => usedw,         -- WR_DATA_COUNT_WIDTH-bit output: Write Data Count: This bus indicates
+                                      -- the number of words written into the FIFO.
+
+      wr_rst_busy => OPEN,            -- 1-bit output: Write Reset Busy: Active-High indicator that the FIFO
+                                      -- write domain is currently in a reset state.
+
+      din => data,                    -- WRITE_DATA_WIDTH-bit input: Write Data: The input data bus used when
+                                      -- writing the FIFO.
+
+      injectdbiterr => '0',           -- 1-bit input: Double Bit Error Injection: Injects a double bit error if
+                                      -- the ECC feature is used on block RAMs or UltraRAM macros.
+
+      injectsbiterr => '0',           -- 1-bit input: Single Bit Error Injection: Injects a single bit error if
+                                      -- the ECC feature is used on block RAMs or UltraRAM macros.
+
+      rd_en => rdreq,                 -- 1-bit input: Read Enable: If the FIFO is not empty, asserting this
+                                      -- signal causes data (on dout) to be read from the FIFO. Must be held
+                                      -- active-low when rd_rst_busy is active high.
+
+      rst => aclr,                    -- 1-bit input: Reset: Must be synchronous to wr_clk. The clock(s) can be
+                                      -- unstable at the time of applying reset, but reset must be released
+                                      -- only after the clock(s) is/are stable.
+
+      sleep => '0',                   -- 1-bit input: Dynamic power saving: If sleep is High, the memory/fifo
+                                      -- block is in power saving mode.
+
+      wr_clk => clock,                -- 1-bit input: Write clock: Used for write operation. wr_clk must be a
+                                      -- free running clock.
+
+      wr_en => wrreq                  -- 1-bit input: Write Enable: If the FIFO is not full, asserting this
+                                      -- signal causes data (on din) to be written to the FIFO. Must be held
+                                      -- active-low when rst or wr_rst_busy is active high.
+
+   );
+
+   -- End of xpm_fifo_async_inst instantiation
+
+END SYN;
diff --git a/libraries/technology/ip_ultrascale/ram/hdllib.cfg b/libraries/technology/ip_ultrascale/ram/hdllib.cfg
index 9565bca9038365fc714ee5af4de73b8e652ece8e..7e88f3e7e770086bc8b46c2afd57f97267437db3 100644
--- a/libraries/technology/ip_ultrascale/ram/hdllib.cfg
+++ b/libraries/technology/ip_ultrascale/ram/hdllib.cfg
@@ -11,7 +11,7 @@ synth_files =
     
 #    ip_ultrascale_ram_crwk_crw.vhd
     ip_ultrascale_ram_crw_crw.vhd
-#    ip_ultrascale_ram_cr_cw.vhd
+    ip_ultrascale_ram_cr_cw.vhd
 #    ip_ultrascale_ram_r_w.vhd
     
 test_bench_files =