Forum: FPGA, VHDL & Co. Vektor mit sich selbst verunden in VHDL


von Erdin (Gast)


Lesenswert?

Morgen!

Kurze blöde Frage: wie kann man in VHDL nen std_logic_vector mit sich 
selbst bitweise verunden? Sprich: es soll nur 1 sein, wenn alle Elemente 
1 sind.

von Duke Scarring (Gast)


Lesenswert?

Erdin schrieb:
> es soll nur 1 sein, wenn alle Elemente
> 1 sind
Du suchst die Funktion and_reduce.

Duke

von Erdin (Gast)


Lesenswert?

Ist das in der IEEE library inkludiert?
Zumindest kann es nicht in IEEE.STD_LOGIC_1164.ALL, 
IEEE.STD_LOGIC_ARITH.ALL
oder IEEE.STD_LOGIC_UNSIGNED.ALL gefunden werden.

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


Lesenswert?

> std_logic_vector mit sich selbst bitweise verunden?
Es gibt mehrere Arten, das zu beschreiben. Eine Schleife dürfte die 
naheliegendste Variante sein. Aber ich würde das anders lösen:
1
  alleseins <= '1' when vektor = (vektor'range=>'1') else '0';

von Erdin (Gast)


Lesenswert?

Das schaut ja sehr elegant aus =) !
Vielen Dank dafür!
In Verilog hat man die Funktion ja noch billiger bekommen, muss mich 
hier aber mit VHDL auseinandersetzen. Muss man ja auch können =D !

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Erdin schrieb:
> In Verilog hat man die Funktion ja noch billiger bekommen,

Vor allem inklusive X-propagation. Die bekommt man in VHDL nur mit einer 
Schleife hin.

--
Marcus

von Oli (Gast)


Lesenswert?

Sagt mal, was heisst "mit sich selbst verunden"?

A UND A ist doch A! Und "wenn alle 1 sind" heisst einfach IF A=255 (für 
einen 8bit-Vektor).

Was ist hier denn gemeint?

von dito (Gast)


Lesenswert?

Oli schrieb:
> Sagt mal, was heisst "mit sich selbst verunden"?

Das erste Bit verundet mit dem zweiten Bit, dieses Ergebnis verundet mit 
dem dritten Bit usw. (etwas unglücklich formuliert ist es trotzdem ;-) )

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Oli schrieb:
> A UND A ist doch A! Und "wenn alle 1 sind" heisst einfach IF A=255 (für
> einen 8bit-Vektor).

Dann hast Du immer noch kein X-propagation ;-)

--
Marcus

von Oli (Gast)


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

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Oli schrieb:
> Irgendwie meint ihr etwas anderes. Ich hätte gerne mal das Ergebnis für
> den Vektor 240
>
> 11110000 -> ???

0

von Oli (Gast)


Lesenswert?

Und warum?  Weil die ersten 4 Verundungen noch eine 1 ergeben, während 
die 5. die 0 ergibt und bleibt, da 0 und irgendwas immer 0 ergibt.

Oder braucht man auch die Zwischenergebnisse für irgendwas?

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


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;

von Andreas B. (loopy83)


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'

von dito (Gast)


Lesenswert?

2**("Anzahl der Bits" - 1)

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


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... ;-)

von J. S. (engineer) Benutzerseite


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.

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.