Войти
ФлеймФорумПроЭкты

❌80: Тёплый ламповый (18 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 114 15 16 17 18 19 Следующая »
#255
(Правка: 22:29) 22:28, 11 окт. 2019

Оказываeтся, регистровый файл - барахло!
Весь вечер сегодня его перерисовывал…

Основная сложность в том, что он четырёхпортовой.
А в силу особенностей x80, там много своих нюансов.
Например, так как x80 задумывается как мультизадачный, регистровый файл должен переключаться мгновенно между 128 процессами.
Получается, что файл должен представляться не 256 регистрами, а целыми ОЗУ.

+ Показать

Теперь здесь вместо регистров - память на 128 байтов.
Заполнить все 256 ячеек не позволяют ограничения LogiSim. Потому, в схеме только необходимые ячейки.
Тем самым, добавлен порт Task для выбора активной задачи.
А также и Flags выведен отдельно, чтобы читать состояние процессора непосредственно.
Но для изменения флагов потребуются отдельные операции. Тем самым, арифметика x80 будет "дороже", чем ожидалось.


#256
22:32, 11 окт. 2019

Alikberov
> Eсли я не ошибаюсь, то в FPGA триггеры - не совсем триггеры.
ага, триггеры не триггеры, регистры не регистры.

> Это видно уже из листингов, в которых из разных частей листинга можно легко
> перегружать значение какого-то регистра.
это было симулируемое подмножество верилога. симулируемое блеать, а не синтезируемое.

> Поэтому, сам Verilog - либо для слабо понимающих нюансы схемотехники студентов,
> либо для инженеров,
на основе тупых предпосылок - не менее тупые выводы.

> Вы предлагаете поднатужиться в Verilog и поскорее залить в ближайший FPGA, не
> заморачиваясь на всякой чепухе.
вот так вот взяли и залили, ага. заморочек столько, что для некоторых даже просто светодиодиком поморгать - ипать какое достижение будет.

> А мне интересно, чтобы я лично мог бы ответить за каждый транзистор на
> кристалле, если бы представилась возможность изготовить чип за заслуги перед
> Отечеством! %-D
времена ручной трасировки i4004 давно прошли. сейчас фабрики оптимизируют библиотеки под свои техпроцессы и большая часть логики собирается синтезатором из мелких субмодулей. шаловливые ручки "особо умных" инженеров никто туда не подпустит.

прежде чем добираться до кастомных микросхем, стоит для начала таки освоить FPGA. и именно на Verilog (ну или на VHDL, если хочется больше упоротости). схематику в плисоводстве не уважают от слова совсем.
LogiSim - оставьте для слабо понимающих нюансы схемотехники студентов

#257
(Правка: 14 окт. 2019, 1:05) 10:52, 13 окт. 2019

Прыгaю между прожектами…
Если неделями раньше здесь занимался WebGL, то после застревания там переключился сюда.
Теперь - застрял и тут…

Здесь я отметил, что реализация чтения/записи стека - кривая.
Оказывается, почему-то, ни в самом Verilog я тогда не смог решить эту проблему, ни графически в LogiSim реализовать это не могу.
(Замечу, что LogiSim я скачал примерно год назад, а Icarus Verilog изучаю лет 5…)

Вот не поддаётся мне узел длинного обмена с памятью ни строгим описанием логики, ни графическим!
То есть, чего-то я не понимаю на уровне логики в этих циклах.

А причём здесь WebGL?
Про него я давно читал и изучал, но заняться решил недавно, так как не всё там понимал. А пока я не понимаю задачу прилично, я не могу написать ни строчки.

Читалку команд x80 я вылизал достаточно, чтобы повторить её и в Verilog, и в LogiSim, и в ТТЛ.
А вот сам узел обмена с памятью не поддаётся!
Вот в этом вся проблема.

+ Исходники LogiSim и видео

Уже из видео видно, что очень большой бардак разводит узел управления памятью.
Здесь в строчках 42…98 тоже это видно давно:
+ Показать
Этот фрагмент писался тогда методом тыка, проб и ошибок.
(Настаиваю на том, что вы предвзято меня критикуете за зацикленность на LogiSim: Задачу управления памятью я не решил тогда в Verilog, не могу и скачав Logisim!
Схемы в LogiSim - не цель, а средство визуально понять логику проблемы.
Так как из графиков Icarus Verilog я тогда не смог понять проблему. А изучение файлов z80 не помогло понять суть работы контроллера шин.)

P.S.: Как раннее уже писал, что огромной схемой испытываю «читалку»…
Читалка - работает. А логику чтения данных из памяти и записи в память - не понимаю.

#258
7:17, 15 окт. 2019

Корочe, хорошенько обдумал детали и набросал вот это:
Контроллер шины данных | ❌80: Тёплый ламповый
Протестил - работает как и задумал.
Перевёл в Verilog:

module	x80_bus_io(CLOCK, WAIT, LOAD, SAVE, READ, WRITE, STROBE);
	input	wire		CLOCK;	// Clock
	input	wire		WAIT;	// Wait
	input	wire		LOAD;	// Load data from memory
	input	wire		SAVE;	// Save data to memory
	output	reg		READ;	// Request for data
	output	reg		WRITE;	// Strobe for write
	output	reg		STROBE;	// Bus operation complete
	output	reg		READY;	// Release the bus
	//////////////////////////////////
	always @(negedge CLOCK)
	begin
		STROBE = ~WAIT & ~STROBE;
		if(STROBE)
			READY = 1'b0;
	end
	//////////////////////////////////
	always @(posedge CLOCK)
	begin
		if(STROBE)
		begin
			READ = 1'b0;
			WRITE = 1'b0;
			READY = 1'b1;
		end else begin
			READ = LOAD;
			WRITE = SAVE;
		end
	end
endmodule
Завтра буду тестить.
Что-то мне подсказывает, что где-то в листинге ошибка.

#259
11:11, 15 окт. 2019

Alikberov

Попробуй избавиться от одновременного использования posedge/negedge внутри одного модуля (не все синтезаторы такое переваривают).  И используй неблокирующее присваивание <= вместо  блокирующего =, чтобы не получить гонки сигналов и паранорамальное поведение устройства.

#260
12:57, 15 окт. 2019

0iStalker
> использования posedge/negedge внутри одного модуля (не все синтезаторы такое
> переваривают).
это совершенно не проблема. вот совсем. жрут это все.

основная проблема - READY устанавливается в разных блоках always. причём описание на верилоге не соотвествует схеме в этом месте.

теперь, если глядеть только на схему, то она плохо ляжет на FPGA в двух местах: а) тактирование READY идёт не с глобального клока, а с комбинаторной логики. б) клок не только тактирует регистры, но и уходит к комбинаторную логику (на элемент &)

