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

 
 
> Обработка нажатия кнопок
aBoomest
сообщение Jun 18 2018, 18:12
Сообщение #1


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

Группа: Участник
Сообщений: 167
Регистрация: 24-12-08
Из: Россия
Пользователь №: 42 714



Всем доброго дня.
Привожу нижеследующий код:
Код
  OnButtonLeft_Down:
  process(OnBtnLeft_DownEvent)
  begin
    if rising_edge(OnBtnLeft_DownEvent) then
        if (PulsePerPeriod_VAR > 0) then
              PulsePerPeriod_VAR := PulsePerPeriod_VAR - 1;           --<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       end if;
     end if;
  end process OnButtonLeft_Down;

  OnButtonRight_Down:
  process(OnBtnRight_DownEvent)
  begin
    if rising_edge(OnBtnRight_DownEvent) then
        if (PulsePerPeriod_VAR < PulsePerPeriod_VAR_MAX) then
              PulsePerPeriod_VAR := PulsePerPeriod_VAR + 1;           --<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       end if;
     end if;
  end process OnButtonRight_Down;
(PulsePerPeriod_VAR объявлена как shared variable)
Это обработка нажатия двух кнопок (вправо, влево)
Само нажатие работает нормально, по которому я формирую "событие-сигнал" нажатия кнопки (либо правой, либо левой - по названиям процессов все понятно)
при этом обращаю внимание на выделенные две строки. Если их закоментировать - все компилируется. Если оставить одну из них - тоже компилируется. А вот обе - сразу дает ошибку.
Я чую конечно что так писать нельзя. (Переменная PulsePerPeriod_VAR в обоих процессах одна и таже)
Но почему? Не могу понять и найти объяснение. Уже неделю копаю и в инете и в книгах Бибило.
1. Может кто-нибудь популярно объяснить почему так нельзя?
2. Как реализовать нажатие нескольких кнопок, когда по нажатию надо изменять значение одного и того же параметра (в данном случае увеличить или уменьшить значение переменной PulsePerPeriod_VAR)
3. Может кто посоветовать литературу такого плана - дается к.л. конструкция кода и далее какую структуру она порождает и описание это (примеры). Не готовые схемы счетчиков и т.п. а наоборот, с т.з. языка vhdl. Код -> структура -> описание.

Сообщение отредактировал aBoomest - Jun 18 2018, 18:18


--------------------
C уважением!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aBoomest
сообщение Jun 21 2018, 18:39
Сообщение #2


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

Группа: Участник
Сообщений: 167
Регистрация: 24-12-08
Из: Россия
Пользователь №: 42 714



Цитата(Flip-fl0p @ Jun 19 2018, 07:43) *
Предлагаю все объединить в одном процессе. Заменить переменную на сигнал и таким образом описать суммирующие-вычитающий счетчик.
Цитата(aBoomest @ Jun 19 2018, 14:07) *
На счет того как засунуть в один процесс - ясно, это я тупанул жутко.
Не, чего-то и где-то я не допонимаю. sad.gif
Запихал все в один процесс, как советовали выше. И, как я понимаю, ошибка в том, что нельзя в двух местах изменять переменную PulsePerPeriod_VAR. Как из ситуации-то выходить? Если по нажатию одной кнопки мне нужно увеличить значение на 1цу, по нажатию другой, соответственно уменьшить. Существует какое-то классическое/общепринятое решение в данном случае? МОжет в этот процесс надо как-то Clock какой-нибудь добавить.
Код
  OnButtonLeftRight_Down:
  process(OnBtnLeft_DownEvent,OnBtnRight_DownEvent) -- изменение длительности импульса
  begin
    if rising_edge(OnBtnLeft_DownEvent) then
       if (PulsePerPeriod_VAR > 0) then
           PulsePerPeriod_VAR := PulsePerPeriod_VAR - 1;
       end if;
    elsif rising_edge(OnBtnRight_DownEvent) then
       if (PulsePerPeriod_VAR < PulsePerPeriod_VAR_MAX) then
           PulsePerPeriod_VAR := PulsePerPeriod_VAR + 1;
       end if;
    end if;
  end process OnButtonLeftRight_Down;


--------------------
C уважением!
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Jun 21 2018, 19:33
Сообщение #3


В поисках себя...
****

Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(aBoomest @ Jun 21 2018, 21:39) *

Первое и основное правило синхронных проектов - на тактовый вход триггера должен приходить только синхросигнал*. Т.е при вызове функции rising_edge\faling_edge использовать только синхросигнал.
Если нужно детектировать передний или задний фронт какого-либо сигнала, не являющегося тактовым - применяйте схемы, называемые детекторы фронта.
Вот кстати я недавно выкладывал свой модуль детектора фронта: https://electronix.ru/forum/index.php?showt...5&start=195

