Eine andere Alternative, wenn es sehr schnell sein soll, wäre eine
parallele Verarbeitung. Allerdings entsteht dabei eine Monsterlogik
Du bestimmst erst die Position der ersten "1" der Maske parallel:
1 | pos <= 0 when mask(0) = '1' else
|
2 | 1 when mask(1 downto 0) = "10" else
|
3 | 2 when mask(2 downto 0) = "100" else
|
4 | 3 when mask(3 downto 0) = "1000" else
|
5 | .....
|
6 | n when mask(n downto 0) = "100...0";
|
Diesen wert von pos verwendest du dann, um einen Slice aus dem
Ergebnisvektor nach der Maskierung herauszuschneiden und Richtung MSB
hin mit Nullen aufzufüllen.
n sei dabei die größe der Vektoren (n downto 0)
1 | ergebnis(n-pos downto 0) <= maskierter_vektor(n downto pos);
|
2 | ergebnis(n downto n+1-pos) <= (others => '0');
|
also so:
Position: n 0
Eingangsdaten: 01010101110
Maske: 00001111000
Durch Maske gewählte Daten: 00000101000
Position: n 0
herausgeschnittene Daten: 00000000101
Ressourcenschonend ist das nicht gerade, aber vollkommen parallel und
somit ganz ohne einen Takt möglich.
Hoff, ich hab keinen Denkfehler drin ;-)