library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; ------------------------------------------------------------ -- Полный одноразрядный сумматор ------------------------------------------------------------ entity full_adder is port( a : in std_logic; b : in std_logic; cin : in std_logic; s : out std_logic; cout : out std_logic ); end full_adder; architecture beh of full_adder is begin s <= a xor b xor cin; cout <= (a and b) or (a and cin) or (b and cin); end beh; ------------------------------------------------------------ -- Верхний модуль ------------------------------------------------------------ entity sum4_de2 is port( SW : in std_logic_vector(7 downto 0); HEX0 : out std_logic_vector(6 downto 0); HEX1 : out std_logic_vector(6 downto 0) ); end sum4_de2; architecture beh of sum4_de2 is component full_adder port( a : in std_logic; b : in std_logic; cin : in std_logic; s : out std_logic; cout : out std_logic ); end component; signal a, b : std_logic_vector(3 downto 0); signal sum : std_logic_vector(4 downto 0); signal c1, c2, c3 : std_logic; signal sum_int : integer range 0 to 31; signal ones_digit : integer range 0 to 9; signal tens_digit : integer range 0 to 9; -------------------------------------------------------- -- Функция перевода цифры 0..9 в код семисегментника -- Для DE2 обычно индикатор активный по нулю -------------------------------------------------------- function to_7seg(d : integer) return std_logic_vector is begin case d is when 0 => return "1000000"; when 1 => return "1111001"; when 2 => return "0100100"; when 3 => return "0110000"; when 4 => return "0011001"; when 5 => return "0010010"; when 6 => return "0000010"; when 7 => return "1111000"; when 8 => return "0000000"; when 9 => return "0010000"; when others => return "1111111"; end case; end function; begin -- Разделяем вход SW на два числа a <= SW(3 downto 0); b <= SW(7 downto 4); -------------------------------------------------------- -- 4-разрядный сумматор из 4 полных сумматоров -------------------------------------------------------- fa0: full_adder port map( a => a(0), b => b(0), cin => '0', s => sum(0), cout => c1 ); fa1: full_adder port map( a => a(1), b => b(1), cin => c1, s => sum(1), cout => c2 ); fa2: full_adder port map( a => a(2), b => b(2), cin => c2, s => sum(2), cout => c3 ); fa3: full_adder port map( a => a(3), b => b(3), cin => c3, s => sum(3), cout => sum(4) ); -------------------------------------------------------- -- Перевод суммы в integer и разделение на десятки/единицы -------------------------------------------------------- sum_int <= to_integer(unsigned(sum)); tens_digit <= sum_int / 10; ones_digit <= sum_int mod 10; -------------------------------------------------------- -- Вывод на индикаторы -------------------------------------------------------- HEX0 <= to_7seg(ones_digit); -- единицы HEX1 <= to_7seg(tens_digit); -- десятки end beh;