Просмотр полной версии : SQRUM 1M
Делаю клон на CPLD EPM7128SLC84-15 (MAX 7000S)
Решил, короче, запихнуть свой кворум, в том виде как он у меня сейчас в CPLD.
Получается смесь Кворум БК-04 и PROFI 1024
Память 1Мб на 2 чипах NN514405 или аналогичных мелких чипах с симов 4/8 мб, где 8-16 чипов.
http://savepic.net/9718948.jpg
Первые попавшиеся аналоги MB814400C TMS44400DJ M514400DL KM44C1000J HM514400CS6 V53C404HK60
Процессор, память, ПЗУ и большая часть портов ввода-вывода будут внешние, менеджер памяти и видеоконтроллер будут внутри.
Порты расширения
-------- Память ------------
1) #7FFD
D0 = bank 0 ;128 kB memory
D1 = bank 1 ;128 kB memory
D2 = bank 2 ;128 kB memory
D3 = select screen 0/1
D4 = ROM A14 (128/48)
D5 = disable paging
2) #1FFD
D1 = ROM A15 (когда установлен, то ROM A14 выбирает Сервис ROM / TR-DOS)
3) #DFFD
D0 = bank 3 ;256 kB memory
D1 = bank 4 ;512 kB memory
D2 = bank 5 ;1024 kB memory
D4 = 1 - disable rom and connect ram page 0 in adress space 0-3FFF, also enable port #7FFD if disabled
Структура ПЗУ 0 - 128, 1 - 48, 2 - Service (например Real Commander), 3 - TR-DOS
Сервисная страница выбирается пропатченным 128 Basic, можно взять здесь http://www.avray.ru/ru/zx-spectrum-256k-upgrade/
Возможно еще буду что-то делать с ПЗУ, а то 4 банка маловато конечно же )
------------------------------
4) #FE запись
D0 = BORDER B
D1 = BORDER R
D2 = BORDER G
D3 = TAPE OUT
D4 = BEEPER
Собрал пока что такую макетку
http://savepic.net/9618250.jpg
Вид снизу :-D
http://savepic.net/9625418.jpg
ГЛАВНЫЕ ОТЛИЧИЯ от Кворум-БК-04
1) экран как у пентагона, т.е. 320 строк решил сделать 312 как у оригинала
2) видеоконтроллер выбирается по DC1(hcnt[1])=0
3) смена адресов идет не по S0, а по DC0(hcnt[0])
Прошивка уже работает и выдает меню 128 бейсика с TR-DOS (сигнал DOS реализован внутри CPLD)
http://savepic.net/9609034.jpg
Еще примеры картинок
http://savepic.net/9610058.jpg
http://savepic.net/9616202.jpg
http://savepic.net/9603914.jpg
shurik-ua
05.03.2017, 16:55
рекомендую в будущем всё же отказаться от схемного ввода.
HardWareMan
05.03.2017, 19:17
shurik-ua, это почему же?
balu_dark
05.03.2017, 20:05
shurik-ua, это почему же?
Vhdl в отличие от схемного ввода - позволяет портировать код практически на любой кристал. А схемный ввод ограничен средой разработки и семейством CPLD. Чистое ИМХО.
omercury
06.03.2017, 00:16
схемный ввод ограничен средой разработки и семейством CPLD.
Если юзать встроенные в среду макро/мегафункции и встроенные в кристалл модули, то HDL "прилипает" к среде и семейству ничуть не меньше.
Хотя согласен, текст будет гибче.
Спасибо за дельные советы :) но меня пока что интересует конкретный вопрос, можно ли избавиться от 5 корпусов, которые я перечислил в первом сообщении, чтобы освободить макроячейки. Прочему схема, потому что у меня есть несколько схем, которые я объединил в одну, вот как-то так.
omercury
06.03.2017, 01:05
EvgenRU, чёй-то у Вас вся схема арабской вязью выполнена - заблудился сразу на синхрогенераторе... :v2_dizzy_facepalm:
Пока что меня еще смущают ИР23 4 штуки для задержки цвета (из схемы кворума)... а так же регистр D47
Мда, более четверти Альтеры на задержку всего видеоряда крутовато... явно сигналы стробирования буферов (либо H/V синхронизация) выполнены невовремя. Подсмотрите формирование видео хотя бы на Ленинграде.
По поводу общей концепции:
- Всё это безобразие в 128 ячеек всё равно не влезет, так что лучше перерисовать сразу;
- Регистры #FE (клава, кемпстон, вход/выход tape, бипер и пр.) придётся сделать внешними - тупо не хватит ножек;
- Разбейте схему на функциональные блоки (синхрогенератор, контроллер памяти, формирователь видеовыхода), оформите их отдельными модулями - в дальнейшем сильно упростит работу да и читабельности схеме в общем добавит сильно. От количества внутренних шин трассировка кристалла не изменится;
- Квартус прекрасно понимает соединение по именам/псевдонимам, так что длинные соединения тащить через всю схему совсем не обязательно.
З.Ы.
Девятый Quartus ещё поддерживает MAX и первый циклон а также ещё содержит в себе Мультисим.
UPD:
По поводу блочного построения схемы. Модули делайте отдельными файлами, потом на общей блок-схеме их соберёте. В HDL после этого их тоже проще переводить.
Синхрогенератор придётся перерисовывать 100%
Контроллер памяти тоже. Не забывайте, что оперативка у Вас на мегабайт, а шина адреса для неё 8 бит вместо 10... Регенерация её хоть и выполняется сканированием видеопамяти, но адресная шина должна обежать все адреса A0-A9 иначе данные Вы потеряете. Битики придётся переставлять, но это уже по ходу оперы.
HardWareMan
06.03.2017, 04:27
Vhdl в отличие от схемного ввода - позволяет портировать код практически на любой кристал. А схемный ввод ограничен средой разработки и семейством CPLD. Чистое ИМХО.
Дану? А я, дурак, под циклон V делал схемным и оно работало, а ведь не должно было, да?
- - - Добавлено - - -
Хотя согласен, текст будет гибче.
Текст удобнее для редактирования. И копипасты. А так же, когда мозги встанут на синхронные рельсы. А вот в схеме, новичок может рулить тем же триггером по всем сигналам от разных событий искаропки. Попробуйте это сделать в тексте, когда надо чтобы один и тот же регистр управлялся из разных always блоков. ;)
- - - Добавлено - - -
По поводу блочного построения схемы. Модули делайте отдельными файлами, потом на общей блок-схеме их соберёте. В HDL после этого их тоже проще переводить.
И это самый дельный совет. Если рисовать блоками, то даже редактирование будет не в тягость.
- - - Добавлено - - -
Можно просто на зоны поделить, как это я делал во время проектирования МХ2:
http://savepic.ru/13119606.jpg
- - - Добавлено - - -
Потом он разучит массивы и станет их паковать и после этого схема станет компактнее и читабельней (подсказка: кактус понимает массив элементов, если соединять их шиной а не проводом).
http://savepic.ru/13141897.jpg
- - - Добавлено - - -
Как-то так пока что получается
http://savepic.ru/13142039.png
Ой, ма... А зачем на выходе 8ми тактовая задержка всех сигналов изображения? А бордюр у тебя будет рисоваться по всему экрану: он у тебя по ИЛИ с обычным выходом, но ты его не гасишь во время экрана. И еще, приведи схему к стандарту, когда слева входы а справа выходы, мы же не арабы какие наоборот считывать. И это только то, что я увидел за секунду просмотра.
shurik-ua
06.03.2017, 04:28
shurik-ua, это почему же?
всё равно к нему (HDL) рано или поздно придёшь, так что лучше сразу )
HardWareMan
06.03.2017, 05:56
всё равно к нему (HDL) рано или поздно придёшь, так что лучше сразу )
Ага, и отпугнуть новичка, да? Придет он, когда созреет и будет готов. А пока пусть схемками балуется.
shurik-ua
06.03.2017, 06:06
можно чисто ради интереса - на этом конкретном примере написать код в ХДЛ и посмотреть что лучше скомпилируется - схема или ХДЛ )
HardWareMan
06.03.2017, 06:58
Ну, моего опыта, например, хватает, чтобы в схемном вводе получить результат как минимум не хуже, чем в HDL. Более того, RTL потом будет практически 1:1, а ведь это именно то, что положится в ПЛИСину. Преимущества xHDL вижу лишь в том, что их гораздо легче редактировать. Но мне как инженеру схемотехнику гораздо привычнее смотреть схему устройства а не ее описание на xHDL.
EvgenRU, чёй-то у Вас вся схема арабской вязью выполнена - заблудился сразу на синхрогенераторе... :v2_dizzy_facepalm:
Мда, более четверти Альтеры на задержку всего видеоряда крутовато... явно сигналы стробирования буферов (либо H/V синхронизация) выполнены невовремя. Подсмотрите формирование видео хотя бы на Ленинграде.
Так это же я схему кворума взял, а там всё именно так, вот я и планирую её оптимизировать, понятно, что в 90-е это делалось в отсутствие информации и в сжатые сроки. Возможно еще поддержка CP/M тут каким-то боком замешана...
Попробую из других клонов подсмотреть дельные блоки.
По поводу общей концепции:
- Всё это безобразие в 128 ячеек всё равно не влезет, так что лучше перерисовать сразу;
- Регистры #FE (клава, кемпстон, вход/выход tape, бипер и пр.) придётся сделать внешними - тупо не хватит ножек;
- Разбейте схему на функциональные блоки (синхрогенератор, контроллер памяти, формирователь видеовыхода), оформите их отдельными модулями - в дальнейшем сильно упростит работу да и читабельности схеме в общем добавит сильно. От количества внутренних шин трассировка кристалла не изменится;
- Квартус прекрасно понимает соединение по именам/псевдонимам, так что длинные соединения тащить через всю схему совсем не обязательно.
Да, на блоки поделить это отличная идея, я просто сначала так сделал, чтобы было общее представление о схеме и ничего не потерять, т.к. сделано это из 3-х схем, но уже всё это реализовано в железе на мелкой логике и работает.
Контроллер памяти тоже. Не забывайте, что оперативка у Вас на мегабайт, а шина адреса для неё 8 бит вместо 10... Регенерация её хоть и выполняется сканированием видеопамяти, но адресная шина должна обежать все адреса A0-A9 иначе данные Вы потеряете. Битики придётся переставлять, но это уже по ходу оперы.
Странно, но он работает и нормально регенерирует, схема взята от реального образца Quorum 1024
shurik-ua
06.03.2017, 07:44
я думаю со всеми оптимизациями код и схема займут одинаковое кол-во ячеек.
Но мне как инженеру схемотехнику гораздо привычнее смотреть схему устройства а не ее описание на xHDL.
на этот счёт у меня всё с точностью до наоборот.
s_kosorev
06.03.2017, 15:11
Да, на блоки поделить это отличная идея, я просто сначала так сделал, чтобы было общее представление о схеме и ничего не потерять, т.к. сделано это из 3-х схем, но уже всё это реализовано в железе на мелкой логике и работает.
на мелкой работает, на CPLD которые как минимум в разы быстрее может глючить, (например меркая логика не реагировала на коротки иголки, на которые CPLD уже ввиду более выского быстродействая среагирует) особенно критично в участках с счетчиками с самобросом итд, нужно внимательно оценить гонки сигналов, возможно где то придется добавить привязку к синхронизации
omercury
06.03.2017, 18:59
Ага, и отпугнуть новичка, да?
178 каналов ШИМ.
module PWM_10_Ch
(
input wire inclk, //Вход тактовой частоты (16MHz)
input wire nSSIN, //Выбор чипа, по положительному перепаду запись по адресу в старших 8 битах SPI
input wire SCKin, //Вход такта SPI
input wire MOSIin, //Вход данных от МК
output wire MISOout, //Выход данных на МК
output wire [num_PWM-1:0] PWM //Выход 10 каналов ШИМ 50Гц
);
parameter SPI_Width = 16; //Ширина шины SPI, бит
parameter CNT_Width = 8; //Ширина счётчиков PWM, бит
parameter num_PWM = 178; //Количество каналов PWM
parameter fCLK = 16000000; //Тактовая частота, Гц
parameter fPWM = 50; //Частота ШИМ, Гц
parameter fDiv = fCLK/fPWM/2**CNT_Width; //Коэффициент деления, вычисляемое
parameter psc = $clog2(fDiv); //Ширина сччётчика прескалера, вычисляемое
//**************************************************
wire [SPI_Width - CNT_Width - 1:0] SPI_Addr; //Шина адреса модулей CCP
wire [CNT_Width - 1:0] SPI_Data; //Шина данных модулей CCP
wire [CNT_Width - 1:0] Cur_Cnt; //Текущее значение счётчика PWM
wire [SPI_Width - 1:0] dataOUT;
assign SPI_Addr = dataOUT[SPI_Width -1: CNT_Width];
assign SPI_Data = dataOUT[CNT_Width - 1:0];
//**************************************************
// Предделитель на 1250
//**************************************************
reg [psc-1:0] f_cnt = 0; //Счетчик предделителя
reg pulse = 0; //Такт предделителя
always @ (posedge inclk) begin
f_cnt <= f_cnt + 1;
if (f_cnt == fDiv + 1) begin
f_cnt <= 0;
pulse <= 1;
end else pulse <= 0;
end
//**************************************************
// Дешифратор адреса CCP
//**************************************************
reg [CNT_Width - 1:0] CCP_Addr [num_PWM-1:0];
always @ (posedge nSSIN) begin
CCP_Addr[SPI_Addr] <= SPI_Data;
end
//**************************************************
// Подключение модулей
//**************************************************
SPIslave #(SPI_Width) SPI_1(.SCK(SCKin), .MOSI(MOSIin), .MISO(MISOout), .data(dataOUT));
Counter #(CNT_Width) CNT_1(.clock(pulse), .Cnt(Cur_Cnt));
// Создание модулей CCP
genvar y;
generate
for(y = 0; y < num_PWM; y = y + 1 ) begin : CCP_generation
CCP #(CNT_Width) CCP_0(.clock(pulse), .CurCNT(Cur_Cnt), .CompareVal(CCP_Addr[y]), .PWM_out(PWM[y]));
end
endgenerate
//**************************************************
endmodule
//**************************************************
Страшно? :D
Начал разбивать на модули, пока что делаю менеджер памяти, получилось как-то так
http://savepic.ru/13170466.png
Есть ли смысл делать чтение портов 7FFD и 1FFD ?
Вот так его в схему засунул :)
http://savepic.ru/13162309.png
omercury
06.03.2017, 21:14
Нет в жизни щястья (
...и не предвидится...
Есть "волшебная" кнопочка в квартусе
Глазками-ручками.
Кнопочка только в обратную сторону работает.
Впрочем Вы это и сами знаете.
- - - Добавлено - - -
Есть ли смысл делать чтение портов 7FFD и 1FFD ?
Наличие возможности чтения порта Вас ни к чему не обязывает - если какая-либо часть схемы в дальнейшем не используется, фиттер её просто выкинет при компиляции.
Пока что привел к такому виду, выкинул задержку видеовыхода, буду с ним разбираться когда отладочную плату сварганю.
http://savepic.ru/13110870.png
Получилось 95MC, так что можно еще и порты добавить.
Пока что застрял на Wave симуляции, хочу посмотреть что на счетчиках получается, но не могу понять как это сделать :( может кто кинет ссылочкой на толковый материал по этому поводу?
PS: добавил последнюю версию в первое сообщение
толковый материал по этому поводу
http://marsohod.org/11-blog/118-modelsim
http://marsohod.org/11-blog/207-ufmmodel
http://marsohod.org/11-blog/342-modelsim-schematics
например
Вот мне тут еще подумалось, нафига чипам с SIMMов два этих буфера на ИР22, у них же есть /OE, так что всё должно и без этих буферов работать! Так что минус еще 2 штуки ИР22 и минус 8 пинов под MD0..7 + 1 пин под /OE :-D
Или спек умеет читать из памяти во время записи?
Или будут косяки при чтении портов?
А может выкидывание этих буферов даст эффект порта #FF?
Залил версию 2.04 на первую страницу.
PS: Перешел на 9 квартус
PS2: придумал отличную схему моргалки курсора на ИЕ7 и триггере! добавлю в следующую версию.
Посмотрел я различные схемы, почитал материал про FLASH мигалку атрибутов и решил сделать мигалку на счетчике,
может уже что-то подобное проскакивало, но я тут предлагаю 2 варианта, на ИЕ5 и ИЕ7.
Изучение вопроса показало, что в спеке смена папер/инк в мигающих атрибутах происходит каждые 16 кадров,
следовательно берем VSYNC и кидаем на счетчик до 16-и, при переполнении производим смену уровня триггером.
http://savepic.ru/13235183.png
Надеюсь я ничего не напутал, если что - поправьте, а то не хочется городить на инверторах с конденсаторами как во многих схемах.
PS: А она точно будет такая на QD _____|*****|_____|*****| ?
Просто VSYN то он такой |*|__________|*|_________ я поэтому триггер и поставил
shurik-ua
11.03.2017, 19:03
у счётчика на флеш должен быть ещё один выход - переполнение, поэтому элемент 4И и триггер после него лишние.
p.s. к тому же квартус начнёт ругаться когда выход асинхронной логики подаёшь на тактовый вход Д-триггера.
p.p.s. верхняя схема верная - только на выходе CON уже частота поделенная на 16 - поэтому триггер не нужен
p.p.p.s. (последний) - частота / 16 будет на выходе QD, а на CON частота / 32 соответственно )) (иногда сначала пишу потом думаю )
Короче я понял, т.к. счетчик сам на триггерах и на RO1, RO2 подается GND то они работают так же как триггер на выходе, т.е. получается как раз то что нужно на выходе с 7493 и DUTY 50%. Спасибо за разъяснения.
Вот так получается:
http://savepic.ru/13206517.png
PS: всё же по буферам не подскажете, если я убираю стандартный буфер и буфер для сим, использую /OE памяти для отключения вывода на ШД, будет ли нормально работать память?
PS2: подозреваю, что /OE еще придется переделать так, чтобы видеоконтроллер тоже мог делать /OE при обращении к памяти а не только процессор по /MREQ и /RD?
solegstar
11.03.2017, 20:22
PS: всё же по буферам не подскажете, если я убираю стандартный буфер и буфер для сим, использую /OE памяти для отключения вывода на ШД, будет ли нормально работать память?
PS2: подозреваю, что /OE еще придется переделать так, чтобы видеоконтроллер тоже мог делать /OE при обращении к памяти а не только процессор по /MREQ и /RD?
да. ведь есть регистр атрибутов, точек...
Т.е. я мешаю /RAMCS с сигналом выборки из памяти видеоконтроллером (в моем случае это /DC2) и подаю на /OE памяти и мне буферы получается не нужны? :)
solegstar
11.03.2017, 21:36
Т.е. я мешаю /RAMCS с сигналом выборки из памяти видеоконтроллером (в моем случае это /DC2) и подаю на /OE памяти и мне буферы получается не нужны?
здесь бы еще прикинуть по тактам, чтобы шд была свободна в этот момент.
shurik-ua
11.03.2017, 22:01
схема создавалась под ру5 память и если не ошибаюсь там нет ОЕ, поэтому и ставили эти буферы как раз из-за ОЕ.
если у твоей памяти есть ОЕ то буфер не нужен, и да ОЕ проца надо будет смешать с ОЕ видеоадаптера.
HardWareMan
11.03.2017, 22:57
shurik-ua, нет. Буфер ставился чтобы записывать значение в цикле M1, который на пол такта опережает (отсюда WAIT), а для M2 или M3 он прозрачен. Ну и по совместительству да, он работает как ОЕ.
omercury
11.03.2017, 23:24
Вот так получается:
Вставьте в схему вот это.
Вставьте в схему вот это.
Вставил, что теперь мне с этим пятибитным счетчиком делать? :)
Буфер ставился чтобы записывать значение в цикле M1, который на пол такта опережает (отсюда WAIT), а для M2 или M3 он прозрачен. Ну и по совместительству да, он работает как ОЕ.
Не совсем понятно, что еще нужно в таком случае примиксовать к /OE или /WE ? /M1 и /WR к /WE нужно добавить?
PS: решил я счетчики переделать под Кворум 64, там как-то понятнее сделано на ИЕ7, а не ИЕ5
omercury
12.03.2017, 00:29
Вставил, что теперь мне с этим пятибитным счетчиком делать? :)
Если хочется четырёхбитный, просто поменяйте параметр W на четвёрку.
upd
Смысл в том, что параметризованный счетчик можно использовать многократно с разным параметром.
Указанный параметр внутри модуля используется только при вызове модуля без использования параметра, то есть как параметр по-умолчанию.
Для данного случая на Верилоге: BinCount #(4) cnt_1(.C(VSYN), .Q(FLASH_CLK)); будет синтезирован четырёхразрядный счётчик.
При вызове в таком виде: BinCount cnt_1(.C(VSYN), .Q(FLASH_CLK)); (в исходном случае) получился бы пятиразрядный счетчик.
Пригодится.
upd3
Чтоб было ещё понятней про параметризацию, поставлю в пример сврй же 178-канальный ШИМ. (http://zx-pk.ru/threads/27459-sqrum-1m.html?p=903534&viewfull=1#post903534) (пост #16)
На самом деле он рассчитан на 1-256 каналов и меняется это одним единственным параметром num_PWM, соответственно от 1 до 256.
А вообще вся та схема переделывается за минуту пятью параметрами на любое количество каналов и любую разрядность с любыми (в пределах, разумеется) частотами - лишь бы логики и ножек хватило. :)
(кстати, там есть одна не то, чтобы ошибка, но некорректное построение. позже сами увидите, что там не так)
- - - Добавлено - - -
PS: решил я счетчики переделать под Кворум 64, там как-то понятнее сделано на ИЕ7, а не ИЕ5
Не стОит, всё равно переписывать.. :)
- - - Добавлено - - -
upd2
Кстати, можно было не "отрывать" ножки у микросхем, как уже писал выше, неиспользуемая часть схемы не синтезируется.
Например если в регистре 74374 подключить только 5 выходов, то синтезируется пятиразрядный регистр.
Ладно, дальше я на 2 циклоне с PLL попробую это дело проверить в ближайшие дни, если вдруг кто-то захочет посмотреть и найдет какие-то ошибки - напишите, не поленитесь :)
UPD:
Залил в циклон2, нашел кучу ошибок в генераторах )))
UPD2:
С синхрой и гашением получилось, с бордером пока беда, так что еще буду с ним возиться на след неделе )
Два дня помучился, вроде бы все счетчики работают нормально, всё генерится нормально, залил версию 2.07 под Cyclone II
Завтра наверное буду проверять работоспособность.
Вопрос, RGBY как лучше подключать, через какой-то буферный элемент, чтобы не спалить порты на плисине или она выдержит 5в?
Собрал вот такую штуку, но что-то очкую пока включать,
http://savepic.net/9576266.png
если я прям так включу, дымок не пойдет?
Вроде в доке по циклону 2 написано, что порты 5в толерантны, но могут быть проблемы из-за разницы уровней сигналов.
Безопасно ли будет просто попробовать включить такой вариант? А то у меня такая только одна, а сейчас они как-то подорожали...
s_kosorev
15.03.2017, 18:43
Толлерантность еще нужно включить (clamp diode) + нужен последовательный резистор 50-100 ом, как то так для CII
К тому же, пока чип еще не загрузил конфигурацию, диоды отключены, т.е. совсем по хорошему нужен порядок подачи питающих напряжений, 5в включать после загрузки конфигурации
Ну в реальности, CII достаточно живучи (выживают когда сразу 5v участки включаются, но резистор никто не отменял), но все равно на свой страх и риск
- - - Добавлено - - -
z80 особенно по клоку, скорее всего не будет хватать уровня 3.3v, нужен опять же pull-up к 5v и опять вспоминаем про толлерантность
3 варианта, 1-заработает, 2-не заработает, 3-что то сгорит, ваш КО :)
Ясно, тогда не буду рисковать, подожду панельку для CPLD :)
PS: нашел тут несколько картинок, может кому пригодятся
https://hackadaycom.files.wordpress.com/2015/06/5v-resized.png
https://hackadaycom.files.wordpress.com/2015/06/3v-resized.png
подожду панельку для CPLD
когда нет панелек
https://habrastorage.org/files/43d/437/717/43d4377173214b548926cb36d4f3e9c4.jpg
omercury
16.03.2017, 01:04
сно, тогда не буду рисковать, подожду панельку для CPLD
А что мешает экскрементировать на T80/Tv80 ?
В EP2C5 таких Спектрумов вместе с ними пара штук влезет, только ножек наружу не хватит. :)
Если сдуть EP2С5 и воткнуть EP2С8 пожертвовав четырьмя IO (кстати, Вы отпаяли снизу перемычки R1-R2 и R9-R10? они нужны для питания 3k-ячеек логики, которые добавились в EP2C8, плата универсальная, также не думаю, что Вам нужен конденсатор C14), то не понадобится ПЗУ, по крайней мере на этапе экспериментов.
Переписал счетчики на Verilog, что-то не впечатлила разница в количестве ячеек...
omercury
17.03.2017, 02:13
не впечатлила разница в количестве ячеек...
Если схема одинакова, почему она должна занимать разное количество ячеек? :)
Так как схема всё равно оторвана от глобального клока, то можете сэкономить 1 регистр, заменив тип reg BLANCN на wire и вынеся его присвоение из always.
И кстати, за сегодняшний вечер вечер вы её нарисовали уже дважды. И, кстати 2, разницы между case и if/else по занимаемому месту быть не должно.
/INT наверное лучше вставить сюда же.
А теперь параметризуйте её и вот Вам для этого примерчик.
Переписал счетчики на Verilog, что-то не впечатлила разница в количестве ячеек...
Если схема одинакова, почему она должна занимать разное количество ячеек?
А елси нет разниЙЦЦы, то зачем платить больше (с)
Вот может мне кто подскажет по бооолее глобальномуу вопросу. Хочу переписать кусок схемы с SystemVerilog на ПростоVerilog. Как бы понимаю, что SV покруче и погибчее, но в конце то концов RTL то теоретически должна быть одинакова, только строк кода будет по разномуу??
Как заменить конструкции .SV на аналогичные в .V ?
Например такую:
reg [7:0] auto[41] = '{ 255, 0,0,0,0,...бла-бла-бла};
Что в данной конструкции означает апостроф и вообще нафига он? Ну не сишник я, и да жи не С++ :((
Переделал счетчик, сделал с параметрами, поправил, почитал про видеосигнал, гашение включает в себя и синхру, т.е. синхра должна быть в интервале гашения...
Еще мне всё же не нравится, что такая реализация счетчика съела лишних 6 макроячеек на EPM7128
Всё же буду делать счетчик на схемном вводе, т.к. 6 ячеек еще пригодятся AY-шку запихнуть с PWM
Как заменить конструкции .SV на аналогичные в .V ?
Например такую:
reg [7:0] auto[41] = '{ 255, 0,0,0,0,...бла-бла-бла};
Что в данной конструкции означает апостроф и вообще нафига он? Ну не сишник я, и да жи не С++ :((
На си это не похоже, но гугление говорит, что этот апостроф отвечает за приведение типов.
Ну а так это массив регистров, которым обычно описывается память, что-то типа ПЗУ на 41 байт.
Как-то так, но не знаю, может в Verilog тоже есть массивы...
reg [7:0] auto0 <= 255;
reg [7:0] auto1 <= 0;
reg [7:0] auto2 <= 0;
.....
s_kosorev
17.03.2017, 17:11
genvar i;
generate
for (i=0; i<41; i=i+1)
auto[i] <=0;
endgenerate
как то так :)
но 41 строка, Карл!(с) хотя это меньшее зло)
Следующий массив уже поболе будет
reg [7:0] gchar[64] = '{
8'b00000000, 8'b00001111, 8'b00001000, 8'b00000000,
А елси 255 элементов :((
Так же как всегда делали, (батничек/PERL/своя программка) которая сгенерит этот текст :)
UPD2: насчет апострофов, есть же они в Verilog :) 2'h02 вот же он!
UPD:
По счетчику осталось еще 2 вопроса
1. Сколько все-таки строк делать 320 или 312? Что является более корректным и совместимым?
2. INT насколько я понимаю нужно генерировать по спаду синхры? Какой это будет шаг в строках? 192+16? 208 строка получается? Еще пишут, что неплохо бы /IORQ и /M1 учитывать, но тогда перестает работать то что синхронизируется по HALT, как его учесть или лучше генерировать INT по счетчику? Сколько тогда строк он должен длиться? 28*2 или 24*2?
Кое что нашел тут http://zx-pk.ru/threads/16935-tajmingi-leningrad-1.html Тут говорится, что INT начинается сразу на бордере... кому верить?
omercury
17.03.2017, 21:50
Ну не сишник я, и да жи не С++ :((
А кто же? ;)
Если для нормального железячника это область ПЗУ, то для Вас - массив данных.
Вы ещё сюда структуры и наследование типов приплетите, а потом говорите: - "не сишник я!" :D
Например такую:
Для неопределённого снова отошлю к своему 178-канальному ШИМ, строка сразу после
// Дешифратор адреса CCP
Для определённого... создайте блок ОЗУ/ПЗУ и инициализируйте его файлом .mif/.hex
- - - Добавлено - - -
1. Сколько все-таки строк делать 320 или 312? Что является более корректным и совместимым?
Для классики одно, а для Пентагона другое. Вам который? :)
2. INT насколько я понимаю нужно генерировать по спаду синхры? Какой это будет шаг в строках? 192+16? 208 строка получается? Еще пишут, что неплохо бы /IORQ и /M1 учитывать, но тогда перестает работать то что синхронизируется по HALT, как его учесть или лучше генерировать INT по счетчику? Сколько тогда строк он должен длиться? 28*2 или 24*2?
Насколько помню в строке, следующей за последней строкой кадра, в туториале от Евгения где-то есть. Длительность ЕМНИП 32 такта.
Кстати, Верилог с удовольствием кушает дефайны и поддерживает условную компиляцию. Можно определить режим через параметры либо организовать виртуальную шину и менять видеорежим на ходу, логики в Максе правда не хватит, но есть Циклон.
s_kosorev
17.03.2017, 22:46
как то не так. Так массив одними нулями заполниЦЦа, а он в systemverilog-e все же такой:
ну так если есть логика, в заполнении, то if/case
ну либо генерить файл
Посмотрел несколько схем, в большинстве /INT идет по кадровому синхроимпульсу, а не по началу бордюра, в пентагоне вообще в схеме он начинается по сигналу гашения, хотя это одно и тоже получается. В скорпионе 1024 и кворуме он тоже начинается по КС, но в скорпионе он сбрасывается по /H6 (в моем случае /H3), т.е. через 32 такта, в других гасится конденсатором, т.е. выходит почти во всех клонах инт некорректно формируется должен по вертикальному бордеру, а не по синхре?
PS: раз везде по синхре инт идет, то и я тогда так же сделаю + 32 такта (64 пикселя)
PS3: еще /M1 /IORQ добавил, чтобы работало в турборежиме, а то длинный /INT будет
PS2: ну и тогда уже финальную версию счетчика выложу, времянки такие
http://savepic.ru/13259100.png
http://savepic.ru/13280024.png
omercury
19.03.2017, 20:44
когда нет панелек
...но есть панельки...
60184
Сделал три массива, причем один на 64 элемента, чисто assign-ами, ниче так, работает. РазниЦЦа в объеме кода конечно поболе, чем на systemverilog
Привыкли на своих плюсАх. ;)
В регистры загнали. Расточительно(8*64*3=1536), но когда надо быстро - годится.
но так нада!
Спартан?
В них, кстати, довольно много распределённой памяти, должен быть какой-то макрос, но какой не знаю - с ксаями дела не имел.
omercury
20.03.2017, 23:07
Всё же буду делать счетчик на схемном вводе, т.к. 6 ячеек еще пригодятся AY-шку запихнуть с PWM
А Вы уверены, что это проблемы языка, а не программиста? :rolleyes:
output reg HSYN = 0,
output reg VSYN = 0,
......
reg HBL = 0, VBL = 0;
reg HBR = 0, VBR = 0;
Вот Ваши 6 макроячеек.
В схематике эти сигналы формировались исключительно комбинационной логикой, в тексте же добавлены регистры.
Но, если тут обходиться без регистров, тогда вся универсальность потеряется... и смысла в коде на Verilog не будет никакого :)
omercury
21.03.2017, 01:48
Но, если тут обходиться без регистров, тогда вся универсальность потеряется...
Тэкс, попробуем на примере
вот здесь можно написать
wire pid_setup; assign pid_setup = pid[3] & pid[2] & ~pid[1] & pid[0];
а можно (кстати с использованием дефайна)
wire pid_setup; assign pid_setup = (pid==`SETUP_PID);
и сам дефайн в файле для наглядности. Подключается как обычно `include "имяфайла.v"
и смысла в коде на Verilog не будет никакого
Ага!
Сколько времени Вы чертили схему? А сколько времени потом переписывали (практически не зная языка)?
Какие инструменты нужны, чтоб составить схему? А для текстового режима? (я обычно использую notepad++ [programmers notepad к сожалению прекратил существование] и симулятор icarus verilog [дистрибутив 7Mb], квартус/кейл/студию/и т.д. уже на этапе сборки, единственная удобная фича в квартусе - комментирование/раскомментирование блока текста)))).
Паяю платку... питание напаял и что-то энтузиазм пропал :))) еще 4 пина JTAG, генератор и 60 пинов I/O осталось........ потом начну эксперименты ставить...
andykarpov
22.03.2017, 17:35
Паяю платку...
А схемка будет? :)
Да я пока что отладочную делаю, там только CPLD, генератор, JTAG и штыри с выводами, остальное буду бутербордами пока что цеплять, как всё отлажу, тогда уж (если всё будет как надо работать) сделаю и схему и плату :)
PS2: не выдержал, залил прошивку, синхра есть! можно дальше паять :)))
http://savepic.net/9610061.jpg
PS3: всё, спаял паука! :)
http://savepic.net/9625421.jpg
Копейкин
25.03.2017, 16:02
Наверное с опозданием,
но апостроф в SV позволяет длину вектора приравнивать к левой части без явного указания.
logic [3:0] a;
assign a = '1;
Заполнит а единичками во всех разрядах.
Массивы в верилог есть.
reg[7:0] mem[255:0];
256 байт памяти.
Ну что ж, собрал я это дело....
И, первый результат :-D
http://savepic.net/9586509.jpg
Так же как работа без буфера для сим )) но тут хоть какие-то данные на экране есть!
Пойду дальше схему ковырять...
PS: бордюр уже поправил (синхры и гашения не в порядке были), теперь главная проблема - работа с памятью без буферов...
omercury
25.03.2017, 19:07
Массивы в верилог есть.
Попробуйте его заполнить значениями при объявлении.
Массивов в явном виде в Verilog нет, есть память.
В VHDL кое как есть.
Копейкин
25.03.2017, 21:56
-------- Попробуйте его заполнить значениями при объявлении.
Для симуляции можно подгрузить данные из файла,
для рабочей прошивки редактор содержимого памяти есть в квартусе,
файл инициации памяти (*.mif) включаем в проект.
Извиняюсь, если оффтопик.
omercury
26.03.2017, 02:24
Для симуляции можно подгрузить данные из файла,$readmemh
для рабочей прошивки редактор содержимого памяти есть в квартусе,да
файл инициации памяти (*.mif) включаем в проект.либо .hex
О чём выше и сказано.
Где здесь массив?
Копейкин
26.03.2017, 09:17
omercury, у нас, очевидно, разное понимание слова "массив".
Я считаю регистр одномерным, а память 2-мерным массивами, неважно как они об'явлены.
А что считаете массивом вы?
Застрял на работе с памятью...
Без буфера нужно как-то аккуратно делать /OE для памяти...
Т.к. память читает процессор и видеоконтроллер, а еще шд должна быть свободна от памяти во время работы портов, получатеся такая схема.
/OE будет LOW когда
1) A14=1 или A15=1, /MREQ=0, /RD=0 читает процессор
2) A14=1 или A15=1, DC1 (1.75MHz) = 0 читает видеоконтроллер, вот тут нужно ли еще /RAS учитывать?
3) /IORQ=0, /M1=0 отключаем память
пока что такое не работает...
Тест 128к пока что не грузится...
Вот что имею на данном этапе
http://savepic.net/9598797.jpg
Еще непонятно откуда берутся эти вертикальные полосы.. то ли это монитор не понимает ЧБ, то ли бордер глючит...
Копейкин
26.03.2017, 12:27
Застрял на работе с памятью...
Без буфера нужно как-то аккуратно делать /OE для памяти...
Т.к. память читает процессор и видеоконтроллер, а еще шд должна быть свободна от памяти во время работы портов, получатеся такая схема.
/OE будет LOW когда
1) A14=1 или A15=1, /MREQ=0, /RD=0 читает процессор
2) A14=1 или A15=1, DC1 (1.75MHz) = 0 читает видеоконтроллер, вот тут нужно ли еще /RAS учитывать?
3) /IORQ=0, /M1=0 отключаем память
пока что такое не работает...
Тест 128к пока что не грузится...
Еще непонятно откуда берутся эти вертикальные полосы.. то ли это монитор не понимает ЧБ, то ли бордер глючит...
Мне кажется вы не правы.
Процессор может читать любую область памяти и писать в любую область памяти, кроме ПЗУ.
Приоритетным должен быть видеоконтроллер.
Он должен задерживать работу процессора в то время, когда сам читает память.
А поскольку шина одна (я правильно понял?) то обращение к портам тоже останавливает процессор.
В некоторых наших старых клонах процессор придерживают через сигнал WAIT\ процессора.
Оригинальный 128+ тормозится остановкой тактовой частоты процессора.
В современных клонах, с быстрой памятью, доступ просто разделён во времени. Память успевает обслужить и видео и процессор.
Ладно, дальше сам буду разбираться, зайду сюда как всё сделаю, можете дальше обсуждать свой SV
omercury
26.03.2017, 13:41
можете дальше обсуждать свой SV
Да у мну тут виндекапец случился, восстанавливаю:v2_dizzy_priest:
Копейкин
26.03.2017, 14:34
Ладно, дальше сам буду разбираться, зайду сюда как всё сделаю, можете дальше обсуждать свой SV
Мы больше не будем ;)
А по теме, хотелось бы видеть - как разделяется доступ к памяти между процессором и видео?
Может у вас диаграммы есть?
s_kosorev
26.03.2017, 23:54
Суть прозрачного доступа примерно в следующем
Видеогенератор читает данные в 2 раза быстрее чем ему нужно, но один из доступов его может выбить процессор, поэтому видеочасть в буфер сохраняет то что получилось прочитать.
Оба цикла процессор забрать не может, ему нужна память не чаще чем 1 такт из 3 смежных тактов
Суть прозрачного доступа примерно в следующем
Видеогенератор читает данные в 2 раза быстрее чем ему нужно, но один из доступов его может выбить процессор, поэтому видеочасть в буфер сохраняет то что получилось прочитать.
Оба цикла процессор забрать не может, ему нужна память не чаще чем 1 такт из 3 смежных тактов
Этого я и боялся...
А как в такой ситуации обойтись без MD0..7 (а то жалко 8 пинов то...)?
Если я поставлю буфер на ШД и выведу его выводы прямо на регистр атрибутов и сдвиговый регистр, это поможет?
Если да, то как его лучше подключить? когда давать OE памяти чтобы не было конфликта с буфером? с буфером понятно, у него (~3.5 & 1.75)
PS: на /OE памяти я подаю assign RAM_OEn = (~(A14 | A15) | (RDn | MREQn)) & DC1n;
Или всё же не получится без буферов???
omercury
27.03.2017, 02:37
Или всё же не получится без буферов???
Буфер активируется в момент WRBUF = DC0 & ~DC1, по спаду этого сигнала данные защёлкиваются (по схеме Ленинграда)
(там фактическое чтение процессором данных, если не ошибаюсь, на такт запаздывает.
А как в такой ситуации обойтись без MD0..7?
:)
А как данные для видюхи внутрь заводить?
(а то жалко 8 пинов то...)?
EPM7160STC100 ;)
Можно конечно всю эту бороду с видеоформитователем вместе с буфером в какую-нибудь мелконогую EPM3064ATC44 загнать, а с неё вывод уже непосредственно на ШД.
Поставил буферы... чёт весь мозг сломал, нифига не работает...
Подключил вот так
http://savepic.ru/13402373.png
На экране всё мельтешит...
s_kosorev
27.03.2017, 17:07
не знаю кто как, я уже схемы практически не воспринимаю, особенно если это кусок
omercury
27.03.2017, 18:57
Подключил вот так
1. Не вижу формирования /RAM_CS (должны участвовать сигналы /RD, /MREQ, A14, A15)
2. Подключены ли к MDx подтягивающие рнзисторы (ибо opendrain)
На экране всё мельтешит...
Сформируйте для начала просто полосы, потом заведите их через память, а уж потом и что-то осмысленное можно.
Логический анализатор уже купили?
UPD
Ну и так, страна советов же...
Поставьте последовательно с каждым IO резистор на 100 Ом, помогает очень неплохо экономить Альтеры ;)
1. Не вижу формирования /RAM_CS (должны участвовать сигналы /RD, /MREQ, A14, A15)
С этим всё в порядке
2. Подключены ли к MDx подтягивающие рнзисторы (ибо opendrain)
А если напрямую к bidir подключить вывод, так будет работать?
Сформируйте для начала просто полосы, потом заведите их через память, а уж потом и что-то осмысленное можно.
Логический анализатор уже купили?
Это добро давно есть... но лень что-то :) хотя ладно, попробую снять диаграммы....
попробую снять диаграммы....
https://www.youtube.com/watch?v=uSGsQjXWnXk
omercury
27.03.2017, 19:48
vlad, там уже железо есть на дискретной логике.
Что-то дешевый лог анализатор как-то не очень, 24МГц у него максимум...
http://savepic.net/9613132.png
omercury
27.03.2017, 20:00
А если напрямую к bidir подключить вывод, так будет работать?
Да.
Если Bidir управляется правильно.
Здесь из-за видео лучше развязать шины полностью.
На процессоре, кстати, pullup-ы обязательно должны быть.
- - - Добавлено - - -
Что-то дешевый лог анализатор как-то не очень
В любом случае это лучше, чем ничего)))
Получил таки матрас с буферами
http://savepic.net/9617228.jpg
Не знаю почему не работало до этого, но я всё пересобрал с нуля и поменял Z80 на всякий случай.
Продолжу далее, чтобы запустилось ПЗУ 128
omercury
29.03.2017, 21:34
Возможно еще буду что-то делать с ПЗУ, а то 4 банка маловато конечно же )
Возможно вопрос покажется дурацким, но... зачем?
Чтобы напихать туда всяких RC, QC и т.д.
PS: беру пока таймаут, разберусь со всеми таймингами и прозрачным доступом, как что-то заработает, так продолжу задавать вопросы, а так, пока смысла всех тут напрягать нет :) Сегодня спалил провод питания, идущий на бредборду с Z80, ПЗУ и ОЗУ :) проводок задымил и поплавились клемы, неудачно решил подать сигналы на буфер, ОЗУ и ПЗУ одновременно обратились к ШД :-D
omercury
30.03.2017, 01:21
ОЗУ и ПЗУ одновременно обратились к ШД :-D
Вот поэтому в #75 по всем сигнальным выводам резисторы - проверял работоспособность памяти с Али.
Чтобы напихать туда всяких RC, QC и т.д. С мегом оперативки? :-)
А какой смысл в D0 #1FFD ?
solegstar
30.03.2017, 09:06
Получил таки матрас с буферами
это не правильный матрас. правильный вот. (http://zx-pk.ru/threads/11486-faq-zheleznogo-razdela-(under-construction).html?p=789283#post789283)
Короче тот матрас был фигня, это походу не работало что-то из ОЗУ/ПЗУ/Z80
Есть небольшие успехи, тест48 запустился, бордюр весело прыгает, на экране пока что хрень, но более менее статическая, т.е. регенерация DRAM идет нормально, но буферы пока что как-то коряво работают, буду дальше ковыряться...
Переписал большую часть на Verilog.. выбор RAM/ROM пока что не получается на нем сделать.
У меня уже начинает складываться впечатления, что я первый делаю клон на CPLD/FPGA на DRAM, куда не посмотри - все на SRAM делают...
Копейкин
01.04.2017, 07:39
--------- я первый делаю клон на CPLD/FPGA на DRAM
;)
Reverse U16 тоже на динамической памяти.
Но там отдельный модуль занимается памятью - регенерация, управлением банками, простым кэшированием.
Выбор ПЗУ может так:
assign nROMSEL = A15 | A14 | nRD;
Другие комбинации адресов и nMREQ для ОЗУ.
Только вот такая конструкция заработала для экрана, в схемном виде и в другом ни в какую не хотело работать
reg [7:0] ATTR = 7;
reg [7:0] SHIFT_REG = 0;
// latch attributes
always @(posedge DC2)
ATTR <= MD;
// latch pixels, pixel shift
always @(negedge OSC)
if(DC2n & DC1 & DC0)
SHIFT_REG <= MD;
else
SHIFT_REG <= SHIFT_REG << 1;
// если написать SHIFT_REG = pixel_latch ? MD : SHIFT_REG << 1; - не работает!
omercury
02.04.2017, 04:00
// если написать SHIFT_REG = pixel_latch ? MD : SHIFT_REG << 1; - не работает!
... что и неудивительно, потому, что SHIFT_REG - регистр, а регистр должен тактироваться. :-)
Также нежелательно использовать для регистров блокирующее присвоение. ( "=" вместо "<=" )
З.Ы.
Нарезал шилд с процессором, пожалуй тоже что-нибудь сделаю. ;)
Одна беда - нечем зашить ПЗУшку... ну эт что-нибудь придумаю.
HardWareMan
02.04.2017, 07:01
EvgenRU, а ты покажи пример схемного ввода и я покажу твои косяки.
EvgenRU, а ты покажи пример схемного ввода и я покажу твои косяки.
Ну, я взял из стандартной схемы кворума
http://savepic.ru/13486557.png
Удалось даже немного упростить
// latch pixels, pixel shift
always @(negedge OSC)
if(DC2n & DC1 & DC0)
SHIFT_REG <= 202;//MD;
else
SHIFT_REG <= SHIFT_REG << 1;
Также нежелательно использовать для регистров блокирующее присвоение. ( "=" вместо "<=" )
Я тут почитал http://asdasd.rpg.fi/~svo/verilog/assignments/ и как-то уже не на 100% уверен в этом, т.к. синтезатор всё-равно сам всё сделает в этом случае.
PS: ПЗУ могу помочь зашить или подарить зашитое, при желании.
PS2: вот еще мультиплексор РАБОЧИЙ!
module ZX_mux(
input wire [4:0] H, // horizontal counter
input wire [7:0] V, // vertical counter
input wire [19:14] RAM, // Muxed Extended RAM address
input wire [15:0] A, // Z80 adderss
input wire S0, // RAS
input wire DC1, // H1
input wire DC2, // H2
input wire SCR, // Second SCREEN (128k)
input wire CLK, // CLOCK signal 14MHZ
output reg [9:0] MA
);
always @(negedge CLK)
begin
//-----------------------
// S0 - RAS
// DC1 - 0=CPU/1=VIDEO
// DC2 - 0=PIXELS/1=ATTR
//-----------------------
if(DC1)
begin
// VIDEO CONTROLLER ADDRESSES
// screen area address + DRAM refresh
if(S0)
begin // SELECT B
// screen area row address
MA[0] <= 1;
MA[1] <= 1;
MA[2] <= 0;
if(DC2)
begin
// Attributes
MA[3] <= 0;
MA[4] <= 1;
MA[5] <= 1;
end
else
begin
// pixels
MA[3] <= V[2];
MA[4] <= V[6];
MA[5] <= V[7];
end
MA[6] <= 0;
MA[7] <= 0;//SCR;
MA[8] <= 0;
MA[9] <= 0;
end
else
begin // SELECT A
// screen area column address
MA[4:0] <= H[4:0];
MA[7:5] <= V[5:3];
if(DC2)
begin
// attributes
MA[8] <= V[6];
MA[9] <= V[7];
end
else
begin
//pixels
MA[8] <= V[0];
MA[9] <= V[1];
end
end
end
else
begin
// CPU ADDRESSES
// memory address
if(S0)
begin // SELECT B
// memory row address
MA[0] <= RAM[14];
MA[1] <= RAM[16];
MA[2] <= RAM[18];
MA[6:3] <= A[13:10];
MA[7] <= RAM[15];
MA[8] <= RAM[17];
MA[8] <= RAM[19];
end
else
begin // SELECT A
// memory column address
MA[9:0] <= A[9:0];
end
end
end
endmodule
PS3: вот еще буферы
module ZX_buf(
input RAMWEn,
input RAMCSn,
input DC0,
input DC1n,
inout [7:0] D,
inout [7:0] MD
);
reg [7:0] wr_buf;
wire wrbuf = DC0 & DC1n;
assign MD = RAMWEn ? 8'bZZZZZZZZ : D;
assign D = RAMCSn ? 8'bZZZZZZZZ : wr_buf;
always @ (posedge wrbuf)
wr_buf <= MD;
endmodule
HardWareMan
02.04.2017, 10:37
Ну, я взял из стандартной схемы кворума
http://savepic.ru/13486557.png
Зачем непонятная и сложная 299, когда есть православная 198 (ИР13)? Я понимаю, что синтезатор вырежет из нее тристэйт, но зачем усложнять то? И вообще, зачем использовать сложный элемент в кастрированном режиме, если синтезатор все равно его обкромсает, причем часто не так, как нужно вам? Если вам нужно только 2 режима: загрузка и сдвиг, то не проще ли синтезатору прямо об этом сказать?
http://savepic.ru/13447638.png
Я тут почитал http://asdasd.rpg.fi/~svo/verilog/assignments/ и как-то уже не на 100% уверен в этом, т.к. синтезатор всё-равно сам всё сделает в этом случае.
Откройте уже для себя просмотр RTL. Это единственный способ узнать, как именно поняли вас синтезатор и фиттер (а они работают вместе и результат часто отличается для разных типов ПЛИС).
PS2: вот еще мультиплексор РАБОЧИЙ!
Потому, что этот мультиплексор регистровый (с хранением результата) и управляется из одного always блока, что как раз и соответствует всем требованиям. Если бы вам нужен был мультплекор на комбинаторике, его синтаксис был бы несколько иначе. Вот пример:
assign MAPC_A[17:10] = (~CTRL[7]) ? (
(PPU_A[12:11] == 2'h0) ? BCH0[7:0] :
(PPU_A[12:11] == 2'h1) ? BCH1[7:0] :
(PPU_A[12:10] == 3'h4) ? CHR2[7:0] :
(PPU_A[12:10] == 3'h5) ? CHR3[7:0] :
(PPU_A[12:10] == 3'h6) ? CHR4[7:0] : CHR5[7:0]
) : (
(PPU_A[12:10] == 3'h0) ? CHR2[7:0] :
(PPU_A[12:10] == 3'h1) ? CHR3[7:0] :
(PPU_A[12:10] == 3'h2) ? CHR4[7:0] :
(PPU_A[12:10] == 3'h3) ? CHR5[7:0] :
(PPU_A[12:11] == 2'h2) ? BCH0[7:0] : BCH1[7:0]
);
Ну и для полноты картины генератор клока без лишних регистров, который использую сейчас
module ZX_clock_gen(
input wire CLK, // 14 MHz clock input
input wire M1n,
input wire IORQn,
input wire RESn,
output reg PIXCLK = 0,
output wire PIXCLKn,
output wire DC0,
output wire DC0n,
output wire DC1,
output wire DC1n,
output wire DC2,
output wire DC2n,
output wire [4:0] H,
output wire [7:0] V,
output wire HSYN,
output wire VSYN,
output wire BORD,
output wire BLANCn,
output wire INTn,
output wire SYNn,
output wire CASn,
output reg RASn = 1,
output wire RAS
);
parameter HBorderStart = 256; // X resolution
parameter HBlancStart = 320;
parameter HBlancEnd = 384;
parameter HSynStart = 320;
parameter HSynEnd = 352;
parameter HLineEnd = 448;
parameter VBorderStart = 192; // Y Resolution
parameter VBlancStart = 248;
parameter VBlancEnd = 256;
parameter VSynStart = 248;
parameter VSynEnd = 256;
parameter VIntStart = 256;
parameter VIntEnd = 264;
parameter VLineEnd = 320;
reg [8:0] cntH = 0;
reg [8:0] cntV = 0;
reg CAS = 0;
always @(negedge CLK)
begin
PIXCLK <= ~PIXCLK;
CAS <= cntH[0];
end
always @(negedge PIXCLK)// or negedge RESn)
begin
cntH <= cntH + 1'b1;
RASn <= cntH[0];
if(cntH + 1'b1 == HLineEnd) // should be cntH + 1 as it is non blocking!
begin
cntH <= 9'b000000000;
cntV <= cntV + 1'b1;
if(cntV + 1'b1 == VLineEnd) // should be cntV + 1 as it is non blocking!
cntV <= 9'b000000000;
end
end
wire HBR = (cntH >= HBorderStart) ? 1'b1 : 1'b0;
wire VBR = (cntV >= VBorderStart) ? 1'b1 : 1'b0;
wire HBL = (cntH >= HBlancStart && cntH <= HBlancEnd ) ? 1'b1 : 1'b0;
wire VBL = (cntV >= VBlancStart && cntV <= VBlancEnd ) ? 1'b1 : 1'b0;
assign HSYN = (cntH >= HSynStart && cntH <= HSynEnd ) ? 1'b1 : 1'b0;
assign VSYN = (cntV >= VSynStart && cntV <= VSynEnd ) ? 1'b1 : 1'b0;
assign INTn = (cntV >= VIntStart && cntV <= VIntEnd ) ? 1'b0 : 1'b1;
assign PIXCLKn = PIXCLK;
assign DC0 = cntH[0];
assign DC0n = ~cntH[0];
assign DC1 = cntH[1];
assign DC1n = ~cntH[1];
assign DC2 = cntH[2];
assign DC2n = ~cntH[2];
assign H[4:0] = cntH[7:3];
assign V[7:0] = cntV[7:0];
assign BLANCn = ~(VBL | HBL);
assign SYNn = ~(HSYN ^ VSYN);
assign BORD = VBR | HBR;
assign CASn = ~CAS;
assign RAS = ~RASn;
endmodule
Гляньте, может еще остались какие косяки...
omercury
02.04.2017, 11:53
как-то уже не на 100% уверен в этом
"Весьмя згя!" (с)
Блокирующее присвоение будет держать цикл до своего полного выполнения и нарушит всю растактовку. Актуально, конечно же для синхронных схем (что к спекки не относится ни в коей мере) и не для текущих частот, но лучше привыкать к этому сразу. А уж если синтезатор "исправит" за Вами блокируещее на неблокирующее, то это косяк!
PS: ПЗУ могу помочь зашить или подарить зашитое, при желании.
Боюсь, что программатор я сделаю быстрее... ;)
UPD
PS2:Почитайте про конкатенацию.
UPD
Почитайте про конкатенацию.
Спасибо, переделал мультиплексор :-D
module ZX_mux(
input wire [4:0] H, // horizontal counter
input wire [7:0] V, // vertical counter
input wire [19:14] RAM, // Muxed Extended RAM address
input wire [15:0] A, // Z80 adderss
input wire S0, // RAS
input wire DC1, // H1
input wire DC2, // H2
input wire SCR, // Second SCREEN (128k)
output wire [9:0] MA
);
assign MA = DC1 ? (
S0 ? {2'b00,SCR,1'b0,DC2 ? 3'b110 : {V[7],V[6],V[2]} /*attr/pix*/, 3'b011} :
{DC2 ? V[7:6] : V[1:0] /*attr/pix*/, V[5:3], H[4:0]}
) : (
S0 ? {RAM[19], RAM[17], RAM[15], A[13:10], RAM[18], RAM[16], RAM[14]} :
A[9:0]
);
endmodule
UPD: подозреваю, что это некорректно, т.к. в счетчике изменение этих сигналов происходит по спаду пиксельклока и соответственно менять адреса нужно так же по спаду тактового генератора!
Т.е. так
module ZX_mux(
input wire [4:0] H, // horizontal counter
input wire [7:0] V, // vertical counter
input wire [19:14] RAM, // Muxed Extended RAM address
input wire [15:0] A, // Z80 adderss
input wire S0, // RAS
input wire DC1, // H1
input wire DC2, // H2
input wire SCR, // Second SCREEN (128k)
input wire CLK, // 14MHZ
output reg [9:0] MA
);
always @(negedge CLK)
MA <= DC1 ? (
S0 ? {2'h0,SCR,1'h0,DC2 ? 3'h6 : {V[7],V[6],V[2]} /*attr/pix*/, 3'h3} :
{DC2 ? V[7:6] : V[1:0] /*attr/pix*/, V[5:3], H[4:0]}
) : (
S0 ? {RAM[19], RAM[17], RAM[15], A[13:10], RAM[18], RAM[16], RAM[14]} :
A[9:0]
);
endmodule
UPD: Ну что ж, можете меня почти поздравить!!!!!
http://savepic.net/9591628.jpg
Матрас без ПЗУ, бежит немного ввеох :)
Атрибуты те что надо! Экран почти как надо, видимо я где-то попутал или в мультиплексоре или в рас/кас...
UPD1: убедился, что это не мультиплексор
UPD2: скорее всего проблема в рассинхронизация выборки байтов аттрибутов/пикселей....
UPD3: оказалось схемный ввод обработчика портов сильно тормозил схему! теперь как-то по-другому всё работает как переписал на Verilog.
UPD4: фигня, походу это всё считывалось с ШД проца, т.к. я перепутал спады/подъемы сигналов ))))
Короче, решил пойти по другому пути, отключил буферы, отключил сигнал /WE добился стабильного чтения из памяти
http://savepic.ru/13472944.jpg
Времянки
http://savepic.ru/13496496.png
PS: с чтением атрибутов на картинке попутал, они на цикл раньше читаются :)
Теперь не могу разобраться с подачей сигнала записи, для записи данных с шины данных процессора на шину данных памяти ну и сам процесс немного непонятный. По даташиту там есть режим READ-MODIFY-WRITE, может его попробовать или в какой момент нужно писать?
Переделал еще тайминги вот так, немного удлинил /RAS
http://savepic.ru/13481183.png
UPD:
походу проблема в записи из буфера, т.к. отправив константу в память она нормально заполнилась константным значением, а может оба Z80 у меня глючные, т.к. один совсем не работает, а второй вот так себя ведет, но, еще проверю.
UPD2:
разобрался, проблема была в неправильно работающих счетчиках, сейчас посплю и попробую сделать :)
UPD3:
блин, что ж никто не сказал, что нельзя писать в память во время работы видеоконтроллера :-D
UPD4:
еще почему-то попадают адреса из REFRESH на шину адреса во время записи...
Всё, устал я от него, брошу пока что на некоторое время, попробую еще со SRAM сделать,
пока что выложу то что получилось на данный момент.
UPD: кое-что еще поправил, кажется начало немного получаться, так что пока что не бросаю! :)
omercury
06.04.2017, 19:15
UPD: кое-что еще поправил, кажется начало немного получаться, так что пока что не бросаю! :)
Бросать не надо, но отдохнуть не помешает.
Кстати, на оригинальную схему где взглянуть?
Есть одра мысль.
Кстати, на оригинальную схему где взглянуть?
http://zx-pk.ru/threads/7071-skhema-kvoruma-64.html?p=118965&viewfull=1#post118965
самая первая
Расширение до 1024 тут http://zx-pk.ru/threads/26225-pomogite-rasshirit-s-256k-do-1024k/page2.html
PS: я так полагаю, что главная проблема - это синхронизация записи с мультиплексорами...
PS2: в v10 я там в генераторе частот PIXCLK забыл проинвертировать внизу, если что :)
omercury
06.04.2017, 21:03
PS: я так полагаю, что главная проблема - это синхронизация записи с мультиплексорами...
Примерно так и есть.
Вот и я пытаюсь понять, как происходит синхронизация видеоадаптера с процессором. Грубо говоря - как определяется, когда у процессора М1, а когда всё остальное...
То есть в какое время у менеджера памяти окно для процессора, а когда для видео. Штатный инструмент для этого - сигнал WAIT, некоторые с клоком морочаются, но это чистый маркетинг (лишь бы не заюзать WAIT), хотя разницы в способе пропуска такта нет никакой.
Ну, там оно делается так, DC1=0 CPU, DC1=1 - видео, а обмен происходит через буферы, поэтому шины не связаны, и процессор берет данные из буфера, когда активно видео.
Т.к. в РУ5 вход данных отдельный, то они работают так же как буфер, а вот с сим получается уже сложнее.
Еще раз повторюсь, что на реальном кворуме мне удалось запустить этот метр, работает стабильно, никаких проблем.
Проблема еще в том, что с DRAM у нас есть RAS и CAS, и нужно попасть при записи и в мультиплексоры и в момент, когда адрес ряда уже установлен и адрес ячейки установлен или устанавливается (EARLY WRITE)
PS: версию со схемным вводом тоже пробовал, так же не работает :(
omercury
06.04.2017, 21:38
Ну, там оно делается так, DC1=0 CPU, DC1=1 - видео, а обмен происходит через буферы, поэтому шины не связаны, и процессор берет данные из буфера, когда активно видео.
Ага, только тайминги обращений к памяти задаются аппаратно счётчиками (в том числе и фиксация адреса). То есть М1 (от него считать удобнее) может быть смещён на время до 7 тактов...
Проблема еще в том, что с DRAM у нас есть RAS и CAS
Это как раз ерунда, что за такт поставить всю шину, что за удвоенный такт поставить 2 половинки. Кстати, сигналы инверсные, соответственно защёлкивается в регистре адрес по отрицательному перепаду. Соответственно длительность активного состояния RAS/CAS на очень-то и важна (в разумных пределах, разумеется, в рамках быстродействия).
UPD
http://zx-pk.ru/threads/7071-skhema-...l=1#post118965
самая первая
Пипец! резисторно-конденсаторная логика)))
Пипец! резисторно-конденсаторная логика)))
Ага, без осциллографа не соберешь )))
PS: кстати, вот сейчас еще раз попробовал схемную версию, вывод более похож на правду уже! но всё-равно изображение бегает, видимо счетчики и адреса не стыкуются или кондера где-то не хватает :-D а может я там строки считаю до 320 а нужно 312, чтобы четко всё работало... жесть короче... уже все даташиты перечитал до дыр, никак не могу это дело синхронизировать....
omercury
06.04.2017, 22:00
кондера где-то не хватает :-D
Ну у нас-то вся мощь удвоенной/учетверённой/увосьмерённой ;) частоты ПЛИС.)))
Нам конденсаторы без надобности. :)
LeoN65816
06.04.2017, 22:55
PS: кстати, вот сейчас еще раз попробовал схемную версию, вывод более похож на правду уже! но всё-равно изображение бегает, видимо счетчики и адреса не стыкуются или кондера где-то не хватает :-D а может я там строки считаю до 320 а нужно 312, чтобы четко всё работало... жесть короче... уже все даташиты перечитал до дыр, никак не могу это дело синхронизировать....
Быть может тебе будет интересно, синхронный видеогенератор здесь (http://zx-pk.ru/threads/26944-mechta-agat-na-plis.html?p=906800&viewfull=1#post906800) и далее, АГАТовские режимы тоже на 312 строк.
omercury
07.04.2017, 00:19
здесь и далееЕщё успеет.))
Кстати, jic файл готовить научились? На марсоходе ребята подробно расписали процесс (https://marsohod.org/11-blog/261-sfl).
А вообще это необязательно - прекрасно шьётся pof-файлом в режиме Active Serial, правда значительно дольше, чем через житаг. Ну и разъём, разумеется подключается непосредственно к флеши. В Configuration Handbook от Альтеры есть.
LeoN65816
07.04.2017, 00:37
Кстати, jic файл готовить научились?
Да, но только вручную (File->Convert Programming Files...->и т.д.). Автоматизировать это можно, чтобы после очередной компиляции сам конвертился?
Ну и разъём, разумеется подключается непосредственно к флеши.
Дык, у меня только один разъем, там на фотке видно.
omercury
07.04.2017, 01:15
PS: кстати, вот сейчас еще раз попробовал схемную версию
Чужие схемы анализировать, конечно же, необходимо, но делать лучше свои. По крайней мере так не повторишь чужих ошибок (однако не факт, что не наделаешь своих)))
уже все даташиты перечитал до дыр
На данном этапе достаточно одного. :) на Z80.
Ну и разрисовать тайминги.
Там по большому счету всё достаточно просто - каждые 8 тактов пиксельклока (7МГц) надо читать из видеопамяти дважды - содержимое 8 точек в строке и цветовые атрибуты для них. То есть на 7МГц надо читать каждый четвёртый такт, что для частоты процессора (3,5МГц) означает, что видеопамять занята каждый второй такт, то есть ровно половину всего времени. Других вариантов как бы и нет.
Остаётся только выбрать, в которых тактах будет "окно" для процессора.
- - - Добавлено - - -
Автоматизировать это можно, чтобы после очередной компиляции сам конвертился?
Если честно, не пробовал. Во время отладки прошивка всё равно льётся непосредственно в ОЗУ циклона.
Ну что ж...
Есть первые, хоть и незначительные, но успехи!
Собрал вот такую вот девборду для отладки, а то куча проводов это жуть....
http://savepic.net/9618250.jpg
Ну, и, собственно сам успех! :)
http://savepic.net/9626447.jpg
Пока что атрибуты здесь не выводил, но картинка статичная, никуда не дергается!
PS: на всякий случай чтобы не про... не потерять, рабочий мультиплексор на метр
always @(*)
casex({H[1],H[0],H[2]}) // 1024K multiplexor
'b00X: MA <= A[9:0]; // column Z80 address
'b01X: MA <= {RAM[19], RAM[17], RAM[15], A[13:10], RAM[18], RAM[16], RAM[14]}; // row Z80 address
'b101: MA <= {V[7:6], V[5:3], H[7:3]}; // column attr
'b100: MA <= {V[1:0], V[5:3], H[7:3]}; // column pixels
'b111: MA <= {2'b00,SCR,1'b0, 6'b110011}; // row attr
'b110: MA <= {2'b00,SCR,1'b0,{V[7],V[6],V[2]}, 3'b011}; // row pixels
endcase
УРА!!!!!!!!!!!!!!!!!!!!!!
Не прошло и месяца!!! И наконец!!!!
http://savepic.net/9631567.jpg
Тест 48 прошел, 128 пока нет, но это дело поправимо!!!
Ну и конечно же :)
http://savepic.net/9619279.jpg
PS: больше всего провозился из-за проблемы с мультиплексором и сигналом записи!
PS2: написал на чистом Verilog одним файлом :)
PS3: выкладываю полурабочий вариант, что-то сейчас с портами, не работают как надо...
UPD: разобрался с портами, там в коде немного накосячил и еще нужно их читать по нарастанию а не по спаду :)
http://savepic.net/9622351.jpg
shurik-ua
25.04.2017, 03:16
А я говорил - схемный ввод до добра не доведёт ))
HardWareMan
25.04.2017, 07:56
shurik-ua, чойто?
http://newru.org/wp-content/uploads/2015/09/interny-57.jpg
shurik-ua
25.04.2017, 10:27
Да я к тому что человек вон промаялся с этим схемным вводом и в итоге всё равно сделал на верилоге))
HardWareMan
25.04.2017, 18:40
shurik-ua, ну а кто виноват в том, что не умеешь его готовить? Однако я поддерживаю переход на Verilog исходя из того, что все равно последует переход на FPGA.
Долго разбирался как инт работает... а всё так просто...
assign int_n = (vcnt == VSynStart && hcnt[8:3] >= 0 && hcnt[8:3]<=8) ? 1'b0 : 1'b1;
PS: последняя версия, тест гонятеся циклично без проблем и 256к тест в нем проходит. Так что метр памяти нормально работает!
ОФФТОП: прикупил тут... буду заниматься колдунством с ксайлинксом )))
http://savepic.net/9617231.jpg
UPD:
Всё работает, но вот Васик128 не стартует, дает черный экран... что ему нужно, чтобы запуститься?
solegstar
25.04.2017, 20:00
что ему нужно, чтобы запуститься?
правильно сделать мультиплексор для адреса С000. и второй экран. если подключить бипер, должно быть слышно нажатие клавиш бейсика 128, если в этом проблема. :)
Так с мультиплексором все хорошо и тестовое ПЗУ его нормально показывает
solegstar
25.04.2017, 20:18
я, когда развлекался и делал spectrum 128 из spectrum 48 по описанию Ewgeny7, то наступал на эти грабли тоже.
- - - Добавлено - - -
Так с мультиплексором все хорошо и тестовое ПЗУ его нормально показывает
если звук бипера бейсика 128 есть, но также есть черный экран. то это означает, что видеообласть не на своем месте. адресацию видеостраниц нужно бы проверить.
Записал в ПЗУ 4 игрухи, которые идут из ROM, вроде работают, но вывод изображения местами глючит, так что буду дальше разбираться, как всё заработает и 128 бейсик, так отпишусь :)
omercury
25.04.2017, 22:16
вывод изображения местами глючит
Так экран-то Пентагоновский.
Всё, удалось подружить пиксели и атрибуты, и всё по центру! отделался всего 4-мя регистрами и одним параметром :)
http://savepic.net/9596751.jpg
UPD:
обновил код, теперь всё отлично работает!
Так что главная проблема была в этом сигнале, теперь васик128 пытается стартовать, сначала включает черный второй скрин, потом переключается на первый, уже белый, выводит 2 точки и молчит, через какое-то время выкидывается в бейсик 48.
Возможно он хочет ДОС! :) попробую псевдо тырдос ему сделать, т.к. и прошивка с рил командером тоже не запускается.
UPD2: стандартный 128 BASIC, тот что без доса, стартует нормально, видимо тому что с досом нужен дос на старте...
UPD3: всё, сделал сигнал DOS и всё запустилось!!! Так что полностью рабочий вариант!!! Можно дальше всякие рюшечки приделывать! :)
http://savepic.net/9594703.jpg
Вот еще придумал хитрую поддержку турборежима 7МГц
reg turbo_add = 1;
always @(posedge ras_n)
turbo_add <= m1_n;
assign clk_z = m1_n & turbo_add ? ras_n : pixclk;
3 цикла из 10-и процессор работает на 7МГц
OrionExt
26.04.2017, 18:19
Это вы язык Verilog практикуете. Что же начнется если SystemVerilog пойдет в ход)
Программировать таракана FPGA станет еще проще.
shurik-ua
26.04.2017, 18:41
Что же начнется если SystemVerilog пойдет в ход
я чето думаю за Open CL будущее - надо в ту сторону смотреть )
OrionExt
26.04.2017, 19:01
Я тут не советчик, примус починяю (74 серия) :)
- - - Добавлено - - -
Однозначно Verilog правильный выбор (ну мне обидно чуток Паскаль – моя молодость).
omercury
26.04.2017, 19:15
Что же начнется если SystemVerilog пойдет в ход)
Выкинет таки наконец 74/155 серию и будет вспоминать только как страшный сон... ;)
- - - Добавлено - - -
Вот еще придумал хитрую поддержку турборежима
Пора разгонять память.
Ох какие возможности откроются... :)
OrionExt
26.04.2017, 19:50
Просто язык лаконичней (массивы – это …), в разы. Железяка фпга та же.
Х.з, память выше скорости по /WR не прыгнет.
Х.з, память выше скорости по /WR не прыгнет.
Ну хз, там она EDO 60нс, работала спокойно в P233 с частотой шины PCI >40МГц, так что думаю без проблем и поболе 28МГц должна потянуть )
Цитата "Работала на частотах 40 и 50 МГц с времем полного доступа — 60 и 50 нс и с времем рабочего цикла — 25 и 20 нс соответственно. "
PS: тем более сейчас память-то работает на частоте 3.5МГц, а генератор 14МГц, до 20МГц эту память можно смело гнать, т.е. можно гнать генератор до 80-100МГц и процессор до 20-25МГц.
OrionExt
26.04.2017, 20:11
Верю, ламер (я). запустил ядро на с2 t80 (память мгф-ом приделал по старинек, sram 10 nc). 50 mgz - t80. ОК
omercury
26.04.2017, 20:36
до 20МГц эту память можно смело гнать
1000/60=16,67МГц по пачпорту...
Ну хз, там она EDO 60нс, работала спокойно в P233 с частотой шины PCI >40МГц
А какова была ширина шины памяти?
А был ли кэш? :)
Эффективная частота - да, физически же работала на тех же 33,3/2.
(А, Вы про разгон. Ну да, можно и подразогнать, вопрос - нужно ли?)
Смысл не в этом, смысл в том, что сейчас память занята все 100% времени, при тутбировании памяти вдвое без турбирования процессора Вы получите "лишние" 50% свободного времени памяти, при турбировании ещё и процессора останется 25% неиспользованного времени памяти - частота запросов видеоотображения же не изменится. То есть каждый второй цикл работы процессора память свободна.
Для 7МГц процессора и 14МГц частоты памяти, она освободится аж на 37,5% всего своего времени или на 75% времени процессора. Причём абсолютно прозрачно для него - процессор об этом даже не догадывается.
Открывается бесплатный DMA например. Да что угодно, хоть накопители, хоть сеть. С "умным" контроллером, разумеется.
Странно, что это до сих пор никто не использует...
OrionExt
26.04.2017, 20:47
Ребята, вы с dram боретесь. Для драм придумали контроллер, уже. Тупизм Dram умом не побороть)
omercury
26.04.2017, 20:53
Ребята, вы с dram боретесь. Для драм придумали контроллер, уже. Тупизм Dram умом не побороть)
Вы наверное с SDRAM (синхронной) путаете. Для обычной динамички никакой контроллер не требуется.
Кстати, у Влада, ЕМНИП, частота рандомного доступа 14МГц.
Смысл не в этом, смысл в том, что сейчас память занята все 100% времени, при тутбировании памяти вдвое без турбирования процессора Вы получите "лишние" 50% свободного времени памяти, при турбировании ещё и процессора останется 25% неиспользованного времени памяти - частота запросов видеоотображения же не изменится. То есть каждый второй цикл работы процессора память свободна.
Мне лично видится в таком подходе проблема с регенерацией... или придется её делать самостоятельно или стараться попасть в /RFSH... здесь же он не используется
omercury
26.04.2017, 21:04
Мне лично видится в таком подходе проблема с регенерацией...
Регенерацией в Спектруме "занимается" видеоадаптер, причём опять же абсолютно бесплатно (по времени, разумеется). :)
64к - 24 раза за экран, мегабайт 6 раз.
OrionExt
26.04.2017, 21:10
Я с SRAM(8-бит). А DRAM – веселая штука. Ух.
- - - Добавлено - - -
Хотя скоро придется (86г), DRAM.
Уснул:)
LeoN65816
26.04.2017, 21:52
Для обычной динамички никакой контроллер не требуется.
Но "что-то" же должно формировать для нее (в отличие от статики) фазированые строб строки, мультиплексирование адреса, строб столбца, пассив (для восстановления)? Чем не "контроллер"? Не?
omercury
26.04.2017, 22:14
"что-то" же должно формировать для нее (в отличие от статики) фазированые строб строки,..., строб столбца,Они же стробы мультиплексоров адреса и видео и клок для процессора
пассив (для восстановления)Циклическо последовательное чтение
мультиплексирование адресаЭто да, но "оно" же и экономит пины. (кстати, забавные ПЗУ-шки с мультиплексированным адресом тоже есть)))
Ради прикола сделал чтение порта FE
wire port_rd_req = rd_n | iorq_n;
reg p_wr_fe_sel = 0;
reg p_wr_7ffd_sel = 0;
reg p_wr_1ffd_sel = 0;
// writing ports data (port read by CPU)
always @(negedge port_rd_req or posedge iorq_n)
if(!port_rd_req)
casex({DOS,a[15:0]})
/*#FE*/ 'b0XXXXXXXXXXXXXXX0: p_wr_fe_sel <= 1'b1;
/*#1FFD*/ 'b0000XXX1XXXXXXX01: p_wr_1ffd_sel <= 1'b1;
/*#7FFD*/ 'b001XXXXXXXXXXXX01: p_wr_7ffd_sel <= 1'b1;
endcase
else
begin
p_wr_fe_sel <= 1'b0;
p_wr_1ffd_sel <= 1'b0;
p_wr_7ffd_sel <= 1'b0;
end
assign dt = p_wr_fe_sel ? (!a[8] ? 8'b11111110 : !a[12] ? 8'b11101111 : 8'b11111111) : 8'bzzzzzzzz;
assign dt = p_wr_7ffd_sel ? p7FFD_data : 8'bzzzzzzzz;
assign dt = p_wr_1ffd_sel ? p1FFD_data : 8'bzzzzzzzz;
В менюшке 128 весело нажимается клавиша "ВНИЗ", значит всё работает, так что ядро полностью готово! Останется разве что подкорректировать немного /INT при прогоне программ его проверяющих :) сейчас сделал по первой строке экрана, но это вроде не совсем корректно.
Еще один вариант, меньше ячеек занимает
// writing ports data (port read by CPU)
wire port_rd_req = rd_n | iorq_n | DOS;
wire p_wr_fe_sel = port_rd_req | a[0];
//wire p_wr_ff_sel = port_rd_req | ~&a[7:0];
wire p_wr_7ffd_sel = port_rd_req | |{a[15:14],a[1]} | ~(a[13] & a[0]);
wire p_wr_1ffd_sel = port_rd_req | |{a[15:13],a[1]} | ~(a[9] & a[0]);
assign dt = !p_wr_fe_sel ? (!a[8] ? 8'b11111110 : !a[12] ? 8'b11101111 : 8'b11111111) : 8'bzzzzzzzz;
assign dt = !p_wr_1ffd_sel ? p1FFD_data : 8'bzzzzzzzz;
assign dt = !p_wr_7ffd_sel ? p7FFD_data : 8'bzzzzzzzz;
//assign dt = !p_wr_ff_sel ? attr : 8'bzzzzzzzz;
#FF не влазиет увы...
omercury
27.04.2017, 08:20
#FF не влазиет увы...
Выносите мультиплексор #FF/FE наружу (пара 74245), внутри оставьте только управление ими, это сэкономит немного логики и десяток пинов.
Решил, что буду ставить вторую альтеру, в неё запихну DOS и обработку IORQ (под IORQGE) оставшиеся биты порта FE (бипер, тапеаут), так же чтение порта FE, FF и немоIDE, может еще и клавиатуру получится там хотя бы частично сделать и часть BDI. Останется 4 пина в первой альтере, их можно будет задействовать под VGA
/M1 уйдет во вторую, CLK приклею к /RAS, как раз 4 пина будет.
omercury
27.04.2017, 22:33
Решил, что буду ставить вторую альтеру
Евгений, я вот не понимаю - почему Вы на циклоне не тренируетесь?
Неограниченное число циклов записи, громадное (в 36 раз больше, чем сейчас) количество логики, памяти правда всего 6,5 килобайт, ну так в Максе её вообще нет.
Евгений, я вот не понимаю - почему Вы на циклоне не тренируетесь?
Неограниченное число циклов записи, громадное (в 36 раз больше, чем сейчас) количество логики, памяти правда всего 6,5 килобайт, ну так в Максе её вообще нет.
Ну, я как бы уже купил их 20 штук по 100р ))))
И опять же 5 вольт.
Я в свою альтеру уже более 500 раз прошивку заливал, никаких проблем пока что, говорят можно многим более 1000 раз лить, но сокращается срок службы флешки, т.е. количество лет гарантированного хранения информации в ней.
У меня же память 5в, процессор 5в, флеш 5в.... так что с циклоном будет напряжно, шина адреса не проблема, а вот шины данных и переферия... опять же PS2 клавиатура внутри подтянута к 5в...
omercury
27.04.2017, 23:08
Ну, я как бы уже купил их 20 штук по 100р ))))
С прицелом на барахолку? ;)
У меня же память 5в,... флеш 5в....
Так-таки трёхвольтовых нет? )))
процессор 5в
Софтовый.
Для тренировок самое то.
опять же PS2 клавиатура внутри подтянута к 5в...
2 резистора.
Тут в соседней ветке (http://zx-pk.ru/threads/13005-quot-a-ty-sdelal-svoj-klon-spektruma-quot-).html?p=910460&viewfull=1#post910460) рекомендуют. :)
С прицелом на барахолку? ;)
Пока что нет, не только спектрумы же из них можно делать, ну а так, может быть, по одной плате нецелесообразно заказывать, а лишние куда-то нужно девать :)
Так-таки трёхвольтовых нет? )))
Есть, но зачем их покупать, когда 5в мешок с тележкой?
Софтовый. Для тренировок самое то.
Да, но, для меня это уже тема некоторого будущего :) Сначала хочу доделать то что начал. Z80 я делал на C#, очень неплохо получилось в проигрывателе AY файлов :)
2 резистора.
Тут в соседней ветке (http://zx-pk.ru/threads/13005-quot-a-ty-sdelal-svoj-klon-spektruma-quot-).html?p=910460&viewfull=1#post910460) рекомендуют. :)
Это да, но опять же шина данных... как с ней быть? Без кучи лишних буферов не обойтись (4 штуки минимум).
omercury
28.04.2017, 01:20
не только спектрумы же из них можно делатьА что же ещё?
Для неспектрумов есть посвежей и более ёмкие, я пяток EP1C3T100C8N по 136р брал, хотя они тоже уже старые.
Есть, но зачем их покупать, когда 5в мешок с тележкой?
Типа я хоть одну из имеющихся купил)))
Из компьютерного железа. Кстати, многие на чтение и от 3 вольт прекрасно работают.
очень неплохо получилось в проигрывателе AY файловВот-вот, пару штук туда же и засунуть.
Это да, но опять же шина данных... как с ней быть? Без кучи лишних буферов не обойтись (4 штуки минимум).https://ru.aliexpress.com/item/5PCS-TXB0108PWRG4-TXB0108PWR-TXB0108-YE08-TSSOP20/32722001019.html?spm=2114.13010608.0.0.Q0cKnu
хотя можно обойтись и резисторами.
ЗЫ
Кстати о ПЗУ.
Что у Вас записано в неё? Не можете поделиться...
Я кажется только что проверил, как сделать спек на трёх микросхемах: таки EP1C3T100C8N, EPCS4/16 и CY7C1049.)))
А что же ещё? Для неспектрумов есть посвежей и более ёмкие, я пяток EP1C3T100C8N по 136р брал, хотя они тоже уже старые.
Можно мигалки для светодиодов, например делать :-D
Типа я хоть одну из имеющихся купил)))
Из компьютерного железа. Кстати, многие на чтение и от 3 вольт прекрасно работают.
Надо будет попробовать :)
ЗЫ Кстати о ПЗУ.
Что у Вас записано в неё? Не можете поделиться...
Я кажется только что проверил, как сделать спек на трёх микросхемах: таки EP1C3T100C8N, EPCS4/16 и CY7C1049.)))
Вот тут http://www.avray.ru/ru/zx-spectrum-256k-upgrade/
ROM2
omercury
28.04.2017, 01:57
ROM2
Кстати рекомендую: https://www.altera.com/en_US/pdfs/literature/ug/ug_altasmi_parallel.pdf
Раньше с ней дела не имел, а оказалась удобная штука. Конфиг EP1C3 занимает ~75 килобайт в начале флеши, остальное совершенно свободно, можно юзать в виде параллельной ПЗУ (с возможностью записи). Всего 8 тактов клока до готовности данных, при 28МГц нормально работает, то есть для нетурбированного спека более чем достаточно. В крайнем случае можно перенести в ОЗУ.
Кстати, конфиг EP2C5 занимает 1,223,980 бит, более 256 килобайт в EPCS4 остаётся пустыми. :)
Пятивольтовую DRAM на такой же плате через резисторы на ШД я уже пробовал, надо только номиналы резисторов поменьше сделать, у меня 2к2, неустойчиво выше 9МГц на цикл ReadModifyWrite работает.
- - - Добавлено - - -
Всего 8 тактов клока до готовности данных
Некорректная информация - 8 тактов для последовательного чтения, для рандомного 49 тактов. (((
Придётся переносить в раму.
Я вот тут подумал, линия адреса же 16 пинов получается... а что, если её смультиплексировать на 8 пинов... освободится 7 пинов дополнительных (потребуется 16 регистров), но получится, что нужно ставить 4 КП11 или делать это во второй альтере..., туда всё-равно нужно ША заводить будет Как бы, есть ли смысл с этим заморачиваться?
UPD: пожалуй не буду мучиться с этой ерундой :)
еще вынесу rom14, rom15 во вторую, сделаю там еще rom16,17 для 256к ПЗУ, итого уже 6 пинов свободных будет
omercury
29.04.2017, 07:49
Я вот тут подумал, линия адреса же 16 пинов получается... а что, если её смультиплексировать на 8 пинов...
А смысл?
ПЗУ подключается к ША процессора снаружи, ША оперативки всё равно отдельно.
Всё-таки схема Кворума неудобна для кройки и шитья, намного более наглядна схема Ленинграда (http://sblive.narod.ru/ZX-Spectrum/Leningrad48k/LeningradSCH180dpi.gif) с SBLive. Вот на ней и попробую, мысль, думаю, поймёте. Прямо по микросхемам памяти проводите вертикальную черту - всё, что слева в одном корпусе, всё, что справа - в другом. Со своими нюансами, разумеется. С усложнением мультиплексора RAM и добавлением дешифраторов портов в левой части и защёлками этих дешифраторов в правой.
Мысль в том, чтоб не заводить шину данных в левую часть, а шину адреса в правую.
давайте я вам epm3256 144 пришлю, туда "влезит" все и ног хватает, могу прислать уже на макетке.
omercury
29.04.2017, 10:29
Заглянул сегодня на ресурс
Эмулятор AY на Atmega8 и другое... (http://www.avray.ru/ru/)
Если точнее, то сюда: ZX-Spectrum PS/2 Keyboard (http://www.avray.ru/ru/zx-spectrum-ps2-keyboard/) и ужаснулся.
Минус питания можно подключать как к 8 пину, так и к 22, т.к. они запараллелены в МК. Так же можно брать плюс питания с 20-ой ноги для подключения других микросхем, очень удобно
Евгений, минус питания ВСЕГДА подключается ко ВСЕМ контактам, выведенным наружу, также, как и плюс. Ибо!
Внутри они как бы соединены, но только как бы...
Допустим в моём экземпляре AtMega8-16PU сопротивление между пинами 8 и 22 равно 0,9 ома, а между 7 и 20 = 5,6 ома. Измерено HP890CN.
Вообще контакт в полупроводниках весьма эмпирическая штука, например 50% вероятность прохождения заряда считается очень хорошим контактом...
Исправьте немедленно и больше так не пишите - сколько уже глюков с неподключенным питанием было - не перечесть.
- - - Добавлено - - -
Заглянул сегодня на ресурс
Эмулятор AY на Atmega8 и другое... (http://www.avray.ru/ru/)
Если точнее, то сюда: ZX-Spectrum PS/2 Keyboard (http://www.avray.ru/ru/zx-spectrum-ps2-keyboard/) и ужаснулся.
Минус питания можно подключать как к 8 пину, так и к 22, т.к. они запараллелены в МК. Так же можно брать плюс питания с 20-ой ноги для подключения других микросхем, очень удобно
Евгений, минус питания ВСЕГДА подключается ко ВСЕМ контактам, выведенным наружу, также, как и плюс. И уж тем более их нельзя пропускать через микросхему. Ибо!
Внутри они как бы соединены, но только как бы...
Допустим в моём экземпляре AtMega8-16PU сопротивление между пинами 8 и 22 равно 0,9 ома, а между 7 и 20 = 5,6 ома. Измерено HP890CN.
Вообще контакт в полупроводниках весьма эмпирическая штука, например 50% вероятность прохождения заряда считается очень хорошим контактом...
Исправьте немедленно и больше так не пишите - сколько уже глюков с неподключенным питанием было - не перечесть.
- - - Добавлено - - -
Да что ж такое с редактированием-то?!!!
Так, значит поставил я вторую альтеру, запихнул в неё клавиатуру PS2, намного веселее стало работать )))
Поправил еще видеовыход, не выводилась первая строка и небольшой сдвиг по горизонтали был.
Сигнал INT всё-таки нужно с началом бордюра генерировать, а то клавиатура глючит :)
Пока что завис на читалке магнитофона, ну и буду клавиатуру дальше модернизировать, чтобы капслоки всякие работали и кнопки с "E" нажимались напрямую.
2omercury: там имелось в виду, что подключать к питанию атмеги 1-2 микросхемы, конечно же не что-то с большой нагрузкой, проерял несколько раз, всё работает без проблем.
2Totem: да, в эту всё влезет, но не хочется вас утруждать, заказал на али, какие-то дешевые нашал по 100р штука :) надеюсь придет :-D
omercury
03.05.2017, 11:04
Так, значит поставил я вторую альтеру, запихнул в неё клавиатуру PS2, намного веселее стало работать )))
В смысле?
У меня на Альтеровской корке (выдрал из туториала Евгения-7, кстати, кто автор?) что-то порядка 300 ячеек без кемпстона заняла.
Сигнал INT всё-таки нужно с началом бордюра генерировать, а то клавиатура глючит
Дык он где-то рядом с синхроимпульсом должен генериться.
всё работает без проблем
Не стоит надеяться на везенье.
Ох не стОит... :)
З.Ы.
Забавная ситуация - не редактируется только предыдущий пост, остальные в норме.
Вероятно заблокировано редактирование, есть такая возможность у модераторов.
сам когда-то пользовался.)))) ;)
В смысле?
У меня на Альтеровской корке (выдрал из туториала Евгения-7, кстати, кто автор?) что-то порядка 300 ячеек без кемпстона заняла.
Ну, я сделал клавиатуру только в режиме чтения, так что она только сканкоды читает, поэтому гораздо меньше занимает места.
Примерно 60 макроячеек получилось.
А тот пример из туториала в оригинале я видел где-то на зарубежных ресурасх, так что откуда-то оттуда оно.
UPD: теперь у меня проблема с магнитофоном.... порт #FE
значит, команда SAVE работает отлично, звук есть, бордюр бегает, всё хорошо, запись в порт #FE работает нормально
клавиатура тоже нормально работает, значит, чтение из #FE идет нормально, но вот 6 бит молчит...
точнее, я читаю с ноги альтеры, вывожу на динамик, звук есть, вывожу этот бит в порт #FE 6-ым битом и ничего не происходит, уже даже ПЗУ128 постаил с Tape Tester, никаких шевелений... как будто синтезатор выкинул этот бит при компиляции... уже кучу вариантов перепробовал... 2 дня вожусь... ничего не получается :(
UPD2: вопрос решился, альтера полудохлая оказалась :))) что-то я сразу не догадался её проверить...
UPD3: нормально читается! сделал читалку на 2 резисторах и конденсаторе :-D
Ну что ж, связь с внешним миром установлена :-D
Вот какие результаты на сегодняшний день
http://savepic.net/9577295.jpg
http://savepic.net/9571151.jpg
http://savepic.net/9576271.jpg
http://savepic.net/9574223.jpg
http://savepic.net/9627470.jpg
Чтение #7FFD что-то не получилось, видимо там какие-то особенности есть, зато сделал #FF :)
Разобрался окончательно с /INT, теперь он 24-28 тактов у меня, правда в DarkStar картинка на бордюре немного сдвинута вправо, но это, наверное, потому что она сделана под оригинальный спек.
Времянки все по тесту вроде похожи на правду.
PS: UMT нормально тестит весь метр памяти как Scorpion1024
shurik-ua
04.05.2017, 09:23
В полкУ плисоводов прибыло )
omercury
04.05.2017, 18:24
В полкУ плисоводов прибыло )
Угу.
Ему б ещё "АВР головного моска" излечить... )))) :D
Так, чисто чтобы было что посмотреть :-D
https://youtu.be/z3H2a_xxMc4
сделал читалку на 2 резисторах и конденсаторе
Например?
как то у меня не устойчиво читает простенькая схема
Например?
как то у меня не устойчиво читает простенькая схема
Ну я её пока что для теста чисто сделал, она тоже неустойчиво читает (на нормальной скорости без ошибок, на ускоренной ничего не читает) и без спикера не работает :)
Ну что ж, новая версия :)
Переделал менеджер памяти под профи, т.к. он единственный, который полностью определяется в тесте 4.30 и видео под фирменный спек
http://savepic.net/9620302.jpg
http://savepic.net/9621326.jpg
http://savepic.net/9625422.jpg
PS: порт #FF можно раскоментить, вроде нормально всё с ним, отключал пока отлаживал
omercury
07.05.2017, 03:04
Ну что ж, новая версия
Евгений, помните больше месяца назад говорили про модульное программирование? Разделение на 2 кристалла могло бы происходить проще.
Кстати, модули могут находиться в одном файле, это не си. :)
видео под фирменный спекНу вот!
А то Пентагон, Пентагон...)))
P.S.
В битовой последовательности (типа 'b1XXXXXXXX1XX11X10) для удобства чтения ниблы или байты можно разделять подчерком (типа так 'b1_XXXX_XXXX_1XX1_1X10)
shurik-ua
07.05.2017, 08:55
порт #FF можно раскоментить, вроде нормально всё с ним, отключал пока отлаживал
не нужен он и даром ) - экономь ячейки.
А как же арканоид? )
Кстати, с арканоидом прикол, загрузил вчера без #FF, он естесственно висит,
включил #FF, перезалил прошивку, ничего не сбросилось, игра пошла :)
PS: вопрос по читалке магнитофона, есть ли смысл её делать? если да, то на чем лучше? я пробовал на NE555, но чёт не выходит, на выходе постоянно лог 1, на СА3 делал, там вроде получше, но эта микросхема уже раритет наверное...
PS2: насчет модулей... ну... не знаю, мне как-то удобнее всё одним текстом, тем более, что там модули жестко связаны с данными других модулей, проще кусок текста переставил в другой файл, чем каждый раз эти шапки для подключения модулей писать :)
SoftFelix
07.05.2017, 10:11
я пробовал на NE555, но чёт не выходит, на выходе постоянно лог 1
Она должна быть обязательно наша отечественная 1006ВИ1! На любой импортной работать НЕ будет. Но если заработает (на нашей ВИ1), то очень хорошая читалка.
вопрос по читалке магнитофона, есть ли смысл её делать? если да, то на чем лучше?
Делать, да. Почемуу нет. Как раз может в тот проект на ардуинке доделаете плейер тап-ок, будет на чем проверить)
Гишпанцы ( и не только:), делают читалку по такой схеме, как минимуум у полтыщщи человек работает.
http://s2.micp.ru/23lQ3.jpg
omercury
07.05.2017, 13:16
на чем лучше?
Примерно тысячу лет назад делал для своего Ленина то ли на двух, то ли на трёх инверторах К561ЛН1, единственное, что добавлял от себя - начальное смещение первого элемента. Турбу читал спокойно.
на СА3 делал, там вроде получше, но эта микросхема уже раритет наверное...Компаратор обыкновенный.)))
Любой компаратор или операционник в режиме компаратора, желательно R2R.
Жуть, пол дня провозился, чтобы сделать поддержку #FD, чего только не перепробовал, сплошные глюкодромы...
Решение нашлось самое тривиальное :-D
/*write #FD */
'b1_000X_XX0X_1111_1101: port_7FFD[4:0] <= dt[4:0];
PS: OUT(#FD),A конечно не прокатит в некоторых случаях, но зато в тесте определяется наличие порта :-D
UPD: в топку этот порт #FF, загрузил диззи 4 128, над диззи иногда возникают полоски, когда он дрыгается или если попрыгать, если отключить #FF, то проблема исчезает.
PS2: поставил всё же свой контроллер клавы на атмеге8, гораздо приятнее работать и куча места во второй альтере освободилось :)
PS3: пока что есть некоторая проблемка связи рамдиска и RC, но, надеюсь её побороть или сделать другой вариант выбора ПЗУ
shurik-ua
07.05.2017, 16:09
если так нравится арканоид - есть версия без глюков с этим портом )
по сути это не порт как таковой - а такое поведение обусловлено особенностями схемотехники оригинального спека, поэтому лучше забыть о нём сразу )
Уважаемый автор, а схему Вы не выкладывали? Я только заметил фотографию девайса.
Уважаемый автор, а схему Вы не выкладывали? Я только заметил фотографию девайса.
Да схемы пока как таковой и нет, как раскидаете пины, такой и будет.
Там две альтеры, Z80, 27C512, 2x памяти 4x1Mb DRAM со старых симов, и еще контроллер клавы на атмега8, читалка магнитофона, ч/б композитный выход... еще приделаю 2 эмулятора AY для TS или 2 AY/YM поставлю, как пойдет, контроллер NEMO-IDE или Z-Controller, еще думать буду, ну и может что-то с флоппи, если надумаю.
Как всё отлажу, тогда и схема будет и плата, но до этого еще далеко :)
PS:
dt - шина данных Z80,
a - шина адреса Z80
ma - шина адреса памяти
md - шина данных памяти
/IORQ подключается ко второй альтере, с неё iorq_out_n идет на первую, чтобы дос блокировал порты
/NMI, /BUSREQ, /WAIT на +5в через резисторы
omercury
08.05.2017, 00:26
Вложения
Тип файла: zip SQRUMv06.zip (55.1 Кб, Просмотров: 7)
Память до 14 МГц ещё не разгоняли? :)
if(!res_n)
wr_buf <= 8'bzzzzzzzz;Это лишнее, так как есть
assign dt = ramcsn ? 8'bzzzzzzzz : wr_buf;
Память до 14 МГц ещё не разгоняли? :)
Пока что нет, не совсем понятно как её разгонять, т.е. есть цикл Z8, 2xH0, в нем 4 pixclk, получается, нужно /RAS и /CAS подать за 1 pixclk с частотой 14МГц и потом пользоваться памятью еще 3 pixclk?
Это лишнее, так как есть
согласен, надо будет убрать, но на размер прошивки этот провод сброса вроде не влияет
PS: вот еще для AY сигналы сделал
assign BDIR = ~(a[1] | iorq_out_n | wr_n) & (m1_n & a[15]);
assign BC1 = ~(a[1] | iorq_out_n) & (m1_n & a[14] & a[15]);
Вроде работает
http://savepic.net/9571150.jpg
omercury
08.05.2017, 12:06
Пока что нет, не совсем понятно как её разгонять, т.е. есть цикл Z8, 2xH0, в нем 4 pixclk, получается, нужно /RAS и /CAS подать за 1 pixclk с частотой 14МГц и потом пользоваться памятью еще 3 pixclk?
Для турбирования процессора всё равно понадобится.
Эксель есть? (удалить .zip) Разрисовал времянки (на циклы М2 и М3 внимания не обращайте - там сейчас ахинея полная, строка 30 сейчас тоже неинтересна, актуально до 52 строки, ниже мои хотелки :)) доступа к памяти, магентой обозначил свободные циклы, оптимистические разумеется, ибо цикл Z80 далеко не всегда такой, как нарисовано в начале даташита. Так вот - у меня получается 3 свободных цикла памяти во время М1 при клоке Z80/память 3,5/7 МГц. При турбировании до 7/14 получим дополнительно ещё 2 цикла памяти. Да, диспетчер памяти усложнится, но какие возможности открываются...
Зачем это?
ИМХО, какой смысл делать то, что уже сделано? Смысл имеет то, чего ещё нет, и, между прочим, очень странно, что ещё нет: это лежит на поверхности - бери и пользуйся.
Кстати, добавил Вашу растактовку. Моя теория сошлась с Вашей практикой. :)
Пока что я к этому морально не готов, хочу сначала всю переферию навесить, уже клаву и AY эмуль прицепил обе на Atmega8 :)
Еще с проблемой столкнулся, запустил демку, которая выводит звук по инту и читает регистры AY, возникает фигня на бордюре...
Из-за чего это может быть? Плохая схема видеовыхода или /INT что-то с бордюром делает?
http://savepic.ru/13878098.jpg
Еще на Y что-то фонит... но это думаю можно конденсаторами побороть или правильной разводкой платы или заменой альтеры, может эта основная тоже глючноватая...
UPD: написал читалку SD карты по стандарту Z-Controller, ЩИКАРНА работает!!!
///
///
///// Z-CONTROLLER MODULE -------------------------------------
///// Port #77 - control
///// Port #57 - data in/out with auto clock
reg sd_cs_r = 1;
reg [7:0] port_57_w;
reg [7:0] port_57_r;
reg [3:0] zc_cnt = 8;
wire zc_iorqge = (iorq_n == 0 && m1_n && (a[7:0] == 8'h57 || a[7:0] == 8'h77)); //its O.K. as DOS use port #77 too
wire port_57_sel = iorq_n == 0 && a[7:0] == 8'h57 && m1_n && (DOS == 0 || (DOS==1 && a[15]==0));
wire port_57_rd = rd_n == 0 && port_57_sel;
wire port_57_wr = wr_n == 0 && port_57_sel;
wire port_77_wr = wr_n == 0 && iorq_n == 0 && m1_n && ((DOS == 0 && a[7:0] == 8'h77) || (DOS == 1 && a[7:0] == 8'h57 && a[15]==1));
always @(posedge port_77_wr or negedge res_n)
if(!res_n)
sd_cs_r <= 1;
else
sd_cs_r <= dt[1];
always @(negedge clk or negedge res_n)
if(!res_n)
zc_cnt <= 4'd8;
else if(port_57_sel)
zc_cnt <= 4'b1110;
else if(zc_cnt != 4'd8)
zc_cnt <= zc_cnt + 4'd1;
always @(posedge port_57_wr or negedge clk)
if(port_57_wr)
port_57_w <= dt;
else if(!zc_cnt[3])
port_57_w <= {port_57_w[6:0],1'b1};
always @(posedge clk)
if(!zc_cnt[3])
port_57_r <= {port_57_r[6:0],SD_MISO};
assign dt = port_57_rd ? port_57_r : 8'bzzzzzzzz;
assign SD_CS = sd_cs_r;
assign SD_MOSI = port_57_w[7];
assign SD_SCK = clk & ~zc_cnt[3];
///// END Z-CONTROLLER MODULE ---------------------------------
http://savepic.ru/13835828.jpg
Кстати, решил тут проверить, то что мне советовал omercury
В коде буфера
// ram buffer -----------
reg [7:0] wr_buf = 8'bzzzzzzzz;
wire wrbuf = hcnt[0] & hcnt[1] & pixclk;
assign dt = ramcsn ? 8'bzzzzzzzz : wr_buf;
always @(posedge wrbuf or negedge res_n)
if(!res_n)
wr_buf <= 8'bzzzzzzzz;
else
wr_buf <= md;
Убрал
wr_buf <= 8'bzzzzzzzz;
И пошли сплошные ресеты при загрузке игр :)
PS: кстати, никто не сталкивался с таким багом?
http://savepic.net/9575246.jpg
Помню когда модернизировал кворум у меня он тоже проскакивал, но уже не помню как поборол.
Дримтимовский диззи 5, диззи висит и моргает, всё осталное работает, при старте игры он стоит и мерцает, не ходит по нажатию клавиш, но клавиша выхода и паузы работает нормально.
В месте на скрине он должен начал скакать по экрану, но он не начинает, как будто ему не хватает пинка... :-D
Попробую сейчас другое ПЗУ зашить, может в нем дело... Не помогло, правда поменял только 48 BASIC
Запустил вариант "Евгения Копрова" этот работает... что же в дримтимовском не так?
Нормально работал ZC, правда писал медленно, причем работал только когда я отключал минус питания у эмулятора AY.
Убрал эмулятор, fatall начал писать в RAM диск на порядок быстрее, но после записи на диске ничего нет, то пишет empty, то "No TR-DOS disk"...
Что-то я уже утомился пытаться это исправить... даже не знаю в чем дело... ПЗУ уже все какие можно варианты перепробовал, порты все попереписал... буферы тоже... ничего не помогает... может ему еще какие-то порты нужны и при AY он что-то там находит?
UPD: опытным путем выяснилось, что оно записывается, но не по тому адресу, вот у меня в оглавление диска попало содержимое файла, причем вторая его половина... это значит не в ту страницу пишет походу или рам диск кривой... тогда непонятно, почему с эмулятором AY с отключенным питанием работало нормально...
UPD2: ХА!!! проблема была в /IORQGE!!! :))))))) короче, когда дос нужно блокировать только порт FE, FF и те что конфликтуют с досом! Дизик 5 тоже завелся нормально! И даже порт #FF заработал нормально, короче я всё победил )))
UPD3: блин, этот порт DFFD и AY это просто ядреная смесь, пока что не смог побороть, ну буду пытаться, поэтому отключение земли у эмулятора AY решает проблему кривой записи образа в fatall.....
UPD4: проблема решилась заменой кварца на эмуляторе на 27МГц с 25-и ))) видимо атмега8 не самая лучшая попалась, с 27 тоже глючила, поставил атмегу48 нормальную и сразу всё стало стабильно! :)
PS: кстати, на Z-Controller можно подавать частоту и более 14МГц, тогда фатал будет гораздо быстрее читать, с моим генератором на 155ЛН1 я смог только 16МГц сделать, но наверняка можно и более... если кто проверить - напишите!
Придумал я тут схему адресации ПЗУ, на удивление очень простую, не знаю додумывался ли кто-то еще до такого, её и буду далее реализовывать.
Схема такая, имеем 0 банк ПЗУ в него пишется прошивка.
При активном 0 банке выделяется какой-то порт, например #1FFD или еще какой-то, все его разряды используются для адресации A15-A21 ПЗУ только при активной 0 странице ПЗУ. При переходе в другую страницу данные этого порта сохраняются в регистре и порт отключается.
Адресация 4 страницы происходит так, что она заменяет нулевую.
Вроде как всё очень просто и понятно, выбираем любую страницу после 3 в 4-ую и переключаем 4-х страничные сегменты. Или просто подставлять в нулевую страницу любую после 3-ей на выбор.
UPD: еще столкнулся с проблемой запуска некоторых игр из RAM-диска, видимо TR-DOS придется допиливать, чтобы сохранял состояние портов при смене страниц памяти.
UPD2: перелопатил TR-DOS 5.04T от профи, вроде некоторые из тех что не шли - пошли, загрузка в рам диск просто чума по скорости! Правда когда я там увидел 256 штук LDI идущих подряд, то был слегка в шоке, переделал на LDIR, стало грузиться еще быстрее ))) Переделал рам диск с D на A для удобства. Но вот DARKMAN наотрез отказывается работать, может он там чего использует не из #3D13, кто его знает....
Снял небольшое видео работы с RAM-диском, может кому интересно будет...
https://youtu.be/Yn-Tj4dAlv0
А где цвет? Монитор LCD, значит, через VGA цепляешь, синхра в норме, пропорции в норме. Почему ч/б?
andykarpov
16.05.2017, 22:41
Кстати, поделитесь схемкой, плз, как ч/б синхру делали :).
Да там обычный тюльпан в монитор воткнут.
Чб схема обычная, брайт - 3 диода + 3 резистора и цвета с синхрой через резисторы замешаны, потом на транзистор.
PS: сейчас ТРДОС 5.04T с рамдиском мучаю, уже весь перелопатил почти, нашел столько всяких интересностей в нем )))) например 256 конструкций LDI идущих подряд (переделал на LDIR) или 32 одинаковых блока кода, вот с ними пока что проблема, т.к. они используют все регистры из 2-х наборов, даже хз как туда цикл приделать... но с этим разберусь на досуге...
andykarpov
17.05.2017, 00:51
Чб схема обычная
А поделитесь номиналами резисторов, плз. А то что-то никак на своем велосипеде не могу нормально воспроизвести ч/б картинку, то слишком темная, то синхронизация срывается, то еще что-то...
omercury
17.05.2017, 01:29
нашел столько всяких интересностей в нем )))) например 256 конструкций LDI идущих подряд (переделал на LDIR)
Это называется развёрнутый цикл.
Применяется когда жизненно критично быстродействие, а на размер кода наплевать. Когда идёт битва за каждый такт.
Например на Ваших любимых АВР сформировать программно энное количество циклов меандра с частотой выше Fosc/8 невозможно, а развёрнутым циклом легко делается Fosc/2.
А поделитесь номиналами резисторов, плз. А то что-то никак на своем велосипеде не могу нормально воспроизвести ч/б картинку, то слишком темная, то синхронизация срывается, то еще что-то...
http://savepic.net/9629505.jpg
Это называется развёрнутый цикл.
Применяется когда жизненно критично быстродействие, а на размер кода наплевать. Когда идёт битва за каждый такт.
Например на Ваших любимых АВР сформировать программно энное количество циклов меандра с частотой выше Fosc/8 невозможно, а развёрнутым циклом легко делается Fosc/2.
Так LDIR же делает абсолютно то же самое что и несколько LDI идущих подряд
omercury
17.05.2017, 01:43
Так LDIR же делает абсолютно то же самое что и несколько LDI идущих подряд
LDI это делает всегда за 16 тактов генератора, а LDIR все циклы выполняет за 21 такт и только последний цикл (при BC=0) выполняется 16 тактов.
LDI это делает всегда за 16 тактов генератора, а LDIR все циклы выполняет за 21 такт и только последний цикл (при BC=0) выполняется 16 тактов.
Да, согласен, он еще PC на 2 уменьшает... т.е. 255*5 = 1275 t-states разница на сектор...
А проц точно не турбированый ? Что то у меня в 2 раза медленней работает...
А проц точно не турбированый ? Что то у меня в 2 раза медленней работает...
Нет, турбирование пока что не делал, может у вас трдос другой? Если под профи, то могу поделиться. Плюс у меня Z-Controller тактируется от 16МГц вместо 14.
PS: добавлю сюда, память понимает только по стандарту ПРОФИ 1024 !!! т.е. порт #DFFD
PS2: второй вариант с 256 LDI
PS3: есть небольшая проблемка с выводом LIST на диске D, видимо что-то еще осталось от RAM диска там :)
PS4: обновил второй файл, поправил команду LIST для кривых дисков с длинным тайтлом
PS5: 3 дня ..бал себе мозг, поправил этот жуткий *****код, освободилось 2КБ в прошивке, скорость не уменьшилась, а может и выросла даже :)
PS6: обновил TR-DOS, сделал частично эмуляцию ВГ93 для RAM диска, частично пошло то, что раньше не запускалось, но не всё... еще буду над этим работать в ближайшее время, так что аппаратная часть временно заморожена. Так же выкладываю последний вариант исходников на Verilog HDL и полную прошивку с Fatall
Trdos другой, можете своим поделиться? У меня DIVGMX, к реалу подключен, проверить минута делов
omercury
12.06.2017, 14:04
И, первый результат :-D
У мну тоже первый.)))
Сегодня обнаружил на экране заветную надпись!
Слил прошивку со своего Ленина - оказалось, что ещё не протухла.
Надо клаву приделывать и дальше пробовать.
На данный момент типа Ленинград 48:
Проц - T80 (корка)@3,5МНц
Оперативка - статика 512к
ПЗУ - корка на 16к
Экран - дублирующий двухпортовый буфер на 8к (корка), вывод изображения 1024х768@50Гц - пиксельклок 56МГц, окно вывода 768х576 (тройное дублирование), остальное бордюр.
...пока больше ничего... :)
upd
PS2 клаву-то я прицепил, это несложно. Намного сложнее определить, какая кнопка чему соответствует. ;)
VGA эт интересно :) а то я пока не решусь с чего начать :)
Для первого результата очень не плохо, но нужно теперь синхронизировать память и видео, а то видно смещение.
С клавой, чего там знать, J-LOAD, S-SAVE, R-RUN, Y-RETURN, T-RANDOMIZE, "E"-L - USR :-D
PS: и чего все статику ставят...
omercury
12.06.2017, 17:13
VGA эт интересноXGA
а то я пока не решусь с чего начатьДа тут как бы без вариантов - у мну нет подходящего телика, а VGA несерьёзно. ZX-Kit (адаптированный, разумеется, цеплял, но как-то криво работает, да и VGA опять же.
и чего все статику ставят...
Потому, что с ней проще)))
Сейчас буду переносить на эту плату (https://ru.aliexpress.com/item/gold-official-store-ALTERA-development-board-FPGA-learning-board-NIOS-EP4CE6-Student-Edition/32790435643.html?spm=2114.13010608.0.0.YUjGz0) и придётся заюзать SDRAM.:)
Динамичку попозже вот к такой (https://ru.aliexpress.com/item/Free-Shipping-1pcs-lot-ALTERA-FPGA-CycloneII-EP2C5T144-minimum-system-development-board-learning-board/1617704540.html?spm=2114.13010308.0.0.UYMCNv) зацеплю.
LeoN65816
12.06.2017, 20:10
вывод изображения 1024х768@50Гц - пиксельклок 56МГц, окно вывода 768х576 (тройное дублирование), остальное бордюр.
1. А полный растр какой?
2. Какой монитор этим не давится? (вижу что IBM, вижу что ThinkVision, а какая модель?)
omercury
13.06.2017, 00:30
1. 1350 тиков 56МГц по горизонтали на 828 строк. Активная часть 1024х768, 43+256+42 х 32+192+32 тройных точки.
2. Он не давится и более высокой частотой, а вот с более низкой беда - контроллер монитора обрубает, хотя сама матрица будет работать и на 30 герцах.
а какая модель?
IBM ThinkVision 6636-AC2 (https://www.cnet.com/products/ibm-thinkvision-l150-lcd-monitor-15-series/specs/) 2005 года выпуска.
Кстати, SDRAM работает, спасибо Владу за корку (стянул из ReVerSe-16) :)
- - - Добавлено - - -
Ну вот, 14МГц @ 32Мбайта оперативки. и что теперь с этим делать? О_о
На какие порты расширять? ;)
ЗЫ
Сюда не влазит, на я-диске (https://yadi.sk/d/ethQz9uD3K4Vmn).
Пока как-то так))
Сейчас буду переносить на эту плату (https://ru.aliexpress.com/item/gold-official-store-ALTERA-development-board-FPGA-learning-board-NIOS-EP4CE6-Student-Edition/32790435643.html?spm=2114.13010608.0.0.YUjGz0) и придётся заюзать SDRAM.:)
PS/2 там нет на борту?
omercury
14.06.2017, 00:38
PS/2 там нет на борту?
Пожалуй единственное, чего там, увы, нет.
Часики, micro-SD, 256Мбит SDRAM, IIC-EEPROM, USART, 16bit VGA, пищалка, кнопочки/светики, 84 свободных IO, и даже ненужный 6-разрядный семисегментник есть (и всё это на отдельных пинах висит), а вот клаву напрямую воткнуть некуда.
solegstar
15.06.2017, 08:47
я сделал клавиатуру только в режиме чтения, так что она только сканкоды читает, поэтому гораздо меньше занимает места.
Примерно 60 макроячеек получилось.
а я, с позволения автора, решил попробовать внедрить измененный модуль клавиатуры в верхнюю плату профи 5.06, чтобы использовать вместо меги. место в ней еще есть (примерно 350 макроячеек) и довольно заманчиво показалось вставить модуль в неё, и возможно еще добавить мышь с часиками, но каково было мое разочарование, когда на EPM570T144C5 (MAX II) квартус показал в 2,5 раза больший обьем занятых макроячеек. сделал для проверки точного количества разницы в макроячейках проект, и получилось 217 (MAX II) против 82 (MAX3000A). не думал, что так сильно отличаются макроячейки в этих сериях. может кто подскажет еще варианты оптимизации модуля? проект прилагаю.
PS: на реале пока не проверял, но работать должен. выдрал вроде коррекно, хотя в Verilog я не силен совсем.
omercury
16.06.2017, 01:47
Макс2 уже больше под синхронные схемы рассчитан, а в старом Максе комбинаторики больше. Проект-то - сплошной дешифратор.
Забавно, но t80 в древнем Максе занял бы почти в полтора раза меньше места, чем в Циклоне-1 (1648 против 2411 макро) именно по этой причине.
еще варианты оптимизации модуля
Хотел напомнить про UFM, но она только с последовательным доступом, да ещё и на I2C шине. :) не успеет
Можно ещё в приёмнике пошаманить, сделав сдвиг вместо дешифратора, но большого выигрыша это не даст, может ячейку-другую, и то не факт.
Ну и, как вариант, воткнуть вместо Меги какую-нибудь восьминожку без безумного разгона, а в ПЛИС оставить только массив скоростных буферных регистров с простейшим дешифратором.
andykarpov
19.08.2017, 11:33
Хотел у автора спросить, как дела с проектом? Будет ли схема / плата, если да - то под какой форм-фактор ? :)
Проект очень интересный!
Планирую продолжить в сентябре, сейчас пока нет времени.
В планах
1) сделать VGA выход или попробовать генерировать PAL альтерой с ЦАП на резисторах
2) сделать контроллер TR-DOS или на ВГ или на микроконтроллере
3) сделать поддержку нескольких видеорежимов
4) сделать некоторое подобие BIOS с настройками
5) NEMO IDE
6) наверное RAM-DISK уберу, что-то он мне не нравится :)
ну, и, может еще что-то придумаю
PS: как закончу, конечно всё будет, и схема и плата, когда буду разводить, думаю понадобится помощь, т.к. в электронике я не профи, может где-то конденсаторы, индуктивности и т.д. нужно будет добавить
PS2: последнее время я больше склоняюсь к EPM3256ATC144, что-то уже 2 продавца у которых я их покупал задешево (они пришли, всё ок) куда-то пропали с али :-D странно как-то это всё... но еще есть возможность по 200р урвать https://ru.aliexpress.com/item/EPM3256ATC144-10N-EPM3256ATC144-10-New-original-5PCS-lot-Free-Shipping/1989679826.html
omercury
19.08.2017, 19:47
еще есть возможность
рублей на 50 дешевле
https://ru.aliexpress.com/item/10pcs-EPM3256ATC144-10N-EPM3256ATC144-10-EPM3256ATC144-New-Shelf-life-of-one-year/32794664921.html?ws_ab_test=searchweb0_0,searchweb 201602_2_10152_10065_10151_10068_10209_5430020_103 07_10301_10137_10060_439_10155_10154_5370011_10056 _10055_10054_10059_100031_10099_5400020_5410011_10 103_10102_10169_10052_10053_10142_10107_10050_1005 1_5380020_10326_10084_10083_10080_10082_10081_1011 0_10111_5420020_10112_5390011_10113_10114_10311_10 312_10313_10314_10315_10078_10079_10210_10073_1012 5,searchweb201603_19,ppcSwitch_5&btsid=dd7c751b-b1ee-4542-8aa1-630386f48be9&algo_expid=506e766d-bd05-43c1-999b-d35cd739d33d-0&algo_pvid=506e766d-bd05-43c1-999b-d35cd739d33d&transAbTest=ae803_2
Кстати, брал у них оперативку (https://ru.aliexpress.com/item/10PCS-Free-shipping-K6R4008V1D-KC08-K6R4008V1D-KI08-K6R4008V1D-NEW/32754961608.html), пришло вместо десятка 12 штук из разных партий, 10 наносекундные, пара индустриальных, остальные бытовые, в каком-то налёте с подогнутыми ножками, хотя и в пластиковой тубе, но, как ни странно, рабочие.
странно как-то это всё... Дык устаревшие уже.
Хотя бы MAXII.
А так циклоны дешевле...
https://ru.aliexpress.com/item/in-stock-can-pay-EM2860-EP1C3T100C8N-EPF011A-EPF6016QC208-3-5pcs-lot/32805812386.html?spm=a2g0v.10010108.1000016.1.38f7 f731XGQt1R&isOrigTitle=true
https://ru.aliexpress.com/item/Send-free-5PCS-EP1C3T100C8N-EP1C3T100-LQFP100/32651578550.html?spm=a2g0s.9042311.0.0.w7PL5J
Упс, по второй ссылке уже нет.
https://ru.aliexpress.com/item/EP1C3T144C8N-5PCS-INTEGRATE-CIRCUIT-ELECTRONIC-PARTS-NEW-QFP-144-ALTERA-EP1C3T144/32800028415.html?ws_ab_test=searchweb0_0,searchweb 201602_2_10152_10065_10151_10068_10209_5430020_103 07_10301_10137_10060_439_10155_10154_5370011_10056 _10055_10054_10059_100031_10099_5400020_5410011_10 103_10102_10169_10052_10053_10142_10107_10050_1005 1_5380020_10326_10084_10083_10080_10082_10081_1011 0_10111_5420020_10112_5390011_10113_10114_10311_10 312_10313_10314_10315_10078_10079_10210_10073_1012 5,searchweb201603_19,ppcSwitch_5&btsid=cd8a801f-8f27-4a75-af88-876247fc046b&algo_expid=0b2184fc-9f40-4126-9559-02168a5f510d-1&algo_pvid=0b2184fc-9f40-4126-9559-02168a5f510d&transAbTest=ae803_2
Чтобы сильно пока что не скучали, снял небольшое видео
https://youtu.be/Mm8EafI5dg8
Кстати, вместо AY стоит эмулятор на Atmega48 версия 24.7, а PS/2 клавиатура подключена к Atmega8 :-P
Шиноби завис из-за того что запущен с рам диска :)
Решил я, так сказать, тряхнуть стариной и переделать прозрачный доступ к памяти как положено, и вот в итоге что у меня получилось.
Мне кажется это выглядит идеально!
https://cdn1.savepice.ru/uploads/2018/2/18/f2f0203e504ad5c5e4cb95204d2b0718-full.png
PS: забыл уточнить, процессор клокается сигналом /RAS
HardWareMan
18.02.2018, 16:26
EvgenRU, поздравляю! Ты получил Ленина.
Я пробовал конечно сдвинуть цикл ATTRS на место CPU, чтобы сэкономить 2 макроячейки, но что-то не выходит, видимо особенность работы процессора :(
UPD: кстати, у ленина пиксели и атрибуты берутся наоборот когда H1=1 и WRBUF, /WE другие
UPD2: попробовал брать пиксели и атрибуты за 1 цикл процессора - всё отлично выходит, но т.к. у меня он тактируется от /RAS, то процессор не заработал в этот момент, но картинка нормальная :)
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot