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

 
 
> 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
 
Start new topic
Ответов
yuri_d
сообщение Feb 3 2011, 22:07
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 28-01-05
Из: МО, Мытищи
Пользователь №: 2 274



Цитата(drozel @ Feb 3 2011, 21:45) *
Как это делается по-человечески?

Проще всего прибавлять N, а не 1. Если подстройка не нужна, тогда N=1, если нужна, тогда всё что угодно (например N=2 приведёт к подстройке на 1 секунду каждую секунду).

Мулитиплексировать тактовый сигнал не стоит. В простых проектах может и пройдёт, но в реальных скорее всего вылезут сложноустранимые ошибки.
Go to the top of the page
 
+Quote Post
drozel
сообщение Feb 4 2011, 05:32
Сообщение #3


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

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



Цитата(yuri_d @ Feb 4 2011, 04:07) *
Проще всего прибавлять N, а не 1. Если подстройка не нужна, тогда N=1, если нужна, тогда всё что угодно (например N=2 приведёт к подстройке на 1 секунду каждую секунду).


Тогда прибавляться будет только по такту секунды, а не по нажатию. В часах прибавляется по нажатию.
Go to the top of the page
 
+Quote Post



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

 


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


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