2014-12-25 2 views
0

У меня проблема, вызванная этим интерфейсом клавиатуры. Я пытаюсь сделать цифровое пианино с клавиатурой и усилителем, но звук не появляется, когда мы нажимаем кнопку; есть 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; 
+0

Эта конструкция не имеет синхронизации ввода дважды FF (это необходимо для протокола PS2). Это не синхронный дизайн, потому что «shift1» и «shift2» синхронизируются с самогенерируемым тактовым сигналом -> использование позволяет улучшить эту часть. Почему вы используете фильтр AND на ps2c и ps2d? Вы можете предположить, что эти провода сбойны. Ваша схема не обращает внимания на: простаивание шины, состояние запуска, четность, конечное состояние шины. – Paebbels

ответ

0

При использовании PS2 вы должны изменить дизайн синхронно. Я рекомендую вам проверить часы для PS2, убедитесь, что он подключен к выходу 25 МГц или попробуйте использовать часы с более высокой частотой и разделите его, пока не получите правильное время. Прикрепленный пример деления часы на 3, вы можете изменить его и использовать его

С наилучшими пожеланиями,

library ieee; 
    use ieee.std_logic_1164.all; 
    use ieee.std_logic_unsigned.all; 

entity divide_by_3 is 
    port (
     cout :out std_logic; -- Output clock 
     clk :in std_logic; -- Input clock 
     reset :in std_logic -- Input reset 
    ); 
end entity; 

architecture rtl of divide_by_3 is 
    signal pos_cnt :std_logic_vector (1 downto 0); 
    signal neg_cnt :std_logic_vector (1 downto 0); 
begin 
    process (clk, reset) begin 
     if (reset = '1') then 
      pos_cnt <= (others=>'0'); 
     elsif (rising_edge(clk)) then 
      if (pos_cnt = 2) then 
       pos_cnt <= pos_cnt + 1; 
      end if; 
     end if; 
    end process; 

    process (clk, reset) begin 
     if (reset = '1') then 
      neg_cnt <= (others=>'0'); 
     elsif (falling_edge(clk)) then 
      if (neg_cnt = 2) then 
       neg_cnt <= neg_cnt + 1; 
      end if; 
     end if; 
    end process; 

    cout <= '1' when ((pos_cnt /= 2) and (neg_cnt /= 2)) else 
      '0'; 
end architecture; 
------------------------------------------------------- 
-- Testbench to check the divide_by_3 logic 
------------------------------------------------------- 
library ieee; 
    use ieee.std_logic_1164.all; 
    use ieee.std_logic_textio.all; 
    use std.textio.all; 

entity div3_tb is 
end entity; 
architecture test of div3_tb is 

    signal cout :std_logic; 
    signal clk :std_logic := '1'; 
    signal reset :std_logic := '1'; 

    component divide_by_3 is 
    port (
     cout :out std_logic; 
     clk :in std_logic; 
     reset :in std_logic 
    ); 
    end component; 
begin 

    -- Generate clock 
    clk <= not clk after 10 ns; 
    reset <= '0' after 20 ns; 

    Inst_div3 : divide_by_3 


     port map (
      cout => cout, -- Output 
      clk => clk, -- Input 
      reset => reset -- Iinput 
     ); 
    end architecture 

; 
Смежные вопросы