Elevator logic, pins never gets setup

Discussion in 'VHDL' started by Scorpiion, Nov 30, 2009.

  1. Scorpiion

    Scorpiion

    Joined:
    Dec 21, 2008
    Messages:
    6
    Hi, I'm doing some elevator logic for a school assignment. It is pretty basic with 4 floors and a button on each floor and some leds and a motor for the elevator to run (we have an elevator model here at school that we try our chips in).

    So, I have done my elevator logic but my problem is that it looks good to me on papper but when I synthesize it in Warp6.0 the input never gets to any pins... I guess I don't assign them right somehow but I could really need some other persons prospective since I have tried to figure this out for a long time now...

    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    use ieee.numeric_std.all;
    
    entity elevator is 
    	port(
    	clock					: in	std_logic;
    	floor_switch	:	in	std_logic_vector(0 to 3);
    	floor_sensor	:	in	std_logic_vector(0 to 3);
    --	light_inside	: out	std_logic_vector(0 to 3);
    --	light_outside	: out	std_logic_vector(0 to 3);
    	motor_power		: out	std_logic_vector(0 to 1)
    	);
    end entity elevator;
    
    architecture elevator_arch of elevator is
    
    type state is (floor_1, floor_2, floor_3, floor_4);
    signal this_floor	:state := floor_1;
    signal next_floor :state := floor_1;
    
    begin
    
    elevator_switch: process(clock, floor_switch, this_floor, next_floor)
    begin
    case this_floor is
    	when floor_1 => case floor_switch is
    				when "1011" => next_floor <= floor_2;
    				when "1101" => next_floor <= floor_3;
    				when "1110" => next_floor <= floor_4;
    				when others => next_floor <= floor_1;
    			end case ;
    	when floor_2 => case floor_switch is
    				when "0111" => next_floor <= floor_1;
    				when "1101" => next_floor <= floor_3;
    				when "1110" => next_floor <= floor_4;
    				when others => next_floor <= floor_2;
    			end case;	
    	when floor_3 => case floor_switch is
    				when "0111" => next_floor <= floor_1;
    				when "1011" => next_floor <= floor_2;
    				when "1110" => next_floor <= floor_4;
    				when others => next_floor <= floor_3;
    				end case;
    	when floor_4 => case floor_switch is
    				when "0111" => next_floor <= floor_1;
    				when "1011" => next_floor <= floor_2;
    				when "1101" => next_floor <= floor_3;
    				when others => next_floor <= floor_4;
    				end case;
    end case;
    end process elevator_switch;
    
    elevator_action: process(next_floor, this_floor)
    
    variable floor_sensor_var :std_logic_vector(0 to 3) := floor_sensor;
    
    begin
    case next_floor is
    	when floor_1 => case this_floor is
    				when floor_1 =>
    					motor_power <= "00";
    				when others =>
    					while (floor_sensor_var AND 1000) loop
    						motor_power <= "10";
    					end loop;
    					motor_power <= "00";
    			end case;
    	when floor_2 => case this_floor is
    				when floor_2 =>
    					motor_power <= "00";
    				when floor_1 =>
    					while (floor_sensor_var AND 0100) loop
    						motor_power <= "01";
    					end loop;
    					motor_power <= "00";
    				when floor_3 =>
    					while (floor_sensor_var AND 0100) loop
    						motor_power <= "10";
    					end loop;
    					motor_power <= "00";
    				when floor_4 =>
    					while (floor_sensor_var AND 0100) loop
    						motor_power <= "10";
    					end loop;
    					motor_power <= "00";
    				end case;
    	when floor_3 => case this_floor is
    				when floor_3 =>
    					motor_power <= "00";
    				when floor_1 =>
    					while (floor_sensor_var AND 0010) loop
    						motor_power <= "01";
    					end loop;
    					motor_power <= "00";
    				when floor_2 =>
    					while (floor_sensor_var AND 0010) loop
    						motor_power <= "01";
    					end loop;
    					motor_power <= "00";
    				when floor_4 =>
    					while (floor_sensor_var AND 0010) loop
    						motor_power <= "10";
    					end loop;
    					motor_power <= "00";
    				end case;
    	when floor_4 => case this_floor is
    				when floor_4 =>
    					motor_power <= "00";
    				when others =>
    					while (floor_sensor_var AND 0001) loop
    						motor_power <= "01";
    					end loop;
    					motor_power <= "00";
    				end case;
    end case;
    end process elevator_action;
    
    -- elevator_light: process(clock)
    
    check_floor: process(floor_sensor)
    begin
    	case floor_sensor is
    		when "0111" => this_floor <= floor_1;
    		when "1011" => this_floor <= floor_2;
    		when "1101" => this_floor <= floor_3;
    		when "1110" => this_floor <= floor_4;
    		when others => this_floor <= floor_1;
    	end case;
    end process check_floor;
    
    end architecture elevator_arch;
    
    When I have compiled the pinout looks like this in the report file:
    Code:
    
    PINOUT INFORMATION    (00:04:35)
    
    Messages:
      Information: All signals pre-placed in user design.
    
    
                                     C22V10
                     __________________________________________
           not used *| 1|                                  |24|* not used       
           not used *| 2|                                  |23|* not used       
           not used *| 3|                                  |22|* not used       
           not used *| 4|                                  |21|* not used       
           not used *| 5|                                  |20|* not used       
           not used *| 6|                                  |19|= motor_power(1) 
           not used *| 7|                                  |18|= motor_power(0) 
           not used *| 8|                                  |17|* not used       
           not used *| 9|                                  |16|* not used       
           not used *|10|                                  |15|* not used       
           not used *|11|                                  |14|* not used       
           not used *|12|                                  |13|* not used       
                     __________________________________________
    
    It feel that I have missed some basic assignment somewhere or something like that but I just can't see it... :/
    Scorpiion, Nov 30, 2009
    #1
    1. Advertising

  2. Scorpiion

    jeppe

    Joined:
    Mar 10, 2008
    Messages:
    348
    Location:
    Denmark
    Just a hint!

    The while loops inside your process will surely be hard to synthesize.
    jeppe, Dec 1, 2009
    #2
    1. Advertising

  3. Scorpiion

    Scorpiion

    Joined:
    Dec 21, 2008
    Messages:
    6
    Well, tell my why? :S Is the problem that I never drive the clock? It feels I should drive the clock somewhere maybe? Or should I redo everything?
    Scorpiion, Dec 1, 2009
    #3
  4. Scorpiion

    eliascm

    Joined:
    Jan 30, 2009
    Messages:
    42
    Elevator Logic

    In the process "elevator_action", the variable "floor_sensor_var" is declared and given an initial assignment, but thereafter is never assigned a value. Instead of using a variable there you could use the signal "floor_sensor" itself. Not using the clock input will not necessarily keep your design from properly compiling, but it is considered good practice to use synchronous logic for most designs.

    You do not have to redo everything to make your processes synchronous. The basic case statements will remain the same, but will nested within an "if rising_edge(clock) statement (if you prefer an single-process state machine structure).

    Charles
    eliascm, Dec 1, 2009
    #4
  5. Scorpiion

    Scorpiion

    Joined:
    Dec 21, 2008
    Messages:
    6
    Okey, that sounds promising! But the reason I used a variable was because I could not use the std_logic_vector to compare it with some value... I have tried to cast it with unsigned() and to cast the other number with std_logic_vector() but I can't get it to work.. Only get errors.. I want to either compare them with "floor_sensor /= floor_1" or "floor_sensor AND 1000", both give the same result but I can't get any of them to work.. I get
    Code:
    lab2.vhd (line 62, col 59):  (E101) Can't handle function call 'cmp_vv_us_bl' here
    Or:
    Code:
    lab2.vhd (line 62, col 60):  (E101) Can't handle function call '"and"' here
    Or:
    Code:
    lab2.vhd (line 72, col 32):  (E89) 'floor_sensor(0)' must be a CONSTANT or VARIABLE
    My teacher can't help me either.. :/ Hm..
    Scorpiion, Dec 1, 2009
    #5
  6. Scorpiion

    jeppe

    Joined:
    Mar 10, 2008
    Messages:
    348
    Location:
    Denmark
    Well you should remember that VHDL a Hardware Describtion Language - and the way you use while loops only usefull for a computer program.

    Study this solution:

    Code:
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    entity elavator is
    	port(
    	clock					: in	std_logic;
    	floor_switch	:	in	std_logic_vector(0 to 3);
    	floor_sensor	:	in	std_logic_vector(0 to 3);
    --	light_inside	: out	std_logic_vector(0 to 3);
    --	light_outside	: out	std_logic_vector(0 to 3);
    	motor_power		: out	std_logic_vector(0 to 1)
    	);
    end elavator;
    
    architecture elevator_arch of elavator is
    
    type state is (floor_1, floor_2, floor_3, floor_4);
    signal this_floor	:state := floor_1;
    signal next_floor :state := floor_1;
    
    begin
    
    elevator_switch: process( floor_switch, this_floor)
    begin
    case this_floor is
    	when floor_1 => case floor_switch is
    				when "1011" => next_floor <= floor_2;
    				when "1101" => next_floor <= floor_3;
    				when "1110" => next_floor <= floor_4;
    				when others => next_floor <= floor_1;
    			end case ;
    	when floor_2 => case floor_switch is
    				when "0111" => next_floor <= floor_1;
    				when "1101" => next_floor <= floor_3;
    				when "1110" => next_floor <= floor_4;
    				when others => next_floor <= floor_2;
    			end case;	
    	when floor_3 => case floor_switch is
    				when "0111" => next_floor <= floor_1;
    				when "1011" => next_floor <= floor_2;
    				when "1110" => next_floor <= floor_4;
    				when others => next_floor <= floor_3;
    				end case;
    	when floor_4 => case floor_switch is
    				when "0111" => next_floor <= floor_1;
    				when "1011" => next_floor <= floor_2;
    				when "1101" => next_floor <= floor_3;
    				when others => next_floor <= floor_4;
    				end case;
    end case;
    end process elevator_switch;
    
    elevator_action: process(next_floor, this_floor)
    begin
    case next_floor is
    	when floor_1 => 
             case this_floor is
    				when floor_1 =>
    					motor_power <= "00";
    				when others =>
    					motor_power <= "10";
    			end case;
    	when floor_2 => case this_floor is
    				when floor_2 =>
    					motor_power <= "00";
    				when floor_1 =>
    					motor_power <= "01";
    				when floor_3 | floor_4 =>
    					motor_power <= "10";
    				end case;
    	when floor_3 => case this_floor is
    				when floor_3 =>
    					motor_power <= "00";
    				when floor_1 | floor_2 =>
    					motor_power <= "01";
    				when floor_4  =>
    					motor_power <= "10";
    				end case;
    	when floor_4 => case this_floor is
    				when floor_4 =>
    					motor_power <= "00";
    				when others =>
    					motor_power <= "01";
    				end case;
    end case;
    end process elevator_action;
    
    -- elevator_light: process(clock)
    
    check_floor: process(floor_sensor)
    begin
    	case floor_sensor is
    		when "0111" => this_floor <= floor_1;
    		when "1011" => this_floor <= floor_2;
    		when "1101" => this_floor <= floor_3;
    		when "1110" => this_floor <= floor_4;
    		when others => this_floor <= floor_1;
    	end case;
    end process check_floor;
    
    end architecture elevator_arch;
    jeppe, Dec 1, 2009
    #6
  7. Scorpiion

    Scorpiion

    Joined:
    Dec 21, 2008
    Messages:
    6
    Well, my elevator is finished now! To summarize our GAL22V10 is very small and the code had to be very optimized for that, I actually rewrote the whole thing and removed the part with states and used the inside and outside lights as inout to use them better.. :)
    Scorpiion, Dec 3, 2009
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Soren Kuula
    Replies:
    1
    Views:
    439
    Henry S. Thompson
    Dec 1, 2005
  2. whitehatmiracle@gmail.com

    The classic elevator simulation problem

    whitehatmiracle@gmail.com, Jun 20, 2007, in forum: C++
    Replies:
    14
    Views:
    3,383
    whitehatmiracle@gmail.com
    Jul 2, 2007
  3. whitehatmiracle@gmail.com

    The elevator simulation

    whitehatmiracle@gmail.com, Oct 15, 2007, in forum: C++
    Replies:
    6
    Views:
    517
    whitehatmiracle@gmail.com
    Oct 16, 2007
  4. asuraseed@gmail.com

    elevator controller

    asuraseed@gmail.com, Jul 25, 2013, in forum: VHDL
    Replies:
    2
    Views:
    224
    Paul Uiterlinden
    Jul 29, 2013
  5. asuraseed@gmail.com
    Replies:
    1
    Views:
    252
Loading...

Share This Page