library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity Vector2BCD is
Generic ( stellen : natural := 5; -- Anzahl BCD-Stellen
breite : natural := 16); -- Breite des Eingangsvektors
Port ( vector : in std_logic_vector (breite-1 downto 0);
bcd : out std_logic_vector (4*stellen-1 downto 0));
end Vector2BCD;
architecture behave of Vector2BCD is
begin
bcdproc: process(vector)
variable z : unsigned(stellen*4+breite downto 0) := (others=>'0');
begin
z := resize(unsigned(vector),z'length);
for i in 0 to breite-1 loop
for s in 0 to stellen-1 loop
if (unsigned(z(vector'length+s*4+3 downto vector'length+s*4+0))>4) then
z(z'left downto vector'length+s*4+0) := z(z'left downto vector'length+s*4+0)+3;
end if;
end loop;
z := z(z'left-1 downto 0) & '0';
end loop;
bcd <= std_logic_vector(unsigned(z(z'left downto breite)));
end process bcdproc;
end behave;
So schön sich das Ganze liest, ist doch ein gehöriger Aufwand zur Realisierung nötig: 581 Slices bzw. 1080 LUTs werden auf einem Spartan3 verwendet, um die Logik zur Umwandlung eines 16-bit Vektors in eine 5-stellige BCD-Zahl abzubilden. Dass das Ergebnis aufwendig ist, sieht man an der Durchlaufzeit, die ca. 100ns beträgt und am RTL-Schaltplan. Hier ein kleiner Auszug davon:
Ein kleiner Ausschnitt aus dem RTL-Schaltplan
Dieser Ansatz ist also nur geeignet, wenn Ressourcen keine Rolle spielen.