Frage zu VHDL Code für Up-Down Counter

Gast #1827553
Lesenswert?
• ▲
▼
Hallo Forum,

ich bin VHDL-Einsteiger und habe gerade ein Verständnisproblem bei einem 
Zähler. Ich will einen Up-Down Counter realisieren den ich als 
Integrator nutze. Mein Code sieht so aus:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
--use IEEE.STD_LOGIC_ARITH.ALL;
4
--use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
use IEEE.numeric_std.all;
6

7
entity Integrator is
8
   Generic (N: integer := 14);
9
    Port ( updown : in  STD_LOGIC;
10
           reset : in  STD_LOGIC;
11
           count : in  STD_LOGIC;
12
           integrator : out  STD_LOGIC_VECTOR (13 downto 0));
13
end Integrator;
14

15
architecture arch of Integrator is
16

17
signal r_reg : unsigned(N-1 downto 0);
18
signal r_next : unsigned(N-1 downto 0);
19

20
begin
21
--register
22
  process(count,reset)
23
    begin
24
      if(reset='1')then
25
        r_reg <= (others=>'0');
26
      elsif(count'event and count = '1')then
27
        r_reg <= r_next;
28
      end if;
29
  end process;  
30

31
--next state logic
32
r_next <= r_reg+1 when updown = '1' else
33
r_next <= r_reg-1 when updown = '0' else
34
r_reg;  
35

36
--output logic
37
integrator <=std_logic_vector(r_reg);
38

39
end arch;

Ich nutze Xilinx ISE und als Hardware ein XC95144XL CPLD. Beim 
Synthetisieren bekomme ich immer folgende Fehlermeldung:

"Type of r_next is incompatible with type of <=."

Was kann das bedeuten? Ich wundere mich insbesondere deshalb, da der 
Quellcode aus einem Lehrbuch stammt... kann mir jemand erklären was ich 
falsch mache?

vielen Dank und viele Grüße,

Urs
Moderator (Firma: Titel) Persönliche Seite #1827646
Lesenswert?
• ▲
▼
berndl schrieb:
> schau dir diese Zeilen mal ganz genau an...
Weniger auf die Syntax als vielmehr auf den Sinn der Beschreibung 
hin...
Welchen anderen Zustand als '1' oder '0' könnte updown denn überhaupt 
annehmen?   :-o

> Beim Synthetisieren bekomme ich immer folgende Fehlermeldung:
Diese Fehlermeldung kommt nicht von der Synthese, sondern schon vom 
Syntax-Check. Du hast falsche Beschreibungselemente verwendet. Wie 
sollten diese Beschreibung richtigerweise aussehen (wenn updown nur '1' 
oder '0' sein kann)? Doch etwa so:
1
   r_next <= r_reg+1 when updown='1' else  r_reg-1;

BTW: warum zählst du nicht direkt im getakteten Teil?
1
  process(count,reset)
2
    begin
3
      if(reset='1')then
4
        r_reg <= (others=>'0');
5
      elsif(count'event and count = '1')then
6
        if (updown ='1') then   
7
          r_reg <= r_reg+1;
8
        else
9
          r_reg <= r_reg-1;
10
        end if; 
11
      end if;
12
  end process;
Gast #1827728
Lesenswert?
• ▲
▼
Hallo Lothar,

vielen Dank für die Erklärungen! Jetzt wird mir einiges klarer :-)

Stimmt, sieht auf den ersten Blick komplizierter aus als es sein müsste, 
aber ich wollte später noch einiges hinzubasteln. Habe es jetzt mit 
deinem Code gelöst und es läuft prima!

Vielen Dank nochmals!!

Euer VHDL-Anfänger
Urs
Gast #1827986
Lesenswert?
• ▲
▼
und wenn wir es ganz ordnetlich machen wollen, dann bitte so:
1
signal r_reg : unsigned(N-1 downto 0) := 0;
2

3
...
4

5
process(count,reset)
6
  begin
7
    if(count'event and count = '1')then
8
      if(reset='1')then
9
        r_reg <= (others=>'0');
10
      elsif (updown ='1') then
11
        r_reg <= r_reg+1;
12
      else
13
        r_reg <= r_reg-1;
14
      end if; 
15
    end if;
16
  end process;

also nix asynch reset!

unnötig, problematisch und designaufblähend

synchrone resets können mit anderen kombinatorischen anweisungen 
zusammengefasst werden, wenn das reg signal gebildet wird.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.