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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren