mikrocontroller.net

Forum: FPGA, VHDL & Co. Lauflicht mit CPLD


Autor: D. E. (eschlair)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie erstelle ich ein Lauflicht in VHDL am 
besten/einfachsten/sinngemässesten?

Die Hardware kann ich mir vorstellen (Counter mit D-FlipFlops). Doch um 
das in VHDL umzusetzen, fehlt mir irgendwie die nötige Kenntnis.

Dieses Lauflicht soll dann mal immer laufen.

Als Chip habe ich einen XC2C256 und einen 40MHz Clock.

Ich möchte keine fixfertige Lösung, eher einen Tipp.

Gruss

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verwende ein Schieberegister. Jedes Bit steht für eine LED. So kannst du 
ein beliebiges Muster durchschieben. Getaktet wird das Schieberegister 
dann von einem Taktteiler, der die System-Clock auf einen vernünftigen 
Wert hinunterteilt.

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Tutorial/Example zum Webpack? (JohnsonCounter)

Rick

Autor: D. E. (eschlair)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Verwende ein Schieberegister. Jedes Bit steht für eine LED. So kannst du
>ein beliebiges Muster durchschieben. Getaktet wird das Schieberegister
>dann von einem Taktteiler, der die System-Clock auf einen vernünftigen
>Wert hinunterteilt.

So mit dem Schieberegister hab ichs mir überlegt. Nur weiss ich nicht 
wie programmieren.
Den Clock möchte ich nicht mehr teilen (also volle Kanne :)). CLK = 
40MHz.

Damit das Lauflicht wieder von vorne zu zählen beginnt, muss wohl noch 
ein Zähler hin.

>Das Tutorial/Example zum Webpack? (JohnsonCounter)

sorry konnte ich leider nicht finden...ich suchte unter: VHDL\Synthesis 
Constructs\Cidung Examples\

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Dave E. (eschlair)

>Den Clock möchte ich nicht mehr teilen (also volle Kanne :)). CLK =
>40MHz.

Und welches Alien soll dann noch ein Lauflicht sehen?

Taktung FPGA/CPLD

Wobei in diesem Beispiel ein Derived Clock möglich wäre.

>Damit das Lauflicht wieder von vorne zu zählen beginnt, muss wohl noch
>ein Zähler hin.

Richtig.

Etwa so.

signal cnt: std_logic_vector(2 downto 0);

process (clk)
begin
  if rising_edge(clk) then
    cnt <= cnt+1;
  end if;
end process;

process(cnt)
begin
  case cnt is
    when "000" => led <="00000001";
    when "000" => led <="00000010";
    when "000" => led <="00000100";
    when "000" => led <="00001000";
    when "000" => led <="00010000";
    when "000" => led <="00100000";
    when "000" => led <="01000000";
    when "000" => led <="10000000";
    when others => null;
  end case;
end process;

MFG
Falk

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternativ: Zähler um den Takt runterzuteilen, und dann ein 
Ring-Schieberegister.

Autor: D. E. (eschlair)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber wie geht so ein Ringschieberegister (nur alternativ - vielen Dank 
an Falk :)).

>Und welches Alien soll dann noch ein Lauflicht sehen?

:))
Also ein 'Lauflicht' war nicht korrekt von mir. Es 'läuft', aber ohne 
Licht :).

Ich möchte nur mal wissen, ob ein CPLD 40MHz schalten kann. Und wie dann 
so die Flanken aussehen...

Falls das Resultat nicht befriedigend ist, könnte ich den Takt teilen 
(hmm wie ging das schon wieder?) oder hätte sonst noch 3MHz aufm Board.

Hab kurzerhand beschlossen, einen Print mit D-Sub und Decoder mit 
7-Segment zu löten - mit Schalter. Könnte dann externen Print geben; mit 
Würfelfunktion.
Dank dem Decoder wäre dann nur noch ein Counter bis "0111" nötig. Ein 
CPLD für einen Würfel...naja. dient ja nur Experimentierzwecken.

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beispiel Ringschieberegister für ein Lauflicht mit 10 LEDs:
entity lauflicht is
  port (
    clk, reset : in std_logic;
    leds : out std_logic_vector (9 downto 0)
  )
end entity;

architecture bla of lauflicht is
  signal state : std_logic_vector (9 downto 0);
begin
  -- Ausgabe des Zustands auf den LEDs
  leds <= state;

  -- Weiterschalten des Zustands beim Takt
  process (clk) begin
    if clk'event and clk='1' then
      if reset = '1' then
        -- Startzustand
        state <= "1000000000";
      else
        -- Ring-Schieben
        state (8 downto 0) <= state (9 downto 1);
        state (9) <= state (0);
      end if;
    end if;
  end process;
end architecture;

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Clock-Runterteilen überlasse ich dir mal als Übung. Tipp: Ein 
weiteres "if", welches den Schiebeblock nur dann ausführt, wenn der 
Taktteiler(-Zähler) einmal durch ist. Das entspricht einem Clock-Enable 
(= sauberer Taktteiler statt Logik im Clock-Pfad).

Autor: Michael E. (rince)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist auch noch ein Beispiel.

Hab das gestern mal auf mein Spartan3E board geladen und funktioniert 
super:

http://www.obviousobscurity.org/?p=50

Der wesentliche code ist hier:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity blinkylights is
  port(  led: out std_logic_vector(7 downto 0);
    sw:  in std_logic_vector(7 downto 0);
                mclk: in std_logic
  );
end blinkylights;

architecture Behavioral of blinkylights is
  signal secclk_c: std_logic_vector(23 downto 0);
  signal secclk: std_logic;
  signal ledreg: std_logic_vector(7 downto 0) := "00000001";
begin

  second_clock: process(mclk)
  begin
    if (mclk = '1' and mclk'Event) then
      secclk_c <= secclk_c + 1;
      if (sw(3) = '1') then
        secclk <= secclk_c(23);
      else
        secclk <= secclk_c(20);
      end if;
    end if;
  end process; 

  rotate: process(secclk)
  begin
    if (secclk = '1' and secclk'Event and sw(0) = '1') then
      if (sw(2) = '1') then
        ledreg <= (ledreg(0) & ledreg(7 downto 1));
      else
        ledreg <= (ledreg(6 downto 0) & ledreg(7));
      end if;
    end if;
  end process;
  
  led <= ledreg;
end Behavioral;



Der code erlaubt das Einschalten, Umschalten der Richtung und der 
Geschwindigkeit mit Hilfe mit Hilfe von switches (sw).

Rince

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.