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

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

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

Страницы: 114 15 16 17 18 19 Следующая »
#240
(Правка: 1:15) 1:14, 8 окт. 2019

}:+()___ [Smile]
> Примерно так и появился верилог со товарищи.
Курaж в том, что схемой ты видишь аппаратно всё, что можно на коленке спаять с ТТЛ.
Как раз я этого и добиваюсь, чтобы схема была максимально прозрачна для понимания и сборки.

+ Анимацию обновил

Можете видеть добавленный слева АЛУ, который выполняет ADD,ADC,SUB,SBB,AND,OR,XOR,SAR,RCL,RCR,ROL,ROR.
Внизу под АЛУ размещён флаговый регистр и мультиплексор истинности для условных переходов.
Голубым эллипсом выделен флаг CF.

Программа выполняется с ОЗУ и в конце прыгает по адресу E код B8-F6 на адрес 6.
Когда я в регистр CF ввожу единичку, начинает работать код BC-FC по адресу C и прыгает на адрес A.

P.S.: В общем, моя x80-машина начинает работать по задуманному плану именно схемой.
К сожалению, используется микрокод и RISC-машина, которая занимает всю левую половину.
Хотя x80 задумывался как CISC.


#241
(Правка: 9:02) 8:55, 8 окт. 2019

Alikberov
> Курaж в том, что схемой ты видишь аппаратно всё

Не видишь.

Alikberov
> на коленке спаять с ТТЛ.

Паять TTL это долго, дорого и с низкими шансами на успех.  Более того, твой логический симулятор не учитывает временные задержки распространения сигналов,  а это чревато тем, что отдельные части "процессора"  пойдут вразнос и на дискретной логике работать не будут (вернее, тактовая частота, при которой возможна работа, будет ниже плинтуса).  Не, ну серьёзно,  FPGA матрица на 9к  логических элементов  обойдётся в 5$, набор микросхем 74й TTL логики, по цене - космос, а более дешёвые CMOS - довольно капризные.  И учитывай, что Verilog/VHDL позволяет проектировать довольно с низкого уровня, и он таки не язык программирования, а язык описания (как HTML, кстати) с модульным подходом... например можно запроектировать  RS триггер

module TRIGRS(input SET, input RES, reg Q, reg Qn);

reg state;

always @*
begin
RSprim rslogic(SET, RES, state);
end

assign Q = state;
assign Qn = ~state;
endmodule

primitive RSprim( S,  R,  Q); 
output Q;
input S, R;
table
0 0 : -;
0 1 : 0;
1 0 : 1;
1 1 : -;
endtable
endprimitive

И вот это вот, в разы нагляднее, чем схема с кучей линий (которые ещё надо отследить взглядом какая куда ведёт).

Изображение

Текст, почти всегда лучше рисунка/схемы из-за удобства работы с ним.

#242
(Правка: 11:21) 10:49, 8 окт. 2019

0iStalker
> Не, ну серьёзно,  FPGA матрица на 9к  логических элементов  обойдётся в 5$,
> набор микросхем 74й TTL логики, по цене - космос, а более дешёвые CMOS -
> довольно капризные.  И учитывай, что Verilog/VHDL позволяет проектировать
> довольно с низкого уровня, и он таки не язык программирования, а язык описания
> (как HTML, кстати) с модульным подходом...
Вoт не раз здесь на форуме я говорил, что Бейсик я осваивал самостоятельно почти год, так как не мог разобраться с gosub-return и мучался с goto. И как-то в один день я понял, как работает for-to-next и gosub-return. Хотя входной порог в Бейсик по школьной программе - порядка четырёх часов! У меня же в самостоятельном досуге - почти год.
Хотя до этого я уже владел основами цифровой схемотехники, разбирался в простых цифровых узлах и сам мог проектировать свистелки-мигалки собственного дизайна.
То есть, электронику освоил раньше, чем научился в Бейсик.
Это при том, что ассемблер и машинный код я освоил почти одновременно с Бейсиком. То есть, как по щелчку пальца, раз - и вошёл в программирование.

В электронике берёшь цифровой щуп и тычешь куда хочешь, чтобы узнать уровень или меандр.
А в программе эту слежку надо описать и перехватить.
В LogiSim в любой момент симуляции можно всё остановить и проверить, изменить значения регистров/ОЗУ и перекинуть провод. Тогда как в Verilog всё исполняется как в шкатулке и толком не видно, что где когда переключалось и в каком моменте где что подвело. На выходе - сухой график. Нельзя как в Си/JS поставить ловушку на строчку и проманипулировать там значениями переменных. И сложно очень, глядя на график, наложить все эти меандры на логику. Ментально у меня не получается!

