Готовый секундомер на ПЛИС. код написан на зайлинкс. VHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
entity Timer is
port
(
clk : in std_logic; --входной тактовый сигнал
reset : in std_logic; --кнопка сброса
start : in std_logic; --кнопка пуска
stop : in std_logic; --кнопка останова
sseg : out std_logic_vector(6 downto 0); --сегменты индикатора
anode : out std_logic_vector(3 downto 0) --аноды семисегментных индикаторов
);
end Timer;
architecture Behavioral of Timer is
signal en_cou : std_logic := '0'; --разрешение работы счётчика секунд
signal cou : integer range 0 to 49999999 := 0; -- для счёта секунд
signal cou_scan : unsigned(16 downto 0) := (others =>'0'); --счетчик переключения анодов
signal sec : integer range 0 to 15 := 0; --единицы секунд
signal d_sec : integer range 0 to 15 := 0; --десятки секунд
signal segments : integer range 0 to 15 := 0; --цифра для отображения на текущем индикаторе
begin
-- счётчик
process(clk, reset) begin
if reset = '1' then -- сброс - счётчик не считает, разрешение счёта обнуляется, значение обнуляется
en_cou <= '0';
cou <= 0;
elsif clk event and clk = '1' then --если не сброс, то счётчик работает
if start = '1' then --кнопка старт нажата
en_cou <= '1';
elsif stop = '1' then --кнопка стоп нажата
en_cou <= '0';
end if;
if en_cou = '1' then --сам счетчик таймера
if cou = 49999999 then --49999999 тактов = 1 секунда
cou <= 0;
if sec = 9 then --9
sec <= 0;
if d_sec = 6 then --6
d_sec <= 0;
else
d_sec <= d_sec + 1;
end if;
else
sec <= sec + 1;
end if;
else
cou <= cou + 1;
end if;
else
cou <= cou;
sec <= sec;
d_sec <= d_sec;
end if;
end if;
end process;
-- переключение индикаторов
process(clk) begin
if clk event and clk = '1' then
cou_scan <= cou_scan + 1;
if cou_scan(16) = '0' then
anode <= "0001";
segments <= sec;
else
anode <= "0010";
segments <= d_sec;
end if;
end if;
end process;
--декодирование цифры на семисегментный индикатор
with segments select
sseg <= "0000110" when 1, --1
"1011011" when 2, --2
"1001111" when 3, --3
"1100110" when 4, --4
"1101101" when 5, --5
"1111101" when 6, --6
"0000111" when 7, --7
"1111111" when 8, --8
"1101111" when 9, --9
"1110111" when 10, --A
"1111100" when 11, --b
"0111001" when 12, --C
"1011110" when 13, --d
"1111001" when 14, --E
"1110001" when 15, --F
"0111111" when others; --0
end Behavioral;
<script>
источник: программист из infomonster
проверили на работоспособность =)
если надо ucf-ка, скину
Показать полностью