From aa4a8d04cee63d64e4e0cfb0a97d0e2d7c52a1a1 Mon Sep 17 00:00:00 2001
From: lharnaldi <lharnaldi@gmail.com>
Date: Fri, 5 Aug 2022 10:21:32 -0300
Subject: [PATCH] =?UTF-8?q?Agrego=20los=20cores=20interpolador=20y=20decim?=
 =?UTF-8?q?ador.=20Tambi=C3=A9n=20el=20lfsr?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Makefile                                      |  5 +-
 cores/axis_decimator_v1_0/axis_decimator.vhd  | 80 +++++++++++++++++++
 cores/axis_decimator_v1_0/core_config.tcl     | 21 +++++
 .../axis_interpolator.vhd                     | 68 ++++++++++++++++
 cores/axis_interpolator_v1_0/core_config.tcl  | 21 +++++
 cores/axis_lfsr_v1_0/axis_lfsr.vhd            | 60 ++++++++++++++
 cores/axis_lfsr_v1_0/core_config.tcl          | 17 ++++
 7 files changed, 271 insertions(+), 1 deletion(-)
 create mode 100644 cores/axis_decimator_v1_0/axis_decimator.vhd
 create mode 100644 cores/axis_decimator_v1_0/core_config.tcl
 create mode 100644 cores/axis_interpolator_v1_0/axis_interpolator.vhd
 create mode 100644 cores/axis_interpolator_v1_0/core_config.tcl
 create mode 100644 cores/axis_lfsr_v1_0/axis_lfsr.vhd
 create mode 100644 cores/axis_lfsr_v1_0/core_config.tcl

diff --git a/Makefile b/Makefile
index d09bf6e..005f254 100644
--- a/Makefile
+++ b/Makefile
@@ -26,16 +26,19 @@ CORES = axi_axis_reader_v1_0 \
 				axis_constant_v1_0 \
 				axis_counter_v1_0 \
 				axis_dc_removal_v1_0 \
+				axis_decimator_v1_0 \
 				axis_fifo_v1_0 \
 				axis_generator_v1_0 \
 				axis_gpio_reader_i_v1_0 \
 				axis_gpio_reader_v1_0 \
 				axis_histogram_v1_0 \
 				axis_histogram_v1_1 \
+				axis_interpolator_v1_0 \
 				axis_lago_trigger_v1_0 \
 				axis_lago_trigger_v1_1 \
 				axis_lago_trigger_v1_2 \
 				axis_lago_trigger_v1_3 \
+				axis_lfsr_v1_0 \
 				axis_lpf_v1_0 \
 				axis_packetizer_v1_0 \
 				axis_ram_writer_v1_0 \
@@ -61,7 +64,7 @@ CORES = axi_axis_reader_v1_0 \
 				pwm_gen_v1_0 \
 				ramp_gen_v1_0 \
 				selector_v1_0 \
-				time_trig_gen_v1_0
+				time_trig_gen_v1_0 
 
 VIVADO = vivado -nolog -nojournal -mode batch
 XSCT = xsct
