Subversion Repositories f9daq

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
336 f9daq 1
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Create Date: 30.10.2018 09:14:15
6
-- Design Name: 
7
-- Module Name: hist_system_top - Behavioral
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool Versions: 
11
-- Description: 
12
-- 
13
-- Dependencies: 
14
-- 
15
-- Revision:
16
-- Revision 0.01 - File Created
17
-- Additional Comments:
18
-- 
19
----------------------------------------------------------------------------------
20
 
21
 
22
library IEEE;
23
use IEEE.STD_LOGIC_1164.ALL;
24
 
25
-- Uncomment the following library declaration if using
26
-- arithmetic functions with Signed or Unsigned values
27
use IEEE.NUMERIC_STD.ALL;
28
 
29
-- Uncomment the following library declaration if instantiating
30
-- any Xilinx leaf cells in this code.
31
--library UNISIM;
32
--use UNISIM.VComponents.all;
33
 
34
entity hist_system_top is
35
 
36
    generic (
37
              adc_bit_num : natural := 14; --input data from ad converter is 14 bit
38
              bit_num : natural := 10; -- number of bits for our data (scaled from 14 bit to 10 bit)
39
              bin_num : natural := 1024; -- number of bins in histogram. IMPORTANT: this number has to be equal to 2**bit_num.
40
              buffer_size: natural := 24; --size of each BRAM_buffer in bits ; 24 bit = MAX, je izhodni signal HISTOGRAM, ki  gre v procesor 24-bitni
41
              num_of_units: natural := 1; -- number of BRAM_buffer and PE_unit units. IMPORTANT: MAX NUMBER OF UNITS IS 33, otherwise overflow (i think, check this out) !!!!  
42
              comm_bit_num: natural := 32; -- uporabljeno za komunikacijo s procesorjem 
43
              mode: string := "MODE_3"; -- modes of operation: MODE_1 = navaden algoritm, MODE_2 = odklop bufferja in 1 enota, MODE_3 = novo od 30.11.2018 naprej
44
              byte: natural := 8
45
            );                          
46
 
47
    port (  
48
            clk: in std_logic; --iz ADC
49
            data_in: in unsigned ( (adc_bit_num - 1) downto 0 ); --iz ADC
50
            INT_res: out std_logic; --signal za reset integratorja, pride iz ADC_unit, to peles na vezje
51
 
52
            PM_trigger_in: in unsigned ( (adc_bit_num - 1) downto 0);
53
            --vhodni/izhodni signali za komunikacijo s procesorjem
54
            rstn: in std_logic; --reset signal. Ko je '0' resetira prejete podatke
55
            HW_addr: in std_logic_vector ( (comm_bit_num - 1) downto 0 );
56
            data_from_UC: in std_logic_vector ( (comm_bit_num - 1) downto 0 );
57
            wr_en: in std_logic; --procesor pove komponenti, da bo pisal vanjo 
58
            rd_en: in std_logic; -- procesor pove komponenti, da bo bral iz nje <-- Q: ali je lahko tole moj UC_wr_en???
59
            data_for_UC: out std_logic_vector ( (comm_bit_num - 1) downto 0 );
60
            error: out std_logic;
61
            ack: out std_logic
62
            -----------------------------------------------------------------------
63
            --START: in std_logic; --TODO: premakni v komunikacijsko enoto
64
            --UC_wr_en: in std_logic; -- procesor pove hist_system_top, da lahko poslje nov podatek procesorjuTODO: za testiranje ta tukaj, drugace v komunikacijski enoti = ren
65
            --data_out: out integer;       --TODO: spravi ga v komunikacijsko enoto
66
            --RESET: in std_logic;
67
            --ADC_threshold: in unsigned ( (11 - 1) downto 0 );
68
            --ADC_capt_num_of_samples: in unsigned ( (byte - 1) downto 0 )
69
 
70
            );
71
 
72
 
73
 
74
 
75
end hist_system_top;
76
 
77
architecture Behavioral of hist_system_top is
78
 
79
----------------COMPONENTS---------------------------
80
 
