www.mikrocontroller.net

Forum: FPGA, VHDL & Co. zähler mittels for-schleife funtioniert nicht


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo! ich möchte folgendes mit vhdl realisieren:
ich möchte immer wieder in Anz die anzahl der nebeneinander im array 
LEDon stehenden '1'-werte zählen und wenn keine werte mehr nebeneinander 
stehen (Anz=0)soll ende den wert '1' bekommen sonst 0 bleiben!
leider funktioniert das nicht so wie ich mir das dachte! kann mir jemand 
helfen??

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 Search IS
PORT
(
        LEDon  : IN STD_LOGIC_VECTOR(81 DOWNTO 1);
  Ende  : OUT STD_LOGIC:=0
);
END Search;

ARCHITECTURE SearchEnd OF Search IS
SIGNAL Anz: INTEGER:=0;
BEGIN
SE:PROCESS(LEDon)
BEGIN
FOR i IN 1 TO 80 LOOP
   IF LEDon( i ) = '1' AND  LEDon( i + 1 ) = '1' THEN
    Anz<=Anz+1;
   END IF;
END LOOP;
IF Anz = 0 THEN Ende <= '1';END IF;
Anz <= 0;
END PROCESS SE;
END SearchEnd;

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

Bewertung
0 lesenswert
nicht lesenswert
Du hast ein Problem mit dem Signal Anz. Signale werden immer erst am 
Ende des Prozesses zugewiesen. Deshalb wird hier als Ergebnis Anz 
entweder 0 oder 1 sein...

Du brauchst für diese eigenartige Aufgabe eine /Variable/:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;

ENTITY Search IS
PORT
( LEDon  : IN STD_LOGIC_VECTOR(81 DOWNTO 1);
  Ende   : OUT STD_LOGIC
);
END Search;

ARCHITECTURE SearchEnd OF Search IS
BEGIN
  SE:PROCESS(LEDon)
  Variable Anz: INTEGER:=0;
  BEGIN
    Anz := 0;
    FOR i IN 1 TO 80 LOOP
--      IF LEDon( i ) = '1' AND  LEDon( i + 1 ) = '1' THEN  -- So
      IF LEDon(i+1 downto i) = "11" THEN                   -- oder so
        Anz:=Anz+1;
      END IF;
    END LOOP;
    IF Anz = 0 THEN 
      Ende <= '1';
    else
      Ende <= '0';
    END IF;
  END PROCESS SE;
END SearchEnd;

Ich würde es aber noch koürzer schreiben, und gleich beim Auftreten 
einer "11" abbrechen:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;

ENTITY Search IS
PORT
( LEDon  : IN STD_LOGIC_VECTOR(81 DOWNTO 1);
  Ende   : OUT STD_LOGIC
);
END Search;

ARCHITECTURE SearchEnd OF Search IS
BEGIN
  SE:PROCESS(LEDon)
  BEGIN
    Ende <= '1';                          -- Defaultwert
    FOR i IN 1 TO 80 LOOP
      IF LEDon(i+1 downto i) = "11" THEN 
        Ende <= '0';
        exit;                             -- "11" gefunden --> Ende
      END IF;
    END LOOP;
  END PROCESS SE;
END SearchEnd;
Damit spare ich mir das Mitzählen von "11" Kombinationen, denn offenbar 
reicht es aus, wenn mindestens eine aufgatreten ist...


Viel hilft viel...
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;
Siehe zu dem Thema den 
Beitrag "Re: Mittelwertberechnung aus vier 8-Bit Zahlen"


BTW:
Aus deinem Code:
  Ende  : OUT STD_LOGIC:=0
Du streust dir selber Sand ins Auge, wenn du einem nichtspeichernden 
Signal einen Defaultwert zuweist!

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Du hast ein Problem mit dem Signal Anz. Signale werden immer erst am
> Ende des Prozesses zugewiesen. Deshalb wird hier als Ergebnis Anz
> entweder 0 oder 1 sein...

das muss man ja ertmal wissen ... sowas passiert wenn man so nen tollen 
prof hat ;-)

leider ist trotzdem beim simulieren im vector waveform file der ausgang 
ende dauerhaft auf '1' auch wenn der komplette vektor mit '1' 
beschrieben ist!

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich würde es aber noch koürzer schreiben, und gleich beim Auftreten
> einer "11" abbrechen:...

> Damit spare ich mir das Mitzählen von "11" Kombinationen, denn offenbar
> reicht es aus, wenn mindestens eine aufgatreten ist...

stimmt es reicht ein einziges auftreten dieser kombination!
auch wenn ich sonst den unterschied nicht ganz verstehen funktioniert
diese kürzere variante ziemlich gut! vielen dank für die schnelle 
hilfe!!

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

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> leider ist trotzdem beim simulieren im vector waveform file der ausgang
> ende dauerhaft auf '1' auch wenn der komplette vektor mit '1'
> beschrieben ist!
Ja, weil das Signal Anz erst am Ende des Prozesses (also nach der 
Abfrage) den letzten Wert zugewiesen bekommt. Eine Variable übernimmt 
den Wert sofort, allerdings ist sie nur lokal in der Prozedur 
sichtbar...
(und komm mir jetzt bloß keiner mit den Shared Variablen, die sind m.E. 
nur ein gutgemeinter Versuch, einem Softwerker die Hardwarebeschreibung 
oberflächlich zu vereinfachen)

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.