Важная информация

User Tag List

Страница 4 из 9 ПерваяПервая 12345678 ... ПоследняяПоследняя
Показано с 31 по 40 из 88

Тема: Потактовый клон Денди на FPGA

  1. #31
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Там схема в LogiSim нарисована, это вообще жесть, представляю сколько оно рисовалось

  2. #31
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #32
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,404
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    598
    Поблагодарили
    444 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Именно. Я помню в детстве у меня был вот такой ЧБ телевизор "Кварц":

    Он максимально тупой и когда его кинескоп был новым показывал просто отменную по четкости картинку. И действительно, те Денди, что у меня были, а так же Спектрум показывал на нем без черезстрочности. Т.е., как сейчас модно говорить: 240р. Это когда оба поля одинаковые. Чтобы поля отличались, нужно чтобы количество строк в каждом полуполе отличалось. У нас есть сейчас только NTSC версия и там есть вот такой узел:

    Я не знаю, зачем сделано именно так, но если запретить перекидываться триггеру по V[8] то NTSC тоже перестает crawl! Вот чему равен LINE5:

    Основной: 1 0101 0100, корректирующий: 1 0101 0011, т.е. разница буквально на 1 пиксель.

    - - - Добавлено - - -

    Опять же, там стоит AND, и сократиться на 1 пиксель только строка пререндера, на которую указывает сигнал RESCL... Причем, в каждом втором кадре. Но эффект есть.

    - - - Добавлено - - -

    Vslav, это рандомная логика ядра 6502.
    Последний раз редактировалось HardWareMan; 20.10.2017 в 17:33.

  4. #33
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    Vslav, это рандомная логика ядра 6502.
    Да неважно, я на нее просто посмотрел - у меня голова закружилась Просто мало с LogiSim работал, решил что нужно взять инструмент потолще. Но этап схемы в виде логических вентилей я обычно пропускаю. В-общем, использование LogiSim - новое слове в реверсе

  5. #34
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,404
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    598
    Поблагодарили
    444 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Vslav, это что, они вон первозыч туда пихают... Но это уже оффтопик, хоть и близко к реверсу.

  6. #35
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,404
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    598
    Поблагодарили
    444 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сегодня поговорим о первом блоке PPU: выбор регистра для чтения или записи. Почему он? Он единственный который в качестве входа использует внешние пины (со стороны процессора) и формирует внутренние сигналы. Вот так он выглядит в оригинальном схемном вводе:

    Здесь: N_DBE это строб обращения, R_W это направление обращения (лог.0 - запись в PPU), A[2..0] - жгут адресных линий. Сюда же следует добавить вот эту защелку, которая сохраняет записываемые данные для внутренних нужд:

    Собственно, здесь все просто. Адреса поданы на дешифратор, который преобразует 3х битный код в 8 сигналов. Эти 8 сигналов смешиваются с сигналами управления (N_DBE и R_W), от чего получается набор сигналов Rx и Wx. Первый означает чтение из регистра а второй запись в него. Не все регистры полноценны: некоторые доступны только на чтение а некоторые только на запись. Узел вверху на мультиплексорах это обычная перекидушка на эквивалентах защелок (помните, мультиплексор на 4х транзисторах?). Он устанавливается в конкретное состояние при чтении из регистра #2 - по сигналу R2, а перекидывается при обращении к регистрам #5 и #6, по сигналам R5_x и R6_x. Это двойные регистры, первый (#5) регистр прокрутки а второй (#6) регистр адреса VRAM для обращения процессора. Особенность PPU в том, что для рендера и для обращения процессором к VRAM используется один и тот же счетчик, так что обращаться к VRAM следует только во время кадрового гашения либо при отключенном рендере, иначе результат не предсказуем.

    После чистки схема этого узла получается следующей:

    В принципе, она практически не отличается от исходной. Однако она будет немного отличаться в Верилоге. Я объясню. Дело в том, что входные сигналы являются полностью асинхронными к внутренним сигналам и поэтому их надо синхронизировать. Как говорят в книжках: перевести в локальный (рабочий) тактовый домен. Так как сигналы полностью асинхроны к частоте ядра, то привязывать их можно только к главному мастерклоку - самой быстрой доступной частоте. Это гарантирует, что ядро не пропустит входящий запрос. В Верилоге это будет выглядеть так:
    Код:
    // Управление регистрами PPU со стороны CPU
    module PPU_REG_SEL(
    	// Входные цепи
    	input	Clk,			// Тактовая последовательность
    	input	[2:0]Adr,		// Адрес регистра
    	input	RnW,			// Направление обращения R/W
    	input	nSTB,			// Строб обращения к PPU
    	input	[7:0]DIn,		// Входные данные
    	// Выходные цепи
    	output	reg W0,			// Запись в регистр #0
    	output	reg W1,			// Запись в регистр #1
    	output	reg R2,			// Чтение из регистра #2
    	output	reg W3,			// Запись в регистр #3
    	output	reg R4,			// Чтение из регистра #4
    	output	reg W4,			// Запись в регистр #4
    	output	reg W5_1,		// Запись в регистр #5/1
    	output	reg W5_2,		// Запись в регистр #5/2
    	output	reg W6_1,		// Запись в регистр #6/1
    	output	reg W6_2,		// Запись в регистр #6/2
    	output	reg R7,			// Чтение из регистра #7
    	output	reg W7,			// Запись в регистр #7
    	output	reg [7:0]DOut		// Выходные данные
    );
    // Внутренние регистры
    reg [2:0]AdrR;
    reg RnWR;
    reg nSTBR;
    reg Sel;
    reg FlipR;
    wire Flip;
    assign Flip = W5_1 | W5_2 | W6_1 | W6_2;
    // Логика работы проста
    always @(posedge Clk) begin
    	// Синхронизируем сигналы
    	AdrR[2:0] <= Adr[2:0]; RnWR <= RnW; nSTBR <= nSTB;
    	// Декодируем
    	W0   <= ~AdrR[2] & ~AdrR[1] & ~AdrR[0] & ~RnWR & ~nSTBR;
    	W1   <= ~AdrR[2] & ~AdrR[1] &  AdrR[0] & ~RnWR & ~nSTBR;
    	R2   <= ~AdrR[2] &  AdrR[1] & ~AdrR[0] &  RnWR & ~nSTBR;
    	W3   <= ~AdrR[2] &  AdrR[1] &  AdrR[0] & ~RnWR & ~nSTBR;
    	R4   <=  AdrR[2] & ~AdrR[1] & ~AdrR[0] &  RnWR & ~nSTBR;
    	W4   <=  AdrR[2] & ~AdrR[1] & ~AdrR[0] & ~RnWR & ~nSTBR;
    	W5_1 <=  AdrR[2] & ~AdrR[1] &  AdrR[0] & ~RnWR & ~nSTBR & ~Sel;
    	W5_2 <=  AdrR[2] & ~AdrR[1] &  AdrR[0] & ~RnWR & ~nSTBR &  Sel;
    	W6_1 <=  AdrR[2] &  AdrR[1] & ~AdrR[0] & ~RnWR & ~nSTBR & ~Sel;
    	W6_2 <=  AdrR[2] &  AdrR[1] & ~AdrR[0] & ~RnWR & ~nSTBR &  Sel;
    	R7   <=  AdrR[2] &  AdrR[1] &  AdrR[0] &  RnWR & ~nSTBR;
    	W7   <=  AdrR[2] &  AdrR[1] &  AdrR[0] & ~RnWR & ~nSTBR;
    	// Выбор регистра из пары
    	if (R2) Sel <= 1'b0;
    	else if (FlipR & ~Flip) Sel <= ~Sel;
    	FlipR <= Flip;
    	// Запоминаем данные
    	if (~nSTB & ~RnW) DOut[7:0] <= DIn[7:0];
    end
    // Конец модуля
    endmodule
    Для начала мы наберем наш PPU в виде отдельных блоков-модулей, а потом объеденим их под одной крышей, чтобы не плодить сущностей. Я думаю тут комментировать не надо, это действительно самый простой из модулей.
    Последний раз редактировалось HardWareMan; 20.10.2017 в 19:20.

  7. #36
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,563
    Спасибо Благодарностей отдано 
    1,224
    Спасибо Благодарностей получено 
    1,766
    Поблагодарили
    685 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    Особенность PPU в том, что для рендера и для обращения процессором к VRAM используется один и тот же регистр, так что обращаться к VRAM следует только во время кадрового гашения либо при отключенном рендере, иначе результат не предсказуем.
    Можно поточнее про непредсказуемость? Что конкретно непредсказуемо, и какие могут быть результаты?

  8. #37
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,404
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    598
    Поблагодарили
    444 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Рендер начинает брать данные с другого места, а в моменты перезагрузок счетчиков восстанавливать некоторые адреса, мешая собственно самому CPU.

  9. #38
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,563
    Спасибо Благодарностей отдано 
    1,224
    Спасибо Благодарностей получено 
    1,766
    Поблагодарили
    685 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    Рендер начинает брать данные с другого места, а в моменты перезагрузок счетчиков восстанавливать некоторые адреса, мешая собственно самому CPU.
    Такая непредсказуемость будет у тебя в точности повторена в клоне?

  10. #39
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,404
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    598
    Поблагодарили
    444 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Titus, ессно, мы же повторим внутреннюю логическую структуру.

  11. #40
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,563
    Спасибо Благодарностей отдано 
    1,224
    Спасибо Благодарностей получено 
    1,766
    Поблагодарили
    685 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    Titus, ессно, мы же повторим внутреннюю логическую структуру.
    Ну мало ли, какие ты изменения вносишь)
    Например, переводя все узлы схемы на синхронное выполнение, может чего и теряется индивидуалистичное)

Страница 4 из 9 ПерваяПервая 12345678 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Потактовый клон i8080 на FPGA/CPLD
    от HardWareMan в разделе Разработка электроники
    Ответов: 471
    Последнее: 06.07.2020, 19:39
  2. AY-3-8910 in FPGA
    от VELESOFT в разделе Звук
    Ответов: 18
    Последнее: 25.12.2015, 22:13
  3. ZX 48/128 FPGA
    от Александр Бухаров в разделе Несортированное железо
    Ответов: 6
    Последнее: 21.04.2015, 17:04
  4. Dendy on FPGA?
    от Ewgeny7 в разделе Nintendo
    Ответов: 29
    Последнее: 04.11.2009, 17:55
  5. Atari ST(E) на FPGA...
    от ILoveSpeccy в разделе Atari
    Ответов: 6
    Последнее: 26.08.2008, 20:55

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •