Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пн май 12, 2025 19:04

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 83 ]  На страницу Пред.  1, 2, 3, 4, 5, 6
Автор Сообщение
 Заголовок сообщения: Re: Консольные войны Z0Z5
СообщениеДобавлено: Пт апр 25, 2025 17:11 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 442
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 51 раз.
Поблагодарили: 3 раз.
Total Vacuum писал(а):
С наскока заработала PS/2-клавиатура ... получается гигантская бодипозитивная таблица сканкодов ... софтовый switch
"софтовый switch" обработка нажатий - по времени редко.
Обычная подпрограмма обработки редкого прерывания.

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольные войны Z0Z5
СообщениеДобавлено: Пт апр 25, 2025 18:00 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 8013
Благодарил (а): 26 раз.
Поблагодарили: 145 раз.
Total Vacuum писал(а):
И вот дальше задумался. Там же получается гигантская бодипозитивная таблица сканкодов. И нужен либо в верилоге жирный case, либо софтовый switch уже в самом процессоре. Вот мне и стало интересно, как умные люди из этой ситуации выходят. И почему, кстати, такие странные сканкоды? Словно код каждой кнопке назначал генератор случайных чисел.


Код:
: KEY
  0 LASTKEY !
  20001 INPORT 8 0 DO SHR LOOP 255 AND 0xF0 = NOT
  IF
    20001 INPORT 255 AND
    DUP 0x16 = IF 0x31 LASTKEY ! THEN
    DUP 0x1E = IF 0x32 LASTKEY ! THEN
    DUP 0x26 = IF 0x33 LASTKEY ! THEN
    DUP 0x25 = IF 0x34 LASTKEY ! THEN
    DUP 0x2E = IF 0x35 LASTKEY ! THEN
    DUP 0x36 = IF 0x36 LASTKEY ! THEN
    DUP 0x3D = IF 0x37 LASTKEY ! THEN
    DUP 0x3E = IF 0x38 LASTKEY ! THEN
    DUP 0x46 = IF 0x39 LASTKEY ! THEN
    DUP 0x45 = IF 0x30 LASTKEY ! THEN   


и так далее...

В буфере три последних сканкода, поэтому первая строка проверяет, не было ли предыдущим кодом F0 (значит это код отпускания). А дальше да, держим перед глазами таблицу со сканкодами...

И PS/2 вот такой, там есть захват фронта PSCLK с защитой от метастабильности.

Код:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity ps2key is
    Port ( clk : in STD_LOGIC;
           psclk : in STD_LOGIC;
           psdata : in STD_LOGIC;
           dq : out STD_LOGIC_VECTOR (31 downto 0));
end ps2key;

architecture Behavioral of ps2key is

signal clkr1, clkr2, clkr3 : std_logic := '0';
signal keystate : integer range 0 to 15 := 0;

signal keycnt : integer range 0 to 255;
signal keyreg : std_logic_vector(7 downto 0);
signal qreg  : std_logic_vector(31 downto 0);

begin

process(clk)
begin
  if rising_edge(clk) then
    clkr1 <= psclk;
    clkr2 <= clkr1;
    clkr3 <= clkr2;
  end if;
end process;


process(clk)
begin
  if rising_edge(clk) then
    case keystate is
      when 0 => if clkr3 = '1' and clkr2 = '0' then keystate <= 1; end if;
      when 1 => if clkr3 = '1' and clkr2 = '0' then keystate <= 2; keyreg(0) <= psdata; end if;
      when 2 => if clkr3 = '1' and clkr2 = '0' then keystate <= 3; keyreg(1) <= psdata; end if;
      when 3 => if clkr3 = '1' and clkr2 = '0' then keystate <= 4; keyreg(2) <= psdata; end if;
      when 4 => if clkr3 = '1' and clkr2 = '0' then keystate <= 5; keyreg(3) <= psdata; end if;
      when 5 => if clkr3 = '1' and clkr2 = '0' then keystate <= 6; keyreg(4) <= psdata; end if;
      when 6 => if clkr3 = '1' and clkr2 = '0' then keystate <= 7; keyreg(5) <= psdata; end if;
      when 7 => if clkr3 = '1' and clkr2 = '0' then keystate <= 8; keyreg(6) <= psdata; end if;
      when 8 => if clkr3 = '1' and clkr2 = '0' then keystate <= 9; keyreg(7) <= psdata; end if;
      when 9 => if clkr3 = '1' and clkr2 = '0' then keystate <= 10; keycnt <= keycnt + 1; qreg <= qreg(23 downto 0) & keyreg; end if;
      when 10 => if clkr3 = '1' and clkr2 = '0' then keystate <= 0; end if;
      when others => keystate <= 0;
    end case;
  end if;
end process;

dq <= conv_std_logic_vector(keycnt, 8) & qreg(23 downto 0);

end Behavioral;



За это сообщение автора Hishnik поблагодарил: Total Vacuum
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольные войны Z0Z5
СообщениеДобавлено: Сб апр 26, 2025 01:59 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 572
Откуда: Москва
Благодарил (а): 59 раз.
Поблагодарили: 28 раз.
Да, наверное, будет не совсем правильно, если перекодировать из PS2 в ASCII на стороне ПЛИС. Другой вопрос, как сделать на стороне процессора. Для скорости, возможно, вместо switch лучше предварительно инициализированный массив с кодами, ну либо два массива для кодов с префиксом 0xE0 и без оного. Если же важен размер кода, то тут надо смотреть, какой вариант более компактный код дает: switch, массив или несколько if.
Если делать а-ля текстовый редактор, то достаточно иногда опрашивать регистр, в котором хранится код последнего нажатия/отжатия. Для слепого однопальцевого метода и простых комбинаций вроде Alt+Shift вполне хватит. Более того, какие-то события безболезненно можно пропустить - тут это не смертельно, т.к. всегда можно удалить и напечатать заново, если что-то не то "нажалось".
А вот для игр это может быть критично. Там порой надо обрабатывать сразу несколько одновременных нажатий. Например, одновременно давим стрельбу и 2 стрелки (бежим по диагонали), да еще и подпрыгиваем время от времени. Тут много времени уходит на обсчет сцены и отрисовку, поэтому какие-то события рискуем пропустить. И остается либо распихивать по всем щелям вызов процедуры чтения регистра, утяжеляя тем самым код и уменьшая лимит времени для "полезной" работы, либо часть работы все же поручить ПЛИС. Например, в ПЛИС можно организовать битовый массив, каждый бит которого будет хранить текущее состояние клавиш. При нажатии соответствующий бит устанавливается в 1, а сбрасываться будет по 0xF0 + код. Места и времени много не займет.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольные войны Z0Z5
СообщениеДобавлено: Сб апр 26, 2025 02:42 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 8013
Благодарил (а): 26 раз.
Поблагодарили: 145 раз.
Ооо, это все очень интересно, поскольку вовлекает разноплановые активности в проектировании. Действительно, есть несколько уровней подключения периферии (даже встречается классификация Driver Level 0, Driver Level 1). В целом оно бывает как-то так:
1. Абсолютный минимум по аппаратуре.
В случае PS/2 это просто подключить к процессору линии CLK, DATA, и действовать по аналогии с Arduino Software Serial - периодически проверять, что там есть и программно выделять посылки.
2. Контроллер уровня "буфер для скан-кодов".
Тут уже может быть FIFO, счетчик кодов и т.д. Преобразования в ASCII и прочие функции вида "теперь надо прыгнуть влево-вверх" остаются на процессоре.
3. Контроллер с преобразованием к API прикладной программы.
Это красиво с точки зрения программы, поскольку в ней может быть действительно программный интерфейс вида "бег влево", "бег вправо", "прыжок" и т.д. Однако преобразования ложатся на HDL. Это и ресурсы (хотя и не так много), и необходимость отладки нюансов с Caps Lock + Shift (а если еще добавить Рус/Lat, то совсем интересно). Мы тут как раз в коллективе недавно подобное сравнивали - ну вот вариант 2, который выше, занял 86 строк на VHDL (там еще осталась шапка из комментариев, которую вставляет Vivado), а вариант 3 уже перевалил за 300 строк на System Verilog, и пока вроде бы не совсем завершен.

