Лисья Нора

Оглавление


§ Превью

Я никогда не пользовался этим устройством, которое было разработано и выпущено в 1986 году (а родился я вообще в 1987), так что оно старше меня на целый год. Несмотря на это, мне нравятся старые неторопливые железяки и поэтому я решил создать отдельный раздел, чтобы посвятить разработке как аппаратного, так и программного обеспечения.

§ Icarus: verilog

Как и всегда, я начинаю разговор о создании очередного процессора на Icarus Verilog. Буду рассказывать о той же самой последовательности действий, которые считаю наиболее обычной. Мне нравится связка IVerilog + Gtkwave + Verilator. Если первые два работают как в Linux, так и в Windows, то Verilator почему-то работает только под Linux. Вкратце о том, что делает каждый из программных пакетов:
С помощью библиотеки SDL1.2 или SDL2 можно сделать окно с видеоадаптером, который позволит с помощью верилятора видеть экран таким, каким бы он был в реальной схеме. Для меня в свое время это было потрясающим открытием, и я до сих пор пользуюсь данным методом. Следует помнить, что это лишь один из методов, а не единственный. Верилятор обладает огромными возможностями к созданию абсолютно любой логической схемы.
Для того чтобы начать тестировать код, необходимо создать два файла, обычно я их называю: makefile и tb.v. В первом файле записываются правила сборки, чтобы не писать каждый раз руками одно и то же, а во втором тестовый код. Начну пока что рассказ с tb.v:
`timescale 10ns / 1ns
module tb;
reg reset_n = 0, clock_100 = 0, clock_25 = 0;
always #0.5 clock_100 = ~clock_100; // Генератор частоты 100 мгц
always #2.0 clock_25 = ~clock_25; // И 25 мгц
initial begin $dumpfile("tb.vcd"); $dumpvars(0, tb); end
initial begin #2.5 reset_n = 1; #2000 $finish; end
endmodule
Разберу почти каждую строку кода. Начну с первой: timescale 10ns / 1ns. В ней указывается метрика. Первое значение 10ns – это условное обозначение единицы этой метрики, то есть, если мы где-то в файле указываем #1, то это будет считаться продолжительностью 10 нс. Второй же параметр означает минимальный синтезируемый отрезок времени, то есть, всего лишь 1 нс. Это точно также как если бы 1 миллиметр относился к 1 см, в отношении 1/10.
Далее у нас идут 3 регистра: reset_n – симуляция нажатия кнопки сброса, вначале он становится 0, а через непродолжительное время 1, а также тактовые генераторы 100 и 25 мгц.
В общем блоке initial ... end объявляются некоторые заранее известные значения, при этом, растянутые во времени. При самом начальном этапе, устанавливаются стартовые значения $dumpfile и $dumpvars, которые указывают компилятору, в какие файлы требуется выгружать результат, и откуда.
Спустя #2.5 единиц времени, что равняется 2.5 x 10ns = 25 ns, устанавливается значение reset_n = 1. Спустя #2000 единиц времени, а именно 20 микросекунд, симуляция проекта завершается с помощью директивы $finish.
На этом самый первый тестовый файл завершен. Теперь осталось только скомпилировать его, и выполнить.

§ Сборка проекта

Поскольку я пользуюсь Linux, то мне привычнее использовать файл makefile вместо bat-файлов. На Windows также можно установить поддержку makefile, для этого необходимо скачать [[https://www.gnu.org/software/make/ определенное ПО]], именуемое GNU Make.
all: ica
ica:
iverilog -g2005-sv -DICARUS=1 -o tb.qqq tb.v
vvp tb.qqq >> /dev/null
rm tb.qqq
vcd:
gtkwave tb.vcd
wave:
gtkwave tb.gtkw
clean:
rm -rf obj_dir tb tb.vcd tb.gtkw
Здесь, при запуске make, выбирается правило сборки ica, которое запускает компиляцию iverilog.
Далее выполняется симулятор vvp, который переводит транслированное значение tb.qqq в другое представление, например, в tb.vcd (это зависит только от того, есть ли $dumpfile). Файл tb.qqq удаляется за ненадобностью.

§ Запуск отладчика сигналов Gtkwave

Для его запуска достаточно набрать либо gtkwave tb.vcd, либо воспользоваться make vcd командой. Откроется пустое окно, где потребуется выбрать слева модуль (в данном случае это tb), и добавить сигналы на схему.
01.png
Справа в виде сигналов будут выведены только тактовые генераторы на 100 и 25 мгц, и также регистр reset_n, который необходим для сброса процессора и других модулей.

§ Таблица опкодов

Ниже представлена таблица всех опкодов, которые поддерживаются КР580ВМ80А (Аналог Intel 8080A). По сути это обедненный набор Z80 инструкции.
0123456789ABCDEF
0000NOP
01LXI
B,**
02STAX
B
03INX
B
04INR
B
05DCR
B
06MVI
B,*
07RLC
08
09DAD
B
0ALDAX
B
0BDCX
B
0CINR
C
0DDCR
C
0EMVI
C,*
0FRRC
1010
11LXI
D,**
12STAX
D
13INX
D
14INR
D
15DCR
D
16MVI
D,*
17RAL
18
19DAD
D
1ALDAX
D
1BDCX
D
1CINR
E
1DDCR
E
1EMVI
E,*
1FRAR
2020
21LXI
H,**
22SHLD
**
23INX
H
24INR
H
25DCR
H
26MVI
H,*
27DAA
28
29DAD
H
2ALHLD
**
2BDCX
H
2CINR
L
2DDCR
L
2EMVI
L,*
2FCMA
3030
31LXI
SP,**
32STA
**
33INX
SP
34INR
M
35DCR
M
36MVI
M,*
37STC
38
39DAD
SP
3ALDA
**
3BDCX
SP
3CINR
A
3DDCR
A
3EMVI
A,*
3FCMC
4040MOV
B,B
41MOV
B,C
42MOV
B,D
43MOV
B,E
44MOV
B,H
45MOV
B,L
46MOV
B,M
47MOV
B,A
48MOV
C,B
49MOV
C,C
4AMOV
C,D
4BMOV
C,E
4CMOV
C,H
4DMOV
C,L
4EMOV
C,M
4FMOV
C,A
5050MOV
D,B
51MOV
D,C
52MOV
D,D
53MOV
D,E
54MOV
D,H
55MOV
D,L
56MOV
D,M
57MOV
D,A
58MOV
E,B
59MOV
E,C
5AMOV
E,D
5BMOV
E,E
5CMOV
E,H
5DMOV
E,L
5EMOV
E,M
5FMOV
E,A
6060MOV
H,B
61MOV
H,C
62MOV
H,D
63MOV
H,E
64MOV
H,H
65MOV
H,L
66MOV
H,M
67MOV
H,A
68MOV
L,B
69MOV
L,C
6AMOV
L,D
6BMOV
L,E
6CMOV
L,H
6DMOV
L,L
6EMOV
L,M
6FMOV
L,A
7070MOV
M,B
71MOV
M,C
72MOV
M,D
73MOV
M,E
74MOV
M,H
75MOV
M,L
76HALT
77MOV
M,A
78MOV
A,B
79MOV
A,C
7AMOV
A,D
7BMOV
A,E
7CMOV
A,H
7DMOV
A,L
7EMOV
A,M
7FMOV
A,A
8080ADD
B
81ADD
C
82ADD
D
83ADD
E
84ADD
H
85ADD
L
86ADD
M
87ADD
A
88ADC
B
89ADC
C
8AADC
D
8BADC
E
8CADC
H
8DADC
L
8EADC
M
8FADC
A
9090SUB
B
91SUB
C
92SUB
D
93SUB
E
94SUB
H
95SUB
L
96SUB
M
97SUB
A
98SBB
B
99SBB
C
9ASBB
D
9BSBB
E
9CSBB
H
9DSBB
L
9ESBB
M
9FSBB
A
A0A0ANA
B
A1ANA
C
A2ANA
D
A3ANA
E
A4ANA
H
A5ANA
L
A6ANA
M
A7ANA
A
A8XRA
B
A9XRA
C
AAXRA
D
ABXRA
E
ACXRA
H
ADXRA
L
AEXRA
M
AFXRA
A
B0B0ORA
B
B1ORA
C
B2ORA
D
B3ORA
E
B4ORA
H
B5ORA
L
B6ORA
M
B7ORA
A
B8CMP
B
B9CMP
C
BACMP
D
BBCMP
E
BCCMP
H
BDCMP
L
BECMP
M
BFCMP
A
C0C0RNZ
C1POP
B
C2JNZ
**
C3JMP
**
C4CNZ
**
C5PUSH
B
C6ADI
*
C7RST
0
C8RZ
C9RET
CAJZ
**
CB
CCCZ
**
CDCALL
**
CEACI
*
CFRST
1
D0D0RNC
D1POP
D
D2JNC
**
D3OUT
N
D4CNC
**
D5PUSH
D
D6SUI
*
D7RST
2
D8RC
D9
DAJC
**
DBIN
N
DCCC
**
DD
DESBI
*
DFRST
3
E0E0RPO
E1POP
H
E2JPO
**
E3XTHL
E4CPO
**
E5PUSH
H
E6ANI
*
E7RST
4
E8RPE
E9PCHL
EAJPE
**
EBXCHG
ECCPE
**
ED
EEXRI
*
EFRST
5
F0F0RP
F1POP
PSW
F2JP
**
F3DI
F4CP
**
F5PUSH
PSW
F6ORI
*
F7RST
6
F8RM
F9SPHL
FAJM
**
FBEI
FCCM
**
FD
FECPI
*
FFRST
7

§ Краткое описание

Теперь перейдем к описанию кодов, которые здесь есть.