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


von Michael L. (Gast)


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?
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
entity clocken is
5
  Generic( fo : integer := 50000000;
6
        fen: integer := 3);
7
   Port   ( clk  : in std_logic;
8
        clken: out std_logic);
9
end clocken;
10
architecture Behavioral of clocken is
11
  signal count : integer range 0 to fo/fen := 0;
12
begin
13
  process begin
14
    wait until rising_edge(clk);
15
    if( count < fo/fen ) then
16
      count <= count + 1;
17
      clken <= '0';
18
    else
19
      count <= 0;
20
      clken <= '1';
21
    end if;
22
  end process;
23
end Behavioral;
24
25
26
27
library IEEE;
28
use IEEE.STD_LOGIC_1164.ALL;
29
use IEEE.NUMERIC_STD.ALL;
30
31
entity knightrider_vhd is
32
    Port ( clk : in  STD_LOGIC;
33
           leds : out  STD_LOGIC_VECTOR (7 downto 0));
34
end knightrider_vhd;
35
36
architecture Behavioral of knightrider_vhd is
37
  type Rom is array (0 to 13) of std_logic_vector(7 downto 0); 
38
  constant ledrom : Rom := ( "10000000",
39
                    "01000000",
40
                    "00100000",
41
                    "00010000",
42
                    "00001000",
43
                    "00000100",
44
                    "00000010",
45
                    "00000001",
46
                    "00000010",
47
                    "00000100",
48
                    "00001000",
49
                    "00010000",
50
                    "00100000",
51
                    "01000000");             
52
  component clocken is
53
    Generic( fo : integer;
54
          fen: integer);
55
    Port   ( clk  : in std_logic;
56
          clken: out std_logic);
57
  end component;
58
59
  signal clkshift : std_logic;
60
  signal clkpwm: std_logic;
61
  signal step : integer range 0 to 13;
62
  signal pwm_gen : unsigned(15 downto 0); 
63
  signal leds_1 : std_logic_vector( 7 downto 0);  --hell
64
  signal leds_2 : std_logic_vector( 7 downto 0);  --dunkel
65
  signal leds_3 : std_logic_vector( 7 downto 0); 
66
begin
67
  clock_shift : clocken Generic Map( fo => 50000000, fen=>3)
68
                  Port Map(clk => clk, clken => clkshift);
69
                  
70
  clock_pwm :   clocken Generic Map( fo => 50000000, fen=>50000)
71
                  Port Map(clk => clk, clken => clkpwm);  
72
73
                  
74
  shift : process begin
75
    wait until rising_edge(clk);
76
    if( clkshift = '1' ) then
77
      if( step < 13 ) then
78
        step <= step + 1;
79
      else
80
        step <= 0;
81
      end if;
82
    end if;
83
    leds_1 <= ledrom(step);
84
    leds_2 <= leds_1;
85
  end process shift;
86
  
87
  pwm : process begin
88
    wait until rising_edge(clk);
89
    pwm_gen <= pwm_gen + 1;
90
  end process pwm;
91
  
92
  
93
  leds <= leds_1 or leds_2 or leds_3  when pwm_gen < 4 else
94
           leds_1 or leds_2            when pwm_gen < 8 else
95
           leds_1;
96
  
97
end Behavioral;

von Michael L. (Gast)


Lesenswert?

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

von Frank (Gast)


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 :-)

von Hans (Gast)


Lesenswert?

Tja, das kommt davon, wenn man von der Miller-HP abschreibt :-)

von Michael L. (Gast)


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? :-(

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


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:
1
  signal pwm_gen : unsigned(15 downto 0); 
2
  :
3
  pwm : process begin
4
    wait until rising_edge(clk);
5
    pwm_gen <= pwm_gen + 1;
6
  end process pwm;

Und warum habe ich selber das so gemacht:
1
  signal pwmcnt    : integer range 0 to 15 := 0;       -- PWM Zähler
2
  :
3
  process ... begin    
4
      wait until rising_edge(clk);
5
      :
6
         if (pwmcnt<15) then      -- PWM für gedimmte LEDs
7
            pwmcnt <= pwmcnt+1;
8
         else
9
            pwmcnt <= 0;
10
         end if;
11
      end if;
12
   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

von Michael L. (Gast)


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.

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


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.

von Uwe .. (uwegw)


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).

von Martin (Gast)


Lesenswert?

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

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


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:
1
         if (pwmcnt<15) then      -- PWM für gedimmte LEDs
2
            pwmcnt <= pwmcnt+1;
3
         else
4
            pwmcnt <= 0;
5
         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.

von Michael L. (Gast)


Lesenswert?

Es funktioniert. Danke an alle und gelernt habe ich auch noch was
1
  shift : process begin
2
    wait until rising_edge(clk);
3
    if( clkshift = '1' ) then
4
      if( step < 13 ) then
5
        step <= step + 1;
6
      else
7
        step <= 0;
8
      end if;
9
    end if;
10
    leds_1 <= ledrom(step);
11
    leds_2 <= leds_1;
12
  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 :-)

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.