mikrocontroller.net

Forum: FPGA, VHDL & Co. Sequenz ausgeben


Autor: Zappelphilipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

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",  x"100");
  signal cnt : integer range 0 to 2 := 0;
:
   process begin
      wait until rising_edge(clk);
      if (cnt<2) then
         cnt <= cnt+1;
      else
         cnt <= 0;
      end if;
   end process;
   
   leds <= ledarray(cnt);

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

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

Autor: Doung W. (honeyleabe)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
   constant ledarray : Rom := ("001",  "010",  "100");

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

Autor: Zappelphilipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Lauflicht_1 is
Port(  
    Taste1  : in  bit;
    LFGEN  : in  bit;
    leds    : out std_logic_vector (2 downto 0)
    );
end Lauflicht_1;

architecture Behavioral of Lauflicht_1 is

type Rom is array (0 to 5) of std_logic_vector(2 downto 0);
  constant ledarray : Rom := ("000","001","011","111","011","001");
signal cnt : integer range 0 to 5 := 0;
signal Takt  : bit;

begin
  Takt <= LFGEN or Taste1;
  process
  begin
      wait until (Takt ='1' and Takt'event); 
   --wait until rising_edge(Takt);  
   --ERROR:HDLParsers:808 - C:/XilinxPLD12/Lauflicht/Lauflicht_1.vhd Line 25. 
   --rising_edge can not have such operands in this context.
      if (cnt<5) then
         cnt <= cnt+1;
        else
         cnt <= 0;
      end if;
      leds <= ledarray(cnt);
   end process;
end Behavioral;
Super, aber wait until rising_edge(Takt); gibt Fehlermeldung.
Warum?

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Sauron (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Der Hulk (Gast)
Datum:

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

Habe das probiert:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Lauflicht_1 is
Port(  
    Taste1  : in  std_logic;
    LFGEN  : in  std_logic;
    leds    : out std_logic_vector (2 downto 0)
    );
signal Takt  : std_logic;
type Rom is array (0 to 5) of std_logic_vector(2 downto 0);
constant ledarray : Rom := ("000","100","110","111","011","001");
signal cnt : integer range 0 to 5 := 0;

end Lauflicht_1;

architecture Behavioral of Lauflicht_1 is
begin
  Takt <= LFGEN or Taste1;
  process
  begin
   wait until rising_edge(Takt);  
      if (cnt<5) then
         cnt <= cnt+1;
        else
         cnt <= 0;
      end if;
      leds <= ledarray(cnt);
   end process;
end Behavioral;

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

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mussts IN die Entity packen und dort entsprechend als in port 
deklarieren

Autor: Zappelphilipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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  :-)

Autor: Doung W. (honeyleabe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke Lothar Miller

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> u.a. hast jemand Idee, mache loop limit 4 mal.
Zähler sind dafür genau das richtige... ;-)
  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;
  signal cntloop : integer range 0 to 3 := 0;
:
   process begin
      wait until rising_edge(clk);
      if (cntloop<3) then
        if (cnt<2) then
          cnt <= cnt+1;
        else
          cnt <= 0;
          cntloop <= cntloop+1;
       end if;
     end if;
   end process;
   
   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

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Christopher D. schrieb:
>> Und woher soll der Takt auf den du sensibel sein willst kommen?
> Wohl aus der Kombinatorik:
>
>     Takt <= LFGEN or Taste1;
> 
> 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

Autor: Doung W. (honeyleabe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zu Lothar Miller
ich mache noch meine projekt.
Beitrag "komponent in vhdl"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.