81
    component ADC_unit
82
 
83
        generic ( adc_bit_num : natural := 14; --input data from ad converter is 14 bit
84
              bit_num : natural := 10; -- number of bits for our data (scaled from 14 bit to 10 bit)
85
              num_of_units: natural := 2; -- number of BRAM_buffer and PE_unit units
86
              buffer_size: natural := 5; --size of each BRAM_buffer in bits
87
              mode: string := "MODE_3"; -- modes of operation: MODE_1 = navaden algoritm, MODE_2 = odklop bufferja in 1 enota, MODE_3 = novo od 30.11.2018 naprej
88
              byte: natural := 8
89
 
90
             );
91
 
92
        port ( clk_in: in std_logic;
93
           START: in std_logic; -- start the system
94
           data_in : in unsigned ( (adc_bit_num - 1) downto 0 ); --data from ADC
95
           ADC_unit_feedback: in std_logic;
96
           AD_wr_en: out unsigned ( (num_of_units - 1) downto 0 );-- goes to BRAM_buffer, to AD_wr_en signal
97
           AD_addr: out unsigned ( (buffer_size - 1) downto 0 );  -- goes to BRAM_buffer, address signal
98
           data_out: out unsigned ( (bit_num - 1) downto 0 ); -- goes to data_in of BRAM_buffer
99
           --MODE_3--
100
           threshold: in unsigned ( (11 - 1) downto 0 );
101
           capt_num_of_samples: in unsigned ( (byte - 1) downto 0);
102
           INT_res: out std_logic; --reset signal za integrator
103
 
104
           SW_trigger_value: in unsigned(4 downto 0);
105
           PM_trigger_in: in unsigned ( (adc_bit_num - 1) downto 0)
106
          );
107
    end component;
108
 
109
 
110
    component BRAM_buffer is
111
 
112
        generic (
113
                  bit_num : natural := 10; --number of data bits
114
                  buffer_size : natural := 26); -- buffer size in bits, 5 bit gets 32 different values 
115
 
116
        port (
117
               clk: in std_logic;
118
               AD_wr_en: in std_logic; --from AD unit, enable writing into bram
119
               AD_addr: in unsigned ( (buffer_size - 1) downto 0); --from AD unit, address for writing
120
               PE_addr: in unsigned ( (buffer_size - 1) downto 0 ); -- from PE_unit, address for reading
121
               PE_wr_en: in std_logic; -- from PE_unit, enable writing into PE unit 
122
               data_in : in unsigned ( (bit_num - 1) downto 0 ); --data from ADC
123
               data_out : out unsigned ( (bit_num - 1) downto 0 ); -- data for PE_unit
124
               BUFF_data_ready: out std_logic --signal, ki PE_enoti pove, da so podatki pripravljeni (prvič)--preveri ali je to potrebno, ker bodo itak samo ničle letele iz PE enote predn se kaj vpiše, ničle lahko na računalniku preč vržem
125
              );
126
 
127
    end component;
128
 
129
 
130
     component PE_unit
131
        generic (
132
                  bit_num : natural := 10;
133
                  bin_num : natural := 1024;
134
                  buffer_size : natural := 5;
135
                  byte: natural := 8;
136
                  mode: string := "MODE_3" );
137
        port (
138
                clk: in std_logic;
139
                UC_wr_en: in std_logic; --microprocessor tells PE_unit that it read current data and is ready for the next one -- ustavljanje, pošiljaj histogram takrat, ko je procesor ready, ne vsak clk cikel
140
                PE_START: in std_logic; --flag that tells PE_unit that BRAM_buffer is full
141
                data_in : in unsigned ( (bit_num - 1) downto 0 ); --data for PE unit from BRAM_buffer
142
                BUFF_addr: out unsigned ( (buffer_size - 1) downto 0 ); -- address for BRAM_buffer, goes to PE_addr
143
                PE_wr_rd_en: out std_logic; -- signal to tell BRAM_buffer to start sending when '1' and to tell PE_unit to start sending when '0' 
144
                data_out: out unsigned ( buffer_size downto 0 ); -- output data
145
                UC_rd_en_final: out std_logic; --tells microprocessor that data is ready to be sent from PE_unit to microprocessor
146
                ---MODE_3 additional ports---
147
                write_A_M3: in std_logic; --gre na write_A, ko smo v postopku branja,  
148
                PE_RESET: in std_logic;
149
                ADC_unit_RESET: out std_logic;
150
                UC_rd_en_current: out std_logic  
151
             );
