Загрузить файлы в «/»

This commit is contained in:
Дима 2025-04-13 02:39:15 +03:00
parent 438c0b94b8
commit 64c311eca5
5 changed files with 1330 additions and 0 deletions

Binary file not shown.

239
module_cpld.pin Normal file
View File

@ -0,0 +1,239 @@
-- Copyright (C) 1988-2002 Altera Corporation
-- Any megafunction design, and related net list (encrypted or decrypted),
-- support information, device programming or simulation file, and any other
-- associated documentation or information provided by Altera or a partner
-- under Altera's Megafunction Partnership Program may be used only to
-- program PLD devices (but not masked PLD devices) from Altera. Any other
-- use of such megafunction design, net list, support information, device
-- programming or simulation file, or any other related documentation or
-- information is prohibited for any other purpose, including, but not
-- limited to modification, reverse engineering, de-compiling, or use with
-- any other silicon devices, unless such use is explicitly licensed under
-- a separate agreement with Altera or a megafunction partner. Title to
-- the intellectual property, including patents, copyrights, trademarks,
-- trade secrets, or maskworks, embodied in any such megafunction design,
-- net list, support information, device programming or simulation file, or
-- any other related documentation or information provided by Altera or a
-- megafunction partner, remains with Altera, the megafunction partner, or
-- their respective licensors. No other licenses, including any licenses
-- needed under any third party's intellectual property, are provided herein.
N.C. = No Connect. This pin has no internal connection to the device.
VCCINT = Dedicated power pin, which MUST be connected to VCC (3.3 volts).
VCCIO = Dedicated power pin, which MUST be connected to VCC (3.3 volts).
GND = Dedicated ground pin or unused dedicated input, which MUST be connected to GND.
RESERVED = Unused I/O pin, which MUST be left unconnected.
----------------------------------------------------------------------------
CHIP "module_cpld" ASSIGNED TO AN EPM3256AQC208-7
N.C. : 1
N.C. : 2
KBD_DI : 3
VD1 : 4
VCCIO : 5
GND : 6
HS : 7
RESERVED : 8
KBD_CLK : 9
VS : 10
RESERVED : 11
RESERVED : 12
RESERVED : 13
GND : 14
RESERVED : 15
RESERVED : 16
RESERVED : 17
KBD_CS : 18
RESERVED : 19
RESERVED : 20
RESERVED : 21
RESERVED : 22
VCCIO : 23
RESERVED : 24
RESERVED : 25
RESERVED : 26
MD3 : 27
RESERVED : 28
RESERVED : 29
TCK : 30
WR_ROM : 31
GND : 32
MD2 : 33
RESERVED : 34
MD1 : 35
ROM_A14 : 36
MD0 : 37
CS_RAML : 38
RD_ROM : 39
GND : 40
VCCIO : 41
MD7 : 42
MA0 : 43
RESERVED : 44
MA15 : 45
MA16 : 46
CE_RAM2 : 47
MA14 : 48
WR_RAM : 49
GND : 50
N.C. : 51
N.C. : 52
N.C. : 53
N.C. : 54
RD_1F : 55
RESERVED : 56
RESERVED : 57
ROM_A15 : 58
MD5 : 59
MD6 : 60
MD4 : 61
RESERVED : 62
VCCIO : 63
RESERVED : 64
MA12 : 65
MA13 : 66
MA7 : 67
MA8 : 68
MA6 : 69
MA9 : 70
MA5 : 71
GND : 72
MA11 : 73
VCCINT : 74
GND : 75
MA4 : 76
MA3 : 77
MA10 : 78
MA1 : 79
RESERVED : 80
MA2 : 81
GND : 82
VCCINT : 83
GND : 84
VCCIO : 85
CA9 : 86
CA11 : 87
RESERVED : 88
CA10 : 89
CS_ROM : 90
CA8 : 91
CA4 : 92
C_RFSH : 93
GND : 94
CA5 : 95
C_M1 : 96
CA7 : 97
CA6 : 98
C_IODOS : 99
C_NMI : 100
C_WAIT : 101
C_RD : 102
N.C. : 103
N.C. : 104
N.C. : 105
N.C. : 106
VCCIO : 107
GND : 108
C_BUSRQ : 109
PD3 : 110
C_IORQ : 111
PD4 : 112
RESERVED : 113
PD5 : 114
PD2 : 115
GND : 116
C_INT : 117
PD1 : 118
RESERVED : 119
PD0 : 120
PA10 : 121
PA0 : 122
RESERVED : 123
PA1 : 124
VCCIO : 125
C_IORQGE : 126
TMS : 127
C_CLK : 128
CD4 : 129
CD3 : 130
CA3 : 131
PA2 : 132
CA2 : 133
GND : 134
PA3 : 135
RESERVED : 136
PA4 : 137
CA1 : 138
PA5 : 139
CA0 : 140
PA6 : 141
GND : 142
VCCIO : 143
PA11 : 144
PA7 : 145
RESERVED : 146
PA12 : 147
PA9 : 148
PA14 : 149
CD6 : 150
CD5 : 151
GND : 152
CD1 : 153
PA8 : 154
N.C. : 155
N.C. : 156
N.C. : 157
N.C. : 158
C_DOS : 159
PA13 : 160
CD7 : 161
VWR : 162
CA13 : 163
CA14 : 164
VCCIO : 165
CA15 : 166
BC1 : 167
BEEP : 168
BDIR : 169
TAPE_OUT : 170
CA12 : 171
C_BLK : 172
CD0 : 173
GND : 174
CD2 : 175
TDI : 176
AYCLK : 177
TAPE_IN : 178
VCCINT : 179
GND : 180
C_MREQ : 181
C_RESET : 182
C_WR : 183
CLK_14MHZ : 184
GND : 185
VCCINT : 186
RESERVED : 187
GI : 188
TDO : 189
GND : 190
VCCIO : 191
RESERVED : 192
VD2 : 193
RESERVED : 194
VD3 : 195
RESERVED : 196
VD4 : 197
RESERVED : 198
VD5 : 199
GND : 200
RESERVED : 201
VD6 : 202
C_MAGIC : 203
VD7 : 204
RESERVED : 205
VD0 : 206
N.C. : 207
N.C. : 208

BIN
module_cpld.pof Normal file

Binary file not shown.

189
module_cpld.qsf Normal file
View File