diff --git a/cores/axis_decimator_v1_0/axis_decimator.vhd b/cores/axis_decimator_v1_0/axis_decimator.vhd
new file mode 100644
index 0000000..532a52f
--- /dev/null
+++ b/cores/axis_decimator_v1_0/axis_decimator.vhd
@@ -0,0 +1,80 @@
+library ieee;
+
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity axis_decimator is
+  generic (
+    AXIS_TDATA_WIDTH : natural  := 32;
+    CNTR_WIDTH       : natural  := 32
+);
+port (
+  -- System signals
+  aclk           : in std_logic;
+  aresetn        : in std_logic;
+
+  cfg_data       : in std_logic_vector(CNTR_WIDTH-1 downto 0);
+
+  -- Slave side
+  s_axis_tready  : out std_logic;
+  s_axis_tdata   : in std_logic_vector(AXIS_TDATA_WIDTH-1 downto 0);
+  s_axis_tvalid  : in std_logic;
+
+  -- Master side
+  m_axis_tready  : in std_logic;
+  m_axis_tdata   : out std_logic_vector(AXIS_TDATA_WIDTH-1 downto 0);
+  m_axis_tvalid  : out std_logic
+);
+end axis_decimator;
+
+architecture rtl of axis_decimator is
+
+  signal int_tdata_reg, int_tdata_next : std_logic_vector(AXIS_TDATA_WIDTH-1 downto 0);
+  signal int_cntr_reg, int_cntr_next: unsigned(CNTR_WIDTH-1 downto 0);
+  signal int_tvalid_reg, int_tvalid_next: std_logic;
+  signal int_tready_reg, int_tready_next: std_logic;
+
+  signal int_comp_wire, int_tvalid_wire: std_logic;
+
+begin
+
+  int_comp_wire <= '1' when (int_cntr_reg < unsigned(cfg_data)) else '0';
+  int_tvalid_wire <= int_tready_reg and s_axis_tvalid;
+
+  process(aclk)
+  begin
+  if (rising_edge(aclk)) then
+  if (aresetn = '0') then
+    int_tdata_reg <= (others => '0');
+    int_tvalid_reg <= '0';
+    int_tready_reg <= '0';
+    int_cntr_reg <= (others => '0');
+  else
+    int_tdata_reg <= int_tdata_next;
+    int_tvalid_reg <= int_tvalid_next;
+    int_tready_reg <= int_tready_next;
+    int_cntr_reg <= int_cntr_next;
+  end if;
+  end if;
+  end process;
+
+
+  int_tready_next <= '1' when (int_tready_reg = '0') and (int_comp_wire = '1') else
+                     int_tready_reg;
+
+  int_cntr_next <= int_cntr_reg + 1 when (int_tvalid_wire = '1') and (int_comp_wire = '1') else
+                   (others => '0') when (int_tvalid_wire = '1') and (int_comp_wire = '0') else
+                   int_cntr_reg;
+
+  int_tdata_next <= s_axis_tdata when (int_tvalid_wire = '1') and (int_comp_wire = '0') else
+                        int_tdata_reg;
+
+  int_tvalid_next <= '1' when (int_tvalid_wire = '1') and (int_comp_wire = '0') else
+                    '0' when (m_axis_tready = '1') and (int_tvalid_reg = '1') else
+                    int_tvalid_reg;
+
+  s_axis_tready <= int_tready_reg;
+  m_axis_tdata <= int_tdata_reg;
+  m_axis_tvalid <= int_tvalid_reg;
+
+end rtl;
diff --git a/cores/axis_decimator_v1_0/core_config.tcl b/cores/axis_decimator_v1_0/core_config.tcl
new file mode 100644
index 0000000..f91a682
--- /dev/null
+++ b/cores/axis_decimator_v1_0/core_config.tcl
@@ -0,0 +1,21 @@
+set display_name {AXI4-Stream Decimator}
+
+set core [ipx::current_core]
+
+set_property DISPLAY_NAME $display_name $core
+set_property DESCRIPTION $display_name $core
+
+core_parameter AXIS_TDATA_WIDTH {AXIS TDATA WIDTH} {Width of the M_AXIS and S_AXIS data buses.}
+core_parameter CNTR_WIDTH {CNTR WIDTH} {Width of the counter register.}
+
+set bus [ipx::get_bus_interfaces -of_objects $core m_axis]
+set_property NAME M_AXIS $bus
+set_property INTERFACE_MODE master $bus
+
+set bus [ipx::get_bus_interfaces -of_objects $core s_axis]
+set_property NAME S_AXIS $bus
+set_property INTERFACE_MODE slave $bus
+
+set bus [ipx::get_bus_interfaces aclk]
+set parameter [ipx::get_bus_parameters -of_objects $bus ASSOCIATED_BUSIF]
+set_property VALUE M_AXIS:S_AXIS $parameter
diff --git a/cores/axis_interpolator_v1_0/axis_interpolator.vhd b/cores/axis_interpolator_v1_0/axis_interpolator.vhd
new file mode 100644
index 0000000..1e00717
--- /dev/null
+++ b/cores/axis_interpolator_v1_0/axis_interpolator.vhd
@@ -0,0 +1,68 @@
+library ieee;
+
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity axis_interpolator is
+  generic (
+    AXIS_TDATA_WIDTH : natural  := 32;
+    CNTR_WIDTH : natural  := 32
+);
+port (
+  -- System signals
+  aclk : in std_logic;
+  aresetn : in std_logic;
+
+  cfg_data : in std_logic_vector(CNTR_WIDTH-1 downto 0);
+
+  -- Slave side
+  s_axis_tready : out std_logic;
+  s_axis_tdata : in std_logic_vector(AXIS_TDATA_WIDTH-1 downto 0);
+  s_axis_tvalid : in std_logic;
+
+  -- Master side
+  m_axis_tready : in std_logic;
+  m_axis_tdata : out std_logic_vector(AXIS_TDATA_WIDTH-1 downto 0);
+  m_axis_tvalid : out std_logic
+);
+end axis_interpolator;
+
+architecture rtl of axis_interpolator is
+
+  signal int_tdata_reg, int_tdata_next : std_logic_vector(AXIS_TDATA_WIDTH-1 downto 0);
+  signal int_cntr_reg, int_cntr_next: unsigned(CNTR_WIDTH-1 downto 0);
+  signal int_tvalid_reg, int_tvalid_next: std_logic;
+
+begin
+
+  process(aclk)
+  begin
+  if (rising_edge(aclk)) then
+  if (aresetn = '0') then
+    int_tdata_reg <= (others => '0');
+    int_tvalid_reg <= '0';
+    int_cntr_reg <= (others => '0');
+  else
+    int_tdata_reg <= int_tdata_next;
+    int_tvalid_reg <= int_tvalid_next;
+    int_cntr_reg <= int_cntr_next;
+  end if;
+  end if;
+  end process;
+
+  int_tdata_next <= s_axis_tdata when (s_axis_tvalid = '1') and (int_tvalid_reg = '0') else
+                        int_tdata_reg;
+
+  int_cntr_next <= int_cntr_reg + 1 when (m_axis_tready = '1') and (int_tvalid_reg = '1') and (int_cntr_reg < unsigned(cfg_data)) else
+                   (others => '0') when (m_axis_tready = '1') and (int_tvalid_reg = '1') and not(int_cntr_reg < unsigned(cfg_data)) else
+                   int_cntr_reg;
+
+  int_tvalid_next <= '1' when (s_axis_tvalid = '1') and (int_tvalid_reg = '0') else
+                    '0' when (m_axis_tready = '1') and (int_tvalid_reg = '1') and not(int_cntr_reg < unsigned(cfg_data)) else
+                    int_tvalid_reg;
+
+  s_axis_tready <= not(int_tvalid_reg);
+  m_axis_tdata <= int_tdata_reg;
+  m_axis_tvalid <= int_tvalid_reg;
+
+end rtl;
diff --git a/cores/axis_interpolator_v1_0/core_config.tcl b/cores/axis_interpolator_v1_0/core_config.tcl
new file mode 100644
index 0000000..ad5d2c1
--- /dev/null
+++ b/cores/axis_interpolator_v1_0/core_config.tcl
@@ -0,0 +1,21 @@
+set display_name {AXI4-Stream Interpolator}
+
+set core [ipx::current_core]
+
+set_property DISPLAY_NAME $display_name $core
+set_property DESCRIPTION $display_name $core
+
+core_parameter AXIS_TDATA_WIDTH {AXIS TDATA WIDTH} {Width of the M_AXIS and S_AXIS data buses.}
+core_parameter CNTR_WIDTH {CNTR WIDTH} {Width of the counter register.}
+
+set bus [ipx::get_bus_interfaces -of_objects $core m_axis]
+set_property NAME M_AXIS $bus
+set_property INTERFACE_MODE master $bus
+
+set bus [ipx::get_bus_interfaces -of_objects $core s_axis]
+set_property NAME S_AXIS $bus
+set_property INTERFACE_MODE slave $bus
+
+set bus [ipx::get_bus_interfaces aclk]
+set parameter [ipx::get_bus_parameters -of_objects $bus ASSOCIATED_BUSIF]
+set_property VALUE M_AXIS:S_AXIS $parameter
diff --git a/cores/axis_lfsr_v1_0/axis_lfsr.vhd b/cores/axis_lfsr_v1_0/axis_lfsr.vhd
new file mode 100644
index 0000000..5e3c33e
--- /dev/null
+++ b/cores/axis_lfsr_v1_0/axis_lfsr.vhd
@@ -0,0 +1,60 @@
+library ieee;
+
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity axis_lfsr is
+  generic (
+            HAS_TREADY      : boolean := FALSE;
+            AXIS_TDATA_WIDTH: natural := 64
+          );
+  port (
+         -- System signals
+         aclk          : in std_logic;
+         aresetn       : in std_logic;
+
+         -- Master side
+         m_axis_tready : in std_logic;
+         m_axis_tvalid : out std_logic;
+         m_axis_tdata  : out std_logic_vector(AXIS_TDATA_WIDTH-1 downto 0)
+       );
+end axis_lfsr;
+
+architecture rtl of axis_lfsr is
+  signal int_lfsr_reg, int_lfsr_next : std_logic_vector(AXIS_TDATA_WIDTH-1 downto 0);
+  signal int_enbl_reg, int_enbl_next : std_logic;
+  signal tmp_sig                     : std_logic;
+
+begin
+
+  process(aclk)
+  begin
+    if rising_edge(aclk) then 
+      if aresetn = '0' then
+        int_lfsr_reg <= std_logic_vector(to_unsigned(16#5#, AXIS_TDATA_WIDTH));
+        int_enbl_reg <= '0';
+      else 
+        int_lfsr_reg <= int_lfsr_next;
+        int_enbl_reg <= int_enbl_next;
+      end if;
+      end if;
+    end process;
+    
+    tmp_sig <= int_lfsr_reg(AXIS_TDATA_WIDTH-2) xnor int_lfsr_reg(AXIS_TDATA_WIDTH-3);
+
+    WITH_TREADY: if (HAS_TREADY) generate
+      int_lfsr_next <= int_lfsr_reg(AXIS_TDATA_WIDTH-2 downto 0) & tmp_sig when (int_enbl_reg = '1' and m_axis_tready = '1') else 
+                       int_lfsr_reg;
+      int_enbl_next <= '1' when (int_enbl_reg = '0') else 
+                       int_enbl_reg;
+    end generate;
+    NO_TREADY: if (not HAS_TREADY) generate
+      int_lfsr_next <= int_lfsr_reg(AXIS_TDATA_WIDTH-2 downto 0) & tmp_sig when (int_enbl_reg = '1') else 
+                       int_lfsr_reg;
+      int_enbl_next <= '1' when (int_enbl_reg = '0') else 
+                       int_enbl_reg;
+    end generate;
+
+  m_axis_tdata <= int_lfsr_reg;
+  m_axis_tvalid <= int_enbl_reg;
+end rtl;
diff --git a/cores/axis_lfsr_v1_0/core_config.tcl b/cores/axis_lfsr_v1_0/core_config.tcl
new file mode 100644
index 0000000..cff0974
--- /dev/null
+++ b/cores/axis_lfsr_v1_0/core_config.tcl
@@ -0,0 +1,17 @@
+set display_name {AXI4-Stream Linear Feedback Shift-Register}
+
+set core [ipx::current_core]
+
+set_property DISPLAY_NAME $display_name $core
+set_property DESCRIPTION $display_name $core
+
+core_parameter AXIS_TDATA_WIDTH {AXIS TDATA WIDTH} {Width of the M_AXIS data bus.}
+core_parameter HAS_TREADY {HAS TREADY} {If TRUE, use m_axis_tready.}
+
+set bus [ipx::get_bus_interfaces -of_objects $core m_axis]
+set_property NAME M_AXIS $bus
+set_property INTERFACE_MODE master $bus
+
+set bus [ipx::get_bus_interfaces aclk]
+set parameter [ipx::get_bus_parameters -of_objects $bus ASSOCIATED_BUSIF]
+set_property VALUE M_AXIS $parameter
-- 
GitLab