Форум программистов, компьютерный форум, киберфорум
Программируемая логика: ПЛИС, ПАИС
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 92

Определить нажатие клавиши

30.01.2025, 04:17. Показов 329. Ответов 0

Author24 — интернет-сервис помощи студентам
В VHDL пытаюсь определить нажатие клавиши. Идея такая: если нажата клавиша, то key1 = '0' читаю клавишу через 0,1 с и если опять '0' то считаю нажатой, изменяю переменную номера состояния, и гашу часть светодиодов. Но меняет состояние до нажатия кнопки.
Code Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
 
 
library ieee;
use ieee.std_logic_1164.all;
 
package my_package is
  type t_Row_Col is array (0 to 3) of STD_LOGIC_VECTOR(7 DOWNTO 0);
  TYPE state IS (s_init,s_wait, s_select, s_paid, s_pouring, s_err);
  TYPE drink IS (d_esp, d_cof, d_cap, d_lat); 
end package;
 
library ieee;
use ieee.std_logic_1164.all;
use work.my_package.all; 
 
ENTITY Homework12_3 IS 
PORT ( 
  clk, key1, key2, key3, key4 : IN STD_LOGIC;
  
  enable   : out STD_LOGIC_VECTOR(3 DOWNTO 0);
  seg      : buffer STD_LOGIC_VECTOR(7 DOWNTO 0);
  led1,led2,led3,led4: buffer STD_LOGIC
 ); 
 END Homework12_3; 
 ---------------------------------------------------------- 
 ARCHITECTURE fsm OF Homework12_3 IS 
 SHARED VARIABLE product : drink:= d_esp;
   
 SIGNAL status: state := s_wait; 
 signal seg1 : t_Row_Col := ("11111111","11111111","11111111","11111111");
 
 shared variable clk_Microsecond : natural range 0 to 200 := 0;
 shared variable counter : natural range 0 TO 1000000 := 0;
 SHARED VARIABLE led_cnt : natural range 0 TO 150000 := 0;
 SHARED VARIABLE price : natural range 0 TO 100 := 0;
 SHARED VARIABLE err_del: natural range 0 to 20 := 0;
 shared variable k1cnt : natural range 0 to 1000000 := 0;
 signal Key1copy:STD_LOGIC;
 --signal button : natural range 0 to 5 := 0;
 
 
 BEGIN
 
 microsecond : process