152
    end component;
153
 
154
 
155
------------------SIGNALS--------------------------
156
 
157
    --ADC_unit signals
158
     signal PE_wr_rd_en_all_units: unsigned ( (num_of_units - 1) downto 0 ) := (others => '0'); -- combines all PE_wr_rd signals together
159
     signal zeros: unsigned ( (num_of_units - 1) downto 0 ) := (others => '0');
160
     signal ones:  unsigned ( (num_of_units - 1) downto 0 ) := (others => '1');
161
     signal PE_wr_rd_en_sig: std_logic;-- := '0';
162
     signal ADC_unit_feedback_sig: std_logic := '0';
163
     signal ADC_threshold_sig: unsigned ( 10 downto 0) := (others => '0');
164
     signal ADC_capt_num_of_samples_sig: unsigned ( (byte - 1) downto 0 ) := (others => '0');
165
     signal ADC_unit_RESET_sig: std_logic := '0';
166
 
167
     signal SW_trigger_value_sig : unsigned (4 downto 0) :=  (others => '0');
168
 
169
 
170
     signal AD_wr_en_sig: unsigned ( (num_of_units - 1) downto 0 ) := (others => '0') ;
171
     signal AD_addr_sig: unsigned ( (buffer_size - 1) downto 0 ) := (others => '0');
172
     signal ADC_data_sig: unsigned ( (bit_num - 1) downto 0 ) := (others => '0');
173
 
174
     --BRAM_buffer_signals
175
     type buff_data_connection is array ( 0 to (num_of_units -1) ) of unsigned ( (bit_num - 1) downto 0 );
176
     signal BUFF_data_out : buff_data_connection := (others => (others => '0'));
177
 
178
     signal BUFF_en: unsigned ( (num_of_units - 1) downto 0 );
179
     signal BUFF_data_in: unsigned ( (bit_num - 1) downto 0 );
180
 
181
     signal BUFF_data_ready_sig: std_logic := '0';
182
     signal PE_BUFF_addr_sig_1 : unsigned ( (buffer_size - 1) downto 0):= (others => '0');
183
     signal PE_BUFF_addr_sig_2 : unsigned ( (buffer_size - 1) downto 0);
184
 
185
 
186
     --PE_unit signals
187
     type PE_data_connection is array ( 0 to (num_of_units - 1) ) of unsigned (buffer_size downto 0);
188
     signal PE_data_out : PE_data_connection := (others => (others => '0'));
189
 
190
     signal PE_en_1: std_logic;
191
     signal PE_en_2: std_logic;
192
     signal PE_en_3: std_logic;
193
     signal PE_data_in_1: buff_data_connection;
194
     signal PE_data_in_2: buff_data_connection;
195
 
196
     signal UC_rd_en_all_units : unsigned ( (num_of_units - 1) downto 0 ) := (others => '0'); -- vsi morjo bit 1, da je UC_rd_en = 1
197
     signal UC_rd_en_final_sig: std_logic; --procesor gleda ta signal, ko je 1, prenese 1023 podatkov in to je histogram
198
     signal UC_rd_en_current_sig: std_logic;
199
     signal UC_wr_en_sig : std_logic := '0'; -- komponenta gleda ta signal (kontrolira ga procesor), ko je falling edge, pošlje nov podatek procesorju
200
 
201
 
202
     --Other signals
203
     shared variable PE_data_sum: unsigned (23 downto 0) := (others => '0'); --glej zapiske za razporeditev podatkov na izhodno vodilo (15.11.2018)
