Я пытаюсь написать код VHDL для драйвера клавиатуры, для которого мне нужно прочитать 8 бит из 11-битного вектора, чтобы все было ясно, вот процесс, который считывает входные сигналы (есть сигнал CLK и данные).
KEYBOARD_SYNC : process(CLK,SYSRESET)
begin
if (CLK'event and CLK='1') then
KEYBOARD_CLK_VECTOR <= KEYBOARD_CLK_VECTOR( 6 downto 0 ) & KEYBOARD_CLK;
RECEIVING_FLAG <='0';
if ( KEYBOARD_CLK_VECTOR = x"F0" ) then -- Falling edge
KEYBOARD_DATA_VECTOR <= KEYBOARD_DATA_VECTOR( 9 downto 0 ) & KEYBOARD_DATA;-- shifting
BIT_COUNTER <= BIT_COUNTER + 1 ;
end if;
if( BIT_COUNTER = 11 ) then
RECEIVING_FLAG <='1';
TEMP_WORD <= KEYBOARD_DATA_VECTOR( 8 downto 1 );
BIT_COUNTER <=0 ;
KEYBOARD_DATA_VECTOR <= (others =>'1');
end if ;
end if ;
end process KEYBOARD_SYNC;
PROCESSING : process ( CLK ,SYSRESET )
begin
if ( CLK'event and CLK ='1') then
if ( RECEIVING_FLAG = '1') then
ACTUAL_WORD <= TEMP_WORD;
end if ;
end if ;
end process PROCESSING;
Чтобы запустить симуляцию, я написал тестовый стенд, который должен отправлять 0xF0
, это значение должно быть сохранено в ACTUAL_WORD, вот часть тестового стенда, которая должна это делать:
-- Timing variables
constant CLK_PERIOD: time := 10 ns;
constant KEYBOARD_CLK_PERIOD: time := 80 us;
...................................................
KEYBOARD_PROCESS : process
BEGIN
-- BREAK Code
KEYBOARD_CLK <= '1';
KEYBOARD_DATA <= '0';
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '0'; --Start Bit always 0
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '1';
KEYBOARD_DATA <= '1'; -- Sending a break code 0xF0
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '0'; -- 0 Bit
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '1';
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '0'; -- 1 Bit
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '1';
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '0'; -- 2 Bit
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '1';
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '0'; -- 3 Bit
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_DATA<= '0';
KEYBOARD_CLK <= '1';
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '0'; -- 4 Bit
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '1';
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '0'; -- 5 Bit
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '1';
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '0'; -- 6 Bit
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '1';
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '0'; -- 7 Bit
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_DATA<= '1';
KEYBOARD_CLK <= '1';
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '0'; -- Parity Bit
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '1';
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '0'; -- Stop Bit always 1
wait for (KEYBOARD_CLK_PERIOD/2);
KEYBOARD_CLK <= '1';
wait for (KEYBOARD_CLK_PERIOD/2);
end process KEYBOARD_PROCESS;
Проблема в том, что я продолжаю читать 0xE1
вместо 0xF0
, все остальное работает нормально, и я не могу понять, почему мне не хватает этого бита.