2013-03-25 3 views
2

Хорошо, поэтому я пытаюсь реализовать контроллер клавиатуры для использования с платой с матрицей DE2 на DE2, и у меня есть некоторые проблемы. Я запустил этот код в симуляторе quartus, и все, кажется, делает то, что я думаю, что он должен делать. Однако, когда я пытаюсь запрограммировать его на FPGA, ничего не работает. Я нацелил его на то, как я имитирую часы ps/2, и системные часы не выглядят так, как они работают.ps/2 интерфейс клавиатуры VHDL

Я смоделировал системные часы с частотой 50 мГц, 20 нс и ps2clock с периодом 90 нс. При настройке ps2data на случайные значения во время моделирования правильные биты загружаются в 8-битный код сканирования. Проблема в том, что при запрограммированном на плате состоянии машина никогда не покидает состояние ожидания. Конечный автомат должен покинуть состояние ожидания на заднем фронте часов ps2, когда бит данных равен нулю, чего, похоже, никогда не произойдет. У меня есть контакты ps2data и ps2clock, подключенные к правильным входам, но, похоже, не могут понять проблему.

Я не добавлял объект верхнего уровня, который проверяет это, но он просто берет вывод keyCode и отправляет его на один из 7сег-дисплеев. Я чувствую, что ответ на это имеет какое-то отношение к ps2clock, им просто не известно, что именно.

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 

entity keyboard is 
    Port (Clk   : in std_logic; --system clock 
      ps2Clk  : in std_logic; --keyboard clock 
      ps2Data  : in std_logic; --keyboard data 
      reset  : in std_logic; --system reset 
      keyReady  : out std_logic; 
      DoRead  : in std_logic; -- when to read 
      keyCode  : out std_logic_vector(7 downto 0); 
      pFalling  : out std_logic; --debugging 
      pFixedClk : out std_logic_vector(1 downto 0); --debugging 
      divClock_out : out std_logic; --debugging 
      clockCount_out : out std_logic_vector(9 downto 0); --debugging 
      testDiv_out  : out std_logic; 
      bitCount_out : out std_logic_vector(3 downto 0); 
      shiftIn_out : out std_logic_vector(8 downto 0)); --debugging 
end keyboard; 

architecture Behavioral of keyboard is 

component div_counter is 
    Port(clk, reset : in std_logic; 
       Q : out std_logic_vector(9 downto 0)); 
end component div_counter; 

signal shiftIn    : std_logic_vector(8 downto 0); -- shifted in data 
signal ps2fixedClock  : std_logic_vector(1 downto 0); -- 2 bit shift register 
signal divClock    : std_logic ; -- main clock/512 
signal clockCount   : std_logic_vector(9 downto 0); -- debugging 
signal ps2falling   : std_logic ; 
signal bitCount    : std_logic_vector(3 downto 0); 
signal keyReady_sig   : std_logic; 

type state_type is (idle, shift, ready); 
signal state : state_type; 
begin 

keyReady <= keyReady_sig; 

------------------------------- 
--- counter to divide the main clock by 512 
------------------------------- 
counter : div_counter 
    Port map(clk => Clk, 
      reset => reset, 
       Q => clockCount); 

clockCount_out <= clockCount;    
divided_clock : process (clockCount) 
begin 
    if clockCount = "1000000001" then 
     divClock <= '1'; 
    else 
     divClock <= '0'; 
    end if; 
end process divided_clock;     

testDiv_out <= divClock; 
------------------------------------ 
------ 2 bit shift register to sync clocks 
------------------------------------ 
ps2fixed_Clock : process (reset, divClock) 
begin 
    if reset = '1' then 
     ps2fixedClock <= "00"; 
    elsif (divClock'event and divClock = '1') then 
     ps2fixedClock(0) <= ps2fixedClock(1); 
     ps2fixedClock(1) <= ps2Clk; 
    end if; 
end process ps2fixed_Clock; 

pFixedClk <= ps2fixedClock; 
----------------------------------- 
-------- edge detector 
----------------------------------- 
process (ps2fixedClock) 
begin 
    if ps2fixedClock = "01" then 
     ps2falling <= '1'; 
     else 
     ps2falling <= '0'; 
    end if; 
end process; 

pFalling <= ps2falling; 
bitCount_out <= bitCount; 

-------------------------------- 
------- state machine 
-------------------------------- 
state_machine : process (divClock, reset) 
begin 
    if (reset = '1') then 
     state <= idle; 
     bitCount <= "0000"; 
     shiftIn <= (others => '0'); 
     keyCode <= (others => '0'); 
     keyReady_sig <= '0'; 
    elsif (divClock'event AND divClock = '1') then 

     if DoRead='1' then 
      keyReady_sig <= '0'; 
     end if; 

     case state is 
     when idle => 
      bitCount <= "0100"; 
      if ps2falling = '1' and ps2Data = '0' then 
       state <= shift; 
      end if;   
     when shift => 
       if bitCount >= 9 then 
        if ps2falling = '1' then -- stop bit 
         keyReady_sig <= '1'; 
         keyCode <= shiftIn(7 downto 0); 
         state <= idle; 
        end if; 
       elsif ps2falling='1' then 
        bitCount <= bitCount + 1; 
        shiftIn(7 downto 0) <= shiftIn(8 downto 1); 
        shiftIn(8) <= ps2Data; 
       end if; 
     when others => 
      state <= idle; 
    end case; 
    end if; 
end process;  

shiftIn_out <= shiftIn; 
end Behavioral; 

ответ

0

вы пытаетесь синхронизировать ps2clock с вашим divClock. однако divClock - это сигнал разрешения, а не часы. он активен не очень часто.

Я предлагаю вам использовать CLK в процессе ps2fixed_Clock

ps2fixed_Clock : process (reset, clk) 
begin 
    if reset = '1' then 
     ps2fixedClock <= "00"; 
    elsif (rising_edge(clk)) then 
     ps2fixedClock(0) <= ps2fixedClock(1); 
     ps2fixedClock(1) <= ps2Clk; 
    end if; 
end process ps2fixed_Clock; 

также вы должны использовать CLK в вашем процессе

state_machine : process (clk, reset) 
begin 
    if (reset = '1') then 
     ... 
    elsif (rising_edge(clk)) then 
     ... 

state_machine, если вы хотите использовать часы делитель (процесс divided_clock), вам может генерировать сигнал разрешения (как и вы) и использовать его после, вы синхронизировали часы, например в государственной машине!

1

Возвращаясь ответить на этот вопрос чуть позже ....

Оказывается, причина, почему это не работает, потому что я использовал USB -> ps2 адаптер, а не оригинальный ps2 разъем клавиатуры.

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