Forum: FPGA, VHDL & Co. else-Zweig wird nicht ausgeführt


von Robert K. (Firma: Projektleiter Medizinsoftware) (robident)


Lesenswert?

Ich habe ein seltsames Problem:

Ein else-Zeig wird nicht ausgeführt und die darin verborgene Bedingung 
nicht getestet. Folgende Ausgangssituation: Es gibt mehrer 
Möglichkeiten, wann ein matched Signal "an" sein soll, die sich 
gegenseitig komplett ausschließen. Der Einfachheit halber habe ich es 
mit IFs realsiert.

1
if grundbedingung = '1' then
2
3
    if option1 = '1' then
4
        matched <= '1';
5
6
    elsif option2 ='1' then
7
        matched <= '1';
8
            
9
    elsif option3 ='1' then
10
        matched <= '1';
11
12
    else
13
        matched <= '0';
14
    end if;
15
16
else
17
    matched <= '0';
18
         
19
end if;

Das funktioniert auch. Nun ist es aber so, dass die option 2 und 3 
unterschieden werden sollen. option 2 soll nur dann geprüft werden, wenn 
ein counter_bit high ist, ansonsten sollen alle "matched" für option 2 
weggeblendet werden. Daher habe ich es so formuliert wie unten, was 
bezüglich der option 2 auch klappt - sie reagiert nur in jedem 2. Fall.
1
if grundbedingung = '1' then
2
3
    if option1 = '1' then
4
        matched <= '1';
5
6
    elsif count(3) = '1' then
7
8
        if option2 ='1' then
9
            matched <= '1';
10
        else
11
            matched <= '0';
12
        end if;
13
            
14
    else -- count(3) nicht 1
15
16
        if option3 ='1' then
17
            matched <= '1';
18
        else
19
            matched <= '0';
20
        end if;
21
22
       
23
        matched <= '0';
24
    end if;
25
         
26
else
27
    matched <= '0';
28
         
29
end if;

Leider wird aber die konkurrente option 3 (eine leicht modifizierte 2) 
nicht angefahren! Wenn ich schreibe if count(3) = '0', dann verhält sich 
alles erwartungsgemäss invers - aber wieder wird die 3 nicht 
angesprungen.

Ich kann sogar statt der 3 eine komplette Kopie der 2 dort hin 
schreiben, was dazu führen müsste, dass die Fallunterscheidung gemäss 
counter logisch rausfiele - sie wird aber nicht angesprungen.

Woran kann das liegen?

von mr. mo (Gast)


Lesenswert?

Es könnte sein, dass es bei dir etwas anders ist, aber normalerweise 
vergleicht man mit == und nicht mit =.

Also:
if(variable == 10) {
mach dies
}
else {
tu das
}

Ein einfaches = ist in der Regel eine Zuweisung.

von Robert K. (Firma: Projektleiter Medizinsoftware) (robident)


Lesenswert?

naja, das hätte man freundlicher formulieren können ,,,

@mr. mo
Danke dennoch für Deine Bemühungen!

Ich habe es gefunden:

das vorletzte matched muss raus, weil es wie eine art default die 
bedingung zu überschreiben scheint.

von Georg A. (georga)


Lesenswert?

> das vorletzte matched muss raus, weil es wie eine art default die
> bedingung zu überschreiben scheint.

Es überschreibt das Ergebnis für jeden Fall wo count(3)/=1. Das würde 
es sogar in einer normalen Sprache tun ;)

von quasimodulo (Gast)


Lesenswert?

R. K. schrieb:
> Leider wird aber die konkurrente option 3 (eine leicht modifizierte 2)
>
> nicht angefahren!
Wie kann man ein Signal den 'leicht' modifizieren?

von Robert K. (Firma: Projektleiter Medizinsoftware) (robident)


Lesenswert?

quasimodulo schrieb:
>> nicht angefahren!
>
> Wie kann man ein Signal den 'leicht' modifizieren?

die Bedingung ist eine andere, nicht das Signal. Ist aber nicht 
Gegenstand des Poblems. Nun geht es.

von user (Gast)


Lesenswert?

mr. mo schrieb:
> Es könnte sein, dass es bei dir etwas anders ist, aber normalerweise
> vergleicht man mit == und nicht mit =.
>
> Also:
> if(variable == 10) {
> mach dies
> }
> else {
> tu das
> }
>
> Ein einfaches = ist in der Regel eine Zuweisung.

Diese Aussage ist aber nur für C/C++ gültig, wir reden hier aber von 
VHDL

von Tom (Gast)


Lesenswert?

user schrieb:
> Diese Aussage ist aber nur für C/C++ gültig, wir reden hier aber von
>
> VHDL

wurde bereits gesagt,
allerdings in einer Form, die gelöscht werden musste

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.