Moderator: Mick
Mick wrote:Фото платы:
----------------------------------------------------------------------------------------------------------------------------
-- Описание: Прошивка микросхемы CPLD
-- Проект: ZXM-Phoenix 1024kb rev07
-- Автор: Mick
-- Тип CPLD: EPM3064ATC44
-- Версия: v1.00 - 26.05.2018
----------------------------------------------------------------------------------------------------------------------------
TITLE "ZXM-Phoenix 1024kb System Array Logic";
SUBDESIGN dd71
(
-- Входная тактовая частота CLK
CLK_14MHZ : INPUT;
-- Сигналы управления с CPU
CA[6..4] : INPUT;
CD[7..0] : BIDIR;
C_RD : INPUT; % сигнал чтения %
C_WR : INPUT; % сигнал записи %
C_MREQ : INPUT;
-- Общие сигналы
C_RESET : INPUT;
-- Сигналы управления
C_DOS : INPUT; % вход селектора TR-DOS %
CS_X7 : INPUT; % вход селектора портов %
C_A45 : INPUT; % вход селектора обращения к ПЗУ %
-- Сигналы SD Card
SD_CS : OUTPUT;
SD_SCK : OUTPUT;
SD_MOSI : OUTPUT;
SD_MISO : INPUT;
-- Сигналы управления ROM памятью
ROM_A16 : OUTPUT;
ROM_A17 : OUTPUT;
ROM_A18 : OUTPUT;
WR_ROM : OUTPUT;
)
VARIABLE
-- Регистр страниц xx37h микросхемы ROM ( страницы по 16кб)
WR_37 : LCELL;
ROM_PAGE_r[2..0]: DFF;
ROM_WrEn_r : DFF; --разрешение записи в ПЗУ(7 - бит)
REG_sddata[7..0] : TRI; -- буфер чтения SD карты
DATA_CPU[7..0] : TRI_STATE_NODE;
-- SPI интерфейс карты
WR_77 : LCELL;
WR_57 : LCELL;
RD_57 : LCELL;
CS_57 : LCELL;
SD_count[3..0] : DFFE;
SD_shift_in[7..0] : DFF;
SD_shift_out[7..0] : DFF;
SD_start_sync : DFF;
SD_count_en : LCELL;
SD_rule_r : DFF;
BEGIN
------------------------------------------------------------------------------------
-- Управление памятью ROM
------------------------------------------------------------------------------------
-- Порт xx37h = 00110111b
------------------------------------------------------------------------------------
WR_37 = !(CA[6..4] == B"011") # C_WR # CS_X7;
ROM_PAGE_r[2..0].d = CD[2..0];
ROM_PAGE_r[2..0].clk = WR_37;
ROM_PAGE_r[2..0].clrn = C_RESET;
ROM_WrEn_r.d = CD[7];
ROM_WrEn_r.clk = WR_37;
ROM_WrEn_r.clrn = C_RESET;
------------------------------------------------------------------------------------
-- Формирование управляющих сигналов ROM памяти
------------------------------------------------------------------------------------
ROM_A16 = C_DOS # ROM_Page_r[0].q; -- сигнал RA16 = DOS # RPage0;
ROM_A17 = !C_DOS & ROM_Page_r[1].q; -- сигнал RA17 = DOS/ & RPage1;
ROM_A18 = !C_DOS & ROM_Page_r[2].q; -- сигнал RA18 = DOS/ & RPage2;
-----------------------------------------------------------------------------------
-- Сигнал записи в ПЗУ
------------------------------------------------------------------------------------
WR_ROM = !ROM_WrEn_r.q # C_A45 # C_WR # C_MREQ; -- сигнал WRROM/ = A45 # WR # MREQ # !RWREN
------------------------------------------------------------------------------------
-- Интерфейс SD карты, работает на частоте 14МГц
------------------------------------------------------------------------------------
-- Порт xx57h = 01010111b
------------------------------------------------------------------------------------
CS_57 = !(CA[6..4] == B"101") # CS_X7;
SD_start_sync.d = !CS_57;
SD_start_sync.clk = CLK_14MHZ;
-----------------------------------------------------------------------------------
-- Счетчик
------------------------------------------------------------------------------------
SD_count_en = SD_count[0].q # SD_count[1].q # SD_count[2].q # !SD_count[3].q;
SD_count[].clk = !CLK_14MHZ;
SD_count[].ena = SD_count_en;
SD_count[0].clrn = !SD_start_sync.q;
SD_count[3..1].prn = !SD_start_sync.q;
SD_count[].d = SD_count[].q + 1;
------------------------------------------------------------------------------------
-- Входной сдвигающий регистр
------------------------------------------------------------------------------------
SD_shift_in[].clk = CLK_14MHZ;
IF SD_count[3].q ==0 THEN
SD_shift_in[].d = (SD_shift_in[7-1..0].q,SD_MISO);
ELSE
SD_shift_in[].d = SD_shift_in[].q;
END IF;
------------------------------------------------------------------------------------
-- Выходной сдвигающий регистр = xx57h = 01010111b
------------------------------------------------------------------------------------
WR_57 = CS_57 # C_WR;
SD_shift_out[].clk = !CLK_14MHZ;
IF WR_57 ==0 THEN
SD_shift_out[].d = CD[];
ELSIF SD_count[3].q ==0 THEN
SD_shift_out[].d = (SD_shift_out[7-1..0].q,VCC);
ELSE
SD_shift_out[].d = SD_shift_out[].q;
END IF;
-----------------------------------------------------------------------------------
-- Вывод данных в SD
------------------------------------------------------------------------------------
SD_MOSI = SD_shift_out[7].q;
------------------------------------------------------------------------------------
-- Выходная частота SD
------------------------------------------------------------------------------------
SD_SCK = CLK_14MHZ & !SD_count[3].q;
------------------------------------------------------------------------------------
-- Процесс записи в порт управления SD карты = xx77h = 01110111b
------------------------------------------------------------------------------------
WR_77 = !(CA[6..4] == B"111") # CS_X7 # C_WR;
SD_rule_r.d = CD[1];
SD_rule_r.clk = WR_77;
SD_rule_r.prn = C_RESET;
SD_CS = SD_rule_r.q;
------------------------------------------------------------------------------------
-- Чтение из буферного регистра
------------------------------------------------------------------------------------
RD_57 = CS_57 # C_RD;
REG_sddata[].in = SD_shift_in[].q;
REG_sddata[].oe = !RD_57;
DATA_CPU[] = REG_sddata[].out;
CD[] = DATA_CPU[].out;
END;
Users browsing this forum: No registered users and 1 guest