Сообщения без ответов | Активные темы Текущее время: 28 мар 2024, 19:57



Ответить на тему  [ Сообщений: 411 ]  На страницу Пред.  1 ... 14, 15, 16, 17, 18, 19, 20, 21  След.
 Очень низкоуровневый эмулятор 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=view
http://breaknes.com/images/wys/c76cb0b8 ... b26fdf.jpg

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


Сообщение 08 ноя 2014, 19:04
Профиль ICQ WWW
Аватара пользователя

Зарегистрирован:
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
takt.png [ 25.28 КБ | Просмотров: 11768 ]
Сообщение 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
Профиль ICQ WWW
Аватара пользователя

Зарегистрирован:
24 июл 2007, 10:41
Сообщения: 570
Там не общий сигнал управления. На один латч подается PHI1, на второй PHI2.

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


Вложения:
FF.png
FF.png [ 85.5 КБ | Просмотров: 11682 ]
Сообщение 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 какой-то.
Все, я окончательно запутался. :banghead:


Сообщение 11 ноя 2014, 19:36
Профиль ICQ WWW
Аватара пользователя

Зарегистрирован:
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
Профиль ICQ WWW
Аватара пользователя

Зарегистрирован:
24 июл 2007, 10:41
Сообщения: 570
Цитата:
этот проект тоже ваша работа, кстати?

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


Сообщение 16 ноя 2014, 19:06
Профиль ICQ WWW
Аватара пользователя

Зарегистрирован:
24 июл 2007, 10:41
Сообщения: 570
Начал потихоньку перегонять схемы в верилог.

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/


Сообщение 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
Профиль ICQ WWW
Аватара пользователя

Зарегистрирован:
24 июл 2007, 10:41
Сообщения: 570
Согласен со всеми пунктами) Декодер -- это черновой вариант, как видишь он даже не закончен. Я просто начал с него, чтобы проверить синтаксис верилога ))

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

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

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


Вложения:
d0.png
d0.png [ 396.11 КБ | Просмотров: 11468 ]
Сообщение 17 ноя 2014, 14:01
Профиль
Аватара пользователя

Зарегистрирован:
05 ноя 2014, 23:03
Сообщения: 29
Эм. Вот тут?

-- 17 Nov 2014, 13:06 --

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

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


Вложения:
d0.png
d0.png [ 19.81 КБ | Просмотров: 11468 ]
Сообщение 17 ноя 2014, 15:45
Профиль ICQ WWW
Аватара пользователя

Зарегистрирован:
24 июл 2007, 10:41
Сообщения: 570
Это какой-то подпространственный разлом, я проверю логическую схему) Спасибо)

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

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


Вложения:
d128.png
d128.png [ 280.48 КБ | Просмотров: 11462 ]
Сообщение 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...


Показать сообщения за:  Поле сортировки  
Ответить на тему   [ Сообщений: 411 ]  На страницу Пред.  1 ... 14, 15, 16, 17, 18, 19, 20, 21  След.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


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

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by STSoftware for PTF (mod by Zeru-j).
Русская поддержка phpBB