В итоге, проблема оказалась из серии "сам дурак" - Vsync регенерированный оказался active High, вместо low, как у Hsync. Вроде в начале самом проверял, оба сигнала были low.
Дальше начались некоторые непонятности - напомню, использую режим 800x600 @ 60 / @ 75
Штатная частота при 60 кадрах 40МГц.
Параметры такие:
hsync
передний бордюр - 40 (пкс)
задний бордюр - 88 (пкс)
vsync
передний бордюр - 1 (линия)
задний бордюр - 23 (линии)
Соот-но у меня активный сигнал (записи и чтения) включался по следующим условиям:
(счетчик линий > 23) AND (счетчик линий < 623) AND (счетчик пикселей > 46) AND (счетчик пикселей < 846)
+6 - это задержка конвейера.
В итоге, правая часть экрана - обрезана, черная. Примерно 50 пикселей. Изображение раз в несколько секунд обновляется с артефактами (что-то проскакивает) и есть вертикальные серые полосы на общем фоне.
Пробовал сначала немного смещать активную зону вправо, но это приводило, напротив, к совсем убитой картинке. При смещении влево, наоборот, картинка оставась такой же (что вроде не логично).
Методом тыка подобрал такие параметры:
(счетчик линий > 23) AND (счетчик линий < 623) AND (счетчик пикселей > 150) AND (счетчик пикселей < 1056)
Может кто-то объяснить, почему это работает при таких параметрах?
Дрожание исчезло, картинка не обрезана, но все равно не очень качественная:
Видно не очень, но на ней есть желтые полосы и в демке с двигающимся объектом фон неравномерный, как будто размазан кистью.
Причем картинка, в режиме вывода (когда кнопка зажата и данные просто вываливаются насквозь) четче и без желтизны:
Я грешу на несколько вариантов:
а) частоты WE и PCLK не в фазе, так как первый проходит с задержкой
б) R2R ОУ имеет нелинейность, у меня к тому же на этом канале резисторы натыканы с большим допуском, т.к. выбрал неправильные номиналы изначально и впаял что есть.
в) PCLK брошен не на global clock вход CPLD. изначально завел туда только основую частоту (которую использую для I2C и периферии). Не знаю, насколько это влияет.
p.s. Снимал осциллогамму вывода данных с VGA напрямую, выводил просто белый квадрат. Строб WE идет не там, но я это исправил. Непонятно, почему во время переднего бордюра выводятся какие-то данные.