diff --git a/lib/lpp/dsp/window_function/WF_processing.vhd b/lib/lpp/dsp/window_function/WF_processing.vhd new file mode 100644 --- /dev/null +++ b/lib/lpp/dsp/window_function/WF_processing.vhd @@ -0,0 +1,108 @@ +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Jean-christophe Pellion +-- Mail : jean-christophe.pellion@lpp.polytechnique.fr +-- jean-christophe.pellion@easii-ic.com +---------------------------------------------------------------------------- + +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +use ieee.math_real.all; +USE ieee.numeric_std.ALL; + +LIBRARY lpp; +USE lpp.general_purpose.ALL; +USE lpp.window_function_pkg.ALL; + +ENTITY WF_processing IS + GENERIC ( + SIZE_DATA : INTEGER := 16; + SIZE_PARAM : INTEGER := 10; + NB_POINT_BY_WINDOW : INTEGER := 256 + ); + + PORT ( + clk : IN STD_LOGIC; + rstn : IN STD_LOGIC; + --ctrl + restart_window : IN STD_LOGIC; + --data_in + data_in : IN STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0); + data_in_valid : IN STD_LOGIC; + --data_out + data_out : OUT STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0); + data_out_valid : OUT STD_LOGIC; + + --window parameter interface + param_in : IN STD_LOGIC_VECTOR(SIZE_PARAM-1 DOWNTO 0); + param_index : OUT INTEGER RANGE 0 TO NB_POINT_BY_WINDOW-1 + ); + +END WF_processing; + +ARCHITECTURE beh OF WF_processing IS + CONSTANT NB_BITS_COUNTER : INTEGER := INTEGER(ceil(log2(REAL(NB_POINT_BY_WINDOW)))); + + SIGNAL data_x_param : STD_LOGIC_VECTOR(SIZE_DATA + SIZE_PARAM - 1 DOWNTO 0); + SIGNAL windows_counter_s : STD_LOGIC_VECTOR(NB_BITS_COUNTER-1 DOWNTO 0); + +BEGIN + + WINDOWS_counter: general_counter + GENERIC MAP ( + CYCLIC => '1', + NB_BITS_COUNTER => NB_BITS_COUNTER, + RST_VALUE => 0) + PORT MAP ( + clk => clk, + rstn => rstn, + MAX_VALUE => STD_LOGIC_VECTOR(to_unsigned(NB_POINT_BY_WINDOW-1, NB_BITS_COUNTER)), + set => restart_window, + set_value => STD_LOGIC_VECTOR(to_unsigned(0, NB_BITS_COUNTER)), + add1 => data_in_valid, + counter => windows_counter_s); + + param_index <= to_integer(UNSIGNED(windows_counter_s)); + + WINDOWS_Multiplier : Multiplier + GENERIC MAP ( + Input_SZ_A => SIZE_DATA, + Input_SZ_B => SIZE_PARAM) + PORT MAP ( + clk => clk, + reset => rstn, + + mult => data_in_valid, + OP1 => data_in, + OP2 => param_in, + + RES => data_x_param); + + data_out <= data_x_param(SIZE_DATA + SIZE_PARAM-1 DOWNTO SIZE_PARAM); + + WINDOWS_REG: SYNC_FF + GENERIC MAP ( + NB_FF_OF_SYNC => 1) + PORT MAP ( + clk => clk, + rstn => rstn, + A => data_in_valid, + A_sync => data_out_valid); + +END beh; diff --git a/lib/lpp/dsp/window_function/WF_rom.vhd b/lib/lpp/dsp/window_function/WF_rom.vhd new file mode 100644 --- /dev/null +++ b/lib/lpp/dsp/window_function/WF_rom.vhd @@ -0,0 +1,96 @@ +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Jean-christophe Pellion +-- Mail : jean-christophe.pellion@lpp.polytechnique.fr +-- jean-christophe.pellion@easii-ic.com +---------------------------------------------------------------------------- + +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.ALL; + +LIBRARY lpp; +USE lpp.general_purpose.ALL; +USE lpp.window_function_pkg.ALL; + +ENTITY WF_rom IS + GENERIC ( + SIZE_PARAM : INTEGER := 10; + NB_POINT_BY_WINDOW : INTEGER := 256 + ); + PORT ( + data : OUT STD_LOGIC_VECTOR(SIZE_PARAM-1 DOWNTO 0); + index : IN INTEGER RANGE 0 TO NB_POINT_BY_WINDOW-1 + ); +END WF_rom; + +ARCHITECTURE beh OF WF_rom IS + + CONSTANT SIZE_ARRAY : INTEGER := 256; -- + CONSTANT SIZE_ARRAY_PARAM : INTEGER := 16; -- bits + TYPE array_std_logic_vector IS ARRAY (SIZE_ARRAY-1 DOWNTO 0) OF STD_LOGIC_VECTOR(SIZE_ARRAY_PARAM-1 DOWNTO 0); + CONSTANT ROM_array : array_std_logic_vector := ( + X"0000",X"0004",X"0013",X"002C",X"004F",X"007C",X"00B2",X"00F3", + X"013D",X"0191",X"01EE",X"0256",X"02C6",X"0341",X"03C5",X"0452", + X"04E8",X"0588",X"0631",X"06E2",X"079D",X"0860",X"092C",X"0A01", + X"0ADE",X"0BC3",X"0CB0",X"0DA5",X"0EA3",X"0FA7",X"10B4",X"11C7", + X"12E2",X"1404",X"152C",X"165C",X"1792",X"18CE",X"1A10",X"1B58", + X"1CA6",X"1DF9",X"1F51",X"20AF",X"2211",X"2379",X"24E4",X"2654", + X"27C8",X"293F",X"2ABA",X"2C39",X"2DBA",X"2F3E",X"30C5",X"324E", + X"33DA",X"3567",X"36F6",X"3886",X"3A18",X"3BAA",X"3D3D",X"3ED1", + X"4064",X"41F8",X"438B",X"451E",X"46B0",X"4841",X"49D1",X"4B5F", + X"4CEB",X"4E75",X"4FFE",X"5183",X"5306",X"5486",X"5603",X"577C", + X"58F2",X"5A64",X"5BD1",X"5D3B",X"5E9F",X"5FFF",X"615B",X"62B1", + X"6401",X"654C",X"6691",X"67D0",X"6909",X"6A3C",X"6B68",X"6C8D", + X"6DAB",X"6EC3",X"6FD2",X"70DB",X"71DC",X"72D5",X"73C6",X"74B0", + X"7591",X"7669",X"773A",X"7801",X"78C0",X"7977",X"7A24",X"7AC8", + X"7B63",X"7BF5",X"7C7D",X"7CFD",X"7D72",X"7DDE",X"7E41",X"7E99", + X"7EE9",X"7F2E",X"7F69",X"7F9B",X"7FC3",X"7FE0",X"7FF4",X"7FFE", + X"7FFE",X"7FF4",X"7FE0",X"7FC3",X"7F9B",X"7F69",X"7F2E",X"7EE9", + X"7E99",X"7E41",X"7DDE",X"7D72",X"7CFD",X"7C7D",X"7BF5",X"7B63", + X"7AC8",X"7A24",X"7977",X"78C0",X"7801",X"773A",X"7669",X"7591", + X"74B0",X"73C6",X"72D5",X"71DC",X"70DB",X"6FD2",X"6EC3",X"6DAB", + X"6C8D",X"6B68",X"6A3C",X"6909",X"67D0",X"6691",X"654C",X"6401", + X"62B1",X"615B",X"6000",X"5E9F",X"5D3B",X"5BD1",X"5A64",X"58F2", + X"577C",X"5603",X"5486",X"5306",X"5183",X"4FFE",X"4E75",X"4CEB", + X"4B5F",X"49D1",X"4841",X"46B0",X"451E",X"438B",X"41F8",X"4064", + X"3ED1",X"3D3D",X"3BAA",X"3A18",X"3886",X"36F6",X"3567",X"33DA", + X"324E",X"30C5",X"2F3E",X"2DBA",X"2C39",X"2ABA",X"293F",X"27C8", + X"2654",X"24E4",X"2379",X"2211",X"20AF",X"1F51",X"1DF9",X"1CA6", + X"1B58",X"1A10",X"18CE",X"1792",X"165C",X"152C",X"1404",X"12E2", + X"11C7",X"10B4",X"0FA7",X"0EA3",X"0DA5",X"0CB0",X"0BC3",X"0ADE", + X"0A01",X"092C",X"0860",X"079D",X"06E2",X"0631",X"0588",X"04E8", + X"0452",X"03C5",X"0341",X"02C6",X"0256",X"01EE",X"0191",X"013D", + X"00F3",X"00B2",X"007C",X"004F",X"002C",X"0013",X"0004",X"0000"); + + SIGNAL data_selected : STD_LOGIC_VECTOR(SIZE_ARRAY_PARAM-1 DOWNTO 0); +BEGIN + + ALL_PARAM_DEFINE: IF NB_POINT_BY_WINDOW < SIZE_ARRAY + 1 GENERATE + data_selected <= ROM_array(index); + END GENERATE ALL_PARAM_DEFINE; + + HALF_PARAM_DEFINE: IF NB_POINT_BY_WINDOW > SIZE_ARRAY AND NB_POINT_BY_WINDOW < 2 * SIZE_ARRAY + 1 GENERATE + data_selected <= ROM_array(index) WHEN index < SIZE_ARRAY ELSE + ROM_array(2*SIZE_ARRAY-1-index); + END GENERATE HALF_PARAM_DEFINE; + + data <= data_selected(SIZE_ARRAY_PARAM-1 DOWNTO SIZE_ARRAY_PARAM-SIZE_PARAM); + +END beh; diff --git a/lib/lpp/dsp/window_function/vhdlsyn.txt b/lib/lpp/dsp/window_function/vhdlsyn.txt --- a/lib/lpp/dsp/window_function/vhdlsyn.txt +++ b/lib/lpp/dsp/window_function/vhdlsyn.txt @@ -1,2 +1,4 @@ window_function_pkg.vhd window_function.vhd +WF_processing.vhd +WF_rom.vhd diff --git a/lib/lpp/dsp/window_function/window_function.vhd b/lib/lpp/dsp/window_function/window_function.vhd --- a/lib/lpp/dsp/window_function/window_function.vhd +++ b/lib/lpp/dsp/window_function/window_function.vhd @@ -26,93 +26,59 @@ USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; LIBRARY lpp; -USE lpp.general_purpose.ALL; USE lpp.window_function_pkg.ALL; -USE lpp.data_type_pkg.ALL; ENTITY window_function IS GENERIC ( - DATA_SIZE : INTEGER := 16; - PARAM_SIZE : INTEGER := 10; - WINDOWS_PARAM : array_std_logic_vector_16b(0 TO 255) + SIZE_DATA : INTEGER := 16; + SIZE_PARAM : INTEGER := 10; + NB_POINT_BY_WINDOW : INTEGER := 256 ); PORT ( clk : IN STD_LOGIC; rstn : IN STD_LOGIC; - + --ctrl restart_window : IN STD_LOGIC; - - data_in : IN STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0); + --data_in + data_in : IN STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0); data_in_valid : IN STD_LOGIC; - - data_out : OUT STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0); + --data_out + data_out : OUT STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0); data_out_valid : OUT STD_LOGIC ); END window_function; ARCHITECTURE beh OF window_function IS - CONSTANT NB_POINT_BY_WINDOW : INTEGER := 256; - - SIGNAL param_counter : INTEGER RANGE 0 TO NB_POINT_BY_WINDOW-1; - - SIGNAL data_x_param : STD_LOGIC_VECTOR(DATA_SIZE + PARAM_SIZE - 1 DOWNTO 0); - SIGNAL windows_param_selected_s : STD_LOGIC_VECTOR(15 DOWNTO 0); - SIGNAL windows_param_selected : STD_LOGIC_VECTOR(PARAM_SIZE-1 DOWNTO 0); - SIGNAL data_in_valid_s : STD_LOGIC; - SIGNAL data_in_s : STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0); - + SIGNAL param_in : STD_LOGIC_VECTOR(SIZE_PARAM-1 DOWNTO 0); + SIGNAL param_index : INTEGER RANGE 0 TO NB_POINT_BY_WINDOW-1; + BEGIN - PROCESS (clk, rstn) - BEGIN -- PROCESS - IF rstn = '0' THEN -- asynchronous reset (active low) - param_counter <= 0; - ELSIF clk'EVENT AND clk = '1' THEN -- rising clock edge - IF restart_window = '1' THEN - param_counter <= 0; - ELSE - IF data_in_valid = '1' THEN - IF param_counter < 255 THEN - param_counter <= param_counter + 1; - ELSE - param_counter <= 0; - END IF; - END IF; - END IF; - END IF; - END PROCESS; - - data_in_valid_s <= data_in_valid; - data_in_s <= data_in; - windows_param_selected_s <= WINDOWS_PARAM(param_counter); - windows_param_selected <= windows_param_selected_s(15 DOWNTO 16 - PARAM_SIZE); - - WINDOWS_Multiplier : Multiplier + WF_rom_1: WF_rom + GENERIC MAP ( + SIZE_PARAM => SIZE_PARAM, + NB_POINT_BY_WINDOW => NB_POINT_BY_WINDOW) + PORT MAP ( + data => param_in, + index => param_index); + + WF_processing_1: WF_processing GENERIC MAP ( - Input_SZ_A => DATA_SIZE, - Input_SZ_B => PARAM_SIZE) + SIZE_DATA => SIZE_DATA, + SIZE_PARAM => SIZE_PARAM, + NB_POINT_BY_WINDOW => NB_POINT_BY_WINDOW) PORT MAP ( - clk => clk, - reset => rstn, - - mult => data_in_valid_s, - OP1 => data_in_s, - OP2 => windows_param_selected, - - RES => data_x_param); - - data_out <= data_x_param(DATA_SIZE + PARAM_SIZE-1 DOWNTO PARAM_SIZE); - - PROCESS (clk, rstn) - BEGIN -- PROCESS - IF rstn = '0' THEN -- asynchronous reset (active low) - data_out_valid <= '0'; - ELSIF clk'EVENT AND clk = '1' THEN -- rising clock edge - data_out_valid <= data_in_valid_s; - END IF; - END PROCESS; + clk => clk, + rstn => rstn, + restart_window => restart_window, + data_in => data_in, + data_in_valid => data_in_valid, + data_out => data_out, + data_out_valid => data_out_valid, + param_in => param_in, + param_index => param_index); END beh; diff --git a/lib/lpp/dsp/window_function/window_function_pkg.vhd b/lib/lpp/dsp/window_function/window_function_pkg.vhd --- a/lib/lpp/dsp/window_function/window_function_pkg.vhd +++ b/lib/lpp/dsp/window_function/window_function_pkg.vhd @@ -24,26 +24,49 @@ LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE IEEE.NUMERIC_STD.ALL; -LIBRARY lpp; -USE lpp.data_type_pkg.ALL; +PACKAGE window_function_pkg IS -PACKAGE window_function_pkg IS - COMPONENT window_function GENERIC ( - DATA_SIZE : INTEGER; - PARAM_SIZE : INTEGER; - WINDOWS_PARAM : array_std_logic_vector_16b(0 TO 255) - ); + SIZE_DATA : INTEGER; + SIZE_PARAM : INTEGER; + NB_POINT_BY_WINDOW : INTEGER); PORT ( clk : IN STD_LOGIC; rstn : IN STD_LOGIC; restart_window : IN STD_LOGIC; - data_in : IN STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0); + data_in : IN STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0); data_in_valid : IN STD_LOGIC; - data_out : OUT STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0); - data_out_valid : OUT STD_LOGIC); + data_out : OUT STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0); + data_out_valid : OUT STD_LOGIC + ); END COMPONENT; - + + COMPONENT WF_processing + GENERIC ( + SIZE_DATA : INTEGER; + SIZE_PARAM : INTEGER; + NB_POINT_BY_WINDOW : INTEGER); + PORT ( + clk : IN STD_LOGIC; + rstn : IN STD_LOGIC; + restart_window : IN STD_LOGIC; + data_in : IN STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0); + data_in_valid : IN STD_LOGIC; + data_out : OUT STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0); + data_out_valid : OUT STD_LOGIC; + param_in : IN STD_LOGIC_VECTOR(SIZE_PARAM-1 DOWNTO 0); + param_index : OUT INTEGER RANGE 0 TO NB_POINT_BY_WINDOW-1 + ); + END COMPONENT; + + COMPONENT WF_rom + GENERIC ( + SIZE_PARAM : INTEGER; + NB_POINT_BY_WINDOW : INTEGER); + PORT ( + data : OUT STD_LOGIC_VECTOR(SIZE_PARAM-1 DOWNTO 0); + index : IN INTEGER RANGE 0 TO NB_POINT_BY_WINDOW-1); + END COMPONENT; END window_function_pkg;