-- полагаю что clk_Microsecond  будет обнуляться каждые 5 микросекунд
    begin
     wait until falling_edge(clk);
     clk_Microsecond := clk_Microsecond + 1;
 end process microsecond;
 Count : process -- а здесь counter каждые 5 секунд
    begin
    wait until clk_Microsecond = 0;
     counter := counter + 1;
 end process Count;
  
 FSM : PROCESS(clk, key1, key2, key3, key4)
 
 BEGIN 
         
     key1copy <= key1;
     if status = s_init then
        if  key1 = '1' and key2 = '1' and key3 = '1' and key4 = '1' and key1'last_value = '1' and key2'last_value = '1' and key4'last_value = '1' and key4'last_value = '1' then
            k1cnt := 0; status <= s_wait;
             seg <= "10110000";
         else
            seg <= "11100000";
             
         end if;
     end if;
           if counter rem 10 = 1 then
 
 
           case status is               --150000 это порядка 0,75 с.
              when s_wait => if counter < 150000 or (counter > 300000 and counter <450000) or (counter > 600000 and counter < 750000) or (counter > 900000 and counter <985000) then -- 
                    led1 <='1';led2 <= '1';led3 <='1'; led4 <= '1';
                 else
                        led1 <='0';led2 <= '0';led3 <='0';led4 <= '0';
                 end if;        
                 if k1cnt /= 0 and counter = 5 then
                    k1cnt := 0;
                     
                        if key1 = '0' then
                        status <= s_select;
                         end if;
                     
                 end if;
                 if (key1copy = '0'and key1copy'last_value = '0' and k1cnt = 0) then 
                     k1cnt := (counter + 20000) rem 1000000;
                            
                 end if;         
                          
                          
                 when s_select =>
                    led1 <='0';led2 <= '0';led3 <='1';led4 <= '1';
 
                 when others =>
                    led1 <='1';led2 <= '1';led3 <='1';led4 <= '0';
             end case;
        end if;  
 END PROCESS FSM;
end fsm;
Вероятно игнорируется значение переменной counter и задержка не происходит. Как можно реализовать задержку работающую в процессе FSM?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.01.2025, 04:17
Ответы с готовыми решениями:

Отловить нажатие клавиш PS/2 клавиатуры на ATMeg-е
Мне нужно принять байт от клавиатуры и сохранить его в буфер. Тут я ознакомился с протоколом PS2 для клавиатуры К ножке int0...

Отловить нажатия клавиш через клавиатуру PS/2
Подключаю клавиатуру PS/2 к Arduino. Использую библиотеку PS2Keyboard отправляю считанные клавиши на COM порт. Скажите пожалуйста как при...

Счетчик нажатий клавиш
Здравствуйте! Тема моего курсового проекта - разработка цифрового таймера. На просторах инета нашел прекрасно разобранный вариант...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.01.2025, 04:17
Помогаю со студенческими работами здесь

Запись сканкодов клавиш в EEPROM
Задача: устройство на МК серии Atmega (или ATTINY) считывает сканкоды с USB клавиатуры, только основные клавиши без клавиш...

Ошибка при компиляции скетча на запись сканкодов клавиш на SD карту
Есть такой код, при компиляции выдает ошибку: keylogger.ino: In function 'void setup()': keylogger:89: error: a function-definition is...

Обработка клавиш. Таймер для нужд RTOS.
В обычных программах всё делаю в прерывании - обработка дребезга/нажатия/отпускания клавиш. Т.к. прерывания завязаны на таймер и его точное...

Дублирование клавиш клавиатуры. Ищу простое решение.
Уделите пару минут внимания, помогите советом! Дино: PS\2 102 клавиши клавиатура Найти: Способ дублирования клавиш с самым...

самодельная клавиатура 3x4 (матрица клавиш) для МК
Нужна клавиатура 3x4 для сигнализации (внутреннее исполнение без корпуса, с выводом кнопок на лицевую панель устройства). В идеале наличие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
std::mutex в C++: Советы и примеры использования
bytestream 03.04.2025
std::mutex - это механизм взаимного исключения, который гарантирует, что критический участок кода выполняется только одним потоком в каждый момент времени. Это простое, но могущественное средство. . .
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
Метод с двумя буферами (или double buffering) или ping-pong buffering
Hrethgir 02.04.2025
Из ответов LM модели. Метод, который предполагает использование двух массивов для хранения промежуточных результатов сложения векторов, обычно применяется в сценариях, где необходимо минимизировать. . .
На любовном киберфронте
Alexander-7 01.04.2025
Недавно на одном малоизвестном сайте знакомств мною заинтересовалась девушка: «Текст немного странный. Но, судя по адресу почты, иностранка», – подумал я. Поколебавшись пару суток, я ответил ей:. . .
Как работает Node.js изнутри
run.dev 29.03.2025
Node. js изменил подход к разработке веб-приложений, позволив использовать JavaScript не только на стороне клиента, но и на сервере. Созданный в 2009 году Райаном Далем, этот открытый,. . .
Моки в Python: Mock Object Library
py-thonny 29.03.2025
Тестирование кода требует особого подхода, когда речь идёт о компонентах, взаимодействующих с внешним миром. Мы часто сталкиваемся с непредсказуемостью HTTP-запросов, чтением данных из базы или. . .
JavaScript: Управление памятью и улучшение производительности
run.dev 29.03.2025
В отличие от низкоуровневых языков программирования, JavaScript не требует ручного выделения и освобождения памяти. Здесь работает автоматический сборщик мусора, который определяет, какие объекты. . .
Мультитенантная архитектура со SpringBoot и PostgreSQL
ArchitectMsa 29.03.2025
SaaS-приложения редко обслуживают одного клиента и обычно они должны поддерживать множество организаций, каждая из которых работает в своём изолированном пространстве. Мультитенантная архитектура. . .
std::span в C++: Производительность и лучшие практики
NullReferenced 28.03.2025
std::span — одно из самых недооценённых нововведений стандарта C++20, которое радикально меняет подход к работе с непрерывными последовательностями данных. По сути, это невладеющее представление. . .
Многопоточность в C#: Threadpool
UnmanagedCoder 28.03.2025
Пул потоков в C# — это коллекция заранее созданных и готовых к использованию потоков, которые находятся в распоряжении приложения. Вместо того чтобы создавать и уничтожать потоки для каждой небольшой. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер