@@ -1,161 +1,169 | |||
|
1 | 1 | ------------------------------------------------------------------------------ |
|
2 | 2 | -- This file is a part of the LPP VHDL IP LIBRARY |
|
3 | 3 | -- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS |
|
4 | 4 | -- |
|
5 | 5 | -- This program is free software; you can redistribute it and/or modify |
|
6 | 6 | -- it under the terms of the GNU General Public License as published by |
|
7 | 7 | -- the Free Software Foundation; either version 3 of the License, or |
|
8 | 8 | -- (at your option) any later version. |
|
9 | 9 | -- |
|
10 | 10 | -- This program is distributed in the hope that it will be useful, |
|
11 | 11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12 | 12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
13 | 13 | -- GNU General Public License for more details. |
|
14 | 14 | -- |
|
15 | 15 | -- You should have received a copy of the GNU General Public License |
|
16 | 16 | -- along with this program; if not, write to the Free Software |
|
17 | 17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
18 | 18 | ------------------------------------------------------------------------------- |
|
19 | 19 | -- Author : Jean-christophe Pellion |
|
20 | 20 | -- Mail : jean-christophe.pellion@lpp.polytechnique.fr |
|
21 | 21 | -- jean-christophe.pellion@easii-ic.com |
|
22 | 22 | ---------------------------------------------------------------------------- |
|
23 | 23 | LIBRARY ieee; |
|
24 | 24 | USE ieee.std_logic_1164.ALL; |
|
25 | 25 | USE ieee.numeric_std.ALL; |
|
26 | 26 | LIBRARY grlib; |
|
27 | 27 | USE grlib.amba.ALL; |
|
28 | 28 | USE grlib.stdlib.ALL; |
|
29 | 29 | USE grlib.devices.ALL; |
|
30 | 30 | LIBRARY lpp; |
|
31 | 31 | USE lpp.lpp_lfr_pkg.ALL; |
|
32 | 32 | --USE lpp.lpp_amba.ALL; |
|
33 | 33 | USE lpp.apb_devices_list.ALL; |
|
34 | 34 | USE lpp.lpp_memory.ALL; |
|
35 | 35 | LIBRARY techmap; |
|
36 | 36 | USE techmap.gencomp.ALL; |
|
37 | 37 | |
|
38 | 38 | ENTITY lpp_lfr_apbreg_tb IS |
|
39 | 39 | GENERIC ( |
|
40 | 40 | pindex : INTEGER := 4; |
|
41 | 41 | paddr : INTEGER := 4; |
|
42 | 42 | pmask : INTEGER := 16#fff#); |
|
43 | 43 | PORT ( |
|
44 | 44 | -- AMBA AHB system signals |
|
45 | 45 | HCLK : IN STD_ULOGIC; |
|
46 | 46 | HRESETn : IN STD_ULOGIC; |
|
47 | 47 | |
|
48 | 48 | -- AMBA APB Slave Interface |
|
49 | 49 | apbi : IN apb_slv_in_type; |
|
50 | 50 | apbo : OUT apb_slv_out_type; |
|
51 | 51 | |
|
52 | 52 | --------------------------------------------------------------------------- |
|
53 | 53 | MEM_IN_SM_wData : OUT STD_LOGIC_VECTOR(16*2*5-1 DOWNTO 0); |
|
54 | 54 | MEM_IN_SM_wen : OUT STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
55 | 55 | MEM_IN_SM_Full_out : IN STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
56 | 56 | MEM_IN_SM_Empty_out : IN STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
57 | 57 | MEM_IN_SM_locked_out : IN STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
58 | 58 | --------------------------------------------------------------------------- |
|
59 | 59 | MEM_OUT_SM_ren : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); |
|
60 | 60 | MEM_OUT_SM_Data_out : IN STD_LOGIC_VECTOR(63 DOWNTO 0); |
|
61 | 61 | MEM_OUT_SM_Full : IN STD_LOGIC_VECTOR(1 DOWNTO 0); |
|
62 | 62 | MEM_OUT_SM_Full_2 : IN STD_LOGIC; |
|
63 | 63 | MEM_OUT_SM_Empty : IN STD_LOGIC_VECTOR(1 DOWNTO 0) |
|
64 | 64 | --------------------------------------------------------------------------- |
|
65 | 65 | ); |
|
66 | 66 | |
|
67 | 67 | END lpp_lfr_apbreg_tb; |
|
68 | 68 | |
|
69 | 69 | ARCHITECTURE beh OF lpp_lfr_apbreg_tb IS |
|
70 | 70 | |
|
71 | 71 | CONSTANT REVISION : INTEGER := 1; |
|
72 | 72 | |
|
73 | 73 | CONSTANT pconfig : apb_config_type := ( |
|
74 | 74 | 0 => ahb_device_reg (VENDOR_LPP, 16#19#, 0, REVISION, 1), |
|
75 | 75 | 1 => apb_iobar(paddr, pmask)); |
|
76 | 76 | |
|
77 | 77 | TYPE reg_debug_fft IS RECORD |
|
78 | 78 | MEM_IN_SM_wData : STD_LOGIC_VECTOR(16*2*5-1 DOWNTO 0); |
|
79 | 79 | MEM_IN_SM_wen : STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
80 | 80 | -- |
|
81 | 81 | out_ren : STD_LOGIC_VECTOR(1 DOWNTO 0); |
|
82 | 82 | END RECORD; |
|
83 | 83 | SIGNAL reg_ftt : reg_debug_fft; |
|
84 | 84 | |
|
85 | 85 | SIGNAL prdata : STD_LOGIC_VECTOR(31 DOWNTO 0); |
|
86 | 86 | |
|
87 | 87 | BEGIN -- beh |
|
88 | 88 | |
|
89 | 89 | --------------------------------------------------------------------------- |
|
90 | 90 | MEM_IN_SM_wen <= reg_ftt.MEM_IN_SM_wen; |
|
91 | 91 | MEM_IN_SM_wData <= reg_ftt.MEM_IN_SM_wData; |
|
92 | 92 | --------------------------------------------------------------------------- |
|
93 | 93 | MEM_OUT_SM_ren <= reg_ftt.out_ren; |
|
94 | 94 | --------------------------------------------------------------------------- |
|
95 | 95 | |
|
96 | 96 | lpp_lfr_apbreg : PROCESS (HCLK, HRESETn) |
|
97 | 97 | VARIABLE paddr : STD_LOGIC_VECTOR(7 DOWNTO 2); |
|
98 | 98 | BEGIN |
|
99 | 99 | IF HRESETn = '0' THEN |
|
100 | 100 | reg_ftt.MEM_IN_SM_wData <= (OTHERS => '0'); |
|
101 | ||
|
101 | 102 | reg_ftt.MEM_IN_SM_wen <= (OTHERS => '1'); |
|
102 | ||
|
103 | 103 | reg_ftt.out_ren <= (OTHERS => '1'); |
|
104 | 104 | |
|
105 | 105 | ELSIF HCLK'EVENT AND HCLK = '1' THEN -- rising clock edge |
|
106 | 106 | |
|
107 | 107 | reg_ftt.MEM_IN_SM_wen <= (OTHERS => '1'); |
|
108 | 108 | reg_ftt.out_ren <= (OTHERS => '1'); |
|
109 | 109 | |
|
110 | 110 | paddr := "000000"; |
|
111 | 111 | paddr(7 DOWNTO 2) := apbi.paddr(7 DOWNTO 2); |
|
112 | 112 | prdata <= (OTHERS => '0'); |
|
113 | 113 | IF apbi.psel(pindex) = '1' THEN |
|
114 | 114 | -- APB DMA READ -- |
|
115 | 115 | CASE paddr(7 DOWNTO 2) IS |
|
116 | 116 | --0 |
|
117 | 117 | WHEN "000000" => prdata(31 DOWNTO 0) <= reg_ftt.MEM_IN_SM_wData(32*1-1 DOWNTO 32*0); |
|
118 | 118 | WHEN "000001" => prdata(31 DOWNTO 0) <= reg_ftt.MEM_IN_SM_wData(32*2-1 DOWNTO 32*1); |
|
119 | 119 | WHEN "000010" => prdata(31 DOWNTO 0) <= reg_ftt.MEM_IN_SM_wData(32*3-1 DOWNTO 32*2); |
|
120 | 120 | WHEN "000011" => prdata(31 DOWNTO 0) <= reg_ftt.MEM_IN_SM_wData(32*4-1 DOWNTO 32*3); |
|
121 | 121 | WHEN "000100" => prdata(31 DOWNTO 0) <= reg_ftt.MEM_IN_SM_wData(32*5-1 DOWNTO 32*4); |
|
122 | 122 | WHEN "000101" => prdata( 4 DOWNTO 0) <= reg_ftt.MEM_IN_SM_wen; |
|
123 | 123 | prdata( 9 DOWNTO 5) <= MEM_IN_SM_Full_out; |
|
124 | 124 | prdata(14 DOWNTO 10) <= MEM_IN_SM_Empty_out; |
|
125 | 125 | prdata(19 DOWNTO 15) <= MEM_IN_SM_locked_out; |
|
126 | 126 | |
|
127 | 127 | WHEN "000110" => prdata(31 DOWNTO 0) <= MEM_OUT_SM_Data_out(32*1-1 DOWNTO 32*0); |
|
128 | 128 | WHEN "000111" => prdata(31 DOWNTO 0) <= MEM_OUT_SM_Data_out(32*2-1 DOWNTO 32*1); |
|
129 | 129 | |
|
130 | 130 | WHEN "001000" => prdata(1 DOWNTO 0) <= reg_ftt.out_ren; |
|
131 | 131 | prdata(3 DOWNTO 2) <= MEM_OUT_SM_Full; |
|
132 | 132 | prdata(5 DOWNTO 4) <= MEM_OUT_SM_Empty; |
|
133 | 133 | prdata(6) <= MEM_OUT_SM_Full_2; |
|
134 | 134 | WHEN OTHERS => NULL; |
|
135 | 135 | |
|
136 | 136 | END CASE; |
|
137 | 137 | IF (apbi.pwrite AND apbi.penable) = '1' THEN |
|
138 | 138 | -- APB DMA WRITE -- |
|
139 | 139 | CASE paddr(7 DOWNTO 2) IS |
|
140 | 140 | WHEN "000000" => reg_ftt.MEM_IN_SM_wData(32*1-1 DOWNTO 32*0) <= apbi.pwdata(31 DOWNTO 0); |
|
141 | 141 | WHEN "000001" => reg_ftt.MEM_IN_SM_wData(32*2-1 DOWNTO 32*1) <= apbi.pwdata(31 DOWNTO 0); |
|
142 | 142 | WHEN "000010" => reg_ftt.MEM_IN_SM_wData(32*3-1 DOWNTO 32*2) <= apbi.pwdata(31 DOWNTO 0); |
|
143 | 143 | WHEN "000011" => reg_ftt.MEM_IN_SM_wData(32*4-1 DOWNTO 32*3) <= apbi.pwdata(31 DOWNTO 0); |
|
144 | 144 | WHEN "000100" => reg_ftt.MEM_IN_SM_wData(32*5-1 DOWNTO 32*4) <= apbi.pwdata(31 DOWNTO 0); |
|
145 | 145 | WHEN "000101" => reg_ftt.MEM_IN_SM_wen <= apbi.pwdata(4 DOWNTO 0); |
|
146 | 146 | |
|
147 | 147 | WHEN "001000" => reg_ftt.out_ren <= apbi.pwdata(1 DOWNTO 0); |
|
148 | 148 | |
|
149 | 149 | WHEN OTHERS => NULL; |
|
150 | 150 | END CASE; |
|
151 | 151 | END IF; |
|
152 | ||
|
153 | --IF (apbi.psel(pindex) AND apbi.pwrite AND apbi.penable) = '1' AND paddr(7 DOWNTO 2) = "000101" THEN | |
|
154 | -- reg_ftt.MEM_IN_SM_wen <= apbi.pwdata(4 DOWNTO 0); | |
|
155 | --ELSE | |
|
156 | -- reg_ftt.MEM_IN_SM_wen <= (OTHERS => '1'); | |
|
157 | --END IF; | |
|
158 | ||
|
159 | ||
|
152 | 160 |
|
|
153 | 161 | |
|
154 | 162 | END IF; |
|
155 | 163 | END PROCESS lpp_lfr_apbreg; |
|
156 | 164 | |
|
157 | 165 | apbo.pindex <= pindex; |
|
158 | 166 | apbo.pconfig <= pconfig; |
|
159 | 167 | apbo.prdata <= prdata; |
|
160 | 168 | |
|
161 | 169 | END beh; |
@@ -1,220 +1,357 | |||
|
1 | 1 | LIBRARY IEEE; |
|
2 | 2 | USE IEEE.numeric_std.ALL; |
|
3 | 3 | USE IEEE.std_logic_1164.ALL; |
|
4 | 4 | |
|
5 | 5 | LIBRARY grlib; |
|
6 | 6 | USE grlib.amba.ALL; |
|
7 | 7 | USE grlib.stdlib.ALL; |
|
8 | 8 | |
|
9 | 9 | LIBRARY lpp; |
|
10 | 10 | USE lpp.iir_filter.ALL; |
|
11 | 11 | |
|
12 | 12 | ENTITY testbench_ms IS |
|
13 | 13 | |
|
14 | 14 | END testbench_ms; |
|
15 | 15 | |
|
16 | 16 | ARCHITECTURE tb OF testbench_ms IS |
|
17 | 17 | ----------------------------------------------------------------------------- |
|
18 | 18 | -- COMPONENT ---------------------------------------------------------------- |
|
19 | 19 | ----------------------------------------------------------------------------- |
|
20 | 20 | COMPONENT lpp_lfr_apbreg_tb |
|
21 | 21 | GENERIC ( |
|
22 | 22 | pindex : INTEGER; |
|
23 | 23 | paddr : INTEGER; |
|
24 | 24 | pmask : INTEGER); |
|
25 | 25 | PORT ( |
|
26 | 26 | HCLK : IN STD_ULOGIC; |
|
27 | 27 | HRESETn : IN STD_ULOGIC; |
|
28 | 28 | apbi : IN apb_slv_in_type; |
|
29 | 29 | apbo : OUT apb_slv_out_type; |
|
30 | 30 | MEM_IN_SM_wData : OUT STD_LOGIC_VECTOR(16*2*5-1 DOWNTO 0); |
|
31 | 31 | MEM_IN_SM_wen : OUT STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
32 | 32 | MEM_IN_SM_Full_out : IN STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
33 | 33 | MEM_IN_SM_Empty_out : IN STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
34 | 34 | MEM_IN_SM_locked_out : IN STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
35 | 35 | MEM_OUT_SM_ren : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); |
|
36 | 36 | MEM_OUT_SM_Data_out : IN STD_LOGIC_VECTOR(63 DOWNTO 0); |
|
37 | 37 | MEM_OUT_SM_Full : IN STD_LOGIC_VECTOR(1 DOWNTO 0); |
|
38 | 38 | MEM_OUT_SM_Full_2 : IN STD_LOGIC; |
|
39 | 39 | MEM_OUT_SM_Empty : IN STD_LOGIC_VECTOR(1 DOWNTO 0)); |
|
40 | 40 | END COMPONENT; |
|
41 | 41 | |
|
42 | 42 | COMPONENT lpp_lfr_ms_tb |
|
43 | 43 | GENERIC ( |
|
44 | 44 | Mem_use : INTEGER); |
|
45 | 45 | PORT ( |
|
46 | 46 | clk : IN STD_LOGIC; |
|
47 | 47 | rstn : IN STD_LOGIC; |
|
48 | 48 | MEM_IN_SM_wData : IN STD_LOGIC_VECTOR(16*2*5-1 DOWNTO 0); |
|
49 | 49 | MEM_IN_SM_wen : IN STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
50 | 50 | MEM_IN_SM_Full_out : OUT STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
51 | 51 | MEM_IN_SM_Empty_out : OUT STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
52 | 52 | MEM_IN_SM_locked_out : OUT STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
53 | 53 | MEM_OUT_SM_Read : IN STD_LOGIC_VECTOR(1 DOWNTO 0); |
|
54 | 54 | MEM_OUT_SM_Data_out : OUT STD_LOGIC_VECTOR(63 DOWNTO 0); |
|
55 | 55 | MEM_OUT_SM_Full_pad : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); |
|
56 | 56 | MEM_OUT_SM_Full_pad_2 : OUT STD_LOGIC; |
|
57 | 57 | MEM_OUT_SM_Empty_pad : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); |
|
58 | 58 | error_input_fifo_write : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); |
|
59 | 59 | observation_vector_0 : OUT STD_LOGIC_VECTOR(11 DOWNTO 0); |
|
60 | 60 | observation_vector_1 : OUT STD_LOGIC_VECTOR(11 DOWNTO 0)); |
|
61 | 61 | END COMPONENT; |
|
62 | 62 | |
|
63 | 63 | ----------------------------------------------------------------------------- |
|
64 | 64 | -- SIGNAL ------------------------------------------------------------------- |
|
65 | 65 | ----------------------------------------------------------------------------- |
|
66 | 66 | SIGNAL clk : STD_LOGIC := '0'; |
|
67 | 67 | SIGNAL rstn : STD_LOGIC := '0'; |
|
68 | 68 | SIGNAL apbi : apb_slv_in_type; |
|
69 | 69 | SIGNAL apbo : apb_slv_out_type; |
|
70 | 70 | |
|
71 | 71 | SIGNAL MEM_OUT_SM_ren : STD_LOGIC_VECTOR(1 DOWNTO 0); |
|
72 | 72 | SIGNAL MEM_OUT_SM_Data_out : STD_LOGIC_VECTOR(63 DOWNTO 0); |
|
73 | 73 | SIGNAL MEM_OUT_SM_Full_pad : STD_LOGIC_VECTOR(1 DOWNTO 0); |
|
74 | 74 | SIGNAL MEM_OUT_SM_Full_pad_2 : STD_LOGIC; |
|
75 | 75 | SIGNAL MEM_OUT_SM_Empty_pad : STD_LOGIC_VECTOR(1 DOWNTO 0); |
|
76 | 76 | |
|
77 | 77 | SIGNAL MEM_IN_SM_wData : STD_LOGIC_VECTOR(16*2*5-1 DOWNTO 0); |
|
78 | 78 | SIGNAL MEM_IN_SM_wen : STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
79 | 79 | SIGNAL MEM_IN_SM_Full_out : STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
80 | 80 | SIGNAL MEM_IN_SM_Empty_out : STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
81 | 81 | SIGNAL MEM_IN_SM_locked_out : STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
82 | 82 | |
|
83 | 83 | |
|
84 | 84 | ----------------------------------------------------------------------------- |
|
85 | 85 | -- FFT |
|
86 | 86 | ----------------------------------------------------------------------------- |
|
87 |
TYPE fft_tab_type IS ARRAY ( |
|
|
87 | TYPE fft_tab_type IS ARRAY (127 DOWNTO 0) OF STD_LOGIC_VECTOR(15 DOWNTO 0); | |
|
88 | 88 | SIGNAL fft_1_re : fft_tab_type; |
|
89 | 89 | SIGNAL fft_1_im : fft_tab_type; |
|
90 | 90 | SIGNAL fft_2_re : fft_tab_type; |
|
91 | 91 | SIGNAL fft_2_im : fft_tab_type; |
|
92 | 92 | SIGNAL fft_3_re : fft_tab_type; |
|
93 | 93 | SIGNAL fft_3_im : fft_tab_type; |
|
94 | 94 | SIGNAL fft_4_re : fft_tab_type; |
|
95 | 95 | SIGNAL fft_4_im : fft_tab_type; |
|
96 | 96 | SIGNAL fft_5_re : fft_tab_type; |
|
97 | 97 | SIGNAL fft_5_im : fft_tab_type; |
|
98 | 98 | |
|
99 | 99 | SIGNAL counter_1 : INTEGER; |
|
100 | 100 | SIGNAL counter_2 : INTEGER; |
|
101 | 101 | SIGNAL counter_3 : INTEGER; |
|
102 | 102 | SIGNAL counter_4 : INTEGER; |
|
103 | 103 | SIGNAL counter_5 : INTEGER; |
|
104 | 104 | |
|
105 | SIGNAL not_full : STD_LOGIC; | |
|
106 | ||
|
107 | TYPE ms_component_tab_type IS ARRAY (0 TO 1, 127 DOWNTO 0) OF STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
108 | TYPE spectral_matrix_type IS ARRAY (0 TO 5, 0 TO 5) OF ms_component_tab_type; | |
|
109 | ||
|
110 | SIGNAL spectral_matrix_data : spectral_matrix_type; | |
|
111 | ||
|
112 | CONSTANT DIRAC_FREQ : INTEGER := 0; | |
|
113 | CONSTANT DIRAC_FREQ2 : INTEGER := 10; | |
|
114 | CONSTANT DIRAC_FREQ3 : INTEGER := 127; | |
|
115 | CONSTANT FFT_RE : STD_LOGIC_VECTOR(15 DOWNTO 0) := x"0020"; | |
|
116 | CONSTANT FFT_IM : STD_LOGIC_VECTOR(15 DOWNTO 0) := x"0010"; | |
|
105 | 117 | |
|
106 | 118 | BEGIN -- tb |
|
107 | 119 | |
|
108 | 120 | |
|
109 | 121 | clk <= NOT clk AFTER 20 ns; |
|
110 | 122 | rstn <= '1' AFTER 100 ns; |
|
111 | 123 | |
|
112 | 124 | PROCESS (clk, rstn) |
|
113 | 125 | BEGIN |
|
114 | 126 | IF rstn = '0' THEN -- asynchronous reset (active low) |
|
115 |
all_data: FOR i IN |
|
|
127 | all_data: FOR i IN 127 DOWNTO 0 LOOP | |
|
116 | 128 | fft_1_re(I) <= (OTHERS => '0'); |
|
117 | 129 | fft_1_im(I) <= (OTHERS => '0'); |
|
118 | 130 | fft_2_re(I) <= (OTHERS => '0'); |
|
119 | 131 | fft_2_im(I) <= (OTHERS => '0'); |
|
120 | 132 | fft_3_re(I) <= (OTHERS => '0'); |
|
121 | 133 | fft_3_im(I) <= (OTHERS => '0'); |
|
122 | 134 | fft_4_re(I) <= (OTHERS => '0'); |
|
123 | 135 | fft_4_im(I) <= (OTHERS => '0'); |
|
124 | 136 | fft_5_re(I) <= (OTHERS => '0'); |
|
125 | 137 | fft_5_im(I) <= (OTHERS => '0'); |
|
126 | 138 | END LOOP all_data; |
|
127 | fft_1_re(8*0) <= x"0fff"; | |
|
128 | fft_1_im(8*0) <= x"0010"; | |
|
129 | fft_2_re(8*1) <= x"0010"; | |
|
130 | fft_2_im(8*1+1) <= x"0040"; | |
|
131 | fft_3_re(8*2) <= x"0010"; | |
|
132 | fft_3_im(8*3) <= x"0100"; | |
|
133 | fft_4_re(8*4) <= x"0001"; | |
|
134 | fft_4_im(8*5) <= x"0111"; | |
|
135 | fft_5_re(8*6) <= x"0033"; | |
|
136 | fft_5_im(8*7) <= x"0444"; | |
|
139 | ||
|
140 | fft_1_re(DIRAC_FREQ) <= FFT_RE; | |
|
141 | fft_1_im(DIRAC_FREQ) <= FFT_IM; | |
|
142 | fft_1_re(DIRAC_FREQ) <= FFT_RE; | |
|
143 | fft_1_im(DIRAC_FREQ) <= FFT_IM; | |
|
144 | fft_2_re(DIRAC_FREQ) <= FFT_RE; | |
|
145 | fft_2_im(DIRAC_FREQ) <= FFT_IM; | |
|
146 | fft_3_re(DIRAC_FREQ) <= FFT_RE; | |
|
147 | fft_3_im(DIRAC_FREQ) <= FFT_IM; | |
|
148 | fft_4_re(DIRAC_FREQ) <= FFT_RE; | |
|
149 | fft_4_im(DIRAC_FREQ) <= FFT_IM; | |
|
150 | fft_5_re(DIRAC_FREQ) <= FFT_RE; | |
|
151 | fft_5_im(DIRAC_FREQ) <= FFT_IM; | |
|
152 | ||
|
153 | --fft_1_re(DIRAC_FREQ2) <= FFT_RE; | |
|
154 | --fft_1_im(DIRAC_FREQ2) <= FFT_IM; | |
|
155 | --fft_1_re(DIRAC_FREQ2) <= FFT_RE; | |
|
156 | --fft_1_im(DIRAC_FREQ2) <= FFT_IM; | |
|
157 | --fft_2_re(DIRAC_FREQ2) <= FFT_RE; | |
|
158 | --fft_2_im(DIRAC_FREQ2) <= FFT_IM; | |
|
159 | --fft_3_re(DIRAC_FREQ2) <= FFT_RE; | |
|
160 | --fft_3_im(DIRAC_FREQ2) <= FFT_IM; | |
|
161 | --fft_4_re(DIRAC_FREQ2) <= FFT_RE; | |
|
162 | --fft_4_im(DIRAC_FREQ2) <= FFT_IM; | |
|
163 | --fft_5_re(DIRAC_FREQ2) <= FFT_RE; | |
|
164 | --fft_5_im(DIRAC_FREQ2) <= FFT_IM; | |
|
165 | ||
|
166 | --fft_1_re(DIRAC_FREQ3) <= FFT_RE; | |
|
167 | --fft_1_im(DIRAC_FREQ3) <= FFT_IM; | |
|
168 | --fft_1_re(DIRAC_FREQ3) <= FFT_RE; | |
|
169 | --fft_1_im(DIRAC_FREQ3) <= FFT_IM; | |
|
170 | --fft_2_re(DIRAC_FREQ3) <= FFT_RE; | |
|
171 | --fft_2_im(DIRAC_FREQ3) <= FFT_IM; | |
|
172 | --fft_3_re(DIRAC_FREQ3) <= FFT_RE; | |
|
173 | --fft_3_im(DIRAC_FREQ3) <= FFT_IM; | |
|
174 | --fft_4_re(DIRAC_FREQ3) <= FFT_RE; | |
|
175 | --fft_4_im(DIRAC_FREQ3) <= FFT_IM; | |
|
176 | --fft_5_re(DIRAC_FREQ3) <= FFT_RE; | |
|
177 | --fft_5_im(DIRAC_FREQ3) <= FFT_IM; | |
|
137 | 178 | |
|
138 | 179 | counter_1 <= 0; |
|
139 | 180 | counter_2 <= 0; |
|
140 | 181 | counter_3 <= 0; |
|
141 | 182 | counter_4 <= 0; |
|
142 | 183 | counter_5 <= 0; |
|
143 | 184 | |
|
144 |
|
|
|
145 | MEM_OUT_SM_ren <= (OTHERS => '1'); | |
|
185 | -- MEM_IN_SM_wen <= (OTHERS => '1'); | |
|
186 | -- MEM_OUT_SM_ren <= (OTHERS => '1'); | |
|
146 | 187 | |
|
147 | 188 | ELSIF clk'event AND clk = '1' THEN -- rising clock edge |
|
148 | IF MEM_IN_SM_locked_out(0) = '0' AND MEM_IN_SM_Full_out(0) = '0' THEN | |
|
149 | counter_1 <= counter_1 + 1; | |
|
150 | MEM_IN_SM_wData(15 DOWNTO 0) <= fft_1_re(counter_1); | |
|
151 | MEM_IN_SM_wData(31 DOWNTO 16) <= fft_1_im(counter_1); | |
|
152 | MEM_IN_SM_wen(0) <= '0'; | |
|
153 | ELSE | |
|
154 | counter_1 <= 0; | |
|
155 | MEM_IN_SM_wData(31 DOWNTO 0) <= (OTHERS => 'X'); | |
|
156 |
|
|
|
157 | END IF; | |
|
189 | --IF MEM_IN_SM_locked_out(0) = '0' AND MEM_IN_SM_Full_out(0) = '0' THEN | |
|
190 | -- counter_1 <= counter_1 + 1; | |
|
191 | -- MEM_IN_SM_wData(15 DOWNTO 0) <= fft_1_re(counter_1); | |
|
192 | -- MEM_IN_SM_wData(31 DOWNTO 16) <= fft_1_im(counter_1); | |
|
193 | -- MEM_IN_SM_wen(0) <= '0'; | |
|
194 | --ELSE | |
|
195 | -- counter_1 <= 0; | |
|
196 | -- MEM_IN_SM_wData(31 DOWNTO 0) <= (OTHERS => 'X'); | |
|
197 | -- MEM_IN_SM_wen(0) <= '1'; | |
|
198 | --END IF; | |
|
158 | 199 | |
|
159 | 200 | END IF; |
|
160 | 201 | END PROCESS; |
|
161 | 202 | |
|
203 | PROCESS | |
|
204 | BEGIN -- PROCESS | |
|
205 | WAIT FOR 1 us; | |
|
206 | not_full <= '0'; | |
|
207 | WAIT UNTIL clk = '1' AND clk'EVENT; | |
|
208 | loop_DATA_write: FOR I IN 0 TO 127 LOOP | |
|
209 | apbi.pwdata <= fft_1_im(I) & fft_1_re(I); | |
|
210 | apbi.psel(15) <= '1'; | |
|
211 | apbi.paddr(7 DOWNTO 2) <= "000000"; | |
|
212 | apbi.penable <= '1'; | |
|
213 | apbi.pwrite <= '1'; | |
|
214 | WAIT UNTIL clk = '1' AND clk'EVENT; | |
|
162 | 215 | |
|
216 | apbi.pwdata <= fft_2_im(I) & fft_2_re(I); | |
|
217 | apbi.psel(15) <= '1'; | |
|
218 | apbi.paddr(7 DOWNTO 2) <= "000001"; | |
|
219 | apbi.penable <= '1'; | |
|
220 | apbi.pwrite <= '1'; | |
|
221 | WAIT UNTIL clk = '1' AND clk'EVENT; | |
|
222 | ||
|
223 | apbi.pwdata <= fft_3_im(I) & fft_3_re(I); | |
|
224 | apbi.psel(15) <= '1'; | |
|
225 | apbi.paddr(7 DOWNTO 2) <= "000010"; | |
|
226 | apbi.penable <= '1'; | |
|
227 | apbi.pwrite <= '1'; | |
|
228 | WAIT UNTIL clk = '1' AND clk'EVENT; | |
|
229 | ||
|
230 | apbi.pwdata <= fft_4_im(I) & fft_4_re(I); | |
|
231 | apbi.psel(15) <= '1'; | |
|
232 | apbi.paddr(7 DOWNTO 2) <= "000011"; | |
|
233 | apbi.penable <= '1'; | |
|
234 | apbi.pwrite <= '1'; | |
|
235 | WAIT UNTIL clk = '1' AND clk'EVENT; | |
|
236 | ||
|
237 | apbi.pwdata <= fft_5_im(I) & fft_5_re(I); | |
|
238 | apbi.psel(15) <= '1'; | |
|
239 | apbi.paddr(7 DOWNTO 2) <= "000100"; | |
|
240 | apbi.penable <= '1'; | |
|
241 | apbi.pwrite <= '1'; | |
|
242 | WAIT UNTIL clk = '1' AND clk'EVENT; | |
|
243 | ||
|
244 | apbi.pwdata <= X"FFFFFFE0"; | |
|
245 | apbi.psel(15) <= '1'; | |
|
246 | apbi.paddr(7 DOWNTO 2) <= "000101"; | |
|
247 | apbi.penable <= '1'; | |
|
248 | apbi.pwrite <= '1'; | |
|
249 | WAIT UNTIL clk = '1' AND clk'EVENT; | |
|
250 | ||
|
251 | apbi.pwrite <= '0'; | |
|
252 | END LOOP loop_DATA_write; | |
|
253 | ||
|
254 | ||
|
255 | WAIT UNTIL clk = '1' AND clk'EVENT; | |
|
256 | ||
|
257 | not_full <= '0'; | |
|
258 | ||
|
259 | tant_que_not_full: WHILE not_full = '0' LOOP | |
|
260 | -- apbi.pwdata <= X"FFFFFFE0"; | |
|
261 | apbi.psel(15) <= '1'; | |
|
262 | apbi.paddr(7 DOWNTO 2) <= "001000"; | |
|
263 | apbi.penable <= '1'; | |
|
264 | WAIT UNTIL clk = '1' AND clk'EVENT; | |
|
265 | not_full <= apbo.prdata(3); | |
|
266 | END LOOP tant_que_not_full; | |
|
267 | ||
|
268 | ||
|
269 | all_data_0: FOR I IN 0 TO 127 LOOP | |
|
270 | WAIT UNTIL clk = '1' AND clk'EVENT; | |
|
271 | --apbi.pwdata <= X"FFFFFFFE"; | |
|
272 | apbi.psel(15) <= '1'; | |
|
273 | apbi.paddr(7 DOWNTO 2) <= "000110"; | |
|
274 | apbi.penable <= '1'; | |
|
275 | apbi.pwrite <= '0'; | |
|
276 | WAIT UNTIL clk = '1' AND clk'EVENT; | |
|
277 | apbi.penable <= '0'; | |
|
278 | spectral_matrix_data(0,0)(0,I) <= apbo.prdata; | |
|
279 | spectral_matrix_data(0,0)(1,I) <= (OTHERS => '0'); | |
|
280 | WAIT UNTIL clk = '1' AND clk'EVENT; | |
|
281 | apbi.pwdata <= X"FFFFFFFE"; | |
|
282 | apbi.psel(15) <= '1'; | |
|
283 | apbi.paddr(7 DOWNTO 2) <= "001000"; | |
|
284 | apbi.penable <= '1'; | |
|
285 | apbi.pwrite <= '1'; | |
|
286 | WAIT UNTIL clk = '1' AND clk'EVENT; | |
|
287 | apbi.pwrite <= '0'; | |
|
288 | apbi.penable <= '0'; | |
|
289 | WAIT UNTIL clk = '1' AND clk'EVENT; | |
|
290 | END LOOP all_data_0; | |
|
291 | ||
|
292 | ||
|
293 | ||
|
294 | WAIT FOR 100 us; | |
|
295 | ||
|
296 | REPORT "*** END simulation ***" SEVERITY failure; | |
|
297 | WAIT; | |
|
298 | ||
|
299 | END PROCESS; | |
|
163 | 300 | |
|
164 | 301 | |
|
165 | 302 | |
|
166 | 303 | |
|
167 | 304 | |
|
168 | 305 | |
|
169 | 306 | ------------------------------------------------------------------------------- |
|
170 | 307 | -- MS ------------------------------------------------------------------------ |
|
171 | 308 | ------------------------------------------------------------------------------- |
|
172 | 309 | |
|
173 |
|
|
|
174 |
|
|
|
175 |
|
|
|
176 |
|
|
|
177 |
|
|
|
178 |
|
|
|
179 |
|
|
|
180 |
|
|
|
181 |
|
|
|
182 |
|
|
|
310 | lpp_lfr_apbreg_1 : lpp_lfr_apbreg_tb | |
|
311 | GENERIC MAP ( | |
|
312 | pindex => 15, | |
|
313 | paddr => 15, | |
|
314 | pmask => 16#fff#) | |
|
315 | PORT MAP ( | |
|
316 | HCLK => clk, | |
|
317 | HRESETn => rstn, | |
|
318 | apbi => apbi, | |
|
319 | apbo => apbo, | |
|
183 | 320 | |
|
184 |
|
|
|
185 |
|
|
|
186 |
|
|
|
187 |
|
|
|
188 |
|
|
|
321 | MEM_IN_SM_wData => MEM_IN_SM_wData, | |
|
322 | MEM_IN_SM_wen => MEM_IN_SM_wen, | |
|
323 | MEM_IN_SM_Full_out => MEM_IN_SM_Full_out, | |
|
324 | MEM_IN_SM_Empty_out => MEM_IN_SM_Empty_out, | |
|
325 | MEM_IN_SM_locked_out => MEM_IN_SM_locked_out, | |
|
189 | 326 |
|
|
190 |
|
|
|
191 |
|
|
|
192 |
|
|
|
193 |
|
|
|
194 |
|
|
|
327 | MEM_OUT_SM_ren => MEM_OUT_SM_ren , | |
|
328 | MEM_OUT_SM_Data_out => MEM_OUT_SM_Data_out , | |
|
329 | MEM_OUT_SM_Full => MEM_OUT_SM_Full_pad , | |
|
330 | MEM_OUT_SM_Full_2 => MEM_OUT_SM_Full_pad_2 , | |
|
331 | MEM_OUT_SM_Empty => MEM_OUT_SM_Empty_pad); | |
|
195 | 332 | |
|
196 | 333 | lpp_lfr_ms_tb_1 : lpp_lfr_ms_tb |
|
197 | 334 | GENERIC MAP ( |
|
198 |
Mem_use => use_ |
|
|
335 | Mem_use => use_RAM)-- use_RAM use_CEL | |
|
199 | 336 | PORT MAP ( |
|
200 | 337 | clk => clk, |
|
201 | 338 | rstn => rstn, |
|
202 | 339 | |
|
203 | 340 | MEM_IN_SM_wData => MEM_IN_SM_wData, |
|
204 | 341 | MEM_IN_SM_wen => MEM_IN_SM_wen, |
|
205 | 342 | MEM_IN_SM_Full_out => MEM_IN_SM_Full_out, |
|
206 | 343 | MEM_IN_SM_Empty_out => MEM_IN_SM_Empty_out, |
|
207 | 344 | MEM_IN_SM_locked_out => MEM_IN_SM_locked_out, |
|
208 | 345 | |
|
209 | 346 | MEM_OUT_SM_Read => MEM_OUT_SM_ren , |
|
210 | 347 | MEM_OUT_SM_Data_out => MEM_OUT_SM_Data_out , |
|
211 | 348 | MEM_OUT_SM_Full_pad => MEM_OUT_SM_Full_pad , |
|
212 | 349 | MEM_OUT_SM_Full_pad_2 => MEM_OUT_SM_Full_pad_2 , |
|
213 | 350 | MEM_OUT_SM_Empty_pad => MEM_OUT_SM_Empty_pad, |
|
214 | 351 | |
|
215 | 352 | error_input_fifo_write => OPEN, |
|
216 | 353 | observation_vector_0 => OPEN, |
|
217 | 354 | observation_vector_1 => OPEN); |
|
218 | 355 | |
|
219 | 356 | ----------------------------------------------------------------------------- |
|
220 | 357 | END tb; |
@@ -1,100 +1,109 | |||
|
1 | 1 | ------------------------------------------------------------------------------ |
|
2 | 2 | -- This file is a part of the LPP VHDL IP LIBRARY |
|
3 | 3 | -- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS |
|
4 | 4 | -- |
|
5 | 5 | -- This program is free software; you can redistribute it and/or modify |
|
6 | 6 | -- it under the terms of the GNU General Public License as published by |
|
7 | 7 | -- the Free Software Foundation; either version 3 of the License, or |
|
8 | 8 | -- (at your option) any later version. |
|
9 | 9 | -- |
|
10 | 10 | -- This program is distributed in the hope that it will be useful, |
|
11 | 11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12 | 12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
13 | 13 | -- GNU General Public License for more details. |
|
14 | 14 | -- |
|
15 | 15 | -- You should have received a copy of the GNU General Public License |
|
16 | 16 | -- along with this program; if not, write to the Free Software |
|
17 | 17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
18 | 18 | ------------------------------------------------------------------------------ |
|
19 | 19 | -- Author : Alexis Jeandet |
|
20 | 20 | -- Mail : alexis.jeandet@lpp.polytechnique.fr |
|
21 | 21 | ------------------------------------------------------------------------------ |
|
22 | library ieee; | |
|
23 |
|
|
|
24 |
|
|
|
22 | LIBRARY ieee; | |
|
23 | USE ieee.std_logic_1164.ALL; | |
|
24 | USE IEEE.numeric_std.ALL; | |
|
25 | 25 | |
|
26 | entity RAM_CEL is | |
|
27 | generic(DataSz : integer range 1 to 32 := 8; | |
|
28 | abits : integer range 2 to 12 := 8); | |
|
29 | port( WD : in std_logic_vector(DataSz-1 downto 0); RD : out | |
|
30 | std_logic_vector(DataSz-1 downto 0);WEN, REN : in std_logic; | |
|
31 | WADDR : in std_logic_vector(abits-1 downto 0); RADDR : in | |
|
32 | std_logic_vector(abits-1 downto 0);RWCLK, RESET : in std_logic | |
|
26 | ENTITY RAM_CEL IS | |
|
27 | GENERIC( | |
|
28 | DataSz : INTEGER RANGE 1 TO 32 := 8; | |
|
29 | abits : INTEGER RANGE 2 TO 12 := 8); | |
|
30 | PORT( | |
|
31 | WD : IN STD_LOGIC_VECTOR(DataSz-1 DOWNTO 0); | |
|
32 | RD : OUT STD_LOGIC_VECTOR(DataSz-1 DOWNTO 0); | |
|
33 | WEN, REN : IN STD_LOGIC; | |
|
34 | WADDR : IN STD_LOGIC_VECTOR(abits-1 DOWNTO 0); | |
|
35 | RADDR : IN STD_LOGIC_VECTOR(abits-1 DOWNTO 0); | |
|
36 | RWCLK, RESET : IN STD_LOGIC | |
|
33 | 37 |
|
|
34 |
|
|
|
38 | END RAM_CEL; | |
|
35 | 39 | |
|
36 | 40 | |
|
37 | 41 | |
|
38 | architecture ar_RAM_CEL of RAM_CEL is | |
|
42 | ARCHITECTURE ar_RAM_CEL OF RAM_CEL IS | |
|
39 | 43 | |
|
40 | constant VectInit : std_logic_vector(DataSz-1 downto 0):=(others => '0'); | |
|
41 | constant MAX : integer := 2**(abits); | |
|
44 | CONSTANT VectInit : STD_LOGIC_VECTOR(DataSz-1 DOWNTO 0) := (OTHERS => '0'); | |
|
45 | CONSTANT MAX : INTEGER := 2**(abits); | |
|
42 | 46 | |
|
43 | type RAMarrayT is array (0 to MAX-1) of std_logic_vector(DataSz-1 downto 0); | |
|
47 | TYPE RAMarrayT IS ARRAY (0 TO MAX-1) OF STD_LOGIC_VECTOR(DataSz-1 DOWNTO 0); | |
|
44 | 48 | |
|
45 |
|
|
|
46 | signal RD_int : std_logic_vector(DataSz-1 downto 0); | |
|
49 | SIGNAL RAMarray : RAMarrayT := (OTHERS => VectInit); | |
|
50 | SIGNAL RD_int : STD_LOGIC_VECTOR(DataSz-1 DOWNTO 0); | |
|
47 | 51 | |
|
48 | begin | |
|
52 | SIGNAL RADDR_reg : STD_LOGIC_VECTOR(abits-1 DOWNTO 0); | |
|
49 | 53 | |
|
50 | RD_int <= RAMarray(to_integer(unsigned(RADDR))); | |
|
54 | BEGIN | |
|
55 | ||
|
56 | RD_int <= RAMarray(to_integer(UNSIGNED(RADDR))); | |
|
51 | 57 | |
|
52 | 58 | |
|
53 |
|
|
|
54 | begin | |
|
55 |
|
|
|
59 | PROCESS(RWclk, reset) | |
|
60 | BEGIN | |
|
61 | IF reset = '0' THEN | |
|
56 | 62 |
|
|
57 | rst:for i in 0 to MAX-1 loop | |
|
58 |
RAMarray(i) |
|
|
59 | end loop; | |
|
63 | rst : FOR i IN 0 TO MAX-1 LOOP | |
|
64 | RAMarray(i) <= (OTHERS => '0'); | |
|
65 | END LOOP; | |
|
60 | 66 | |
|
61 | elsif RWclk'event and RWclk = '1' then | |
|
62 |
|
|
|
67 | ELSIF RWclk'EVENT AND RWclk = '1' THEN | |
|
68 | -- IF REN = '0' THEN | |
|
63 | 69 |
|
|
64 | end if; | |
|
70 | -- END IF; | |
|
71 | IF REN = '0' THEN | |
|
72 | RADDR_reg <= RADDR; | |
|
73 | END IF; | |
|
65 | 74 | |
|
66 |
|
|
|
67 |
RAMarray(to_integer( |
|
|
68 | end if; | |
|
75 | IF WEN = '0' THEN | |
|
76 | RAMarray(to_integer(UNSIGNED(WADDR))) <= WD; | |
|
77 | END IF; | |
|
69 | 78 | |
|
70 | end if; | |
|
71 | end process; | |
|
72 |
|
|
|
79 | END IF; | |
|
80 | END PROCESS; | |
|
81 | END ar_RAM_CEL; | |
|
73 | 82 | |
|
74 | 83 | |
|
75 | 84 | |
|
76 | 85 | |
|
77 | 86 | |
|
78 | 87 | |
|
79 | 88 | |
|
80 | 89 | |
|
81 | 90 | |
|
82 | 91 | |
|
83 | 92 | |
|
84 | 93 | |
|
85 | 94 | |
|
86 | 95 | |
|
87 | 96 | |
|
88 | 97 | |
|
89 | 98 | |
|
90 | 99 | |
|
91 | 100 | |
|
92 | 101 | |
|
93 | 102 | |
|
94 | 103 | |
|
95 | 104 | |
|
96 | 105 | |
|
97 | 106 | |
|
98 | 107 | |
|
99 | 108 | |
|
100 | 109 |
@@ -1,225 +1,253 | |||
|
1 | 1 | LIBRARY IEEE; |
|
2 | 2 | USE IEEE.std_logic_1164.ALL; |
|
3 | 3 | |
|
4 | 4 | LIBRARY lpp; |
|
5 | 5 | USE lpp.general_purpose.ALL; |
|
6 | 6 | |
|
7 | 7 | ENTITY MS_calculation IS |
|
8 | 8 | PORT ( |
|
9 | 9 | clk : IN STD_LOGIC; |
|
10 | 10 | rstn : IN STD_LOGIC; |
|
11 | 11 | -- IN |
|
12 | 12 | fifo_in_data : IN STD_LOGIC_VECTOR(32*2-1 DOWNTO 0); |
|
13 | 13 | fifo_in_ren : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); |
|
14 | 14 | fifo_in_empty : IN STD_LOGIC_VECTOR(1 DOWNTO 0); |
|
15 | 15 | -- OUT |
|
16 | 16 | fifo_out_data : OUT STD_LOGIC_VECTOR(32-1 DOWNTO 0); |
|
17 | 17 | fifo_out_wen : OUT STD_LOGIC; |
|
18 | 18 | fifo_out_full : IN STD_LOGIC; |
|
19 | 19 | -- |
|
20 | 20 | correlation_start : IN STD_LOGIC; |
|
21 | 21 | correlation_auto : IN STD_LOGIC; -- 1 => auto correlation / 0 => inter correlation |
|
22 | 22 | |
|
23 | 23 | correlation_begin : OUT STD_LOGIC; |
|
24 | 24 | correlation_done : OUT STD_LOGIC |
|
25 | 25 | ); |
|
26 | 26 | END MS_calculation; |
|
27 | 27 | |
|
28 | 28 | ARCHITECTURE beh OF MS_calculation IS |
|
29 | 29 | |
|
30 | 30 | TYPE fsm_calculation_MS IS (IDLE, WF, S1, S2, S3, S4, WFa, S1a, S2a); |
|
31 | 31 | SIGNAL state : fsm_calculation_MS; |
|
32 | 32 | |
|
33 | 33 | SIGNAL OP1 : STD_LOGIC_VECTOR(15 DOWNTO 0); |
|
34 | 34 | SIGNAL OP2 : STD_LOGIC_VECTOR(15 DOWNTO 0); |
|
35 | 35 | SIGNAL RES : STD_LOGIC_VECTOR(31 DOWNTO 0); |
|
36 | 36 | |
|
37 | 37 | SIGNAL ALU_CTRL : STD_LOGIC_VECTOR(4 DOWNTO 0); |
|
38 | 38 | |
|
39 | 39 | |
|
40 | 40 | CONSTANT ALU_CTRL_NOP : STD_LOGIC_VECTOR(4 DOWNTO 0) := "00000"; |
|
41 | 41 | CONSTANT ALU_CTRL_MULT : STD_LOGIC_VECTOR(4 DOWNTO 0) := "00010"; |
|
42 | 42 | CONSTANT ALU_CTRL_MAC : STD_LOGIC_VECTOR(4 DOWNTO 0) := "00001"; |
|
43 | 43 | CONSTANT ALU_CTRL_MACn : STD_LOGIC_VECTOR(4 DOWNTO 0) := "10001"; |
|
44 | 44 | |
|
45 | ||
|
45 | SIGNAL select_ctrl : STD_LOGIC_VECTOR(1 DOWNTO 0); | |
|
46 | CONSTANT select_ctrl_NOP : STD_LOGIC_VECTOR(1 DOWNTO 0) := "00"; | |
|
47 | CONSTANT select_ctrl_MULT : STD_LOGIC_VECTOR(1 DOWNTO 0) := "01"; | |
|
48 | CONSTANT select_ctrl_MAC : STD_LOGIC_VECTOR(1 DOWNTO 0) := "10"; | |
|
49 | CONSTANT select_ctrl_MACn : STD_LOGIC_VECTOR(1 DOWNTO 0) := "11"; | |
|
46 | 50 | |
|
47 | 51 | SIGNAL select_op1 : STD_LOGIC; |
|
48 | 52 | SIGNAL select_op2 : STD_LOGIC_VECTOR(1 DOWNTO 0) ; |
|
49 | 53 | |
|
50 | 54 | CONSTANT select_R0 : STD_LOGIC_VECTOR(1 DOWNTO 0) := "00"; |
|
51 | 55 | CONSTANT select_I0 : STD_LOGIC_VECTOR(1 DOWNTO 0) := "01"; |
|
52 | 56 | CONSTANT select_R1 : STD_LOGIC_VECTOR(1 DOWNTO 0) := "10"; |
|
53 | 57 | CONSTANT select_I1 : STD_LOGIC_VECTOR(1 DOWNTO 0) := "11"; |
|
54 | 58 | |
|
55 | 59 | SIGNAL res_wen : STD_LOGIC; |
|
56 | 60 | SIGNAL res_wen_reg1 : STD_LOGIC; |
|
57 | 61 | SIGNAL res_wen_reg2 : STD_LOGIC; |
|
58 | 62 | --SIGNAL res_wen_reg3 : STD_LOGIC; |
|
59 | 63 | |
|
64 | SIGNAL fifo_in_ren_s : STD_LOGIC_VECTOR(1 DOWNTO 0); | |
|
65 | ||
|
60 | 66 | BEGIN |
|
61 | 67 | |
|
62 | 68 | |
|
69 | PROCESS (clk, rstn) | |
|
70 | BEGIN -- PROCESS | |
|
71 | IF rstn = '0' THEN -- asynchronous reset (active low) | |
|
72 | fifo_in_ren <= "11"; | |
|
73 | ELSIF clk'event AND clk = '1' THEN -- rising clock edge | |
|
74 | fifo_in_ren <= fifo_in_ren_s; | |
|
75 | END IF; | |
|
76 | END PROCESS; | |
|
77 | ||
|
63 | 78 |
|
|
64 | 79 | PROCESS (clk, rstn) |
|
65 | 80 | BEGIN |
|
66 | 81 | IF rstn = '0' THEN |
|
67 | 82 | |
|
68 | 83 | correlation_begin <= '0'; |
|
69 | 84 | correlation_done <= '0'; |
|
70 | 85 | state <= IDLE; |
|
71 | fifo_in_ren <= "11"; | |
|
72 | ALU_CTRL <= ALU_CTRL_NOP; | |
|
86 | fifo_in_ren_s <= "11"; | |
|
87 | select_ctrl <= select_ctrl_NOP; | |
|
88 | --ALU_CTRL <= ALU_CTRL_NOP; | |
|
73 | 89 | select_op1 <= select_R0(0); |
|
74 | 90 | select_op2 <= select_R0; |
|
75 | 91 | res_wen <= '1'; |
|
76 | 92 | |
|
77 | 93 | ELSIF clk'EVENT AND clk = '1' THEN |
|
78 | ALU_CTRL <= ALU_CTRL_NOP; | |
|
94 | select_ctrl <= select_ctrl_NOP; | |
|
95 | --ALU_CTRL <= ALU_CTRL_NOP; | |
|
79 | 96 | correlation_begin <= '0'; |
|
80 | fifo_in_ren <= "11"; | |
|
97 | fifo_in_ren_s <= "11"; | |
|
81 | 98 | res_wen <= '1'; |
|
82 | 99 | correlation_done <= '0'; |
|
83 | 100 | CASE state IS |
|
84 | 101 | WHEN IDLE => |
|
85 | 102 | IF correlation_start = '1' THEN |
|
86 | 103 | IF correlation_auto = '1' THEN |
|
87 | 104 | IF fifo_out_full = '1' THEN |
|
88 | 105 | state <= WFa; |
|
89 | 106 | ELSE |
|
90 | 107 | correlation_begin <= '1'; |
|
91 | 108 | state <= S1a; |
|
92 | fifo_in_ren <= "10"; | |
|
109 | fifo_in_ren_s <= "10"; | |
|
93 | 110 | END IF; |
|
94 | 111 | ELSE |
|
95 | 112 | IF fifo_out_full = '1' THEN |
|
96 | 113 | state <= WF; |
|
97 | 114 | ELSE |
|
98 | 115 | correlation_begin <= '1'; |
|
99 | 116 | state <= S1; |
|
100 | fifo_in_ren <= "00"; | |
|
117 | fifo_in_ren_s <= "00"; | |
|
101 | 118 | END IF; |
|
102 | 119 | END IF; |
|
103 | 120 | END IF; |
|
104 | 121 | |
|
105 | 122 | --------------------------------------------------------------------- |
|
106 | 123 | -- INTER CORRELATION |
|
107 | 124 | --------------------------------------------------------------------- |
|
108 | 125 | WHEN WF => |
|
109 | 126 | IF fifo_out_full = '0' THEN |
|
110 | 127 | correlation_begin <= '1'; |
|
111 | 128 | state <= S1; |
|
112 | fifo_in_ren <= "00"; | |
|
129 | fifo_in_ren_s <= "00"; | |
|
113 | 130 | END IF; |
|
114 | 131 | WHEN S1 => |
|
115 | ALU_CTRL <= ALU_CTRL_MULT; | |
|
132 | select_ctrl <= select_ctrl_MULT; | |
|
133 | --ALU_CTRL <= ALU_CTRL_MULT; | |
|
116 | 134 | select_op1 <= select_R0(0); |
|
117 | 135 | select_op2 <= select_R1; |
|
118 | 136 | state <= S2; |
|
119 | 137 | WHEN S2 => |
|
120 | ALU_CTRL <= ALU_CTRL_MAC; | |
|
138 | select_ctrl <= select_ctrl_MAC; | |
|
139 | --ALU_CTRL <= ALU_CTRL_MAC; | |
|
121 | 140 | select_op1 <= select_I0(0); |
|
122 | 141 | select_op2 <= select_I1; |
|
123 | 142 | res_wen <= '0'; |
|
124 | 143 | state <= S3; |
|
125 | 144 | WHEN S3 => |
|
126 | ALU_CTRL <= ALU_CTRL_MULT; | |
|
145 | select_ctrl <= select_ctrl_MULT; | |
|
146 | --ALU_CTRL <= ALU_CTRL_MULT; | |
|
127 | 147 | select_op1 <= select_I0(0); |
|
128 | 148 | select_op2 <= select_R1; |
|
129 | 149 | state <= S4; |
|
130 | 150 | WHEN S4 => |
|
131 | ALU_CTRL <= ALU_CTRL_MACn; | |
|
151 | select_ctrl <= select_ctrl_MACn; | |
|
152 | --ALU_CTRL <= ALU_CTRL_MACn; | |
|
132 | 153 | select_op1 <= select_R0(0); |
|
133 | 154 | select_op2 <= select_I1; |
|
134 | 155 | res_wen <= '0'; |
|
135 | 156 | IF fifo_in_empty = "00" THEN |
|
136 | 157 | state <= S1; |
|
137 | fifo_in_ren <= "00"; | |
|
158 | fifo_in_ren_s <= "00"; | |
|
138 | 159 | ELSE |
|
139 | 160 | correlation_done <= '1'; |
|
140 | 161 | state <= IDLE; |
|
141 | 162 | END IF; |
|
142 | 163 | |
|
143 | 164 | |
|
144 | 165 | |
|
145 | 166 | --------------------------------------------------------------------- |
|
146 | 167 | -- AUTO CORRELATION |
|
147 | 168 | --------------------------------------------------------------------- |
|
148 | 169 | WHEN WFa => |
|
149 | 170 | IF fifo_out_full = '0' THEN |
|
150 | 171 | correlation_begin <= '1'; |
|
151 | 172 | state <= S1a; |
|
152 | fifo_in_ren <= "10"; | |
|
173 | fifo_in_ren_s <= "10"; | |
|
153 | 174 | END IF; |
|
154 | 175 | WHEN S1a => |
|
155 | ALU_CTRL <= ALU_CTRL_MULT; | |
|
176 | select_ctrl <= select_ctrl_MULT; | |
|
177 | --ALU_CTRL <= ALU_CTRL_MULT; | |
|
156 | 178 | select_op1 <= select_R0(0); |
|
157 | 179 | select_op2 <= select_R0; |
|
158 | 180 | state <= S2a; |
|
159 | 181 | WHEN S2a => |
|
160 | ALU_CTRL <= ALU_CTRL_MAC; | |
|
182 | select_ctrl <= select_ctrl_MAC; | |
|
183 | --ALU_CTRL <= ALU_CTRL_MAC; | |
|
161 | 184 | select_op1 <= select_I0(0); |
|
162 | 185 | select_op2 <= select_I0; |
|
163 | 186 | res_wen <= '0'; |
|
164 | 187 | IF fifo_in_empty(0) = '0' THEN |
|
165 | 188 | state <= S1a; |
|
166 | fifo_in_ren <= "10"; | |
|
189 | fifo_in_ren_s <= "10"; | |
|
167 | 190 | ELSE |
|
168 | 191 | correlation_done <= '1'; |
|
169 | 192 | state <= IDLE; |
|
170 | 193 | END IF; |
|
171 | 194 | |
|
172 | 195 | |
|
173 | 196 | WHEN OTHERS => NULL; |
|
174 | 197 | END CASE; |
|
175 | 198 | |
|
176 | 199 | END IF; |
|
177 | 200 | END PROCESS; |
|
178 | 201 | |
|
202 | ALU_CTRL <= ALU_CTRL_NOP WHEN select_ctrl = select_ctrl_NOP ELSE | |
|
203 | ALU_CTRL_MULT WHEN select_ctrl = select_ctrl_MULT ELSE | |
|
204 | ALU_CTRL_MAC WHEN select_ctrl = select_ctrl_MAC ELSE | |
|
205 | ALU_CTRL_MACn; | |
|
206 | ||
|
179 | 207 |
|
|
180 | 208 | fifo_in_data(31 DOWNTO 16); -- WHEN select_op1 = select_I0(0) ELSE |
|
181 | 209 | |
|
182 | 210 | OP2 <= fifo_in_data(15 DOWNTO 0) WHEN select_op2 = select_R0 ELSE |
|
183 | 211 | fifo_in_data(31 DOWNTO 16) WHEN select_op2 = select_I0 ELSE |
|
184 | 212 | fifo_in_data(47 DOWNTO 32) WHEN select_op2 = select_R1 ELSE |
|
185 | 213 | fifo_in_data(63 DOWNTO 48); -- WHEN select_op2 = select_I1 ELSE |
|
186 | 214 | |
|
187 | 215 | ALU_MS : ALU |
|
188 | 216 | GENERIC MAP ( |
|
189 | 217 | Arith_en => 1, |
|
190 | 218 | Logic_en => 0, |
|
191 | 219 | Input_SZ_1 => 16, |
|
192 | 220 | Input_SZ_2 => 16, |
|
193 | 221 | COMP_EN => 0) -- 0> Enable and 1> Disable |
|
194 | 222 | PORT MAP ( |
|
195 | 223 | clk => clk, |
|
196 | 224 | reset => rstn, |
|
197 | 225 | |
|
198 | 226 | ctrl => ALU_CTRL(2 DOWNTO 0), |
|
199 | 227 | comp => ALU_CTRL(4 DOWNTO 3), |
|
200 | 228 | |
|
201 | 229 | OP1 => OP1, |
|
202 | 230 | OP2 => OP2, |
|
203 | 231 | |
|
204 | 232 | RES => RES); |
|
205 | 233 | |
|
206 | 234 | fifo_out_data <= RES; |
|
207 | 235 | |
|
208 | 236 | |
|
209 | 237 | PROCESS (clk, rstn) |
|
210 | 238 | BEGIN |
|
211 | 239 | IF rstn = '0' THEN |
|
212 | 240 | res_wen_reg1 <= '1'; |
|
213 | 241 | res_wen_reg2 <= '1'; |
|
214 | 242 | --res_wen_reg3 <= '1'; |
|
215 | 243 | fifo_out_wen <= '1'; |
|
216 | 244 | ELSIF clk'event AND clk = '1' THEN |
|
217 | 245 | res_wen_reg1 <= res_wen; |
|
218 | 246 | res_wen_reg2 <= res_wen_reg1; |
|
219 | 247 | --res_wen_reg3 <= res_wen_reg2; |
|
220 | 248 | fifo_out_wen <= res_wen_reg2; |
|
221 | 249 | END IF; |
|
222 | 250 | END PROCESS; |
|
223 | 251 | |
|
224 | 252 | |
|
225 | 253 | END beh; |
General Comments 0
You need to be logged in to leave comments.
Login now