##// END OF EJS Templates
Make vsim target now works on windows.
Alexis Jeandet -
r646:c09604c7535a default draft
parent child
Show More
@@ -0,0 +1,7
1 import numpy as np
2 import random
3
4 W,H=8,100000
5 test = np.ones((H,W))*[(random.random()*65535)-32768 for col in range(W)]
6 np.savetxt("input.txt", test,fmt="%d", delimiter=" ")
7
@@ -0,0 +1,7
1 import numpy as np
2 import random
3
4 W,H=8,100000
5 test = np.ones((H,W))*[(random.random()*65535)-32768 for col in range(W)]
6 np.savetxt("input.txt", test,fmt="%d", delimiter=" ")
7
@@ -0,0 +1,7
1 import numpy as np
2 import random
3
4 W,H=8,100000
5 test = np.ones((H,W))*[(random.random()*65535)-32768 for col in range(W)]
6 np.savetxt("input.txt", test,fmt="%d", delimiter=" ")
7
@@ -1,69 +1,84
1 VHDLIB=../..
1 VHDLIB=../..
2 SCRIPTSDIR=$(VHDLIB)/scripts/
2 SCRIPTSDIR=$(VHDLIB)/scripts/
3 GRLIB := $(shell sh $(VHDLIB)/scripts/lpp_relpath.sh)
3 GRLIB := $(shell sh $(VHDLIB)/scripts/lpp_relpath.sh)
4 TOP=testbench
4 TOP=testbench
5 BOARD=LFR-EQM
5 BOARD=LFR-EQM
6 include $(VHDLIB)/boards/$(BOARD)/Makefile_RTAX.inc
6 include $(VHDLIB)/boards/$(BOARD)/Makefile_RTAX.inc
7 DEVICE=$(PART)-$(PACKAGE)$(SPEED)
7 DEVICE=$(PART)-$(PACKAGE)$(SPEED)
8 UCF=
8 UCF=
9 QSF=
9 QSF=
10 EFFORT=high
10 EFFORT=high
11 XSTOPT=
11 XSTOPT=
12 SYNPOPT=
12 SYNPOPT=
13 VHDLSYNFILES=
13 VHDLSYNFILES=
14 VHDLSIMFILES= tb.vhd
14 VHDLSIMFILES= tb.vhd
15 SIMTOP=testbench
15 SIMTOP=testbench
16 CLEAN=soft-clean
16 CLEAN=soft-clean
17
17
18 TECHLIBS = axcelerator
18 TECHLIBS = axcelerator
19
19
20 LIBSKIP = core1553bbc core1553brm core1553brt gr1553 corePCIF \
20 LIBSKIP = core1553bbc core1553brm core1553brt gr1553 corePCIF \
21 tmtc openchip hynix ihp gleichmann micron usbhc opencores
21 tmtc openchip hynix ihp gleichmann micron usbhc opencores fmf ftlib gsi
22
22
23 DIRSKIP = b1553 pcif leon2 leon3v3 leon2ft crypto satcan ddr usb ata i2c \
23 DIRSKIP = b1553 pcif leon2 leon3v3 leon2ft crypto satcan ddr usb ata i2c \
24 pci grusbhc haps slink ascs can pwm greth coremp7 spi ac97 \
24 pci grusbhc haps slink ascs can pwm greth coremp7 spi ac97 srmmu atf \
25 grlfpc \
25 ./dsp/lpp_fft_rtax \
26 ./dsp/lpp_fft_rtax \
26 ./amba_lcd_16x2_ctrlr \
27 ./amba_lcd_16x2_ctrlr \
27 ./general_purpose/lpp_AMR \
28 ./general_purpose/lpp_AMR \
28 ./general_purpose/lpp_balise \
29 ./general_purpose/lpp_balise \
29 ./general_purpose/lpp_delay \
30 ./general_purpose/lpp_delay \
30 ./lpp_bootloader \
31 ./lpp_bootloader \
31 ./lfr_management \
32 ./lfr_management \
32 ./lpp_sim/CY7C1061DV33 \
33 ./lpp_sim/CY7C1061DV33 \
33 ./lpp_cna \
34 ./lpp_cna \
34 ./lpp_uart \
35 ./lpp_uart \
35 ./lpp_usb \
36 ./lpp_usb \
36 ./dsp/lpp_fft \
37 ./dsp/lpp_fft \
37 ./lpp_leon3_soc \
38 ./lpp_leon3_soc \
38 ./lpp_debug_lfr
39 ./lpp_debug_lfr
39
40
40 FILESKIP = i2cmst.vhd \
41 FILESKIP = i2cmst.vhd \
41 APB_MULTI_DIODE.vhd \
42 APB_MULTI_DIODE.vhd \
42 APB_MULTI_DIODE.vhd \
43 APB_MULTI_DIODE.vhd \
43 Top_MatrixSpec.vhd \
44 Top_MatrixSpec.vhd \
44 APB_FFT.vhd \
45 APB_FFT.vhd \
45 lpp_lfr_ms_FFT.vhd \
46 lpp_lfr_ms_FFT.vhd \
46 lpp_lfr_apbreg.vhd \
47 lpp_lfr_apbreg.vhd \
47 CoreFFT.vhd \
48 CoreFFT.vhd \
48 lpp_lfr_ms.vhd \
49 lpp_lfr_ms.vhd \
49 lpp_lfr_sim_pkg.vhd
50 lpp_lfr_sim_pkg.vhd \
51 mtie_maps.vhd \
52 ftsrctrlc.vhd \
53 ftsdctrl.vhd \
54 ftsrctrl8.vhd \
55 ftmctrl.vhd \
56 ftsdctrl64.vhd \
57 ftahbram.vhd \
58 ftahbram2.vhd \
59 sramft.vhd \
60 nandfctrlx.vhd
50
61
51 include $(GRLIB)/bin/Makefile
62 include $(GRLIB)/bin/Makefile
52 include $(GRLIB)/software/leon3/Makefile
63 include $(GRLIB)/software/leon3/Makefile
53
64
54 ################## project specific targets ##########################
65 ################## project specific targets ##########################
55 distclean:myclean
66 distclean:myclean
67 vsim:cp_for_vsim
56
68
57 myclean:
69 myclean:
58 rm -f input.txt output_fx.txt
70 rm -f input.txt output_fx.txt
59 rm -rf ./2016*
71 rm -rf ./2016*
60
72
61 generate :
73 generate :
62 xonsh ./generate.xsh
74 python ./generate.py
75
76 cp_for_vsim: generate
77 cp ./input.txt simulation/
63
78
64 archivate:
79 archivate:
65 xonsh ./archivate.xsh
80 xonsh ./archivate.xsh
66
81
67 test: | generate ghdl ghdl-run archivate
82 test: | generate ghdl ghdl-run archivate
68
83
69
84
@@ -1,202 +1,202
1
1
2 LIBRARY ieee;
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.ALL;
3 USE ieee.std_logic_1164.ALL;
4 USE ieee.numeric_std.ALL;
4 USE ieee.numeric_std.ALL;
5 USE IEEE.std_logic_signed.ALL;
5 USE IEEE.std_logic_signed.ALL;
6 USE IEEE.MATH_real.ALL;
6 USE IEEE.MATH_real.ALL;
7
7
8 LIBRARY techmap;
8 LIBRARY techmap;
9 USE techmap.gencomp.ALL;
9 USE techmap.gencomp.ALL;
10
10
11 LIBRARY std;
11 LIBRARY std;
12 USE std.textio.ALL;
12 USE std.textio.ALL;
13
13
14 LIBRARY lpp;
14 LIBRARY lpp;
15 USE lpp.iir_filter.ALL;
15 USE lpp.iir_filter.ALL;
16 USE lpp.lpp_ad_conv.ALL;
16 USE lpp.lpp_ad_conv.ALL;
17 USE lpp.FILTERcfg.ALL;
17 USE lpp.FILTERcfg.ALL;
18 USE lpp.lpp_lfr_filter_coeff.ALL;
18 USE lpp.lpp_lfr_filter_coeff.ALL;
19 USE lpp.general_purpose.ALL;
19 USE lpp.general_purpose.ALL;
20 USE lpp.data_type_pkg.ALL;
20 USE lpp.data_type_pkg.ALL;
21 USE lpp.lpp_lfr_pkg.ALL;
21 USE lpp.lpp_lfr_pkg.ALL;
22 USE lpp.general_purpose.ALL;
22 USE lpp.general_purpose.ALL;
23 USE lpp.lpp_sim_pkg.ALL;
23 USE lpp.lpp_sim_pkg.ALL;
24
24
25 ENTITY testbench IS
25 ENTITY testbench IS
26 GENERIC(
26 GENERIC(
27 tech : INTEGER := 0; --axcel,0
27 tech : INTEGER := 0; --axcel,0
28 Mem_use : INTEGER := use_CEL --use_RAM,use_CEL
28 Mem_use : INTEGER := use_CEL --use_RAM,use_CEL
29 );
29 );
30 END;
30 END;
31
31
32 ARCHITECTURE behav OF testbench IS
32 ARCHITECTURE behav OF testbench IS
33 CONSTANT ChanelCount : INTEGER := 8;
33 CONSTANT ChanelCount : INTEGER := 8;
34 CONSTANT Coef_SZ : INTEGER := 9;
34 CONSTANT Coef_SZ : INTEGER := 9;
35 CONSTANT CoefCntPerCel : INTEGER := 6;
35 CONSTANT CoefCntPerCel : INTEGER := 6;
36 CONSTANT CoefPerCel : INTEGER := 5;
36 CONSTANT CoefPerCel : INTEGER := 5;
37 CONSTANT Cels_count : INTEGER := 5;
37 CONSTANT Cels_count : INTEGER := 5;
38
38
39 SIGNAL sample : samplT(ChanelCount-1 DOWNTO 0, 17 DOWNTO 0);
39 SIGNAL sample : samplT(ChanelCount-1 DOWNTO 0, 17 DOWNTO 0);
40 SIGNAL sample_val : STD_LOGIC;
40 SIGNAL sample_val : STD_LOGIC;
41
41
42 SIGNAL sample_fx : samplT(ChanelCount-1 DOWNTO 0, 17 DOWNTO 0);
42 SIGNAL sample_fx : samplT(ChanelCount-1 DOWNTO 0, 17 DOWNTO 0);
43 SIGNAL sample_fx_val : STD_LOGIC;
43 SIGNAL sample_fx_val : STD_LOGIC;
44
44
45
45
46 SIGNAL TSTAMP : INTEGER := 0;
46 SIGNAL TSTAMP : INTEGER := 0;
47 SIGNAL clk : STD_LOGIC := '0';
47 SIGNAL clk : STD_LOGIC := '0';
48 SIGNAL clk_98304Hz : STD_LOGIC := '0';
48 SIGNAL clk_98304Hz : STD_LOGIC := '0';
49 SIGNAL clk_98304Hz_r : STD_LOGIC := '0';
49 SIGNAL clk_98304Hz_r : STD_LOGIC := '0';
50 SIGNAL rstn : STD_LOGIC;
50 SIGNAL rstn : STD_LOGIC;
51
51
52 SIGNAL signal_gen : sample_vector(0 to ChanelCount-1,17 downto 0);
52 SIGNAL signal_gen : sample_vector(0 to ChanelCount-1,17 downto 0);
53 SIGNAL sample_fx_wdata : Samples(ChanelCount-1 DOWNTO 0);
53 SIGNAL sample_fx_wdata : Samples(ChanelCount-1 DOWNTO 0);
54 SIGNAL signal_rec : sample_vector(0 to ChanelCount-1,15 downto 0);
54 SIGNAL signal_rec : sample_vector(0 to ChanelCount-1,15 downto 0);
55
55
56 SIGNAL end_of_simu : STD_LOGIC := '0';
56 SIGNAL end_of_simu : STD_LOGIC := '0';
57
57
58 CONSTANT half_samplig_period : time := INTEGER( REAL(1000**4) / REAL(24576.0*4.0*2)) * 1 ps;
58 CONSTANT half_samplig_period : time := 5086263 ps;--INTEGER( REAL(1000**4) / REAL(24576.0*4.0*2)) * 1 ps;
59
59
60 BEGIN
60 BEGIN
61
61
62 -----------------------------------------------------------------------------
62 -----------------------------------------------------------------------------
63 -- CLOCK and RESET
63 -- CLOCK and RESET
64 -----------------------------------------------------------------------------
64 -----------------------------------------------------------------------------
65 PROCESS
65 PROCESS
66 BEGIN -- PROCESS
66 BEGIN -- PROCESS
67 WAIT UNTIL clk = '1';
67 WAIT UNTIL clk = '1';
68 rstn <= '0';
68 rstn <= '0';
69 WAIT UNTIL clk = '1';
69 WAIT UNTIL clk = '1';
70 WAIT UNTIL clk = '1';
70 WAIT UNTIL clk = '1';
71 WAIT UNTIL clk = '1';
71 WAIT UNTIL clk = '1';
72 rstn <= '1';
72 rstn <= '1';
73 WAIT UNTIL end_of_simu = '1';
73 WAIT UNTIL end_of_simu = '1';
74 WAIT UNTIL clk = '1';
74 WAIT UNTIL clk = '1';
75 assert false report "end of test" severity note;
75 assert false report "end of test" severity note;
76 -- Wait forever; this will finish the simulation.
76 -- Wait forever; this will finish the simulation.
77 wait;
77 wait;
78 END PROCESS;
78 END PROCESS;
79 -----------------------------------------------------------------------------
79 -----------------------------------------------------------------------------
80
80
81
81
82 clk_98304Hz_gen:PROCESS
82 clk_98304Hz_gen:PROCESS
83 BEGIN
83 BEGIN
84 IF end_of_simu /= '1' THEN
84 IF end_of_simu /= '1' THEN
85 clk_98304Hz <= NOT clk_98304Hz;
85 clk_98304Hz <= NOT clk_98304Hz;
86 WAIT FOR half_samplig_period;
86 WAIT FOR half_samplig_period;
87 ELSE
87 ELSE
88 assert false report "end of test" severity note;
88 assert false report "end of test" severity note;
89 WAIT;
89 WAIT;
90 END IF;
90 END IF;
91 END PROCESS;
91 END PROCESS;
92
92
93 clk_25M_gen:PROCESS
93 clk_25M_gen:PROCESS
94 BEGIN
94 BEGIN
95 IF end_of_simu /= '1' THEN
95 IF end_of_simu /= '1' THEN
96 clk <= NOT clk;
96 clk <= NOT clk;
97 TSTAMP <= TSTAMP+20;
97 TSTAMP <= TSTAMP+20;
98 WAIT FOR 20 ns;
98 WAIT FOR 20 ns;
99 ELSE
99 ELSE
100 assert false report "end of test" severity note;
100 assert false report "end of test" severity note;
101 WAIT;
101 WAIT;
102 END IF;
102 END IF;
103 END PROCESS;
103 END PROCESS;
104
104
105
105
106 -----------------------------------------------------------------------------
106 -----------------------------------------------------------------------------
107 -- LPP_LFR_FILTER f0
107 -- LPP_LFR_FILTER f0
108 -----------------------------------------------------------------------------
108 -----------------------------------------------------------------------------
109
109
110 IIR_CEL_CTRLR_v2_1 : IIR_CEL_CTRLR_v2
110 IIR_CEL_CTRLR_v2_1 : IIR_CEL_CTRLR_v2
111 GENERIC MAP (
111 GENERIC MAP (
112 tech => tech,
112 tech => tech,
113 Mem_use => Mem_use,
113 Mem_use => Mem_use,
114 Sample_SZ => 18,
114 Sample_SZ => 18,
115 Coef_SZ => Coef_SZ,
115 Coef_SZ => Coef_SZ,
116 Coef_Nb => 25,
116 Coef_Nb => 25,
117 Coef_sel_SZ => 5,
117 Coef_sel_SZ => 5,
118 Cels_count => Cels_count,
118 Cels_count => Cels_count,
119 ChanelsCount => ChanelCount,
119 ChanelsCount => ChanelCount,
120 FILENAME => "")
120 FILENAME => "")
121 PORT MAP (
121 PORT MAP (
122 rstn => rstn,
122 rstn => rstn,
123 clk => clk,
123 clk => clk,
124 virg_pos => 7,
124 virg_pos => 7,
125 coefs => CoefsInitValCst_v2,
125 coefs => CoefsInitValCst_v2,
126
126
127 sample_in_val => sample_val,
127 sample_in_val => sample_val,
128 sample_in => sample,
128 sample_in => sample,
129 sample_out_val => sample_fx_val,
129 sample_out_val => sample_fx_val,
130 sample_out => sample_fx);
130 sample_out => sample_fx);
131 -----------------------------------------------------------------------------
131 -----------------------------------------------------------------------------
132
132
133
133
134 -----------------------------------------------------------------------------
134 -----------------------------------------------------------------------------
135 -- SAMPLE GENERATION
135 -- SAMPLE GENERATION
136 -----------------------------------------------------------------------------
136 -----------------------------------------------------------------------------
137
137
138
138
139 PROCESS (clk, rstn)
139 PROCESS (clk, rstn)
140 BEGIN -- PROCESS
140 BEGIN -- PROCESS
141 IF rstn = '0' THEN -- asynchronous reset (active low)
141 IF rstn = '0' THEN -- asynchronous reset (active low)
142 sample_val <= '0';
142 sample_val <= '0';
143 clk_98304Hz_r <= '0';
143 clk_98304Hz_r <= '0';
144 ELSIF clk'EVENT AND clk = '1' THEN -- rising clock edge
144 ELSIF clk'EVENT AND clk = '1' THEN -- rising clock edge
145 clk_98304Hz_r <= clk_98304Hz;
145 clk_98304Hz_r <= clk_98304Hz;
146 IF clk_98304Hz = '1' AND clk_98304Hz_r = '0' THEN
146 IF clk_98304Hz = '1' AND clk_98304Hz_r = '0' THEN
147 sample_val <= '1';
147 sample_val <= '1';
148 ELSE
148 ELSE
149 sample_val <= '0';
149 sample_val <= '0';
150 END IF;
150 END IF;
151 END IF;
151 END IF;
152 END PROCESS;
152 END PROCESS;
153 -----------------------------------------------------------------------------
153 -----------------------------------------------------------------------------
154
154
155 ChanelLoop : FOR i IN 0 TO ChanelCount-1 GENERATE
155 ChanelLoop : FOR i IN 0 TO ChanelCount-1 GENERATE
156 SampleLoop : FOR j IN 0 TO 15 GENERATE
156 SampleLoop : FOR j IN 0 TO 15 GENERATE
157 sample_fx_wdata(i)(j) <= sample_fx(i,j);
157 sample_fx_wdata(i)(j) <= sample_fx(i,j);
158 signal_rec(i,j) <= sample_fx_wdata(i)(j);
158 signal_rec(i,j) <= sample_fx_wdata(i)(j);
159 sample(i,j) <= signal_gen(i,j);
159 sample(i,j) <= signal_gen(i,j);
160 END GENERATE;
160 END GENERATE;
161 sample(i,16) <= signal_gen(i,16);
161 sample(i,16) <= signal_gen(i,16);
162 sample(i,17) <= signal_gen(i,17);
162 sample(i,17) <= signal_gen(i,17);
163 END GENERATE;
163 END GENERATE;
164
164
165
165
166
166
167 -----------------------------------------------------------------------------
167 -----------------------------------------------------------------------------
168 -- READ INPUT SIGNALS
168 -- READ INPUT SIGNALS
169 -----------------------------------------------------------------------------
169 -----------------------------------------------------------------------------
170
170
171 gen: sig_reader
171 gen: sig_reader
172 GENERIC MAP(
172 GENERIC MAP(
173 FNAME => "input.txt",
173 FNAME => "input.txt",
174 WIDTH => ChanelCount,
174 WIDTH => ChanelCount,
175 RESOLUTION => 18,
175 RESOLUTION => 18,
176 GAIN => 1.0
176 GAIN => 1.0
177 )
177 )
178 PORT MAP(
178 PORT MAP(
179 clk => sample_val,
179 clk => sample_val,
180 end_of_simu => end_of_simu,
180 end_of_simu => end_of_simu,
181 out_signal => signal_gen
181 out_signal => signal_gen
182 );
182 );
183
183
184
184
185 -----------------------------------------------------------------------------
185 -----------------------------------------------------------------------------
186 -- RECORD OUTPUT SIGNALS
186 -- RECORD OUTPUT SIGNALS
187 -----------------------------------------------------------------------------
187 -----------------------------------------------------------------------------
188
188
189 rec : sig_recorder
189 rec : sig_recorder
190 GENERIC MAP(
190 GENERIC MAP(
191 FNAME => "output_fx.txt",
191 FNAME => "output_fx.txt",
192 WIDTH => ChanelCount,
192 WIDTH => ChanelCount,
193 RESOLUTION => 16
193 RESOLUTION => 16
194 )
194 )
195 PORT MAP(
195 PORT MAP(
196 clk => sample_fx_val,
196 clk => sample_fx_val,
197 end_of_simu => end_of_simu,
197 end_of_simu => end_of_simu,
198 timestamp => TSTAMP,
198 timestamp => TSTAMP,
199 input_signal => signal_rec
199 input_signal => signal_rec
200 );
200 );
201
201
202 END;
202 END;
@@ -1,69 +1,84
1 VHDLIB=../..
1 VHDLIB=../..
2 SCRIPTSDIR=$(VHDLIB)/scripts/
2 SCRIPTSDIR=$(VHDLIB)/scripts/
3 GRLIB := $(shell sh $(VHDLIB)/scripts/lpp_relpath.sh)
3 GRLIB := $(shell sh $(VHDLIB)/scripts/lpp_relpath.sh)
4 TOP=testbench
4 TOP=testbench
5 BOARD=LFR-EQM
5 BOARD=LFR-EQM
6 include $(VHDLIB)/boards/$(BOARD)/Makefile_RTAX.inc
6 include $(VHDLIB)/boards/$(BOARD)/Makefile_RTAX.inc
7 DEVICE=$(PART)-$(PACKAGE)$(SPEED)
7 DEVICE=$(PART)-$(PACKAGE)$(SPEED)
8 UCF=
8 UCF=
9 QSF=
9 QSF=
10 EFFORT=high
10 EFFORT=high
11 XSTOPT=
11 XSTOPT=
12 SYNPOPT=
12 SYNPOPT=
13 VHDLSYNFILES=
13 VHDLSYNFILES=
14 VHDLSIMFILES= tb.vhd
14 VHDLSIMFILES= tb.vhd
15 SIMTOP=testbench
15 SIMTOP=testbench
16 CLEAN=soft-clean
16 CLEAN=soft-clean
17
17
18 TECHLIBS = axcelerator
18 TECHLIBS = axcelerator
19
19
20 LIBSKIP = core1553bbc core1553brm core1553brt gr1553 corePCIF \
20 LIBSKIP = core1553bbc core1553brm core1553brt gr1553 corePCIF \
21 tmtc openchip hynix ihp gleichmann micron usbhc opencores
21 tmtc openchip hynix ihp gleichmann micron usbhc opencores fmf ftlib gsi
22
22
23 DIRSKIP = b1553 pcif leon2 leon3v3 leon2ft crypto satcan ddr usb ata i2c \
23 DIRSKIP = b1553 pcif leon2 leon3v3 leon2ft crypto satcan ddr usb ata i2c \
24 pci grusbhc haps slink ascs can pwm greth coremp7 spi ac97 \
24 pci grusbhc haps slink ascs can pwm greth coremp7 spi ac97 srmmu atf \
25 grlfpc \
25 ./dsp/lpp_fft_rtax \
26 ./dsp/lpp_fft_rtax \
26 ./amba_lcd_16x2_ctrlr \
27 ./amba_lcd_16x2_ctrlr \
27 ./general_purpose/lpp_AMR \
28 ./general_purpose/lpp_AMR \
28 ./general_purpose/lpp_balise \
29 ./general_purpose/lpp_balise \
29 ./general_purpose/lpp_delay \
30 ./general_purpose/lpp_delay \
30 ./lpp_bootloader \
31 ./lpp_bootloader \
31 ./lfr_management \
32 ./lfr_management \
32 ./lpp_sim/CY7C1061DV33 \
33 ./lpp_sim/CY7C1061DV33 \
33 ./lpp_cna \
34 ./lpp_cna \
34 ./lpp_uart \
35 ./lpp_uart \
35 ./lpp_usb \
36 ./lpp_usb \
36 ./dsp/lpp_fft \
37 ./dsp/lpp_fft \
37 ./lpp_leon3_soc \
38 ./lpp_leon3_soc \
38 ./lpp_debug_lfr
39 ./lpp_debug_lfr
39
40
40 FILESKIP = i2cmst.vhd \
41 FILESKIP = i2cmst.vhd \
41 APB_MULTI_DIODE.vhd \
42 APB_MULTI_DIODE.vhd \
42 APB_MULTI_DIODE.vhd \
43 APB_MULTI_DIODE.vhd \
43 Top_MatrixSpec.vhd \
44 Top_MatrixSpec.vhd \
44 APB_FFT.vhd \
45 APB_FFT.vhd \
45 lpp_lfr_ms_FFT.vhd \
46 lpp_lfr_ms_FFT.vhd \
46 lpp_lfr_apbreg.vhd \
47 lpp_lfr_apbreg.vhd \
47 CoreFFT.vhd \
48 CoreFFT.vhd \
48 lpp_lfr_ms.vhd \
49 lpp_lfr_ms.vhd \
49 lpp_lfr_sim_pkg.vhd
50 lpp_lfr_sim_pkg.vhd \
51 mtie_maps.vhd \
52 ftsrctrlc.vhd \
53 ftsdctrl.vhd \
54 ftsrctrl8.vhd \
55 ftmctrl.vhd \
56 ftsdctrl64.vhd \
57 ftahbram.vhd \
58 ftahbram2.vhd \
59 sramft.vhd \
60 nandfctrlx.vhd
50
61
51 include $(GRLIB)/bin/Makefile
62 include $(GRLIB)/bin/Makefile
52 include $(GRLIB)/software/leon3/Makefile
63 include $(GRLIB)/software/leon3/Makefile
53
64
54 ################## project specific targets ##########################
65 ################## project specific targets ##########################
55 distclean:myclean
66 distclean:myclean
67 vsim:cp_for_vsim
56
68
57 myclean:
69 myclean:
58 rm -f input.txt output_fx.txt
70 rm -f input.txt output_fx.txt
59 rm -rf ./2016*
71 rm -rf ./2016*
60
72
61 generate :
73 generate :
62 xonsh ./generate.xsh
74 python ./generate.py
75
76 cp_for_vsim: generate
77 cp ./input.txt simulation/
63
78
64 archivate:
79 archivate:
65 xonsh ./archivate.xsh
80 xonsh ./archivate.xsh
66
81
67 test: | generate ghdl ghdl-run archivate
82 test: | generate ghdl ghdl-run archivate
68
83
69
84
@@ -1,230 +1,230
1
1
2 LIBRARY ieee;
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.ALL;
3 USE ieee.std_logic_1164.ALL;
4 USE ieee.numeric_std.ALL;
4 USE ieee.numeric_std.ALL;
5 USE IEEE.std_logic_signed.ALL;
5 USE IEEE.std_logic_signed.ALL;
6 USE IEEE.MATH_real.ALL;
6 USE IEEE.MATH_real.ALL;
7
7
8 LIBRARY techmap;
8 LIBRARY techmap;
9 USE techmap.gencomp.ALL;
9 USE techmap.gencomp.ALL;
10
10
11 LIBRARY std;
11 LIBRARY std;
12 USE std.textio.ALL;
12 USE std.textio.ALL;
13
13
14 LIBRARY lpp;
14 LIBRARY lpp;
15 USE lpp.iir_filter.ALL;
15 USE lpp.iir_filter.ALL;
16 USE lpp.lpp_ad_conv.ALL;
16 USE lpp.lpp_ad_conv.ALL;
17 USE lpp.FILTERcfg.ALL;
17 USE lpp.FILTERcfg.ALL;
18 USE lpp.lpp_lfr_filter_coeff.ALL;
18 USE lpp.lpp_lfr_filter_coeff.ALL;
19 USE lpp.general_purpose.ALL;
19 USE lpp.general_purpose.ALL;
20 USE lpp.data_type_pkg.ALL;
20 USE lpp.data_type_pkg.ALL;
21 USE lpp.lpp_lfr_pkg.ALL;
21 USE lpp.lpp_lfr_pkg.ALL;
22 USE lpp.general_purpose.ALL;
22 USE lpp.general_purpose.ALL;
23 USE lpp.lpp_sim_pkg.ALL;
23 USE lpp.lpp_sim_pkg.ALL;
24 USE lpp.lpp_waveform_pkg.ALL;
24 USE lpp.lpp_waveform_pkg.ALL;
25
25
26 ENTITY testbench IS
26 ENTITY testbench IS
27 GENERIC(
27 GENERIC(
28 tech : INTEGER := 0; --axcel,0
28 tech : INTEGER := 0; --axcel,0
29 Mem_use : INTEGER := use_CEL --use_RAM,use_CEL
29 Mem_use : INTEGER := use_CEL --use_RAM,use_CEL
30 );
30 );
31 END;
31 END;
32
32
33 ARCHITECTURE behav OF testbench IS
33 ARCHITECTURE behav OF testbench IS
34 -----------------------------------------------------------------------------
34 -----------------------------------------------------------------------------
35 -- CONFIG FILTER IIR f0 to f1
35 -- CONFIG FILTER IIR f0 to f1
36 -----------------------------------------------------------------------------
36 -----------------------------------------------------------------------------
37 CONSTANT f0_to_f1_CEL_NUMBER : INTEGER := 5;
37 CONSTANT f0_to_f1_CEL_NUMBER : INTEGER := 5;
38 CONSTANT f0_to_f1_COEFFICIENT_SIZE : INTEGER := 10;
38 CONSTANT f0_to_f1_COEFFICIENT_SIZE : INTEGER := 10;
39 CONSTANT f0_to_f1_POINT_POSITION : INTEGER := 8;
39 CONSTANT f0_to_f1_POINT_POSITION : INTEGER := 8;
40
40
41 CONSTANT f0_to_f1_sos : COEFF_CEL_ARRAY_REAL(1 TO 5) :=
41 CONSTANT f0_to_f1_sos : COEFF_CEL_ARRAY_REAL(1 TO 5) :=
42 (
42 (
43 (1.0, -1.61171504942096, 1.0, 1.0, -1.68876443778669, 0.908610171614583),
43 (1.0, -1.61171504942096, 1.0, 1.0, -1.68876443778669, 0.908610171614583),
44 (1.0, -1.53324505744412, 1.0, 1.0, -1.51088513595779, 0.732564401274351),
44 (1.0, -1.53324505744412, 1.0, 1.0, -1.51088513595779, 0.732564401274351),
45 (1.0, -1.30646173160060, 1.0, 1.0, -1.30571711968384, 0.546869268827102),
45 (1.0, -1.30646173160060, 1.0, 1.0, -1.30571711968384, 0.546869268827102),
46 (1.0, -0.651038739239370, 1.0, 1.0, -1.08747326287406, 0.358436944718464),
46 (1.0, -0.651038739239370, 1.0, 1.0, -1.08747326287406, 0.358436944718464),
47 (1.0, 1.24322747034001, 1.0, 1.0, -0.929530176676438, 0.224862726961691)
47 (1.0, 1.24322747034001, 1.0, 1.0, -0.929530176676438, 0.224862726961691)
48 );
48 );
49 CONSTANT f0_to_f1_gain : COEFF_CEL_REAL :=
49 CONSTANT f0_to_f1_gain : COEFF_CEL_REAL :=
50 ( 0.566196896119831, 0.474937156750133, 0.347712822970540, 0.200868393871900, 0.0910613125308450, 1.0);
50 ( 0.566196896119831, 0.474937156750133, 0.347712822970540, 0.200868393871900, 0.0910613125308450, 1.0);
51
51
52 CONSTANT coefs_iir_cel_f0_to_f1 : STD_LOGIC_VECTOR((f0_to_f1_CEL_NUMBER*f0_to_f1_COEFFICIENT_SIZE*5)-1 DOWNTO 0)
52 CONSTANT coefs_iir_cel_f0_to_f1 : STD_LOGIC_VECTOR((f0_to_f1_CEL_NUMBER*f0_to_f1_COEFFICIENT_SIZE*5)-1 DOWNTO 0)
53 := get_IIR_CEL_FILTER_CONFIG(
53 := get_IIR_CEL_FILTER_CONFIG(
54 f0_to_f1_COEFFICIENT_SIZE,
54 f0_to_f1_COEFFICIENT_SIZE,
55 f0_to_f1_POINT_POSITION,
55 f0_to_f1_POINT_POSITION,
56 f0_to_f1_CEL_NUMBER,
56 f0_to_f1_CEL_NUMBER,
57 f0_to_f1_sos,
57 f0_to_f1_sos,
58 f0_to_f1_gain);
58 f0_to_f1_gain);
59
59
60 CONSTANT ChanelCount : INTEGER := 6;
60 CONSTANT ChanelCount : INTEGER := 6;
61 -----------------------------------------------------------------------------
61 -----------------------------------------------------------------------------
62
62
63 SIGNAL sample : samplT(ChanelCount-1 DOWNTO 0, 17 DOWNTO 0);
63 SIGNAL sample : samplT(ChanelCount-1 DOWNTO 0, 17 DOWNTO 0);
64 SIGNAL sample_val : STD_LOGIC;
64 SIGNAL sample_val : STD_LOGIC;
65
65
66 SIGNAL sample_fx : samplT(ChanelCount-1 DOWNTO 0, 17 DOWNTO 0);
66 SIGNAL sample_fx : samplT(ChanelCount-1 DOWNTO 0, 17 DOWNTO 0);
67 SIGNAL sample_fx_val : STD_LOGIC;
67 SIGNAL sample_fx_val : STD_LOGIC;
68
68
69
69
70 SIGNAL TSTAMP : INTEGER := 0;
70 SIGNAL TSTAMP : INTEGER := 0;
71 SIGNAL clk : STD_LOGIC := '0';
71 SIGNAL clk : STD_LOGIC := '0';
72 SIGNAL clk_24576Hz : STD_LOGIC := '0';
72 SIGNAL clk_24576Hz : STD_LOGIC := '0';
73 SIGNAL clk_24576Hz_r : STD_LOGIC := '0';
73 SIGNAL clk_24576Hz_r : STD_LOGIC := '0';
74 SIGNAL rstn : STD_LOGIC;
74 SIGNAL rstn : STD_LOGIC;
75
75
76 SIGNAL signal_gen : sample_vector(0 to ChanelCount-1,17 downto 0);
76 SIGNAL signal_gen : sample_vector(0 to ChanelCount-1,17 downto 0);
77 SIGNAL sample_fx_wdata : Samples(ChanelCount-1 DOWNTO 0);
77 SIGNAL sample_fx_wdata : Samples(ChanelCount-1 DOWNTO 0);
78 SIGNAL signal_rec : sample_vector(0 to ChanelCount-1,15 downto 0);
78 SIGNAL signal_rec : sample_vector(0 to ChanelCount-1,15 downto 0);
79
79
80 SIGNAL end_of_simu : STD_LOGIC := '0';
80 SIGNAL end_of_simu : STD_LOGIC := '0';
81
81
82 CONSTANT half_samplig_period : time := INTEGER( REAL(1000**4) / REAL(2.0*24576.0)) * 1 ps;
82 CONSTANT half_samplig_period : time := 20345052 ps; --INTEGER( REAL(1000**4) / REAL(2.0*24576.0)) * 1 ps;
83
83
84 BEGIN
84 BEGIN
85
85
86 -----------------------------------------------------------------------------
86 -----------------------------------------------------------------------------
87 -- CLOCK and RESET
87 -- CLOCK and RESET
88 -----------------------------------------------------------------------------
88 -----------------------------------------------------------------------------
89 PROCESS
89 PROCESS
90 BEGIN -- PROCESS
90 BEGIN -- PROCESS
91 WAIT UNTIL clk = '1';
91 WAIT UNTIL clk = '1';
92 rstn <= '0';
92 rstn <= '0';
93 WAIT UNTIL clk = '1';
93 WAIT UNTIL clk = '1';
94 WAIT UNTIL clk = '1';
94 WAIT UNTIL clk = '1';
95 WAIT UNTIL clk = '1';
95 WAIT UNTIL clk = '1';
96 rstn <= '1';
96 rstn <= '1';
97 WAIT UNTIL end_of_simu = '1';
97 WAIT UNTIL end_of_simu = '1';
98 WAIT FOR 10 ps;
98 WAIT FOR 10 ps;
99 assert false report "end of test" severity note;
99 assert false report "end of test" severity note;
100 -- Wait forever; this will finish the simulation.
100 -- Wait forever; this will finish the simulation.
101 wait;
101 wait;
102 END PROCESS;
102 END PROCESS;
103 -----------------------------------------------------------------------------
103 -----------------------------------------------------------------------------
104
104
105
105
106 clk_24576Hz_gen:PROCESS
106 clk_24576Hz_gen:PROCESS
107 BEGIN
107 BEGIN
108 IF end_of_simu /= '1' THEN
108 IF end_of_simu /= '1' THEN
109 clk_24576Hz <= NOT clk_24576Hz;
109 clk_24576Hz <= NOT clk_24576Hz;
110 WAIT FOR half_samplig_period;
110 WAIT FOR half_samplig_period;
111 ELSE
111 ELSE
112 WAIT FOR 10 ps;
112 WAIT FOR 10 ps;
113 assert false report "end of test" severity note;
113 assert false report "end of test" severity note;
114 WAIT;
114 WAIT;
115 END IF;
115 END IF;
116 END PROCESS;
116 END PROCESS;
117
117
118 clk_25M_gen:PROCESS
118 clk_25M_gen:PROCESS
119 BEGIN
119 BEGIN
120 IF end_of_simu /= '1' THEN
120 IF end_of_simu /= '1' THEN
121 clk <= NOT clk;
121 clk <= NOT clk;
122 TSTAMP <= TSTAMP+20;
122 TSTAMP <= TSTAMP+20;
123 WAIT FOR 20 ns;
123 WAIT FOR 20 ns;
124 ELSE
124 ELSE
125 WAIT FOR 10 ps;
125 WAIT FOR 10 ps;
126 assert false report "end of test" severity note;
126 assert false report "end of test" severity note;
127 WAIT;
127 WAIT;
128 END IF;
128 END IF;
129 END PROCESS;
129 END PROCESS;
130
130
131
131
132 -----------------------------------------------------------------------------
132 -----------------------------------------------------------------------------
133 -- LPP_LFR_FILTER f1
133 -- LPP_LFR_FILTER f1
134 -----------------------------------------------------------------------------
134 -----------------------------------------------------------------------------
135
135
136 IIR_CEL_f0_to_f1 : IIR_CEL_CTRLR_v2
136 IIR_CEL_f0_to_f1 : IIR_CEL_CTRLR_v2
137 GENERIC MAP (
137 GENERIC MAP (
138 tech => tech,
138 tech => tech,
139 Mem_use => Mem_use, -- use_RAM
139 Mem_use => Mem_use, -- use_RAM
140 Sample_SZ => 18,
140 Sample_SZ => 18,
141 Coef_SZ => f0_to_f1_COEFFICIENT_SIZE,
141 Coef_SZ => f0_to_f1_COEFFICIENT_SIZE,
142 Coef_Nb => f0_to_f1_CEL_NUMBER*5,
142 Coef_Nb => f0_to_f1_CEL_NUMBER*5,
143 Coef_sel_SZ => 5,
143 Coef_sel_SZ => 5,
144 Cels_count => f0_to_f1_CEL_NUMBER,
144 Cels_count => f0_to_f1_CEL_NUMBER,
145 ChanelsCount => ChanelCount,
145 ChanelsCount => ChanelCount,
146 FILENAME => ""
146 FILENAME => ""
147 )
147 )
148 PORT MAP (
148 PORT MAP (
149 rstn => rstn,
149 rstn => rstn,
150 clk => clk,
150 clk => clk,
151 virg_pos => f0_to_f1_POINT_POSITION,
151 virg_pos => f0_to_f1_POINT_POSITION,
152 coefs => coefs_iir_cel_f0_to_f1,
152 coefs => coefs_iir_cel_f0_to_f1,
153
153
154 sample_in_val => sample_val,
154 sample_in_val => sample_val,
155 sample_in => sample,
155 sample_in => sample,
156 sample_out_val => sample_fx_val,
156 sample_out_val => sample_fx_val,
157 sample_out => sample_fx);
157 sample_out => sample_fx);
158
158
159 -----------------------------------------------------------------------------
159 -----------------------------------------------------------------------------
160
160
161
161
162 -----------------------------------------------------------------------------
162 -----------------------------------------------------------------------------
163 -- SAMPLE GENERATION
163 -- SAMPLE GENERATION
164 -----------------------------------------------------------------------------
164 -----------------------------------------------------------------------------
165
165
166
166
167 PROCESS (clk, rstn)
167 PROCESS (clk, rstn)
168 BEGIN -- PROCESS
168 BEGIN -- PROCESS
169 IF rstn = '0' THEN -- asynchronous reset (active low)
169 IF rstn = '0' THEN -- asynchronous reset (active low)
170 sample_val <= '0';
170 sample_val <= '0';
171 clk_24576Hz_r <= '0';
171 clk_24576Hz_r <= '0';
172 ELSIF clk'EVENT AND clk = '1' THEN -- rising clock edge
172 ELSIF clk'EVENT AND clk = '1' THEN -- rising clock edge
173 clk_24576Hz_r <= clk_24576Hz;
173 clk_24576Hz_r <= clk_24576Hz;
174 IF clk_24576Hz = '1' AND clk_24576Hz_r = '0' THEN
174 IF clk_24576Hz = '1' AND clk_24576Hz_r = '0' THEN
175 sample_val <= '1';
175 sample_val <= '1';
176 ELSE
176 ELSE
177 sample_val <= '0';
177 sample_val <= '0';
178 END IF;
178 END IF;
179 END IF;
179 END IF;
180 END PROCESS;
180 END PROCESS;
181 -----------------------------------------------------------------------------
181 -----------------------------------------------------------------------------
182
182
183 ChanelLoop : FOR i IN 0 TO ChanelCount-1 GENERATE
183 ChanelLoop : FOR i IN 0 TO ChanelCount-1 GENERATE
184 SampleLoop : FOR j IN 0 TO 15 GENERATE
184 SampleLoop : FOR j IN 0 TO 15 GENERATE
185 sample_fx_wdata(i)(j) <= sample_fx(i,j);
185 sample_fx_wdata(i)(j) <= sample_fx(i,j);
186 signal_rec(i,j) <= sample_fx_wdata(i)(j);
186 signal_rec(i,j) <= sample_fx_wdata(i)(j);
187 sample(i,j) <= signal_gen(i,j);
187 sample(i,j) <= signal_gen(i,j);
188 END GENERATE;
188 END GENERATE;
189 sample(i,16) <= signal_gen(i,16);
189 sample(i,16) <= signal_gen(i,16);
190 sample(i,17) <= signal_gen(i,17);
190 sample(i,17) <= signal_gen(i,17);
191 END GENERATE;
191 END GENERATE;
192
192
193
193
194
194
195 -----------------------------------------------------------------------------
195 -----------------------------------------------------------------------------
196 -- READ INPUT SIGNALS
196 -- READ INPUT SIGNALS
197 -----------------------------------------------------------------------------
197 -----------------------------------------------------------------------------
198
198
199 gen: sig_reader
199 gen: sig_reader
200 GENERIC MAP(
200 GENERIC MAP(
201 FNAME => "input.txt",
201 FNAME => "input.txt",
202 WIDTH => ChanelCount,
202 WIDTH => ChanelCount,
203 RESOLUTION => 18,
203 RESOLUTION => 18,
204 GAIN => 1.0
204 GAIN => 1.0
205 )
205 )
206 PORT MAP(
206 PORT MAP(
207 clk => sample_val,
207 clk => sample_val,
208 end_of_simu => end_of_simu,
208 end_of_simu => end_of_simu,
209 out_signal => signal_gen
209 out_signal => signal_gen
210 );
210 );
211
211
212
212
213 -----------------------------------------------------------------------------
213 -----------------------------------------------------------------------------
214 -- RECORD OUTPUT SIGNALS
214 -- RECORD OUTPUT SIGNALS
215 -----------------------------------------------------------------------------
215 -----------------------------------------------------------------------------
216
216
217 rec : sig_recorder
217 rec : sig_recorder
218 GENERIC MAP(
218 GENERIC MAP(
219 FNAME => "output_fx.txt",
219 FNAME => "output_fx.txt",
220 WIDTH => ChanelCount,
220 WIDTH => ChanelCount,
221 RESOLUTION => 16
221 RESOLUTION => 16
222 )
222 )
223 PORT MAP(
223 PORT MAP(
224 clk => sample_fx_val,
224 clk => sample_fx_val,
225 end_of_simu => end_of_simu,
225 end_of_simu => end_of_simu,
226 timestamp => TSTAMP,
226 timestamp => TSTAMP,
227 input_signal => signal_rec
227 input_signal => signal_rec
228 );
228 );
229
229
230 END;
230 END;
@@ -1,66 +1,81
1 VHDLIB=../..
1 VHDLIB=../..
2 SCRIPTSDIR=$(VHDLIB)/scripts/
2 SCRIPTSDIR=$(VHDLIB)/scripts/
3 GRLIB := $(shell sh $(VHDLIB)/scripts/lpp_relpath.sh)
3 GRLIB := $(shell sh $(VHDLIB)/scripts/lpp_relpath.sh)
4 TOP=testbench
4 TOP=testbench
5 BOARD=LFR-EQM
5 BOARD=LFR-EQM
6 include $(VHDLIB)/boards/$(BOARD)/Makefile_RTAX.inc
6 include $(VHDLIB)/boards/$(BOARD)/Makefile_RTAX.inc
7 DEVICE=$(PART)-$(PACKAGE)$(SPEED)
7 DEVICE=$(PART)-$(PACKAGE)$(SPEED)
8 UCF=
8 UCF=
9 QSF=
9 QSF=
10 EFFORT=high
10 EFFORT=high
11 XSTOPT=
11 XSTOPT=
12 SYNPOPT=
12 SYNPOPT=
13 VHDLSYNFILES=
13 VHDLSYNFILES=
14 VHDLSIMFILES= tb.vhd
14 VHDLSIMFILES= tb.vhd
15 SIMTOP=testbench
15 SIMTOP=testbench
16 CLEAN=soft-clean
16 CLEAN=soft-clean
17
17
18 TECHLIBS = axcelerator
18 TECHLIBS = axcelerator
19
19
20 LIBSKIP = core1553bbc core1553brm core1553brt gr1553 corePCIF \
20 LIBSKIP = core1553bbc core1553brm core1553brt gr1553 corePCIF \
21 tmtc openchip hynix ihp gleichmann micron usbhc opencores
21 tmtc openchip hynix ihp gleichmann micron usbhc opencores fmf ftlib gsi
22
22
23 DIRSKIP = b1553 pcif leon2 leon3v3 leon2ft crypto satcan ddr usb ata i2c \
23 DIRSKIP = b1553 pcif leon2 leon3v3 leon2ft crypto satcan ddr usb ata i2c \
24 pci grusbhc haps slink ascs can pwm greth coremp7 spi ac97 \
24 pci grusbhc haps slink ascs can pwm greth coremp7 spi ac97 srmmu atf \
25 grlfpc \
25 ./dsp/lpp_fft_rtax \
26 ./dsp/lpp_fft_rtax \
26 ./amba_lcd_16x2_ctrlr \
27 ./amba_lcd_16x2_ctrlr \
27 ./general_purpose/lpp_AMR \
28 ./general_purpose/lpp_AMR \
28 ./general_purpose/lpp_balise \
29 ./general_purpose/lpp_balise \
29 ./general_purpose/lpp_delay \
30 ./general_purpose/lpp_delay \
30 ./lpp_bootloader \
31 ./lpp_bootloader \
31 ./lfr_management \
32 ./lfr_management \
32 ./lpp_sim/CY7C1061DV33 \
33 ./lpp_sim/CY7C1061DV33 \
33 ./lpp_cna \
34 ./lpp_cna \
34 ./lpp_uart \
35 ./lpp_uart \
35 ./lpp_usb \
36 ./lpp_usb \
36 ./dsp/lpp_fft \
37 ./dsp/lpp_fft \
37 ./lpp_leon3_soc \
38 ./lpp_leon3_soc \
38 ./lpp_debug_lfr
39 ./lpp_debug_lfr
39
40
40 FILESKIP = i2cmst.vhd \
41 FILESKIP = i2cmst.vhd \
41 APB_MULTI_DIODE.vhd \
42 APB_MULTI_DIODE.vhd \
42 APB_MULTI_DIODE.vhd \
43 APB_MULTI_DIODE.vhd \
43 Top_MatrixSpec.vhd \
44 Top_MatrixSpec.vhd \
44 APB_FFT.vhd \
45 APB_FFT.vhd \
45 lpp_lfr_ms_FFT.vhd \
46 lpp_lfr_ms_FFT.vhd \
46 lpp_lfr_apbreg.vhd \
47 lpp_lfr_apbreg.vhd \
47 CoreFFT.vhd \
48 CoreFFT.vhd \
48 lpp_lfr_ms.vhd \
49 lpp_lfr_ms.vhd \
49 lpp_lfr_sim_pkg.vhd
50 lpp_lfr_sim_pkg.vhd \
51 mtie_maps.vhd \
52 ftsrctrlc.vhd \
53 ftsdctrl.vhd \
54 ftsrctrl8.vhd \
55 ftmctrl.vhd \
56 ftsdctrl64.vhd \
57 ftahbram.vhd \
58 ftahbram2.vhd \
59 sramft.vhd \
60 nandfctrlx.vhd
50
61
51 include $(GRLIB)/bin/Makefile
62 include $(GRLIB)/bin/Makefile
52 include $(GRLIB)/software/leon3/Makefile
63 include $(GRLIB)/software/leon3/Makefile
53 ################## project specific targets ##########################
64 ################## project specific targets ##########################
54 distclean:myclean
65 distclean:myclean
66 vsim:cp_for_vsim
55
67
56 myclean:
68 myclean:
57 rm -f input.txt output_f*.txt
69 rm -f input.txt output_f*.txt
58 rm -rf ./2016*
70 rm -rf ./2016*
59
71
60 generate :
72 generate :
61 xonsh ./generate.xsh
73 python ./generate.py
74
75 cp_for_vsim: generate
76 cp ./input.txt simulation/
62
77
63 archivate:
78 archivate:
64 xonsh ./archivate.xsh
79 xonsh ./archivate.xsh
65
80
66 test: | generate ghdl ghdl-run archivate
81 test: | generate ghdl ghdl-run archivate
@@ -1,113 +1,113
1 {
1 {
2 "cells": [
2 "cells": [
3 {
3 {
4 "cell_type": "code",
4 "cell_type": "code",
5 "execution_count": 4,
5 "execution_count": 2,
6 "metadata": {
6 "metadata": {
7 "collapsed": true
7 "collapsed": true
8 },
8 },
9 "outputs": [],
9 "outputs": [],
10 "source": [
10 "source": [
11 "import numpy as np\n",
11 "import numpy as np\n",
12 "import matplotlib.pyplot as plt\n",
12 "import matplotlib.pyplot as plt\n",
13 "import glob \n",
13 "import glob \n",
14 "import pandas as pds"
14 "import pandas as pds"
15 ]
15 ]
16 },
16 },
17 {
17 {
18 "cell_type": "code",
18 "cell_type": "code",
19 "execution_count": null,
19 "execution_count": null,
20 "metadata": {
20 "metadata": {
21 "collapsed": false
21 "collapsed": false
22 },
22 },
23 "outputs": [],
23 "outputs": [],
24 "source": []
24 "source": []
25 },
25 },
26 {
26 {
27 "cell_type": "code",
27 "cell_type": "code",
28 "execution_count": 2,
28 "execution_count": 2,
29 "metadata": {
29 "metadata": {
30 "collapsed": false
30 "collapsed": false
31 },
31 },
32 "outputs": [
32 "outputs": [
33 {
33 {
34 "ename": "NameError",
34 "ename": "NameError",
35 "evalue": "name 'glob' is not defined",
35 "evalue": "name 'glob' is not defined",
36 "output_type": "error",
36 "output_type": "error",
37 "traceback": [
37 "traceback": [
38 "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
38 "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
39 "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
39 "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
40 "\u001b[0;32m<ipython-input-2-9719ee11a4bd>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mfolder\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mglob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mglob\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"./2016*\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0minputsig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfolder\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;34m\"/input.txt\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msep\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\" \"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mheader\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0minputsig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m \u001b[0;34m\"CH{}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputsig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0moutputsig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfolder\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;34m\"/output_f0.txt\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msep\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\" \"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mheader\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0moutputsig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"Tstamp\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;34m[\u001b[0m \u001b[0;34m\"CH{}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutputsig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
40 "\u001b[0;32m<ipython-input-2-9719ee11a4bd>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mfolder\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mglob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mglob\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"./2016*\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0minputsig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfolder\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;34m\"/input.txt\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msep\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\" \"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mheader\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0minputsig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m \u001b[0;34m\"CH{}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputsig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0moutputsig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfolder\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;34m\"/output_f0.txt\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msep\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\" \"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mheader\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0moutputsig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"Tstamp\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;34m[\u001b[0m \u001b[0;34m\"CH{}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutputsig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
41 "\u001b[0;31mNameError\u001b[0m: name 'glob' is not defined"
41 "\u001b[0;31mNameError\u001b[0m: name 'glob' is not defined"
42 ]
42 ]
43 }
43 }
44 ],
44 ],
45 "source": [
45 "source": [
46 "for folder in glob.glob(\"./2016*\"):\n",
46 "for folder in glob.glob(\"./2016*\"):\n",
47 " inputsig = pds.read_csv(folder+\"/input.txt\",sep=\" \",header=None)\n",
47 " inputsig = pds.read_csv(folder+\"/input.txt\",sep=\" \",header=None)\n",
48 " inputsig.columns=[ \"CH{}\".format(i) for i in range(inputsig.shape[1])]\n",
48 " inputsig.columns=[ \"CH{}\".format(i) for i in range(inputsig.shape[1])]\n",
49 " outputsig = pds.read_csv(folder+\"/output_f0.txt\",sep=\" \",header=None)\n",
49 " outputsig = pds.read_csv(folder+\"/output_f0.txt\",sep=\" \",header=None)\n",
50 " outputsig.columns=[\"Tstamp\"]+[ \"CH{}\".format(i) for i in range(outputsig.shape[1]-1)]\n",
50 " outputsig.columns=[\"Tstamp\"]+[ \"CH{}\".format(i) for i in range(outputsig.shape[1]-1)]\n",
51 " f, axarr = plt.subplots(1,2,figsize=(14, 6))\n",
51 " f, axarr = plt.subplots(1,2,figsize=(14, 6))\n",
52 " (outputsig.filter(regex=\"CH*\")- inputsig*0.8912)[150:].plot(ax=axarr[0])\n",
52 " (outputsig.filter(regex=\"CH*\")- inputsig*0.8912)[150:].plot(ax=axarr[0])\n",
53 " axarr[0].legend(loc='upper right')\n",
53 " axarr[0].legend(loc='upper right')\n",
54 " (outputsig.filter(regex=\"CH*\")[:100]/0.8912).plot(ax=axarr[1])\n",
54 " (outputsig.filter(regex=\"CH*\")[:100]/0.8912).plot(ax=axarr[1])\n",
55 " axarr[1].legend(loc='upper right')\n",
55 " axarr[1].legend(loc='upper right')\n",
56 " plt.show()"
56 " plt.show()"
57 ]
57 ]
58 },
58 },
59 {
59 {
60 "cell_type": "code",
60 "cell_type": "code",
61 "execution_count": 8,
61 "execution_count": 5,
62 "metadata": {
62 "metadata": {
63 "collapsed": false
63 "collapsed": false
64 },
64 },
65 "outputs": [
65 "outputs": [
66 {
66 {
67 "data": {
67 "data": {
68 "image/png": "iVBORw0KGgoAAAANSUhEUgAABI4AAAH/CAYAAAAxLZZaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xt8VNW5//HPmsk9mYRrgIAQEkXAFBVUsKJI66UoIF7Q\nYDW1iKVU0IOt9GdttS1yjpRWbKo1yqFFq1hFoSJgaRXFUhRbPAgV8BYuGpRwnyEhM5Nk//7YMyGX\nyQXIZCaZ7/v1mlcye6+91hqmlYdnP2ttY1kWIiIiIiIiIiIi9TkiPQEREREREREREYlOShyJiIiI\niIiIiEhIShyJiIiIiIiIiEhIShyJiIiIiIiIiEhIShyJiIiIiIiIiEhIShyJiIiIiIiIiEhIShyJ\niIiIiIiIiEhIShyJiIiIiIiIiEhIShyJiIiIiIiIiEhIShyJiIiIiIiIiEhIYU0cGWO+b4z5wBhz\nJPBab4z5Vq3zicaYx40x+40xHmPMS8aYzHp9nGaMWWmMKTPGfGWM+ZUxxlGvzaXGmI3GmApjzMfG\nmO+EmMudxpgdxphjxph3jTHnh++Ti4iIiJwcxU8iIiISTcJdcfQ58GNgWOC1BnjFGDMocP5R4Grg\neuASIAt4OXhxIMBZBcQBI4DvALcBv6zVJhtYAbwBnA38FvhfY8zltdrcBPwGeBA4F/gAWG2M6da6\nH1dERETklCl+EhERkahhLMtq2wGNOQD8CDvA2QfkW5a1LHDuTGAbMMKyrPeMMWOA5UAvy7L2B9pM\nBR4GuluWVWmMmQuMsSxrSK0xngcyLMu6KvD+XWCDZVl3B94b7KCs0LKsX7XJBxcRERE5SYqfRERE\nJFLabI8jY4zDGJMPpADvYN9Bi8O+0wWAZVkfAbuBCwOHRgBbgkFPwGogAzirVpvX6w23OtiHMSY+\nMFbtcazANRciIiIiEqUUP4mIiEikxYV7AGNMHnagkwR4gGsty9pujDkX8FmW5a53yV6gZ+D3noH3\n9c8Hz33QRJt0Y0wi0AVwNtLmzCbm3RW4EtgJVDTxEUVERCSykoBsYLVlWQciPJdWofhJREREwqzF\n8VPYE0fAduy1852w1+I/Y4y5pIn2BmjJ+rmm2pgWtmnq/JXAcy2Yh4iIiESHbwOLIz2JVqL4SURE\nRNpCs/FT2BNHlmVVAsWBt+8bYy4A7gZeBBKMMen17pplcvzu1ldA/ad39Kh1LvizR702mYDbsiyf\nMWY/UNVIm/p30WrbCfDss88yaNCgJppJuM2cOZP58+dHehqCvotoou8iOuh7iA7btm3jlltugcDf\n3R2B4idpLfrvVPTQdxFd9H1ED30XkXEi8VNbVBzV5wASgY1AJfBNILi54wCgL7A+0PYd4CfGmG61\n1ulfARzB3gQy2GZMvTGuCBzHsiy/MWZjYJzlgXFM4H1hE/OsABg0aBBDhw49qQ8qrSMjI0PfQZTQ\ndxE99F1EB30PUacjL41S/CQnRf+dih76LqKLvo/ooe8i4pqNn8KaODLGzAFew34Chwu7BGoUcIVl\nWW5jzELgEWPMIez1+4XAPy3L+legi78BW4E/GWN+DPQCZgOPWZblD7QpAqYHng7yB+yA5gbgqlpT\neQR4OhAAvQfMxN5kclFYPriIiIjISVL8JCIiItEk3BVHPYBnsAOWI8Bm7KBnTeD8TOwy6Jew76L9\nFbgzeLFlWdXGmLHAE9h30cqwg5UHa7XZaYy5Gju4uQv4ArjdsqzXa7V50RjTDfhlYE6bgCsty9oX\nhs8sIiIicioUP4mIiEjUCGviyLKsKc2c9wIzAq/G2nwOjG2mn7XYj4xtqs3vgd831UZEREQk0hQ/\niYiISDRxRHoCIs2ZNGlSpKcgAfouooe+i+ig70FEop3+OxU99F1EF30f0UPfRfQzltWSJ7fGHmPM\nUGDjxo0btVGXiIhIFHv//fcZNmwYwDDLst6P9HximeInERGR9uFE4qdIPFVNRESkXdq9ezf79+9v\nvqG0um7dutG3b99IT0NEREROkOKnyGmt+EmJIxERkRbYvXs3gwYNory8PNJTiUkpKSls27ZNySMR\nEZF2RPFTZLVW/KTEkYiISAvs37+f8vJynn32WQYNGhTp6cSUbdu2ccstt7B//34ljkRERNoRxU+R\n05rxkxJHIiIiJ2DQoEHau0VERETkBCh+at/0VDUREREREREREQlJiSMREREREREREQlJiSMRERER\nEREREQlJiSMREREREREREQlJiSMREREREREREQlJiSMRERGpUVxczNSpU8nNzSU5OZmMjAxGjhxJ\nYWEhFRUVAGRnZzN+/PiQ169duxaHw8HSpUvrHPf5fPz4xz+mT58+pKSkMGLECF5//fWwfx4RERGR\ncOvo8VNcm48oIiIiUWnVqlVMnDiRpKQkCgoKyMvLw+fzsW7dOmbNmsXWrVspKirCGNNkP6HOFxQU\n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\nwZEkSZJSIVvI0rmzk85dnZVuiiRJKjI4kiRJUirkGnIATleTJClFDI4kSZKUCrlCEhw5XU2SpPQw\nOJIkSVIqZAtZANobDY4kSUoLgyNJkiSlwu6patucqiZJUloYHEmSJCkVnKomSVL6GBxJkiQpFbIN\nTlWTJCltDI4kSZKUCpmaDKEqOFVNkqQUMTiSJElSKoQQyBVyTlWTJClFDI4kSZKUGtmGrFPVJElK\nEYMjSZIkpUaukHOqmiRJKWJwJEmSpNRwqpokSelicCRJkqTUcKqaJEnpYnAkSZKk1HCqmiRJ6WJw\nJEmSpNRwqpokSelicCRJkqTUcKqaJEnpYnAkSZKk1HCqmiRJ6WJwJEmSpNTIFXK0N7YTY6x0UyRJ\nEpCrdAPS7rMrVzK+ru6Ajm1qb+edEyfy3smTB7hVkiRJL0/Zhix0QseODnKj9+6qtqxuoWpyFdma\nbAVaJ0nSyGNw1IfVLS1sam4+oGMDsL6tbWAbJEmS9DKWKyTd045t5YOjJf/fEqb83RRmXT1rqJsm\nSdKIZHDUh1uOOop58+ZVuhmSJEkjQldw1L6tnepDq7vta9/eTtuf21j/w/Uc/rnDCSFUoomSJI0o\nrnEkSZKk1Mg2JFPQyt1ZrXVNKwAty1vY/vj2IW2XJEkjlcGRJEmSUqN0qlpPLatbAAj5wIbbNwxp\nuyRJGqkMjiRJkpQafY44ysKksyex4bYN3nlNkqQhYHAkSZKk1MjV71njqKeW1S1UH1rNpLMnsfO5\nnex4esdQN0+SpBHH4EiSJEmpEbKBbH22/FS1NS3UzKhh7MljyRayTleTJGkIGBxJkiQpVbIN2fJT\n1Va3Uj29mkw+w4QzJhgcSZI0BAyOJEmSlCq5Qq78VLXiiCOAie+aSPPTzexY2v/pav1ZEynGyPrb\n19O2oa3/DZYk6WXM4EiSJEmpkivk9pqq1tneSeuLrdRMT4KjsaeMJVufZcMd/Rt1tPHHG3loykOs\nvnr1PuvW/ttanjnrGZ58x5N07Nx7utzu9rR1suaLa2h+trlf15ckabgyOJIkSVKqlJuq1vbnNuiA\n6hnVSU1NlvGnje9zulrnrk6WX7qcp05/iqrxVaz89Mpew6amR5t4/h+fZ/wZ49nx1A6ePf/ZsqOU\nOnd18szZz7DiEyt49LWPsum+Tb1ev21dG6uvXs2W+7d4FzhJ0rCUG6wThxBmAJcDfwVMAV4EbgWu\n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\n",
68 "image/png": "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\nTkSuQmCC\n",
69 "text/plain": [
69 "text/plain": [
70 "<matplotlib.figure.Figure at 0x7fd46e04ad30>"
70 "<matplotlib.figure.Figure at 0x8c1def0>"
71 ]
71 ]
72 },
72 },
73 "metadata": {},
73 "metadata": {},
74 "output_type": "display_data"
74 "output_type": "display_data"
75 }
75 }
76 ],
76 ],
77 "source": [
77 "source": [
78 "folder=\"./\"\n",
78 "folder=\"./simulation/\"\n",
79 "inputsig = pds.read_csv(folder+\"/input.txt\",sep=\" \",header=None)\n",
79 "inputsig = pds.read_csv(folder+\"/input.txt\",sep=\" \",header=None)\n",
80 "inputsig.columns=[ \"CH{}\".format(i) for i in range(inputsig.shape[1])]\n",
80 "inputsig.columns=[ \"CH{}\".format(i) for i in range(inputsig.shape[1])]\n",
81 "outputsig = pds.read_csv(folder+\"/output_f1.txt\",sep=\" \",header=None)\n",
81 "outputsig = pds.read_csv(folder+\"/output_f2.txt\",sep=\" \",header=None)\n",
82 "outputsig.columns=[\"Tstamp\"]+[ \"CH{}\".format(i) for i in range(outputsig.shape[1]-1)]\n",
82 "outputsig.columns=[\"Tstamp\"]+[ \"CH{}\".format(i) for i in range(outputsig.shape[1]-1)]\n",
83 "f, axarr = plt.subplots(1,2,figsize=(14, 6))\n",
83 "f, axarr = plt.subplots(1,2,figsize=(14, 6))\n",
84 "(outputsig.filter(regex=\"CH*\")- inputsig*0.8912)[150:].plot(ax=axarr[0])\n",
84 "(outputsig.filter(regex=\"CH*\")- inputsig*0.8912)[150:].plot(ax=axarr[0])\n",
85 "axarr[0].legend(loc='upper right')\n",
85 "axarr[0].legend(loc='upper right')\n",
86 "(outputsig.filter(regex=\"CH*\")[:100]/0.8912).plot(ax=axarr[1])\n",
86 "(outputsig.filter(regex=\"CH*\")[:100]/0.8912).plot(ax=axarr[1])\n",
87 "axarr[1].legend(loc='upper right')\n",
87 "axarr[1].legend(loc='upper right')\n",
88 "plt.show()"
88 "plt.show()"
89 ]
89 ]
90 }
90 }
91 ],
91 ],
92 "metadata": {
92 "metadata": {
93 "kernelspec": {
93 "kernelspec": {
94 "display_name": "Python 3",
94 "display_name": "Python 3",
95 "language": "python",
95 "language": "python",
96 "name": "python3"
96 "name": "python3"
97 },
97 },
98 "language_info": {
98 "language_info": {
99 "codemirror_mode": {
99 "codemirror_mode": {
100 "name": "ipython",
100 "name": "ipython",
101 "version": 3
101 "version": 3
102 },
102 },
103 "file_extension": ".py",
103 "file_extension": ".py",
104 "mimetype": "text/x-python",
104 "mimetype": "text/x-python",
105 "name": "python",
105 "name": "python",
106 "nbconvert_exporter": "python",
106 "nbconvert_exporter": "python",
107 "pygments_lexer": "ipython3",
107 "pygments_lexer": "ipython3",
108 "version": "3.5.2"
108 "version": "3.5.2"
109 }
109 }
110 },
110 },
111 "nbformat": 4,
111 "nbformat": 4,
112 "nbformat_minor": 1
112 "nbformat_minor": 1
113 }
113 }
@@ -1,259 +1,259
1
1
2 LIBRARY ieee;
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.ALL;
3 USE ieee.std_logic_1164.ALL;
4 use ieee.numeric_std.all;
4 use ieee.numeric_std.all;
5 USE IEEE.std_logic_signed.ALL;
5 USE IEEE.std_logic_signed.ALL;
6 USE IEEE.MATH_real.ALL;
6 USE IEEE.MATH_real.ALL;
7
7
8 LIBRARY techmap;
8 LIBRARY techmap;
9 USE techmap.gencomp.ALL;
9 USE techmap.gencomp.ALL;
10
10
11 library std;
11 library std;
12 use std.textio.all;
12 use std.textio.all;
13
13
14 LIBRARY lpp;
14 LIBRARY lpp;
15 USE lpp.iir_filter.ALL;
15 USE lpp.iir_filter.ALL;
16 USE lpp.lpp_ad_conv.ALL;
16 USE lpp.lpp_ad_conv.ALL;
17 USE lpp.FILTERcfg.ALL;
17 USE lpp.FILTERcfg.ALL;
18 USE lpp.lpp_lfr_filter_coeff.ALL;
18 USE lpp.lpp_lfr_filter_coeff.ALL;
19 USE lpp.general_purpose.ALL;
19 USE lpp.general_purpose.ALL;
20 USE lpp.data_type_pkg.ALL;
20 USE lpp.data_type_pkg.ALL;
21 USE lpp.lpp_lfr_pkg.ALL;
21 USE lpp.lpp_lfr_pkg.ALL;
22 USE lpp.general_purpose.ALL;
22 USE lpp.general_purpose.ALL;
23 USE lpp.lpp_sim_pkg.ALL;
23 USE lpp.lpp_sim_pkg.ALL;
24
24
25 ENTITY testbench IS
25 ENTITY testbench IS
26 GENERIC(
26 GENERIC(
27 tech : INTEGER := 0; --axcel,0
27 tech : INTEGER := 0; --axcel,0
28 Mem_use : INTEGER := use_CEL --use_RAM,use_CEL
28 Mem_use : INTEGER := use_CEL --use_RAM,use_CEL
29 );
29 );
30 END;
30 END;
31
31
32 ARCHITECTURE behav OF testbench IS
32 ARCHITECTURE behav OF testbench IS
33 CONSTANT ChanelCount : INTEGER := 8;
33 CONSTANT ChanelCount : INTEGER := 8;
34
34
35 SIGNAL TSTAMP : INTEGER:=0;
35 SIGNAL TSTAMP : INTEGER:=0;
36 SIGNAL clk : STD_LOGIC := '0';
36 SIGNAL clk : STD_LOGIC := '0';
37 SIGNAL clk_98304Hz : STD_LOGIC := '0';
37 SIGNAL clk_98304Hz : STD_LOGIC := '0';
38 SIGNAL clk_98304Hz_r : STD_LOGIC := '0';
38 SIGNAL clk_98304Hz_r : STD_LOGIC := '0';
39 SIGNAL rstn : STD_LOGIC;
39 SIGNAL rstn : STD_LOGIC;
40
40
41 SIGNAL signal_gen : sample_vector(0 to ChanelCount-1,15 downto 0);
41 SIGNAL signal_gen : sample_vector(0 to ChanelCount-1,15 downto 0);
42
42
43 SIGNAL sample : Samples(7 DOWNTO 0);
43 SIGNAL sample : Samples(7 DOWNTO 0);
44
44
45 SIGNAL sample_val : STD_LOGIC;
45 SIGNAL sample_val : STD_LOGIC;
46
46
47 SIGNAL sample_f0_val : STD_LOGIC;
47 SIGNAL sample_f0_val : STD_LOGIC;
48 SIGNAL sample_f1_val : STD_LOGIC;
48 SIGNAL sample_f1_val : STD_LOGIC;
49 SIGNAL sample_f2_val : STD_LOGIC;
49 SIGNAL sample_f2_val : STD_LOGIC;
50 SIGNAL sample_f3_val : STD_LOGIC;
50 SIGNAL sample_f3_val : STD_LOGIC;
51
51
52 SIGNAL sample_f0_wdata : STD_LOGIC_VECTOR((6*16)-1 DOWNTO 0);
52 SIGNAL sample_f0_wdata : STD_LOGIC_VECTOR((6*16)-1 DOWNTO 0);
53 SIGNAL sample_f1_wdata : STD_LOGIC_VECTOR((6*16)-1 DOWNTO 0);
53 SIGNAL sample_f1_wdata : STD_LOGIC_VECTOR((6*16)-1 DOWNTO 0);
54 SIGNAL sample_f2_wdata : STD_LOGIC_VECTOR((6*16)-1 DOWNTO 0);
54 SIGNAL sample_f2_wdata : STD_LOGIC_VECTOR((6*16)-1 DOWNTO 0);
55 SIGNAL sample_f3_wdata : STD_LOGIC_VECTOR((6*16)-1 DOWNTO 0);
55 SIGNAL sample_f3_wdata : STD_LOGIC_VECTOR((6*16)-1 DOWNTO 0);
56
56
57 SIGNAL signal_f0_rec : sample_vector(0 to 5,15 downto 0);
57 SIGNAL signal_f0_rec : sample_vector(0 to 5,15 downto 0);
58 SIGNAL signal_f1_rec : sample_vector(0 to 5,15 downto 0);
58 SIGNAL signal_f1_rec : sample_vector(0 to 5,15 downto 0);
59 SIGNAL signal_f2_rec : sample_vector(0 to 5,15 downto 0);
59 SIGNAL signal_f2_rec : sample_vector(0 to 5,15 downto 0);
60 SIGNAL signal_f3_rec : sample_vector(0 to 5,15 downto 0);
60 SIGNAL signal_f3_rec : sample_vector(0 to 5,15 downto 0);
61
61
62 SIGNAL end_of_simu : STD_LOGIC := '0';
62 SIGNAL end_of_simu : STD_LOGIC := '0';
63
63
64 CONSTANT half_samplig_period : time := INTEGER( REAL(1000**4) / REAL(2.0*4.0*24576.0)) * 1 ps;
64 CONSTANT half_samplig_period : time := 5086263 ps;--INTEGER( REAL(REAL(1000**4) / REAL(2.0*4.0*24576.0))) * 1 ps;
65
65
66
66
67
67
68 BEGIN
68 BEGIN
69
69
70 -----------------------------------------------------------------------------
70 -----------------------------------------------------------------------------
71 -- CLOCK and RESET
71 -- CLOCK and RESET
72 -----------------------------------------------------------------------------
72 -----------------------------------------------------------------------------
73 PROCESS
73 PROCESS
74 BEGIN -- PROCESS
74 BEGIN -- PROCESS
75 WAIT UNTIL clk = '1';
75 WAIT UNTIL clk = '1';
76 rstn <= '0';
76 rstn <= '0';
77 WAIT UNTIL clk = '1';
77 WAIT UNTIL clk = '1';
78 WAIT UNTIL clk = '1';
78 WAIT UNTIL clk = '1';
79 WAIT UNTIL clk = '1';
79 WAIT UNTIL clk = '1';
80 rstn <= '1';
80 rstn <= '1';
81 WAIT UNTIL end_of_simu = '1';
81 WAIT UNTIL end_of_simu = '1';
82 WAIT FOR 10 ps;
82 WAIT FOR 10 ps;
83 assert false report "end of test" severity note;
83 assert false report "end of test" severity note;
84 -- Wait forever; this will finish the simulation.
84 -- Wait forever; this will finish the simulation.
85 wait;
85 wait;
86 END PROCESS;
86 END PROCESS;
87 -----------------------------------------------------------------------------
87 -----------------------------------------------------------------------------
88
88
89
89
90 clk_98304Hz_gen:PROCESS
90 clk_98304Hz_gen:PROCESS
91 BEGIN
91 BEGIN
92 IF end_of_simu /= '1' THEN
92 IF end_of_simu /= '1' THEN
93 clk_98304Hz <= NOT clk_98304Hz;
93 clk_98304Hz <= NOT clk_98304Hz;
94 WAIT FOR half_samplig_period;
94 WAIT FOR half_samplig_period;
95 ELSE
95 ELSE
96 WAIT FOR 10 ps;
96 WAIT FOR 10 ps;
97 assert false report "end of test" severity note;
97 assert false report "end of test" severity note;
98 WAIT;
98 WAIT;
99 END IF;
99 END IF;
100 END PROCESS;
100 END PROCESS;
101
101
102 clk_25M_gen:PROCESS
102 clk_25M_gen:PROCESS
103 BEGIN
103 BEGIN
104 IF end_of_simu /= '1' THEN
104 IF end_of_simu /= '1' THEN
105 clk <= NOT clk;
105 clk <= NOT clk;
106 TSTAMP <= TSTAMP+20;
106 TSTAMP <= TSTAMP+20;
107 WAIT FOR 20 ns;
107 WAIT FOR 20 ns;
108 ELSE
108 ELSE
109 WAIT FOR 10 ps;
109 WAIT FOR 10 ps;
110 assert false report "end of test" severity note;
110 assert false report "end of test" severity note;
111 WAIT;
111 WAIT;
112 END IF;
112 END IF;
113 END PROCESS;
113 END PROCESS;
114
114
115
115
116 -----------------------------------------------------------------------------
116 -----------------------------------------------------------------------------
117 -- LPP_LFR_FILTER
117 -- LPP_LFR_FILTER
118 -----------------------------------------------------------------------------
118 -----------------------------------------------------------------------------
119 lpp_lfr_filter_1: lpp_lfr_filter
119 lpp_lfr_filter_1: lpp_lfr_filter
120 GENERIC MAP (
120 GENERIC MAP (
121 tech => tech,
121 tech => tech,
122 Mem_use => Mem_use,
122 Mem_use => Mem_use,
123 RTL_DESIGN_LIGHT =>1
123 RTL_DESIGN_LIGHT =>1
124 )
124 )
125 PORT MAP (
125 PORT MAP (
126 sample => sample,
126 sample => sample,
127 sample_val => sample_val,
127 sample_val => sample_val,
128 sample_time => (others=>'0'),
128 sample_time => (others=>'0'),
129 clk => clk,
129 clk => clk,
130 rstn => rstn,
130 rstn => rstn,
131
131
132 data_shaping_SP0 => '0',
132 data_shaping_SP0 => '0',
133 data_shaping_SP1 => '0',
133 data_shaping_SP1 => '0',
134 data_shaping_R0 => '0',
134 data_shaping_R0 => '0',
135 data_shaping_R1 => '0',
135 data_shaping_R1 => '0',
136 data_shaping_R2 => '0',
136 data_shaping_R2 => '0',
137
137
138 sample_f0_val => sample_f0_val,
138 sample_f0_val => sample_f0_val,
139 sample_f1_val => sample_f1_val,
139 sample_f1_val => sample_f1_val,
140 sample_f2_val => sample_f2_val,
140 sample_f2_val => sample_f2_val,
141 sample_f3_val => sample_f3_val,
141 sample_f3_val => sample_f3_val,
142
142
143 sample_f0_wdata => sample_f0_wdata,
143 sample_f0_wdata => sample_f0_wdata,
144 sample_f1_wdata => sample_f1_wdata,
144 sample_f1_wdata => sample_f1_wdata,
145 sample_f2_wdata => sample_f2_wdata,
145 sample_f2_wdata => sample_f2_wdata,
146 sample_f3_wdata => sample_f3_wdata
146 sample_f3_wdata => sample_f3_wdata
147 );
147 );
148 -----------------------------------------------------------------------------
148 -----------------------------------------------------------------------------
149
149
150
150
151 -----------------------------------------------------------------------------
151 -----------------------------------------------------------------------------
152 -- SAMPLE PULSE GENERATION
152 -- SAMPLE PULSE GENERATION
153 -----------------------------------------------------------------------------
153 -----------------------------------------------------------------------------
154 PROCESS (clk, rstn)
154 PROCESS (clk, rstn)
155 BEGIN -- PROCESS
155 BEGIN -- PROCESS
156 IF rstn = '0' THEN -- asynchronous reset (active low)
156 IF rstn = '0' THEN -- asynchronous reset (active low)
157 sample_val <= '0';
157 sample_val <= '0';
158 clk_98304Hz_r <= '0';
158 clk_98304Hz_r <= '0';
159 ELSIF clk'EVENT AND clk = '1' THEN -- rising clock edge
159 ELSIF clk'EVENT AND clk = '1' THEN -- rising clock edge
160 clk_98304Hz_r <= clk_98304Hz;
160 clk_98304Hz_r <= clk_98304Hz;
161 IF clk_98304Hz = '1' AND clk_98304Hz_r = '0' THEN
161 IF clk_98304Hz = '1' AND clk_98304Hz_r = '0' THEN
162 sample_val <= '1';
162 sample_val <= '1';
163 ELSE
163 ELSE
164 sample_val <= '0';
164 sample_val <= '0';
165 END IF;
165 END IF;
166 END IF;
166 END IF;
167 END PROCESS;
167 END PROCESS;
168 -----------------------------------------------------------------------------
168 -----------------------------------------------------------------------------
169
169
170
170
171 -----------------------------------------------------------------------------
171 -----------------------------------------------------------------------------
172 -- READ INPUT SIGNALS
172 -- READ INPUT SIGNALS
173 -----------------------------------------------------------------------------
173 -----------------------------------------------------------------------------
174 gen: sig_reader
174 gen: sig_reader
175 GENERIC MAP(
175 GENERIC MAP(
176 FNAME => "input.txt",
176 FNAME => "input.txt",
177 WIDTH => ChanelCount,
177 WIDTH => ChanelCount,
178 RESOLUTION => 16,
178 RESOLUTION => 16,
179 GAIN => 1.0
179 GAIN => 1.0
180 )
180 )
181 PORT MAP(
181 PORT MAP(
182 clk => sample_val,
182 clk => sample_val,
183 end_of_simu => end_of_simu,
183 end_of_simu => end_of_simu,
184 out_signal => signal_gen
184 out_signal => signal_gen
185 );
185 );
186
186
187 ChanelLoop : FOR i IN 0 TO ChanelCount-1 GENERATE
187 ChanelLoop : FOR i IN 0 TO ChanelCount-1 GENERATE
188 SampleLoop : FOR j IN 0 TO 15 GENERATE
188 SampleLoop : FOR j IN 0 TO 15 GENERATE
189 sample(I)(J) <= signal_gen(I,J);
189 sample(I)(J) <= signal_gen(I,J);
190 END GENERATE;
190 END GENERATE;
191 END GENERATE;
191 END GENERATE;
192
192
193 output_splitter: FOR CHAN IN 0 TO 5 GENERATE
193 output_splitter: FOR CHAN IN 0 TO 5 GENERATE
194 bits_splitter: FOR BIT IN 0 TO 15 GENERATE
194 bits_splitter: FOR BIT IN 0 TO 15 GENERATE
195 signal_f0_rec(CHAN,BIT) <= sample_f0_wdata((CHAN*16) + BIT);
195 signal_f0_rec(CHAN,BIT) <= sample_f0_wdata((CHAN*16) + BIT);
196 signal_f1_rec(CHAN,BIT) <= sample_f1_wdata((CHAN*16) + BIT);
196 signal_f1_rec(CHAN,BIT) <= sample_f1_wdata((CHAN*16) + BIT);
197 signal_f2_rec(CHAN,BIT) <= sample_f2_wdata((CHAN*16) + BIT);
197 signal_f2_rec(CHAN,BIT) <= sample_f2_wdata((CHAN*16) + BIT);
198 signal_f3_rec(CHAN,BIT) <= sample_f3_wdata((CHAN*16) + BIT);
198 signal_f3_rec(CHAN,BIT) <= sample_f3_wdata((CHAN*16) + BIT);
199 END GENERATE bits_splitter;
199 END GENERATE bits_splitter;
200 END GENERATE output_splitter;
200 END GENERATE output_splitter;
201
201
202
202
203 -----------------------------------------------------------------------------
203 -----------------------------------------------------------------------------
204 -- RECORD SIGNALS
204 -- RECORD SIGNALS
205 -----------------------------------------------------------------------------
205 -----------------------------------------------------------------------------
206
206
207 f0_rec : sig_recorder
207 f0_rec : sig_recorder
208 GENERIC MAP(
208 GENERIC MAP(
209 FNAME => "output_f0.txt",
209 FNAME => "output_f0.txt",
210 WIDTH => 6,
210 WIDTH => 6,
211 RESOLUTION => 16
211 RESOLUTION => 16
212 )
212 )
213 PORT MAP(
213 PORT MAP(
214 clk => sample_f0_val,
214 clk => sample_f0_val,
215 end_of_simu => end_of_simu,
215 end_of_simu => end_of_simu,
216 timestamp => TSTAMP,
216 timestamp => TSTAMP,
217 input_signal => signal_f0_rec
217 input_signal => signal_f0_rec
218 );
218 );
219
219
220 f1_rec : sig_recorder
220 f1_rec : sig_recorder
221 GENERIC MAP(
221 GENERIC MAP(
222 FNAME => "output_f1.txt",
222 FNAME => "output_f1.txt",
223 WIDTH => 6,
223 WIDTH => 6,
224 RESOLUTION => 16
224 RESOLUTION => 16
225 )
225 )
226 PORT MAP(
226 PORT MAP(
227 clk => sample_f1_val,
227 clk => sample_f1_val,
228 end_of_simu => end_of_simu,
228 end_of_simu => end_of_simu,
229 timestamp => TSTAMP,
229 timestamp => TSTAMP,
230 input_signal => signal_f1_rec
230 input_signal => signal_f1_rec
231 );
231 );
232
232
233 f2_rec : sig_recorder
233 f2_rec : sig_recorder
234 GENERIC MAP(
234 GENERIC MAP(
235 FNAME => "output_f2.txt",
235 FNAME => "output_f2.txt",
236 WIDTH => 6,
236 WIDTH => 6,
237 RESOLUTION => 16
237 RESOLUTION => 16
238 )
238 )
239 PORT MAP(
239 PORT MAP(
240 clk => sample_f2_val,
240 clk => sample_f2_val,
241 end_of_simu => end_of_simu,
241 end_of_simu => end_of_simu,
242 timestamp => TSTAMP,
242 timestamp => TSTAMP,
243 input_signal => signal_f2_rec
243 input_signal => signal_f2_rec
244 );
244 );
245
245
246 f3_rec : sig_recorder
246 f3_rec : sig_recorder
247 GENERIC MAP(
247 GENERIC MAP(
248 FNAME => "output_f3.txt",
248 FNAME => "output_f3.txt",
249 WIDTH => 6,
249 WIDTH => 6,
250 RESOLUTION => 16
250 RESOLUTION => 16
251 )
251 )
252 PORT MAP(
252 PORT MAP(
253 clk => sample_f3_val,
253 clk => sample_f3_val,
254 end_of_simu => end_of_simu,
254 end_of_simu => end_of_simu,
255 timestamp => TSTAMP,
255 timestamp => TSTAMP,
256 input_signal => signal_f3_rec
256 input_signal => signal_f3_rec
257 );
257 );
258
258
259 END;
259 END;
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (516 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now