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: 14.10.2018 11:13:46
6
-- Design Name: 
7
-- Module Name: PE_unit - 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 PE_unit is
35
 
36
    generic (
37
              bit_num : natural := 10; --number of data bits    
38
              bin_num : natural := 1024; --number of histogram bins
39
              buffer_size : natural := 5; -- buffer size in bits, 5 bit gets 32 different values
40
              byte: natural := 8;
41
              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
42
              );
43
 
44
    port (
45
           clk: in std_logic;
46
           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
47
           PE_START: in std_logic; --flag that tells PE_unit that BRAM_buffer is full
48
           data_in : in unsigned ( (bit_num - 1) downto 0 ); --data for PE unit from BRAM_buffer
49
           BUFF_addr: out unsigned ( (buffer_size - 1) downto 0 ); -- address for BRAM_buffer, goes to PE_addr
50
           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' 
51
           data_out: out unsigned ( buffer_size downto 0 ); -- output data
52
           UC_rd_en_final: out std_logic; --tells microprocessor that whole histogram data is ready to be sent from PE_unit to microprocessor
53
           UC_rd_en_current: out std_logic; -- signal, ki procesorju omogoci sprotno branje iz brama2
54
           ---MODE_3 additional ports---
55
           write_A_M3: in std_logic; --gre na write_A, ko smo v postopku branja,  
56
           ADC_unit_RESET: out std_logic;
57
           PE_RESET: in std_logic      
58
         );
59
end PE_unit;
60
 
61
architecture Behavioral of PE_unit is
62
 
63
---------------------COMPONENTS-----------------------
64
    component dual_port_bram is
65
 
66
        generic (
67
                  bit_num : natural := 10;
68
                  bin_num : natural := 1024; --number of histogram bins
69
                  buffer_size : natural := 5 -- buffer size in bits, 5 bit gets 32 different values
70
 
71
                 );
72
 
73
        port (
74
               -- A side --
75
               clk_A: in std_logic;
76
               bram_en_A: in std_logic;
77
               wr_en_A: in std_logic;
78
               addr_A: in unsigned ( (bit_num - 1) downto 0 );
79
               data_in_A: in unsigned ( buffer_size downto 0 );
80
               data_out_A: out unsigned ( buffer_size downto 0 );
81
 
82
               -- B side --
83
               clk_B: in std_logic;
84
               bram_en_B: in std_logic;
85
               wr_en_B: in std_logic;
86
               addr_B: in unsigned ( (bit_num - 1) downto 0 );
87
               data_in_B: in unsigned ( buffer_size downto 0 );
88
               data_out_B: out unsigned ( buffer_size downto 0 )
89
               );
90
 
91
    end component;
92
 
93
 
94
 
95
------------------SIGNALS-----------------------------
96
 
97
 signal zeros : unsigned( buffer_size downto 0 ) := (others => '0'); --zero signal
98
 signal zeros10: unsigned( (bit_num - 1) downto 0 ) := (others => '0');
99
 
100
 signal old_value : unsigned ( (bit_num - 1) downto 0 );
101
 signal new_value : unsigned ( (bit_num - 1) downto 0 );
102
 
103
 signal BUFF_addr_sig : unsigned ( (buffer_size - 1) downto 0 ) := zeros(buffer_size - 1 downto 0); -- address for BRAM_buffer, goes to PE_addr
104
 
105
 type state_type is (IDLE, WRITE, READ, RESET); --definicija avtomata s stirimi stanji
106
 signal state: state_type := IDLE;
107
 
108
--values to be writen/read to/from bram1--
109
 signal counter_new : unsigned ( (buffer_size ) downto 0 ) := (others => '0');
110
 signal counter_in : unsigned ( (buffer_size ) downto 0 ) := (others => '0');
111
 signal count_update : std_logic := '0';
112
 signal start_counting : std_logic := '0';
113
 signal bin_idx : unsigned ( (bit_num - 1) downto 0 ) := (others => '0');
114
 --signal bin_idx_reset : unsigned ( (bit_num - 1) downto 0 ) := (others => '0'); --this signal is address to write 0 into bram (to reset bram)
115
 
116
--bram1 control signals--
117
 signal addr_A_sig : unsigned ( (bit_num - 1) downto 0 ) := (others => '0');
118
 signal addr_B_sig : unsigned ( (bit_num - 1) downto 0 ) := (others => '0');
119
 signal data_in_A_sig : unsigned ( buffer_size downto 0 ) := (others => '0');
120
 signal data_out_B_sig : unsigned ( buffer_size downto 0 ) := (others => '0');
121
 
122
 
123
 signal write_A: std_logic := '0';
124
 signal read_B: std_logic := '0';
125
 
126
 
127
--other control signals --
128
 signal PE_wr_rd_en_sig: std_logic := '0';
129
 signal UC_rd_en_final_sig : std_logic := '0';
130
 signal UC_rd_en_current_sig : std_logic := '0';
131
 signal UC_wr_en_sig : std_logic := '0';
132
 signal UC_wr_en_prev_sig: std_logic := '0';
133
 
134
signal delay_flag : boolean := FALSE; --used only to delay certain signals or states for 1 clock cycle
135
 
136
--MODE_3 signals--
137
signal RESET_sig: std_logic := '0'; --gledam rising edge reset signala, zato tudi reset_sig_prev signal
138
signal RESET_sig_prev: std_logic := '0';
139
signal ADC_unit_RESET_sig: std_logic := '0';
140
signal counter : unsigned ( (buffer_size ) downto 0 ) := (others =>'0'); --steje stevilo prejetih podatkov, ko pride do konca je buffer full
141
--bram2 signals
142
signal write_A_all_modes: std_logic := '0'; --izhod iz multiplekserja; ko sta MODE 1 in 2, je to stari write_A, drugace pa pulzni signal iz ADC_enote v MODE_3
143
signal write_A_prev_M3: std_logic := '0'; -- signal, s katerim gledam rising edge write_A_all_modes signala v MODE_3
144
signal data_out_bram1_sig : unsigned ( (buffer_size ) downto 0 ) := (others => '0');
145
signal data_out_bram2_sig : unsigned ( (buffer_size ) downto 0 ) := (others => '0');
146
signal read_B2: std_logic := '0';
147
signal addr_B2_sig : unsigned ( (bit_num - 1) downto 0 ) := (others => '0');
148
 
149
 
150
 signal data_out_sig : unsigned ( (buffer_size ) downto 0 ) := (others => '0');
151
 
152
 
153
------------------FUNCTIONS-----------------------
154
 function check_signal_edge( sig_in: std_logic;
155
                             sig_in_prev: std_logic;
156
                             type_of_edge: string) return boolean is --falling or rising
157
 
158
 begin
159
 
160
    if (type_of_edge = "rising") then
161
 
162
        if (sig_in = '1' and sig_in_prev = '0') then
163
            return TRUE;
164
        else
165
            return FALSE;
166
        end if;
167
 
168
    elsif (type_of_edge = "falling") then
169
 
170
        if (sig_in = '0' and sig_in_prev = '1') then
171
            return TRUE;
172
        else
173
            return FALSE;
174
        end if;
175
 
176
    end if;
177
 
178
 end function;
179
 
180
 
181
 ----------------------------------------------------------------------------
182
 
183
 
184
 
185
 
186
 
187
 
188
 
189
begin
190
 
191
    BRAM_connect: dual_port_bram generic map (bit_num     => bit_num,
192
                                              bin_num     => bin_num,
193
                                              buffer_size => buffer_size)
194
 
195
                                 port map (clk_A => clk,
196
                                           bram_en_A => write_A_all_modes, --spremenjeno 2.12.2018
197
                                           wr_en_A => write_A_all_modes, -- -||-
198
                                           addr_A => addr_A_sig,
199
                                           data_in_A => data_in_A_sig,
200
                                           data_out_A => open,
201
 
202
                                           clk_B => clk,
203
                                           bram_en_B => read_B,
204
                                           wr_en_B => '0', --ni pisanja v B port, to more biti vedno onemogočeno
205
                                           addr_B => addr_B_sig,
206
                                           data_in_B => zeros, --open ne pusti, zato sem dal zeros
207
                                           data_out_B => data_out_B_sig );