А вот кусок счетчика, который считает вверх, или вниз в зависимости от того, какие кнопки нажаты:
Код
  
   --================================================
    -- 0 разряд сигнала buttons соответствует кнопке 0
    -- 1 разряд сигнала buttons соответствует кнопке 1
    --================================================
    OnButtonLeftRight_Down : process(clk)
    begin
        if rising_edge(clk) then
            case buttons is
                when "10"   =>  PulsePerPeriod_VAR := PulsePerPeriod_VAR - 1;
                            
                when "01"   =>  PulsePerPeriod_VAR := PulsePerPeriod_VAR + 1;
                            
                when others => null;
           end case;
        end if;
    end process;

Но я бы так не делал rolleyes.gif Я бы для начала сделал обычный антидребезг и подключил его кнопкам. А реакцию схемы на нажатие кнопок обрабатывал бы простой FSM.
PS * Исключением из этого правила является специально сгенерированная на логике частота, например поделенная в 2 раза на триггере. Но даже в этом случае я предпочитаю применить PLL. Ибо частота сгенерированная на PLL имеет меньший джиттер, чем та-же частота сгенерированная на логике.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- aBoomest   Обработка нажатия кнопок   Jun 18 2018, 18:12
- - Plain   Да потому что кнопки сейчас мифические. Перейдите ...   Jun 18 2018, 19:09
- - Александр77   А может корректнее завести все в один процесс и та...   Jun 19 2018, 03:10
|- - Flip-fl0p   Предлагаю все объединить в одном процессе. Заменит...   Jun 19 2018, 04:43
- - aBoomest   Цитата(Plain @ Jun 18 2018, 22:09) Да пот...   Jun 19 2018, 06:48
|- - Flip-fl0p   ЦитатаЕсли есть знатоки как красиво делать антидре...   Jun 19 2018, 07:08
|- - _Anatoliy   Цитата(aBoomest @ Jun 19 2018, 09:48)   Jun 19 2018, 07:18
|- - Plain   Цитата(aBoomest @ Jun 19 2018, 09:48) син...   Jun 19 2018, 08:39
- - aBoomest   Цитата(Flip-fl0p @ Jun 19 2018, 10:0...   Jun 19 2018, 07:24
|- - Flip-fl0p   Цитата(aBoomest @ Jun 19 2018, 10:24) На ...   Jun 19 2018, 07:37
- - aBoomest   Цитата(Plain @ Jun 19 2018, 11:39) В этом...   Jun 19 2018, 10:47
|- - iosifk   [quote name='aBoomest' date='Jun 19 20...   Jun 19 2018, 10:52
- - aBoomest   Так точно, работает! PS: На счет того как зас...   Jun 19 2018, 11:07
|- - iosifk   Цитата(aBoomest @ Jun 21 2018, 21:39) Не,...   Jun 21 2018, 19:54
- - Plain   В схеме по-прежнему несколько тактовых сигналов, а...   Jun 21 2018, 19:42
|- - Flip-fl0p   Цитата(Plain @ Jun 21 2018, 22:42) Наприм...   Jun 21 2018, 19:53
||- - Plain   Цитата(Flip-fl0p @ Jun 21 2018, 22:5...   Jun 21 2018, 20:15
||- - Flip-fl0p   Цитата(Plain @ Jun 21 2018, 23:15) Резуль...   Jun 21 2018, 20:24
|- - Plain   Цитата(Plain @ Jun 21 2018, 22:42) создат...   Jun 24 2018, 11:42
- - Plain   У автора тактовая частота 100 Гц.   Jun 21 2018, 20:46
- - aBoomest   Спасибо всем за ответы! Все говорят и советуют...   Jun 22 2018, 05:48
|- - Flip-fl0p   Цитата(aBoomest @ Jun 22 2018, 08:48) Во...   Jun 22 2018, 06:12
|- - Plain   Цитата(aBoomest @ Jun 22 2018, 08:48) вро...   Jun 22 2018, 08:20
- - aBoomest   Цитата(Plain @ Jun 24 2018, 14:42) ...   Jun 27 2018, 19:17
|- - iosifk   Цитата(aBoomest @ Jun 27 2018, 22:17) Как...   Jun 27 2018, 19:33
|- - Plain   Цитата(aBoomest @ Jun 27 2018, 22:17) при...   Jun 27 2018, 20:17
|- - Flip-fl0p   Цитата(aBoomest @ Jun 27 2018, 22:17) Чт...   Jun 28 2018, 04:50
- - Plain   Конкретизирую по повторам. Минимальный период ручн...   Jun 28 2018, 11:53


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

 


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


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