204
     signal HISTOGRAM: unsigned (23 downto 0) := (others => '0'); --izhodni podatki
205
 
206
 
207
     --UC communication signals
208
     constant HIST_SYS_ADDR: std_logic_vector (19 downto 0) := X"00000"; --naslov mojega hardwarea je 0 
209
     signal data_for_UC_sig : std_logic_vector ( (comm_bit_num - 1) downto 0 ) := (others => '0');
210
     signal START_sig: std_logic := '0';
211
     signal RESET_sig: std_logic := '0';
212
 
213
 
214
 
215
 
216
     signal data_in_mappped_sig:  unsigned ( (bit_num - 1) downto 0);
217
 
218
 
219
begin
220
 
221
 
222
--------COMBINATIONAL PART----------------
223
 
224
    --M5--
225
    PE_wr_rd_en_sig <= '0' when PE_wr_rd_en_all_units = zeros else
226
                       '1' when PE_wr_rd_en_all_units = ones;
227
 
228
    --M6--
229
    UC_rd_en_final_sig <= '0' when UC_rd_en_all_units = zeros else
230
                          '1' when UC_rd_en_all_units = ones;
231
 
232
 
233
    --M7--
234
    PE_en_3 <= PE_en_2   when (MODE = "MODE_1" or MODE = "MODE_2") else
235
               START_sig when MODE = "MODE_3";
236
 
237
 
238
--   ------SIGNALI, KI SO DRUGACE PRIKLOPLJENI NA PROCESOR------------
239
--   data_out <= to_integer(HISTOGRAM);
240
 
241
--   UC_wr_en_sig <= UC_wr_en; --TODO: spremenjeno 16.11. -- to ni vec tako, sedaj je signal povezan na komunikacijsko enoto
242
 
243
--   START_sig <= START; -- TODO: to za zdej, potem bo start povezan preko komunikacijske enote --POVEZANO
244
 
245
 
246
--   RESET_sig <= RESET;
247
--   ADC_threshold_sig <= ADC_threshold;
248
--   ADC_capt_num_of_samples_sig <= ADC_capt_num_of_samples;
249
-----------------------------------------------------------------------------
250
 
251
 
252
   --Multiplekserji / Demultiplekserji za eliminacijo bufferjev 
253
   --D1--
254
   PE_en_1 <= AD_wr_en_sig(0) when (MODE = "MODE_2" or MODE = "MODE_3") else --ko je samo 1 enota, je itak AD_wr_en samo std_logic, ima samo 0-ti element
255
               '0';
256
 
257
   BUFF_en <= AD_wr_en_sig when MODE = "MODE_1"  else
258
              (others => '0');
259
 
260
   --D2--
261
   PE_data_in_1(0) <= ADC_data_sig when (MODE = "MODE_2" or MODE = "MODE_3") else
262
                   (others => '0');
263
 
264
   BUFF_data_in <= ADC_data_sig when MODE = "MODE_1" else
265
                   (others => '0');
266
 
267
   --M1--
268
   PE_en_2 <= PE_en_1 when (MODE = "MODE_2" or MODE = "MODE_3") else
269
              BUFF_data_ready_sig;  
270
 
271
   --M2--
272
   PE_data_in_2 <= PE_data_in_1 when (MODE = "MODE_2" or MODE = "MODE_3") else
273
                   BUFF_data_out;
274
 
275
   --M3--
276
   PE_BUFF_addr_sig_2 <= (others => '0') when (MODE = "MODE_2" or MODE = "MODE_3") else
277
                         PE_BUFF_addr_sig_1;
278
 
279
   --M4--
280
   ADC_unit_feedback_sig <= UC_rd_en_final_sig when  ( MODE = "MODE_2" or (MODE = "MODE_3" and ADC_unit_RESET_sig = '0') ) else
281
                            '1' when (MODE = "MODE_3" and ADC_unit_RESET_sig = '1') else
282
                            PE_wr_rd_en_sig;-- za MODE_1 
283
 
284
 
285
 
286
------------------------CONNECT COMPONENTS---------------------
287
 
288
    ADC_unit_connect: ADC_unit generic map ( adc_bit_num  => adc_bit_num,
289
                                             bit_num      => bit_num,
290
                                             num_of_units => num_of_units,
291
                                             buffer_size  => buffer_size,
292
                                             byte        => byte,
293
                                             mode        => mode)
294
 
295
                               port map (clk_in              => clk,
296
                                         START               => START_sig,
297
                                         data_in             => data_in,
298
                                         ADC_unit_feedback   => ADC_unit_feedback_sig,
299
                                         AD_wr_en            => AD_wr_en_sig,
300
                                         AD_addr             => AD_addr_sig,
301
                                         data_out            => ADC_data_sig,
302
                                         threshold           => ADC_threshold_sig,
303
                                         capt_num_of_samples => ADC_capt_num_of_samples_sig,
304
                                         INT_res             => INT_res,
305
 
306
                                         SW_trigger_value    => SW_trigger_value_sig,
307
                                         PM_trigger_in       => PM_trigger_in
308
                                         );
309
 
310
 
311
 
312
    BUFF_ON_OFF: if (num_of_units /= 1) generate -- if generate vklaplja in izklaplja BRAM_buffer glede na stevilo enot (num_of_units)
313
 
314
        BRAM_buffer_connect: for i in 0 to (num_of_units - 2) generate
315
 
316
                 BUFF: BRAM_buffer generic map ( bit_num     => bit_num,
317
                                                 buffer_size => buffer_size )
318
 
319
                                   port map ( clk             => clk,
320
                                              AD_wr_en        => BUFF_en(i),
321
                                              AD_addr         => AD_addr_sig,
322
                                              PE_addr         => PE_BUFF_addr_sig_2,
323
                                              PE_wr_en        => PE_wr_rd_en_sig,
324
                                              data_in         => BUFF_data_in,
325
                                              data_out        => buff_data_out(i),
326
                                              BUFF_data_ready => open );
327
         end generate;
328
 
329
         BRAM_buffer_connect_BUFF_last: BRAM_buffer generic map ( bit_num     => bit_num,
330
                                                                  buffer_size => buffer_size )
331
 
332
                                                    port map ( clk => clk,
333
                                                               AD_wr_en        => BUFF_en(num_of_units - 1),
334
                                                               AD_addr         => AD_addr_sig,
335
                                                               PE_addr         => PE_BUFF_addr_sig_2,
336
                                                               PE_wr_en        => PE_wr_rd_en_sig,
337
                                                               data_in         => BUFF_data_in,
338
                                                               data_out        => buff_data_out(num_of_units - 1),
339
                                                               BUFF_data_ready => BUFF_data_ready_sig ); --zadnji sprozi branje v PE_enoto
340
 
341
    end generate;
342
 
343
 
344
     PE_unit_connect: for i in 0 to (num_of_units - 1) generate
345
 
346
             PE: PE_unit generic map ( bit_num     => bit_num,
347
                                       bin_num     => bin_num,
348
                                       buffer_size => buffer_size,
349
                                       byte        => byte,
350
                                       mode        => mode )
351
 
352
                         port map ( clk              => clk,
353
                                    PE_START         => PE_en_3,
354
                                    data_in          => PE_data_in_2(i),
355
                                    BUFF_addr        => PE_BUFF_addr_sig_1,
356
                                    PE_wr_rd_en      => PE_wr_rd_en_all_units(i),
357
                                    data_out         => PE_data_out(i),
358
                                    UC_rd_en_final   => UC_rd_en_all_units(i), --komponenta pove procesorju, da je data ready za posiljanje v procesor
359
                                    UC_rd_en_current => UC_rd_en_current_sig,
360
                                    UC_wr_en         => UC_wr_en_sig,  -- procesor pove komponenti, da lahko poslje nov podatek
361
                                    write_A_M3       => PE_en_1,
362
                                    ADC_unit_RESET   => ADC_unit_RESET_sig,
363
                                    PE_RESET         => RESET_sig
364
                                    );
