Forum: FPGA, VHDL & Co. IF-Abfrage mit AND und Resultat?


von Peter B. (funkheld)


Lesenswert?

Hallo, warum kommt hier bitte kein Wahrheitswert raus bei IF mit AND :

signal wertu: unsigned(7 downto 0):="00010000";
signal data: unsigned(7 downto 0):="00010000";

if (data and wertu)=1 then
      led_g)<='1';
end if;

Danke.

von Unlogischer (Gast)


Lesenswert?

Hmm, weil beide werte gleich sind vlt.?

von Unlogischer (Gast)


Lesenswert?

Sry, vergiss meine Antwort :P

von ich (Gast)


Lesenswert?

unabhängig davon das deine klammerung falsch ist und ich grad nicht die 
genaue VHDL-syntax im Kopf hab: 00010000 != 1

von Peter B. (funkheld)


Lesenswert?

Hmm.., danke.

Es kommt auch ohne Klammer keine Fehlermeldung.
Es ist doch ein And-Vergleich der stimmt, da müsste doch Logisch 1 
rauskommen?

Gruss

von ge-nka (Gast)


Lesenswert?

So probiert?

if (data and wertu) then
      led_g <='1';
end if;

von berndl (Gast)


Lesenswert?

du kennst in C den Unterschied zwischen und und undund? Also & und &&?

von Peter B. (funkheld)


Lesenswert?

Jup, danke.
ge-nka (Gast) es funktioniert mit deinem Vorschlag.

Also & und &&?
Mit & werden Werte zusammengesetzt , nicht auf Logik untersucht.
&& gibt einen Error.

Gruss

von Gustl B. (-gb-)


Lesenswert?

Wie wäre es mit dem Vergleichsoperator = von VHDL?

if (data = wertu) then
      led_g <='1';
end if;

von Peter B. (funkheld)


Lesenswert?

----------------------
if (data = wertu) then
      led_g <='1';
end if;
---------------------

Nein, es geht darum ein bestimmtes Bit im Byte auf gleichheit mit AND 
abzufragen.

Gruss

von Daniel A. (daniel-a)


Lesenswert?

Ich kann zwar kein VHDL, aber nach dem was hier steht:

http://www.gmvhdl.com/operator.htm
> The logical operators NOT, AND, OR, NAND, NOR, and XOR can be used
> with any bit type or bit_vector. When used as operators on bits they
> have their usual meaning. When used with bit_vectors, the bit_vectors
> must have the same number of elements, and the operation is performed bitwise.
...
> Also predefined are the normal relational operators.
> They are =, /=, <, <=, > and >= and have their usual meanings
> (/= denotes the not equal operator). The result of all these operators
> is a boolean value (TRUE or FALSE)

Ziehe ich folbende schlussfolgerungen:

Das if statement braucht einen boolean als condition. Somit braucht man 
einen vergleich auf nicht null also: x /= 0

Prüfen, ob irgendein bit bei beiden gesetzt ist:
1
if ( data and wertu ) /= 0 then

Prüfen, ob bei beiden irgendein bit gesetzt ist:
1
if ( data /= 0 ) and ( wertu /= 0 ) then

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


Lesenswert?

Peter Bierbach schrieb:
> Nein, es geht darum ein bestimmtes Bit im Byte auf gleichheit mit AND
> abzufragen.
Was ist das eigentliche Problem? Im ersten Post steht schon wieder so 
halbgarer C-Code. Woher kommen die beiden Bits, die da verglichen werden 
sollen?

Wenn ich in einem Vektor gezielt ein Bit abfragen will, dann mache ich 
das über den Index:
if a(3) = b(3) then...

von Peter B. (funkheld)


Lesenswert?

Der Vector ändert sich mit den unteren 3 Bit einer Adresse von 13 Bit.
Die unteren 3 Bit Shiften dann eine 1 nach links und dann kommt die 
Bitabfrage mit data, ob da auch das Bit gesetzt ist welches gemäss der 
unteren 3 Bit von der Adresse geschoben wurde.

---------------------------------
Prüfen, ob bei beiden irgendein bit gesetzt ist:
--------------------------------
Es wird wie oben beschrieben immer nur 1 bestimmte Bit im Vector auf 
gleichheit geprüft, welches von den unteren 3 Bit der Adresse abhängt 
welches dann eine 1 von 0-7 links shiftet.

Gruss

: Bearbeitet durch User
von Schumpf (Gast)


Lesenswert?

Peter Bierbach schrieb:
> Nein, es geht darum ein bestimmtes Bit im Byte auf gleichheit mit AND
> abzufragen.

Auf Gleichheit mit AND prüfen?
Auf Gleichheit prüft man mit "="
Mit "AND" kann man nur prüfen, ob beide Bits "1" sind.

Schreibe dir doch mal die Wahrheitstabelle für ein AND auf, dann wirst 
du es sehr schnell selbst sehen, dass die Bedingung nur dann erfüllt 
ist, wenn beide Bits "1" sind.

