microtha

На Пикабу
рейтинг 0 подписчиков 0 подписок 1 пост 0 в горячем
Награды:
5 лет на Пикабу

Готовый секундомер на ПЛИС. код написан на зайлинкс. 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-ка, скину

Показать полностью
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества