source: firmware/FAD/FACT_FAD_20MHz_VAR_PS/FACT_FAD_lib/hdl/led_controller_bahavior.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.led_controller.bahavior
3--
4-- Created:
5--          by - dneise.UNKNOWN (E5B-LABOR6)
6--          at - 11:04:17 04.01.2011
7--
8-- using Mentor Graphics HDL Designer(TM) 2009.2 (Build 10)
9--
10LIBRARY ieee;
11USE ieee.std_logic_1164.all;
12USE ieee.std_logic_arith.all;
13use ieee.STD_LOGIC_UNSIGNED.all;
14
15library FACT_FAD_lib;
16
17
18use FACT_FAD_lib.fad_definitions.all;
19
20
21ENTITY led_controller IS
22GENERIC( 
23  HEARTBEAT_PWM_DIVIDER : integer := 500;   
24  WAITING_DIVIDER : integer := 500000000 
25);
26PORT(
27    CLK : IN std_logic;
28   
29    -- LED outs -- inverted logic
30    green : OUT std_logic;
31    amber : OUT std_logic; 
32    red : OUT std_logic; 
33    additional_flasher_out : OUT std_logic;
34   
35   
36    -- status INs
37    trigger : IN std_logic; -- when trigger is received green should toggle
38   
39        refclk_too_high : in std_logic;
40        refclk_too_low : in std_logic;
41       
42    socks_waiting : IN std_logic;
43    socks_connected: IN std_logic
44   
45       
46    --heartbeat_en : IN std_logic
47  );
48END ENTITY led_controller;
49
50--
51ARCHITECTURE bahavior OF led_controller IS
52 
53  type states is ( INIT, WAITING, CONNECTED); 
54    signal state,next_state : states := INIT;
55 
56  -- noninverted logic
57  signal green_loc : std_logic := '1';  -- on in order to show power
58  signal amber_loc : std_logic := '0'; --default off
59  signal red_loc  : std_logic := '0'; --default off
60  signal flasher : std_logic;
61 
62  signal heartbeat_counter: integer range 0 to HEARTBEAT_PWM_DIVIDER - 1 := 0;
63  constant ontime_update : integer := 100;
64  signal ontime_update_counter : integer range 0 to ontime_update - 1 := 0;
65  signal on_time: integer range 0 to HEARTBEAT_PWM_DIVIDER - 1 := 0;
66  constant ontime_divider : integer range 0 to HEARTBEAT_PWM_DIVIDER - 1 := 1;
67  signal delta_ontime : integer range 0 to HEARTBEAT_PWM_DIVIDER - 1 := 1;
68  signal DIR : std_logic := '0';
69 
70BEGIN
71  -- since leds have inverted logic, the outs are inverted at this point.
72  green <= not green_loc;
73  amber <= not amber_loc;
74  red <= not red_loc;
75  additional_flasher_out <= flasher;
76 
77  -- MAIN FSM: go to next state if rising edge
78    FSM_Registers: process(CLK)
79    begin
80      if Rising_edge(CLK) then
81        state <= next_state;
82      end if;
83    end process;
84
85    -- MAIN FSM
86    FSM_logic: process(state, socks_connected, socks_waiting)
87    begin
88      next_state <= state;
89      case state is
90   
91
92      when INIT =>
93        amber_loc <= '0';
94      if (socks_waiting = '1') then
95        next_state <= WAITING;
96      else 
97        next_state <= INIT;
98      end if;
99
100      when WAITING =>
101        amber_loc <= flasher;
102        if (socks_connected = '1') then
103          next_state <= CONNECTED;
104        else
105          next_state <= WAITING;
106        end if;
107
108      when CONNECTED =>
109        amber_loc <= '1';
110        if (socks_connected = '0') then
111          next_state <= INIT;
112        else
113          next_state <= CONNECTED;
114        end if;
115      end case;
116    end process FSM_logic;
117
118
119  -- if trigger is received green_loc toggles
120  trigger_proc : process (trigger)
121    begin
122      if Rising_edge(trigger) then
123        green_loc <= not green_loc;
124      end if;
125    end process trigger_proc;
126   
127  -- heartbeat process:
128  -- as long as nothing else is to be done for the red led
129  -- it will show a ~2Hz heartbeat
130  -- can be switched off with heartbeat_en high
131  heartbeat : process (CLK)
132     
133     
134     
135     
136    begin
137      if rising_edge(CLK) then
138        if (heartbeat_counter < HEARTBEAT_PWM_DIVIDER - 1) then 
139          heartbeat_counter <= heartbeat_counter + 1;
140        else 
141          heartbeat_counter <= 0;
142        end if;
143       
144                -- calculate the change in on_time
145                -- if the change is too small... then change at least by 1.
146        if ( on_time / (2*ontime_divider) = 0) then
147                        delta_ontime <= 1;
148                else
149                        delta_ontime <= on_time / (2*ontime_divider);
150                end if;
151        if (heartbeat_counter = 0) then
152                if (ontime_update_counter < ontime_update - 1) then
153                        ontime_update_counter <= ontime_update_counter + 1;
154                else
155                        ontime_update_counter <= 0;
156                       
157                        -- set new on_time     
158                        if (DIR = '0') then -- increase on_time
159                                if (on_time + delta_ontime < HEARTBEAT_PWM_DIVIDER - 1) then 
160                                        on_time <= on_time + delta_ontime;
161                                else
162                                        on_time <= HEARTBEAT_PWM_DIVIDER - 1;
163                                        DIR <= '1';
164                                end if;
165                        else -- DIR is '1' -- count down
166                                if (on_time - delta_ontime > 0) then 
167                                        on_time <= on_time - delta_ontime;
168                                else 
169                                        on_time <= 0;
170                                        DIR <= '0';
171                                end if;
172                        end if;           
173                       
174                end if;
175        end if;
176       
177       
178       
179        if (heartbeat_counter = 0) then 
180          red_loc <= '1'; 
181        end if;
182        if (heartbeat_counter = on_time) then
183          red_loc <= '0';
184        end if;
185      end if;
186    end process heartbeat; 
187   
188   
189      -- sock_waiting_flasher process:
190      sock_waiting_flasher : process (CLK)
191          variable Y: integer range 0 to WAITING_DIVIDER - 1;
192        begin
193          if rising_edge(CLK) then
194            if (Y < WAITING_DIVIDER - 1) then 
195              Y := Y + 1;
196            else 
197              Y := 0;
198            end if;
199            if (Y = 0) then 
200              flasher <= '1';
201            end if;
202            if (Y = WAITING_DIVIDER / 2) then 
203              flasher <= '0';
204            end if;
205          end if;
206        end process sock_waiting_flasher; 
207   
208   
209END ARCHITECTURE bahavior;
210
Note: See TracBrowser for help on using the repository browser.