Kürzer geschrieben ginge es etwa so:
1 | entity MSB is
|
2 | Port ( data : in STD_LOGIC_VECTOR (31 downto 0);
|
3 | msb1 : out STD_LOGIC_VECTOR (4 downto 0));
|
4 | end MSB;
|
5 |
|
6 | architecture Behavioral of MSB is
|
7 | signal msbint1 : integer range 0 to 31;
|
8 | begin
|
9 | msbint1 <= 31 when data(31)='1' else
|
10 | 30 when data(30)='1' else
|
11 | 29 when data(29)='1' else
|
12 | 28 when data(28)='1' else
|
13 | :
|
14 | 4 when data( 4)='1' else
|
15 | 3 when data( 3)='1' else
|
16 | 2 when data( 2)='1' else
|
17 | 1 when data( 1)='1' else
|
18 | 0;
|
19 |
|
20 | msb1 <= std_logic_vector(to_unsigned(msbint1,msb1'length));
|
21 | end Behavioral;
|
Das ergibt dann eine recht aufwendige Kombinatorik:
1 | Selected Device : 3s50pq208-5
|
2 | Number of Slices: 23 out of 768 2%
|
3 | Number of 4 input LUTs: 40 out of 1536 2%
|
4 | :
|
5 | Maximum combinational path delay: 19.263ns
|
Kompakter liest sich eine For-Schleife:
1 | process (data)
|
2 | variable foundbit : std_logic;
|
3 | begin
|
4 | foundbit := '0';
|
5 | msbint2 <= 0;
|
6 | for i in 31 downto 0 loop
|
7 | if (data(i)='1' and foundbit='0') then
|
8 | msbint2 <= i;
|
9 | foundbit := '1';
|
10 | end if;
|
11 | end loop;
|
12 | end process;
|
13 |
|
14 | msb2 <= std_logic_vector(to_unsigned(msbint2,msb2'length));
|
Aber das Ergebnis ist suboptimal, weil die for-Schleife weiter
durchlaufen wird, auch wenn eine '1' gefunden wurde:
1 | Selected Device : 3s50pq208-5
|
2 | Number of Slices: 51 out of 768 6%
|
3 | Number of 4 input LUTs: 87 out of 1536 5%
|
4 | :
|
5 | Maximum combinational path delay: 24.339ns
|
Dritter Versuch: eine While-Schleife.
1 | process (data)
|
2 | variable i : integer range 0 to 31;
|
3 | begin
|
4 | i := 31;
|
5 | while (data(i)='0') loop
|
6 | i := i-1;
|
7 | end loop;
|
8 | msbint2 <= i;
|
9 | end process;
|
10 |
|
11 | msb2 <= std_logic_vector(to_unsigned(msbint2,msb2'length));
|
Damit lässt sich auch in der Laufzeit (auf Kosten einiger Slices) noch
was holen:
1 | Selected Device : 3s50pq208-5
|
2 | Number of Slices: 28 out of 768 3%
|
3 | Number of 4 input LUTs: 47 out of 1536 3%
|
4 | :
|
5 | Maximum combinational path delay: 18.821ns
|
Eine For-Schleife mit EXIT sieht so aus:
1 | process (data)
|
2 | begin
|
3 | msbint2 <= 0;
|
4 | for i in 31 downto 0 loop
|
5 | if (data(i)='1') then
|
6 | msbint2 <= i;
|
7 | exit;
|
8 | end if;
|
9 | end loop;
|
10 | end process;
|
11 |
|
12 | msb2 <= std_logic_vector(to_unsigned(msbint2,msb2'length));
|
Hier wird exakt die selbe Logik wie mit dem auscodierten Encoder
erzeugt:
1 | Selected Device : 3s50pq208-5
|
2 | Number of Slices: 23 out of 768 2%
|
3 | Number of 4 input LUTs: 40 out of 1536 2%
|
4 | :
|
5 | Maximum combinational path delay: 19.263ns
|