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

Last change on this file since 10225 was 10225, checked in by neise, 9 years ago
new data format implemented. setting of DAC during run is possible.
File size: 5.2 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 
60BEGIN
61  sclk_enable_override <= sclk_enable_override_sig;
62 
63  spi_distribute_proc: process (clk)
64  begin
65   
66   
67    if rising_edge(clk) then
68      data <= (others => 'Z');
69      case spi_distr_state is
70        when INIT =>
71          data <= (others => 'Z');
72          int_sensor_valid <= '0';
73          spi_distr_state <= READ_SENSOR;
74        when IDLE =>
75                        sclk_enable_override_sig <= '0';
76          if (int_sensor_valid = '1') then
77            sensor_array <= int_sensor_array;
78            sensor_valid <= '1';
79          end if;
80          data <= (others => 'Z');
81         -- start DAC configuration
82          if (config_start = '1' AND int_sensor_valid = '1') then
83            config_ready <= '0';
84                        sclk_enable_override_sig <= '1';
85            dac_config_start <= '1';
86            dac_id <= conv_std_logic_vector(dac_id_cnt, dac_id'length);
87            data <= conv_std_logic_vector(dac_array(dac_id_cnt),data'length);
88                        internal_dac_array <= dac_array;
89            spi_distr_state <= CONFIG_DAC;
90          -- start temperature sensor reading
91          elsif (dac_config_ready <= '1' AND int_sensor_read_start = '1') then
92            int_sensor_valid <= '0';
93            sensor_read_start <= '1';
94            sensor_id <= conv_std_logic_vector(sensor_id_cnt, sensor_id'length);
95            spi_distr_state <= READ_SENSOR;
96          end if;
97       
98        -- sensor reading   
99        when READ_SENSOR =>
100          sensor_read_start <= '1';
101          sensor_id <= conv_std_logic_vector(sensor_id_cnt, sensor_id'length);
102          if (sensor_read_valid = '1') then
103            int_sensor_array(sensor_id_cnt) <= conv_integer(data);
104            sensor_read_start <= '0';
105            if (sensor_id_cnt < 3) then
106              sensor_id_cnt <= sensor_id_cnt + 1;
107              sensor_read_start <= '1';
108              spi_distr_state <= READ_SENSOR;
109            else
110              sensor_id_cnt <= 0;
111              sensor_valid <= '0';
112              int_sensor_valid <= '1';
113              spi_distr_state <= IDLE;
114            end if;
115          end if;
116         
117        -- DAC configuration
118        when CONFIG_DAC =>
119          dac_config_start <= '1';
120          dac_id <= conv_std_logic_vector(dac_id_cnt, dac_id'length);
121          data <= conv_std_logic_vector(internal_dac_array(dac_id_cnt),data'length);
122          if (dac_config_ready = '1') then
123            dac_config_start <= '0';
124            if (dac_id_cnt < 7) then 
125              dac_id_cnt <= dac_id_cnt + 1;
126              dac_config_start <= '1';
127              spi_distr_state <= CONFIG_DAC;
128            else
129              dac_id_cnt <= 0;
130              config_ready <= '1';
131                          current_dac_array <= internal_dac_array;
132              spi_distr_state <= IDLE;
133            end if;
134          end if; 
135      end case; 
136    end if;
137   
138  end process spi_distribute_proc;
139
140  sensor_tmr_proc: process (clk)
141    variable Z: integer range 0 to (TEMP_MEASUREMENT_BEAT - 1);
142  begin
143    if rising_edge(clk) then
144      int_sensor_read_start <= '0';
145      if (Z < TEMP_MEASUREMENT_BEAT - 1) then 
146        Z := Z + 1;
147      else 
148        Z := 0;
149      end if;
150      if (Z = 0) then 
151        int_sensor_read_start <= '1';
152      end if;
153    end if;
154  end process sensor_tmr_proc;
155 
156 
157END ARCHITECTURE beha;
158
Note: See TracBrowser for help on using the repository browser.