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

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

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

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

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

Теперь надо подключить этот модуль в тестбенч, для этого надо написать следующее объявление в tb.v:
1wire [15:0] address;
2reg  [ 7:0] data_in;
3wire [ 7:0] data_out;
4wire        read;
5wire        write;
6
7nes6502 NesMeow(
8
9    .clock  (clk25),
10    .address(address),
11    .data   (data_in),
12    .out    (data_out),
13    .rd     (read),
14    .we     (write)
15);
А также не забыть указать в makefile новый файл
iverilog -g2005-sv -DICARUS=1 -o tb.qqq tb.v nes6502.v

§ Отладка

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

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

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