Форум Эму-Россия
http://forum.emu-russia.net/

Очень низкоуровневый эмулятор 6502 / NES
http://forum.emu-russia.net/viewtopic.php?f=13&t=3938
Страница 17 из 21

Автор:  tfwbbt [ 08 ноя 2014, 18:41 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

org писал(а):
И по уровню сейчас CMOS не работает, только edge. Хотя D-latch по идее можно сделать как DFF по posedge, должно работать идентично.


Очень забавно это слышать от тебя после поста:

Цитата:
Нашёл у себя ещё одну ошибку - все D-LATCH по какой-то причине стали работать не по уровню, а по фронту %)

Поменял как надо, схема стала адекватно перебирать циклы, но почему-то застревает после исполнения одного опкода.


В общем случае просто так взять и заменить нельзя. Если сигнал измениться после фронта у латча - он защелкнется, более того - этот сигнал пока уровень на защелке активен может колбаситься как угодно, сохранится только состояние на момент выключения. Ну, это если я правильно понял твое описание.


Вопрос в студию:
download/file.php?id=791&mode=view
http://breaknes.com/images/wys/c76cb0b8 ... b26fdf.jpg

На обоих изображениях есть T5. На обоих изображениях это выход. Что за фигня? :blink:

Автор:  org [ 08 ноя 2014, 19:04 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Нене.. в симуляторе 1 полу-такт длится одну итерацию. Чтобы там работал edge нужно выставить длительность одного полу-такта 2-4 итерации. Тогда edge будет схватываться. Естественно у меня вход не захватывался, потому что с одной итерацией на полу-такт это сделать невозможно)
Я говорю про ПЛИС. Там должно нормально работать. Хотя с расколбасом входного сигнала может быть и не захватится как нужно)

Один китаец по моим транзисторным схемам сделал PPU, у него DFF нормально по фронту работали, с его слов.

T5 - это внутренний сигнал для рандомной логики. 5й цикл исполнения инструкций.
Дело в том, что на декодер поступает только T0-T5, но некоторые инструкции выполняются и T5 и T6 циклов. Чтобы они срабатывали разработчики решили не запускать в декодер ещё линии, а просто сделать так, чтобы часть линий срабатывала на любой цикл (TX), но на выходе они уже обрезались когда нужно этими внутренними T5 и T6.

Короче T5 это тоже самое что /T5, но только для некоторых линий декодера, которые срабатывают на любой цикл (TX)

Кстати, с теми схемами старыми поаккуратннее) Там могут быть ошибки)

-- 08 ноя 2014, 18:25 --

Да, кстати, есть ещё вики, можешь там полазить, наверняка на часть вопросов есть ответы)

http://wiki.breaknes.com/6502

Вложения:
takt.png
takt.png [ 25.28 КБ | Просмотров: 12008 ]

Автор:  tfwbbt [ 08 ноя 2014, 19:58 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

> Кстати, с теми схемами старыми поаккуратннее) Там могут быть ошибки)
Да, я уже подумываю над тем, чтобы найти прогу и открыть твою схему, чтобы не наступать на грабли.

> Да, кстати, есть ещё вики, можешь там полазить, наверняка на часть вопросов есть ответы)
Видел ее, но, как говорится, чем дальше в лес - тем больше дров ~_~.

Автор:  HardWareMan [ 09 ноя 2014, 09:19 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

D-latch можно рассматривать как D-trigger с записью по спаду. Однако, есть несколько техник использования D-latch, в которых замена на D-trigger невозможна без корректировки схемы. Это самоорганизующиеся схемы, сигналы в которых идут по кольцу через латчи и устаканиваются только если разрешен их прямой пропуск. Поэтому, данные схемы на этапе первичного моделирования для проверки корректности лучше все же делать на D-latch'ах, а вот уже после следует конвертировать на D-trigger'ы, т.к. это позволит позже переложить на любое ASIC решение.

Автор:  tfwbbt [ 10 ноя 2014, 15:08 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

HardWareMan писал(а):
D-latch можно рассматривать как D-trigger с записью по спаду. Однако, есть несколько техник использования D-latch, в которых замена на D-trigger невозможна без корректировки схемы. Это самоорганизующиеся схемы, сигналы в которых идут по кольцу через латчи и устаканиваются только если разрешен их прямой пропуск. Поэтому, данные схемы на этапе первичного моделирования для проверки корректности лучше все же делать на D-latch'ах, а вот уже после следует конвертировать на D-trigger'ы, т.к. это позволит позже переложить на любое ASIC решение.


По переднему фронту же. И необходимое условие - сигнал на входе изменяется только в моменты фронта/спада тактирующего сигнала, т.е. система представляет собой автомат состояний.
По поводу этих техник - где почитать про них?

Автор:  HardWareMan [ 10 ноя 2014, 16:28 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

tfwbbt писал(а):
HardWareMan писал(а):
D-latch можно рассматривать как D-trigger с записью по спаду. Однако, есть несколько техник использования D-latch, в которых замена на D-trigger невозможна без корректировки схемы. Это самоорганизующиеся схемы, сигналы в которых идут по кольцу через латчи и устаканиваются только если разрешен их прямой пропуск. Поэтому, данные схемы на этапе первичного моделирования для проверки корректности лучше все же делать на D-latch'ах, а вот уже после следует конвертировать на D-trigger'ы, т.к. это позволит позже переложить на любое ASIC решение.


По переднему фронту же. И необходимое условие - сигнал на входе изменяется только в моменты фронта/спада тактирующего сигнала, т.е. система представляет собой автомат состояний.
По поводу этих техник - где почитать про них?

Именно по заднему. Ибо в схемах с D-latch'ем важно уже устоявшееся состояние входа D. При этом, выход Q будет меняться согласно входу D, пока не снимется сигнал защелкивания.

Автор:  tfwbbt [ 10 ноя 2014, 19:48 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

HardWareMan писал(а):
tfwbbt писал(а):
По переднему фронту же. И необходимое условие - сигнал на входе изменяется только в моменты фронта/спада тактирующего сигнала, т.е. система представляет собой автомат состояний.
По поводу этих техник - где почитать про них?

Именно по заднему. Ибо в схемах с D-latch'ем важно уже устоявшееся состояние входа D. При этом, выход Q будет меняться согласно входу D, пока не снимется сигнал защелкивания.

Странно.
Если я соединю 2 латча последовательно, с общим сигналом управления, то по заднему фронту в них установится одно и то же значение со входа, или во второй запишется значение от первого, а в первый - со входа?

Автор:  org [ 11 ноя 2014, 00:32 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Там не общий сигнал управления. На один латч подается PHI1, на второй PHI2.

То есть грубо говоря в один полутакт "выход" такого псевдо-триггера "отсекается", чтобы загрузить новое значение. А во время второго полутакта триггер просто "рефрешится" + выдает текущее значение наружу.

Вложения:
FF.png
FF.png [ 85.5 КБ | Просмотров: 11922 ]

Автор:  tfwbbt [ 11 ноя 2014, 01:14 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Я без привязки к конкретной схеме имел ввиду.
Но ты в целом косвенно подтвердил мои подозрения. В том, что 2 латча формируют несколько ущербный триггер.

Автор:  HardWareMan [ 11 ноя 2014, 09:22 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

tfwbbt писал(а):
Я без привязки к конкретной схеме имел ввиду.
Но ты в целом косвенно подтвердил мои подозрения. В том, что 2 латча формируют несколько ущербный триггер.

Это не ущербный триггер. Это основа для Bus Keeper'а.

Автор:  tfwbbt [ 11 ноя 2014, 12:32 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Теперь еще и bus keeper какой-то.
Все, я окончательно запутался. :banghead:

Автор:  org [ 11 ноя 2014, 19:36 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

http://en.wikipedia.org/wiki/Bus-holder

Когда на шине "Z" bus keeper "подтягивает" её в предыдущее значение, чтобы она не плавала.

Автор:  tfwbbt [ 11 ноя 2014, 21:42 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Гуглить я умею :) но все равно спасибо.
http://wiki.psxdev.ru/index.php/CPU_CELLS#Bus_keeper - этот проект тоже ваша работа, кстати?

В принципе я понял (надеюсь) все про работу латчей.
Нашел в квартусе элемент latch. В крайнем случае посмотрю как он работает "в железе".

Скачал твою схему, потихоньку ковыряю random logic. :)

Автор:  org [ 12 ноя 2014, 00:59 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Цитата:
этот проект тоже ваша работа, кстати?

Винтажные чипы это мой сольный проект, а проц PSX - командный.
Соседняя тема на этом форуме ) viewtopic.php?f=13&t=4106

Автор:  org [ 16 ноя 2014, 19:06 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Начал потихоньку перегонять схемы в верилог.

http://forum.6502.org/download/file.php?id=2002

http://forum.6502.org/viewtopic.php?f=4&t=3092

-- 16 ноя 2014, 18:44 --

Закоммитил актуальную версию :

https://code.google.com/p/breaks/source ... MOS_6502.v

Компиляю пока икарусом :

set PATH=c:\iverilog\bin;%PATH%
iverilog -omos_6502 MOS_6502.v
vvp mos_6502
pause

http://iverilog.icarus.com/

Автор:  tfwbbt [ 17 ноя 2014, 13:09 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Код:

// Assign inputs as it happen in real decoder.
assign inputs[0] = _timer[1];
assign inputs[1] = _timer[0];
assign inputs[2] = ~ instr_reg[5];
assign inputs[3] = instr_reg[5];
assign inputs[4] = ~ instr_reg[6];
assign inputs[5] = instr_reg[6];
assign inputs[6] = ~ instr_reg[2];
assign inputs[7] = instr_reg[2];
assign inputs[8] = ~ instr_reg[3];
assign inputs[9] = instr_reg[3];
assign inputs[10] = ~ instr_reg[4];
assign inputs[11] = instr_reg[4];
assign inputs[12] = ~ instr_reg[7];
assign inputs[13] = instr_reg[7];
assign inputs[14] = ~ instr_reg[0];
assign inputs[15] = instr_reg[0] | instr_reg[1]; // IR01
assign inputs[16] = ~ instr_reg[1];
assign inputs[17] = _timer[2];
assign inputs[18] = _timer[3];
assign inputs[19] = _timer[4];
assign inputs[20] = _timer[5];

always #1 @(*) begin

// By default all decoder outputs are zero.
decoder_out = 0; // CHECK : Is it synthesizable ??? Can we just zero it?

case (inputs)
21'b000101100000100100000: decoder_out[0] <= 1'b1;
21'b000000010110001000100: decoder_out[1] <= 1'b1;
21'b000000011010001001000: decoder_out[2] <= 1'b1;
21'b010100011001100100000: decoder_out[3] <= 1'b1;
21'b010101011010100100000: decoder_out[4] <= 1'b1;
21'b010110000001100100000: decoder_out[5] <= 1'b1;

endcase

// Line 128 (IMPL)
decoder_out[128] <= ~ (instr_reg[0] | instr_reg[2] | ~instr_reg[3]);

// Line 129 (Push/Pull)

end


Я мб не правильно понял, но в твоем декодере в схеме там по сути монтажное ИЛИ-НЕ, и, скажем, для сигнала store (D97) на выход влияет только IR6, /IR7 и IR5, причем 1 на любом обратит тебе вход в 0.

Поэтому, во первых, нули в твоей реализации будут считаться как нули, а не как don't care. Если тебе нужен don't care, можно использовать casex, в таком случае don't care элементы можно заменить на x.
Возьмем первую линию, к примеру:
21'b000101100000100100000: decoder_out[0] <= 1'b1;
если ты заменишь последний 0 на 1, то верилог посчитает условие не выполненным.
если использовать casex:
21'bxxx1x11xxxxx1xx1xxxxx: decoder_out[0] <= 1'b1;

Во вторых, строчка decoder_out = 0; // CHECK : Is it synthesizable ??? Can we just zero it? скорее всего вызовет конфликт драйвера сигнала - в данном случае ты назначаешь сигналу 2 драйвера.
Правильно данная вещь делается как то так:

case(opcode)
8'hFF: do_smth = 1;
default: do_smth = 0;
endcase

Ну и в третьих ты накосячил. Когда ты пишешь значения для case у тебя они должны идти от старшего бита к младшему. Ты сделал наоборот. К примеру D0 у тебя чувствителен к T2, когда как должен быть к instr_reg[5].
Еще один косяк - тот же D0. Я на твоей схеме ясно вижу 6 транзисторов, значит D0 чувствителен к 6 входным сигналам. У тебя же в D0 всего пять единиц. Помимо этого, ты пропустил один сигнал в декларации - IR0. Да, влияет он только на D128, но ведь ты пытаешься сделать 1 в 1.

Т.е. сейчас:
21'b000101100000100100000
Должно быть:
22'bxxxxxx1xx1x1xxx11x1xxx

Ну и в четвертых, оператор присваивания <= создан для описания событий, которые происходят одновременно, т.е. синхронная логика. В данном случае у тебя тут набор примитивных логических элементов, поэтому правильно использовать = вместо <=.
Начальные сведения об этом можешь почерпнуть тут: http://marsohod.org/index.php/ourblog/1 ... loglesson5.

Вообще если интересует мое мнение, то я бы обошелся без case и записал бы D0 как то так:
always @(*) begin
D0 = !(( IR0 || IR1 ) || !IR7 || !IR4 || !IR2 || IR6 || IR5 )
end

Ну и хорошо, что ты занялся верилогом, а то я как-то бездельничать начал :).

Добавлено: ах да, в твоей текущей реализации опять же ошибка. В данном случае исключение - "0" на всех чувствительных входах, при нем будет "1" на выходе. Поэтому правильно было записать вообще так:
22'bxxxxxx0xx0x0xxx00x0xxx: decoder_out[0] <= 1'b1;

Автор:  org [ 17 ноя 2014, 13:49 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Согласен со всеми пунктами) Декодер -- это черновой вариант, как видишь он даже не закончен. Я просто начал с него, чтобы проверить синтаксис верилога ))

По поводу параллельного присваивания -- была идея что типа все линейки декодера должны срабатывать одновременно, как на реальном 6502.

Скорее всего сделаю как ты предложил - обычными NOR-ами. Так и синтезатору будет проще.

Где ты в D0 нашёл 6 транзисторов не вижу?)

Вложения:
d0.png
d0.png [ 396.11 КБ | Просмотров: 11708 ]

Автор:  tfwbbt [ 17 ноя 2014, 14:01 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Эм. Вот тут?

-- 17 Nov 2014, 13:06 --

Цитата:
По поводу параллельного присваивания -- была идея что типа все линейки декодера должны срабатывать одновременно, как на реальном 6502.

Они и так будут срабатывать одновременно. Простая логика в плис - условно бесплатные операции с точки зрения потраченного на них времени.

Вложения:
d0.png
d0.png [ 19.81 КБ | Просмотров: 11708 ]

Автор:  org [ 17 ноя 2014, 15:45 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Это какой-то подпространственный разлом, я проверю логическую схему) Спасибо)

Кстати IR0 используется в декодере эксклюзивно только для 128 линии, она вообще стоит особняком от всех.
IR0 приходит на неё и затем обрывается.

В транзисторной схеме я его развёл просто для удобства.

Вложения:
d128.png
d128.png [ 280.48 КБ | Просмотров: 11702 ]

Автор:  HardWareMan [ 17 ноя 2014, 19:13 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

tfwbbt писал(а):
Они и так будут срабатывать одновременно. Простая логика в плис - условно бесплатные операции с точки зрения потраченного на них времени.

Это если фиттер тебя уважает. Если нет (а он никого не уважает) - то иголок у тебя будет мама не горюй. Декодер на комбинаторной логике в оригинале, поэтому он должен быть таким и в плисине, за исключением требования синхронизации данных сигналов относительно друг друга.

Страница 17 из 21 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/