@ -0,0 +1,189 @@
# -------------------------------------------------------------------------- #
#
# Copyright (C) 1991-2013 Altera Corporation
# Your use of Altera Corporation's design tools, logic functions
# and other software and tools, and its AMPP partner logic
# functions, and any output files from any of the foregoing
# (including device programming or simulation files), and any
# associated documentation or information are expressly subject
# to the terms and conditions of the Altera Program License
# Subscription Agreement, Altera MegaCore Function License
# Agreement, or other applicable license agreement, including,
# without limitation, that your use is for the sole purpose of
# programming logic devices manufactured by Altera and sold by
# Altera or its authorized distributors. Please refer to the
# applicable agreement for further details.
#
# -------------------------------------------------------------------------- #
#
# Quartus II 64-Bit
# Version 13.0.1 Build 232 06/12/2013 Service Pack 1 SJ Web Edition
# Date created = 14:10:33 April 11, 2025
#
# -------------------------------------------------------------------------- #
#
# Notes:
#
# 1) The default values for assignments are stored in the file:
# module_cpld_assignment_defaults.qdf
# If this file doesn't exist, see file:
# assignment_defaults.qdf
#
# 2) Altera recommends that you do not modify this file. This
# file is updated automatically by the Quartus II software
# and any changes you make may be lost or overwritten.
#
# -------------------------------------------------------------------------- #
set_global_assignment -name FAMILY MAX3000A
set_global_assignment -name DEVICE "EPM3256AQC208-10"
set_global_assignment -name TOP_LEVEL_ENTITY module_cpld
set_global_assignment -name ORIGINAL_QUARTUS_VERSION "13.0 SP1"
set_global_assignment -name PROJECT_CREATION_TIME_DATE "14:10:33 APRIL 11, 2025"
set_global_assignment -name LAST_QUARTUS_VERSION "13.0 SP1"
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
set_global_assignment -name DEVICE_FILTER_PIN_COUNT 208
set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 10
set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR "-1"
set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0
set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85
set_global_assignment -name MAX7000_DEVICE_IO_STANDARD "3.3-V LVTTL"
set_global_assignment -name PIN_FILE ../07072024/QUARTUS/module_cpld.pin
set_global_assignment -name AHDL_FILE module_cpld.tdf
set_location_assignment PIN_117 -to C_INT
set_location_assignment PIN_99 -to C_IODOS
set_location_assignment PIN_146 -to C_NMI
set_location_assignment PIN_160 -to PA[13]
set_location_assignment PIN_162 -to VWR
set_location_assignment PIN_149 -to PA[14]
set_location_assignment PIN_147 -to PA[12]
set_location_assignment PIN_144 -to PA[11]
set_location_assignment PIN_148 -to PA[9]
set_location_assignment PIN_154 -to PA[8]
set_location_assignment PIN_145 -to PA[7]
set_location_assignment PIN_141 -to PA[6]
set_location_assignment PIN_139 -to PA[5]
set_location_assignment PIN_137 -to PA[4]
set_location_assignment PIN_135 -to PA[3]
set_location_assignment PIN_132 -to PA[2]
set_location_assignment PIN_124 -to PA[1]
set_location_assignment PIN_122 -to PA[0]
set_location_assignment PIN_114 -to PD[5]
set_location_assignment PIN_112 -to PD[4]
set_location_assignment PIN_110 -to PD[3]
set_location_assignment PIN_115 -to PD[2]
set_location_assignment PIN_118 -to PD[1]
set_location_assignment PIN_120 -to PD[0]
set_location_assignment PIN_169 -to BDIR
set_location_assignment PIN_167 -to BC1
set_location_assignment PIN_177 -to AYCLK
set_location_assignment PIN_109 -to C_BUSRQ
set_location_assignment PIN_101 -to C_WAIT
set_location_assignment PIN_42 -to MD[7]
set_location_assignment PIN_43 -to MA[0]
set_location_assignment PIN_45 -to MA[15]
set_location_assignment PIN_46 -to MA[16]
set_location_assignment PIN_48 -to MA[14]
set_location_assignment PIN_49 -to WR_RAM
set_location_assignment PIN_27 -to MD[3]
set_location_assignment PIN_9 -to KBD_CLK
set_location_assignment PIN_7 -to HS
set_location_assignment PIN_55 -to RD_1F
set_location_assignment PIN_204 -to VD[7]
set_location_assignment PIN_202 -to VD[6]
set_location_assignment PIN_199 -to VD[5]
set_location_assignment PIN_197 -to VD[4]
set_location_assignment PIN_195 -to VD[3]
set_location_assignment PIN_193 -to VD[2]
set_location_assignment PIN_4 -to VD[1]
set_location_assignment PIN_206 -to VD[0]
set_location_assignment PIN_188 -to GI
set_location_assignment PIN_18 -to KBD_CS
set_location_assignment PIN_80 -to CS_RAML
set_location_assignment PIN_37 -to MD[0]
set_location_assignment PIN_36 -to ROM_A14
set_location_assignment PIN_35 -to MD[1]
set_location_assignment PIN_33 -to MD[2]
set_location_assignment PIN_31 -to WR_ROM
set_location_assignment PIN_78 -to MA[10]
set_location_assignment PIN_77 -to MA[3]
set_location_assignment PIN_76 -to MA[4]
set_location_assignment PIN_73 -to MA[11]
set_location_assignment PIN_71 -to MA[5]
set_location_assignment PIN_70 -to MA[9]
set_location_assignment PIN_69 -to MA[6]
set_location_assignment PIN_68 -to MA[8]
set_location_assignment PIN_67 -to MA[7]
set_location_assignment PIN_66 -to MA[13]
set_location_assignment PIN_3 -to KBD_DI
set_location_assignment PIN_203 -to C_MAGIC
set_location_assignment PIN_10 -to VS
set_location_assignment PIN_39 -to RD_ROM
set_location_assignment PIN_65 -to MA[12]
set_location_assignment PIN_61 -to MD[4]
set_location_assignment PIN_60 -to MD[6]
set_location_assignment PIN_59 -to MD[5]
set_location_assignment PIN_58 -to ROM_A15
set_location_assignment PIN_153 -to CD[1]
set_location_assignment PIN_159 -to C_DOS
set_location_assignment PIN_161 -to CD[7]
set_location_assignment PIN_163 -to CA[13]
set_location_assignment PIN_164 -to CA[14]
set_location_assignment PIN_166 -to CA[15]
set_location_assignment PIN_150 -to CD[6]
set_location_assignment PIN_151 -to CD[5]
set_location_assignment PIN_111 -to C_IORQ
set_location_assignment PIN_92 -to CA[4]
set_location_assignment PIN_93 -to C_RFSH
set_location_assignment PIN_95 -to CA[5]
set_location_assignment PIN_96 -to C_M1
set_location_assignment PIN_97 -to CA[7]
set_location_assignment PIN_98 -to CA[6]
set_location_assignment PIN_102 -to C_RD
set_location_assignment PIN_168 -to BEEP
set_location_assignment PIN_170 -to TAPE_OUT
set_location_assignment PIN_171 -to CA[12]
set_location_assignment PIN_172 -to C_BLK
set_location_assignment PIN_173 -to CD[0]
set_location_assignment PIN_175 -to CD[2]
set_location_assignment PIN_178 -to TAPE_IN
set_location_assignment PIN_130 -to CD[3]
set_location_assignment PIN_131 -to CA[3]
set_location_assignment PIN_133 -to CA[2]
set_location_assignment PIN_138 -to CA[1]
set_location_assignment PIN_140 -to CA[0]
set_location_assignment PIN_126 -to C_IORQGE
set_location_assignment PIN_128 -to C_CLK
set_location_assignment PIN_129 -to CD[4]
set_location_assignment PIN_79 -to MA[1]
set_location_assignment PIN_81 -to MA[2]
set_location_assignment PIN_86 -to CA[9]
set_location_assignment PIN_87 -to CA[11]
set_location_assignment PIN_89 -to CA[10]
set_location_assignment PIN_90 -to CS_ROM
set_location_assignment PIN_91 -to CA[8]
set_location_assignment PIN_183 -to C_WR
set_location_assignment PIN_182 -to C_RESET
set_location_assignment PIN_181 -to C_MREQ
set_location_assignment PIN_184 -to CLK_14MHZ
set_location_assignment PIN_198 -to SCART
set_location_assignment PIN_44 -to MA[17]
set_location_assignment PIN_47 -to MA[18]
set_location_assignment PIN_57 -to ROM_A18
set_location_assignment PIN_34 -to ROM_A17
set_location_assignment PIN_56 -to ROM_A16
set_location_assignment PIN_38 -to CS_RAMH
set_location_assignment PIN_205 -to C_PNT
set_location_assignment PIN_201 -to C_TURBO
set_location_assignment PIN_113 -to C_HALT
set_location_assignment PIN_136 -to PA[10]
set_location_assignment PIN_187 -to SD_CS
set_location_assignment PIN_196 -to SD_MISO
set_location_assignment PIN_192 -to SD_MOSI
set_location_assignment PIN_194 -to SD_SCK
set_location_assignment PIN_119 -to PD[6]
set_location_assignment PIN_123 -to PD[7]
set_location_assignment PIN_88 -to C_BUSAK
set_location_assignment PIN_121 -to KEY_SEL_FE
set_global_assignment -name AHDL_FILE SD_CARD_Module.tdf

