Forum Discussion

Altera_Forum's avatar
Altera_Forum
Icon for Honored Contributor rankHonored Contributor
14 years ago

On/Off led

unable to turn on/off led. the component does not trigger does anyone knows why?

--main file

architecture Behavioral of DigitaleKlok is
        component OnOff is
        port (
            led_state : in std_logic_vector(1 downto 0);
            LEDR : out std_logic_vector(9 downto 0)
        );
        end component ;
signal sig : std_logic_vector(1 downto 0); --> 01,10,11
begin
    process(Clock)
     begin
        if (SW(2) = '1') then
              sig <="01";
          else
            sig <="10";
        end if;
    end process;
test: OnOff port map (sig); 
end Behavioral;
------------------------
library IEEE;
use IEEE.std_logic_1164.all;
entity OnOff is
        port (
        led_state : in std_logic_vector(1 downto 0);
        LEDR : out std_logic_vector(9 downto 0)
            );
end entity OnOff;
architecture Behavioral of OnOff is
 begin
    process(led_state)
    begin
           if(Clock'event and Clock='1') then
 if (led_state = "10") then
                LEDR(9) <= '1';
            end if;
            if (led_state = "01") then
                LEDR(9) <= '0';
            end if;
  end if;
    end process;
     
end Behavioral;

7 Replies

  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    The first thing to do is portmap correctly for both input and output of OnOff

  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    I think I have corrected the portmap, but still nothing happens when I change the switch state.

    -- main file
    port (
                        Dselect : in std_logic; -- 24000000HZ
                             SW   : in   std_logic_vector(3 downto 0); 
                              KEY : in   std_logic_vector(3 downto 0); 
                             LEDR : out std_logic_vector(9 downto 0);
             HEX0, HEX1, HEX2, HEX3 : out std_logic_vector(0 to 6) --> Display_select 
          );
    architecture Behavioral of test is
    component leds is
                     port (
                            led_state : in std_logic_vector(1 downto 0);
                            LEDR : out std_logic_vector(9 downto 0)
                            );
            end component ;
    signal Alarm_state : std_logic_vector(1 downto 0); --> 01,10,11
    begin
    process(Clock)
             begin
    if (SW(2) = '1') then
                                    if (hour = alarm_hour) then
                                        if (minute = alarm_minute) then
                                          alarm <= 1;
                                        end if;
                                    Alarm_state <="01";
                                else
                                    Alarm_state <="10";
                                     alarm <= 0;    
                                    end if;
            end process;
    test: leds port map (Alarm_state, LEDR); 
    end Behavioral;
    -- 
    library IEEE;
    use IEEE.std_logic_1164.all;
    entity Leds is
        port (
                led_state : in std_logic_vector(1 downto 0);
                LEDR : out std_logic_vector(9 downto 0)
        );
    end entity Leds;
    architecture Behavioral of Leds is
     begin
        process(led_state)
        begin
             if(Clock'event and Clock='1') then
                if (led_state = "10") then
                    LEDR(9) <= '1';
                end if;
                if (led_state = "01") then
                    LEDR(9) <= '0';
                end if;
    end if;
        end process;
    end Behavioral;
    
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    Since your code is not complete, it is hard to tell about signals like hour/minute counters.

    For now I suggest changing the if construct of component LED to:

    if led_state = "01" then

    ....

    elsif led_state = "10" then

    ...

    end if;

    Make sure you are not switching LEDs too fast to be visible.
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    I have figured out what went wrong.

    My code works ok i was changing the the wrong switch. SW1 instate of SW2

    Thank you Kaz.
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    is the test a testbench or a synthesisable file? either way, you're not using the correct synchronous template for the process. You have clock in the sensitivity list but you're not using it in the process. This will lead to simulation/synthesis missmatch.

  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    That is true Tricky. For issues like LEDs and human-finger triggered switches and similar starters' projects, I don't see any need for clock edge to sample changes. However it is useful to use correct methods at least to keep the professor happy.

    Apart from that I might also use a slow clock to debounce the tremor of old fat fingers.

    The benefit of not using clock is that you don't need to care about the fuss of TimeQuest reporting failures on registers.
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    True, but my point still stands. With the process sensitive to clock the similation will look like it's triggering on both clock edges, but on the real hardware its totally asynchronous.