Subversion Repositories f9daq

Rev

Blame | Last modification | View Log | RSS feed

  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;
  786.