Guest User

uart_interpreter

a guest
Sep 4th, 2020
28
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. LIBRARY ieee;
  2. use ieee.numeric_std.all;
  3. use IEEE.std_logic_1164.all;
  4.  
  5. library work;
  6. use work.type_package.all;
  7.  
  8. ENTITY uart_interpreter IS
  9.     generic (
  10.             max_experiment_repetition_counter_value     :   integer;
  11.             max_step_counter_value                      :   integer;
  12.             max_initialization_repetition_counter_value :   integer;
  13.             max_photon_counter_value                    :   integer;
  14.            
  15.             max_photon_counter_window_pulse_value       :   integer
  16.         );
  17.     PORT(  
  18.             rst                                         :   in  std_logic;
  19.             clk                                         :   in  std_logic;
  20.            
  21.             ready                                       :   in  std_logic;
  22.            
  23.             byte0                                       :   in std_logic_vector(7 downto 0);
  24.             byte1                                       :   in std_logic_vector(7 downto 0);
  25.             byte2                                       :   in std_logic_vector(7 downto 0);
  26.             byte3                                       :   in std_logic_vector(7 downto 0);
  27.             byte4                                       :   in std_logic_vector(7 downto 0);
  28.             byte5                                       :   in std_logic_vector(7 downto 0);
  29.            
  30.             experiment_repetition_counter_threshold     :   out integer range 0 to max_experiment_repetition_counter_value;
  31.            
  32.             initialization_repetition_counter_threshold :   out integer range 0 to max_initialization_repetition_counter_value;
  33.            
  34.             step_counter_threshold_initialization       :   out integer range 0 to max_step_counter_value;
  35.             step_counter_threshold_measurement          :   out integer range 0 to max_step_counter_value;
  36.            
  37.             photon_counter_threshold_initialization     :   out integer range 0 to max_photon_counter_value;
  38.             photon_counter_threshold_measurement        :   out integer range 0 to max_photon_counter_value;
  39.            
  40.             photon_counter_window_offset_initialization :   out integer range 0 to max_photon_counter_window_pulse_value;
  41.             photon_counter_window_length_initialization :   out integer range 0 to max_photon_counter_window_pulse_value;
  42.             photon_counter_window_offset_measurement    :   out integer range 0 to max_photon_counter_window_pulse_value;
  43.             photon_counter_window_length_measurement    :   out integer range 0 to max_photon_counter_window_pulse_value;
  44.            
  45.             laser_1_offset1_initialization              :   out integer range 0 to max_step_counter_value;
  46.             laser_1_length1_initialization              :   out integer range 0 to max_step_counter_value;
  47.             laser_1_offset2_initialization              :   out integer range 0 to max_step_counter_value;
  48.             laser_1_length2_initialization              :   out integer range 0 to max_step_counter_value;
  49.             laser_1_offset1_measurement                 :   out integer range 0 to max_step_counter_value;
  50.             laser_1_length1_measurement                 :   out integer range 0 to max_step_counter_value;
  51.             laser_1_offset2_measurement                 :   out integer range 0 to max_step_counter_value;
  52.             laser_1_length2_measurement                 :   out integer range 0 to max_step_counter_value;
  53.            
  54.             laser_2_offset1_initialization              :   out integer range 0 to max_step_counter_value;
  55.             laser_2_length1_initialization              :   out integer range 0 to max_step_counter_value;
  56.             laser_2_offset2_initialization              :   out integer range 0 to max_step_counter_value;
  57.             laser_2_length2_initialization              :   out integer range 0 to max_step_counter_value;
  58.             laser_2_offset1_measurement                 :   out integer range 0 to max_step_counter_value;
  59.             laser_2_length1_measurement                 :   out integer range 0 to max_step_counter_value;
  60.             laser_2_offset2_measurement                 :   out integer range 0 to max_step_counter_value;
  61.             laser_2_length2_measurement                 :   out integer range 0 to max_step_counter_value;
  62.            
  63.             laser_3_offset1_initialization              :   out integer range 0 to max_step_counter_value;
  64.             laser_3_length1_initialization              :   out integer range 0 to max_step_counter_value;
  65.             laser_3_offset2_initialization              :   out integer range 0 to max_step_counter_value;
  66.             laser_3_length2_initialization              :   out integer range 0 to max_step_counter_value;
  67.             laser_3_offset1_measurement                 :   out integer range 0 to max_step_counter_value;
  68.             laser_3_length1_measurement                 :   out integer range 0 to max_step_counter_value;
  69.             laser_3_offset2_measurement                 :   out integer range 0 to max_step_counter_value;
  70.             laser_3_length2_measurement                 :   out integer range 0 to max_step_counter_value;
  71.            
  72.             laser_4_offset1_initialization              :   out integer range 0 to max_step_counter_value;
  73.             laser_4_length1_initialization              :   out integer range 0 to max_step_counter_value;
  74.             laser_4_offset2_initialization              :   out integer range 0 to max_step_counter_value;
  75.             laser_4_length2_initialization              :   out integer range 0 to max_step_counter_value;
  76.             laser_4_offset1_measurement                 :   out integer range 0 to max_step_counter_value;
  77.             laser_4_length1_measurement                 :   out integer range 0 to max_step_counter_value;
  78.             laser_4_offset2_measurement                 :   out integer range 0 to max_step_counter_value;
  79.             laser_4_length2_measurement                 :   out integer range 0 to max_step_counter_value;
  80.            
  81.             htm_dac_1_offset1_initialization            :   out integer range 0 to max_step_counter_value;
  82.             htm_dac_1_length1_initialization            :   out integer range 0 to max_step_counter_value;
  83.             htm_dac_1_offset2_initialization            :   out integer range 0 to max_step_counter_value;
  84.             htm_dac_1_length2_initialization            :   out integer range 0 to max_step_counter_value;
  85.             htm_dac_1_offset1_measurement               :   out integer range 0 to max_step_counter_value;
  86.             htm_dac_1_length1_measurement               :   out integer range 0 to max_step_counter_value;
  87.             htm_dac_1_offset2_measurement               :   out integer range 0 to max_step_counter_value;
  88.             htm_dac_1_length2_measurement               :   out integer range 0 to max_step_counter_value;
  89.            
  90.             htm_dac_2_offset1_initialization            :   out integer range 0 to max_step_counter_value;
  91.             htm_dac_2_length1_initialization            :   out integer range 0 to max_step_counter_value;
  92.             htm_dac_2_offset2_initialization            :   out integer range 0 to max_step_counter_value;
  93.             htm_dac_2_length2_initialization            :   out integer range 0 to max_step_counter_value;
  94.             htm_dac_2_offset1_measurement               :   out integer range 0 to max_step_counter_value;
  95.             htm_dac_2_length1_measurement               :   out integer range 0 to max_step_counter_value;
  96.             htm_dac_2_offset2_measurement               :   out integer range 0 to max_step_counter_value;
  97.             htm_dac_2_length2_measurement               :   out integer range 0 to max_step_counter_value;
  98.            
  99.             ni_gate_offset1_initialization              :   out integer range 0 to max_step_counter_value;
  100.             ni_gate_length1_initialization              :   out integer range 0 to max_step_counter_value;
  101.             ni_gate_offset2_initialization              :   out integer range 0 to max_step_counter_value;
  102.             ni_gate_length2_initialization              :   out integer range 0 to max_step_counter_value;
  103.             ni_gate_offset1_measurement                 :   out integer range 0 to max_step_counter_value;
  104.             ni_gate_length1_measurement                 :   out integer range 0 to max_step_counter_value;
  105.             ni_gate_offset2_measurement                 :   out integer range 0 to max_step_counter_value;
  106.             ni_gate_length2_measurement                 :   out integer range 0 to max_step_counter_value;
  107.            
  108.             start                                       :   out std_logic;
  109.             measurement_mode                            :   out t_measurement
  110.         );
  111. END ENTITY uart_interpreter;
  112.  
  113. ARCHITECTURE behavioural OF uart_interpreter IS
  114.     type t_integer_array_step_counter is array (integer range <>, integer range <>) of integer range 0 to max_step_counter_value;
  115.    
  116.     signal demux_uart_pulser : t_integer_array_step_counter(0 to 6, 0 to 7);
  117.    
  118.     signal start_experiment : std_logic;
  119.        
  120.  
  121.            
  122. begin
  123.     laser_1_offset1_initialization <= demux_uart_pulser(0,0);
  124.     laser_1_length1_initialization <= demux_uart_pulser(0,1);
  125.     laser_1_offset2_initialization <= demux_uart_pulser(0,2);
  126.     laser_1_length2_initialization <= demux_uart_pulser(0,3);
  127.     laser_1_offset1_measurement <= demux_uart_pulser(0,4);
  128.     laser_1_length1_measurement <= demux_uart_pulser(0,5);
  129.     laser_1_offset2_measurement <= demux_uart_pulser(0,6);
  130.     laser_1_length2_measurement <= demux_uart_pulser(0,7);
  131.    
  132.     laser_2_offset1_initialization <= demux_uart_pulser(1,0);
  133.     laser_2_length1_initialization <= demux_uart_pulser(1,1);
  134.     laser_2_offset2_initialization <= demux_uart_pulser(1,2);
  135.     laser_2_length2_initialization <= demux_uart_pulser(1,3);
  136.     laser_2_offset1_measurement <= demux_uart_pulser(1,4);
  137.     laser_2_length1_measurement <= demux_uart_pulser(1,5);
  138.     laser_2_offset2_measurement <= demux_uart_pulser(1,6);
  139.     laser_2_length2_measurement <= demux_uart_pulser(1,7);
  140.    
  141.     laser_3_offset1_initialization <= demux_uart_pulser(2,0);
  142.     laser_3_length1_initialization <= demux_uart_pulser(2,1);
  143.     laser_3_offset2_initialization <= demux_uart_pulser(2,2);
  144.     laser_3_length2_initialization <= demux_uart_pulser(2,3);
  145.     laser_3_offset1_measurement <= demux_uart_pulser(2,4);
  146.     laser_3_length1_measurement <= demux_uart_pulser(2,5);
  147.     laser_3_offset2_measurement <= demux_uart_pulser(2,6);
  148.     laser_3_length2_measurement <= demux_uart_pulser(2,7);
  149.    
  150.     laser_4_offset1_initialization <= demux_uart_pulser(3,0);
  151.     laser_4_length1_initialization <= demux_uart_pulser(3,1);
  152.     laser_4_offset2_initialization <= demux_uart_pulser(3,2);
  153.     laser_4_length2_initialization <= demux_uart_pulser(3,3);
  154.     laser_4_offset1_measurement <= demux_uart_pulser(3,4);
  155.     laser_4_length1_measurement <= demux_uart_pulser(3,5);
  156.     laser_4_offset2_measurement <= demux_uart_pulser(3,6);
  157.     laser_4_length2_measurement <= demux_uart_pulser(3,7);
  158.    
  159.     htm_dac_1_offset1_initialization <= demux_uart_pulser(4,0);
  160.     htm_dac_1_length1_initialization <= demux_uart_pulser(4,1);
  161.     htm_dac_1_offset2_initialization <= demux_uart_pulser(4,2);
  162.     htm_dac_1_length2_initialization <= demux_uart_pulser(4,3);
  163.     htm_dac_1_offset1_measurement <= demux_uart_pulser(4,4);
  164.     htm_dac_1_length1_measurement <= demux_uart_pulser(4,5);
  165.     htm_dac_1_offset2_measurement <= demux_uart_pulser(4,6);
  166.     htm_dac_1_length2_measurement <= demux_uart_pulser(4,7);
  167.    
  168.     htm_dac_2_offset1_initialization <= demux_uart_pulser(5,0);
  169.     htm_dac_2_length1_initialization <= demux_uart_pulser(5,1);
  170.     htm_dac_2_offset2_initialization <= demux_uart_pulser(5,2);
  171.     htm_dac_2_length2_initialization <= demux_uart_pulser(5,3);
  172.     htm_dac_2_offset1_measurement <= demux_uart_pulser(5,4);
  173.     htm_dac_2_length1_measurement <= demux_uart_pulser(5,5);
  174.     htm_dac_2_offset2_measurement <= demux_uart_pulser(5,6);
  175.     htm_dac_2_length2_measurement <= demux_uart_pulser(5,7);
  176.    
  177.     ni_gate_offset1_initialization <= demux_uart_pulser(6,0);
  178.     ni_gate_length1_initialization <= demux_uart_pulser(6,1);
  179.     ni_gate_offset2_initialization <= demux_uart_pulser(6,2);
  180.     ni_gate_length2_initialization <= demux_uart_pulser(6,3);
  181.     ni_gate_offset1_measurement <= demux_uart_pulser(6,4);
  182.     ni_gate_length1_measurement <= demux_uart_pulser(6,5);
  183.     ni_gate_offset2_measurement <= demux_uart_pulser(6,6);
  184.     ni_gate_length2_measurement <= demux_uart_pulser(6,7);
  185.    
  186.     process (rst, clk) is
  187.     begin
  188.         if rst = '1' then
  189.             experiment_repetition_counter_threshold <= 0;
  190.            
  191.             initialization_repetition_counter_threshold <= 0;
  192.            
  193.             step_counter_threshold_initialization <= 0;
  194.             step_counter_threshold_measurement <= 0;
  195.            
  196.             photon_counter_threshold_initialization <= 0;
  197.             photon_counter_threshold_measurement <= 0;
  198.            
  199.             photon_counter_window_offset_initialization <= 0;
  200.             photon_counter_window_length_initialization <= 0;
  201.             photon_counter_window_offset_measurement <= 0;
  202.             photon_counter_window_length_measurement <= 0;
  203.            
  204.             start_experiment <= '0';
  205.             measurement_mode <= measurement1;
  206.            
  207.             demux_uart_pulser <= (others => (others => 0));
  208.            
  209.         elsif rising_edge(clk) then
  210.             if ready = '1' then
  211.                 case to_integer(unsigned(byte0)) is
  212.                     when 0 =>
  213.                         case to_integer(unsigned(byte1)) is
  214.                             when 0 =>
  215.                                 experiment_repetition_counter_threshold <= to_integer(unsigned(byte5 & byte4 & byte3));
  216.                                
  217.                             when 1 =>
  218.                                 initialization_repetition_counter_threshold <= to_integer(unsigned(byte5 & byte4 & byte3));
  219.                                
  220.                             when 2 =>
  221.                                 step_counter_threshold_initialization <= to_integer(unsigned(byte5 & byte4 & byte3));
  222.                                
  223.                             when 3 =>
  224.                                 step_counter_threshold_measurement <= to_integer(unsigned(byte5 & byte4 & byte3));
  225.                            
  226.                             when 4 =>
  227.                                 photon_counter_threshold_initialization <= to_integer(unsigned(byte5 & byte4 & byte3));
  228.                            
  229.                             when 5 =>
  230.                                 photon_counter_threshold_measurement <= to_integer(unsigned(byte5 & byte4 & byte3));
  231.                            
  232.                             when 6 =>
  233.                                 photon_counter_window_offset_initialization <= to_integer(unsigned(byte5 & byte4 & byte3));
  234.                            
  235.                             when 7 =>
  236.                                 photon_counter_window_length_initialization <= to_integer(unsigned(byte5 & byte4 & byte3));
  237.                                
  238.                             when 8 =>
  239.                                 photon_counter_window_offset_measurement <= to_integer(unsigned(byte5 & byte4 & byte3));
  240.                                
  241.                             when 9 =>
  242.                                 photon_counter_window_length_measurement <= to_integer(unsigned(byte5 & byte4 & byte3));
  243.                            
  244.                             when 10 =>
  245.                                 if byte3 = "00000000" then
  246.                                     measurement_mode <= measurement1;
  247.                                 else
  248.                                     measurement_mode <= measurement2;
  249.                                 end if;
  250.                                
  251.                             when others =>
  252.                                 null;
  253.                         end case;
  254.                                
  255.                                
  256.                     when 1 =>
  257.                         demux_uart_pulser(to_integer(unsigned(byte1)), to_integer(unsigned(byte2))) <= to_integer(unsigned(byte5 & byte4 & byte3));
  258.                     when 2 =>
  259.                         if byte3 /= "00000000" then
  260.                                     start_experiment <= '1';
  261.                         end if;
  262.                     when 3 =>
  263.                         experiment_repetition_counter_threshold <= 0;
  264.            
  265.                         initialization_repetition_counter_threshold <= 0;
  266.                        
  267.                         step_counter_threshold_initialization <= 0;
  268.                         step_counter_threshold_measurement <= 0;
  269.                        
  270.                         photon_counter_threshold_initialization <= 0;
  271.                         photon_counter_threshold_measurement <= 0;
  272.                        
  273.                         photon_counter_window_offset_initialization <= 0;
  274.                         photon_counter_window_length_initialization <= 0;
  275.                         photon_counter_window_offset_measurement <= 0;
  276.                         photon_counter_window_length_measurement <= 0;
  277.                        
  278.                         start_experiment <= '0';
  279.                         measurement_mode <= measurement1;
  280.                        
  281.                         demux_uart_pulser <= (others => (others => 0));
  282.                    
  283.                     when others =>
  284.                         null;
  285.                 end case;
  286.                
  287.             end if;
  288.            
  289.             if start_experiment = '1' then
  290.                 start_experiment <= '0';
  291.             end if;
  292.            
  293.         end if;
  294.     end process;
  295.    
  296.     start <= start_experiment;
  297. end architecture behavioural;
RAW Paste Data