mikrocontroller.net

Forum: FPGA, VHDL & Co. 'schamlos geklaut' von Herrn Lothar Miller


Autor: Michael L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

ich muss bzw. möchte langsam vhdl und programmierbare Logic lernen.

Den allerersten Einstieg spare ich mir und komme zur Sache. Ich habe auf 
der super homepage des Herrn Lothar Miller das Luxus Knightrider Licht 
als Anleitung genommen und etwas modifiziert.

Den Taktteiler brauche ich für mein Evaluation Bord wohl eh, zudem 
wollte ich mehrfache Instanzen davon erzeugen...etc.

Alles in allem sozusagen das Beispiel zum üben heranziehen und 
dahingehend ändern, daß es in einen Kodierungsstil führt, den ich mir 
später angewöhnen kann. (beruhigt angewöhnen)

Frage: wie sieht es aus? Ich habe ja quasi Millers Stil übernommen, das 
sollte also passen. Der Zähler für die pwm Erzeugung: wenn man ohnehin 
16 Stufen nimmt, könnte man also einen unsigned Vector überlaufen 
lassen?

Das tatsächliche Dimmen der Leds: verstehe ich. Aber ich frage mich ob 
und wie man es anders machen könnte. Ich befürchte ich bin gefährdet die 
Übersicht zu verlieren.

2 Allgemeine Fragen nur noch. Es wird ja durch die Bank das Buch von 
Schwarz empfohlen zum lernen. Aber(!) von einigen der Ratschläge und 
Stile wird hier absolut abgeraten..... trotzdem kaufen? Verwirrung am 
Horizont?

und dann noch die Anmeldung.
Würde ich im hinblick auf komplexere Probleme gern maschen aber ist man 
dadurch spam gefährdeter? Ich bin auch im Netz recht zurückhaltend, von 
daher ist das offenlegen von Namen incl email irgendwie... naja ich bin 
da nicht so modern. Erfahrungen?
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity clocken is
  Generic( fo : integer := 50000000;
        fen: integer := 3);
   Port   ( clk  : in std_logic;
        clken: out std_logic);
end clocken;
architecture Behavioral of clocken is
  signal count : integer range 0 to fo/fen := 0;
begin
  process begin
    wait until rising_edge(clk);
    if( count < fo/fen ) then
      count <= count + 1;
      clken <= '0';
    else
      count <= 0;
      clken <= '1';
    end if;
  end process;
end Behavioral;



library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity knightrider_vhd is
    Port ( clk : in  STD_LOGIC;
           leds : out  STD_LOGIC_VECTOR (7 downto 0));
end knightrider_vhd;

architecture Behavioral of knightrider_vhd is
  type Rom is array (0 to 13) of std_logic_vector(7 downto 0); 
  constant ledrom : Rom := ( "10000000",
                    "01000000",
                    "00100000",
                    "00010000",
                    "00001000",
                    "00000100",
                    "00000010",
                    "00000001",
                    "00000010",
                    "00000100",
                    "00001000",
                    "00010000",
                    "00100000",
                    "01000000");             
  component clocken is
    Generic( fo : integer;
          fen: integer);
    Port   ( clk  : in std_logic;
          clken: out std_logic);
  end component;

  signal clkshift : std_logic;
  signal clkpwm: std_logic;
  signal step : integer range 0 to 13;
  signal pwm_gen : unsigned(15 downto 0); 
  signal leds_1 : std_logic_vector( 7 downto 0);  --hell
  signal leds_2 : std_logic_vector( 7 downto 0);  --dunkel
  signal leds_3 : std_logic_vector( 7 downto 0); 
begin
  clock_shift : clocken Generic Map( fo => 50000000, fen=>3)
                  Port Map(clk => clk, clken => clkshift);
                  
  clock_pwm :   clocken Generic Map( fo => 50000000, fen=>50000)
                  Port Map(clk => clk, clken => clkpwm);  

                  
  shift : process begin
    wait until rising_edge(clk);
    if( clkshift = '1' ) then
      if( step < 13 ) then
        step <= step + 1;
      else
        step <= 0;
      end if;
    end if;
    leds_1 <= ledrom(step);
    leds_2 <= leds_1;
  end process shift;
  
  pwm : process begin
    wait until rising_edge(clk);
    pwm_gen <= pwm_gen + 1;
  end process pwm;
  
  
  leds <= leds_1 or leds_2 or leds_3  when pwm_gen < 4 else
           leds_1 or leds_2            when pwm_gen < 8 else
           leds_1;
  
end Behavioral;



Autor: Michael L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal abgesehen davon, daß es SO nicht funktioniert.... ich sehe keine 
dunklen Stufen. :-(
Jemand eine schnelle Idee?

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
trotzdem kaufen?
Ich selbst hab es auch mit diesem Buch gelernt und es ist auch mein 
einzigstes VHDL Buch. Ich kenne kein Besseres. Das soll aber nicht 
heissen, das das Buch gut ist. An vielen stellen ist es unnötig 
Kompliziert geschrieben. Auch die Ausdrucksweise ist oftmals schwer zu 
verstehen und missverständlich, so als ob das Buch von 2 Professoren 
geschrieben wäre :-)

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, das kommt davon, wenn man von der Miller-HP abschreibt :-)

Autor: Michael L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das nächste mal werde ich mich bei einem Post an den zumeist üblichen 
Standard hier im Forum halten vielleicht wird dir dann auch die Frage an 
sich bewusst.