208
 
209
 
210
 -------------------------------------NALOGA BRAM_1-----------------------------------------------------
211
 
212
  --stran A: a1) vpisovanje vrednosti iz BRAM_bufferja (preko algoritma za histogram) (state = WRITE)
213
  --         a2) vpisovanje nicel (reset pomnilnika) (state = READ)
214
 
215
  --stran B: b1) branje novega counterja (counter_new) za histogram algoritem (state = WRITE)
216
  --         b2) branje izhodnih podatkov data_out (state = READ)
217
 
218
  --HKRATI: a1) in b1)
219
  --        a2) in b2)           
220
 
221
 
222
 
223
 ------------------------------ COMB. DEL, KI VELJA ZA VSE MODE-e ------------------------------------------------------------
224
 
225
  BUFF_addr <= BUFF_addr_sig;
226
  PE_wr_rd_en <= PE_wr_rd_en_sig;
227
  ADC_unit_RESET <= ADC_unit_RESET_sig;
228
 
229
  new_value <= data_in      when state = WRITE else
230
               (others => '0');-- when state = READ or state = IDLE or state = RESET;
231
 
232
  data_out <= data_out_sig;
233
 
234
 --signals from/to microprocessor 
235
  UC_rd_en_final <= UC_rd_en_final_sig;
236
  UC_rd_en_current <= UC_rd_en_current_sig;
237
  UC_wr_en_sig <= UC_wr_en;
238
  RESET_sig <= PE_RESET;
239
 
240
 
241
 
242
--------------------------------------------------------------------------------------------------------------------------------
243
 
244
 
245
 
246
 
247
--------------------------------MODE_1 AND MODE_2 ------------------------------------------------------------------------------
248
----------------------------------------------------------------------------------------------------------------------------------
249
----------------------------------------------------------------------------------------------------------------------------------
250
 
251
MODE_1_MODE_2: if (mode = "MODE_1" or mode = "MODE_2") generate
252
 
253
 
254
----------------------- COMBINATIONAL PART -----------------
255
 
256
 
257
 
258
---- Counter Adder----
259
 
260
  counter_in <= (0 =>  '1', others => '0') when count_update = '0' else  --mux - : tale enka tukaj zato, da ni 'X' na zacetku pr signalih, glej sliko v mapi slike, grafi itd.
261
                (counter_new + 1) when count_update = '1'; --important part: this is where counter_new is increased every iteration
262
 
263
 
264
  counter_new <= data_out_B_sig when state = WRITE else --demux
265
                zeros;
266
 
267
 
268
 ----Data IN/OUT----
269
 
270
  data_in_A_sig <= counter_in when state = WRITE else   --mux
271
                   zeros      when state = READ;
272
                   --TODO: dodaj se za RESET stanje (nicle) 
273
 
274
 
275
  data_out_sig <= data_out_B_sig when state = READ else -- demux
276
                  zeros;
277
 
278
 
279
 
280
 ---- Enable signals ----
281
 
282
  write_A_all_modes <= write_A;
283
 
284
  read_B <=        PE_wr_rd_en_sig       when state = WRITE else
285
                   not PE_wr_rd_en_sig   when state = READ else
286
                   '0'                   when state = IDLE;
287
 
288
 
289
 
290
 
291
---- Address signals ----
292
  addr_A_sig <= old_value                       when state = WRITE else
293
                bin_idx - 1                     when state = READ and bin_idx > 0 else
294
                to_unsigned(bin_num - 1,10)     when state = READ and delay_flag = TRUE else  -- tukaj naj bo address 1023, da se vpise 0 na to mesto (reset)
295
                zeros10                         when state = IDLE;
296
 
297
 
298
  addr_B_sig <= new_value       when state = WRITE else
299
                bin_idx         when state = READ else
300
                zeros10         when state = IDLE;
301
 
302
 
303
 
304
 
305
 
306
 
307
 ----------------------------------SEQUENTIAL PART -------------------------------------------
308
 
309
 
310
     ALGORITHM: process(clk)
311
 
312
        variable first_data: std_logic := '0';
313
 
314
 