Was willst du denn genau erreichen?
Prüfen, ob in zwei Vektoren die Bits an mindestens einer Stelle 
identisch sind?

Oder prüfen, ob in zwei Vektoren die Bits an mindestens einer Stelle in 
beiden Vektoren "1" sind?

Prüfen, ob die gesamten Vektoren identisch sind?

von Schumpf (Gast)


Lesenswert?

Sorry Peter, ich verstehe echt nicht, was du vor hast..

Du shiftest irgendwie eine "1" an eine bestimmte Stelle und willst 
schauen, ob die "1" auch dann an der Stelle ist?

Wenn du einfach nur wissen willst, ob Bit Nummer drei in deinem Vektor 
"1" ist, dann schreibe das einfach so:

if wertu(3) = '1' then

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


Lesenswert?

Schumpf schrieb:
> Auf Gleichheit mit AND prüfen?
Ich tippe, das ist die Maskiererei von C...

Peter Bierbach schrieb:
> Es wird wie oben beschrieben
Ich kapiere diese Beschreibung nicht. Du beschreibst da keine HARDWARE. 
Sondern du beschreibst, wie du das mit C machen würdest. Diese Denkweise 
ist FALSCH. Für diese Denkweise ist eine Hardwarebeschreibungssprache 
wie VHDL oder Verilog NICHT geeignet.

> Es wird wie oben beschrieben immer nur 1 bestimmte Bit im Vector auf
> gleichheit geprüft, welches von den unteren 3 Bit der Adresse abhängt
> welches dann eine 1 von 0-7 links shiftet.
Was könnte das in der Hardware sein?
Zwei 8:1 Multiplexer, die auf ein XOR gehen.

> Es wird wie oben beschrieben immer nur 1 bestimmte Bit im Vector auf
> gleichheit geprüft
Auf Gleichheit mit was?

> signal wertu: unsigned(7 downto 0):="00010000";
> signal data: unsigned(7 downto 0):="00010000";
>
> if (data and wertu)=1 then
Ich tippe, da ist tendenziell sowas gemeint:
1
    if data(adresse(2 downto 0)) = '1' then...
Falls das so ist: du musst natürlich den Index noch vom 3 Bit Vektor zum 
Integer konvertieren. Das geht über unsigned() und to_integer()...

von Schumpf (Gast)


Lesenswert?

Lothar Miller schrieb:
> Ich tippe, das ist die Maskiererei von C...

Denke ich auch. Aber damit ist er hier auf dem Holzweg.

Lothar Miller schrieb:
> Du beschreibst da keine HARDWARE.

Schön wäre ja schon, wenn er beschreiben würde, was er will. Und zwar 
so, dass man es verstehen kann.
Wie das dann geschickt in Hardware abzubilden ist und somit in VHDL zu 
beschreiben ist, könnte dann die "Aufgabe" an das Forum sein.

von Peter B. (funkheld)


Lesenswert?

-----------------------------------
Mit "AND" kann man nur prüfen, ob beide Bits "1" sind.
-----------------------------------

Das meine ich.

Bei den unteren 3 Bits(Wert 0-7) von der Adresse weiss ich ja vorher 
nicht welche kommt, darum das Shiften einer 1 nach links und dann den 
Vergleich mit AND zu Data.

Gruss

von Schumpf (Gast)


Lesenswert?

Peter Bierbach schrieb:
> -----------------------------------
> Mit "AND" kann man nur prüfen, ob beide Bits "1" sind.
> -----------------------------------
>
> Das meine ich.
>
> Bei den unteren 3 Bits(Wert 0-7) von der Adresse weiss ich ja vorher
> nicht welche kommt, darum das Shiften einer 1 nach links und dann den
> Vergleich mit AND zu Data.
>
> Gruss

Drücke dich doch bitte mal ein bisschen präziser aus.
Was shiftest du wohin?
Oder noch besser, beschreibe, WAS du machen möchtest und nicht, WIE du 
es machen möchtest.
Was ist die Adresse? Was soll mit dieser geschehen? Was willst du?

Es ist echt wahnsinnig schwer, anhand deiner unvollständiger Sätze und 
Beschreibungen zu erraten, was du meinen könntest.

von Schumpf (Gast)


Lesenswert?

Und benutze doch bitte zum zitieren die "Markierten Text 
zitieren"-Funktion unten rechts in jedem einzelnen Beitrag.

Den Text, den du zitieren möchtest markieren, auf "Markierten Text 
zitieren" klicken und schwupps, erscheint das Zitat in deinem Feld, in 
dem du schreibst.

von Peter B. (funkheld)


Lesenswert?

Danke.

Das ist es:
 if data(adresse(2 downto 0)) = '1' then...

Danke.
Gruss

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


Lesenswert?

Peter Bierbach schrieb:
> Das ist es:
>  if data(adresse(2 downto 0)) = '1' then...
Also, dann so:
1
 if data(to_integer(unsigned(adresse(2 downto 0)))) = '1' then...

von Peter B. (funkheld)


Lesenswert?

Jup, danke.

Gruss

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.