Konkret zu Fehlern haste nix, Hans? :-(

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

Bewertung
0 lesenswert
nicht lesenswert
Michael L. schrieb:
> Konkret zu Fehlern haste nix...
Was sagt denn die Simulation?

> Ich habe ja quasi Millers Stil übernommen...
Ja, aber leider nur "quasi" und offenbar übersehen, dass meine Zähler 
idR. immm mit integern aufgebaut sind. Ich würde behaupten, deine 
gedimmten LEDs sind etwa 4096 mal dunkler als meine... :-o

Wie weit zählt denn dein Zähler:
  signal pwm_gen : unsigned(15 downto 0); 
  :
  pwm : process begin
    wait until rising_edge(clk);
    pwm_gen <= pwm_gen + 1;
  end process pwm;

Und warum habe ich selber das so gemacht:
  signal pwmcnt    : integer range 0 to 15 := 0;       -- PWM Zähler
  :
  process ... begin    
      wait until rising_edge(clk);
      :
         if (pwmcnt<15) then      -- PWM für gedimmte LEDs
            pwmcnt <= pwmcnt+1;
         else
            pwmcnt <= 0;
         end if;
      end if;
   end process;

Ein
>>> integer range 0 to 15;
ist ganz was anderes als ein
>>> unsigned(0 to 15)
oder ein
>>> unsigned(15 downto 0)


> Es wird ja durch die Bank das Buch von Schwarz empfohlen zum lernen.
> Aber(!) von einigen der Ratschläge und Stile wird hier absolut
> abgeraten..... trotzdem kaufen?
Ja, es gibt m.E. kein besseres deutsches Buch zum Thema VHDL Synthese

Autor: Michael L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Post der mich bischen zickig hat werden lassen, regte mich auf, weil 
ich das nicht leiden kann. Entweder posten, weil man was dazu sagen kann 
oder einfach ignorieren.
Bin selbe in einem anderen Forum recht aktiv und handhabe das immer so. 
(es gibt auch Dinge wo ich mich auskenne, das Forum hat nichts mit 
Elektronik oder gar vhdl zu tun g)


Mit deinem Post lässt sich im Gegensatz dazu auch was anfangen. Na klar 
(!!) wenn ich es mit unsigned Vektor Versuche, müsste ich den auch nur 4 
bits lang machen.
Dass integer anzuraten ist hatte ich grundsätzlich auch vernommen, aus 
Gründen des Ausprobierens habe ich unsigned gewählt. Ok der ist viel zu 
lang.


Die Simulation zeigt mit keine pwm. Ok, das mag an der zu langen Zeit 
liegen, die ich erreichen würde, das probier ich morgen aus!
Mir kam das shiften der leds auch seltsam vor, aber ich bin bis Morgen 
nicht zu Hause und kann nachsehen.
Vielleicht habe ich auch ein falsches testprogramm? Außer einem Takt wie 
clk <= not clk after 10 ns muss da eigentlich gar nichts rein? Es gibt 
ja gar keine relevanten Signale als Stimuli?

vielen Dank an Lothar, der sicher auch einen kontraproduktiveren Post in 
den Fingern hatte und es doch schafft, dies zu umgehen.

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

Bewertung
0 lesenswert
nicht lesenswert
Michael L. schrieb:
> testprogramm? Außer einem Takt wie
> clk <= not clk after 10 ns muss da eigentlich gar nichts rein?
Ja, das reicht aus.

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael L. schrieb:
> und dann noch die Anmeldung.
> Würde ich im hinblick auf komplexere Probleme gern maschen aber ist man
> dadurch spam gefährdeter? Ich bin auch im Netz recht zurückhaltend, von
> daher ist das offenlegen von Namen incl email irgendwie... naja ich bin
> da nicht so modern. Erfahrungen?

Für Registrierungen in Foren aller Art legt man sich einfach ne 
zusätzliche Freemail-Adresse zu, die man dann an sein huaptpostfach 
weiterleitet. Da bei µc.net niemand die Adresse sehen kann, habe ich da 
aber wenig Bedenken wegen Spamgefahr. Was man nie machen sollte ist die 
Adresse als Klartext in einen Betrag zu schreiben (und das machen ja 
meist nur die unregistrierten Nutzer, da man sie nicht per PN erreichen 
kann).

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe Ihr Euch schon mal in Hardware angeschaut wie tödlich so ein 
kleiner Vergleich ist. Noch besser ist ein kleiner = Vergleich.

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

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> Habe Ihr Euch schon mal in Hardware angeschaut wie tödlich so ein
> kleiner Vergleich ist. Noch besser ist ein kleiner = Vergleich.
Habe ich. Ist halb so wild... ;-)
Das haben die Tools soweit ganz gut im Griff.

Denn wenn du das hier meinst:
         if (pwmcnt<15) then      -- PWM für gedimmte LEDs
            pwmcnt <= pwmcnt+1;
         else
            pwmcnt <= 0;
         end if;
Hier macht die Toolchain einen ordinären 4-Bit-Zähler draus. Die 
erkennt, dass der Überlauf geschenkt ist...


Wichtiger zu beachten: variable Zähler beginnen bei 0 und zäahlen zum 
Endwert hoch. Wenn der erreicht ist, geht es wieder bei 0 los.

Autor: Michael L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es funktioniert. Danke an alle und gelernt habe ich auch noch was
  shift : process begin
    wait until rising_edge(clk);
    if( clkshift = '1' ) then
      if( step < 13 ) then
        step <= step + 1;
      else
        step <= 0;
      end if;
    end if;
    leds_1 <= ledrom(step);
    leds_2 <= leds_1;
  end process shift;

war der zweite Hauptfehler. Das schieben der alten Zustände darf 
natürlich nur bei clkshift passieren, sonst sind ja in Nullkomma nix 
alle auf leds_1 Wert.

Die Frage, ob bei integer Verwendung und 16 Zählstufen ein 4 bit Vektor 
rauskommt, hat sich erledigt :-)

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.