Просмотр полной версии : LEN2PENT: как доработать тайминги ?
valerium
08.03.2021, 01:58
"Сказка про велосипед" или "изобретение белого бычка". Это вроде бы уже много раз было, я пытался найти решение среди готовых, но те, что находил - не совсем полноценны.
А интерес в том, чтоб из Ленинграда-1 сделать машину для демок, совместимую по таймингам с пентагоном. Цель, скорее, академическая - ибо демо-пентагонов в том или ином виде у нас у всех навалом. Но хочется разобраться и получить не "что-то близкое", а точно повторяющее.
Итак, ленинград-1 128к, кварц 14,0 Мгц, включение счетчика D4 - выв.1,9,15 - GND, выв.10 - +5v; счетчик D5 - выв.9 - GND.
Память 41256, /WAIT отключен.
В таком виде имеем 320 строк и 71680 тактов/INT - уже почти пентагон.
74872
Пытался переключать INT (вход на C2) на сигнал /КС (кадровый синхроимпульс), получается начало INT примерно по концу КС, как у фирменной машины, но это не то, что нам надо. Полистал темы на предмет доработок INT, например, эту (https://zx-pk.ru/threads/16312-leningrad-2010-sborka-naladka-rasshirenie.html), нашел там вариант формирователя INT на триггере ТМ2 по подобию Скорпиона, где INT начинается по началу кадрового синхроимпульса, а заканчивается по активному уровню /H6.
74875
Попробовал реализовать его на остатках имеющейся в ленине ПЛИСки epm3032 вот таким образом:
74876
Сигнал INT с инверсного выхода триггера еще раз инвертируем на DD1.6 (подключаем к выв.13 DD1) - это чтобы не резать дорожки. Можно, конечно, с прямого выхода сразу процессору сигнал отдать.
Инвертор на тактовом входе триггера нужен для переключения именно по фронту начала КС (назовем это "началом", чтобы не путаться между передним и задним фронтом у инверсного сигнала). В результате имеем очередное очень близкое "почти":
7487374874
Но глядя в демки обнаруживается, что начало INT запаздывает на ~17 знакомест (или на 136 пиксельных интервалов или на 68 тактов).
7487774878
В связи с чем вопрос: что его задерживает, ведь нет же никаких RC-цепочек ? Или у ленинграда КС чем-то сдвинут ? Ткните носом, где я ошибаюсь, pls.
И второй вопрос: если действительно задерживается и это какая-то особенность ленинграда, может можно формировать INT в следующем кадре ? Т.е. ловить начало КС, отсчитывать нужное число тактов (хоть пиксельклока, хоть другого, менее частого сигнала) и формировать начало и конце INT в совершенно точный момент времени ? (как это сделано у всех CPLD-клонов, но там свои счетчики).
У ПЛИСки после схемы расширения памяти и нескольких корректировок дешифрации осталось 5 свободных ног и 20 макроячеек - вроде должно хватить на достаточно большой по разрядности счетчик и схемы контроля.
Такой велосипед уже кто-то изобретал ? К чему лучше привязаться и как посчитать моменты начала/конца INT ?
Я делал INT самым простым способом (и не очень правильным) из документа LENTOPEN2. В общем-то всё получилось но это аналоговая схема требует точного подбора номиналов и зависит от питающего напряжения. Подсказать что-то по вашей схеме не могу но может будет полезна информация из документа "Доработка INT Pentagon" (сохранял откуда-то с форума).
И доработку BORDER-а брал из схемы Leningrad-2012.
Теория:
https://hype.retroscene.org/blog/773.html
Serg6845
08.03.2021, 11:07
Но глядя в демки обнаруживается, что начало INT запаздывает на ~17 знакомест (или на 136 пиксельных интервалов или на 68 тактов).
7487774878
В связи с чем вопрос: что его задерживает, ведь нет же никаких RC-цепочек ? Или у ленинграда КС чем-то сдвинут ? Ткните носом, где я ошибаюсь, pls.
да, сдвинут.
http://sksb3.no-ip.org:8085/lenin_ks.png
сверху - /SS, в середине - /BS, внизу - /KS
кадровый синхроимпульс формируется из сигнала /BS, поэтому начинается не в начале ТВ строки, а в начале графической строки, после бордера.
можно попробовать перекинуть 5 ногу D5 с 5 ноги D8 на инвертированный /KS (свободные инверторы вроде есть)
глючу. инвертированный /SS разумеется...
И второй вопрос: если действительно задерживается и это какая-то особенность ленинграда, может можно формировать INT в следующем кадре ? Т.е. ловить начало КС, отсчитывать нужное число тактов (хоть пиксельклока, хоть другого, менее частого сигнала) и формировать начало и конце INT в совершенно точный момент времени ? (как это сделано у всех CPLD-клонов, но там свои счетчики).
У ПЛИСки после схемы расширения памяти и нескольких корректировок дешифрации осталось 5 свободных ног и 20 макроячеек - вроде должно хватить на достаточно большой по разрядности счетчик и схемы контроля.
Такой велосипед уже кто-то изобретал ? К чему лучше привязаться и как посчитать моменты начала/конца INT ?
изобретал и на аналоговых схемах (2шт. 155АГ1) - не понравилось, плавает от температуры.
на плиске можно наверно - если ресурсов хатит...
valerium
08.03.2021, 15:04
Я делал INT самым простым способом (и не очень правильным) из документа LENTOPEN2.
В len2pen2.pdf есть некая "схема VAV" с реистором, где номинал указан как "н10" - это что означает ?
Я правильно понимаю, тут главная фишка в переключении 5D5 (вход +1) с прямого /БС на инверсный, чтоб D5 переключался раньше и КС формировался раньше. А потом его RC-цепочками надо задержать. Собственно это примерно то, что я хотел, плюс еще Serg6845 показал это осциллограммами
да, сдвинут.
кадровый синхроимпульс формируется из сигнала /BS, поэтому начинается не в начале ТВ строки, а в начале графической строки, после бордера.
можно попробовать перекинуть 5 ногу D5 с 5 ноги D8 на инвертированный /KS (свободные инверторы вроде есть)
глючу. инвертированный /SS разумеется...
Serg6845, или все-так на инвертированный /БС, как предложено выше ?
У меня еще такие мысли по поводу цифрового варианта: если то, что видим "на глаз" (задержка КС на 68 тактов H0) действительно так, то можно 17-разрядным счетчиком, тактированным по H0, на 71680-68=71612 (или 71611 ? считаем с нуля) такте включать /INT - тут мы должны попасть в начало телевизионной строк, а на 71679 выключать (и выполнять сброс счетчика). Либо то же самое по H2 и вчетверо короче (счетчик уже 15-разрядный). "Жирно" по железу, но если засунуть в простаивающую часть ПЛИСки, то вроде и не страшно ).
Если разбег в несколько тактов останется, его можно дошлифовать условиями формирования INT.
Жизнеспособно, как думаете ?
И как можно по схеме точнее посчитать время сдвижки /КС ? В тактах сигналов H*, желательно. Я как ни силился, только запутал сам себя (
Serg6845
08.03.2021, 17:20
В len2pen2.pdf есть некая "схема VAV" с реистором, где номинал указан как "н10" - это что означает ?
100пф
Serg6845, или все-так на инвертированный /БС, как предложено выше ?
вот сижу играюсь. можно и так, но тогда int слишком рано приходит. надо задерживать.
У меня еще такие мысли по поводу цифрового варианта: если то, что видим "на глаз" (задержка КС на 68 тактов H0) действительно так, то можно 17-разрядным счетчиком, тактированным по H0, на 71680-68=71612 (или 71611 ? считаем с нуля) такте включать /INT - тут мы должны попасть в начало телевизионной строк, а на 71679 выключать (и выполнять сброс счетчика). Либо то же самое по H2 и вчетверо короче (счетчик уже 15-разрядный). "Жирно" по железу, но если засунуть в простаивающую часть ПЛИСки, то вроде и не страшно ).
Если разбег в несколько тактов останется, его можно дошлифовать условиями формирования INT.
Жизнеспособно, как думаете ?
И как можно по схеме точнее посчитать время сдвижки /КС ? В тактах сигналов H*, желательно. Я как ни силился, только запутал сам себя (
у меня пока ближе всего к идеалу (по демке Rage) получилось вот так (5 нога D5 - на инверсном /BS):
http://sksb3.no-ip.org:8085/lenin_int.png
вся схема запускается по /КС, значение счетчика, выставленное на элементе and4 - активирует int, значение на and6 - деактивирует. можно добавить разрядов счетчика и взять вместо h1 например h0, вобщем есть с чем поиграть...
по поводу задержки - считать лень, можно просто вбить кусок схемы в тот же квартус и смоделировать...
valerium
08.03.2021, 17:39
100пф
...было бы, если б это был конденсатор, а не резистор ))
Serg6845
08.03.2021, 17:49
...было бы, если б это был конденсатор, а не резистор ))
в том месте резистор как-то смысла не имеет... кондюк мелкий от звона - еще может быть.
- - - Добавлено - - -
...было бы, если б это был конденсатор, а не резистор ))
в том месте резистор как-то смысла не имеет... кондюк мелкий от звона - еще может быть.
хотя разве что 100 Ом - тогда к10, ошибка распознавания. но в таком случае верхний резистор не нужен.
valerium
08.03.2021, 21:31
у меня пока ближе всего к идеалу (по демке Rage) получилось вот так (5 нога D5 - на инверсном /BS):
http://sksb3.no-ip.org:8085/lenin_int.png
вся схема запускается по /КС, значение счетчика, выставленное на элементе and4 - активирует int, значение на and6 - деактивирует. можно добавить разрядов счетчика и взять вместо h1 например h0, вобщем есть с чем поиграть...
Этот вариант попытался понять, но он требует столько ног на сигналы с выходов от всех счетчиков, что их в моей ситуации просто неоткуда взять.
Прикинул модуль счетчика со сбросом, счетчик пока 17-разрядный, тактируется от H0 (3,5МГц). Сбрасывается по активному /КС, точнее счет начинается только с момента, когда /КС становится неактивным (=1).
Здесь 71612 - это кол-во тактов от нашего задержанного кадрового синхроимпульса до момента генерации INT следующего кадра,
из него вычитается 3584 такта самого кадрового импульса, т.к. счетчик во время его активности не будет увеличиваться;
а выключение активного INT (здесь он прямой) выполняется через 36 тактов (или правильная длительность 32 ?).
CLK - тактовая 3,5МГц
nKS - это /KS
INT - это соот-но INT
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity INT_GEN is
port
(
CLK : in std_logic;
nKS : in std_logic;
INT : out std_logic
);
end INT_GEN;
architecture RTL of INT_GEN is
signal COUNTER : integer range 0 to 71680;
begin
process (CLK, nKS)
begin
if (rising_edge(CLK)) then
if (COUNTER < 71680) then
COUNTER <= COUNTER + 1;
end if;
if (COUNTER = 71612-3584) then
INT <= '1';
end if;
if (COUNTER = 71612-3584+36) then
INT <= '0';
end if;
if (nKS = '0') then
COUNTER <= 0;
end if;
end if;
end process;
end architecture;
Компилируется в 18 макроячеек,добавил модуль в проект и создал "блок" на BDF для его подключения - остатка ПЛИСки вполне хватает.
Но паять и проверять сегодня некогда, это отложим на следующий раз.
Serg6845
09.03.2021, 09:19
Этот вариант попытался понять, но он требует столько ног на сигналы с выходов от всех счетчиков, что их в моей ситуации просто неоткуда взять.
откуда? этот вариант требует ровно два сигнала - /KS (он у меня называется vs) и h1. все остальные - формируются непосредственно в схеме. ну и на всякий случай - zero=gnd, one=vcc.
Прикинул модуль счетчика со сбросом, счетчик пока 17-разрядный, тактируется от H0 (3,5МГц). Сбрасывается по активному /КС, точнее счет начинается только с момента, когда /КС становится неактивным (=1).
Здесь 71612 - это кол-во тактов от нашего задержанного кадрового синхроимпульса до момента генерации INT следующего кадра,
из него вычитается 3584 такта самого кадрового импульса, т.к. счетчик во время его активности не будет увеличиваться;
а выключение активного INT (здесь он прямой) выполняется через 36 тактов (или правильная длительность 32 ?).
CLK - тактовая 3,5МГц
nKS - это /KS
INT - это соот-но INT
Компилируется в 18 макроячеек,добавил модуль в проект и создал "блок" на BDF для его подключения - остатка ПЛИСки вполне хватает.
Но паять и проверять сегодня некогда, это отложим на следующий раз.
работать будет, а потом захочется еще что-нибудь впихнуть - а места нету... вот как у меня - запихал speccyboot, BDI, 256k, divmmc - а kempston mouse уже не лезет... порядка 10 ячеек не хватает.
solegstar
09.03.2021, 11:07
В связи с чем вопрос: что его задерживает, ведь нет же никаких RC-цепочек ? Или у ленинграда КС чем-то сдвинут ? Ткните носом, где я ошибаюсь, pls.
1. переделать дешифрацию порта FE на запись так, чтобы запись в порт происходила моментально - сейчас запись происходит после выключения /WR, (A0,) или /IORQ. А0 надо бы добавить в дешифратор, далее - после элемента DD14.4 нужно поставить инвертор (можно найти свободные на схеме ленинграда-1 от Mick`a).
2. Посмотреть, как переключается счетчик строк - нужно сделать фронты как в пентагоне-128, т.е. счет должен происходить по правильному фронту - в пентагоне это отрицательный, так как установлена 155ие5, в ленинграде нужно смотреть более детально. также в пентагоне счетчик считает по фронту строчного импульса, а в лениграде по гашению строчного.
3. переделать узел /INT как в пентагоне-128.
Serg6845
09.03.2021, 11:25
1. переделать дешифрацию порта FE на запись так, чтобы запись в порт происходила моментально - сейчас запись происходит после выключения /WR, (A0,) или /IORQ. А0 надо бы добавить в дешифратор, далее - после элемента DD14.4 нужно поставить инвертор (можно найти свободные на схеме ленинграда-1 от Mick`a).
2. Посмотреть, как переключается счетчик строк - нужно сделать фронты как в пентагоне-128, т.е. счет должен происходить по правильному фронту - в пентагоне это отрицательный, так как установлена 155ие5, в ленинграде нужно смотреть более детально. также в пентагоне счетчик считает по фронту строчного импульса, а в лениграде по гашению строчного.
3. переделать узел /INT как в пентагоне-128.
боюсь что все это не сильно поможет - дискретность отображения бордера в 8 пикселей никуда не денется... а там уже более серьезные доработки нужны.
valerium
09.03.2021, 11:42
1. переделать дешифрацию порта FE на запись так, чтобы запись в порт происходила моментально - сейчас запись происходит после выключения /WR, (A0,) или /IORQ. А0 надо бы добавить в дешифратор, далее - после элемента DD14.4 нужно поставить инвертор (можно найти свободные на схеме ленинграда-1 от Mick`a).
А не в этом ли причина упомянутой 8-пиксельной дискретности управления бордюром ? Дешифрация с A0 давно исправлена, а вот инвертировать IOWR для записи в тм9 - это идея.
Вначале, конечно, надо добить время начала int. Ну про это уже найдена пара идей
solegstar
09.03.2021, 11:56
Вначале, конечно, надо добить время начала int.
начало инта в пентагоне совпадает с началом кадрового импульса. по прерыванию и определяется программой когда нужно рисовать на бордюре.
- - - Добавлено - - -
инвертировать IOWR для записи в тм9 - это идея.
это обязательное условие.
Serg6845
09.03.2021, 12:59
А не в этом ли причина упомянутой 8-пиксельной дискретности управления бордюром ? Дешифрация с A0 давно исправлена, а вот инвертировать IOWR для записи в тм9 - это идея.
Вначале, конечно, надо добить время начала int. Ну про это уже найдена пара идей
не в этом. в ленинграде бордер выводится вместе с атрибутами через КП13, а в них инфа пишется раз в знакоместо. и там уже одним инвертором не обойдешься - там надо во время активного /BORDER подавать на 11 ноги КП13 вместо H2 7МГц. и без этой переделки точно начало int не выставишь - на бордере все равно +/- знакоместо будет.
Доработку BORDER-а я делал вот так:
https://zx-pk.ru/attachment.php?attachmentid=74898&d=1615286760
И сигнал IOWR я тоже инвертировал и ещё RC цепочкой добивался совпадения до пикселя.
Я конечно понимаю что здесь пытаются упаковать всё в ПЛИС но может быть кто-нибудь сочинит схему пентагоновского INT на логике и без RC цепочек для Ленинграда ?
А пока у меня INT сделан вот так:
https://zx-pk.ru/attachment.php?attachmentid=74899&d=1615287680
valerium
09.03.2021, 20:42
Доработку BORDER-а я делал вот так:
https://zx-pk.ru/attachment.php?attachmentid=74898&d=1615286760
Видимо это последняя недостающая часть доработки. после int и других подготовок.
А на rc-цепочках int, как я понимаю, тоже задерживает после начала запаздывающего КС да начале следующего кадра ? (почти на кадр ?)
Serg6845
09.03.2021, 21:07
Видимо это последняя недостающая часть доработки. после int и других подготовок.
А на rc-цепочках int, как я понимаю, тоже задерживает после начала запаздывающего КС да начале следующего кадра ? (почти на кадр ?)
при тех номиналах - точно нет. там задержка в микросекунды.
а задерживать на кадр RC цепочками - это извращение. там все плавать будет от любых непредсказуемых факторов.
valerium
09.03.2021, 21:10
при тех номиналах - точно нет. там задержка в микросекунды.
в какой момент тогда мы получаем активный int, если оно задерживается относительно уже задержанного (от начала тв-кадра) импульса /КС ?
700ом и 10нф - имеем задержку на 7 мкс.
это около 25 пикселей.. то есть задержка сделана просто до следующей экранной строки, а не до начала тв-кадра?
если так, то мне всё-таки больше нравится вариант с жирным счетчиком, чтоб попадать ровно в начало следующего кадра.
Serg6845
09.03.2021, 21:18
в какой момент тогда мы получаем активный int, если оно задерживается относительно уже задержанного (от начала тв-кадра) импульса /КС ?
если я не ошибся в порядках - примерно через 7мкс. если /КС взят от инвертированного /БС - то похоже на правду...
valerium
13.03.2021, 01:14
Дошли сегодня руки припаять и прошить то, что накодилось в посте #9 (https://zx-pk.ru/threads/32987-len2pent-kak-dorabotat-tajmingi.html?p=1107630&viewfull=1#post1107630). Пребываю в состоянии легкого офигения - потому что посчитанные тогда по экрану на глаз ~17 знакомест запаздывания КС, которые равны 68 тактам процессора, а также момент начала следующего INTа и его длительность с первого раза попали в точку.
Галерея того, что имеем сейчас:
74918749197492074921749227492374924
На данный момент только изменено включение счетчиков D4 и D5 для 320 пентагоновских строк и 71680 тактов на кадр, а также добавлен тот самый генератор INT. Ничего не делал с КС, и даже не инвертировал пока /IOWR.
Да, бордюрные линии слегка "квадратиш", но они все на своем месте.
Схема того, что сейчас в ПЛИСке
74927
сорс модуля int_gen был в посте выше.
Можно поделить исходную частоту вдвое или вчетверо, сэкономив одну-две макроячейки, можно получить частоту H2 из уже имеющейся H1 и сэкономить ногу... но вроде без надобности.
На очереди - доработка бордюрных сигналов перед КП13 по схеме П321, только пока не придумал, на чем собирать. На мелкоте это делать уже лениво, придется еще одну 3032 туда вкрячить )
Upd:
Для понимания кучки констант решил прокомментировать, как это работает:
весь экран выводится за 71680 тактов;
/nKS (кадровый синхроимпульс, его начало, т.е. СПАД) в ленинграде задержан на 68 тактов относительно начала первой скан-строки;
длина КСИ равна 3584 такта;
счетчик же формирователя INT у нас запускается по концу КСИ, то есть по ПЕРЕДНЕМУ ФРОНТУ /nKS, это на (68+3584) такте после начала первой скан-строки;
активируем INT (прямой) в начале первой скан-строки СЛЕДУЮЩЕГО кадра, это через 71680 - (68 + 3584) = 68028 тактов после конца КСИ
деактивируем INT через 36 тактов, это 71680 - (68 + 3584) + 36 = 68064 после конца КСИ.
/nKS берем с 6DD40, H0 берем c 1DD13, INT (прямой) подаем на 13DD1 (а на 12DD1 формируется /INT для процессора)
сорс упомянутыми константами
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity INT_GEN is
port
(
CLK : in std_logic;
nKS : in std_logic;
INT : out std_logic
);
end INT_GEN;
architecture RTL of INT_GEN is
signal COUNTER : integer range 0 to 71680;
begin
-- весь экран выводится за 71680 тактов
-- /nKS (кадровый синхроимпульс, его начало, т.е. СПАД) в ленинграде задержан на 68 тактов относительно начала первой скан-строки
-- длина КСИ равна 3584 такта
-- счетчик же формирователя INT у нас запускается по концу КСИ, то есть по ПЕРЕДНЕМУ ФРОНТУ /nKS,
-- это на (68+3584) такте после начала первой скан-строки.
-- активируем INT (прямой) в начале первой скан-строки СЛЕДУЮЩЕГО кадра, это через 71680 - (68 + 3584) = 68028 тактов после конца КСИ
-- деактивируем INT через 36 тактов, это 71680 - (68 + 3584) + 36 = 68064 после конца КСИ.
-- /nKS берем с 6DD40, H0 берем c 1DD13, INT (прямой) подаем на 13DD1 (а на 12DD1 формируется /INT для процессора)
process (CLK, nKS)
begin
if (rising_edge(CLK)) then
if (COUNTER < 71680) then
COUNTER <= COUNTER + 1;
end if;
if (COUNTER = 71680 - 68 - 3584) then
INT <= '1';
end if;
if (COUNTER = 71680 - 68 - 3584 + 36) then
INT <= '0';
end if;
if (nKS = '0') then
COUNTER <= 0;
end if;
end if;
end process;
end architecture;
valerium
14.03.2021, 23:31
Доработку BORDER-а я делал вот так:
https://zx-pk.ru/attachment.php?attachmentid=74898&d=1615286760
И сигнал IOWR я тоже инвертировал и ещё RC цепочкой добивался совпадения до пикселя.
П321, не до конца понял суть этой схемы, поэтому вопрос возник - мы только для D31-D32 заменяем сигнал H2 на NEW_H2 ?
У ленинграла дорога на 11-е выводы D31-32 продолжается до выв. 1 D19 - на нем должен оставаться старый H2 или тоже нужно подать NEW_H2 ?
Дорожка H2 к КП13 режется в двух местах, получается ?
И второй момент - что должно измениться при инвертировании /IOWR, как это будет видно ?
Да новые сигналы идут только на КП13-е. Я этот кусочек схемы брал из Ленинград-2012 так что можно глянуть на оригинал.
При инвертировании /IOWR Border смещается на 3-4 пикселя но у тебя похоже уже всё нормально. Эта проблема обсуждалась здесь (https://zx-pk.ru/threads/28737-pentagon-48-ili-grm1-nachalo-inta.html?p=995550&viewfull=1#post995550).
Поздравляю что всё получилось с INT-ом (теоретические расчёты сразу попали в точку). Дискретность BORDER-а довести и будет Пентагон.
valerium
17.03.2021, 01:38
Дискретность BORDER-а довести и будет Пентагон.
Все получилось, спасибо за идеи и советы.
Только после того, как бордюр я развернул по 7мгц-такту все-таки выяснилось, что задержка активного /КС составляет не 68, а 67 тактов H0 от начала кадра, просто при 8-пиксельной градации этого не было видно.
Возможно это связано с тем, что обработку фронта /IOWR я править не стал (он исходный).
При этом получилось опережение экрана бордюром на 2 пикселя, то есть на один такт H0:
74956
Поэтому правим исходник INT_GEN, уменьшая задержку на 1 такт (67 вместо 68):
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity INT_GEN is
port
(
CLK : in std_logic;
nKS : in std_logic;
INT : out std_logic
);
end INT_GEN;
architecture RTL of INT_GEN is
signal COUNTER : integer range 0 to 71680;
begin
-- весь экран выводится за 71680 тактов
-- /nKS (кадровый синхроимпульс, его начало, т.е. СПАД) в ленинграде задержан на 67 тактов относительно начала первой скан-строки
-- длина КСИ равна 3584 такта
-- счетчик же формирователя INT у нас запускается по концу КСИ, то есть по ПЕРЕДНЕМУ ФРОНТУ /nKS,
-- это на (67+3584) такте после начала первой скан-строки.
-- активируем INT (прямой) в начале первой скан-строки СЛЕДУЮЩЕГО кадра, это через 71680 - (67 + 3584) = 68029 тактов после конца КСИ
-- деактивируем INT через 36 тактов, это 71680 - (67 + 3584) + 36 = 68065 после конца КСИ.
-- /nKS берем с 6DD40, H0 берем c 1DD13, INT (прямой) подаем на 13DD1 (а на 12DD1 формируется /INT для процессора)
process (CLK, nKS)
begin
if (rising_edge(CLK)) then
if (COUNTER < 71680) then
COUNTER <= COUNTER + 1;
end if;
if (COUNTER = 71680 - 67 - 3584) then
INT <= '1';
end if;
if (COUNTER = 71680 - 67 - 3584 + 36) then
INT <= '0';
end if;
if (nKS = '0') then
COUNTER <= 0;
end if;
end if;
end process;
end architecture;
Ну и вот что после этого:
7495774958
Вот финальная схема доработки, где кирпич int_gen - это модуль, который схематиком описать на мой взгляд невозможно
74962
Объединенный гайд по резке-пайке
************************************************** ************************************************** *************
* L2P ("ЛЕНЬ-В-ПЕНЬ") - подборка модов для приведения таймингов классического Ленинграда-1
* к стандарту Пентагона
* на ОДНОЙ микросхеме (пример на EPM3032ALC44)
*
* https://zx-pk.ru/threads/32987-len2pent-kak-dorabotat-tajmingi.html
* valerium@rambler.ru
* Chelyabinsk, Russia, 2021
*
* Thanx to П321, Serg6845, solegstar, IanPo
************************************************** ************************************************** *************
Требования:
- Ленинград-1;
- Кварц 14,0 МГц;
- Память 4164 или 41256, способная корректно работать без тактов /WAIT процессора.
- Cигнал /IOWR на DD39 в первозданном виде (не инвертирован).
- Сигнал /КС на выв.6 DD40 в первозданном виде.
************************************************** ************************************************** *************
Доработки:
1. Изменение количества строк в кадре
1.1. Счетчик DD4 включается входами 10 - на +5в, 1,9,15 - на GND (на многих платах это по умолчанию так).
1.2. Счетчик DD5: вход 5 отрезается от схемы и подключается к GND.
2. Отключение /WAIT
Отключается выход 5 DD9 от входа 24 (/WAIT) процессора DD20. Вход 16 DD20 подтянуть резистором 10К к +5в.
*** После этих двух доработок имеем 71680 тактов на 1 кадр (=на 1 период /INT).
3. Подготовка и прошивка CPLD
В проекте она подготовлена для EPM3032ALC44 в корпусе PLCC, ее панелька удобно размещается на макетном поле Ленинграда.
Эту CPLD нужно запитать от 3,3в через линейный стабилизатор AMS1117-3,3 или подобный.
Питание: выводы 3,15,23,35 - +3,3в, выводы 10,17,22,30,36,42 - GND.
Не забудьте про блокировочные конденсаторы на все 4 входа питания.
Разъем JTAG (можно подключить временно для прошивки): выв.7 - TDI, выв.13 - TMS, выв.32 - TCK, выв.38 - TDO.
4. Корректировка /INT (см. схему в L2P.PNG)
4.1. На вывод 41 CPLD подается сигнал H0 (удобнее взять с выв.1 DD13).
4.2. На вывод 4 CPLD подается сигнал /КС (кадровый синхроимпульс - удобнее взять с выв.6 DD40).
4.3. Убираем C2, R2 и VD20, вход 13 DD1 освобождается от остальной схемы, на него подается сигнал INT с вывода 6 CLPD.
*** После этого бордюрные эффекты уже должны работать правильно и без сдивгов, но диагональные линии будут угловатыми
*** из-за изменения цвета бордюра с точностью до знакоместа (8 пикселей).
5. Корректировка дискретности вывода бордюра с точностью до пикселя (см. схему в L2P.PNG)
5.1. На вывод 40 CPLD подается сигнал H1 (удобнее взять с выв.1 DD40).
5.2. На вывод 39 CPLD подается сигнал H2 (удобнее взять с выв.6 DD10).
5.3. На вывод 43 CPLD подается сигнал ТИ (с выв. 5 DD2).
5.4. Выводы 10 DD31-32 (исходно /BORDER) отрезать от схемы (место разреза показано оранжевым в файле CUTS.PNG с пометкой 5.4).
5.5. На вывод 9 CPLD подается сигнал /BORDER c выв.6 DD13.
5.6. На выводы 10 DD31-32 подается сигнал BORDER_PENT c выв.11 CPLD.
5.7. Выводы 11 DD31-32 (исходно H2) отрезать от схемы (два места разреза показаны оранжевым в файле CUTS.PNG с пометкой 5.7).
5.8. На отрезанную дорожку к выв.1 DD19 восстановить подключение H2 с выв.10 DD14 (соединение показано оранжевым с пометкой 5.8).
5.9. На выводы 11 DD31-32 подать сигнал NEW_H2 с выв.8 CPLD.
Все.
и файл CUTS.PNG с точками для резки дорожек
74963
Проект в квартусе
74964
и на всякий случай все здесь
https://github.com/valerium-labs/L2P
Serg6845
17.03.2021, 21:14
Вот финальная схема доработки, где кирпич int_gen - это модуль, который схематиком описать на мой взгляд невозможно
74962
схематиком можно описать все :)
в квартусе tools-netlist viewers-RTL viewer - покажет что там схематиком получилось.
valerium
17.03.2021, 21:54
схематиком можно описать все :)
в квартусе tools-netlist viewers-RTL viewer - покажет что там схематиком получилось.
Понятно, что есть какой-то универсальный вид, в который выстраивается наш проект из элементов в макроячейках.
Только понимание этих схем настолько неинтуитивное, что разрыв мозга неизбежен.
Ну ок, пусть так: _мое_ понимание не заточено не рассмотрение/обсуждение, а тем более _отладку_ схем в том виде. А описание на VHDL/verilog хотя бы как-то дает видеть суть. Поэтому мне приятнее ставить задачу квартусу в том виде, где видна суть, а схема там уж потом пусть генерится, как ей удобнее )
Serg6845
17.03.2021, 22:06
Понятно, что есть какой-то универсальный вид, в который выстраивается наш проект из элементов в макроячейках.
Только понимание этих схем настолько неинтуитивное, что разрыв мозга неизбежен.
Ну ок, пусть так: _мое_ понимание не заточено не рассмотрение/обсуждение, а тем более _отладку_ схем в том виде. А описание на VHDL/verilog хотя бы как-то дает видеть суть. Поэтому мне приятнее ставить задачу квартусу в том виде, где видна суть, а схема там уж потом пусть генерится, как ей удобнее )
ок. просто у меня ровно наоборот - одного взгляда на схему достаточно чтобы понять как оно работает, а VHDL и ему подобные - требуют вникания и разбирательства...
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot