Wie gerne möchte man in VDHL für einen Vektorvergleich einfach wie bei einer Vektor-Zuweisung
signal vec: std_logic_vector(3 downto 0);
vec <= (others => '0');
den (others => '0') Konstrukt verwenden und schreiben:
erg <= '1' when vec = (others => '1') else '0';
Aber dann hagelt es bei Verwendung der genormten numeric_std nur Fehlermeldungen
Warum denn?
Und wie kann ich den Vektor trotzdem mit so einem generischen Vergleich machen?
Der einfache Grund warum dieser Vergleich nicht funktioniert, ist, dass keine definierte Wortbreite für den Vergleichsektor da ist. Und damit ist die Länge von
(others => '1')
erst mal unbekannt. Der Synthesizer stellt sich also doof und meckert:
"Ich kann den linken Vektor nicht mit einem Vektor unbekannter Breite vergleichen!"
Also muß ihm das gesagt werden. So geht es mit manueller Bereichsangabe:
erg <= '1' when vec = (3 downto 0 => '1') else '0';
Und so wird automatisch der Bereich des Vektors verwendet:
erg <= '1' when vec = (vec'range => '1') else '0';
Natürlich gilt das vorherige auch für if-Abfragen und i.A. für Vergleiche.
if vec = (3 downto 0=>'0') then..
if vec = (vec'range =>'0') then..
Ein Vergleich mit einem Zahlenwert muß bei Verwendung der numeric_std ein wenig konvertiert und gecastet werden. Hier wird einfach die Wortbreite ('length) des Vektors angegeben:
if vec = std_logic_vector(to_unsigned(5,vec'length)) then...