902
module_cpld.tdf Normal file
View File

@ -0,0 +1,902 @@
----------------------------------------------------------------------------------------------------------------------------
-- Описание: Прошивка микросхемы CPLD DD1 (модуль EPM3256AQC208_IGP1 Вариант 2)
-- Проект: ZXM-Jasper
-- Автор: Тарасов М.Н. (Mick)
-- Тип CPLD: EPM3256AQC208
-- Версия: v1.00 - 01 декабря 2017
----------------------------------------------------------------------------------------------------------------------------
TITLE "ZXM-Jasper System Array Logic";
FUNCTION 2mux1 (a, b, sel) RETURNS (y);
SUBDESIGN MODULE_CPLD
(
-- Входная тактовая частота CLK
CLK_14MHZ : INPUT;
-- Сигналы управления RAM памятью
MA[18..0] : OUTPUT;
MD[7..0] : BIDIR;
WR_RAM : OUTPUT;
CS_RAML : OUTPUT;
CS_RAMH : OUTPUT;
-- Выходные сигналы видео формирователя
VD[7..0] : OUTPUT;
HS : OUTPUT;
VS : OUTPUT;
GI : OUTPUT;
-- Сигналы управления ROM памятью
ROM_A14 : OUTPUT;
ROM_A15 : OUTPUT;
ROM_A16 : OUTPUT;
ROM_A17 : OUTPUT;
ROM_A18 : OUTPUT;
RD_ROM : OUTPUT;
WR_ROM : OUTPUT;
CS_ROM : OUTPUT;
-- Сигналы управления с CPU
CA[15..0] : INPUT;
CD[7..0] : BIDIR;
C_CLK : OUTPUT;
C_IORQ : INPUT;
C_MREQ : INPUT;
C_M1 : INPUT;
C_RD : INPUT;
C_WR : INPUT;
C_RFSH : INPUT;
-- Общие сигналы
C_RESET : INPUT;
C_IORQGE : INPUT;
C_INT : OUTPUT;
C_NMI : OUTPUT;
C_BLK : INPUT; -- просто декларируем (не используется)
C_BUSRQ : INPUT; -- просто декларируем (не используется)
C_WAIT : INPUT; -- просто декларируем (не используется)
C_IODOS : INPUT; -- просто декларируем (не используется)
C_DOS : OUTPUT;
-- Сигналы взаимодействия c AVR
C_MAGIC : INPUT;
C_PNT : INPUT;
--C_TURBO : INPUT;
-- Сигналы AY-3-8912
AYCLK : OUTPUT;
BC1 : OUTPUT;
BDIR : OUTPUT;
-- Сигналы порта FE
TAPE_IN : INPUT;
TAPE_OUT : OUTPUT;
BEEP : OUTPUT;
-- Сигналы выбора джойстика
RD_1F : OUTPUT;
-- Скандаблер
PA[14..0] : OUTPUT; -- адреса знакомест
VWR : OUTPUT; -- сигнал записи в видеобуфер
PD[7..0] : BIDIR; -- данные
-- Сигналы клавиатуры
KBD_CS : INPUT;
KBD_CLK : INPUT;
KBD_DI : INPUT
)
VARIABLE
Sync_count[2..0] : DFF; -- 3-х разрядный счетчик, сигналы TI, H0, H1
CLKZ : NODE; -- частота процессора
H0M : NODE; -- частота селектора памяти
H1M : NODE; -- частота селектора памяти
VCLK : NODE; -- опорная частота видеосчетчиков
HSync_count[6..0] : DFF; -- 7-и разрядный счетчик строчной разверкти, сигналы H2, H3..H8
HReset : NODE; -- сброс счетчиков строчной развертки
HBlank : NODE; -- сигнал гашения видеосигнала строчный
HBlank1 : NODE; -- сигнал гашения видеосигнала строчный
HBlank2 : NODE; -- сигнал гашения видеосигнала строчный
HBlank3 : DFF; -- сигнал гашения видеосигнала строчный
HBorder : NODE; -- сигнал строчного бордера
HSync : DFF; -- строчный синхроимпульс
HSync1 : DFF; -- синхроимпульс счета кадровых счетчиков
VSync_count[8..0] : DFF; -- 9-и разрядный счетчик кадровый развертки, сигналы V0..V8
VReset : NODE; --сброс счетчиков кадровой развертки
VSync : DFF; -- кадровый синхроимпульс
VBorder : NODE; -- сигнал кадрового бордера
Border_sync : DFF; -- строб бордера
Int_sync : DFF; -- строб прерывания
Int_count[3..0] : DFF; -- 4-и разрядный счетчик длительности прерывания
Flash_count[4..0] : DFF; -- 5-и разрядный счетчик мерцания, сигнал FLASH
REG_rddata[7..0] : TRI; -- буфер чтения памяти
DATA_CPU[7..0] : TRI_STATE_NODE;
-- Сигналы управления памятью
WR_RAM : LCELL;
WR_Buf : LCELL; -- запись в буферный регистр
VA[4..0] : NODE; -- адрес видео памяти
RA[5..0] : NODE; -- адрес видео памяти
Sel_A45 : NODE; -- доступ к ОЗУ
Ram_sel : DFF;
Ram_write_r : DFFE; -- запись в ОЗУ
Ram_wrdata[7..0] : TRI; -- буфер записи в ОЗУ
Ram_buf[7..0] : DFF;
Ram_smx : NODE; -- страницы ОЗУ
RD_MEMORY : LCELL;
ROM_SEL : NODE;
-- Сигналы управления видеоформирователем
WRSCR : LCELL; -- сигнал защелкивания видеоинформации
Reg_inf[7..0] : DFF; -- регистр видеоинформации
Reg_pix[7..0] : DFF; -- регистр пикселей (промежуточный)
Reg_atr[7..0] : DFF; -- регистр цвета
Pix_inf : LCELL; -- видеоинформация
Reg_vid[5..0] : DFF; -- регистр видео выходной
ColourADR[3..0] : NODE;
-- Управляющие сигналы
IO_ENABLE : NODE; -- доступ к портам
IO_RD : LCELL; -- чтение из портов
IO_WR : LCELL; -- запись в порты
-- TR-DOS контроллер
Sel_code : NODE; -- выбор ПЗУ TRDOS
Sel_3dxx : NODE; -- выбор ПЗУ TRDOS
DOS_r : JKFF; -- выбор ПЗУ TRDOS
NMI_r : DFF; -- выбор ПЗУ TRDOS
DOS_En : LCELL; --доступ к контроллеру дисковода
-- Регистр порта xxFEh
WR_FE : LCELL;
Border_Color_r[2..0] : DFF;
Tape_r : DFF;
Beep_r : DFF;
-- Регистр порта 7FFDh
Sel_7FFD : NODE;
WR_7FFD : LCELL;
RAM0_Page_r[4..0] : DFF; -- основные страницы 128кб + доролнительные страницы выше 128кб (общий объём 1024)
SCR128_r : DFF; --экран в 4000h или C000h (3 - бит)
ROM128_r : DFF; -- 128 ПЗУ (4 - бит)
BLK_Port_r : DFF; -- блокировка записи в порт (5 - бит)
-- Скандаблер
VWR : LCELL;
VHReset : NODE;
VHBlank : NODE;
SHReset : NODE;
VWR_strobe : LCELL; -- запись в буфер
MUX_strobe : DFF; -- счетчик переключения буферов
MUX_data : LCELL; -- триггер конца строки
WHSync_count[6..0] : DFF; -- счетчик знакомест
VHSync_count[2..0] : DFF; -- счетчик знакомест
SHSync_count[2..0] : DFF; -- счетчик знакомест
VD_reg[5..0] : DFF; -- регистр видео
REG_wscan[7..0] : TRI;
RH : NODE;
-- интерфейс клавиатуры
RDFE_Sel : LCELL; -- выбор клавиатуры
KBD_save_en : NODE;
KBD_count[3..0] : DFFE;
KBD_shift_in[7..0] : DFF;
KBD_regA8[4..0] : DFFE;
KBD_regA9[4..0] : DFFE;
KBD_regA10[4..0] : DFFE;
KBD_regA11[4..0] : DFFE;
KBD_regA12[4..0] : DFFE;
KBD_regA13[4..0] : DFFE;
KBD_regA14[4..0] : DFFE;
KBD_regA15[4..0] : DFFE;
KBD_rddata[7..0] : TRI;
BEGIN
-----------------------------------------------------------------------------------
-- Синхрогенератор
------------------------------------------------------------------------------------
-- Clock frequency 14.000 MHz
-- "256 x 192 Screen"
-- Line frequency 31250 Hz
-- Field frequency 48 Hz
-- Sync polarity: H negative, V negative
-- Scan type: non interlaced.
------------------------------------------------------------------------------------
-- Системные сигналы
------------------------------------------------------------------------------------
Sync_count[].clk = CLK_14MHZ; -- Системные сигналы TI, H0, H1, 2
Sync_count[].d = Sync_count[].q+1;
VCLK = !(Sync_count[].q == B"111");
------------------------------------------------------------------------------------
-- Строчная развертка
------------------------------------------------------------------------------------
-- One line:
-- 32 pixels horizontal sync
-- 32 pixels back porch
-- 64 pixels left border
-- 256 pixels video
-- 64 pixels right border
------------------------------------------------------------------------------------
-- 448 pixels total per line
------------------------------------------------------------------------------------
-- Реализация
------------------------------------------------------------------------------------
-- 32 видимая часть
-- 8 правый бордер
-- 4 начало гасящего импульса
-- 4 строчный импульс
-- 8 левый бордер
-- =
-- 56 сброс счетчиков строчной развертки
------------------------------------------------------------------------------------
HSync_count[].clk = VCLK; -- Сигналы строчной развертки H3, H4, H5, H6, H7, BC
HSync_count[].d = HSync_count[].q+1;
HSync_count[].clrn = !HReset;
HReset = (HSync_count[6..4].q == B"111"); -- сброс счетчиков в конце второй строки VGA
HBorder = HSync_count[6].q; -- сигнал строчного бордера на второй строке VGA
HBlank1 = !(HSync_count[6..3].q == B"0101"); -- гасящий импульс на первой VGA строке
HBlank2 = !(HSync_count[6..3].q == B"1100"); -- гасящий импульс на второй VGA строке
HBlank = HBlank1 & HBlank2;
HSync.clk = VCLK;
HSync.d = HBlank # HSync_count[2].q;
HBlank3.clk = !(HSync_count[6..0].q ==B"1010000");
HBlank3.d = GND;
HBlank3.prn = !(HSync_count[6..0].q == B"1100101");
------------------------------------------------------------------------------------
-- Кадровая развертка
------------------------------------------------------------------------------------
-- One field:
-- 16 lines vertical sync = porch
-- 56 lines top border
-- 192 lines video
-- 48 lines bottom border
------------------------------------------------------------------------------------
-- 312 lines total per field
------------------------------------------------------------------------------------
-- Реализация
------------------------------------------------------------------------------------
-- 192 видимая часть
-- 48 нижний бордер
-- 16 кадровый импульс = гасящий импульс
-- 56 верхний бордер
-- =
-- 320 сброс счетчиков кадровой развертки
------------------------------------------------------------------------------------
HSync1.clk = VCLK;
HSync1.d = (HSync_count[6..0] == B"1001101");
VSync_count[].clk = HSync1.q; -- Сигналы кадровой развертки V0...V7
VSync_count[].d = VSync_count[].q+1;
VSync_count[].clrn = !VReset;
VReset = (VSync_count[8..3].q == B"101000");-- сброс на 320 строке
VBorder = VSync_count[8].q # (VSync_count[7].q & VSync_count[6].q); -- сигнал BK = V8 # (V7 & V6)
VSync.clk = VCLK;
VSync.d = !(VSync_count[8..4].q == B"01111");
------------------------------------------------------------------------------------
-- Сигнал строчной развертки
------------------------------------------------------------------------------------
HS = HSync.q;
------------------------------------------------------------------------------------
-- Сигнал кадровой развертки
------------------------------------------------------------------------------------
VS = VSync.q;
------------------------------------------------------------------------------------
-- Сигнал гашения (разрешает работу выходному регистру DD7 - КР1533ИР27)
------------------------------------------------------------------------------------
GI = GND;
------------------------------------------------------------------------------------
-- Счетчики мерцания
------------------------------------------------------------------------------------
Flash_count[].clk = !VSync.q; --Сигналы счетчиков мерцания BK/, FLASH
Flash_count[].d = Flash_count[].q+1;
------------------------------------------------------------------------------------
-- Строб бордера
------------------------------------------------------------------------------------
Border_sync.d = !(VBorder # HBorder);
Border_sync.clk = HSync_count[1].q;
------------------------------------------------------------------------------------
-- Счетчик длительности прерывания
------------------------------------------------------------------------------------
Int_count[].clk = VCLK;
Int_count[].d = Int_count[].q+1;
Int_count[].clrn = !Int_sync.q;
------------------------------------------------------------------------------------
-- Сигнал прерывания
-- Примечание: прерывание генерится с частотой 48Гц
------------------------------------------------------------------------------------
Int_sync.clk = !VSync.q; -- прерывание на 256 импульсе
Int_sync.d = GND;
Int_sync.prn = !(Int_count[3..0].q == B"1111");
------------------------------------------------------------------------------------
-- Сигнал прерывания
------------------------------------------------------------------------------------
C_INT = Int_sync.q;
-----------------------------------------------------------------------------------
-- Видеоформирователь
------------------------------------------------------------------------------------
-- Стробирующие сигналы захвата информации
------------------------------------------------------------------------------------
WRSCR = !(Sync_count[1].q & Sync_count[2].q & HSync_count[0].q);
------------------------------------------------------------------------------------
-- Сдвиговый регистр пикселей
------------------------------------------------------------------------------------
Reg_pix[].clk = HSync_count[0].q; -- сигналы H2
Reg_pix[].d = MD[];
------------------------------------------------------------------------------------
-- Сдвиговый регистр пикселей
------------------------------------------------------------------------------------
Reg_inf[].clk = Sync_count[0].q; -- сигнал 7MHZ
IF WRSCR !=0 THEN
Reg_inf[].d = (Reg_inf[7-1..0].q,GND);
ELSE
Reg_inf[].d = Reg_pix[];
END IF;
------------------------------------------------------------------------------------
-- Регистр атрибутов
------------------------------------------------------------------------------------
Reg_atr[].clk = WRSCR;
Reg_atr[].d = MD[];
------------------------------------------------------------------------------------
-- Мерцание знакоместа
------------------------------------------------------------------------------------
Pix_inf = Reg_inf[7].q $ (Flash_count[4].q & Reg_atr[7].q);
------------------------------------------------------------------------------------
-- Адреса палитры/цвета
------------------------------------------------------------------------------------
IF Border_sync.q ==0 THEN
ColourADR[0] = Border_Color_r[0].q;
ColourADR[1] = Border_Color_r[1].q;
ColourADR[2] = Border_Color_r[2].q;
ColourADR[3] = GND;
ELSE
IF Pix_inf ==0 THEN
ColourADR[0] = Reg_atr[3].q; --Blue
ColourADR[1] = Reg_atr[4].q; --Red
ColourADR[2] = Reg_atr[5].q; --Green
ColourADR[3] = Reg_atr[6].q; --Bright
ELSE
ColourADR[0] = Reg_atr[0].q; --Blue
ColourADR[1] = Reg_atr[1].q; --Red
ColourADR[2] = Reg_atr[2].q; --Green
ColourADR[3] = Reg_atr[6].q; --Bright
END IF;
END IF;
------------------------------------------------------------------------------------
-- Вывод видеоинформации
------------------------------------------------------------------------------------
Reg_vid[].clk = Sync_count[0].q; -- сигнал 7MHZ
Reg_vid[].clrn = HBlank3.q & VSync.q;
Reg_vid[0].d = ColourADR[0]; -- Blue0
Reg_vid[1].d = ColourADR[0] & ColourADR[3]; -- Blue1
Reg_vid[2].d = ColourADR[1]; -- Red0
Reg_vid[3].d = ColourADR[1] & ColourADR[3]; -- Red1
Reg_vid[4].d = ColourADR[2]; -- Green0
Reg_vid[5].d = ColourADR[2] & ColourADR[3]; -- Green1
------------------------------------------------------------------------------------
-- Сигнал формирование частоты процессора
-- Примечание: процессор на частоте 3,5МГц(NORMAL)
------------------------------------------------------------------------------------
H0M = Sync_count[1].q; -- H0
H1M = Sync_count[2].q; -- H1
CLKZ = !H0M;
C_CLK = CLKZ;
------------------------------------------------------------------------------------
-- Управление памятью RAM
------------------------------------------------------------------------------------
-- Сигнал записи в буферный регистр TI =1 и H0 =0
------------------------------------------------------------------------------------
WR_Buf = H0M & !H1M; -- сигнал WRBUF
------------------------------------------------------------------------------------
-- Запись в буферный регистр
------------------------------------------------------------------------------------
Ram_buf[].d = MD[];
Ram_buf[].clk = !WR_Buf;
------------------------------------------------------------------------------------
-- Сигнал мультиплексирования страниц ОЗУ
------------------------------------------------------------------------------------
Ram_smx = CA[15] and CA[14]; -- сигнал SMX = A15 & A14
------------------------------------------------------------------------------------
-- Выбор памяти ОЗУ
------------------------------------------------------------------------------------
Sel_A45 = CA[15] # CA[14]; -- сигнал A45 = A15 # A14 # BLK
------------------------------------------------------------------------------------
-- Сигнал записи в память
------------------------------------------------------------------------------------
Ram_write_r.d = Sel_A45 & !C_MREQ & C_RD & C_RFSH;
Ram_write_r.clrn = !H1M;
-- Ram_write_r.clk = !CLKZ;
-- Ram_write_r.prn = VCC;
Ram_write_r.ena = !CLKZ; --!Clk_reg[0].q; --память работает в турбо режиме 7МГц
Ram_write_r.clk = !CLK_14MHZ;
------------------------------------------------------------------------------------
-- Запись в память
------------------------------------------------------------------------------------
WR_RAM = !Ram_write_r.q;
Ram_wrdata[].in = CD[];
Ram_wrdata[].oe = Ram_write_r.q;
MD[] = Ram_wrdata[].out;
------------------------------------------------------------------------------------
-- Формирование адресов видеоконтроллера VА
------------------------------------------------------------------------------------
IF HSync_count[0].q ==0 THEN -- сигнал H2
VA[0] = VSync_count[0].q;
VA[1] = VSync_count[1].q;
VA[2] = VSync_count[2].q;
VA[3] = VSync_count[6].q;
VA[4] = VSync_count[7].q;
ELSE
VA[0] = VSync_count[6].q;
VA[1] = VSync_count[7].q;
VA[2] = GND;
VA[3] = VCC;
VA[4] = VCC;
END IF;
------------------------------------------------------------------------------------
-- Формирование адресов RА
------------------------------------------------------------------------------------
IF Ram_smx ==0 THEN -- выборк окна в адресах 0x000..0xBFFF
RA[0] = CA[14];
RA[1] = CA[15];
RA[2] = CA[14];
RA[3] = GND;
RA[4] = GND;
RA[5] = GND;
ELSE
RA[0] = RAM0_PAGE_r[0].q; -- сигнал Page0
RA[1] = RAM0_PAGE_r[1].q; -- сигнал Page1
RA[2] = RAM0_PAGE_r[2].q; -- сигнал Page2
RA[3] = RAM0_PAGE_r[3].q; -- сигнал Page3 256
RA[4] = RAM0_PAGE_r[4].q; -- сигнал Page4 512
RA[5] = BLK_Port_r.q; -- сигнал Page5 1024 (MA19*)
END IF;
-- RA[3] = GND;
-- RA[4] = GND;
-- RA[5] = GND;
------------------------------------------------------------------------------------
-- Формирование адресов и выбор микросхемы памяти
------------------------------------------------------------------------------------
IF H1M ==0 THEN
MA[13..0] = CA[13..0];
MA[18..14] = RA[4..0];
RAM_sel.d = RA[5];
ELSE
MA[4..0] = HSync_count[5..1]; -- сигналы H3...H7
MA[5] = VSync_count[3].q; -- сигнал V4
MA[6] = VSync_count[4].q; -- сигнал V5
MA[7] = VSync_count[5].q; -- сигнал V6
MA[12..8] = VA[4..0]; -- сигналы VA0...VA4
MA[13] = GND; -- сигнал 0
MA[14] = VCC; -- сигнал 1
MA[15] = SCR128_r.q; -- сигнал SCR128
MA[16] = VCC; -- сигнал 1
MA[17] = GND;
MA[18] = GND;
RAM_sel.d = GND;
END IF;
Ram_sel.clk = !CLK_14MHZ;
Ram_sel.clrn = C_RESET;
CS_RAML = Ram_sel.q; --0
CS_RAMH = !Ram_sel.q; --MA[19]* --1
-- CS_RAML = BLK_Port_r.q; --0
-- CS_RAMH = !BLK_Port_r.q; --MA[19]* --1
------------------------------------------------------------------------------------
-- Управление памятью ROM
------------------------------------------------------------------------------------
-- Формирование управляющих сигналов ROM памяти
------------------------------------------------------------------------------------
-- A14=0 A15=0 MONITOR
-- A14=1 A15=0 DOS
-- A14=0 A15=1 128
-- A14=1 A15=1 48
ROM_A14 = ROM128_r.q;-- # !DOS_En; -- сигнал RA14 = ROM128/ & !PRN;
ROM_A15 = !DOS_r.q; -- сигнал RA15 = DOS/ & !PRN;
ROM_A16 = GND;
ROM_A17 = GND;
ROM_A18 = GND;
------------------------------------------------------------------------------------
-- Сигнал выбора ПЗУ
------------------------------------------------------------------------------------
ROM_SEL = Sel_A45 # C_MREQ;
CS_ROM = GND;
------------------------------------------------------------------------------------
-- Сигнал чтения из ПЗУ
------------------------------------------------------------------------------------
RD_ROM = ROM_SEL # C_RD; -- сигнал RDROM/ = A45 # RD # MREQ
-----------------------------------------------------------------------------------
-- Сигнал записи в ПЗУ
------------------------------------------------------------------------------------
WR_ROM = VCC;
------------------------------------------------------------------------------------
-- Порты
------------------------------------------------------------------------------------
-- Сигнал управление портами
------------------------------------------------------------------------------------
IO_ENABLE = !C_M1 # C_IORQ # C_IORQGE;
------------------------------------------------------------------------------------
-- Сигнал чтения из портов
------------------------------------------------------------------------------------
IO_RD = IO_ENABLE # C_RD;
------------------------------------------------------------------------------------
-- Сигнал записи в порты
------------------------------------------------------------------------------------
IO_WR = IO_ENABLE # C_WR;
------------------------------------------------------------------------------------
-- Порт xx1Fh - Кемпстон джойстик 00011111b
-----------------------------------------------------------------------------------
RD_1F = CA[7] # !(CA[3..0] == B"1111") # !DOS_En # IO_RD;
------------------------------------------------------------------------------------
-- Порт xxFEh = 11111110b
------------------------------------------------------------------------------------
WR_FE = !(CA[3..0] == B"1110") # IO_WR;
Border_Color_r[2..0].d = CD[2..0];
Border_Color_r[2..0].clk = WR_FE;
Border_Color_r[2..0].clrn = C_RESET;
Tape_r.d = CD[3];
Tape_r.clk = WR_FE;
Tape_r.clrn = C_RESET;
Beep_r.d = CD[4];
Beep_r.clk = WR_FE;
Beep_r.clrn = C_RESET;
------------------------------------------------------------------------------------
-- Выход магнитофона
------------------------------------------------------------------------------------
TAPE_OUT = Tape_r.q;
------------------------------------------------------------------------------------
-- Выход звука
------------------------------------------------------------------------------------
BEEP = Beep_r.q;
------------------------------------------------------------------------------------
-- Селектор порта 7FFDh
-----------------------------------------------------------------------------------
Sel_7FFD = CA[15] # !(CA[7..0] == B"11111101") # IO_WR;
------------------------------------------------------------------------------------
-- Порт 7FFDh
-----------------------------------------------------------------------------------
WR_7FFD = Sel_7FFD # (BLK_Port_r.q & C_PNT);
RAM0_Page_r[2..0].d = CD[2..0];
RAM0_Page_r[2..0].clk = WR_7FFD;
RAM0_Page_r[2..0].clrn = C_RESET;
SCR128_r.d = CD[3];
SCR128_r.clk = WR_7FFD;
SCR128_r.clrn = C_RESET;
ROM128_r.d = CD[4];
ROM128_r.clk = WR_7FFD;
ROM128_r.clrn = C_RESET;
-- C_PNT
--
-- BLK_Port_r.d = CD[5];
-- BLK_Port_r.clk = WR_7FFD;
-- BLK_Port_r.clrn = C_RESET;
IF C_PNT ==0 THEN -- (mem=1024)
BLK_Port_r.d = CD[5]; -- сигнал Page5 1024
BLK_Port_r.clk = WR_7FFD;
BLK_Port_r.clrn = C_RESET;
RAM0_Page_r[4..3].d = CD[7..6]; -- сигнал Page3/4 256/512
RAM0_Page_r[4..3].clk = WR_7FFD;
RAM0_Page_r[4..3].clrn = C_RESET;
ELSE -- (mem = 128)
BLK_Port_r.d = CD[5];
BLK_Port_r.clk = WR_7FFD;
BLK_Port_r.clrn = C_RESET;
RAM0_Page_r[4..3].d = GND;
RAM0_Page_r[4..3].clk = WR_7FFD;
RAM0_Page_r[4..3].clrn = C_RESET;
END IF;
------------------------------------------------------------------------------------
-- Порты BFFDh и FFFDh
------------------------------------------------------------------------------------
BC1 = CA[15] & CA[14] & (CA[7..0] == B"11111101") & !IO_ENABLE;
BDIR = CA[15] & (CA[7..0] == B"11111101") & !IO_WR;
------------------------------------------------------------------------------------
-- Частота AY-3-8912
------------------------------------------------------------------------------------
AYCLK = Sync_count[2].q; -- сигнал H1 = 1,75МГц
------------------------------------------------------------------------------------
-- Доступ к контроллеру дисковода
------------------------------------------------------------------------------------
DOS_En = !DOS_r.q;
------------------------------------------------------------------------------------
-- TR-DOS контроллер
------------------------------------------------------------------------------------
-- Выбор окна ПЗУ
------------------------------------------------------------------------------------
Sel_code = C_M1 # C_MREQ;
Sel_3dxx = !(CA[15..8] == B"00111101") # !ROM128_r.q # Sel_code;
------------------------------------------------------------------------------------
-- Сигнал выбора контроллера NMI/
------------------------------------------------------------------------------------
NMI_r.d = C_MAGIC # !Sel_A45;
NMI_r.clk = Sel_code;
NMI_r.prn = Sel_3dxx & C_RESET;
------------------------------------------------------------------------------------
-- Сигнал NMI/
------------------------------------------------------------------------------------
C_NMI = NMI_r.q;
------------------------------------------------------------------------------------
-- Сигнал выбора контроллера DOS/
------------------------------------------------------------------------------------
---------------------------СИГНАЛ DOS НА ТМ7----------------------------------------
DOS_r.clrn = C_RESET;
DOS_r.j = !(Sel_3dxx & NMI_r.q);
DOS_r.clk = !CLK_14MHZ;
DOS_r.k = !(Sel_code # !Sel_A45);
---------------------------СИГНАЛ DOS НА ТМ2----------------------------------------
--DOS_r.prn = !(Sel_code # !Sel_A45) & C_RESET;
--DOS_r.clrn = (Sel_3dxx # Sel_code) & NMI_r.q;
--DOS_r.clk = vcc;
--DOS_r.d = vcc;
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
-- Сигнал DOS/
------------------------------------------------------------------------------------
C_DOS = !DOS_r.q; -- 0 = Активный ДОС
------------------------------------------------------------------------------------
-- Интерфейс клавиатуры
------------------------------------------------------------------------------------
-- Порт xxFEh - Клавиатура
------------------------------------------------------------------------------------
RDFE_Sel = !(CA[7..0] == B"11111110") # IO_RD;
-----------------------------------------------------------------------------------
-- Счетчик
------------------------------------------------------------------------------------
KBD_save_en = KBD_count[0].q # KBD_count[1].q # KBD_count[2].q # !KBD_count[3].q;
KBD_count[].clk = !KBD_CLK;
KBD_count[].ena = KBD_save_en;
KBD_count[].clrn = !KBD_CS;
KBD_count[].d = KBD_count[].q + 1;
------------------------------------------------------------------------------------
-- Входной сдвигающий регистр
------------------------------------------------------------------------------------
KBD_shift_in[].clk = KBD_CLK;
IF KBD_count[3].q ==0 THEN
KBD_shift_in[].d = (KBD_shift_in[7-1..0].q,KBD_DI);
ELSE
KBD_shift_in[].d = KBD_shift_in[].q;
END IF;
------------------------------------------------------------------------------------
-- Регистры клавиатуры
------------------------------------------------------------------------------------
KBD_regA8[4..0].d = KBD_shift_in[7..3].q;
KBD_regA9[4..0].d = KBD_shift_in[7..3].q;
KBD_regA10[4..0].d = KBD_shift_in[7..3].q;
KBD_regA11[4..0].d = KBD_shift_in[7..3].q;
KBD_regA12[4..0].d = KBD_shift_in[7..3].q;
KBD_regA13[4..0].d = KBD_shift_in[7..3].q;
KBD_regA14[4..0].d = KBD_shift_in[7..3].q;
KBD_regA15[4..0].d = KBD_shift_in[7..3].q;
KBD_regA8[].clk = KBD_CLK;
KBD_regA8[].ena = KBD_count[3].q & (KBD_shift_in[2..0].q == B"000");
KBD_regA8[].prn = C_RESET;
KBD_regA9[].clk = KBD_CLK;
KBD_regA9[].ena = KBD_count[3].q & (KBD_shift_in[2..0].q == B"001");
KBD_regA9[].prn = C_RESET;
KBD_regA10[].clk = KBD_CLK;
KBD_regA10[].ena = KBD_count[3].q & (KBD_shift_in[2..0].q == B"010");
KBD_regA10[].prn = C_RESET;
KBD_regA11[].clk = KBD_CLK;
KBD_regA11[].ena = KBD_count[3].q & (KBD_shift_in[2..0].q == B"011");
KBD_regA11[].prn = C_RESET;
KBD_regA12[].clk = KBD_CLK;
KBD_regA12[].ena = KBD_count[3].q & (KBD_shift_in[2..0].q == B"100");
KBD_regA12[].prn = C_RESET;
KBD_regA13[].clk = KBD_CLK;
KBD_regA13[].ena = KBD_count[3].q & (KBD_shift_in[2..0].q == B"101");
KBD_regA13[].prn = C_RESET;
KBD_regA14[].clk = KBD_CLK;
KBD_regA14[].ena = KBD_count[3].q & (KBD_shift_in[2..0].q == B"110");
KBD_regA14[].prn = C_RESET;
KBD_regA15[].clk = KBD_CLK;
KBD_regA15[].ena = KBD_count[3].q & (KBD_shift_in[2..0].q == B"111");
KBD_regA15[].prn = C_RESET;
------------------------------------------------------------------------------------
-- Выходной буфер
------------------------------------------------------------------------------------
KBD_rddata[0].in = (CA8 # KBD_regA8[0].q) & (CA9 # KBD_regA9[0].q) & (CA10 # KBD_regA10[0].q) & (CA11 # KBD_regA11[0].q) & (CA12 # KBD_regA12[0].q) & (CA13 # KBD_regA13[0].q) & (CA14 # KBD_regA14[0].q) & (CA15 # KBD_regA15[0].q);
KBD_rddata[1].in = (CA8 # KBD_regA8[1].q) & (CA9 # KBD_regA9[1].q) & (CA10 # KBD_regA10[1].q) & (CA11 # KBD_regA11[1].q) & (CA12 # KBD_regA12[1].q) & (CA13 # KBD_regA13[1].q) & (CA14 # KBD_regA14[1].q) & (CA15 # KBD_regA15[1].q);
KBD_rddata[2].in = (CA8 # KBD_regA8[2].q) & (CA9 # KBD_regA9[2].q) & (CA10 # KBD_regA10[2].q) & (CA11 # KBD_regA11[2].q) & (CA12 # KBD_regA12[2].q) & (CA13 # KBD_regA13[2].q) & (CA14 # KBD_regA14[2].q) & (CA15 # KBD_regA15[2].q);
KBD_rddata[3].in = (CA8 # KBD_regA8[3].q) & (CA9 # KBD_regA9[3].q) & (CA10 # KBD_regA10[3].q) & (CA11 # KBD_regA11[3].q) & (CA12 # KBD_regA12[3].q) & (CA13 # KBD_regA13[3].q) & (CA14 # KBD_regA14[3].q) & (CA15 # KBD_regA15[3].q);
KBD_rddata[4].in = (CA8 # KBD_regA8[4].q) & (CA9 # KBD_regA9[4].q) & (CA10 # KBD_regA10[4].q) & (CA11 # KBD_regA11[4].q) & (CA12 # KBD_regA12[4].q) & (CA13 # KBD_regA13[4].q) & (CA14 # KBD_regA14[4].q) & (CA15 # KBD_regA15[4].q);
KBD_rddata[5].in = VCC;
KBD_rddata[6].in = TAPE_IN;
KBD_rddata[7].in = VCC;
KBD_rddata[].oe = !RDFE_Sel;
DATA_CPU[] = KBD_rddata[].out;
------------------------------------------------------------------------------------
-- Чтение из буферного регистра
------------------------------------------------------------------------------------
RD_MEMORY = !Sel_A45 # C_MREQ # C_RD;
REG_rddata[].in = Ram_buf[].q;
REG_rddata[].oe = !RD_MEMORY;
DATA_CPU[] = REG_rddata[].out;
------------------------------------------------------------------------------------
-- Скандаблер на одну строку
------------------------------------------------------------------------------------
-- Счетчик адреса знакомест
------------------------------------------------------------------------------------
RH = HReset;
WHSync_count[].clk = CLK_14MHZ;
WHSync_count[].d = WHSync_count[].q+1;
WHSync_count[].clrn = !RH;
VHSync_count[].clk = !WHSync_count[5].q;
VHSync_count[].d = VHSync_count[].q+1;
VHSync_count[].clrn = VHReset & !RH;
SHSync_count[].clk = !WHSync_count[6].q;
SHSync_count[].d = SHSync_count[].q+1;
SHSync_count[].clrn = SHReset & !RH;
VHReset = !(VHSync_count[2..0].q ==B"111");
VHBlank = !(VHSync_count[2..0].q ==B"101");
SHReset = !(SHSync_count[2..0].q ==B"111");
------------------------------------------------------------------------------------
-- Строб строки знакомест
------------------------------------------------------------------------------------
MUX_data = !MUX_strobe.q;
MUX_strobe.clk = !(SHSync_count[2..0].q ==B"101");
MUX_strobe.d = MUX_data;
PA[9] = MUX_strobe.q $ VWR_strobe;
------------------------------------------------------------------------------------
-- Запись в буфер знакомест
------------------------------------------------------------------------------------
VWR_strobe = WHSync_count[0] & CLK_14MHZ; -- VWR_strobe : LCELL; -- запись в буфер
VWR = !VWR_strobe;
------------------------------------------------------------------------------------
-- Aдреса знакомест
-----------------------------------------------------------------------------------
IF VWR_strobe == 0 THEN
PA[0] = WHSync_count[0].q; -- 7MГЦ
PA[1] = WHSync_count[1].q; -- 3,5МГЦ
PA[2] = WHSync_count[2].q; -- 1,75МГЦ
PA[3] = WHSync_count[3].q; -- 0,875МГЦ
PA[4] = WHSync_count[4].q; -- 0,875МГЦ
PA[5] = WHSync_count[5].q; -- 0,4375МГЦ
PA[6] = VHSync_count[0].q; -- 0,21875МГЦ
PA[7] = VHSync_count[1].q; -- 0,109375МГЦ
PA[8] = VHSync_count[2].q; -- 0,0546875МГЦ
ELSE
PA[0] = WHSync_count[1].q; -- 3,5МГЦ
PA[1] = WHSync_count[2].q; -- 1,75МГЦ
PA[2] = WHSync_count[3].q; -- 0,875МГЦ
PA[3] = WHSync_count[4].q; -- 0,875МГЦ
PA[4] = WHSync_count[5].q; -- 0,4375МГЦ
PA[5] = WHSync_count[6].q; -- 0,21875МГЦ
PA[6] = SHSync_count[0].q; -- 0,109375МГЦ
PA[7] = SHSync_count[1].q; -- 0,0546875МГЦ
PA[8] = SHSync_count[2].q; -- 0,0546875МГЦ
END IF;
PA[10] = VCC;
PA[11] = VCC;
PA[12] = VCC;
PA[13] = VCC;
PA[14] = VCC;
------------------------------------------------------------------------------------
-- Строб видеоданных
------------------------------------------------------------------------------------
VD[0] = VD_reg[0].q; -- Blue0
VD[1] = VD_reg[1].q; -- Blue1
VD[2] = VD_reg[2].q; -- Red0
VD[3] = VD_reg[3].q; -- Red1
VD[4] = GND; -- Red2
VD[5] = VD_reg[4].q; -- Green0
VD[6] = VD_reg[5].q; -- Green1
VD[7] = GND; -- Green2
VD_reg[].clk = CLK_14MHZ;
VD_reg[5..0].d = PD[5..0];
VD_reg[].clrn = VHBlank;
REG_wscan[5..0].in = Reg_vid[5..0].q;
REG_wscan[7..6] = GND;
REG_wscan[].oe = VWR_strobe & CLK_14MHZ; -- good tv 12
PD[] = REG_wscan[].out;
------------------------------------------------------------------------------------
-- Взаимодействие с ШД процессора
------------------------------------------------------------------------------------
CD[] = DATA_CPU[];
--=====================================================================================
END;