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 @@