С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Где-то опечатка, строго говоря:
Sgt <= ~W6_2 & (Str | Sgt);
Не эквивалентно:
if (Str) Sgt <= 1'b1;
else if (W6_2) Sgt <= 1'b0;
Я же говорил, что некоторым будет не очевидно. Но давай разберем. Условия задачи таковы: если W6_2 = 1 то триггер сбрасывается (запись 0), если синхронный триггер Str = 1, то устанавливаться. Всего возможно 4 комбинации:
Тут есть нюанс: четвертое состояние никогда не произойдет потому, что синхронный триггер срабатывает после деактивации W6_2. К тому же, у W6_2 есть приоритет: элемент AND стоит ближе к триггеру. Т.е., если использовать логическую функцию, то мы получаем инверсия W6_2 должна AND'иться с функцией Str OR Sgt. Или ~W6_2 & (Srt | Sgt); С другой стороны, если использовать if блок, то будем иметь каскад из двух условий, причем дефолт значение можно не писать, синтезатор сам настроит его на хранение.Код:Str W6_2 Sgt 0 0 Хранение 0 1 0 1 0 1 1 1 Неопределенное состояние
И да, второй пример не совсем функционально аналогичен первому в виду того, что первый if блок имеет приоритет. Т.е., их следует поменять местами:
Вот тут я согласен, спасибо что поправил. Однако в рамках нашей модели будут работать оба варианта, ибо синхронный триггер имеет лог.1 только 1 такт, сразу за деактивацией W6_2, что является результатом цикла записи ядра 6502 на частоте ~1,7МГц и он не успеет сформировать второй, т.к. ядро PPU работает на частоте ~5,2МГц.Код:if (W6_2) Sgt <= 1'b0; else if (Srt) Sgt <= 1'b1;
PS Я не буду поправлять исходный вариант, чтобы данные сообщения имели смысл.
Хорошо бы картинку осциллограмм из симулятора добавить. Будет нагляднее, кмк.
Я закончил преобразовывать схемный ввод модели PPU в синхронную модель. Теперь я готов выкладывать все узлы сюда, с пояснениями. Моделька работает отлично, я даже убрал артефакт, присущий аппаратной реализации, правда он виден только если телевизор правильно настроен. Это узкая (1-1,5 пикселя) белая полоска слева от растра, на границе экрана. Вот как было => стало:
Процесс шел так: сначала я покромсал каждый блок в схемном вводе, приводя его к синхронному виду и избавляясь от второй фазы пиксельклока. Затем перевод в Верилог. Очень сложным оказался узел формирования адреса VRAM. Там лихо закручен сюжет со счетчиками, которые по совместительству еще и регистры. И вот хитросплетение переносов между разрядами счетчика в схемном вводе не вызывает сомнений у Quartus'а - варнингов вообще нет. А как только я описал их в Верилоге, так ТаймКвест сразу поругался на 5 цепей, что они якобы образуют комбинаторное кольцо. Попробуем проанализировать эту проблему позже. А сейчас отдыхать!
Последний раз редактировалось HardWareMan; 20.10.2017 в 17:22.
Есть. Да везде, в том числе и китайских 6538. Правда ширина ее колеблется от модели к модели. Вот полные (я вставлял маркер в левый верхний угол тайла и смотрел как поплывут относительно него спрайты, это очень помогло при выравнивании фаз тактирования):
Сейчас все примерно вот так:
На цвета не обращайте внимания: сейчас там кривая быстрая RGB палитра. Про формирование настоящего выхода я расскажу в разделе про видео ЦАП.
Последний раз редактировалось HardWareMan; 20.10.2017 в 17:28.
А вот ты меня заинтересовал. Она точно есть на оригинальной 2C02E (NTSC):
Ее нет на оригинальной 2C02G (NTSC):
Ее нет на клоне UM6528 (NTSC):
Она еле заметна на клоне UM6538 (PAL):
Она еле заметна на клоне HA6538 (PAL):
Вот такой не однозначный результат тестов. Так что нет: убрать полосу не есть отклонение от тактовой точности.![]()
Последний раз редактировалось HardWareMan; 20.10.2017 в 17:30.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)