Выше я уже говорил, что схему из LogiSim буду по кускам переносить в Verilog-модули.
В LogiSim я отлаживаю. Вот в чём дело.
Или существуют бесплатные Verilog-студии с такими (отладочными) функциями?
(Пользуюсь Icarus Verilog)

P.S.: Это я к тому, что на схему я смотрю как электронщик, а не программист.
Хотя в большинстве случаев всё наоборот: Программист пытается въехать в паутину вентилей и синхронизации.
И в Verilog я ловлю себя на том, что выражение пытаюсь представить ТТЛ-логикой и это меня ступорит.
Схемой - мне легче. По крайней мере, на данный период. Так как в Verilog до сих пор путаюсь с присваиванием.
Раньше думал, что с Verilog быстро освоюсь, так как с ТТЛ много возился. Однако, оказывается, путаюсь вдоль и поперёк.

#243
11:57, 8 окт. 2019

Alikberov
> В LogiSim в любой момент симуляции можно всё остановить и проверить, изменить
> значения регистров/ОЗУ и перекинуть провод. Тогда как в Verilog всё исполняется
> как в шкатулке и толком не видно, что где когда переключалось и в каком моменте
> где что подвело. На выходе - сухой график. Нельзя как в Си/JS поставить ловушку
> на строчку и проманипулировать там значениями переменных.

Пишешь тестбенч, выполняешь, - смотришь временные диаграммы.  Всё строго и детерминировано. И никакие ловушки не нужны, ты просто задаешь набор данных для работы, как тебе надо.  Например, с источником синхронизации я "решил" (громко сказано, понятно что это велосипед)  проблему вот так (тут 14МГц частота)

clock.v

`timescale 1ns/1ns
module clock(output reg OUT1);

initial begin
OUT1=0;
end

always begin
#35.714 OUT1 = ~OUT1;
end

endmodule

посмотреть что получилось, можно так, - пишем тестбенч

test.v

`timescale 1ns/1ns
module test;

wire clk14;

clock clk(.OUT1(clk14));

initial
begin
end

//стоп симуляции
initial
begin
//задаём задержку единицах симуляции до конца симуляции, в данном случае  40мс
#40000000 $finish;
end

//создаем файл VCD для последующего анализа сигналов
initial
begin
  $dumpfile("out.vcd");
  $dumpvars(0,test);
end

//наблюдаем на некоторыми сигналами системы
initial 
$monitor($stime, clk14); 

endmodule

пишем мейкфайл, для простоты дальнейшей работы

Makefile

SOURCES=clock.v  test.v

all:
  iverilog.exe -o result.vout ${SOURCES}

result.vout:
  iverilog.exe -o result.vout ${SOURCES}

vvp: result.vout
  vvp result.vout

gtkwave: result.vout
  vvp result.vout
  gtkwave out.vcd

clean:
  del *.vcd
  del *.vout

и, собственно, для компиляции пишем

make

для очистки

make clean

а для просмотра симуляции

make gtkwave >NUL

и смотрим что получилось (это то, с чем работают электронщики, так -то) и ты можешь посмотреть диаграмму любой переменной из verilog файла, только нужно перенести мышкой в окно сигналов

Изображение

Можно, кстати, описать и  микросхемы памяти RAM и ROM (считывая данные из файла) и запустить вполне себе полноценные симуляции

#244
12:28, 8 окт. 2019

Alikberov
> И сложно очень, глядя на график, наложить все эти меандры на логику.
смотри, допустим ты делаешь  I2C или SPI модуль. как выглядит временная диаграмма I2C обмена знаешь? как проверить, что вот нарисованная тобой логика правильно выдаёт I2C (SPI) последовательность? шагать по шагам? ну вот увидели что ошибка. а сколько тактов назад она возникла и где?? в симуляторе - откатывайся назад и следи внимательно. а на диаграмме сразу видно где чо накосячено.

а RS триггер отрисованный выше вообще отписать можно кратко:

module rs
(
  input  r,
  input  s,
  
  output  q,
  output  nq
);

  assign  q = ~(r | nq);
  assign  nq = ~(s | q);

endmodule


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

да вот тебе пример первого кошмара: вот отхреначил ты в логисиме весь свой проц с периферией, кэшем и прочими плюшками. а потом купил/нашёл плату со спартаном. и чо? всю схему переносить ручками в iSE ? а завтра нужно будет на альтере сделать - теперь будешь ипаццо с квартусом. и допустить ошибку при переносе - плёвое дело. да и не все так просто и красиво переносится один-в-один. вон там у тебя громадный мультиплексор в АЛУ. очень сомневаюсь что такой громадный примитив есть в плисовых редакторах.

#245
(Правка: 16:48) 14:04, 8 окт. 2019

Mahagam
> очень сомневаюсь что такой громадный примитив есть в плисовых редакторах.
Этoт АЛУ я набросал быстро и как попало, лишь бы работало. Тем самым, в Verilog его переносить не буду, так как я его уже набил, если помните.

Регистровый файл, с которым я долго парился, не помню. По-моему, тоже набивал.

+ Файл контекста

Не все регистры там в ячейки вставил, так как у LogiSim крышу сносит от их обилия!
+ Здесь, обвёл для ясности, прочее

На счёт всего остального - соглашусь.
Так как, я уже выше сказал, у меня высшего инженерного образования нет и Verilog тяжело даётся. Я там малюю как чукча, что справедливо подмечено ранее.
А в LogiSim я как раз и вижу основные баги.

Этой схемой я обтачиваю читалку, которую в апреле построил (ещё до злополучной грозы в мае). И та читалка в мой Verilog-проект должна войти почти как есть.
Всё остальное на схеме - мусор. Хоть я и добился работы отдельных команд.
Тем самым, и АЛУ как попало набросал.
Сейчас мне надо научиться ровно работать с контекстом, так как вчера он неверно тактировался и некоторые его ячейки хаотично замусоривались. Теперь я тактирование контекста прерываю.
И так как я задумывал CISC, а получается RISC - тем более: Схема - свалка.

P.S.: В схеме синдром Скифа: Куча работы и потуг лишь для того, чтобы всё взлетело кое-как корректным чтением команд.

#246
16:58, 8 окт. 2019

Alikberov
> Регистровый файл, с которым я долго парился, не помню. По-моему, тоже набивал.
и
> Схемой - мне легче.
вот ну нихера не сходится. ибо на верилоге такие ебанутые регулярные конструкции влезут скорее всего в строк 20.

#247
18:47, 8 окт. 2019

Mahagam
> вот ну нихера не сходится
Тeм я и занимался ночами в 15 лет, что линеечкой чертил отдельные узлы генератора ТВ-растра, чтобы потом перечертить всё на один лист. Порою, неделя уходила на всё.
В том и удовольствие, что графически сейчас рисую схему и сразу вижу, как она работает.

P.S.: Наверно это просто ностальгия…
Школьником я мечтал иметь чудо-бумагу, на которой схема оживает, стоит подключить к ней щупы с батарейкой.

#248
(Правка: 10 окт. 2019, 1:22) 22:35, 9 окт. 2019

Оказываeтся, в «Читалке» я допустил грубую ошибку…

Вот доработанная CISC-читалка x80-кода:
x80 CISC-Reader | ❌80: Тёплый ламповый
Я просто добавил четвёртый регистр IA (Instruction Aligment), сохраняющий три бита от результата сравнения двух префиксов…

+ Особенности системы команд
Тем самым, регистр IA сохраняет маску сравнения компаратором (аналогично К555СП1) двух байтов двойного префикса не выходя за рамки дискретных элементов классической номенклатуры 74xx.
(Да, я таки надеюсь, что могу разводку сделать топологическую и данный узел собрать на печатной плате. Если бы ни лень.)
Без IA невозможно построить элементами «И» линейную таблицу всех инструкций без микрокода…
Тем самым, теперь получается следующее:
Таким образом, пол года прошло, пока я осознал свою концептуальную ошибку в схеме читалки.
Теперь она годится именно под чистую CISC-архитектуру x80, а не гибридную RISC в CISC.

Вот пример анимации дешифрации нескольких команд:
Изображение
Справа - дешифратор команд на элементах ИЛИ-НЕ со светодиодами с обозначениями исполняемой команды. Естественно, названия команд только подсвечиваются, так как исполнительный блок нужно проектировать. И всю шину нужно продублировать инверторами, чтобы все входы логических элементов были прямыми.
(Дешифратор набросал как попало, чтобы убедиться в работоспособности «Читалки» в чистом виде.)
В принципе, если сейчас тупо накидать все 8 РОН, то операции mov и xchg можно сделать.

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

Немного начинаю соображать, как в Verilog последовательно надо будет всё это дело набивать.
(Говорю же: Без визуального восприятия вентильного процесса в Verilog не получается у меня по графикам и логам понять, что где должно переключаться в каком-то случае. На днях в той схеме всё зависло с предупреждением «Обнаружено возбуждение» и выяснилось, что я с мультиплексорами накосячил, замыкая сумматоры на себя перед записью в регистровый файл. В Verilog тоже натыкался на подобные ситуации когда-то и всё забросил, так как не смог разобраться. А вот в схеме - легко отследил.
Видимо, я просто крайне плохо владею средствами отладки Verilog-листингов.)

