|
|
VHDL schnipsel or vectorbits
[Bearbeiten] Oder (OR) über alle bits eines VektorAus dem Forum : http://www.mikrocontroller.net/forum/read-9-397817.html [Bearbeiten] AufgabeWie fasse ich einen STD_LOGIC_VECTOR(15 downto 0) so zusammen, dass das Ausgangssignal '1' ist, sobald eines der Vektor-Bits auf '1' ist? Also eine OR-Verknüpfung über den ganzen Vektor? Ein OR von allen einzelnen Bits kann es ja wohl nicht sein: out_sig <= '1' when in(0) or in(1) or ... in(15) else '0'; [Bearbeiten] LösungFasst man die Aufgabe wortwörtlich auf, ist die Lösung eine Schleife (LOOP) mit einer Variablen. Codebeispiele finden sich am Schluss. Kürzere Lösungen beruhen auf den Vergleich mit einem konstanten Vector aus bits mit dem Wert '0'. Das Synthesetool setzt einen solchen Vergleich in optimale Hardware um, also wird es alle bits wie gefordert ver- "OR" -en: [Bearbeiten] Konvertierung nach unsigned und Vergleich
Größer/Kleiner als Vergleich (magnitude comparator) benötigen meist mehr Chipresourcen als der direkte Vergleich. [Bearbeiten] Innerhalb ProcessBei der Simulation enstehen (unerwünschte) Ergebnisse falls im vector bits andere Werte als '1' oder '0' aufweisen (z. B. "U" oder "Z").
[Bearbeiten] Außerhalb ProcessDie Konstante wird hier in Hex geschrieben. Statt "IF" (erfordert Process) wird eine bedingte Zuweisung beschrieben.
Mithilfe von 'range anstatt einer Konstanten:
[Bearbeiten] Als Schleife im kombinatorischen Process
[Bearbeiten] Als FunktionDiese Lösung ist unabhängig von der Bitanzahl des Vectors.
Achtung: die Loop inp'left to inp'right wird nicht durchlaufen, wenn der Vektor 'downto' definiert ist. Siehe Forumsbeiträge. Folgende Lösung vergleicht die einzelnen Bits auf '1' und bricht die Schleife ab wenn die erste '1' gefunden wurde. In der HW werden dann natürlich alle Bits verglichen.
|