я не говорю, что оно не заработает вообще. просто переход клока на обычные линии и обратно в разных сериях плис - ебанутая коммутация внутрях и большие задержки. ну и всякие там анализаторы таймингов потом будут орать.

#261
(Правка: 16 окт. 2019, 0:36) 20:00, 15 окт. 2019

0iStalker
> Попробуй избавиться от одновременного использования posedge/negedge
> внутри одного модуля (не все синтезаторы такое переваривают).
По-моeму ограничения накладываются только на срабатывание одного и того же триггера и по фронту, и по срезу.
У меня по фронту срабатывают триггеры Read и Write, а на срезе - только Strobe.
Или я совсем ничего не понимаю?
(Это вопрос, а не сарказм.)
> И используй неблокирующее присваивание <= вместо блокирующего =
Опять я перепутал…
Mahagam
> основная проблема - READY устанавливается в разных блоках always.
А разве у D-триггеров (например, у 155ТМ2) есть ограничения на асинхронные R/S-входы?
Я понимаю, что в FPGA свои нюансы. Но асинхронные сброс/установка триггеров есть везде. Или нет?
> причём описание на верилоге не соотвествует схеме в этом месте.
Это я уже понял, так как под утро голова совсем уже не работала.
> б) клок не только тактирует регистры,
> но и уходит к комбинаторную логику (на элемент &)
А вот здесь я совсем в ступоре.
Как я от него избавлюсь, если это разрушит всю мою логику?



После перерисовки (да, в LogiSim) схемы (иначе не умею) и её проверки, получилось вот что:
Контроллер шины данных | ❌80: Тёплый ламповый
Переписал модуль:
module	x80_bus_io(CLOCK, WAIT, LOAD, SAVE, READ, WRITE, STROBE);
	input	wire		CLOCK;	// Clock
	input	wire		WAIT;	// Wait from slow device
	input	wire		LOAD;	// Load data from memory
	input	wire		SAVE;	// Save data to memory
	output	reg		READ;	// Request for data
	output	reg		WRITE;	// Strobe for write
	output	reg		STROBE;	// Bus operation complete
	output	reg		READY;	// Release the bus, increment the ADDRESS
	//////////////////////////////////
	always @(negedge CLOCK)
	begin
		STROBE <= ~(WAIT | STROBE);
	end
	//////////////////////////////////
	always @(posedge CLOCK)
	begin
		READ <= ~STROBE & LOAD;
		WRITE <= ~STROBE & SAVE;
		READY <= STROBE & (READ | WRITE);
	end
endmodule

Надеюсь, теперь всё верно.

Вопрос:
Нормально ли, что сам выход Strobe тактирует «читалку команд»?
Или тактировать один модуль от другого - нормально?
Иначе у меня вся логика летит в тартарары и придётся удваивать все циклы…

P.S: Спасибо за помощь!

#262
23:44, 15 окт. 2019

в логисиме все триггеры одинаковые, сфигли он по negedge`у тактируется?

Alikberov
> Но асинхронные сброс/установка триггеров есть везде. Или нет?
есть везде. но в твоей схеме на верилоге - они синхронные. и в любом случае все сигналы должны быть обработаны под одним always.

#263
(Правка: 21:35) 0:04, 16 окт. 2019

Mahagam
> в логисиме все триггеры одинаковые, сфигли он по negedge`у тактируется?
Тaм в опциях элемента выбор из четырёх: Два - на триггер-защёлку, и два - на фронт/срез.

Не знал, что так много онлайн-симуляторов появилось.
Кстати, вот Онлайн симуляция в falstad, в simulator.io

Удобно тем, что интерактивно можно прямо в форум ставить, как вот это на CircuitVerse.

P.S.: Сколько суток ушло на разработку этой лабуды о четырёх триггерах…
Во сне чуть ли ни снится!

#264
(Правка: 17 окт. 2019, 1:47) 14:35, 16 окт. 2019

Нa свежую голову иначе соображается.
За пределы этих четырёх триггеров опять выйти не могу, так как меня не устраивает весь этот реальный «светофор»…

А именно, почему инкремент адреса тактируется ИЛИ-НЕ элементом?
Триггер «Ready» наверное тоже нужно переместить в negedge… Но не получается.
(Надеюсь, CircuitVerse embed здесь отображается не только у меня…)

Так…

  1. Srobe тактирует саму «Читалку команд» - блок регистрации инструкций IB-IC-ID, который на схеме символизирует регистр Data.
  2. Вход Wait работает в режиме «Turbo» и если на нём какие-то помехи были до срабатывания триггера Strobe, то они игнорируются! Тем самым, нужно ввести дополнительный контакт «Turbo/Normal», чтобы управлять процессом выборки данных, а вход Wait пропустить через RS-триггер, чтобы никакая помеха по Wait не могла быть пропущена!
  3. Переделать «Читалку» под тактирование от общего источника тактов. На самом деле, оказывается, это легко, так как регистры IC-ID там 9-битные, так как девятый бит является флажком и устанавливается в «1», если регистр заполнен. Тем самым, сигнал Strobe отсюда должен просто управлять тем флажком…

Сейчас вновь буду ковырять многострадальную Читалку…

#265
2:00, 17 окт. 2019

Схему узла в LogiSim подправил и протестил всей схемы дизассемблера.
Контроллер шины данных | ❌80: Тёплый ламповый

module	x80_bus_io(CLOCK, WAIT, LOAD, SAVE, READ, WRITE, STROBE, READY, HOLLOW);
	input	wire		CLOCK;	// Clock
	input	wire		WAIT;	// Wait from slow device
	input	wire		LOAD;	// Load data from memory
	input	wire		SAVE;	// Save data to memory
	output	reg		READ;	// Request for data
	output	reg		WRITE;	// Strobe for write
	output	reg		STROBE;	// Bus operation complete
	output	reg		READY;	// Release the bus, increment the ADDRESS
	output	reg		HOLLOW;	// Hollow (wrong) operation
	//////////////////////////////////
	always @(negedge CLOCK)
	begin
		if(READ | WRITE)
			// Здесь добавил вход WAIT, так как на диаграмме наблюдались "иглы"
			HOLLOW <= ~STROBE & !WAIT;
		STROBE <= ~STROBE & HOLLOW;
	end
	//////////////////////////////////
	always @(posedge CLOCK)
	begin
		READ <= ~STROBE & LOAD;
		WRITE <= ~STROBE & SAVE;
		READY <= STROBE & (READ | WRITE);
	end
	//////////////////////////////////
	always @(WAIT)
		HOLLOW = 1'b0;	// Здесь необходимо ли блокирующее присваивание?
endmodule
edaplayground
+ GTKWave Диаграмма (Hollow сбоил)

В CircuitVerse обновил схемку.
CircuitVerse:

+ Показать

