Subversion Repositories f9daq

Rev

Blame | Last modification | View Log | RSS feed

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