Vektor mit sich selbst verunden in VHDL

Gast #1770222
Lesenswert?
• ▲
▼
>Das erste Bit verundet mit dem zweiten Bit, dieses Ergebnis verundet
> mit dem dritten Bit

Bitte??? Das läuft doch auf darauf hinaus, daß das Ergenis nur dann 1 
ist, wenn alle 1 sind, also das Maximum des Vektors erreicht war.

Irgendwie meint ihr etwas anderes. Ich hätte gerne mal das Ergebnis für 
den Vektor 240

11110000 -> ???
Moderator (Firma: Titel) Persönliche Seite #1770252
Lesenswert?
• ▲
▼
Hier mal 2 Schleifen zum Thema.
1. Variante entsprechend der Aufgabe
1
   variable result std_logic := '1';
2
   for i in vektor'range loop
3
      result := vektor(i) AND result;
4
   end loop;

2. Variante
> Das läuft doch auf darauf hinaus, daß das Ergenis nur dann 1
> ist, wenn alle 1 sind, also das Maximum des Vektors erreicht war.
Invertiert bedeutet das: wenn keine 0 drin ist
1
   variable result std_logic := '1';
2
   for i in vektor'range loop
3
      if  vektor(i)='0' then 
4
         result:='0'; 
5
      end if;
6
   end loop;
#1770297
Lesenswert?
• ▲
▼
Ich verstehe das Problem auch nicht ganz.
Die Schleifen von Lothar sind logisch und nachvollziehbar.
Aber das Ergebnis ist 1, wenn keine 0 im Vektor vorkommt.
Wieso kann man dann nicht direkt den Maximalwert des Vectors abfragen?
1
result <= '1' when A = 2**"Anzahl der Bits" else '0'
Moderator (Firma: Titel) Persönliche Seite #1770330
Lesenswert?
• ▲
▼
> Aber das Ergebnis ist 1, wenn keine 0 im Vektor vorkommt.
Das ist eine VerUNDung...

> Wieso kann man dann nicht direkt den Maximalwert des Vectors abfragen?
Weil ein Vektor per Definition eigentlich keinen Wert hat. Er ist nur 
eine Aneinanderreihung von einzelnen Bits. Das ist z.B. bei einem 
Statusregister der Fall.

Wenn du also einen Vektor mit einer Zahl vergleichen willst, mußt du vor 
dem Vergleich erst mal entweder den Vektor in eine Zahl oder die Zahl in 
einen Vektor umwandeln.
Und 2**"Anzahl der Bits" ist eins zu viel...  :-o
1
result <= '1' when A = std_logic_vector(to_unsigned(2**Anzahl_der_Bits-1),A'length)) else '0'
2
-- oder
3
result <= '1' when to_integer(unsigned(A))) = 2**Anzahl_der_Bits-1 else '0'

EDIT:
>> 2**"Anzahl der Bits"
> 2**("Anzahl der Bits" - 1)
Auch falsch... ;-)
Persönliche Seite #1771751
Lesenswert?
• ▲
▼
> Wenn du also einen Vektor mit einer Zahl vergleichen willst, mußt du
> vor dem Vergleich erst mal entweder den Vektor in eine Zahl oder die
> Zahl in einen Vektor umwandeln.

In Computersprachen ist das so und dort kostet es Rechenzeit.

In VHDL wird es elementar aufgebaut und zwar unabhängig davon, ob man es 
in einer Loop-Schleife fromuliert oder mit dem direkten Vergleich. Es 
sind n elementare Und-Gatter, die in LUTs gemapped werden.

Es ist faktisch vollkommen Wurscht, wie man es beschreibt. Ich tendiere 
zur expliziten Lösung mit dem Maximalwertvergleich. Das gilt auch, wenn 
ein Bit irgendwo in diesem ominösen Vektor auf "Aus" geprüft werden 
sollte.

Einfach ein Not davor und Ende.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren