У меня проблема, вызванная этим интерфейсом клавиатуры. Я пытаюсь сделать цифровое пианино с клавиатурой и усилителем, но звук не появляется, когда мы нажимаем кнопку; есть 1-секундная задержка. Можете ли вы помочь мне с этой проблемой, пожалуйста? Кроме того, когда мы изменяем часть кодаОшибка задержки клавиатуры PS2/VHDL
Shift2_next <= Shift1(0) & Shift2(10 downto 1);
в
Shift2_next <= PS2Df & Shift2(10 downto 1);
ключ дает звук мгновенно, как хотелось, но теперь звук не прекращается; в этом случае код прерывания поврежден. Надеюсь, ты поможешь. Благодарю.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity keyboard_ctrl is
port(
clk25 : in STD_LOGIC;
PS2C : in STD_LOGIC;
PS2D : in STD_LOGIC;
xkey : out STD_LOGIC_VECTOR(16 downto 1)
);
end keyboard_ctrl;
architecture keyboard of keyboard_ctrl is
signal PS2Cf, PS2Df: std_logic;
signal PS2Cf_next, PS2Df_next: std_logic;
signal ps2c_filter, ps2d_filter: std_logic_vector(7 downto 0);
signal shift1,shift2: std_logic_vector(10 downto 0);
signal shift1_next,shift2_next: std_logic_vector(10 downto 0);
begin
xkey <= shift1(8 downto 1)&shift2(8 downto 1);
-- filter for PS2 clock and data
filter: process(clk25)
begin
if clk25'event and clk25 = '1' then
ps2c_filter(7) <= PS2C;
ps2c_filter(6 downto 0) <= ps2c_filter(7 downto 1);
ps2d_filter(7) <= PS2D;
ps2d_filter(6 downto 0) <= ps2d_filter(7 downto 1);
PS2Cf <= PS2Cf_next;
PS2Df <= PS2Df_next;
end if;
end process filter;
PS2Cf_next <= '1' when ps2c_filter = X"FF" else
'0' when ps2c_filter = X"00" else
PS2Cf;
PS2Df_next <= '1' when ps2d_filter = X"FF" else
'0' when ps2d_filter = X"00" else
PS2Df;
--Shift used to clock in scan codes from PS2--
shift: process(PS2Cf)
begin
if (PS2Cf'event and PS2Cf = '0') then
shift1 <= shift1_next;
shift2 <= shift2_next;
end if;
end process shift;
Shift1_next <= PS2Df & Shift1(10 downto 1);
Shift2_next <= Shift1(0) & Shift2(10 downto 1);
end keyboard;
Эта конструкция не имеет синхронизации ввода дважды FF (это необходимо для протокола PS2). Это не синхронный дизайн, потому что «shift1» и «shift2» синхронизируются с самогенерируемым тактовым сигналом -> использование позволяет улучшить эту часть. Почему вы используете фильтр AND на ps2c и ps2d? Вы можете предположить, что эти провода сбойны. Ваша схема не обращает внимания на: простаивание шины, состояние запуска, четность, конечное состояние шины. – Paebbels