P.S.: Зачем я здесь пишу про такие подробности?
Как программист, в Verilog я упускал это из виду…
Как электронщик, заметил, что не могу начать строить mov/xchg/hlt матрицу без этих линий: Для реализации этих 448 команд требуется всего 6 элементов И (с RISC-вариантом надо бить аж 896 32-битных слов).

#249
(Правка: 23:37) 23:28, 10 окт. 2019

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

Кaк эксперимент, решил набросать «аппаратный x80-дизассемблер»…
По сути, это тот же RISC-процессор, но вместо микрокоманд в нём используется поток ASCII-символов прямо на терминал.
Изображение
Получилось (внизу) три крошечные ПЗУ внизу:
Первая (512 байтов) хранит саму мнемонику и ссылки на токены.
Вторая (справа, 256 байт) хранит указатели на токены и индексы от шины (выборка строк, столбцов и префикса).
Третья (внизу на 512 байтов) хранит имена регистров, регистровых пар и АЛУ-операции.

Можно видеть, что схема довольно маленькая, но является самым примитивным дизассемблером на аппаратном уровне.
Как Вы понимаете, если не считаете меня уже полным кретином, сегодня я приобрёл опыт, который заключается в том, чтобы хранить не один большой микрокод в одной огромной ПЗУ, а разбить микрокоманды на несколько мелких кодов в нескольких ПЗУ.
Для меня это - ценный опыт.

Даже своим x80-эмулятором на JavaScript я «плясал с бубном», так как тяжело было обрабатывать байт-код x80 на языке высокого уровня. В частности, «jmp замыкания» на себя приходилось перехватывать уже в самой команде. Теперь я вижу, как нужно было организовывать эмулятор…
А если в JavaScript я напортачил, что говорить про Verilog!
Просто теперь я вижу, как надо делать. По крайней мере, нащупал вариант компактнее и производительнее.

P.S.: Как программист я избалован тем, что программы можно бить неограниченной сложности.
В Verilog похожая ситуация, так как не смотря на ограничения, в нём можно описать модуль космической сложности.
А вот LogiSim связывает меня по рукам из-за многих ограничений и мозги начинают действительно варить на качественно ином уровне, так как изнуряет графическое редактирование и начинаешь реально думать очень чётко…

#250
23:44, 10 окт. 2019
Я тут прикинул, чисто в качестве бреда.. если собирать не на микросхемах, а на голых транзисторах, то  полный однобитный сумматор обойдётся в 36  КМОП транзисторов, а 3х битный (с учётом апгрейда до возможности вычитать числа) где-то в 160 КМОП транзисторов.  А чтобы сделать простейший калькулятор, нужен ещё хотя бы регистр...  один D триггер это где-то 12 транзисторов, значит регистр на 4 бита обойдётся в 48 транзисторов.  Задолбаешься рисовать.
#251
0:05, 11 окт. 2019
0iStalker
+ Показать
#252
1:52, 11 окт. 2019

0iStalker
> один D триггер это где-то 12 транзисторов
Так, по идее, можно обойтись ячейкой SRAM на 6 транзисторов.
Хотя, конечно, желательно, хотя бы, 2 порта на чтение и 1 на запись, т. е. 10 транзисторов.
Еще можно сэкономить и не делать честный CMOS, обойтись половиной с подтягивающими резисторами, тем более реальные микросхемы поначалу так и делали, это уже потом энергопотребление стало проблемой.

#253
16:37, 11 окт. 2019

Eсли я не ошибаюсь, то в FPGA триггеры - не совсем триггеры.
Кажется, или я где-то читал (очень бегло, так как для пользователя это - теория), или сам стал думать, что в Verilog любой регистр - тупо RS-триггер с кучей логических И/ИЛИ на входах.
Это видно уже из листингов, в которых из разных частей листинга можно легко перегружать значение какого-то регистра. Простой D-триггер так не перезагрузишь, так как не хватит никаких мультиплексеров для селекции записываемых данных.
Уже из этого получается, что в FPGA регистры - RS-триггеры, как в ОЗУ, чтобы данные шли парными шинами - запись «0» и запись «1»…

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

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

#254
(Правка: 18:06) 17:57, 11 окт. 2019

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

FPGA это набор базовых логических блоков

Изображение
Изображение

Alikberov
> А мне интересно, чтобы я лично мог бы ответить за каждый транзистор на
> кристалле

У тебя голова лопнет уже на простейших комбинаторых схемах от их количества.

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

Это просто инструмент, - описание логического устройства на нём может транслировать в исполняемый файл (exe) для компьютера, или в таблицу конфигурации для ПЛИС, или в фотошаблоны для изготовления ASIC

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