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.
Erdin schrieb: > es soll nur 1 sein, wenn alle Elemente > 1 sind Du suchst die Funktion and_reduce. Duke
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.
> 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'; |
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 !
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
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?
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 ;-) )
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
>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 -> ???
Oli schrieb: > Irgendwie meint ihr etwas anderes. Ich hätte gerne mal das Ergebnis für > den Vektor 240 > > 11110000 -> ??? 0
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?
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; |
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' |
> 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... ;-)
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.