315
 
316
     begin  
317
 
318
        if rising_edge(clk) then
319
 
320
            case state is
321
 
322
                when IDLE =>
323
 
324
                    write_A <= '0'; -- this one is here, because we have to set it to '0' after program returns from READ state
325
                    --UC_rd_en_sig  <= '0'; --ta tukej zato, da se v hist_system_top vpisejo vse vrednosti na data_out, pol pa sele tale dol pade
326
 
327
                    --writing condition--
328
                    if (PE_START = '1' and UC_rd_en_final_sig = '0' ) then -- and "konec posiljanja flag je ON" ) then -- sem pripravljen na sprejemanje
329
 
330
                        if(delay_flag = FALSE) then
331
                            delay_flag <= TRUE;
332
                            PE_wr_rd_en_sig <= '1'; --zacni sprejemanje
333
                            old_value <= zeros10;
334
                            BUFF_addr_sig <= zeros(buffer_size - 1 downto 0);
335
 
336
                        else
337
                            state <= WRITE;
338
                            delay_flag <= FALSE; -- ponastavitev delay flaga, da se lahko uporabi se drugje
339
                            old_value <= new_value;
340
                            BUFF_addr_sig <= BUFF_addr_sig + 1;
341
                            --first_data := '0'; --ponastavi, drugace se branje OK izvede samo prvic.
342
                        end if;
343
 
344
                    --reading condition, part 1 ---
345
                    elsif (PE_START = '0' and PE_wr_rd_en_sig = '1') then --sem pripravljen na pošiljanje -- tole se lahko zgodi sele, ko gre najprej WRITE faza skozi,                                                                            
346
                        PE_wr_rd_en_sig <= '0';                                  -- to pa zato, da od zacetka ne posilja nicel, ampak se vrti v IDLE stanju.
347
 
348
                        state <= READ;
349
 
350
 
351
                    --idle condition-----    
352
                    else
353
                        state <= IDLE;
354
                    end if;
355
 
356
 
357
 
358
 
359
                when WRITE =>
360
 
361
                    if (first_data = '0') then
362
                        first_data := '1';
363
                        old_value <= new_value;
364
                        BUFF_addr_sig <= BUFF_addr_sig + 1;
365
 
366
                        write_A <= '1';
367
                        start_counting <= '1';
368
 
369
                    else
370
 
371
                        if (write_A = '1') then
372
                            count_update <= '1';
373
                        else
374
                            count_update <= '0';
375
                        end if;
376
 
377
 
378
                        if (PE_START = '1') then
379
                            BUFF_addr_sig <= BUFF_addr_sig + 1;
380
 
381
                        elsif (PE_START = '0') then
382
                            BUFF_addr_sig <= (others =>'0'); --zeros(buffer_size - 1 downto 0);
383
                            delay_flag <= TRUE; -- s tem za en urin cikel zamaknem prehod v IDLE state in ponastavitev vsega, zato da se vsi podatki poracunajo
384
                        end if;
385
 
386
 
387
                        old_value <= new_value;
388
 
389
 
390
 
391
                        if (delay_flag = TRUE) then
392
                            delay_flag <= FALSE;
393
                            write_A <= '0';
394
                            count_update <= '0';
395
                            start_counting <= '0';
396
                            state <= IDLE;
397
                            first_data := '0'; --ponastavi, drugace se branje OK izvede samo prvic.
398
 
399
                        end if;
400
 
401
 
402
                    end if;
403
 
404
 
405
 
406
 
407
                when READ => --za dodajanje procesorskega signala: signal vpliva samo na povečevanje indeksov, ne na write in read in brama. samo ob pravem času more index povečat
408
                    if (bin_idx = to_unsigned(2,bit_num) ) then --tole zato, da mi prvega podatka takoj ne pobriše, oz. da na 0, ampak ga šele potem, ko pride drugi podatek na izhodno vodilo : TODO: A NE BI MOGL BIT 1?? SPODEJ MAM 1 IN PROV DELA
409
                        write_A <= '1';
410
                    end if;
411
 
412
 
413
                    UC_rd_en_final_sig <= '1';
414
 
415
                    UC_wr_en_prev_sig <= UC_wr_en_sig; --ta signal zato, da lahko gledam falling edge od UC_wr_en, ker na falling edge menjam podatke: novo 15.11.2018
416
    -------------------------------------------------------------
417
                    if (UC_wr_en_sig = '0' and UC_wr_en_prev_sig = '1') then -- ta pogoj je enak, kot da bi rekel if falling_edge (UC_wr_en)
418
                        bin_idx <= bin_idx + 1;
419
                    else
420
                        bin_idx <= bin_idx;
421
                    end if;
422
 
423
     ------------------------------------------------------------               
424
                    if (bin_idx = bin_num - 1) then
425
                        --write_A <= '0';
426
                        bin_idx <= (others =>'0'); --zeros & "0000";
427
                        delay_flag <= TRUE;
428
 
429
                    end if;
430
 
431
                    if (delay_flag = TRUE) then
432
                        delay_flag <= FALSE;
433
                        state <= IDLE; --menjava stanj mora biti zakasnjena za 1 clk, da se se 1023 podatek vpise na data_out
434
                        UC_rd_en_final_sig <= '0';
435
                    end if;                      
436
 
437
 
438
            end case;
439
 
440
        end if;
441
 
442
     end process;
443
 
444
end generate;
445
--------------------------------------------------------------------------------------------------------------------
446
-------------------------------------------------------------------------------------------------------------------
447
------------------------------------------------------------------------------------------------------------------------
448
 
449
 
450
 
451
 
452
 
453
 
454
 
455
-----------------------------MODE_3---------------------------------------------------------------------------------------------
456
---------------------------------------------------------------------------------------------------------------------------------
457
---------------------------------------------------------------------------------------------------------------------------------
458
MODE_3: if (mode = "MODE_3") generate
459
 
460
 
461
--priklucitev dodatnega bufferja
462
 
463
    BRAM_2_connect: dual_port_bram generic map (bit_num     => bit_num,
464
                                                bin_num     => bin_num,
465
                                                buffer_size => buffer_size)
466
 
467
                                   port map (clk_A => clk,
468
                                             bram_en_A => write_A_all_modes, --spremenjeno 2.12.2018
469
                                             wr_en_A => write_A_all_modes, -- -||-
470
                                             addr_A => addr_A_sig,
471
                                             data_in_A => data_in_A_sig,
472
                                             data_out_A => open,
473
 
474
                                             clk_B => clk,
475
                                             bram_en_B => read_B2,
476
                                             wr_en_B => '0', --ni pisanja v B port, to more biti vedno onemogočeno
477
                                             addr_B => addr_B2_sig,
478
                                             data_in_B => zeros,
479
                                             data_out_B => data_out_bram2_sig );
480
 
481
--------COMBINATIONAL PART------------------
482
 
483
---- Counter Adder, BRAM_1----
484
 
485
  counter_in <= (0 =>  '1', others => '0') when count_update = '0' else  --mux - : tale enka tukaj zato, da ni 'X' na zacetku pr signalih, ker counter_new rab, da ga bram inicializira glej sliko v mapi slike, grafi itd.
486
                (counter_new + 1) when count_update = '1'; --important part: this is where counter_new is increased every iteration
487
 
488
 
489
 
490
 ----Data IN/OUT, BRAM_1----
491
 
492
  data_in_A_sig <= counter_in when state = WRITE else   --mux
493
                   zeros;-- za vsa ostala stanja      
494
 
495
 
496
 
497
  data_out_bram1_sig <= data_out_B_sig when state = READ else -- demux
498
              zeros;
499
 
500
  counter_new <= data_out_B_sig when state = WRITE else --demux
501
                 zeros;
502
 
503
 
504
 
505
 
506
 ---- Enable signals, BRAM_1 ----
507
 
508
  write_A_all_modes <=  write_A_M3 when state = WRITE else
509
                        write_A    when state = READ else --tukaj se vpisuejo nicle
510
                        '0'        when state = IDLE else--v idle zdej pomoje lahko zbrises write_A = '0', preveri
511
                        '1'        when state = RESET; --nicle vpisujes cel cajt, zato '1' 
512
 
513
  read_B <=        PE_wr_rd_en_sig       when state = WRITE else --TODO 31.3.2019: ali ni kar vseeno, da je addr_B_sig = '1', ko WR in RD in '0' else. <- ne, ker se pri WR stanju ta signal postavi z 1 clk zamude
514
                   not PE_wr_rd_en_sig   when state = READ else
515
                   '0'; -- V stanjih IDLE in RESET
516
 
517
                 --TODO: 7.4.2019 PE_wr_rd_en_sig bom preimenoval v read_B_en (zaenkrat samo za na shematiko)!!!!!!!
518
 
519
 
520
 
521
 
522
---- Address signals, BRAM_1 ----
523
 
524
  addr_A_sig <= old_value                              when state = WRITE else -- P2
525
                bin_idx - 1                            when state = READ and bin_idx > 0 else --P3
526
                to_unsigned(bin_num - 1,10)            when state = READ and delay_flag = TRUE else  -- tukaj naj bo address 1023, da se vpise 0 na to mesto (reset) P4
527
                (others =>'0')                         when state = IDLE else -- P1
528
                bin_idx                                when state = RESET; --P5
529
 
530
 
531
  addr_B_sig <= new_value            when state = WRITE else
532
                bin_idx              when state = READ else
533
                (others => '0'); --za ostali stanji IDLE in RESET
534
 
535
 
536
 
537
 
538
---- Data IN/OUT, BRAM_2 ----
539
 
540
    --input v bram2 je kar data_in_A_sig prikljucen na input komponente bram2
541
    --output bram2 je dat_out_bram2_sig , prikljuceno direktno na outB komponente bram2
542
 
543
 
544
---- Enable signals, BRAM_2 ----
545
 
546
    --write_A_all_modes je tudi write enable signal bram2
547
    read_B2 <= PE_wr_rd_en_sig when state = WRITE else
548
               '1'             when state = IDLE else --zato, da 1023. podatek pobrise iz data_out_bram2_sig
549
               '0'; -- v stanjih READ IN RESET
550
--TODO: 7.4.2019 PE_wr_rd_en_sig bom preimenoval v read_B_en (zaenkrat samo za na shematiko)!!!!!!!
551
 
552
 
553
---- Address signals, BRAM_2 ----
554
 
555
    --addr_A_sig : za vpisovanje je enak naslov kot pri bram1
556
 
557
    addr_B2_sig <=  bin_idx when state = WRITE else
558
                    (others => '0'); -- v stanjih READ, IDLE IN RESET         
559
 
560
 
561
 
562
 
563
 
564
--------skupna logika obeh bram-ov---------------------
565
  data_out_sig <= data_out_bram2_sig when state = WRITE else
566
                  data_out_bram1_sig when state = READ  else
567
                  (others => '0'); --pri IDLE in RESET stanju
568
 
569
 
570
--------SEQUENTIAL PART---------------------
571
 
572
    ALGORITHM_bram_1: process(clk)
573
 
574
        variable first_data: std_logic := '0';
575
        variable buffer_full: std_logic := '0'; -- 0 - ni se poln, 1 - bram je poln
576
 
577
    begin  
578
 
579
       if rising_edge(clk) then
580
 
581
           case state is
582
 
583
               when IDLE =>
584
 
585
                   if (PE_START = '1') then --START SIGNAL
586
 
587
                       write_A <= '0'; -- this one is here, because we have to set it to '0' after program returns from READ state
588
 
589
                       if (buffer_full = '0' and RESET_sig = '0') then -- ni se cas za posiljanje, se pravi lahko sprejemam --PISANJE V PE ENOTO
590
 
591
 
592
                           PE_wr_rd_en_sig <= '1'; --tole vezano na read_B, zato ga se vedno obdrzim
593
                           old_value <= (others => '0');
594
                           state <= WRITE;
595
                           --old_value <= new_value;
596
 
597
 
598
                       elsif (buffer_full = '1' and RESET_sig = '0') then --BRANJE NA KONCU IZ PE ENOTE
599
                        --pisi na vodilo na koncu in resetiraj prvi bram, tako kot do sedaj, skratka pojdi v READ stanje
