Forum: FPGA, VHDL & Co. 4bit ladberer Zähler mit Anfangs- und Endwert.


von Igor (Gast)


Lesenswert?

Hallo,
ich möchte einen Zähler schreiben, dem ein Anfangs- und Endwert gegeben 
wird. Danach soll er von dem Anfangswert bis 15 zählen und dann 
rückwärts bis zu dem Endwert.
Ich beschäftige mich mit vhdl erst seit ein paar Tagen, deshalb hab ich 
noch keine Ahnung davon.
Hier ist mein Code, den ich anhand von ähnlichen Codes erstellt habe:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
entity zaehler is port(
6
  clk:    in std_logic
7
  zahl_anfang  in unsigned(3 downto 0);
8
  zahl_ende  in unsigned(3 downto 0);
9
  zahl_aus  out unsigned(3 downto 0);
10
  );
11
end zaehler;
12
13
architecture count of zaehler is
14
  signal value_jetzt: unsigned(3 downto 0);
15
  signal value_ende: unsigned(3 downto 0);
16
begin
17
18
  process(clk)
19
  begin
20
    value_jetzt <= zahl_anfang
21
    if clk = '1' then
22
      value_jetzt <= value_jetzt + 1;
23
    if value_jetzt = "1111" then
24
      value_jetzt <= value_jetzt - 1;
25
      if value_jetzt = 'value_ende' then
26
      end if
27
    end if
28
    end if
29
  end process
30
  
31
  zahl_aus <= value_jetzt;
32
end count

Ich würde mich über Hinweise und Verbesserungen freuen.

von PittyJ (Gast)


Lesenswert?

Was sagt den der Übersetzer dazu?
Für mich fehlt nach groben Überfliegen mindestens ein Semikolon. (Die 
Toolchain habe ich nur auf der Arbeit installiert)

Ich benutze immer den Simulator zu testen. Also Testbench erstellen und 
gucken, was der Code macht. Alles andere bringt nichts, da mußt du 
durch.

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


Lesenswert?

Igor schrieb:
> process(clk)
>   begin
>     value_jetzt <= zahl_anfang
>     if clk = '1' then
1. Die Sensitivliste ist nicht vollständig : zahl_anfang fehlt. Oder 
andersrum: wo hast du gesehen, dass in einem Prozess vor dem Takt eine 
Zuweisung kommt?
2. Das ist ein Latch, weil nirgends ein Takt vorkommt. Der Synthesizer 
braucht das Keyword 'event um einen Takt zu erkennen. Das ' event ist 
z.B. auch in rising_edge() drin...

PittyJ schrieb:
> Ich benutze immer den Simulator zu testen
Lustigerweise wird das Dank der Sensitivliste im Simulator sogar wie 
gewünscht funktionieren. Aber der Synthesizer schert sich einen feuchten 
Kehrricht um diese Liste  und wird da eine kombinatorische Schleife 
anmosern.

Siehe dazu das da:
http://www.lothar-miller.de/s9y/archives/42-Kombinatorische-Schleifen.html

: Bearbeitet durch Moderator
von Igor (Gast)


Lesenswert?

Jetzt hab ich das auch übersetzen lassen:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
entity zaehler is port(
6
  clk :    in std_logic;
7
  zahl_anfang :  in unsigned(3 downto 0);
8
  zahl_ende :   in unsigned(3 downto 0);
9
  zahl_aus :  out unsigned(3 downto 0)
10
  );
11
end zaehler;
12
13
architecture count of zaehler is
14
  signal value_jetzt: unsigned(3 downto 0);
15
  signal value_ende: unsigned(3 downto 0);
16
  signal value_anfang: unsigned(3 downto 0);
17
begin
18
19
  process(clk)
20
  begin
21
    if (clk'event and clk = '1') then
22
      value_jetzt <= zahl_anfang;
23
      value_jetzt <= value_jetzt + 1;
24
    if value_jetzt = "1111" then
25
      value_jetzt <= value_jetzt - 1;
26
      if value_jetzt = value_ende then
27
      end if;
28
    end if;
29
    end if;
30
  end process;
31
  
32
  zahl_aus <= value_jetzt;
33
end count;

Lothar Miller schrieb:
>1. Die Sensitivliste ist nicht vollständig : zahl_anfang fehlt. Oder
>andersrum: wo hast du gesehen, dass in einem Prozess vor dem Takt eine
>Zuweisung kommt?

Das hatte ich aus dem Bespiel(seite 23) aus dieser Seite:
>http://wwwi10.lrr.in.tum.de/~eti/Vorlesung/WS1718/Informationsmaterial/VHDL_Tutorial.pdf

von Matthias (Gast)


Lesenswert?

Obiger Code wird nicht richtig funktionieren:
-Die erste Zuweisung an value_jetzt wird ignoriert.
-wenn der Wert x"F" hat, dann zählt er nur einmal runter, dann wieder 
hoch.
-Du brauchst noch eine Unterscheidung für Rauf- & Runterzählen.
-...

Wirf wirklich mal die Simulation an. Das ist gar nicht so kompliziert. 
Das musst du früher oder später sowieso mal machen.

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


Lesenswert?

Matthias schrieb:
> -Die erste Zuweisung an value_jetzt wird ignoriert.
Ich sehe das eher so, dass "die letzte Zuweisung gewinnt".
Letztlich bleibt es sich gleich: der Zähler zählt einfach weiter.
Und wenn er bei 15 ankommt, dann hüpft er mit jedem Takt zwischen 14 und 
15 hin- und her.

> Wirf wirklich mal die Simulation an
Das ist die einzige sinnvolle Strategie. Und dann sind Initialwerte für 
die Register sinnvoll.

Igor schrieb:
> Das hatte ich aus dem Bespiel(seite 23) aus dieser Seite:...
Da hast du was falsch verstanden. Das Beispiel dort hat keinen 
derartigen Fehler.

: Bearbeitet durch Moderator
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.