реклама на сайте
подробности

 
 
> Clock multiplexing в VHDL, Или "как менять один сигнал в двух процессах"
drozel
сообщение Feb 3 2011, 18:45
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 108
Регистрация: 2-02-11
Пользователь №: 62 650



Начал изучать 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;
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 08:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01355 секунд с 7
ELECTRONIX ©2004-2016