##// END OF EJS Templates
Window Function with a ROM (Hanning)
pellion -
r604:9d0c406efed4 simu_with_Leon3
parent child
Show More
@@ -0,0 +1,108
1 ------------------------------------------------------------------------------
2 -- This file is a part of the LPP VHDL IP LIBRARY
3 -- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS
4 --
5 -- This program is free software; you can redistribute it and/or modify
6 -- it under the terms of the GNU General Public License as published by
7 -- the Free Software Foundation; either version 3 of the License, or
8 -- (at your option) any later version.
9 --
10 -- This program is distributed in the hope that it will be useful,
11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 -- GNU General Public License for more details.
14 --
15 -- You should have received a copy of the GNU General Public License
16 -- along with this program; if not, write to the Free Software
17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 -------------------------------------------------------------------------------
19 -- Author : Jean-christophe Pellion
20 -- Mail : jean-christophe.pellion@lpp.polytechnique.fr
21 -- jean-christophe.pellion@easii-ic.com
22 ----------------------------------------------------------------------------
23
24 LIBRARY ieee;
25 USE ieee.std_logic_1164.ALL;
26 use ieee.math_real.all;
27 USE ieee.numeric_std.ALL;
28
29 LIBRARY lpp;
30 USE lpp.general_purpose.ALL;
31 USE lpp.window_function_pkg.ALL;
32
33 ENTITY WF_processing IS
34 GENERIC (
35 SIZE_DATA : INTEGER := 16;
36 SIZE_PARAM : INTEGER := 10;
37 NB_POINT_BY_WINDOW : INTEGER := 256
38 );
39
40 PORT (
41 clk : IN STD_LOGIC;
42 rstn : IN STD_LOGIC;
43 --ctrl
44 restart_window : IN STD_LOGIC;
45 --data_in
46 data_in : IN STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0);
47 data_in_valid : IN STD_LOGIC;
48 --data_out
49 data_out : OUT STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0);
50 data_out_valid : OUT STD_LOGIC;
51
52 --window parameter interface
53 param_in : IN STD_LOGIC_VECTOR(SIZE_PARAM-1 DOWNTO 0);
54 param_index : OUT INTEGER RANGE 0 TO NB_POINT_BY_WINDOW-1
55 );
56
57 END WF_processing;
58
59 ARCHITECTURE beh OF WF_processing IS
60 CONSTANT NB_BITS_COUNTER : INTEGER := INTEGER(ceil(log2(REAL(NB_POINT_BY_WINDOW))));
61
62 SIGNAL data_x_param : STD_LOGIC_VECTOR(SIZE_DATA + SIZE_PARAM - 1 DOWNTO 0);
63 SIGNAL windows_counter_s : STD_LOGIC_VECTOR(NB_BITS_COUNTER-1 DOWNTO 0);
64
65 BEGIN
66
67 WINDOWS_counter: general_counter
68 GENERIC MAP (
69 CYCLIC => '1',
70 NB_BITS_COUNTER => NB_BITS_COUNTER,
71 RST_VALUE => 0)
72 PORT MAP (
73 clk => clk,
74 rstn => rstn,
75 MAX_VALUE => STD_LOGIC_VECTOR(to_unsigned(NB_POINT_BY_WINDOW-1, NB_BITS_COUNTER)),
76 set => restart_window,
77 set_value => STD_LOGIC_VECTOR(to_unsigned(0, NB_BITS_COUNTER)),
78 add1 => data_in_valid,
79 counter => windows_counter_s);
80
81 param_index <= to_integer(UNSIGNED(windows_counter_s));
82
83 WINDOWS_Multiplier : Multiplier
84 GENERIC MAP (
85 Input_SZ_A => SIZE_DATA,
86 Input_SZ_B => SIZE_PARAM)
87 PORT MAP (
88 clk => clk,
89 reset => rstn,
90
91 mult => data_in_valid,
92 OP1 => data_in,
93 OP2 => param_in,
94
95 RES => data_x_param);
96
97 data_out <= data_x_param(SIZE_DATA + SIZE_PARAM-1 DOWNTO SIZE_PARAM);
98
99 WINDOWS_REG: SYNC_FF
100 GENERIC MAP (
101 NB_FF_OF_SYNC => 1)
102 PORT MAP (
103 clk => clk,
104 rstn => rstn,
105 A => data_in_valid,
106 A_sync => data_out_valid);
107
108 END beh;
@@ -0,0 +1,96
1 ------------------------------------------------------------------------------
2 -- This file is a part of the LPP VHDL IP LIBRARY
3 -- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS
4 --
5 -- This program is free software; you can redistribute it and/or modify
6 -- it under the terms of the GNU General Public License as published by
7 -- the Free Software Foundation; either version 3 of the License, or
8 -- (at your option) any later version.
9 --
10 -- This program is distributed in the hope that it will be useful,
11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 -- GNU General Public License for more details.
14 --
15 -- You should have received a copy of the GNU General Public License
16 -- along with this program; if not, write to the Free Software
17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 -------------------------------------------------------------------------------
19 -- Author : Jean-christophe Pellion
20 -- Mail : jean-christophe.pellion@lpp.polytechnique.fr
21 -- jean-christophe.pellion@easii-ic.com
22 ----------------------------------------------------------------------------
23
24 LIBRARY ieee;
25 USE ieee.std_logic_1164.ALL;
26 USE ieee.numeric_std.ALL;
27
28 LIBRARY lpp;
29 USE lpp.general_purpose.ALL;
30 USE lpp.window_function_pkg.ALL;
31
32 ENTITY WF_rom IS
33 GENERIC (
34 SIZE_PARAM : INTEGER := 10;
35 NB_POINT_BY_WINDOW : INTEGER := 256
36 );
37 PORT (
38 data : OUT STD_LOGIC_VECTOR(SIZE_PARAM-1 DOWNTO 0);
39 index : IN INTEGER RANGE 0 TO NB_POINT_BY_WINDOW-1
40 );
41 END WF_rom;
42
43 ARCHITECTURE beh OF WF_rom IS
44
45 CONSTANT SIZE_ARRAY : INTEGER := 256; --
46 CONSTANT SIZE_ARRAY_PARAM : INTEGER := 16; -- bits
47 TYPE array_std_logic_vector IS ARRAY (SIZE_ARRAY-1 DOWNTO 0) OF STD_LOGIC_VECTOR(SIZE_ARRAY_PARAM-1 DOWNTO 0);
48 CONSTANT ROM_array : array_std_logic_vector := (
49 X"0000",X"0004",X"0013",X"002C",X"004F",X"007C",X"00B2",X"00F3",
50 X"013D",X"0191",X"01EE",X"0256",X"02C6",X"0341",X"03C5",X"0452",
51 X"04E8",X"0588",X"0631",X"06E2",X"079D",X"0860",X"092C",X"0A01",
52 X"0ADE",X"0BC3",X"0CB0",X"0DA5",X"0EA3",X"0FA7",X"10B4",X"11C7",
53 X"12E2",X"1404",X"152C",X"165C",X"1792",X"18CE",X"1A10",X"1B58",
54 X"1CA6",X"1DF9",X"1F51",X"20AF",X"2211",X"2379",X"24E4",X"2654",
55 X"27C8",X"293F",X"2ABA",X"2C39",X"2DBA",X"2F3E",X"30C5",X"324E",
56 X"33DA",X"3567",X"36F6",X"3886",X"3A18",X"3BAA",X"3D3D",X"3ED1",
57 X"4064",X"41F8",X"438B",X"451E",X"46B0",X"4841",X"49D1",X"4B5F",
58 X"4CEB",X"4E75",X"4FFE",X"5183",X"5306",X"5486",X"5603",X"577C",
59 X"58F2",X"5A64",X"5BD1",X"5D3B",X"5E9F",X"5FFF",X"615B",X"62B1",
60 X"6401",X"654C",X"6691",X"67D0",X"6909",X"6A3C",X"6B68",X"6C8D",
61 X"6DAB",X"6EC3",X"6FD2",X"70DB",X"71DC",X"72D5",X"73C6",X"74B0",
62 X"7591",X"7669",X"773A",X"7801",X"78C0",X"7977",X"7A24",X"7AC8",
63 X"7B63",X"7BF5",X"7C7D",X"7CFD",X"7D72",X"7DDE",X"7E41",X"7E99",
64 X"7EE9",X"7F2E",X"7F69",X"7F9B",X"7FC3",X"7FE0",X"7FF4",X"7FFE",
65 X"7FFE",X"7FF4",X"7FE0",X"7FC3",X"7F9B",X"7F69",X"7F2E",X"7EE9",
66 X"7E99",X"7E41",X"7DDE",X"7D72",X"7CFD",X"7C7D",X"7BF5",X"7B63",
67 X"7AC8",X"7A24",X"7977",X"78C0",X"7801",X"773A",X"7669",X"7591",
68 X"74B0",X"73C6",X"72D5",X"71DC",X"70DB",X"6FD2",X"6EC3",X"6DAB",
69 X"6C8D",X"6B68",X"6A3C",X"6909",X"67D0",X"6691",X"654C",X"6401",
70 X"62B1",X"615B",X"6000",X"5E9F",X"5D3B",X"5BD1",X"5A64",X"58F2",
71 X"577C",X"5603",X"5486",X"5306",X"5183",X"4FFE",X"4E75",X"4CEB",
72 X"4B5F",X"49D1",X"4841",X"46B0",X"451E",X"438B",X"41F8",X"4064",
73 X"3ED1",X"3D3D",X"3BAA",X"3A18",X"3886",X"36F6",X"3567",X"33DA",
74 X"324E",X"30C5",X"2F3E",X"2DBA",X"2C39",X"2ABA",X"293F",X"27C8",
75 X"2654",X"24E4",X"2379",X"2211",X"20AF",X"1F51",X"1DF9",X"1CA6",
76 X"1B58",X"1A10",X"18CE",X"1792",X"165C",X"152C",X"1404",X"12E2",
77 X"11C7",X"10B4",X"0FA7",X"0EA3",X"0DA5",X"0CB0",X"0BC3",X"0ADE",
78 X"0A01",X"092C",X"0860",X"079D",X"06E2",X"0631",X"0588",X"04E8",
79 X"0452",X"03C5",X"0341",X"02C6",X"0256",X"01EE",X"0191",X"013D",
80 X"00F3",X"00B2",X"007C",X"004F",X"002C",X"0013",X"0004",X"0000");
81
82 SIGNAL data_selected : STD_LOGIC_VECTOR(SIZE_ARRAY_PARAM-1 DOWNTO 0);
83 BEGIN
84
85 ALL_PARAM_DEFINE: IF NB_POINT_BY_WINDOW < SIZE_ARRAY + 1 GENERATE
86 data_selected <= ROM_array(index);
87 END GENERATE ALL_PARAM_DEFINE;
88
89 HALF_PARAM_DEFINE: IF NB_POINT_BY_WINDOW > SIZE_ARRAY AND NB_POINT_BY_WINDOW < 2 * SIZE_ARRAY + 1 GENERATE
90 data_selected <= ROM_array(index) WHEN index < SIZE_ARRAY ELSE
91 ROM_array(2*SIZE_ARRAY-1-index);
92 END GENERATE HALF_PARAM_DEFINE;
93
94 data <= data_selected(SIZE_ARRAY_PARAM-1 DOWNTO SIZE_ARRAY_PARAM-SIZE_PARAM);
95
96 END beh;
@@ -1,2 +1,4
1 window_function_pkg.vhd
1 window_function_pkg.vhd
2 window_function.vhd
2 window_function.vhd
3 WF_processing.vhd
4 WF_rom.vhd
@@ -26,93 +26,59 USE ieee.std_logic_1164.ALL;
26 USE ieee.numeric_std.ALL;
26 USE ieee.numeric_std.ALL;
27
27
28 LIBRARY lpp;
28 LIBRARY lpp;
29 USE lpp.general_purpose.ALL;
30 USE lpp.window_function_pkg.ALL;
29 USE lpp.window_function_pkg.ALL;
31 USE lpp.data_type_pkg.ALL;
32
30
33 ENTITY window_function IS
31 ENTITY window_function IS
34 GENERIC (
32 GENERIC (
35 DATA_SIZE : INTEGER := 16;
33 SIZE_DATA : INTEGER := 16;
36 PARAM_SIZE : INTEGER := 10;
34 SIZE_PARAM : INTEGER := 10;
37 WINDOWS_PARAM : array_std_logic_vector_16b(0 TO 255)
35 NB_POINT_BY_WINDOW : INTEGER := 256
38 );
36 );
39
37
40 PORT (
38 PORT (
41 clk : IN STD_LOGIC;
39 clk : IN STD_LOGIC;
42 rstn : IN STD_LOGIC;
40 rstn : IN STD_LOGIC;
43
41 --ctrl
44 restart_window : IN STD_LOGIC;
42 restart_window : IN STD_LOGIC;
45
43 --data_in
46 data_in : IN STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0);
44 data_in : IN STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0);
47 data_in_valid : IN STD_LOGIC;
45 data_in_valid : IN STD_LOGIC;
48
46 --data_out
49 data_out : OUT STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0);
47 data_out : OUT STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0);
50 data_out_valid : OUT STD_LOGIC
48 data_out_valid : OUT STD_LOGIC
51 );
49 );
52
50
53 END window_function;
51 END window_function;
54
52
55 ARCHITECTURE beh OF window_function IS
53 ARCHITECTURE beh OF window_function IS
56 CONSTANT NB_POINT_BY_WINDOW : INTEGER := 256;
57
58 SIGNAL param_counter : INTEGER RANGE 0 TO NB_POINT_BY_WINDOW-1;
59
60 SIGNAL data_x_param : STD_LOGIC_VECTOR(DATA_SIZE + PARAM_SIZE - 1 DOWNTO 0);
61
54
62 SIGNAL windows_param_selected_s : STD_LOGIC_VECTOR(15 DOWNTO 0);
55 SIGNAL param_in : STD_LOGIC_VECTOR(SIZE_PARAM-1 DOWNTO 0);
63 SIGNAL windows_param_selected : STD_LOGIC_VECTOR(PARAM_SIZE-1 DOWNTO 0);
56 SIGNAL param_index : INTEGER RANGE 0 TO NB_POINT_BY_WINDOW-1;
64 SIGNAL data_in_valid_s : STD_LOGIC;
57
65 SIGNAL data_in_s : STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0);
66
67 BEGIN
58 BEGIN
68
59
69 PROCESS (clk, rstn)
60 WF_rom_1: WF_rom
70 BEGIN -- PROCESS
61 GENERIC MAP (
71 IF rstn = '0' THEN -- asynchronous reset (active low)
62 SIZE_PARAM => SIZE_PARAM,
72 param_counter <= 0;
63 NB_POINT_BY_WINDOW => NB_POINT_BY_WINDOW)
73 ELSIF clk'EVENT AND clk = '1' THEN -- rising clock edge
64 PORT MAP (
74 IF restart_window = '1' THEN
65 data => param_in,
75 param_counter <= 0;
66 index => param_index);
76 ELSE
67
77 IF data_in_valid = '1' THEN
68 WF_processing_1: WF_processing
78 IF param_counter < 255 THEN
79 param_counter <= param_counter + 1;
80 ELSE
81 param_counter <= 0;
82 END IF;
83 END IF;
84 END IF;
85 END IF;
86 END PROCESS;
87
88 data_in_valid_s <= data_in_valid;
89 data_in_s <= data_in;
90 windows_param_selected_s <= WINDOWS_PARAM(param_counter);
91 windows_param_selected <= windows_param_selected_s(15 DOWNTO 16 - PARAM_SIZE);
92
93 WINDOWS_Multiplier : Multiplier
94 GENERIC MAP (
69 GENERIC MAP (
95 Input_SZ_A => DATA_SIZE,
70 SIZE_DATA => SIZE_DATA,
96 Input_SZ_B => PARAM_SIZE)
71 SIZE_PARAM => SIZE_PARAM,
72 NB_POINT_BY_WINDOW => NB_POINT_BY_WINDOW)
97 PORT MAP (
73 PORT MAP (
98 clk => clk,
74 clk => clk,
99 reset => rstn,
75 rstn => rstn,
100
76 restart_window => restart_window,
101 mult => data_in_valid_s,
77 data_in => data_in,
102 OP1 => data_in_s,
78 data_in_valid => data_in_valid,
103 OP2 => windows_param_selected,
79 data_out => data_out,
104
80 data_out_valid => data_out_valid,
105 RES => data_x_param);
81 param_in => param_in,
106
82 param_index => param_index);
107 data_out <= data_x_param(DATA_SIZE + PARAM_SIZE-1 DOWNTO PARAM_SIZE);
108
109 PROCESS (clk, rstn)
110 BEGIN -- PROCESS
111 IF rstn = '0' THEN -- asynchronous reset (active low)
112 data_out_valid <= '0';
113 ELSIF clk'EVENT AND clk = '1' THEN -- rising clock edge
114 data_out_valid <= data_in_valid_s;
115 END IF;
116 END PROCESS;
117
83
118 END beh;
84 END beh;
@@ -24,26 +24,49 LIBRARY ieee;
24 USE ieee.std_logic_1164.ALL;
24 USE ieee.std_logic_1164.ALL;
25 USE IEEE.NUMERIC_STD.ALL;
25 USE IEEE.NUMERIC_STD.ALL;
26
26
27 LIBRARY lpp;
27 PACKAGE window_function_pkg IS
28 USE lpp.data_type_pkg.ALL;
29
28
30 PACKAGE window_function_pkg IS
31
32 COMPONENT window_function
29 COMPONENT window_function
33 GENERIC (
30 GENERIC (
34 DATA_SIZE : INTEGER;
31 SIZE_DATA : INTEGER;
35 PARAM_SIZE : INTEGER;
32 SIZE_PARAM : INTEGER;
36 WINDOWS_PARAM : array_std_logic_vector_16b(0 TO 255)
33 NB_POINT_BY_WINDOW : INTEGER);
37 );
38 PORT (
34 PORT (
39 clk : IN STD_LOGIC;
35 clk : IN STD_LOGIC;
40 rstn : IN STD_LOGIC;
36 rstn : IN STD_LOGIC;
41 restart_window : IN STD_LOGIC;
37 restart_window : IN STD_LOGIC;
42 data_in : IN STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0);
38 data_in : IN STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0);
43 data_in_valid : IN STD_LOGIC;
39 data_in_valid : IN STD_LOGIC;
44 data_out : OUT STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0);
40 data_out : OUT STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0);
45 data_out_valid : OUT STD_LOGIC);
41 data_out_valid : OUT STD_LOGIC
42 );
46 END COMPONENT;
43 END COMPONENT;
47
44
45 COMPONENT WF_processing
46 GENERIC (
47 SIZE_DATA : INTEGER;
48 SIZE_PARAM : INTEGER;
49 NB_POINT_BY_WINDOW : INTEGER);
50 PORT (
51 clk : IN STD_LOGIC;
52 rstn : IN STD_LOGIC;
53 restart_window : IN STD_LOGIC;
54 data_in : IN STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0);
55 data_in_valid : IN STD_LOGIC;
56 data_out : OUT STD_LOGIC_VECTOR(SIZE_DATA-1 DOWNTO 0);
57 data_out_valid : OUT STD_LOGIC;
58 param_in : IN STD_LOGIC_VECTOR(SIZE_PARAM-1 DOWNTO 0);
59 param_index : OUT INTEGER RANGE 0 TO NB_POINT_BY_WINDOW-1
60 );
61 END COMPONENT;
62
63 COMPONENT WF_rom
64 GENERIC (
65 SIZE_PARAM : INTEGER;
66 NB_POINT_BY_WINDOW : INTEGER);
67 PORT (
68 data : OUT STD_LOGIC_VECTOR(SIZE_PARAM-1 DOWNTO 0);
69 index : IN INTEGER RANGE 0 TO NB_POINT_BY_WINDOW-1);
70 END COMPONENT;
48
71
49 END window_function_pkg;
72 END window_function_pkg;
General Comments 0
You need to be logged in to leave comments. Login now