--
-- VHDL을 이용한 FPGA 설계
--
-- 3장. Section08. '1' 개수 카운터
--
library ieee;
use ieee.std_logic_1164.all;
entity OneCounter is
port (
d : in std_logic_vector (7 downto 0);
seg : out std_logic_vector (6 downto 0)
);
end OneCounter;
architecture arc of OneCounter is
-- convert integer value to drive 7-segment
--
function toSeg(
in_value : in integer range 0 to 15
) return std_logic_vector is
begin
case in_value 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 "1011000";
when 8 => return "0000000";
when 9 => return "0011000";
when 10 => return "0001000";
when 11 => return "0000011";
when 12 => return "0100111";
when 13 => return "0100001";
when 14 => return "0000110";
when 15 => return "0001110";
when others => return "1111111";
end case;
end toSeg;
begin
process (d)
variable oneCount : integer;
begin
oneCount := 0;
for i in d'range loop
if d(i) = '1' then
oneCount := oneCount + 1;
end if;
end loop;
seg <= toSeg(oneCount);
end process;
end arc;