diff --git a/LAB3/design/lab_3/hdl/lab_3_wrapper.vhd b/LAB3/design/lab_3/hdl/lab_3_wrapper.vhd
index 73dbf30..cc3d622 100644
--- a/LAB3/design/lab_3/hdl/lab_3_wrapper.vhd
+++ b/LAB3/design/lab_3/hdl/lab_3_wrapper.vhd
@@ -1,8 +1,8 @@
--Copyright 1986-2020 Xilinx, Inc. All Rights Reserved.
----------------------------------------------------------------------------------
--Tool Version: Vivado v.2020.2 (win64) Build 3064766 Wed Nov 18 09:12:45 MST 2020
---Date : Fri May 23 16:56:48 2025
---Host : Davide-Samsung running 64-bit major release (build 9200)
+--Date : Mon May 26 12:51:36 2025
+--Host : DavideASUS running 64-bit major release (build 9200)
--Command : generate_target lab_3_wrapper.bd
--Design : lab_3_wrapper
--Purpose : IP block netlist
@@ -48,6 +48,7 @@ architecture STRUCTURE of lab_3_wrapper is
tx_mclk_0 : out STD_LOGIC;
lfo_enable : in STD_LOGIC;
effect : in STD_LOGIC;
+ LED : out STD_LOGIC_VECTOR ( 15 downto 0 );
SPI_M_0_sck_t : out STD_LOGIC;
SPI_M_0_io1_o : out STD_LOGIC;
SPI_M_0_ss_t : out STD_LOGIC;
@@ -59,8 +60,7 @@ architecture STRUCTURE of lab_3_wrapper is
SPI_M_0_sck_o : out STD_LOGIC;
SPI_M_0_ss_i : in STD_LOGIC;
SPI_M_0_io1_i : in STD_LOGIC;
- SPI_M_0_io0_i : in STD_LOGIC;
- LED : out STD_LOGIC_VECTOR ( 15 downto 0 )
+ SPI_M_0_io0_i : in STD_LOGIC
);
end component lab_3;
component IOBUF is
diff --git a/LAB3/design/lab_3/lab_3.bd b/LAB3/design/lab_3/lab_3.bd
index 1a62d0e..0ad5c8f 100644
--- a/LAB3/design/lab_3/lab_3.bd
+++ b/LAB3/design/lab_3/lab_3.bd
@@ -6,8 +6,7 @@
"name": "lab_3",
"rev_ctrl_bd_flag": "RevCtrlBdOff",
"synth_flow_mode": "None",
- "tool_version": "2020.2",
- "validated": "true"
+ "tool_version": "2020.2"
},
"design_tree": {
"clk_wiz_0": "",
@@ -25,8 +24,8 @@
"effect_selector_0": "",
"led_level_controller_0": "",
"led_controller_0": "",
- "moving_average_filte_0": "",
"mute_controller_0": "",
+ "moving_average_filte_0": "",
"LFO_0": ""
},
"interface_ports": {
@@ -40,21 +39,9 @@
"type": "clk",
"direction": "I",
"parameters": {
- "CLK_DOMAIN": {
- "value": "lab_3_sys_clock",
- "value_src": "default"
- },
"FREQ_HZ": {
"value": "100000000"
},
- "FREQ_TOLERANCE_HZ": {
- "value": "0",
- "value_src": "default"
- },
- "INSERT_VIP": {
- "value": "0",
- "value_src": "default"
- },
"PHASE": {
"value": "0.000"
}
@@ -64,10 +51,6 @@
"type": "rst",
"direction": "I",
"parameters": {
- "INSERT_VIP": {
- "value": "0",
- "value_src": "default"
- },
"POLARITY": {
"value": "ACTIVE_HIGH"
}
@@ -117,19 +100,19 @@
"inst_hier_path": "clk_wiz_0",
"parameters": {
"CLKOUT1_JITTER": {
- "value": "149.337"
+ "value": "224.262"
},
"CLKOUT1_PHASE_ERROR": {
- "value": "122.577"
+ "value": "296.868"
},
"CLKOUT1_REQUESTED_OUT_FREQ": {
- "value": "100"
+ "value": "180"
},
"CLKOUT2_JITTER": {
- "value": "201.826"
+ "value": "316.348"
},
"CLKOUT2_PHASE_ERROR": {
- "value": "122.577"
+ "value": "296.868"
},
"CLKOUT2_REQUESTED_OUT_FREQ": {
"value": "22.579"
@@ -141,16 +124,16 @@
"value": "sys_clock"
},
"MMCM_CLKFBOUT_MULT_F": {
- "value": "7.000"
+ "value": "49.500"
},
"MMCM_CLKOUT0_DIVIDE_F": {
- "value": "7.000"
+ "value": "5.500"
},
"MMCM_CLKOUT1_DIVIDE": {
- "value": "31"
+ "value": "44"
},
"MMCM_DIVCLK_DIVIDE": {
- "value": "1"
+ "value": "5"
},
"NUM_OUT_CLKS": {
"value": "2"
@@ -201,7 +184,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -252,7 +235,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -305,7 +288,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -415,7 +398,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -481,7 +464,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -521,7 +504,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -630,7 +613,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -700,7 +683,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -748,7 +731,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -826,7 +809,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -896,7 +879,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -944,7 +927,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -994,7 +977,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -1100,7 +1083,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -1148,7 +1131,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -1212,200 +1195,6 @@
}
}
},
- "moving_average_filte_0": {
- "vlnv": "xilinx.com:module_ref:moving_average_filter_en:1.0",
- "xci_name": "lab_3_moving_average_filte_0_0",
- "xci_path": "ip\\lab_3_moving_average_filte_0_0\\lab_3_moving_average_filte_0_0.xci",
- "inst_hier_path": "moving_average_filte_0",
- "reference_info": {
- "ref_type": "hdl",
- "ref_name": "moving_average_filter_en",
- "boundary_crc": "0x0"
- },
- "interface_ports": {
- "m_axis": {
- "mode": "Master",
- "vlnv": "xilinx.com:interface:axis_rtl:1.0",
- "parameters": {
- "TDATA_NUM_BYTES": {
- "value": "3",
- "value_src": "auto"
- },
- "TDEST_WIDTH": {
- "value": "0",
- "value_src": "constant"
- },
- "TID_WIDTH": {
- "value": "0",
- "value_src": "constant"
- },
- "TUSER_WIDTH": {
- "value": "0",
- "value_src": "constant"
- },
- "HAS_TREADY": {
- "value": "1",
- "value_src": "constant"
- },
- "HAS_TSTRB": {
- "value": "0",
- "value_src": "constant"
- },
- "HAS_TKEEP": {
- "value": "0",
- "value_src": "constant"
- },
- "HAS_TLAST": {
- "value": "1",
- "value_src": "constant"
- },
- "FREQ_HZ": {
- "value": "100000000",
- "value_src": "ip_prop"
- },
- "PHASE": {
- "value": "0.0",
- "value_src": "ip_prop"
- },
- "CLK_DOMAIN": {
- "value": "/clk_wiz_0_clk_out1",
- "value_src": "ip_prop"
- }
- },
- "port_maps": {
- "TDATA": {
- "physical_name": "m_axis_tdata",
- "direction": "O",
- "left": "23",
- "right": "0"
- },
- "TLAST": {
- "physical_name": "m_axis_tlast",
- "direction": "O"
- },
- "TVALID": {
- "physical_name": "m_axis_tvalid",
- "direction": "O"
- },
- "TREADY": {
- "physical_name": "m_axis_tready",
- "direction": "I"
- }
- }
- },
- "s_axis": {
- "mode": "Slave",
- "vlnv": "xilinx.com:interface:axis_rtl:1.0",
- "parameters": {
- "TDATA_NUM_BYTES": {
- "value": "3",
- "value_src": "auto"
- },
- "TDEST_WIDTH": {
- "value": "0",
- "value_src": "constant"
- },
- "TID_WIDTH": {
- "value": "0",
- "value_src": "constant"
- },
- "TUSER_WIDTH": {
- "value": "0",
- "value_src": "constant"
- },
- "HAS_TREADY": {
- "value": "1",
- "value_src": "constant"
- },
- "HAS_TSTRB": {
- "value": "0",
- "value_src": "constant"
- },
- "HAS_TKEEP": {
- "value": "0",
- "value_src": "constant"
- },
- "HAS_TLAST": {
- "value": "1",
- "value_src": "constant"
- },
- "FREQ_HZ": {
- "value": "100000000",
- "value_src": "ip_prop"
- },
- "PHASE": {
- "value": "0.0",
- "value_src": "ip_prop"
- },
- "CLK_DOMAIN": {
- "value": "/clk_wiz_0_clk_out1",
- "value_src": "ip_prop"
- }
- },
- "port_maps": {
- "TDATA": {
- "physical_name": "s_axis_tdata",
- "direction": "I",
- "left": "23",
- "right": "0"
- },
- "TLAST": {
- "physical_name": "s_axis_tlast",
- "direction": "I"
- },
- "TVALID": {
- "physical_name": "s_axis_tvalid",
- "direction": "I"
- },
- "TREADY": {
- "physical_name": "s_axis_tready",
- "direction": "O"
- }
- }
- }
- },
- "ports": {
- "aclk": {
- "type": "clk",
- "direction": "I",
- "parameters": {
- "ASSOCIATED_BUSIF": {
- "value": "m_axis:s_axis",
- "value_src": "constant"
- },
- "ASSOCIATED_RESET": {
- "value": "aresetn",
- "value_src": "constant"
- },
- "FREQ_HZ": {
- "value": "100000000",
- "value_src": "ip_prop"
- },
- "PHASE": {
- "value": "0.0",
- "value_src": "ip_prop"
- },
- "CLK_DOMAIN": {
- "value": "/clk_wiz_0_clk_out1",
- "value_src": "ip_prop"
- }
- }
- },
- "aresetn": {
- "type": "rst",
- "direction": "I",
- "parameters": {
- "POLARITY": {
- "value": "ACTIVE_LOW",
- "value_src": "constant"
- }
- }
- },
- "enable_filter": {
- "direction": "I"
- }
- }
- },
"mute_controller_0": {
"vlnv": "xilinx.com:module_ref:mute_controller:1.0",
"xci_name": "lab_3_mute_controller_0_0",
@@ -1454,7 +1243,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -1524,7 +1313,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -1572,7 +1361,7 @@
"value_src": "constant"
},
"FREQ_HZ": {
- "value": "100000000",
+ "value": "180000000",
"value_src": "ip_prop"
},
"PHASE": {
@@ -1600,6 +1389,164 @@
}
}
},
+ "moving_average_filte_0": {
+ "vlnv": "xilinx.com:module_ref:moving_average_filter_en:1.0",
+ "xci_name": "lab_3_moving_average_filte_0_0",
+ "xci_path": "ip\\lab_3_moving_average_filte_0_0\\lab_3_moving_average_filte_0_0.xci",
+ "inst_hier_path": "moving_average_filte_0",
+ "reference_info": {
+ "ref_type": "hdl",
+ "ref_name": "moving_average_filter_en",
+ "boundary_crc": "0x0"
+ },
+ "interface_ports": {
+ "m_axis": {
+ "mode": "Master",
+ "vlnv": "xilinx.com:interface:axis_rtl:1.0",
+ "parameters": {
+ "TDATA_NUM_BYTES": {
+ "value": "3",
+ "value_src": "auto"
+ },
+ "TDEST_WIDTH": {
+ "value": "0",
+ "value_src": "constant"
+ },
+ "TID_WIDTH": {
+ "value": "0",
+ "value_src": "constant"
+ },
+ "TUSER_WIDTH": {
+ "value": "0",
+ "value_src": "constant"
+ },
+ "HAS_TREADY": {
+ "value": "1",
+ "value_src": "constant"
+ },
+ "HAS_TSTRB": {
+ "value": "0",
+ "value_src": "constant"
+ },
+ "HAS_TKEEP": {
+ "value": "0",
+ "value_src": "constant"
+ },
+ "HAS_TLAST": {
+ "value": "1",
+ "value_src": "constant"
+ }
+ },
+ "port_maps": {
+ "TDATA": {
+ "physical_name": "m_axis_tdata",
+ "direction": "O",
+ "left": "23",
+ "right": "0"
+ },
+ "TLAST": {
+ "physical_name": "m_axis_tlast",
+ "direction": "O"
+ },
+ "TVALID": {
+ "physical_name": "m_axis_tvalid",
+ "direction": "O"
+ },
+ "TREADY": {
+ "physical_name": "m_axis_tready",
+ "direction": "I"
+ }
+ }
+ },
+ "s_axis": {
+ "mode": "Slave",
+ "vlnv": "xilinx.com:interface:axis_rtl:1.0",
+ "parameters": {
+ "TDATA_NUM_BYTES": {
+ "value": "3",
+ "value_src": "auto"
+ },
+ "TDEST_WIDTH": {
+ "value": "0",
+ "value_src": "constant"
+ },
+ "TID_WIDTH": {
+ "value": "0",
+ "value_src": "constant"
+ },
+ "TUSER_WIDTH": {
+ "value": "0",
+ "value_src": "constant"
+ },
+ "HAS_TREADY": {
+ "value": "1",
+ "value_src": "constant"
+ },
+ "HAS_TSTRB": {
+ "value": "0",
+ "value_src": "constant"
+ },
+ "HAS_TKEEP": {
+ "value": "0",
+ "value_src": "constant"
+ },
+ "HAS_TLAST": {
+ "value": "1",
+ "value_src": "constant"
+ }
+ },
+ "port_maps": {
+ "TDATA": {
+ "physical_name": "s_axis_tdata",
+ "direction": "I",
+ "left": "23",
+ "right": "0"
+ },
+ "TLAST": {
+ "physical_name": "s_axis_tlast",
+ "direction": "I"
+ },
+ "TVALID": {
+ "physical_name": "s_axis_tvalid",
+ "direction": "I"
+ },
+ "TREADY": {
+ "physical_name": "s_axis_tready",
+ "direction": "O"
+ }
+ }
+ }
+ },
+ "ports": {
+ "aclk": {
+ "type": "clk",
+ "direction": "I",
+ "parameters": {
+ "ASSOCIATED_BUSIF": {
+ "value": "m_axis:s_axis",
+ "value_src": "constant"
+ },
+ "ASSOCIATED_RESET": {
+ "value": "aresetn",
+ "value_src": "constant"
+ }
+ }
+ },
+ "aresetn": {
+ "type": "rst",
+ "direction": "I",
+ "parameters": {
+ "POLARITY": {
+ "value": "ACTIVE_LOW",
+ "value_src": "constant"
+ }
+ }
+ },
+ "enable_filter": {
+ "direction": "I"
+ }
+ }
+ },
"LFO_0": {
"vlnv": "xilinx.com:module_ref:LFO:1.0",
"xci_name": "lab_3_LFO_0_0",
@@ -1651,18 +1598,6 @@
"HAS_TLAST": {
"value": "1",
"value_src": "constant"
- },
- "FREQ_HZ": {
- "value": "100000000",
- "value_src": "ip_prop"
- },
- "PHASE": {
- "value": "0.0",
- "value_src": "ip_prop"
- },
- "CLK_DOMAIN": {
- "value": "/clk_wiz_0_clk_out1",
- "value_src": "ip_prop"
}
},
"port_maps": {
@@ -1721,18 +1656,6 @@
"HAS_TLAST": {
"value": "1",
"value_src": "constant"
- },
- "FREQ_HZ": {
- "value": "100000000",
- "value_src": "ip_prop"
- },
- "PHASE": {
- "value": "0.0",
- "value_src": "ip_prop"
- },
- "CLK_DOMAIN": {
- "value": "/clk_wiz_0_clk_out1",
- "value_src": "ip_prop"
}
},
"port_maps": {
@@ -1769,18 +1692,6 @@
"ASSOCIATED_RESET": {
"value": "aresetn",
"value_src": "constant"
- },
- "FREQ_HZ": {
- "value": "100000000",
- "value_src": "ip_prop"
- },
- "PHASE": {
- "value": "0.0",
- "value_src": "ip_prop"
- },
- "CLK_DOMAIN": {
- "value": "/clk_wiz_0_clk_out1",
- "value_src": "ip_prop"
}
}
},
@@ -1812,36 +1723,12 @@
"axi4stream_spi_master_0/SPI_M"
]
},
- "axis_broadcaster_0_M00_AXIS": {
- "interface_ports": [
- "axis_broadcaster_0/M00_AXIS",
- "axis_dual_i2s_0/s_axis"
- ]
- },
- "mute_controller_0_m_axis": {
- "interface_ports": [
- "mute_controller_0/m_axis",
- "axis_broadcaster_0/S_AXIS"
- ]
- },
- "moving_average_filte_0_m_axis": {
- "interface_ports": [
- "balance_controller_0/s_axis",
- "moving_average_filte_0/m_axis"
- ]
- },
"balance_controller_0_m_axis": {
"interface_ports": [
"balance_controller_0/m_axis",
"volume_controller_0/s_axis"
]
},
- "volume_controller_0_m_axis": {
- "interface_ports": [
- "volume_controller_0/m_axis",
- "LFO_0/s_axis"
- ]
- },
"axis_broadcaster_0_M01_AXIS": {
"interface_ports": [
"axis_broadcaster_0/M01_AXIS",
@@ -1854,18 +1741,42 @@
"moving_average_filte_0/s_axis"
]
},
- "digilent_jstk2_0_m_axis": {
- "interface_ports": [
- "digilent_jstk2_0/m_axis",
- "axi4stream_spi_master_0/S_AXIS"
- ]
- },
"axi4stream_spi_master_0_M_AXIS": {
"interface_ports": [
"axi4stream_spi_master_0/M_AXIS",
"digilent_jstk2_0/s_axis"
]
},
+ "mute_controller_0_m_axis": {
+ "interface_ports": [
+ "mute_controller_0/m_axis",
+ "axis_broadcaster_0/S_AXIS"
+ ]
+ },
+ "moving_average_filte_0_m_axis": {
+ "interface_ports": [
+ "balance_controller_0/s_axis",
+ "moving_average_filte_0/m_axis"
+ ]
+ },
+ "volume_controller_0_m_axis": {
+ "interface_ports": [
+ "volume_controller_0/m_axis",
+ "LFO_0/s_axis"
+ ]
+ },
+ "axis_broadcaster_0_M00_AXIS": {
+ "interface_ports": [
+ "axis_broadcaster_0/M00_AXIS",
+ "axis_dual_i2s_0/s_axis"
+ ]
+ },
+ "digilent_jstk2_0_m_axis": {
+ "interface_ports": [
+ "digilent_jstk2_0/m_axis",
+ "axi4stream_spi_master_0/S_AXIS"
+ ]
+ },
"LFO_0_m_axis": {
"interface_ports": [
"LFO_0/m_axis",
@@ -1895,8 +1806,8 @@
"balance_controller_0/aclk",
"effect_selector_0/aclk",
"led_level_controller_0/aclk",
- "moving_average_filte_0/aclk",
"mute_controller_0/aclk",
+ "moving_average_filte_0/aclk",
"LFO_0/aclk"
]
},
@@ -1934,8 +1845,8 @@
"balance_controller_0/aresetn",
"effect_selector_0/aresetn",
"led_level_controller_0/aresetn",
- "moving_average_filte_0/aresetn",
"mute_controller_0/aresetn",
+ "moving_average_filte_0/aresetn",
"LFO_0/aresetn"
]
},
diff --git a/LAB3/design/lab_3/lab_3.bda b/LAB3/design/lab_3/lab_3.bda
index 8488c07..93a605f 100644
--- a/LAB3/design/lab_3/lab_3.bda
+++ b/LAB3/design/lab_3/lab_3.bda
@@ -21,22 +21,22 @@
- lab_3
- BC
-
-
active
2
PM
+
+ lab_3
+ BC
+
2
lab_3
VR
-
+
-
+
diff --git a/LAB3/sim/tb_LFO.vhd b/LAB3/sim/tb_LFO.vhd
new file mode 100644
index 0000000..718f562
--- /dev/null
+++ b/LAB3/sim/tb_LFO.vhd
@@ -0,0 +1,117 @@
+-- filepath: c:\DESD\LAB3\sim\tb_LFO.vhd
+LIBRARY ieee;
+USE ieee.std_logic_1164.ALL;
+USE ieee.numeric_std.ALL;
+
+ENTITY tb_LFO IS
+END tb_LFO;
+
+ARCHITECTURE sim OF tb_LFO IS
+
+ CONSTANT CHANNEL_LENGHT : INTEGER := 24;
+ CONSTANT JOYSTICK_LENGHT : INTEGER := 10;
+ CONSTANT TRIANGULAR_COUNTER_LENGHT: INTEGER := 10;
+ CONSTANT CLK_PERIOD_NS : INTEGER := 10;
+
+ SIGNAL aclk : STD_LOGIC := '0';
+ SIGNAL aresetn : STD_LOGIC := '0';
+
+ SIGNAL lfo_period : STD_LOGIC_VECTOR(JOYSTICK_LENGHT-1 DOWNTO 0) := (OTHERS => '0');
+ SIGNAL lfo_enable : STD_LOGIC := '0';
+
+ SIGNAL s_axis_tvalid : STD_LOGIC := '0';
+ SIGNAL s_axis_tdata : STD_LOGIC_VECTOR(CHANNEL_LENGHT-1 DOWNTO 0) := (OTHERS => '0');
+ SIGNAL s_axis_tlast : STD_LOGIC := '0';
+ SIGNAL s_axis_tready : STD_LOGIC;
+
+ SIGNAL m_axis_tvalid : STD_LOGIC;
+ SIGNAL m_axis_tdata : STD_LOGIC_VECTOR(CHANNEL_LENGHT-1 DOWNTO 0);
+ SIGNAL m_axis_tlast : STD_LOGIC;
+ SIGNAL m_axis_tready : STD_LOGIC := '1';
+
+ -- DUT
+ COMPONENT LFO
+ GENERIC (
+ CHANNEL_LENGHT : INTEGER := 24;
+ JOYSTICK_LENGHT : INTEGER := 10;
+ CLK_PERIOD_NS : INTEGER := 10;
+ TRIANGULAR_COUNTER_LENGHT : INTEGER := 10
+ );
+ PORT (
+ aclk : IN STD_LOGIC;
+ aresetn : IN STD_LOGIC;
+ lfo_period : IN STD_LOGIC_VECTOR(JOYSTICK_LENGHT-1 DOWNTO 0);
+ lfo_enable : IN STD_LOGIC;
+ s_axis_tvalid : IN STD_LOGIC;
+ s_axis_tdata : IN STD_LOGIC_VECTOR(CHANNEL_LENGHT-1 DOWNTO 0);
+ s_axis_tlast : IN STD_LOGIC;
+ s_axis_tready : OUT STD_LOGIC;
+ m_axis_tvalid : OUT STD_LOGIC;
+ m_axis_tdata : OUT STD_LOGIC_VECTOR(CHANNEL_LENGHT-1 DOWNTO 0);
+ m_axis_tlast : OUT STD_LOGIC;
+ m_axis_tready : IN STD_LOGIC
+ );
+ END COMPONENT;
+
+BEGIN
+
+ -- Clock generation
+ clk_proc : PROCESS
+ BEGIN
+ aclk <= '0';
+ WAIT FOR 5 ns;
+ aclk <= '1';
+ WAIT FOR 5 ns;
+ END PROCESS;
+
+ -- DUT instantiation
+ dut: LFO
+ GENERIC MAP (
+ CHANNEL_LENGHT => CHANNEL_LENGHT,
+ JOYSTICK_LENGHT => JOYSTICK_LENGHT,
+ CLK_PERIOD_NS => CLK_PERIOD_NS,
+ TRIANGULAR_COUNTER_LENGHT => TRIANGULAR_COUNTER_LENGHT
+ )
+ PORT MAP (
+ aclk => aclk,
+ aresetn => aresetn,
+ lfo_period => lfo_period,
+ lfo_enable => lfo_enable,
+ s_axis_tvalid => s_axis_tvalid,
+ s_axis_tdata => s_axis_tdata,
+ s_axis_tlast => s_axis_tlast,
+ s_axis_tready => s_axis_tready,
+ m_axis_tvalid => m_axis_tvalid,
+ m_axis_tdata => m_axis_tdata,
+ m_axis_tlast => m_axis_tlast,
+ m_axis_tready => m_axis_tready
+ );
+
+ -- Stimulus process
+ stim_proc : PROCESS
+ VARIABLE data_cnt : INTEGER := 0;
+ BEGIN
+ -- Reset
+ aresetn <= '0';
+ WAIT FOR 20 ns;
+ aresetn <= '1';
+ WAIT FOR 10 ns;
+
+ -- Imposta parametri iniziali
+ lfo_enable <= '1'; -- o '0' se vuoi testare la modalità bypass
+ lfo_period <= std_logic_vector(to_unsigned(512, JOYSTICK_LENGHT)); -- Valore fisso
+
+ -- Loop infinito: invia dati ad ogni ciclo di clock
+ WHILE TRUE LOOP
+ WAIT UNTIL rising_edge(aclk);
+ s_axis_tdata <= std_logic_vector(to_signed(data_cnt, CHANNEL_LENGHT));
+ s_axis_tvalid <= '1';
+ s_axis_tlast <= '0'; -- Puoi impostare a '1' ogni N campioni se vuoi testare tlast
+
+ IF s_axis_tready = '1' THEN
+ data_cnt := data_cnt + 1;
+ END IF;
+ END LOOP;
+ END PROCESS;
+
+END sim;
\ No newline at end of file
diff --git a/LAB3/src/LFO.vhd b/LAB3/src/LFO.vhd
index 41f35cf..f2ddb0b 100644
--- a/LAB3/src/LFO.vhd
+++ b/LAB3/src/LFO.vhd
@@ -42,18 +42,24 @@ ARCHITECTURE Behavioral OF LFO IS
CONSTANT LFO_CLK_CYCLES_MIN : INTEGER := LFO_COUNTER_BASE_CLK_CYCLES - ADJUSTMENT_FACTOR * (2 ** (JOYSTICK_LENGHT - 1)); -- 53_920 clk cycles
CONSTANT LFO_CLK_CYCLES_MAX : INTEGER := LFO_COUNTER_BASE_CLK_CYCLES + ADJUSTMENT_FACTOR * (2 ** (JOYSTICK_LENGHT - 1) - 1); -- 145_990 clk cycles
+ SIGNAL step_clk_cycles_delta : INTEGER RANGE - 2 ** (JOYSTICK_LENGHT - 1) * ADJUSTMENT_FACTOR TO (2 ** (JOYSTICK_LENGHT - 1) - 1) * ADJUSTMENT_FACTOR := 0;
SIGNAL step_clk_cycles : INTEGER RANGE LFO_CLK_CYCLES_MIN TO LFO_CLK_CYCLES_MAX := LFO_COUNTER_BASE_CLK_CYCLES;
SIGNAL step_counter : INTEGER RANGE 0 TO LFO_CLK_CYCLES_MAX := 0;
SIGNAL tri_counter : SIGNED(TRIANGULAR_COUNTER_LENGHT DOWNTO 0) := (OTHERS => '0');
SIGNAL direction_up : STD_LOGIC := '1';
+ SIGNAL trigger : STD_LOGIC := '0';
+
+ SIGNAL s_axis_tready_int : STD_LOGIC := '0';
+ SIGNAL s_axis_tlast_reg : STD_LOGIC := '0';
+ SIGNAL m_axis_tdata_temp : SIGNED(CHANNEL_LENGHT + TRIANGULAR_COUNTER_LENGHT DOWNTO 0) := (OTHERS => '0');
SIGNAL m_axis_tvalid_int : STD_LOGIC := '0';
BEGIN
-- Assigning the output signals
m_axis_tvalid <= m_axis_tvalid_int;
- s_axis_tready <= (m_axis_tready OR NOT m_axis_tvalid_int) AND aresetn;
+ s_axis_tready <= s_axis_tready_int;
-- Optimized single process for LFO step and triangular waveform generation
PROCESS (aclk)
@@ -68,7 +74,8 @@ BEGIN
ELSE
-- Set the step_clk_cycles based on the joystick input
- step_clk_cycles <= LFO_COUNTER_BASE_CLK_CYCLES - ADJUSTMENT_FACTOR * (to_integer(unsigned(lfo_period)) - JSTK_CENTER_VALUE);
+ step_clk_cycles_delta <= (to_integer(unsigned(lfo_period)) - JSTK_CENTER_VALUE) * ADJUSTMENT_FACTOR;
+ step_clk_cycles <= LFO_COUNTER_BASE_CLK_CYCLES - step_clk_cycles_delta;
IF lfo_enable = '1' THEN
@@ -110,6 +117,9 @@ BEGIN
IF rising_edge(aclk) THEN
IF aresetn = '0' THEN
+ s_axis_tlast_reg <= '0';
+ s_axis_tready_int <= '0';
+ m_axis_tdata_temp <= (OTHERS => '0');
m_axis_tvalid_int <= '0';
m_axis_tlast <= '0';
@@ -119,28 +129,48 @@ BEGIN
m_axis_tvalid_int <= '0';
END IF;
- IF s_axis_tvalid = '1' AND m_axis_tready = '1' THEN
+ -- Data output logic
+ IF trigger = '1' AND (m_axis_tvalid_int = '0' OR m_axis_tready = '1') THEN
+ m_axis_tdata <= STD_LOGIC_VECTOR(
+ resize(
+ shift_right(
+ m_axis_tdata_temp,
+ TRIANGULAR_COUNTER_LENGHT
+ ),
+ CHANNEL_LENGHT
+ )
+ );
+ m_axis_tlast <= s_axis_tlast_reg;
+
+ m_axis_tvalid_int <= '1';
+ trigger <= '0';
+
+ END IF;
+
+ -- Data input logic
+ IF s_axis_tvalid = '1' AND s_axis_tready_int = '1' THEN
IF lfo_enable = '1' THEN
- m_axis_tdata <= STD_LOGIC_VECTOR(
- resize(
- shift_right(
- signed(s_axis_tdata) * tri_counter,
- TRIANGULAR_COUNTER_LENGHT
- ),
- CHANNEL_LENGHT
- )
- );
+ m_axis_tdata_temp <= signed(s_axis_tdata) * tri_counter;
+ s_axis_tlast_reg <= s_axis_tlast;
ELSE
- m_axis_tdata <= s_axis_tdata;
+ m_axis_tdata_temp <= shift_left(
+ resize(
+ signed(s_axis_tdata),
+ m_axis_tdata_temp'length
+ ),
+ TRIANGULAR_COUNTER_LENGHT
+ );
+ s_axis_tlast_reg <= s_axis_tlast;
END IF;
- m_axis_tvalid_int <= '1';
- m_axis_tlast <= s_axis_tlast;
+ trigger <= '1';
END IF;
+ s_axis_tready_int <= m_axis_tready OR NOT m_axis_tvalid_int;
+
END IF;
END IF;
diff --git a/LAB3/src/all_pass_filter.vhd b/LAB3/src/all_pass_filter.vhd
index 3980e15..37c06c5 100644
--- a/LAB3/src/all_pass_filter.vhd
+++ b/LAB3/src/all_pass_filter.vhd
@@ -24,6 +24,11 @@ END all_pass_filter;
ARCHITECTURE Behavioral OF all_pass_filter IS
+ SIGNAL trigger : STD_LOGIC := '0';
+
+ SIGNAL s_axis_tready_int : STD_LOGIC := '0';
+ SIGNAL s_axis_tlast_reg : STD_LOGIC := '0';
+ SIGNAL m_axis_tdata_temp : STD_LOGIC_VECTOR(TDATA_WIDTH - 1 DOWNTO 0) := (OTHERS => '0');
SIGNAL m_axis_tvalid_int : STD_LOGIC := '0';
BEGIN
@@ -34,13 +39,19 @@ BEGIN
-- Assigning the output signals
m_axis_tvalid <= m_axis_tvalid_int;
- s_axis_tready <= (m_axis_tready OR NOT m_axis_tvalid_int) AND aresetn;
+ s_axis_tready <= s_axis_tready_int;
PROCESS (aclk)
BEGIN
IF rising_edge(aclk) THEN
IF aresetn = '0' THEN
+ -- Reset all internal signals
+ trigger <= '0';
+
+ s_axis_tlast_reg <= '0';
+ s_axis_tready_int <= '0';
+ m_axis_tdata_temp <= (OTHERS => '0');
m_axis_tvalid_int <= '0';
m_axis_tlast <= '0';
@@ -50,15 +61,27 @@ BEGIN
m_axis_tvalid_int <= '0';
END IF;
- -- Handle data transfer
- IF s_axis_tvalid = '1' AND m_axis_tready = '1' THEN
- m_axis_tdata <= s_axis_tdata;
-
+ -- Data output logic
+ IF trigger = '1' AND (m_axis_tvalid_int = '0' OR m_axis_tready = '1') THEN
+ m_axis_tdata <= m_axis_tdata_temp;
+ m_axis_tlast <= s_axis_tlast_reg;
+
m_axis_tvalid_int <= '1';
- m_axis_tlast <= s_axis_tlast;
+ trigger <= '0';
END IF;
+ -- Data input logic
+ IF s_axis_tvalid = '1' AND s_axis_tready_int = '1' THEN
+ s_axis_tlast_reg <= s_axis_tlast;
+ m_axis_tdata_temp <= s_axis_tdata;
+
+ trigger <= '1';
+
+ END IF;
+
+ s_axis_tready_int <= m_axis_tready OR NOT m_axis_tvalid_int;
+
END IF;
END IF;
diff --git a/LAB3/src/moving_average_filter.vhd b/LAB3/src/moving_average_filter.vhd
index b90ff42..65e3cdf 100644
--- a/LAB3/src/moving_average_filter.vhd
+++ b/LAB3/src/moving_average_filter.vhd
@@ -41,13 +41,19 @@ ARCHITECTURE Behavioral OF moving_average_filter IS
SIGNAL sum_sx : signed(TDATA_WIDTH + FILTER_ORDER_POWER - 1 DOWNTO 0) := (OTHERS => '0');
SIGNAL wr_ptr_sx : INTEGER RANGE 0 TO FILTER_ORDER - 1 := 0;
+ -- Trigger signal to indicate when to output data
+ SIGNAL trigger : STD_LOGIC := '0';
+
+ -- Output signals
+ SIGNAL s_axis_tready_int : STD_LOGIC := '0';
+ SIGNAL s_axis_tlast_reg : STD_LOGIC := '0';
SIGNAL m_axis_tvalid_int : STD_LOGIC := '0';
BEGIN
-- Assigning the output signals
m_axis_tvalid <= m_axis_tvalid_int;
- s_axis_tready <= (m_axis_tready OR NOT m_axis_tvalid_int) AND aresetn;
+ s_axis_tready <= s_axis_tready_int;
PROCESS (aclk)
BEGIN
@@ -62,6 +68,8 @@ BEGIN
wr_ptr_dx <= 0;
wr_ptr_sx <= 0;
+ s_axis_tlast_reg <= '0';
+ s_axis_tready_int <= '0';
m_axis_tvalid_int <= '0';
m_axis_tlast <= '0';
@@ -71,10 +79,41 @@ BEGIN
m_axis_tvalid_int <= '0';
END IF;
- -- Get and process data
- IF s_axis_tvalid = '1' AND m_axis_tready = '1' THEN
+ -- Data output logic
+ IF trigger = '1' AND (m_axis_tvalid_int = '0' OR m_axis_tready = '1') THEN
+ IF s_axis_tlast_reg = '1' THEN
+ m_axis_tdata <= STD_LOGIC_VECTOR(
+ resize(
+ shift_right(
+ sum_dx,
+ FILTER_ORDER_POWER
+ ),
+ m_axis_tdata'length
+ )
+ );
- IF s_axis_tlast = '1' THEN
+ ELSE
+ m_axis_tdata <= STD_LOGIC_VECTOR(
+ resize(
+ shift_right(
+ sum_sx,
+ FILTER_ORDER_POWER
+ ),
+ m_axis_tdata'length
+ )
+ );
+
+ END IF;
+
+ m_axis_tlast <= s_axis_tlast_reg;
+
+ m_axis_tvalid_int <= '1';
+ trigger <= '0';
+ END IF;
+
+ -- Data input logic
+ IF s_axis_tvalid = '1' AND s_axis_tready_int = '1' THEN
+ IF s_axis_tlast = '1' THEN
-- Right channel
-- Circular buffer overwrite oldest saple with the new one from next clk cycle
samples_dx(wr_ptr_dx) <= signed(s_axis_tdata);
@@ -85,16 +124,7 @@ BEGIN
-- Update the sum_dx removing the oldest sample and adding the new one
sum_dx <= sum_dx - samples_dx(wr_ptr_dx) + signed(s_axis_tdata);
- -- Calculate the average and send it to the master interface
- m_axis_tdata <= STD_LOGIC_VECTOR(
- resize(
- shift_right(
- sum_dx - samples_dx(wr_ptr_dx) + signed(s_axis_tdata),
- FILTER_ORDER_POWER
- ),
- m_axis_tdata'length
- )
- );
+ s_axis_tlast_reg <= s_axis_tlast;
ELSE
-- Left channel
-- Circular buffer overwrite oldest saple with the new one from next clk cycle
@@ -106,23 +136,15 @@ BEGIN
-- Update the sum_dx removing the oldest sample and adding the new one
sum_sx <= sum_sx - samples_sx(wr_ptr_sx) + signed(s_axis_tdata);
- -- Calculate the average and send it to the master interface
- m_axis_tdata <= STD_LOGIC_VECTOR(
- resize(
- shift_right(
- sum_sx - samples_sx(wr_ptr_sx) + signed(s_axis_tdata),
- FILTER_ORDER_POWER
- ),
- m_axis_tdata'length
- )
- );
+ s_axis_tlast_reg <= s_axis_tlast;
END IF;
- m_axis_tvalid_int <= '1';
- m_axis_tlast <= s_axis_tlast;
+ trigger <= '1';
END IF;
+ s_axis_tready_int <= m_axis_tready OR NOT m_axis_tvalid_int;
+
END IF;
END IF;
diff --git a/LAB3/vivado/LFO/LFO.xpr b/LAB3/vivado/LFO/LFO.xpr
new file mode 100644
index 0000000..bb2d4da
--- /dev/null
+++ b/LAB3/vivado/LFO/LFO.xpr
@@ -0,0 +1,394 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Vivado Synthesis Defaults
+
+
+
+
+
+
+
+
+
+
+ Default settings for Implementation.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ default_dashboard
+
+
+
diff --git a/LAB3/vivado/LFO/tb_LFO_behav.wcfg b/LAB3/vivado/LFO/tb_LFO_behav.wcfg
new file mode 100644
index 0000000..3668c4c
--- /dev/null
+++ b/LAB3/vivado/LFO/tb_LFO_behav.wcfg
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ aclk
+ aclk
+
+
+ aresetn
+ aresetn
+
+
+ step_counter
+ step_counter
+ UNSIGNEDDECRADIX
+
+
+ step_clk_cycles
+ step_clk_cycles
+ UNSIGNEDDECRADIX
+
+
+ tri_counter[10:0]
+ tri_counter[10:0]
+ UNSIGNEDDECRADIX
+
+
+ lfo_period[9:0]
+ lfo_period[9:0]
+ UNSIGNEDDECRADIX
+
+
+ lfo_enable
+ lfo_enable
+
+
+ s_axis
+ label
+
+
+ s_axis_tdata[23:0]
+ s_axis_tdata[23:0]
+ SIGNEDDECRADIX
+
+
+ s_axis_tlast
+ s_axis_tlast
+
+
+ s_axis_tvalid
+ s_axis_tvalid
+ #00FFFF
+ true
+
+
+ s_axis_tready
+ s_axis_tready
+ #FFD700
+ true
+
+
+ m_axis
+ label
+
+
+ m_axis_tdata[23:0]
+ m_axis_tdata[23:0]
+ SIGNEDDECRADIX
+
+
+ m_axis_tlast
+ m_axis_tlast
+
+
+ m_axis_tvalid
+ m_axis_tvalid
+ #00FFFF
+ true
+
+
+ m_axis_tready
+ m_axis_tready
+ #FFD700
+ true
+
+
diff --git a/LAB3/vivado/lab3/lab3.xpr b/LAB3/vivado/lab3/lab3.xpr
index 246b498..3189c07 100644
--- a/LAB3/vivado/lab3/lab3.xpr
+++ b/LAB3/vivado/lab3/lab3.xpr
@@ -89,42 +89,12 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -155,13 +125,43 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LAB3/vivado/moving_average_filter/moving_average_filter.xpr b/LAB3/vivado/moving_average_filter/moving_average_filter.xpr
index 9098315..f208da2 100644
--- a/LAB3/vivado/moving_average_filter/moving_average_filter.xpr
+++ b/LAB3/vivado/moving_average_filter/moving_average_filter.xpr
@@ -47,7 +47,7 @@
-
+
@@ -107,6 +107,7 @@
+
@@ -162,9 +163,7 @@
-
- Vivado Synthesis Defaults
-
+
@@ -173,9 +172,7 @@
-
- Default settings for Implementation.
-
+
diff --git a/LAB3/vivado/moving_average_filter/tb_moving_average_behav.wcfg b/LAB3/vivado/moving_average_filter/tb_moving_average_behav.wcfg
index 3b05bf4..5f3d391 100644
--- a/LAB3/vivado/moving_average_filter/tb_moving_average_behav.wcfg
+++ b/LAB3/vivado/moving_average_filter/tb_moving_average_behav.wcfg
@@ -11,14 +11,14 @@
-
-
+
+
-
+
-
+
aclk
aclk
@@ -83,4 +83,26 @@
#FFD700
true
+
+ moving average
+ label
+
+
+ sum_dx[28:0]
+ sum_dx[28:0]
+ SIGNEDDECRADIX
+
+
+ sum_sx[28:0]
+ sum_sx[28:0]
+ SIGNEDDECRADIX
+
+
+ wr_ptr_dx
+ wr_ptr_dx
+
+
+ wr_ptr_sx
+ wr_ptr_sx
+