В целом же вот это все очень красиво с точки зрения архитектуры, и в этом в определенной степени сила подхода hardware&software. Совсем интересно то, что преобразование "сканкод - ASCII" с точки зрения того же hard&soft попадает в раздел "сделайте на софт-процессоре" (!). То есть теоретически к основному "процессору приложений" можно добавить еще и процессор, преобразующий коды клавиатуры в формат API прикладной программы (например, игры). Для этого уже довольно давно использовали PicoBlaze, который довольно маленький даже для старых ПЛИС. И совсем интересно, что попытка написать преобразование на HDL будет понемногу приближать получающуюся схему... к процессору! Только очень и очень специализированному, без того, чтобы сначала завести в нем много регистров, АЛУ (да еще и конвейер branch prediction :)) какой-нибудь), а потом обнаружить, что все, что ему нужно - обращаться к таблицам при очень неторопливом внешнем вводе. Так что тут очень даже интересное поле для маневрирования, и очень продуктивным оказывается практический пример. Действительно, когда оно на экране нормально бегает и прыгает от клавиатуры, это результат. И то, что помогает такой результат получить - хорошо и правильно. А теоретизировать насчет ячеек и мВт/МГц можно сколько угодно... только вот нажимаешь - а не прыгает. Поэтому и полезные вещи появляются, когда задача ставится от практики.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольные войны Z0Z5
СообщениеДобавлено: Сб апр 26, 2025 14:40 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 572
Откуда: Москва
Благодарил (а): 59 раз.
Поблагодарили: 28 раз.
Пожалуй, да, пойдем от простого к сложному. Да и то лишь в случае, если самый простой вариант PS/2 вдруг не будет справляться.

:) Да, кстати, может сложиться впечатление, что в постах выше я как бы противопоставляю ПЛИС и процессор. На самом деле там все внутри ПЛИС, в т.ч. и процессор. Правильнее было писать "на верилоге/hdl" vs. "на си/форте/асме". Наверное, это и без пояснений понятно, но на всякий, чтобы не было недопонимания.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольные войны Z0Z5
СообщениеДобавлено: Вт апр 29, 2025 10:51 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 572
Откуда: Москва
Благодарил (а): 59 раз.
Поблагодарили: 28 раз.
Надо будет сюда какой-нибудь простенький Basic запилить. Тогда станет совсем лампово :D


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольные войны Z0Z5
СообщениеДобавлено: Вт апр 29, 2025 14:12 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 442
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 51 раз.
Поблагодарили: 3 раз.
Total Vacuum писал(а):
Надо будет сюда какой-нибудь простенький Basic запилить. Тогда станет совсем лампово :D
Не помешает такое гендерное разнообразие. :)

Ты лучше популярно расскажи где брать и как туда прошивку залить, и на Форте писать.
Какой камень купить, какие параметры выжимаются, где перемотать синей православной изолентой. :)
И вообще - как это всё выглядит, для работы независимо от ПК.

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольные войны Z0Z5
СообщениеДобавлено: Чт май 01, 2025 14:06 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 572
Откуда: Москва
Благодарил (а): 59 раз.
Поблагодарили: 28 раз.
Sotnik писал(а):
Не помешает такое гендерное разнообразие
Это вопрос или утверждение?
А вообще Basic планируется лишь в качестве теста клавиатуры. :D Посему Бейсику быть. Что-то типа такого: https://en.wikipedia.org/wiki/Tiny_BASIC

Sotnik писал(а):
где брать и как туда прошивку залить
Готовой прошивки нет и быть не может. Даже если ПЛИС в точности такая же, но плата чуть другая, то в ней с вероятностью 100% не заработает, т.к. в ПЛИС (внезапно!) можно (и нужно!) переназначать ноги, да и частота "кварца" почти наверняка будет другой. Поэтому ставить среду (ISE для Spartan-3/6 или Vivado для новых Xilinx, для Gowin брать образовательную с их сайта, Altera сейчас на руках нет, для них Quartus), переназначать ноги (в файле *.ucf/*.cst для Xilinx/Gowin) и настраивать тактирование (модуль DCM/PLL в Xilinx/Gowin). И это лишь верхушка айсберга, еще придется переписывать, например, модуль вывода графики, т.к. в Spartan-3E Starter Kit VGA, а в Tang Nano 9/20K - HDMI и т.д. и т.п.

Sotnik писал(а):
на Форте писать
Если речь про мои поделки, то под них только на самодельных Си/Форте/ассемблере, компилировать на стороне ПК и шить. "Традиционного" консольного Форта нет и пока не планируется. Ну а бодипозитивному ANSI-совместимому жирдяю здесь точно не место.

Sotnik писал(а):
Какой камень купить
Любой. На свой страх и риск. Какие на руках у меня, писал в постах выше, по ним в меру своих сил/возможностей смогу подсказать.

Sotnik писал(а):
какие параметры выжимаются
Никакие. Как раз наоборот: искусственно ограничиваем объем памяти (до 64Kb) и частоту ядра (1.5МГц), чтобы оставаться в той же весовой категории, что и условные ZX Spectrum/NES.

Sotnik писал(а):
как это всё выглядит, для работы независимо от ПК.
Уже выкладывал в теме пару файлов *.bit с играми, их можно залить в Spartan-3E Starter Kit.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 83 ]  На страницу Пред.  1, 2, 3, 4, 5, 6

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB