Forum: FPGA, VHDL & Co. dekadenzähler mit VHDL


von Vorname N. (student_1)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich wollte mir ein Dekadenzähler in VHDL schreiben der von -9 bis 9 
zählen sollte, die Hochzählung funktioniert ohne Probleme, aber wenn der 
Zähler runter zählen sollte da funktioniert es nicht so wie ich das mir 
gedacht habe:
wenn der Zähler von 0 runter zählen sollte, dann zählt er nicht 0, -9, 
-8, -7..., sondern 0, -1, -2, -3,...

Was mache ich da falsch?


library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
-------------------------------------------------
entity up_down_counter is
port(
up_down    : in std_logic;
count    : in std_logic;
reset    : in std_logic;
output    : out std_logic_vector (4 downto 0);
overflow_up   : out std_logic;
overflow_down  : out std_logic
);
end up_down_counter;
-------------------------------------------------
architecture verhalten of up_down_counter is
signal temp : signed (4 downto 0)  := "00000";
signal temp_1 : integer range -10 to 10 := 0;
begin
P1: process (reset, up_down, count, temp_1)
begin
if reset = '1' then
  temp_1 <= 0;
elsif temp_1 > 9 then
  temp_1 <= 0;
elsif temp_1 < -9 then
  temp_1 <= 0;
elsif count = '1' and count'event then
if up_down = '1' then
  temp_1 <= temp_1 + 1;
else
  temp_1 <= temp_1 - 1;
end if;
end if;
end process P1;
temp <= to_signed(temp_1, temp'length);
-------------------------------------------------
-------------------------------------------------

overflow_up <= '1' when (temp_1 = 9 and up_down = '1') else '0';
overflow_down <= '1' when (temp_1 = 0 and up_down = '0') else '0';

-------------------------------------------------
output <=(std_logic_vector(temp));
-------------------------------------------------
end verhalten;

von Cle (Gast)


Lesenswert?

Vorname Nachname schrieb:

> if up_down = '1' then
>   temp_1 <= temp_1 + 1;
> else
>   temp_1 <= temp_1 - 1;


Naja, warum sollte er denn da was anderes machen?
Wenn er den Bitvektor als Zahl nach dem normalen Signed Integer 
Zahlenformat interpretiert passiert das.

von Vorname N. (student_1)


Lesenswert?

vielen Dank für den Antwort, aber ich habe nicht ganz verstanden was Sie 
meinen, ich bin relativ neu in der VHDL...

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


Lesenswert?

Vorname Nachname schrieb:
> wenn der Zähler von 0 runter zählen sollte, dann zählt er nicht 0, -9,
> -8, -7..., sondern 0, -1, -2, -3,...
Die nächste Zahl nach 0 ist -1. So lernt man das in der Schule: 
...-3,-2,-1,0,1,2,3... Und dann das selbe rückwärts: 
3,2,1,0,-1,-2,-3,...
Das stimmt also alles.

> dann zählt er nicht 0, -9, -8, -7...,
Das wäre ja auch ein ganz seltsamer Zähler, der so zählt...

> aber wenn der Zähler runter zählen sollte da funktioniert es nicht so
> wie ich das mir gedacht habe:
Du denkst anders als alle Anderen.

Noch ein Wort zu deiner Beschreibung:
1
P1: process (reset, up_down, count, temp_1)
2
begin
3
if reset = '1' then
4
  temp_1 <= 0;
5
elsif temp_1 > 9 then
6
  temp_1 <= 0;
7
elsif temp_1 < -9 then
8
  temp_1 <= 0;
9
elsif count = '1' and count'event then -- huch! hier kommt ein versteckter Takt
10
if up_down = '1' then
11
  temp_1 <= temp_1 + 1;
12
else 
13
  temp_1 <= temp_1 - 1;
14
end if;
15
end if;
16
end process P1;
Wo hast du diesen Beschreibungsstil gesehen oder gelernt?

Man macht keine asynchronen kombinatorischen Resets. Das geht in der 
Praxis schief weil es dort bei kombinatorischen Übergängen Glitches 
gibt.

Ich würde dir (neben der Verwendung einer leserlichen Formatierung!!) 
sowas vorschlagen:
1
P1: process (reset, count)
2
begin
3
  if reset = '1' then  -- muss das sein?
4
    temp_1 <= 0;
5
  and count'event then -- zuerst kommt der Takt
6
    overflow_up   <= '0';
7
    overflow_down <= '0';
8
    if count='1' then
9
      if up_down = '1' then -- hochzählen
10
        if temp_1 = 9       -- Überlauf!
11
          temp_1 <= -9;     -- so läuft der Zähler richtig über!
12
          overflow_up <= '1';
13
        else
14
          temp_1 <= temp_1 + 1;
15
        end if;
16
      else                  -- runterzählen
17
        if temp_1 = -9      -- Unterlauf!
18
          temp_1 <= 9;      -- so läuft der Zähler richtig über!
19
          overflow_down <= '1';
20
        else
21
          temp_1 <= temp_1 - 1;
22
        end if;
23
      end if;
24
    end if;
25
  end if;
26
end process P1;
Simuliere diese Beschreibung einfach mal...

: Bearbeitet durch Moderator
von Vorname N. (student_1)


Lesenswert?

Lothar Miller schrieb:
> Wo hast du diesen Beschreibungsstil gesehen oder gelernt?

Nirgendwo, ich bin ein Anfänger und lerne aus Büchern.
Ich versuche selbst das VHDL-Code für mein Vorhaben zu entwickeln und 
dann vergleiche ich mit eine richtige schreibweise und korrigiere Fehler 
(falls welche gibt)


> Man macht keine asynchronen kombinatorischen Resets. Das geht in der
> Praxis schief weil es dort bei kombinatorischen Übergängen Glitches
> gibt.

Interessante Information in dem Buch steht so was nicht,
ich weiß nicht ob Sie der Autor von der Seite 
http://www.lothar-miller.de sind, aber da habe ich erklährung für Ihre 
Anmerkung gefunden.


> Simuliere diese Beschreibung einfach mal...

Ist die Beschriebung richtig weil der Quartus gibt mir ein Haufen Fehler 
raus?


> and count'event then

diese Schreibweise akzeptiert er nicht, ich dachte dass die 
Takterkennung so beschrieben wird:
count = '1' and count'event then


> if up_down = '1' then -- hochzählen
>         if temp_1 = 9       -- Überlauf!
>           temp_1 <= -9;     -- so läuft der Zähler richtig über!

Da habe ich ein verständnisproblem:
wenn der Zählerstand von temp_1 die 9 erreicht hat, dann wird dem tepm_1 
sofort die -9 zugewiesen, oder ist das Zeichen "<=" in diesem Fall als 
Vergleichsoperator zu verstehen, dann vestehe ich die Logik trotzdem 
nicht?

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.