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

Last change on this file since 9912 was 9912, checked in by neise, 10 years ago
most recent version quasi initial commit
File size: 4.8 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, config_started      : OUT   std_logic := '0'; 
31    sensor_valid      : OUT             std_logic := '0';
32    dac_array         : IN                      dac_array_type;
33    sensor_array      : OUT             sensor_array_type; 
34    dac_config_start  : OUT   std_logic := '0';
35    dac_config_ready  : IN    std_logic;
36    sensor_read_start : OUT   std_logic := '0';
37    sensor_read_valid : IN    std_logic;
38    dac_id            : OUT   std_logic_vector(2 downto 0) := (others => '0');
39    sensor_id         : OUT   std_logic_vector(1 downto 0) := (others => '0');
40    data              : INOUT std_logic_vector(15 downto 0) := (others => 'Z')
41  );
42END ENTITY spi_distributor;
43
44ARCHITECTURE beha OF spi_distributor IS
45
46  type TYPE_SPI_DISTRIBUTION_STATE is (INIT, IDLE, READ_SENSOR, CONFIG_DAC);
47   
48  signal spi_distr_state       : TYPE_SPI_DISTRIBUTION_STATE := INIT;
49  signal int_sensor_read_start : std_logic := '0';
50  signal int_sensor_valid      : std_logic := '0';
51  signal int_sensor_array      : sensor_array_type;
52  signal sensor_id_cnt         : integer range 0 to 4 := 0;
53  signal dac_id_cnt            : integer range 0 to 7 := 0;
54 
55 
56BEGIN
57 
58  spi_distribute_proc: process (clk)
59  begin
60   
61    if rising_edge(clk) then
62      data <= (others => 'Z');
63      case spi_distr_state is
64        when INIT =>
65          data <= (others => 'Z');
66          int_sensor_valid <= '0';
67          spi_distr_state <= READ_SENSOR;
68        when IDLE =>
69          if (int_sensor_valid = '1') then
70            sensor_array <= int_sensor_array;
71            sensor_valid <= '1';
72          end if;
73          data <= (others => 'Z');
74         -- start DAC configuration
75          if (config_start = '1' AND int_sensor_valid = '1') then
76            config_started <= '1';
77            config_ready <= '0';
78            dac_config_start <= '1';
79            dac_id <= conv_std_logic_vector(dac_id_cnt, dac_id'length);
80            data <= conv_std_logic_vector(dac_array(dac_id_cnt),data'length);
81            spi_distr_state <= CONFIG_DAC;
82          -- start temperature sensor reading
83          elsif (dac_config_ready <= '1' AND int_sensor_read_start = '1') then
84            int_sensor_valid <= '0';
85            sensor_read_start <= '1';
86            sensor_id <= conv_std_logic_vector(sensor_id_cnt, sensor_id'length);
87            spi_distr_state <= READ_SENSOR;
88          end if;
89       
90        -- sensor reading   
91        when READ_SENSOR =>
92          sensor_read_start <= '1';
93          sensor_id <= conv_std_logic_vector(sensor_id_cnt, sensor_id'length);
94          if (sensor_read_valid = '1') then
95            int_sensor_array(sensor_id_cnt) <= conv_integer(data);
96            sensor_read_start <= '0';
97            if (sensor_id_cnt < 3) then
98              sensor_id_cnt <= sensor_id_cnt + 1;
99              sensor_read_start <= '1';
100              spi_distr_state <= READ_SENSOR;
101            else
102              sensor_id_cnt <= 0;
103              sensor_valid <= '0';
104              int_sensor_valid <= '1';
105              spi_distr_state <= IDLE;
106            end if;
107          end if;
108         
109        -- DAC configuration
110        when CONFIG_DAC =>
111          dac_config_start <= '1';
112          dac_id <= conv_std_logic_vector(dac_id_cnt, dac_id'length);
113          data <= conv_std_logic_vector(dac_array(dac_id_cnt),data'length);
114          if (dac_config_ready = '1') then
115            dac_config_start <= '0';
116            if (dac_id_cnt < 7) then 
117              dac_id_cnt <= dac_id_cnt + 1;
118              dac_config_start <= '1';
119              spi_distr_state <= CONFIG_DAC;
120            else
121              dac_id_cnt <= 0;
122              config_started <= '0';
123              config_ready <= '1';
124              spi_distr_state <= IDLE;
125            end if;
126          end if; 
127      end case; 
128    end if;
129   
130  end process spi_distribute_proc;
131
132  sensor_tmr_proc: process (clk)
133    variable Z: integer range 0 to (TEMP_MEASUREMENT_BEAT - 1);
134  begin
135    if rising_edge(clk) then
136      int_sensor_read_start <= '0';
137      if (Z < TEMP_MEASUREMENT_BEAT - 1) then 
138        Z := Z + 1;
139      else 
140        Z := 0;
141      end if;
142      if (Z = 0) then 
143        int_sensor_read_start <= '1';
144      end if;
145    end if;
146  end process sensor_tmr_proc;
147 
148 
149END ARCHITECTURE beha;
150
Note: See TracBrowser for help on using the repository browser.