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


von Stefan (Gast)


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;

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


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/:
1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
USE IEEE.NUMERIC_STD.ALL;
4
5
ENTITY Search IS
6
PORT
7
( LEDon  : IN STD_LOGIC_VECTOR(81 DOWNTO 1);
8
  Ende   : OUT STD_LOGIC
9
);
10
END Search;
11
12
ARCHITECTURE SearchEnd OF Search IS
13
BEGIN
14
  SE:PROCESS(LEDon)
15
  Variable Anz: INTEGER:=0;
16
  BEGIN
17
    Anz := 0;
18
    FOR i IN 1 TO 80 LOOP
19
--      IF LEDon( i ) = '1' AND  LEDon( i + 1 ) = '1' THEN  -- So
20
      IF LEDon(i+1 downto i) = "11" THEN                   -- oder so
21
        Anz:=Anz+1;
22
      END IF;
23
    END LOOP;
24
    IF Anz = 0 THEN 
25
      Ende <= '1';
26
    else
27
      Ende <= '0';
28
    END IF;
29
  END PROCESS SE;
30
END SearchEnd;

Ich würde es aber noch koürzer schreiben, und gleich beim Auftreten 
einer "11" abbrechen:
1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
USE IEEE.NUMERIC_STD.ALL;
4
5
ENTITY Search IS
6
PORT
7
( LEDon  : IN STD_LOGIC_VECTOR(81 DOWNTO 1);
8
  Ende   : OUT STD_LOGIC
9
);
10
END Search;
11
12
ARCHITECTURE SearchEnd OF Search IS
13
BEGIN
14
  SE:PROCESS(LEDon)
15
  BEGIN
16
    Ende <= '1';                          -- Defaultwert
17
    FOR i IN 1 TO 80 LOOP
18
      IF LEDon(i+1 downto i) = "11" THEN 
19
        Ende <= '0';
20
        exit;                             -- "11" gefunden --> Ende
21
      END IF;
22
    END LOOP;
23
  END PROCESS SE;
24
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...
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;
Siehe zu dem Thema den 
Beitrag "Re: Mittelwertberechnung aus vier 8-Bit Zahlen"


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

von Stefan (Gast)


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!

von Stefan (Gast)


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!!

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


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)

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.