Sequenz ausgeben

Gast #1397685
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!
Moderator (Firma: Titel) Persönliche Seite #1397729
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...
#1398852
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.
Moderator (Firma: Titel) Persönliche Seite #1398892
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  :-/
Angehängte Dateien:
Gast #1400064
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?
Gast #1400180
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
Gast #1400190
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!
Gast #1400421
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  :-)
Moderator (Firma: Titel) Persönliche Seite #1400635
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
Gast #1400639
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?
Gast #1400859
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren