С клавой в общем все просто. По сканкодам сбрасываем в 0, или устанавливаем если первым пришел F0h, бит в массиве key[0:11]. Значимых бит в каждом байте массива 6, что соответствует раскладке клавы Специалиста(6x12). А далее при чтении из портов A,C ВВ55 туда мапится байт соответсвующий нажатым кнопкам по всем линиям, в которых установлен 0 в порту B. Ну и наоборот, при чтении из B, только те, в которых установлен 0 в портах A,C.
Вот кусок, который собирает байт для порта C, взависимости от состояния порта B (т.е. запрашиваемых линий клавиатуры) и реально нажатых кнопок на PS клаве:
wire [7:0] VV55Cin = {4'b1111, (VV55B[2] ? 1'b1 : KeyMap[11][0]) &
(VV55B[3] ? 1'b1 : KeyMap[11][1]) &
(VV55B[4] ? 1'b1 : KeyMap[11][2]) &
(VV55B[5] ? 1'b1 : KeyMap[11][3]) &
(VV55B[6] ? 1'b1 : KeyMap[11][4]) &
(VV55B[7] ? 1'b1 : KeyMap[11][5]),
(VV55B[2] ? 1'b1 : KeyMap[10][0]) &
(VV55B[3] ? 1'b1 : KeyMap[10][1]) &
(VV55B[4] ? 1'b1 : KeyMap[10][2]) &
(VV55B[5] ? 1'b1 : KeyMap[10][3]) &
(VV55B[6] ? 1'b1 : KeyMap[10][4]) &
(VV55B[7] ? 1'b1 : KeyMap[10][5]),
(VV55B[2] ? 1'b1 : KeyMap[9][0]) &
(VV55B[3] ? 1'b1 : KeyMap[9][1]) &
(VV55B[4] ? 1'b1 : KeyMap[9][2]) &
(VV55B[5] ? 1'b1 : KeyMap[9][3]) &
(VV55B[6] ? 1'b1 : KeyMap[9][4]) &
(VV55B[7] ? 1'b1 : KeyMap[9][5]),
(VV55B[2] ? 1'b1 : KeyMap[8][0]) &
(VV55B[3] ? 1'b1 : KeyMap[8][1]) &
(VV55B[4] ? 1'b1 : KeyMap[8][2]) &
(VV55B[5] ? 1'b1 : KeyMap[8][3]) &
(VV55B[6] ? 1'b1 : KeyMap[8][4]) &
(VV55B[7] ? 1'b1 : KeyMap[8][5])};