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

 
 
> Обработка нажатия кнопок
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
Ответов
Plain
сообщение Jun 21 2018, 19:42
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 6 776
Регистрация: 5-03-09
Из: Москва
Пользователь №: 45 710



В схеме по-прежнему несколько тактовых сигналов, а должен быть один 100 Гц. И стандартное решение — это цифровой автомат (FSM).

Например, создать для каждой кнопки 2-разрядный сдвиговый регистр подавления дребезга и 2-разрядный сдвиговый регистр автомата ловли её нажатия.

Соответственно, в сумме получаются 4 бита, описывающих из 16 состояний лишь два, меняющих счётчик.
Go to the top of the page
 
+Quote Post
Plain
сообщение Jun 24 2018, 11:42
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 6 776
Регистрация: 5-03-09
Из: Москва
Пользователь №: 45 710



Цитата(Plain @ Jun 21 2018, 22:42) *
создать для каждой кнопки 2-разрядный сдвиговый регистр подавления дребезга и 2-разрядный сдвиговый регистр автомата ловли её нажатия.

Цитата(aBoomest @ Jun 22 2018, 15:27)
могли бы Вы пояснить то, что написали? ... в какую схему "превращается" код конструкции if - много где показано. А вот чуть более сложные вариации - уже не найти

"Да наоборот же! ©" Сперва надо составить требуемую схему, на бумаге или в голове, а затем выбирать из десятков вариантов возможностей языка, как заставить компилятор родить её.

Сдвиговый регистр (shift register) — это в пределе просто оператор присваивания под тактом, двухбитный регистр — два таких оператора последовательно. Также, первый триггер из этой цепочки, принимая асинхронный сигнал с кнопки, делает его однозначным для всей последующей тактируемой схемы, т.е. играет важную роль пресловутого избавления от метастабильности.

В результате, сигнал с кнопки с каждым тактом начинает ползти по регистру, который таким образом становится эдакой машиной времени, позволяющей создать пороговую схему, перекидывающую выходной сигнал только когда кнопка перестала дребезжать, т.е. при достижении ею устойчивого состояния, т.е. когда её предыдущее и текущее состояние стали одинаковыми, а этот сдвиговый регистр, соответственно, в "00" или "11".

Здесь логично достать третий триггер, который будет хранить подлинное состояние кнопки, т.е. с подавленным дребезгом, и четвёртый, образующий с ним ещё одну машину времени, ещё один сдвиговый регистр, по которому ползёт уже очищенное от дребезга значение кнопки.

Итого, в наличии есть два бита регистра давилки дребезга и ещё один бит с выхода третьего триггера. Мажоритарная функция (majority function) от этих трёх бит повторяет выход третьего триггера, пока кнопка дребезжит и меняет его значение на установившееся, когда она перестаёт дребезжать, т.е. остаётся просто присвоить третьему триггеру значение данного логического выражения (созданного соответствующей комбинацией логических операторов), а четвёртому значение третьего.

Теперь можем ловить подлинно факты нажатия обеих кнопок, т.е. когда их "чистые" регистры в состоянии "01", но сперва требуется исключить запрещённую комбинацию, когда эти регистры оба в "01", при которой счётчик не должен меняться, т.е. просто условие в виде логической функции от этих четырёх бит, а в нём уже можно без оглядки двумя вложенными условиями проверять "чистые" регистры каждой из кнопок и менять счётчик.
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
- - aBoomest   Цитата(Flip-fl0p @ Jun 19 2018, 07:4...   Jun 21 2018, 18:39
|- - Flip-fl0p   Цитата(aBoomest @ Jun 21 2018, 21:39) Пе...   Jun 21 2018, 19:33
|- - iosifk   Цитата(aBoomest @ Jun 21 2018, 21:39) Не,...   Jun 21 2018, 19:54
|- - 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   У автора тактовая частота 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 Текстовая версия Сейчас: 29th July 2025 - 01:22
Рейтинг@Mail.ru


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