Rov-lab 3000 [7 segment 구동하기]
모르는사람이라도 적어도 한번쯤을 봤을법한데요.. 바로 숫자나 간단한 알파벳 등을 표현해주는 display입니다. 바로 좌측 사진과 같은 모습을 하고있지요.
Rov-lab 3000에는 6개의 7 segment가 있는데요, VHDL을 이용하여 7segment를 구동하는 소스를 구현해 보겠습니다.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;entity segment is
Port ( FPGA_RSTB : in STD_LOGIC;
FPGA_CLK : in STD_LOGIC;
SEG_A : out STD_LOGIC;
SEG_B : out STD_LOGIC;
SEG_C : out STD_LOGIC;
SEG_D : out STD_LOGIC;
SEG_E : out STD_LOGIC;
SEG_F : out STD_LOGIC;
SEG_G : out STD_LOGIC;
SEG_DP : out STD_LOGIC;
DIGIT : out STD_LOGIC_VECTOR (6 downto 1));
end segment;architecture Behavioral of segment is
signal delay_cnt : std_logic_vector (19 downto 0);
signal delay_clk : std_logic;
signal digit_int : std_logic_vector (5 downto 0);
signal key : std_logic_vector (3 downto 0);
signal seg : std_logic_vector (7 downto 0);begin
process(FPGA_RSTB,FPGA_CLK)
begin
if FPGA_RSTB = '0' then
delay_cnt <= (others => '0');
elsif rising_edge (FPGA_CLK)then
if delay_cnt = X"FFFFF" then
delay_cnt <= (others => '0');
delay_clk <= not delay_clk;
else
delay_cnt <= delay_cnt + 1;
delay_clk <= delay_clk;
end if;
end if;
end process;
process(FPGA_RSTB, delay_clk)
begin
if FPGA_RSTB = '0' then
digit_int <= "000001";
elsif rising_edge (delay_clk) then
digit_int <=digit_int (4 downto 0) & digit_int(5);
end if;
end process;
DIGIT <= digit_int;
seg_a <= seg(7);
seg_b <= seg(6);
seg_c <= seg(5);
seg_d <= seg(4);
seg_e <= seg(3);
seg_f <= seg(2);
seg_g <= seg(1);
seg_dp <= seg(0);
process(FPGA_RSTB, delay_clk)
begin
if FPGA_RSTB = '0' then
key <= (others => '0');
elsif rising_edge (delay_clk) then
if key = X"F" then
key <= (others => '0');
else
key <= key + 1;
end if;
end if;
end process;
process(key)
begin
case key is
--abcdefgdp
when X"0" => seg <= "11111101";
when X"1" => seg <= "01100001";
when X"2" => seg <= "11011011";
when X"3" => seg <= "11110011";
when X"4" => seg <= "01100111";
when X"5" => seg <= "10110111";
when X"6" => seg <= "10111111";
when X"7" => seg <= "11100101";
when X"8" => seg <= "11111111";
when X"9" => seg <= "11110111";
when X"a" => seg <= "11111011";
when X"b" => seg <= "00111111";
when X"c" => seg <= "10011101";
when X"d" => seg <= "01111011";
when X"e" => seg <= "10011111";
when X"f" => seg <= "10001111";
when others => seg <= (others => '0');
end case;
end process;
end Behavioral;
7segment에는 8개의 LED가 들어있습니다.
왼쪽 사진과 같이(클릭해서 보세요) a~f, 그리고 점을 표시하는 DP가 있습니다.
이 8개의 조합으로 숫자가 만들어지는 것이지요..
예를 들어 when X"0" => seg <= "11111101"; 라는 라인에서
각각의 자리는 a, b, c, d, e, f, dp 로 구성되어 있는데 1이면 on, 0이면 off 입니다.
그래서 11111101 로 셋팅하면 7segment에 0 이 표시되게 됩니다.
위의 VHDL을 합성한 후 iMPACT 를 실행하여 FPGA에 다운로드하고 동작상황을 보면 아래 사진과 같은 모습을 볼수 있습니다.






댓글을 달아 주세요