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;
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!
> 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!
> 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!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.