www.mikrocontroller.net

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


Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Duke Scarring (Gast)
Datum:

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

Duke

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
  alleseins <= '1' when vektor = (vektor'range=>'1') else '0';

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: dito (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-) )

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 -> ???

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

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

0

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal 2 Schleifen zum Thema.
1. Variante entsprechend der Aufgabe
   variable result std_logic := '1';
   for i in vektor'range loop
      result := vektor(i) AND result;
   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
   variable result std_logic := '1';
   for i in vektor'range loop
      if  vektor(i)='0' then 
         result:='0'; 
      end if;
   end loop;

Autor: Andreas B. (loopy83)
Datum:

Bewertung
0 lesenswert
nicht 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?
result <= '1' when A = 2**"Anzahl der Bits" else '0'

Autor: dito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
2**("Anzahl der Bits" - 1)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
result <= '1' when A = std_logic_vector(to_unsigned(2**Anzahl_der_Bits-1),A'length)) else '0'
-- oder
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... ;-)

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.