Мне было проще эту плату покоцать именно под свои наработки. У тебя же как бы глаза еще не замылены. Можешь попробовать сунуть туда прошивку от спекки2007.
Я насколько помню там асинхронный доступ к памяти.
По поводу метра памяти, я уже писал ранее. Если тебя вполне устраивает спекки2007, то конечно нафиг надо заморачиваться. У меня же был интерес именно применить свои наработки.
---------- Post added at 12:19 ---------- Previous post was at 12:04 ----------
Так, попробовал прикинуть если прицепить клаву на PIC и соединить его с CPLD по SPI-подобному интерфейсу.
Увы не влез. Может конечно я и что то намудрил.
Так на всякий пожарный кину набросок, может я вообще не так мыслю
Имеем 3 входных сигнала:
KBD_CLK - клоки от "клавы"
KBD_DI - вход данных
KBD_CS - выбор клавы (он же разрешает счет импульсов)
Как мыслю. Есть 8 пятибитных регистров клавы, 1 четырех битный счетчик входных импульсов, 1 восьмибитный сдвиговый регистр
Принцип:
Клавиатура выдает 9 импульсов = 8 бит это данные и один бит стоповый
8 бит данных в свою очередь делятся на
3 бита указателя номера регистра на запись
5 бит собственно данные клавы.
Итак в первые 8 импульсов данные сдвигаются во входном сдвигающем регистре, а на последнем 9 импульсе данные переписываются из сдвигающего регистра в один из 8 регистров данных клавы, выбор которого зависят от указателя номера регистра.
Ну собственно чтение этих регистров зависит от состояний линий адреса A8...A15
Код:
------------------------------------------------------------------------------------
-- Интерфейс клавиатуры
------------------------------------------------------------------------------------
-- Порт xxFEh - Клавиатура
------------------------------------------------------------------------------------
RDFE_Sel = !(CA[7..0] == B"11111110") # IO_RD;
-----------------------------------------------------------------------------------
-- Счетчик
------------------------------------------------------------------------------------
KBD_save_en = !(KBD_count[].q == B"1000");
KBD_count[].clk = !KBD_CLK;
KBD_count[0].clrn = !KBD_CS;
KBD_count[].d = KBD_count[].q + 1;
------------------------------------------------------------------------------------
-- Входной сдвигающий регистр
------------------------------------------------------------------------------------
KBD_shift_in[].clk = KBD_CLK;
IF KBD_count[3].q ==0 THEN
KBD_shift_in[].d = (KBD_shift_in[7-1..0].q,KBD_DI);
ELSE
KBD_shift_in[].d = KBD_shift_in[].q;
END IF;
------------------------------------------------------------------------------------
-- Регистры клавиатуры
------------------------------------------------------------------------------------
KBD_regA8[4..0].d = KBD_shift_in[7..3].q;
KBD_regA9[4..0].d = KBD_shift_in[7..3].q;
KBD_regA10[4..0].d = KBD_shift_in[7..3].q;
KBD_regA11[4..0].d = KBD_shift_in[7..3].q;
KBD_regA12[4..0].d = KBD_shift_in[7..3].q;
KBD_regA13[4..0].d = KBD_shift_in[7..3].q;
KBD_regA14[4..0].d = KBD_shift_in[7..3].q;
KBD_regA15[4..0].d = KBD_shift_in[7..3].q;
KBD_regA8[].clk = KBD_CLK;
KBD_regA8[].ena = KBD_save_en # !(KBD_shift_in[2..0].q == B"000");
KBD_regA8[].prn = C_RESET;
KBD_regA9[].clk = KBD_CLK;
KBD_regA9[].ena = KBD_save_en # !(KBD_shift_in[2..0].q == B"001");
KBD_regA9[].prn = C_RESET;
KBD_regA10[].clk = KBD_CLK;
KBD_regA10[].ena = KBD_save_en # !(KBD_shift_in[2..0].q == B"010");
KBD_regA10[].prn = C_RESET;
KBD_regA11[].clk = KBD_CLK;
KBD_regA11[].ena = KBD_save_en # !(KBD_shift_in[2..0].q == B"011");
KBD_regA11[].prn = C_RESET;
KBD_regA12[].clk = KBD_CLK;
KBD_regA12[].ena = KBD_save_en # !(KBD_shift_in[2..0].q == B"100");
KBD_regA12[].prn = C_RESET;
KBD_regA13[].clk = KBD_CLK;
KBD_regA13[].ena = KBD_save_en # !(KBD_shift_in[2..0].q == B"101");
KBD_regA13[].prn = C_RESET;
KBD_regA14[].clk = KBD_CLK;
KBD_regA14[].ena = KBD_save_en # !(KBD_shift_in[2..0].q == B"110");
KBD_regA14[].prn = C_RESET;
KBD_regA15[].clk = KBD_CLK;
KBD_regA15[].ena = KBD_save_en # !(KBD_shift_in[2..0].q == B"111");
KBD_regA15[].prn = C_RESET;
------------------------------------------------------------------------------------
-- Выходной буфер
------------------------------------------------------------------------------------
KBD_rddata[0].in = (CA8 # KBD_regA8[0].q) & (CA9 # KBD_regA9[0].q) & (CA10 # KBD_regA10[0].q) & (CA11 # KBD_regA11[0].q) & (CA10 # KBD_regA12[0].q) & (CA13 # KBD_regA13[0].q) & (CA14 # KBD_regA14[0].q) & (CA15 # KBD_regA15[0].q);
KBD_rddata[1].in = (CA8 # KBD_regA8[1].q) & (CA9 # KBD_regA9[1].q) & (CA10 # KBD_regA10[1].q) & (CA11 # KBD_regA11[1].q) & (CA10 # KBD_regA12[1].q) & (CA13 # KBD_regA13[1].q) & (CA14 # KBD_regA14[1].q) & (CA15 # KBD_regA15[1].q);
KBD_rddata[2].in = (CA8 # KBD_regA8[2].q) & (CA9 # KBD_regA9[2].q) & (CA10 # KBD_regA10[2].q) & (CA11 # KBD_regA11[2].q) & (CA10 # KBD_regA12[2].q) & (CA13 # KBD_regA13[2].q) & (CA14 # KBD_regA14[2].q) & (CA15 # KBD_regA15[2].q);
KBD_rddata[3].in = (CA8 # KBD_regA8[3].q) & (CA9 # KBD_regA9[3].q) & (CA10 # KBD_regA10[3].q) & (CA11 # KBD_regA11[3].q) & (CA10 # KBD_regA12[3].q) & (CA13 # KBD_regA13[3].q) & (CA14 # KBD_regA14[3].q) & (CA15 # KBD_regA15[3].q);
KBD_rddata[4].in = (CA8 # KBD_regA8[4].q) & (CA9 # KBD_regA9[4].q) & (CA10 # KBD_regA10[4].q) & (CA11 # KBD_regA11[4].q) & (CA10 # KBD_regA12[4].q) & (CA13 # KBD_regA13[4].q) & (CA14 # KBD_regA14[4].q) & (CA15 # KBD_regA15[4].q);
KBD_rddata[5].in = VCC;
KBD_rddata[6].in = VCC;
KBD_rddata[7].in = VCC;
KBD_rddata[].oe = !RDFE_Sel;
Код этот на AHDL, но все думаю тут понятно. В принципе я еще толком не вникал, поэтому могут быть ляпы 
Мне интересно пока мнения и предложения. Может я совсем не так мыслю.
Печально что не влез в CPLD, возможно видеоЦАП придется кастрировать.
---------- Post added at 12:21 ---------- Previous post was at 12:19 ----------
Да, хотел напомнить, что в качестве клавы хотел запихать на штатное место PIC16F88 и заюзать PS2 клаву. Но фиг знает пикуша это осилит