Üblicherweise geht man beim Umwandeln von Binär nach BCD so vor, dass die Einerstelle gewandelt wird, danach der Rest durch 10 geteilt wird, dann die Zehnerstelle gewandelt wird und so fort.
Die bei diesem Verfahren nötige Division kann umgangen werden, wenn die Wandlung auf der höchsten BCD-Stelle druchgeführt und danach der Rest mit 10 multipliziert wird.
Der Quellcode macht wahrscheinlich gleich klar, wie das gemeint ist:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Vector2BCD is Port ( clk : in std_logic; vector : in std_logic_vector (15 downto 0); start : in std_logic; busy : out std_logic; bcd : out std_logic_vector (19 downto 0)); end Vector2BCD; architecture Behavioral of Vector2BCD is type states is (idle,calc); signal state : states := idle; signal stelle : integer range 0 to 4; signal wert : integer range 0 to 100000; begin process variable x : integer range 0 to 100000; begin wait until rising_edge(clk); busy <= '0'; case state is when idle => wert <= to_integer(unsigned(vector)); if (start='1') then stelle <= 4; busy <= '1'; state<=calc; end if; when calc => x := wert; if (x>=90000) then x:=x-90000; bcd(stelle*4+3 downto stelle*4) <= x"9"; elsif (x>=80000) then x:=x-80000; bcd(stelle*4+3 downto stelle*4) <= x"8"; elsif (x>=70000) then x:=x-70000; bcd(stelle*4+3 downto stelle*4) <= x"7"; elsif (x>=60000) then x:=x-60000; bcd(stelle*4+3 downto stelle*4) <= x"6"; elsif (x>=50000) then x:=x-50000; bcd(stelle*4+3 downto stelle*4) <= x"5"; elsif (x>=40000) then x:=x-40000; bcd(stelle*4+3 downto stelle*4) <= x"4"; elsif (x>=30000) then x:=x-30000; bcd(stelle*4+3 downto stelle*4) <= x"3"; elsif (x>=20000) then x:=x-20000; bcd(stelle*4+3 downto stelle*4) <= x"2"; elsif (x>=10000) then x:=x-10000; bcd(stelle*4+3 downto stelle*4) <= x"1"; else bcd(stelle*4+3 downto stelle*4) <= x"0"; end if; wert <= x*10; if stelle=0 then busy <= '0'; state <= idle; else busy <= '1'; stelle <= stelle-1; end if; end case; end process; end Behavioral;
Der Ressourcenverbrauch bei dieser Wandlung hält sich auf einem Spartan3 noch in erträglichen Grenzen: 78 Slices sind wegen der 146 verwendeten LUTs nötig.
Hier noch ein Screenshot der Waveform (weil Bilder immer mehr sagen als Worte):