Öfter mal sucht man nach dem führenden Bit (aka. MSB bzw. LSB).
Hier sind einige Vorgehensweisen, dieses Bit zu finden, und dazu eine Performancebewertung.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity MSB is
Port ( data : in STD_LOGIC_VECTOR (31 downto 0);
msb1 : out STD_LOGIC_VECTOR (4 downto 0);
msb2 : out STD_LOGIC_VECTOR (4 downto 0);
msb3 : out STD_LOGIC_VECTOR (4 downto 0);
msb4 : out STD_LOGIC_VECTOR (4 downto 0));
end MSB;
architecture Behavioral of MSB is
signal msbint1 : integer range 0 to 31;
signal msbint2 : integer range 0 to 31;
signal msbint3 : integer range 0 to 31;
signal msbint4 : integer range 0 to 31;
begin
-- Beispiel 1
msbint1 <= 31 when data(31)='1' else
30 when data(30)='1' else
29 when data(29)='1' else
28 when data(28)='1' else
27 when data(27)='1' else
26 when data(26)='1' else
25 when data(25)='1' else
24 when data(24)='1' else
23 when data(23)='1' else
22 when data(22)='1' else
21 when data(21)='1' else
20 when data(20)='1' else
19 when data(19)='1' else
18 when data(18)='1' else
17 when data(17)='1' else
16 when data(16)='1' else
15 when data(15)='1' else
14 when data(14)='1' else
13 when data(13)='1' else
12 when data(12)='1' else
11 when data(11)='1' else
10 when data(10)='1' else
9 when data( 9)='1' else
8 when data( 8)='1' else
7 when data( 7)='1' else
6 when data( 6)='1' else
5 when data( 5)='1' else
4 when data( 4)='1' else
3 when data( 3)='1' else
2 when data( 2)='1' else
1 when data( 1)='1' else
0;
msb1 <= std_logic_vector(to_unsigned(msbint1,msb1'length));
-- Beispiel 2
process (data)
variable foundbit : std_logic;
begin
foundbit := '0';
msbint2 <= 0;
for i in 31 downto 0 loop
if (data(i)='1' and foundbit='0') then
msbint2 <= i;
foundbit := '1';
end if;
end loop;
end process;
msb2 <= std_logic_vector(to_unsigned(msbint2,msb2'length));
-- Beispiel 3
process (data)
begin
msbint3 <= 0;
for i in 31 downto 0 loop
if (data(i)='1') then
msbint3 <= i;
exit;
end if;
end loop;
end process;
msb3 <= std_logic_vector(to_unsigned(msbint3,msb3'length));
-- Beispiel 4
process (data)
variable i : integer range 0 to 31;
begin
i := 31;
while (data(i)='0') loop
i := i-1;
end loop;
msbint4 <= i;
end process;
msb4 <= std_logic_vector(to_unsigned(msbint4,msb4'length));
end Behavioral;
Hier das Syntheseergebnis:
Beispiel | Slices | LUT | Time |
1 | 23 | 40 | 19,263ns |
2 | 51 | 87 | 24,339ns |
3 | 23 | 40 | 19,263ns |
4 | 28 | 47 | 18,821ns |
Das aufwendig beschriebene Beispiel 1 (concurrent) gibt wie das Beispiel 3 (for-Schleife mit exit) die kompakteste Logik ab.
Am schnellsten wird dagegen die while-Scheife im Beispiel 4 umgesetzt.
Das Ergebnis für das Beispiel 2 ist suboptimal, weil die for-Schleife weiter durchlaufen wird, auch wenn eine '1' gefunden wurde.