source: firmware/FAD/FACT_FAD_20MHz_VAR_PS/FACT_FAD_lib/hdl/spi_distributor_beha.vhd @ 10738

Last change on this file since 10738 was 10738, checked in by neise, 8 years ago
File size: 5.3 KB
Line 
1--
2-- VHDL Architecture FACT_FAD_lib.spi_distributor.beha
3--
4-- Created:
5--          by - Benjamin Krumm.UNKNOWN (EEPC8)
6--          at - 09:24:21 23.04.2010
7--
8-- using Mentor Graphics HDL Designer(TM) 2009.1 (Build 12)
9--
10LIBRARY ieee;
11USE ieee.std_logic_1164.all;
12USE ieee.std_logic_arith.all;
13USE ieee.std_logic_unsigned.all;
14LIBRARY FACT_FAD_lib;
15USE FACT_FAD_lib.fad_definitions.all;
16
17ENTITY spi_distributor IS
18
19-- TEMP_MEASUREMENT_BEAT * clk ist the measurement period of the
20-- Temperature measurement
21-- e.g. 5*10**6 means every second
22
23  GENERIC(
24    TEMP_MEASUREMENT_BEAT : integer := 5*10**6
25    );
26
27  PORT(
28    clk                                         : IN                    std_logic; -- 50MHz
29    config_start                        : IN                    std_logic;
30    config_ready                        : OUT                   std_logic := '1'; 
31    sensor_valid                        : OUT                   std_logic := '0';
32    dac_array                           : IN                    dac_array_type;
33        current_dac_array               : OUT                   dac_array_type := ( others => 0);
34    sensor_array                        : OUT                   sensor_array_type; 
35    dac_config_start            : OUT                   std_logic := '0';
36    dac_config_ready            : IN                    std_logic;
37    sclk_enable_override        : OUT                   std_logic := '0';
38    sensor_read_start           : OUT                   std_logic := '0';
39    sensor_read_valid           : IN                    std_logic;
40    dac_id                                      : OUT                   std_logic_vector(2 downto 0) := (others => '0');
41    sensor_id                           : OUT                   std_logic_vector(1 downto 0) := (others => '0');
42    data                                        : INOUT                 std_logic_vector(15 downto 0) := (others => 'Z')
43  );
44END ENTITY spi_distributor;
45
46ARCHITECTURE beha OF spi_distributor IS
47
48  type TYPE_SPI_DISTRIBUTION_STATE is (INIT, IDLE, READ_SENSOR, CONFIG_DAC);
49   
50  signal spi_distr_state       : TYPE_SPI_DISTRIBUTION_STATE := INIT;
51  signal int_sensor_read_start : std_logic := '0';
52  signal int_sensor_valid      : std_logic := '0';
53  signal int_sensor_array      : sensor_array_type;
54  signal sensor_id_cnt         : integer range 0 to 4 := 0;
55  signal dac_id_cnt            : integer range 0 to 7 := 0;
56 
57  signal internal_dac_array : dac_array_type;
58  signal sclk_enable_override_sig : std_logic := '0';
59 
60  -- synching signals
61  signal config_start_sr                : std_logic_vector (1 downto 0) := "00";
62 
63BEGIN
64  sclk_enable_override <= sclk_enable_override_sig;
65 
66  spi_distribute_proc: process (clk)
67  begin
68   
69   
70    if rising_edge(clk) then
71                -- synch in
72                config_start_sr <= config_start_sr(0) & config_start;
73               
74      data <= (others => 'Z');
75      case spi_distr_state is
76        when INIT =>
77          data <= (others => 'Z');
78          int_sensor_valid <= '0';
79          spi_distr_state <= READ_SENSOR;
80        when IDLE =>
81                        sclk_enable_override_sig <= '0';
82          if (int_sensor_valid = '1') then
83            sensor_array <= int_sensor_array;
84            sensor_valid <= '1';
85          end if;
86          data <= (others => 'Z');
87         -- start DAC configuration
88          if (config_start_sr(1) = '1' AND int_sensor_valid = '1') then
89            config_ready <= '0';
90                        sclk_enable_override_sig <= '1';
91            dac_config_start <= '1';
92            dac_id <= conv_std_logic_vector(dac_id_cnt, dac_id'length);
93            data <= conv_std_logic_vector(dac_array(dac_id_cnt),data'length);
94                        internal_dac_array <= dac_array;
95            spi_distr_state <= CONFIG_DAC;
96          -- start temperature sensor reading
97          elsif (dac_config_ready <= '1' AND int_sensor_read_start = '1') then
98            int_sensor_valid <= '0';
99            sensor_read_start <= '1';
100            sensor_id <= conv_std_logic_vector(sensor_id_cnt, sensor_id'length);
101            spi_distr_state <= READ_SENSOR;
102          end if;
103       
104        -- sensor reading   
105        when READ_SENSOR =>
106          sensor_read_start <= '1';
107          sensor_id <= conv_std_logic_vector(sensor_id_cnt, sensor_id'length);
108          if (sensor_read_valid = '1') then
109            int_sensor_array(sensor_id_cnt) <= conv_integer(data);
110            sensor_read_start <= '0';
111            if (sensor_id_cnt < 3) then
112              sensor_id_cnt <= sensor_id_cnt + 1;
113              sensor_read_start <= '1';
114              spi_distr_state <= READ_SENSOR;
115            else
116              sensor_id_cnt <= 0;
117              sensor_valid <= '0';
118              int_sensor_valid <= '1';
119              spi_distr_state <= IDLE;
120            end if;
121          end if;
122         
123        -- DAC configuration
124        when CONFIG_DAC =>
125          dac_config_start <= '1';
126          dac_id <= conv_std_logic_vector(dac_id_cnt, dac_id'length);
127          data <= conv_std_logic_vector(internal_dac_array(dac_id_cnt),data'length);
128          if (dac_config_ready = '1') then
129            dac_config_start <= '0';
130            if (dac_id_cnt < 7) then 
131              dac_id_cnt <= dac_id_cnt + 1;
132              dac_config_start <= '1';
133              spi_distr_state <= CONFIG_DAC;
134            else
135              dac_id_cnt <= 0;
136              config_ready <= '1';
137                          current_dac_array <= internal_dac_array;
138              spi_distr_state <= IDLE;
139            end if;
140          end if; 
141      end case; 
142    end if;
143   
144  end process spi_distribute_proc;
145
146  sensor_tmr_proc: process (clk)
147    variable Z: integer range 0 to (TEMP_MEASUREMENT_BEAT - 1);
148  begin
149    if rising_edge(clk) then
150      int_sensor_read_start <= '0';
151      if (Z < TEMP_MEASUREMENT_BEAT - 1) then 
152        Z := Z + 1;
153      else 
154        Z := 0;
155      end if;
156      if (Z = 0) then 
157        int_sensor_read_start <= '1';
158      end if;
159    end if;
160  end process sensor_tmr_proc;
161 
162 
163END ARCHITECTURE beha;
164
Note: See TracBrowser for help on using the repository browser.