Начал изучать VHDL. Первая мысль стандартна - сделать часы. Причем не просто часы, примеров коих много, а часы с подстройкой.
Инкрементор секунд тактируется 1 герцовым сигналом.
Хотелось также инкрементироватьь его кнопкой - подстройка на лету. Нет, нельзя менять один сигнал из двух процессов - ошибка драйверов.
Вторая идея - тактировать двумя сигналами - и тактовым и кнопкой. Так тоже нельзя.
Наконец сделал мультиплексирование тактового импульса. В режиме работы - это 1герц, в режиме настройки - кнопка. Выбор - переключателем.
Quartus ругается варнингом на мультиплексирование клока. Но уже лучше.
Как это делается по-человечески?
Код
BEGIN
status<="00" WHEN SW(0)='1' else
"11" WHEN SW(0)='0';
clock<=clk_1hz WHEN status="11" else
not KEY(3) WHEN status="00";
ledg(8)<= clock;
timer: process(clock)
begin
if (clock='1' and clock'event) then
if (status="11") then
--I?eaaaeyai naeoiau. Anee naeoiau = 59, iaioeyai e i?iaa?yai ieioou. Eo io?ii i?eaaaeyou, a anee e ieioou = 59, i?iaa?yai ?anu.
if (sec=59) then
sec:=0;
if(min=59) then
min:=0;
if(hour=23) then
hour:=0;
else
hour:=hour+1;
end if;
else
min:=min+1;
end if;
else
sec:=sec+1;
end if;
elsif (status="00") then
if(KEY(3)='0') then
hour:=hour+1;
end if;
end if;
shour<=hour;
smin<=min;
ssec<=sec;
--I?aia?acoai naeoiau integer a vector e BCD
HEX3<=numTo7Seg(binToBCD(ssec)(4 to 7)); --ia 7 eiaeeaoi? - noa?oea aeou BCD
HEX2<=numTo7Seg(binToBCD(ssec)(0 to 3)); --ia 6 - ieaaoea
--Ii aiaeiaee - ?anu e ieioou
HEX5<=numTo7Seg(binToBCD(smin)(4 to 7));
HEX4<=numTo7Seg(binToBCD(smin)(0 to 3));
HEX7<=numTo7Seg(binToBCD(shour)(4 to 7));
HEX6<=numTo7Seg(binToBCD(shour)(0 to 3));
HEX1<="1111111";
HEX0<="1111111";
end if;
end process timer;