Forum: FPGA, VHDL & Co. Sequenz ausgeben


von Zappelphilipp (Gast)


Lesenswert?

Hallo,
ich bin so ein absoluter Anfänger und möchte einfach ein kleines 
LED-Blinkytoy aufbauen.

Wie kann ich in VHDL die Sequenz
"001"
"010"
"100"
und wieder von vorne, also ein einfaches Lauflicht mit 3 LED's
ausgeben? Ich habe einen Taktgenerator mit 0,25-20Hz.

Welche verschiedenen Möglichkeiten gibt es das zu schreiben?

Sorry, wenn ich die Experten mit so was langweile, würde mir aber sehr 
helfen!

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


Lesenswert?

> Welche verschiedenen Möglichkeiten gibt es das zu schreiben?
1) Du kannst eine FSM mit diesen 3 Zuständen bauen.
1
  signal state : std_logic_vector (2 downto 0) := "001"; 
2
:
3
   process begin
4
      wait until rising_edge(clk);
5
      case state is
6
         when "001"  => state <= "010";
7
         when "010"  => state <= "100";
8
         when others => state <= "001";
9
      end case;
10
   end process;
11
 
12
   leds <= state;

2) Du kannst einen Zähler bauen, der ein RAM indiziert.
1
  type Rom is array (0 to 2) of std_logic_vector(2 downto 0); 
2
  constant ledarray : Rom := ("001",  "010",  x"100");
3
  signal cnt : integer range 0 to 2 := 0;
4
:
5
   process begin
6
      wait until rising_edge(clk);
7
      if (cnt<2) then
8
         cnt <= cnt+1;
9
      else
10
         cnt <= 0;
11
      end if;
12
   end process;
13
   
14
   leds <= ledarray(cnt);

3) Du kannst ein Schieberegister bauen.
1
   signal ledint: std_logic_vector(2 downto 0) := "001";
2
:
3
   process begin
4
      wait until rising_edge(clk);
5
      ledint <= ledint(1 downto 0) & '0';
6
      if (ledint="100") then
7
         ledint<= "001";
8
      end if;
9
   end process;
10
   
11
   leds <= ledint;

Und dann gibts noch einige weitere Möglichkeiten...

von Doung W. (honeyleabe)


Lesenswert?

2) Du kannst einen Zähler bauen, der ein RAM indiziert.
type Rom is array (0 to 2) of std_logic_vector(2 downto 0);
  constant ledarray : Rom := ("001","010","100");

   signal cnt : integer range 0 to 2 := 0;
begin
   process
    begin
      wait until rising_edge(clk);
      if (cnt<2) then
         cnt <= cnt+1;
        else
         cnt <= 0;
      end if;
      leds <= ledarray(cnt);

   end process;


aber das funktioniert nicht gut.

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


Angehängte Dateien:

Lesenswert?

Dong Wang schrieb:
> aber das funktioniert nicht gut.
Oh nein, wie in aller Welt konnte mir das nur passieren...  :-o

Als Tipp: Lies die Fehlermeldung des Syntax-Checks, mach dann den 
kleinen Syntaxfehler (das x) raus, dann gehts.

Falls das nicht klappt, hier die korrigierte Kopiervorlage:
1
   constant ledarray : Rom := ("001",  "010",  "100");

Im Ernst:
Du darfst schon ein wenig Mitdenken  :-/

von Zappelphilipp (Gast)


Lesenswert?

1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
entity Lauflicht_1 is
7
Port(  
8
    Taste1  : in  bit;
9
    LFGEN  : in  bit;
10
    leds    : out std_logic_vector (2 downto 0)
11
    );
12
end Lauflicht_1;
13
14
architecture Behavioral of Lauflicht_1 is
15
16
type Rom is array (0 to 5) of std_logic_vector(2 downto 0);
17
  constant ledarray : Rom := ("000","001","011","111","011","001");
18
signal cnt : integer range 0 to 5 := 0;
19
signal Takt  : bit;
20
21
begin
22
  Takt <= LFGEN or Taste1;
23
  process
24
  begin
25
      wait until (Takt ='1' and Takt'event); 
26
   --wait until rising_edge(Takt);  
27
   --ERROR:HDLParsers:808 - C:/XilinxPLD12/Lauflicht/Lauflicht_1.vhd Line 25. 
28
   --rising_edge can not have such operands in this context.
29
      if (cnt<5) then
30
         cnt <= cnt+1;
31
        else
32
         cnt <= 0;
33
      end if;
34
      leds <= ledarray(cnt);
35
   end process;
36
end Behavioral;
Super, aber wait until rising_edge(Takt); gibt Fehlermeldung.
Warum?

von D. I. (Gast)


Lesenswert?

Weil Takt kein std_logic ist sondern bit. Das solltest du ändern und es 
macht auch keinen Sinn das Signal lokal zu haben. Es sollte mit in die 
Entity

von Michael Sauron (Gast)


Lesenswert?

Eine Taste nimmt man für gewöhnlich nicht als Takt.
Da dein Taster mit Sicherheit prellt, und ein FPGA sehr flott ist, wird 
er jede Flanke des prellens sehen.

>ich bin so ein absoluter Anfänger und möchte einfach ein kleines
>LED-Blinkytoy aufbauen.

mein BuchTip: VHDL Synthese

von Der Hulk (Gast)


Lesenswert?

>es macht auch keinen Sinn das Signal lokal zu haben.
>Es sollte mit in die Entity

Habe das probiert:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
entity Lauflicht_1 is
7
Port(  
8
    Taste1  : in  std_logic;
9
    LFGEN  : in  std_logic;
10
    leds    : out std_logic_vector (2 downto 0)
11
    );
12
signal Takt  : std_logic;
13
type Rom is array (0 to 5) of std_logic_vector(2 downto 0);
14
constant ledarray : Rom := ("000","100","110","111","011","001");
15
signal cnt : integer range 0 to 5 := 0;
16
17
end Lauflicht_1;
18
19
architecture Behavioral of Lauflicht_1 is
20
begin
21
  Takt <= LFGEN or Taste1;
22
  process
23
  begin
24
   wait until rising_edge(Takt);  
25
      if (cnt<5) then
26
         cnt <= cnt+1;
27
        else
28
         cnt <= 0;
29
      end if;
30
      leds <= ledarray(cnt);
31
   end process;
32
end Behavioral;

Hatte die Konsequenz das die Signale cnt und Takt auf Ausgänge gelegt 
wurden!

von D. I. (Gast)


Lesenswert?

Du mussts IN die Entity packen und dort entsprechend als in port 
deklarieren

von Zappelphilipp (Gast)


Lesenswert?

>Du mussts IN die Entity packen und dort entsprechend als in port
>deklarieren

Will doch cnt und Takt garnicht als Ein/Ausgang haben.

Port bedeutet doch Ein/Augang oder????

Kannst du mal posten wie's gemeint ist? Habe Brett vorm Kopf  :-)

von Doung W. (honeyleabe)


Lesenswert?

danke Lothar Miller

u.a. hast jemand Idee,
mache loop limit 4 mal.

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


Lesenswert?

> u.a. hast jemand Idee, mache loop limit 4 mal.
Zähler sind dafür genau das richtige... ;-)
1
  type Rom is array (0 to 2) of std_logic_vector(2 downto 0); 
2
  constant ledarray : Rom := ("001", "010", "100");
3
  signal cnt : integer range 0 to 2 := 0;
4
  signal cntloop : integer range 0 to 3 := 0;
5
:
6
   process begin
7
      wait until rising_edge(clk);
8
      if (cntloop<3) then
9
        if (cnt<2) then
10
          cnt <= cnt+1;
11
        else
12
          cnt <= 0;
13
          cntloop <= cntloop+1;
14
       end if;
15
     end if;
16
   end process;
17
   
18
   leds <= ledarray(cnt);

BTW:
 Der Hulk (Gast)
 Dong Wang (honeyleabe)
 Zappelphilipp (Gast)
Seid ihr alle an der selben Schule?
Bei der Prüfung müsst ihr das dann aber selber machen...  :-o

von D. I. (Gast)


Lesenswert?

Zappelphilipp schrieb:
>>Du mussts IN die Entity packen und dort entsprechend als in port
>>deklarieren
>
> Will doch cnt und Takt garnicht als Ein/Ausgang haben.
>
> Port bedeutet doch Ein/Augang oder????
>
> Kannst du mal posten wie's gemeint ist? Habe Brett vorm Kopf  :-)

Und woher soll der Takt auf den du sensibel sein willst kommen?

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


Lesenswert?

Christopher D. schrieb:
> Und woher soll der Takt auf den du sensibel sein willst kommen?
Wohl aus der Kombinatorik:
1
    Takt <= LFGEN or Taste1;
Simulieren lässt sich das ohne Weiteres, aber es wird in der Realität 
sicher lustige Effekte zeigen...

von D. I. (Gast)


Lesenswert?

Lothar Miller schrieb:
> Christopher D. schrieb:
>> Und woher soll der Takt auf den du sensibel sein willst kommen?
> Wohl aus der Kombinatorik:
>
1
>     Takt <= LFGEN or Taste1;
2
>
> Simulieren lässt sich das ohne Weiteres, aber es wird in der Realität
> sicher lustige Effekte zeigen...

Das hab ich wohl überlesen.

Das ist ja wirklich gruselig :-o

von Doung W. (honeyleabe)


Lesenswert?

zu Lothar Miller
ich mache noch meine projekt.
Beitrag "komponent in vhdl"

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.