365
 
366
     end generate;
367
 
368
 
369
--------------SEQUENTIAL PART --------------------------------
370
 
371
    HIST_RECONSTRUCTION: process (clk)
372
        --variable PE_data_sum: integer := 0; --TODO: stevilo bitov tega signala in izhodnega signala mora biti:
373
    begin                                    -- N = buffer_size + log(number_of_units) / log(2)
374
 
375
        if ( rising_edge(clk) ) then
376
 
377
 
378
            if (UC_rd_en_final_sig = '1') then
379
                PE_data_sum := (others => '0'); --da se ponastavi na 0 pred vsakim seštevanjem           
380
                for i in 0 to (num_of_units - 1) loop
381
                    PE_data_sum := PE_data_sum + to_integer(PE_data_out(i)); --TODO: ali rabim tukaj to_integer ?? Bo pravilno tudi če ga ni (signala imata razlicno st. bitov)???
382
                end loop;
383
 
384
 
385
            elsif (UC_rd_en_current_sig = '1') then
386
 
387
                PE_data_sum := (others => '0'); --da se ponastavi na 0 pred vsakim seštevanjem           
388
 
389
                for i in 0 to (num_of_units - 1) loop
390
                    PE_data_sum := PE_data_sum + to_integer(PE_data_out(i)); --TODO: ali rabim tukaj to_integer ?? Bo pravilno tudi če ga ni (signala imata razlicno st. bitov)???
391
                end loop;
392
 
393
            end if;
394
 
395
 
396
 
397
            HISTOGRAM <= PE_data_sum;
398
 
399
 
400
        end if;
401
 
402
    end process;
403
 
404
 
405
 
406
 -----------------------COMMUNICATION WITH MICROPROCESSOR-----------------   
407
 
408
 
409
    REC_FROM_MICROPROCESSOR: process (clk)
410
 
411
    begin
412
 
413
        if ( rising_edge(clk) ) then
414
 
415
             if (rstn = '0') then
416
                START_sig <= '0';
417
             elsif ( wr_en = '1' and HW_addr(19 downto 0) = HIST_SYS_ADDR ) then -- Q: kaksen naj bo HW address??  --mora biti 19 downto 0, tako kot na vajah
418
                START_sig <= data_from_UC(0);
419
                RESET_sig <= data_from_UC(1);
420
                ADC_threshold_sig <= unsigned(data_from_UC(18 downto 8));
421
                ADC_capt_num_of_samples_sig <= unsigned(data_from_UC(26 downto 19));
422
                SW_trigger_value_sig <= unsigned(data_from_UC(31 downto 27));
423
 
424
             end if;
425
 
426
         end if;
427
 
428
    end process;
429
 
430
 -----------------------   
431
    UC_wr_en_sig <= rd_en; -- signal za menjavo izhodnih podatkov iz komponente
432
    data_for_UC_sig <= std_logic_vector(HISTOGRAM) & "00000" & START_sig & UC_rd_en_current_sig & UC_rd_en_final_sig;    --Q: a bo to OK, ta pretvorba?? Se kej podatkov izgubi ali pomesa??
433
    error <= '0'; -- iz vaje 7                                      
434
 
435
    --data_for_UC_sig <=== zlozim vse podatke, ki jih hocem poslati procesorju v 32 bitni signal 
436
 
437
    SEND_TO_MICROPROCESSOR: process (HW_addr, wr_en, rd_en, UC_rd_en_final_sig)
438
 
439
    begin
440
 
441
        if ( (wr_en or rd_en)  = '1' ) then
442
            ack <= '1';
443
        end if;
444
 
445
        if ( HW_addr(19 downto 0) = HIST_SYS_ADDR ) then
446
            data_for_UC <= data_for_UC_sig;
447
        else
448
            data_for_UC <= (others =>'0');
449
        end if;
450
 
451
    end process;
452
 
453
      --Q: kje pa tukaj pride rn_en oz UC_wr_en_sig v postev???
454
 
455
 
456
 
457
 
458
 
459
end Behavioral;