Ошибка в синхронизации цветного ОЗУ. Исправляю.
Вид для печати
А в чём она заключается, а то я подумал грешить на плисину...
---------- Post added at 19:16 ---------- Previous post was at 18:58 ----------
Мысли по вводу режима №3 по опросу клавиатуры:
переменную metod расширить до трёх значений:
1. =0 - метод №0 (вновь вводимый). инициализируется плисина в это значение. При считывании портов ВВ55, если ранее не был режим 1 или 2 (см. ниже), значения битов всех портов А,В и С присваиваиваются в зависимости от нажатой клавиши (spetskeyboard.v). Конкретнее в этом коде должны быть два нуля, соответствующие нажатой клавише. Этот ответный код записывается сразу в porta, portb и portc.
2. =1 - метод №1 (ранее был =0). порты а и с выводят бегущий ноль, порт в вводит ответный код.
3. =2 - метод №2 (ранее был =1). порт в выводит бегущий ноль, порты а и с вводят ответный код.
Реализацию кода планирую в драйвере клавиатуры (spetskeyboard.v) - основная часть и в основной программе. Пока обдумываю конкретнее как вставить в программу хотелки.
---------- Post added at 19:28 ---------- Previous post was at 19:16 ----------
Вот реализация переключения скорости работы процессора - Turbo/Normal - 4 и 2 МГц соответственно (клавиши Page Up и Page Down):
Измененный файл spetskeyboard.v представлю позже.Код:signal turbo_key: std_logic; -- клавиша "Турбо"
signal turbo: std_logic:= '0'; -- скорость: 4 МГц / 2 МГц
...
component spetskeyboard is -- контроллер клавиатуры
port(
...
turbo_k : out std_logic -- нажата клавиша "Турбо" );
end component;
...
turbo <= '1' when turbo_key = '1' else '0'; -- скорость: 4 МГц / 2 МГц
...
process(clock,del,turbo)
begin
if (clock'event and clock = '1') then
if turbo = '1' then
clk_cpu <= del (0); -- Turbo режим 4 МГц
else
clk_cpu <= not del (1); -- Normal режим 2 МГц
end if;
end if;
end process;
Понятно. Просто заменить на: clock=> not clock,
И не получим ничего, кроме черного экрана. Адреса не успеют обновиться, строб записи не зафиксируется.
Для ОЗУ в ПЛИС нужна частота в разы большая чем пиксельклок.
В общем, переделал я. Для подстраховки хочу еще сделать и второй вариант, с размещением цветного ОЗУ в основной (внешней) памяти. Проверишь на работе оба варианта.
Ну что, готово?
Первый вариант (с внутренней ОЗУ) давно готов. Домучиваю вариант с внешней ОЗУ.
---------- Post added at 20:10 ---------- Previous post was at 20:07 ----------
10 минут и будет готово.
---------- Post added at 20:10 ---------- Previous post was at 20:10 ----------
10 минут и будет готово.
---------- Post added at 20:20 ---------- Previous post was at 20:10 ----------
Оба варианта.
Прошивки уже скомпилены, залей их без компиляции. :v2_dizzy_wassup: :v2_dizzy_doctor:
http://narod.ru/disk/26546676000/ext..._spec.rar.html
http://narod.ru/disk/26546698000/int..._spec.rar.html
---------- Post added at 20:23 ---------- Previous post was at 20:20 ----------
Турбопереключалки внедрены.
---------- Post added at 20:23 ---------- Previous post was at 20:23 ----------
Турбопереключалки внедрены.
---------- Post added at 20:24 ---------- Previous post was at 20:23 ----------
Форум глючит
Да форум глючит.Тут во нашёл ошибку в драйвере клавиатуры. Во втором методе при опросе порта В возвращается код с портов А и С. Подчёркиваю и. Значит код ответа должен состоять из 8 + 4 битов. А у тебя стоит scan_out (7 downto 0) и scan_out (3 downto 0) соответственно записываются в порты А и С. Должно быть во втором случае быть такое:
Код:dataI <= "0000" & scan_out (11 downto 8);
Т.е. порту а присваиваются младшие 8 бит, порту с - старшие 4 бита переменной scan_out. По крайней мере в драйвере клавиатуры вырабатываются 12 бит кода ответа.
Ты наверное так сделал в драйвере клавиатуры для отладки (твоё закомментировал):
Ладно пошел спать (твоё московское время +2 будет моё). Завтра прошью две прошивки.Код:case (sp_kb_scan)
12'b111111111110: col <= 4'b0101;
12'b111111111101: col <= 4'b0100;
12'b111111111011: col <= 4'b0011;
12'b111111110111: col <= 4'b0010;
12'b111111101111: col <= 4'b0001;
12'b111111011111: col <= 4'b0000;
default: col <= 4'b1111;
endcase
// sp_kb_out_ <= { 6'b111111 & ~keymatrixb[col]};
sp_kb_out_ <= ~keymatrixb[col];
end
// if (col == 4'b1111) sp_kb_out_ <= 12'b111111111111;
end