Очень низкоуровневый эмулятор 6502 / NES
Автор |
Сообщение |
08 ноя 2014, 18:41 |
|
Зарегистрирован: 05 ноя 2014, 23:03 Сообщения: 29
|
org писал(а): И по уровню сейчас CMOS не работает, только edge. Хотя D-latch по идее можно сделать как DFF по posedge, должно работать идентично. Очень забавно это слышать от тебя после поста: Цитата: Нашёл у себя ещё одну ошибку - все D-LATCH по какой-то причине стали работать не по уровню, а по фронту Поменял как надо, схема стала адекватно перебирать циклы, но почему-то застревает после исполнения одного опкода. В общем случае просто так взять и заменить нельзя. Если сигнал измениться после фронта у латча - он защелкнется, более того - этот сигнал пока уровень на защелке активен может колбаситься как угодно, сохранится только состояние на момент выключения. Ну, это если я правильно понял твое описание. Вопрос в студию: download/file.php?id=791&mode=viewhttp://breaknes.com/images/wys/c76cb0b8 ... b26fdf.jpgНа обоих изображениях есть T5. На обоих изображениях это выход. Что за фигня?
|
|
08 ноя 2014, 19:04 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
Нене.. в симуляторе 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 [ 25.28 КБ | Просмотров: 12055 ]
|
|
08 ноя 2014, 19:58 |
|
Зарегистрирован: 05 ноя 2014, 23:03 Сообщения: 29
|
> Кстати, с теми схемами старыми поаккуратннее) Там могут быть ошибки) Да, я уже подумываю над тем, чтобы найти прогу и открыть твою схему, чтобы не наступать на грабли.
> Да, кстати, есть ещё вики, можешь там полазить, наверняка на часть вопросов есть ответы) Видел ее, но, как говорится, чем дальше в лес - тем больше дров ~_~.
|
|
09 ноя 2014, 09:19 |
|
Зарегистрирован: 24 июл 2007, 06:54 Сообщения: 492 Откуда: Embedded
|
D-latch можно рассматривать как D-trigger с записью по спаду. Однако, есть несколько техник использования D-latch, в которых замена на D-trigger невозможна без корректировки схемы. Это самоорганизующиеся схемы, сигналы в которых идут по кольцу через латчи и устаканиваются только если разрешен их прямой пропуск. Поэтому, данные схемы на этапе первичного моделирования для проверки корректности лучше все же делать на D-latch'ах, а вот уже после следует конвертировать на D-trigger'ы, т.к. это позволит позже переложить на любое ASIC решение.
_________________ Tried so hard and got so far, but in the end, it doesn't even matter...
|
|
10 ноя 2014, 15:08 |
|
Зарегистрирован: 05 ноя 2014, 23:03 Сообщения: 29
|
HardWareMan писал(а): D-latch можно рассматривать как D-trigger с записью по спаду. Однако, есть несколько техник использования D-latch, в которых замена на D-trigger невозможна без корректировки схемы. Это самоорганизующиеся схемы, сигналы в которых идут по кольцу через латчи и устаканиваются только если разрешен их прямой пропуск. Поэтому, данные схемы на этапе первичного моделирования для проверки корректности лучше все же делать на D-latch'ах, а вот уже после следует конвертировать на D-trigger'ы, т.к. это позволит позже переложить на любое ASIC решение. По переднему фронту же. И необходимое условие - сигнал на входе изменяется только в моменты фронта/спада тактирующего сигнала, т.е. система представляет собой автомат состояний. По поводу этих техник - где почитать про них?
|
|
10 ноя 2014, 16:28 |
|
Зарегистрирован: 24 июл 2007, 06:54 Сообщения: 492 Откуда: Embedded
|
tfwbbt писал(а): HardWareMan писал(а): D-latch можно рассматривать как D-trigger с записью по спаду. Однако, есть несколько техник использования D-latch, в которых замена на D-trigger невозможна без корректировки схемы. Это самоорганизующиеся схемы, сигналы в которых идут по кольцу через латчи и устаканиваются только если разрешен их прямой пропуск. Поэтому, данные схемы на этапе первичного моделирования для проверки корректности лучше все же делать на D-latch'ах, а вот уже после следует конвертировать на D-trigger'ы, т.к. это позволит позже переложить на любое ASIC решение. По переднему фронту же. И необходимое условие - сигнал на входе изменяется только в моменты фронта/спада тактирующего сигнала, т.е. система представляет собой автомат состояний. По поводу этих техник - где почитать про них? Именно по заднему. Ибо в схемах с D-latch'ем важно уже устоявшееся состояние входа D. При этом, выход Q будет меняться согласно входу D, пока не снимется сигнал защелкивания.
_________________ Tried so hard and got so far, but in the end, it doesn't even matter...
|
|
10 ноя 2014, 19:48 |
|
Зарегистрирован: 05 ноя 2014, 23:03 Сообщения: 29
|
HardWareMan писал(а): tfwbbt писал(а): По переднему фронту же. И необходимое условие - сигнал на входе изменяется только в моменты фронта/спада тактирующего сигнала, т.е. система представляет собой автомат состояний. По поводу этих техник - где почитать про них? Именно по заднему. Ибо в схемах с D-latch'ем важно уже устоявшееся состояние входа D. При этом, выход Q будет меняться согласно входу D, пока не снимется сигнал защелкивания. Странно. Если я соединю 2 латча последовательно, с общим сигналом управления, то по заднему фронту в них установится одно и то же значение со входа, или во второй запишется значение от первого, а в первый - со входа?
|
|
11 ноя 2014, 00:32 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
Там не общий сигнал управления. На один латч подается PHI1, на второй PHI2.
То есть грубо говоря в один полутакт "выход" такого псевдо-триггера "отсекается", чтобы загрузить новое значение. А во время второго полутакта триггер просто "рефрешится" + выдает текущее значение наружу.
Вложения:
FF.png [ 85.5 КБ | Просмотров: 11969 ]
|
|
11 ноя 2014, 01:14 |
|
Зарегистрирован: 05 ноя 2014, 23:03 Сообщения: 29
|
Я без привязки к конкретной схеме имел ввиду. Но ты в целом косвенно подтвердил мои подозрения. В том, что 2 латча формируют несколько ущербный триггер.
|
|
11 ноя 2014, 09:22 |
|
Зарегистрирован: 24 июл 2007, 06:54 Сообщения: 492 Откуда: Embedded
|
tfwbbt писал(а): Я без привязки к конкретной схеме имел ввиду. Но ты в целом косвенно подтвердил мои подозрения. В том, что 2 латча формируют несколько ущербный триггер. Это не ущербный триггер. Это основа для Bus Keeper'а.
_________________ Tried so hard and got so far, but in the end, it doesn't even matter...
|
|
11 ноя 2014, 12:32 |
|
Зарегистрирован: 05 ноя 2014, 23:03 Сообщения: 29
|
Теперь еще и bus keeper какой-то. Все, я окончательно запутался.
|
|
11 ноя 2014, 19:36 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
http://en.wikipedia.org/wiki/Bus-holderКогда на шине "Z" bus keeper "подтягивает" её в предыдущее значение, чтобы она не плавала.
|
|
11 ноя 2014, 21:42 |
|
Зарегистрирован: 05 ноя 2014, 23:03 Сообщения: 29
|
Гуглить я умею но все равно спасибо. http://wiki.psxdev.ru/index.php/CPU_CELLS#Bus_keeper - этот проект тоже ваша работа, кстати? В принципе я понял (надеюсь) все про работу латчей. Нашел в квартусе элемент latch. В крайнем случае посмотрю как он работает "в железе". Скачал твою схему, потихоньку ковыряю random logic.
|
|
12 ноя 2014, 00:59 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
Цитата: этот проект тоже ваша работа, кстати? Винтажные чипы это мой сольный проект, а проц PSX - командный. Соседняя тема на этом форуме ) viewtopic.php?f=13&t=4106
|
|
16 ноя 2014, 19:06 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
Начал потихоньку перегонять схемы в верилог. http://forum.6502.org/download/file.php?id=2002http://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/
|
|
17 ноя 2014, 13:09 |
|
Зарегистрирован: 05 ноя 2014, 23:03 Сообщения: 29
|
Код: // 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;
|
|
17 ноя 2014, 13:49 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
Согласен со всеми пунктами) Декодер -- это черновой вариант, как видишь он даже не закончен. Я просто начал с него, чтобы проверить синтаксис верилога ))
По поводу параллельного присваивания -- была идея что типа все линейки декодера должны срабатывать одновременно, как на реальном 6502.
Скорее всего сделаю как ты предложил - обычными NOR-ами. Так и синтезатору будет проще.
Где ты в D0 нашёл 6 транзисторов не вижу?)
Вложения:
d0.png [ 396.11 КБ | Просмотров: 11755 ]
|
|
17 ноя 2014, 14:01 |
|
Зарегистрирован: 05 ноя 2014, 23:03 Сообщения: 29
|
Эм. Вот тут? -- 17 Nov 2014, 13:06 -- Цитата: По поводу параллельного присваивания -- была идея что типа все линейки декодера должны срабатывать одновременно, как на реальном 6502. Они и так будут срабатывать одновременно. Простая логика в плис - условно бесплатные операции с точки зрения потраченного на них времени.
Вложения:
d0.png [ 19.81 КБ | Просмотров: 11755 ]
|
|
17 ноя 2014, 15:45 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
Это какой-то подпространственный разлом, я проверю логическую схему) Спасибо)
Кстати IR0 используется в декодере эксклюзивно только для 128 линии, она вообще стоит особняком от всех. IR0 приходит на неё и затем обрывается.
В транзисторной схеме я его развёл просто для удобства.
Вложения:
d128.png [ 280.48 КБ | Просмотров: 11749 ]
|
|
17 ноя 2014, 19:13 |
|
Зарегистрирован: 24 июл 2007, 06:54 Сообщения: 492 Откуда: Embedded
|
tfwbbt писал(а): Они и так будут срабатывать одновременно. Простая логика в плис - условно бесплатные операции с точки зрения потраченного на них времени. Это если фиттер тебя уважает. Если нет (а он никого не уважает) - то иголок у тебя будет мама не горюй. Декодер на комбинаторной логике в оригинале, поэтому он должен быть таким и в плисине, за исключением требования синхронизации данных сигналов относительно друг друга.
_________________ Tried so hard and got so far, but in the end, it doesn't even matter...
|
|
|
Кто сейчас на конференции |
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2 |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения
|
|