Теперь генератор шума подтормаживает циклы обмена с памятью. Кнопкой Wait можно принудительно приостановить циклы.
(Вентиль «sync» абстрактно стробирует счётчик адреса, так как онлайн у счётчиков нету входа разрешения счёта…)
Все элементы входные заменены на И.
Но вся схема (в LogiSim) теперь не имеет узлов с промежуточным тактированием.
Всё работает в такт одному задающему генератору.
(Но ведь в тех же «Орион-128» и «Специалист» синхрогенераторы вывода на экран были на асинхронных ИЕ5. Никто же не умер… :D

Спасибо за ваши замечания и критику.
Без этого я не так хорошо стараюсь (почему-то)…

P.S.: Как видите, выспавшись, оказывается, в схеме много багов можно найти.

#266
14:08, 17 окт. 2019

Alikberov
> или же это я в Verilog где-то накосячил - пока не понимаю?
накосячил. hollow устанавливается в двух местах. это значит что описание несинтезиуемое.

#267
(Правка: 2:07) 2:01, 18 окт. 2019

Никaкими средствами не удалось добиться желаемого (ожидаемого с моей стороны) поведения.

В итоге стал вчитываться в мануалы по i8080/z80 и понял, что я - переусердствовал.
Нормальный вход Wait требует некоторой выдержки и подтверждения со стороны процессора.
А в моём дизайне он превратился в защиту от помех!
В #261 схема была верной, но я с чего-то в #264 решил, что вход Wait работает в режиме «Turbo»!
Из-за чего исковеркал всю логику этого узла и убил двое суток на извращение всего этого дела!

Вход Wait решил проверить не паранормальными помехами от рандомизатора, а совсем утилитарным способом: Задержка на время побитовой передачи данных из ОЗУ в процессор через сдвиговый-накопительный регистры.

+ Показать

На видео вроде бы всё нормально, но на 44 секунде по адресу 001C код FF каким-то боком приобретает префикс 6 и фиксируется на префиксе 7, из-за чего вместо инструкции «RET» получается «RET 7», а затем и код FE приобретает префикс 6, тем самым из обычной «NOP» превращается в «NOP 6», которая специально не описана и падает в исключение «Reserved»…

Гордость месяца работы и отладки - «Читалка инструкций» дала сбой в таком пикантном сочетании с дурацким контроллером шины в циклах ожидания!
С помощью видео я поймал этот момент, чтобы в симуляторе не возиться с циклами…
Это говорит о том, что как мнимый инженер своего же CISC я вообще никуда не гожусь.
И придётся снова ковырять несчастную читалку.

P.S.: Читаю две книги - Девида Харриса про архитектуру, а так же и Краткий курс по Verilog…
Мониторов не хватает: Запарился скакать по окнам.

#268
12:27, 18 окт. 2019

Alikberov
> С помощью видео я поймал этот момент, чтобы в симуляторе не возиться с циклами…
вот, блеать, потому и нормальные люди пользуются верилогом и симуляторами, чтобы не писать видео, и не смотреть его часами.
а ну как ошибка проявится через миллион тактов? чо, смотреть двадцатичасовое видео в надежде не пропустить момент?
а на waveform`е можно поиском найти кривое значение, и по предыдущим значениям всех сигналов понять, где косяк. а чтобы сигналы были понятными, их следует называть соответствующе.

#269
(Правка: 23:37) 1:15, 20 окт. 2019

Сегoдня основательно поработал над переводом схемы в листинг.
Здесь итоговый вариант.
Yosys говорит, что всё в порядке, но svg отказывается выдавать.
Icarus выдаёт результат симуляции.

В сравнении с листингом годовалой давности, этот получился более аккуратным.
Правда, если LogiSim схемы я вылизал, как мог. То здесь не знаю, как оттестировать.
Вы правильно заметили, что смотреть на мерцание схемы можно часами с миллионами тактов.
А здесь лог из сотни строчек - уже напрягает!
А assert'ы я никогда и нигде не использовал.
Тем более, в Verilog, где свои особенности.

И кривое значение не всегда известно - какое?
Да и в схемах чувствуется свобода от "пространства имён", которое частенько напрягает, что даёт возможность расслабиться. Просто, тянешь провод от одного элемента к другому и не паришься, какие имя/фамилию ему дать!
Это как в ассемблере: Не знаешь, какое имя дать тысячной долбаной метке.

P.S.: По теме моего асинхронного АЛУ наткнулся на подобную тему с намёком, как лучше его организовать.
А так же открыл директиву $stop, которую в книгах я толком и не встречал.
(Verilog как-то плохо документирован.)

Страницы: 114 15 16 17 18 19 Следующая »
ФлеймФорумПроЭкты