이 키보드 인터페이스 때문에 발생하는 문제가 있습니다. 나는 키보드와 앰프로 디지털 피아노를 만들려고 노력하고 있지만 소리는 우리가 버튼을 누를 때 오지 않는다. ~ 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'는 자체 생성 클록 신호로 클럭킹되기 때문에 동기 설계가 아니므로이 부분을 향상시킬 수 있습니다. ps2c 및 ps2d에서 AND 필터를 사용하는 이유는 무엇입니까? 이 전선은 결함이 없다고 추측 할 수 있습니다. 회로는 버스 유휴 상태, 시작 조건, 패리티, 버스의 종료 상태에 아무런주의를 기울이지 않습니다. – Paebbels