§ Создание проекта

Начну я делать проект на Verilog. Для этого я сначала делаю testbench, потом пишу процессор и в конце уже синтезирую на реальной схеме. Писать я буду для микросхему MAX10-02DC, а там памяти только 12кб, но сам код для процессора должен быть универсальным. Я попробую его сделать универсальным и подходящим по таймингам настолько, насколько смогу. Шаблон для testbench я возьму с этой страницы.
Итак, создаем папку где-нибудь, складываем файлы из шаблона тестбенча. Делать проект буду на своей любимой частоте 25 МГц и поэтому придется для этого использовать модуль PLL. Но вообще пока что это не требуется, потому что всё будет выполняться в данный момент именно на симуляторе verilog.

§ Модуль процессора

Создам первый шаблон
module nes6502(

    input  wire         clock,
    output wire [15:0]  address,
    input  wire [ 7:0]  data,
    output reg  [ 7:0]  out,
    output reg          rd,
    output reg          we
);

endmodule
  • clock будет тактироваться от 25 мгц, но хотя надо 3.5 мгц
  • address принимает 64кб, но в реальной схеме у меня только 12кб (или 46кб для ПЛИС Cyclone 3 марсохода)
  • data входящие данные из памяти
  • out исходящие данные для записи в память
  • rd сигнал на чтение данных операнда из памяти, это нужно для PPU для Денди
  • we запись в память (write enabled)
Объявлю все регистры
// Регистры процессора
reg [ 7:0] A; reg [ 7:0] X; reg [ 7:0] Y;
reg [ 7:0] P; reg [ 7:0] S; reg [15:0] pc = 16'h0000;
Теперь очень важный момент такой, что иногда указатель в память бывает либо с регистра PC, текущего счетчика адреса, либо с некоторого курсора, который извлекает операнд
assign address = bus ? cursor : pc; // Выбор источника памяти

reg        bus = 0;
reg [15:0] cursor;
Если bus=0, то указателем в память будет PC, а если bus=1, то регистр cursor.

§ Подключение nes6502 в tb

Теперь надо подключить этот модуль в тестбенч, для этого надо написать следующее объявление в tb.v:
wire [15:0] address;
reg  [ 7:0] data_in;
wire [ 7:0] data_out;
wire        read;
wire        write;

nes6502 NesMeow(

    .clock  (clk25),
    .address(address),
    .data   (data_in),
    .out    (data_out),
    .rd     (read),
    .we     (write)
);
А также не забыть указать в makefile новый файл
iverilog -g2005-sv -DICARUS=1 -o tb.qqq tb.v nes6502.v

§ Отладка

Для отладки надо сначала запустить сгенерированный vcd файл через команду gtkwave tb.vcd и получится окно.

В этом окне я обычно выбираю слева все провода и нажимаю Append, получая систему сигналов

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