600
                           bin_idx <= (others => '0'); --ga resetiram, da je 0,  ker ga tudi bram 2 uproablja
601
                           UC_wr_en_prev_sig <= '0'; -- da ga ponastavim, ker drugace mi 0. podatek takoj preklopi v 1., ne caka na falling edge od UC_wr_en_sig 
602
                           state <= READ;
603
 
604
 
605
                       elsif (check_signal_edge(RESET_sig,RESET_sig_prev,"rising")) then
606
                           state <= RESET;
607
                           ADC_unit_RESET_sig <= '1';
608
 
609
                       end if;
610
 
611
 
612
 
613
                   elsif (PE_START = '0') then --CE JE START NA '0'
614
 
615
                       if (check_signal_edge(RESET_sig,RESET_sig_prev,"rising")) then
616
                           state <= RESET;
617
                           bin_idx <= (others => '0');
618
                           ADC_unit_RESET_sig <= '1';
619
 
620
                       else
621
                           state <= IDLE;
622
                       end if;
623
 
624
                   end if;
625
 
626
                   --stimanje reset signala
627
                   RESET_sig_prev <= RESET_sig;
628
                   ----------------------------    
629
 
630
 
631
 
632
 
633
               when WRITE =>
634
 
635
                   -------------------bram_1 handling---------------------
636
                   old_value <= new_value;
637
                   count_update <= '1'; --ta tukaj samo zato, da nimam 'X' v simulaciji, glej sliko v mapi slike_grafi itd.
638
 
639
                   write_A_prev_M3 <= write_A_all_modes;
640
                   if (write_A_all_modes = '1' and write_A_prev_M3 = '0') then --rising edge write signala
641
                       counter <= counter + 1;
642
                   end if;
643
 
644
 
645
                   if (counter = 2**buffer_size) then --ko sem prejel maksimalno št. podatkov, ki jih lahko buffer shrani TODO: 18.5.2019: PREVERI TUKEJ, CE JE counter_in = 2*buffer_size -1
646
                       --kok delaya? -- nc ni treba
647
                       state <= IDLE;
648
                       buffer_full := '1';
649
                       PE_wr_rd_en_sig <= '0';
650
                       count_update <= '0';
651
                       counter <= (others => '0');
652
                   end if;
653
 
654
 
655
 
656
                   -----------------bram_2 handling ----------------------
657
                   if (counter > 0 and counter < 2**buffer_size) then --ce si ze vpisal vsaj en podatek in se nisi prisel do konca vpisovanja
658
                       UC_rd_en_current_sig <= '1'; --povej procesorju, da lahko zacne sprotno branje
659
 
660
                   elsif (counter = 2**buffer_size) then
661
                       UC_rd_en_current_sig <= '0'; -- procesor naj konca sprotno branje
662
                   end if;
663
 
664
 
665
                   UC_wr_en_prev_sig <= UC_wr_en_sig; --ta signal zato, da lahko gledam falling edge od UC_wr_en, ker na falling edge menjam podatke:
666
 
667
                   if (UC_rd_en_current_sig = '1') then --ce je omogoceno sprotno branje, lahko podajas podatke na izhod 
668
                       if (check_signal_edge(UC_wr_en_sig, UC_wr_en_prev_sig, "falling")) then -- ta pogoj je enak, kot da bi rekel if falling_edge (UC_wr_en)
669
                           bin_idx <= bin_idx + 1;
670
                       else
671
                           bin_idx <= bin_idx;
672
                       end if;
673
                   end if;
674
 
675
 
676
--                   if (bin_idx = bin_num - 1) then    
677
--                       --bin_idx <= (others =>'0'); --zeros & "0000";
678
--                       delay_flag <= TRUE;
679
--                   end if;                   
680
 
681
--                   if (delay_flag = TRUE) then
682
--                       delay_flag <= FALSE;
683
--                       --UC_wr_en_prev_sig <= '0';
684
--                       --bin_idx <= (others => '0');
685
--                   end if;
686
 
687
 
688
                   --------------------RESET handling--------------------------
689
                   RESET_sig_prev <= RESET_sig;
690
                   if (check_signal_edge(RESET_sig,RESET_sig_prev,"rising")) then
691
                       state <= RESET;
692
                       bin_idx <= (others =>'0');
693
                       UC_rd_en_current_sig <= '0';
694
                       ADC_unit_RESET_sig <= '1';
695
                   end if;
696
 
697
                   -----------------STOP SYSTEM handling ------------------------
698
                   if (PE_START = '0') then
699
                       state <= IDLE;
700
                       UC_rd_en_current_sig <= '0';
701
                   end if;
702
 
703
 
704
 
705
               when READ => --za dodajanje procesorskega signala: signal vpliva samo na povečevanje indeksov, ne na write in read in brama. samo ob pravem času more index povečat
706
 
707
                   UC_rd_en_final_sig <= '1';
708
   -------------------------------------------------------------
709
                   UC_wr_en_prev_sig <= UC_wr_en_sig; --ta signal zato, da lahko gledam falling edge od UC_wr_en, ker na falling edge menjam podatke: novo 15.11.2018
710
 
711
                   if (UC_rd_en_final_sig = '1') then --to zato, da, ce se ponesreci vrine kaksen UC_wr_en preden skoci UC_rd_en_final na '1', da se nic ne zgodi
712
                       if ( check_signal_edge(UC_wr_en_sig, UC_wr_en_prev_sig, "falling") ) then -- ta pogoj je enak, kot da bi rekel if falling_edge (UC_wr_en)
713
                           bin_idx <= bin_idx + 1;
714
                       else
715
                           bin_idx <= bin_idx;
716
                       end if;
717
                   end if;
718
 
719
    ------------------------------------------------------------ 
720
                   if (bin_idx = to_unsigned(1,bit_num) ) then --tole zato, da mi prvega podatka takoj ne pobriše, oz. da na 0, ampak ga šele potem, ko pride drugi podatek na izhodno vodilo
721
                       write_A <= '1';
722
                   end if;
723
 
724
 
725
                   if (bin_idx = bin_num - 1) then
726
                       bin_idx <= (others =>'0');
727
                       delay_flag <= TRUE;
728
 
729
                   end if;
730
 
731
                   if (delay_flag = TRUE) then
732
                       delay_flag <= FALSE;
733
                       state <= IDLE; --menjava stanj mora biti zakasnjena za 1 clk, da se se 1023 podatek vpise na data_out
734
                       UC_rd_en_final_sig <= '0';
735
                       bin_idx <= (others => '0'); --se enkrat na 0, drugace se zaradi delaya spet postavi na 1
736
                       buffer_full := '0';
737
                   end if;  
738
 
739
 
740
                   --------------------RESET handling--------------------------
741
                   RESET_sig_prev <= RESET_sig;
742
                   if (check_signal_edge(RESET_sig,RESET_sig_prev,"rising")) then
743
                       state <= RESET;
744
                       bin_idx <= (others => '0');
745
                       UC_rd_en_final_sig <= '0';
746
                       ADC_unit_RESET_sig <= '1';
747
                   end if;
748
 
749
                   -----------------STOP SYSTEM handling ------------------------
750
                   if (PE_START = '0') then
751
                       state <= IDLE;
752
                       UC_rd_en_final_sig <= '0'; --ce gres tkole: READ -> IDLE -> RESET, potem je treba tega tuki ugasnt
753
                   end if;  
754
 
755
 
756
 
757
 
758
              when RESET =>
759
 
760
                  bin_idx <= bin_idx + 1; --to je naslov, v katerega se v oba bram-a vpisujejo nicle
761
 
762
                  if (bin_idx = bin_num - 1) then
763
                    bin_idx <= (others => '0');
764
                    state <= IDLE;
765
                    ADC_unit_RESET_sig <= '0';
766
                  end if;      
767
 
768
                  PE_wr_rd_en_sig <= '0';
769
                  count_update <= '0';
770
                  counter <= (others => '0');
771
                  buffer_full := '0';
772
 
773
 
774
 
775
           end case;
776
 
777
       end if;
778
 
779
    end process;  
780
 
781
 
782
end generate;
783
 
784
 
785
end Behavioral;