www.mikrocontroller.net

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


Autor: Urs (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.STD_LOGIC_ARITH.ALL;
--use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.numeric_std.all;

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

architecture arch of Integrator is

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

begin
--register
  process(count,reset)
    begin
      if(reset='1')then
        r_reg <= (others=>'0');
      elsif(count'event and count = '1')then
        r_reg <= r_next;
      end if;
  end process;  

--next state logic
r_next <= r_reg+1 when updown = '1' else
r_next <= r_reg-1 when updown = '0' else
r_reg;  

--output logic
integrator <=std_logic_vector(r_reg);

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

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
   r_next <= r_reg+1 when updown='1' else  r_reg-1;

BTW: warum zählst du nicht direkt im getakteten Teil?
  process(count,reset)
    begin
      if(reset='1')then
        r_reg <= (others=>'0');
      elsif(count'event and count = '1')then
        if (updown ='1') then   
          r_reg <= r_reg+1;
        else
          r_reg <= r_reg-1;
        end if; 
      end if;
  end process;  

Autor: Urs (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wenn wir es ganz ordnetlich machen wollen, dann bitte so:
signal r_reg : unsigned(N-1 downto 0) := 0;

...

process(count,reset)
  begin
    if(count'event and count = '1')then
      if(reset='1')then
        r_reg <= (others=>'0');
      elsif (updown ='1') then
        r_reg <= r_reg+1;
      else
        r_reg <= r_reg-1;
      end if; 
    end if;
  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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.