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

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

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

Посмотрел interrupt control на верилог, который тоже разбирал с точки зрения переделки на ПЛИС неделю назад.
Как и предполагал, с точки зрения дебага - это ад.
Очень многие вещи упрощаются, если переосмыслить схемы с позиции использования синхронной логики, из-за того что большая часть хитрого обвеса латчей с обратными связями как раз и созданы для того, чтобы приблизить их работу к работе DFF.
Для сравнения - схема на латчах и то, к чему я пришел после анализа работы.
Ну и описание совсем примитивное:

input wire nRes;
output wire resp;
input wire phi0;

always @(negegde phi0) begin
resp <= ~nRes;
end

-- 17 Nov 2014, 18:29 --

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

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

Если не использовать их и производные от них как clk вход у DFF (что вообще говоря является bad practice и квартус выдаст предупреждение), то все будет ок.

Вложения:
resp1.png
resp1.png [ 4.84 КБ | Просмотров: 13941 ]
resp.png
resp.png [ 5.17 КБ | Просмотров: 13941 ]

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

Загнал в кактус текущий проект, что-то скомпилировалось, сразу без ошибок и синтезировалось.

Результаты меня вполне устраивают. Есть и латчи и тристейты, всё как положено. Так что я пока на edge переходить не буду, просто переведу все схемы как есть, а потом видно будет.

Вложения:
InterruptControl_RTL.png
InterruptControl_RTL.png [ 58.38 КБ | Просмотров: 13936 ]
Core6502_RTL.png
Core6502_RTL.png [ 18.85 КБ | Просмотров: 13936 ]

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

То, что проект может синтезироваться, еще не означает, что он будет работать без глюков :)

Я попробую сразу edge.

Вообще, что есть икарус? Платформа для стендэлон тестбенчей под верилог?

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

В икарусе есть встроенный симулятор через командную строку + оно умеет EDIF синтезировать (и др. форматы).

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

Так, попробую осилить декодер сегодня, на основе твоей схемы.
Если найдешь когда-нибудь потом в схеме косяки - выкладывай сюда ^_^

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

Не вопрос. К ошибкам схемы относись с пониманием) Я считаю что первоочередная задача - это реализовать "вычислительную мощность", то есть заполнить схему / верилог до конца. А ошибки они всегда есть. Хорошо что они находятся достаточно быстро, потому что логическая схема сама подсказывает где искать, начиная работать "нелогично".

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

В общем, насчет осилить сегодня - это я круто переоценил свои силы :D
Прогресс 45\130.

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

Закачал:
- InstructionRegister
- Predecode
- XYSRegs
+ комментарии к контрольным сигналам

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

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

tfwbbt писал(а):
input wire nRes;
output wire resp;
input wire phi0;

always @(negegde phi0) begin
resp <= ~nRes;
end


Где-то reg потерялся.

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

qb60 писал(а):
tfwbbt писал(а):
input wire nRes;
output wire resp;
input wire phi0;

always @(negegde phi0) begin
resp <= ~nRes;
end


Где-то reg потерялся.

Да не где то, а в декларации модуля :blush:
resp должен быть reg вместо wire, конечно же.
Вообще при любом использовании блока always в левой части операторов присваивания должен быть reg, даже если строишь комбинаторную логику.

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

tfwbbt писал(а):
Вообще, что есть икарус? Платформа для стендэлон тестбенчей под верилог?
Прикольная штука этот икарус.
Полтора года назад начинал в нём симулировать (и проверять) логические схемы org'а (ещё CircuitLab'овские), похожим подходом, и сравнивал с Visual6502. Находил ошибку даже.)
Примерно вот так.

Там удобно через командную строку просимулировать модуль и тестбенч, перегнать всё в waveform'ы и открыть в прожке для их просмотра.

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

Ясненько.

Вообще я планировал осваивать modelsim. Если с ним по каким-то причинам не получится, то, видимо, буду осваивать уже икарус.

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

tfwbbt писал(а):
В общем, насчет осилить сегодня - это я круто переоценил свои силы :D
Прогресс 45\130.

100\130.

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

Перевёл на верилог BranchLogic и проверил что кактус там наколбасит.

У него получилось весьма достойно, я впечатлен.

Код:
module BranchLogic (
    // Outputs
    BRFW, _BRTAKEN,
    // Inputs
    PHI0, BR2, DB7, _IR5, _IR6, _IR7, _C_OUT, _V_OUT, _N_OUT, _Z_OUT
);

    input PHI0, BR2, DB7, _IR5, _IR6, _IR7, _C_OUT, _V_OUT, _N_OUT, _Z_OUT;

    output BRFW, _BRTAKEN;

    wire BRFW, _BRTAKEN;

    // Clocks
    wire PHI1, PHI2;
    assign PHI1 = ~PHI0;
    assign PHI2 = PHI0;

    // Branch Forward
    wire BR2Latch_Out, Latch1_Out, Latch2_Out;
    mylatch BR2Latch ( BR2Latch_Out, BR2, PHI2);
    mylatch Latch1 ( Latch1_Out, (~(~DB7 & BR2Latch_Out) & ~(~BR2Latch_Out & Latch2_Out)), PHI1);
    mylatch Latch2 ( Latch2_Out, ~Latch1_Out, PHI2);
    assign BRFW = Latch1_Out;

    // Branch Taken
    wire temp;
    assign temp = ~(
        (_C_OUT | ~_IR6 | _IR7) |
        (_V_OUT | _IR6 | ~_IR7) |
        (_N_OUT | ~_IR6 | ~_IR7) |
        (_Z_OUT | _IR6 | _IR7) );
    assign _BRTAKEN = ~(temp & _IR5) & (temp | _IR5);

endmodule   // BranchLogic


Вложения:
BranchLogic_RTL.png
BranchLogic_RTL.png [ 23.16 КБ | Просмотров: 13869 ]

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

130\130 :yahoo:
https://drive.google.com/file/d/0ByTdMT ... sp=sharing
Адовая работенка, конечно. Страшно становится, когда представляю, как ты делал саму схему с топологии чипа.

Дальше, видимо, буду продолжать изучать работу по твоей схеме.
Что-то мне подсказывает, что можно легко совместить предекод и буфер опкода (instruction register).
Также очень странно, что brk не считается implied командой.

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

Цитата:
130\130 :yahoo:

Гуд, я это сделаю автоматом, с помощью утилиты, которая перегонит мне транзисторную маску в логику) Потом сверимся)

Цитата:
Страшно становится, когда представляю, как ты делал саму схему с топологии чипа.

Схему топологии я перепроверял три раза. И транзисторную маску столько же.

Если посмотришь исходники декодера:
view-source:http://breaknes.com/files/6502/decoder.htm
То там можно найти эту самую маску.

Если ты делаешь комбинаторику, то нет необходимости выход держать в регистре. Можно через assign назначить выходы для wire [129:0] D.

BRK не implied, может быть потому что она инициирует специальную BRK-последовательность, то есть обработку прерываний.

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

Цитата:
Если ты делаешь комбинаторику, то нет необходимости выход держать в регистре. Можно через assign назначить выходы для wire [129:0] D.


Понятно :)
Цитата:
При описании выражений внутри поведенческих блоков комбинаторной логики, с правой стороны от знака равенства, как и раньше, можно использовать типы сигналов wire или reg, а вот с левой стороны теперь используется только тип reg:

reg [3:0] c;
always @(a or b or d)
begin
c = <выражение использующее входные сигналы a,b,d>;
end

Обратите внимание, что регистры, которым идет присвоение в таких поведенческих блоках не будут выполнены в виде D-триггеров после синтеза. Это часто вызывает недоумение у начинающих.

отсюда
Можешь посмотреть мой файл декодера в rtl viewer и убедиться - там 100% комбинаторная логика.

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

Я так и подумал вначале)

Но всё таки сделаю через assign, ибо мне так нагляднее проецировать верилог на оригинальную реализацию того что было в 6502.

Моя версия тут : https://code.google.com/p/breaks/source ... MOS_6502.v

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

Перегнал в верилог флаги и шины. Очень интересно было как квартус справится с таким заданием, и похоже у него это получилось)
Я пробежался по полученной синтезатором схеме и не нашёл явных косяков.

Вложения:
6502_wip1.png
6502_wip1.png [ 71.99 КБ | Просмотров: 13715 ]
FLAGS.png
FLAGS.png [ 51.08 КБ | Просмотров: 13715 ]
BUSES.png
BUSES.png [ 54.53 КБ | Просмотров: 13716 ]

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

+ Dispatcher
+ Program Counter

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

Осталась рандомная логика.

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