mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL Zähler mit beliebiger Breite


Autor: theFloe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verwende erst seit kurzem VHDL auf einem Cyclone mit Quartus II.
Ich habe mir einen 8bit Zähler zusammengebaut und will diesen jetzt
universeller machen.
Ich habe das irgendwo schon mal mit Latches oder Speicherbausteinen
gesehen, dass man die Bus-Breite als Parameter angibt.

Das sieht bei mir im Moment so aus:
COUNTER_0: counter
  generic map (WIDTH => 8)
  port map (Din => cnt0 , Clk=>Clk, Clr_n=>'1', enable=>'1', Cout =>
Cout0);
COUNTER_1: counter
  generic map (WIDTH => 16)
  port map (Din => cnt1 , Clk=>Clk, Clr_n=>'1', enable=>'1', Cout =>
Cout1);

Jedoch bei COUNTER_1 bekomme ich folgenden Fehler:
Error: VHDL expression error at Comm.vhd(81): expression has 16
elements, but must have 8 elements

Zeile 81 ist die bei Counter_1 mit port map(...)

Der Zähler selber sieht so aus:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;



ENTITY counter IS
  generic (WIDTH : Integer := 8);
  PORT
  (
    Din    : IN  std_logic_vector(WIDTH-1 downto 0);
    Clk    : IN  STD_LOGIC;
    Clr_n  : IN  STD_LOGIC;
    enable  : IN  STD_LOGIC;
    Cout  : OUT  STD_LOGIC
  );

END counter;

ARCHITECTURE a OF counter IS
  SIGNAL  value  : std_logic_vector(WIDTH-1 downto 0);
BEGIN

  PROCESS (Clk, Clr_n)
  BEGIN

    IF Clr_n = '0' THEN
      value <= Din;
    ELSIF rising_edge(Clk) THEN
        IF enable = '1' THEN
          value <= value - 1;
        ELSE
          value <= value;
        END IF;

        IF value = 0 then
          Cout <= '1';
          value <= Din;
        ELSE
          Cout <= '0';
        END IF;

    END IF;
  END PROCESS;

END a;


Was ist mein Fehler bzw. wie mache ich das mit der variablen Breite
richtig?

Autor: Ines (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo theFloe,

auf Anhieb sehe ich keinen Fehler :-|. Evtl. hast Du die Länge von cnt1
falsch angesetzt. Ist das Siganl 16 Bit breit?

Ines

Autor: theFloe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ines,

cnt1 hat 16bit:

signal cnt1 : std_logic_vector(15 downto 0) := (others=>'0');

hier noch die component deklaration mir der ich den Zähler einbinde:

component counter
  generic (WIDTH : integer);
  PORT
  (
    Din    : IN  std_logic_vector(7 downto 0);
    Clk    : IN  STD_LOGIC;
    Clr_n  : IN  STD_LOGIC;
    enable  : IN  STD_LOGIC;
    Cout  : OUT  STD_LOGIC
  );
end component;

Autor: Ines (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, da scheint mir der Hund begraben zu liegen. Probiers mal statt
  Din    : IN  std_logic_vector(7 downto 0);

folgende Zeile in der Component Declaration:
  Din    : IN  std_logic_vector(WIDTH-1 downto 0);

Gruß
Ines

Autor: theFloe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
arrr... das ist peinlich...

ja das wars, habe es vergessen zu ändern!

Danke!

Autor: high_speed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo theFloe
IF enable = '1' THEN
   value <= value - 1;        
ELSE
   value <= value;        
END IF;
Kann vereinfacht werden.
Die "ELSE"-Verzweigung ist überflüssig und wird wegoptimiert.
[VHDL]
IF enable = '1' THEN
   value <= value - 1;
END IF;
[VHDL]
Bei einem größeren Projekt ist man über jede Vereinfachung dankbar, da
dadurch die Übersichtlichkeit verbessert wird.

MfG
Holger

Autor: theFloe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, der else zweig stammt noch von einer vorhergehenden zähler den
ich dann umgebaut habe.

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.