Forum: FPGA, VHDL & Co. Frage zu VHDL Code für Up-Down Counter


von Urs (Gast)


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

von berndl (Gast)


Lesenswert?

Urs schrieb:
> r_next <= r_reg+1 when updown = '1' else
> r_next <= r_reg-1 when updown = '0' else
> r_reg;

schau dir diese Zeilen mal ganz genau an...

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


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;

von Urs (Gast)


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

von Michael (Gast)


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.

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


Lesenswert?

Michael schrieb:
> unnötig, problematisch und designaufblähend
Diese Aussage solltest du aber in Hinsicht auf die Zielplattform nochmal 
überdenken...  :-o
>>>> Ich nutze ... ein XC95144XL CPLD
Diese CPLDs haben dedizierte asynchrone Set- und Reset-Eingänge für die 
FFs.

von Duke Scarring (Gast)


Lesenswert?

Michael schrieb:
> und wenn wir es ganz ordnetlich machen wollen, dann bitte so:

Dann kann aber der reset noch aus der sensitivity-Liste.
Und ich empfehle "rising_edge( clk)" zu schreiben, daß liest sich 
besser.

Duke

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.