Forum: FPGA, VHDL & Co. Frage zu Lauflicht


von Martin (Gast)


Lesenswert?

Hallo an alle,

Seit Freitag beschäftige ich mich mit VHDL und vesuche gerade mein 
erstes "Knight-Rider"-Lauflicht mit einem Ein-Aus-Schalter zu 
beschreiben
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.numeric_std.all;
4
5
entity lauflicht is
6
port (
7
  clk   : in STD_LOGIC;
8
  enable : in STD_LOGIC;
9
  leds  : out STD_LOGIC_VECTOR(7 downto 0)
10
);
11
end lauflicht;
12
13
architecture BEHAVIOUR of lauflicht is
14
15
signal direction : std_logic := '0';
16
signal shiftreg : std_logic_vector (7 downto 0) := "00000000";
17
18
begin
19
process(clk, enable)
20
  begin
21
      if rising_edge(clk) then
22
        if enable = '1' then
23
         
24
          if shiftreg = "00000000" then
25
            shiftreg <= "00000001";
26
          end if;
27
          
28
            if direction = '0' then
29
              shiftreg <= shiftreg(6 downto 0) & '0';
30
              if shiftreg = "01000000" then
31
                direction <= '1';
32
              end if;  
33
            else
34
              shiftreg <= '0' & shiftreg(7 downto 1);
35
              if shiftreg = "00000010" then
36
                direction <= '0';
37
              end if;
38
            end if; 
39
          else
40
            shiftreg <= "00000000";
41
            direction <= '0';
42
          end if;
43
           
44
          end if;
45
   end process;
46
   
47
   leds <= shiftreg;
48
end BEHAVIOUR;

Das Problem liegt, wenn enable 0 ist und dadurch das Schieberegister auf 
0 gesetzt wird. Denn wenn Enable auf 1 geht, wird das Scheiberegister 
nicht auf 1 gesetzt.

Ich weiß, dass bei Signalen die Signalzuweisung erst zu Ende des 
Prozesses erfolgt.

Ich hoffe es kann mir wer helfen.

Danke im Voraus
lg Martin

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Ich weiß, dass bei Signalen die Signalzuweisung erst zu Ende des
> Prozesses erfolgt.
Wenn du es weißt, warum nutzt du das nicht aus?
1
      if rising_edge(clk) then
2
        if enable = '1' then
3
--          if shiftreg = "00000000" then  --- hier raus....
4
--            shiftreg <= "00000001";
5
--          end if;
6
            if direction = '0' then
7
              shiftreg <= shiftreg(6 downto 0) & '0';
8
              if shiftreg = "01000000" then
9
                direction <= '1';
10
              end if;  
11
            else
12
              shiftreg <= '0' & shiftreg(7 downto 1);
13
              if shiftreg = "00000010" then
14
                direction <= '0';
15
              end if;
16
            end if; 
17
            if shiftreg = "00000000" then  --- ...und hier rein, denn die letzte Zuweisung gewinnt....................
18
              shiftreg <= "00000001";
19
            end if;
20
          else
21
            shiftreg <= "00000000";
22
            direction <= '0';
23
          end if;
24
      end if;

von Martin (Gast)


Lesenswert?

Danke für die schnelle Hilfe!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.