|
nedoPC.orgCommunity for electronics hobbyists, established in 2002 |
|
1-битный процессор микрокода на эмиттерно-связанной логике?
Author |
Message |
belfegor96
Fanat
Joined: 09 Jun 2022 00:49 Posts: 83
|
Замоделировал модуль тактового генератора на 100 МГц Оказывается, тактовый генератор не такое уж простое дело! Ещё стало очевидно что захочется несколько частот и нужно будет их переключать. Думаю, 4 частоты достаточно: - Очень маленькая, чтобы компьютер красиво переливался светодиодами, ~10 Герц
- Разумно-маленькая чтобы высокочастотные эффекты не играли роли, 5-10 кГц
- Основная, 100 МГц
- Запредельно большая для экспериментов за пределами возможностей осциллографа, 0.2 - 1.5 ГГц (как получится)
Ещё нужен ручной пошаговый режим, причём, лучше всего, в двух видах: полный шаг и фронт-спад Также замоделировал "безглючный" (glitch-free) переключатель. Для такого простого очевидного модуля схема получится ого-го! Приблизительно, 40 транзисторов! Но зато такой модуль станет хорошим испытанием всей концепции, на нём почти всё что нужно будет использовано и протестировано.
|
23 Jul 2023 17:54 |
|
|
belfegor96
Fanat
Joined: 09 Jun 2022 00:49 Posts: 83
|
Наконец-то сделал конвертеры в CMOS и обратно
Но напрягает тот, который из DCTL в CMOS: сейчас он явно не успевает на частоте 100 МГц ("акулий плавник"), и ещё там вышла какая-то тонкая настройка с резистором 8 Ом. Боюсь, повторяемости не будет. А "правильную" схему с пуш-пулл выходом (как у выходы у TTL) пилить не хочется...
Осталось придумать логику ручного тактирования и можно приступать к KiCADу
|
26 Jul 2023 12:52 |
|
|
belfegor96
Fanat
Joined: 09 Jun 2022 00:49 Posts: 83
|
Дополнительная логика съедает тонны транзисторов, поэтому обойдусь мультивибратором который уже реализован в схеме. Принцип простой: если инверсный выход замкнуть со входом то мультивибратор превратится в RS-триггер. Это автоматически даёт возможность руками устанавливать высокий и низкий уровни на выходе чтобы делать "полушаг". Что интересно: при таком превращении гарантируется что последнее переключение мультивибратора произойдёт не в случайный момент времени, а только после половинного разряда или заряда конденсатора (то есть, на границе шага вверх или вниз). То же самое происходит и при размыкании: конденсатору нужно или зарядиться и разрядиться наполовину и потом наоборот - то есть, сделать полный шаг, а не его часть. Если же замкнуть выход со входом мультивибратора через диод, то из-за того что после начала ручной подачи импульса установки высокого уровня происходит начало зарядки конденсатора задержки мультивибратора, то не менее чем через положенное на один полный такт время (может быть и более - если кнопку шага на некоторое оставить нажатой) конденсатор зарядится и разрядится в штатном режиме мультивибратора, тем самым выключит выход - то есть, при таком включении из кнопки "уровень вверх" получается готовая кнопка "шаг". Короче говоря, для реализации всего этого дополнительных транзисторов не требуется. Чтобы переключиться на ручное управление нужно будет переключиться на этот генератор, щёлкнуть тумблер ручного режима и далее уже щёлкать кнопочками пошагово. Всё, наконец-то можно приступать к KiCAD!
|
28 Jul 2023 12:31 |
|
|
belfegor96
Fanat
Joined: 09 Jun 2022 00:49 Posts: 83
|
Нарисовал плату с медленным мультивибратором, который будет заодно и пошаговым. Думал - раз всё мелкое, сэкономлю место, но забыл что ЛУТ не умеет дорожки меньше 0.2мм. Придётся переделывать. Но в целом как-то так вот будет выглядеть. Да, сверлильного станка нет поэтому всё будет SMD, включая выводные компоненты Резисторы справа и сверху от конденсатора - это временный источник напряжений всех сортов что нужны
|
31 Jul 2023 11:24 |
|
|
belfegor96
Fanat
Joined: 09 Jun 2022 00:49 Posts: 83
|
Пока жду фоторезист и принадлежности для него, нарисовал мультиплексор на 4 бита. А потом задумался:
Похоже, имеет смысл отказаться от (де)мультиплексоров в пользу введения третьего состояния как у обычных TTL/КМОП микросхем. Это приведёт к бОльшей унификации блоков и гибкости схемы: если не сделать высокоимпедансное состояние то вместо изменения одной линии которая переключает вход на приём или передачу придётся перепиливать целую шину, идущую на мультиплексор или демультиплексор.
Перерасхода транзисторов не ожидается - по сути, третье состояние это растянутый по всей схеме мультиплексор/демультиплексор. Экономии тоже не просматривается, она может появиться только если будут подключения по шине по типу "многие ко многим".
Вопрос теперь как в этой ЭСЛ-DTL-EFL-логике реализовать это третье состояние.
И ещё мысль:
Я правильно понимаю, что если сделать генератор фаз и поднять частоту тактов в 2 раза то это позволит избавиться от триггеров в пользу защёлок? То есть, по одной фазе мы делаем полезное, по второй фазе защёлкиваем полученное значение (вместо ожидания фронта/спада)
Дело в том что триггеры по фронту/спаду ровно в два раза "дороже" по сравнению с защёлками. Видимо, в этом и есть смысл использования тактовых фаз в процессорах?
(Тогда будет удобно сделать ещё одну кнопку однократного прохода по полному циклу фаз ("полный шаг") - но это мелочи.)
|
10 Aug 2023 10:48 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23357 Location: Silicon Valley
|
обычно двух-фазные триггеры "стабильнее" но по идее можно и на защёлках третье сосотяние можно в отдельных элементах сделать по идее всё можно делать на NAND-ах либо на NOR-ах (для унификации так сказать)
|
11 Aug 2023 21:54 |
|
|
belfegor96
Fanat
Joined: 09 Jun 2022 00:49 Posts: 83
|
Тогда решено - фазам быть!
Третье состояние почти сделал. То есть, логика верная и даже работает если нагрузка невелика - небольшая разница напряжений присутствует при включении Z (отрицательный сигнал на B включает Z-состояние, то есть выключает передачу сигнала A, но оставляет приём сигнала из общей шины через Reverse). У передающего устройства положенные токи стекают из эмиттерных повторителей организованных с помощью TRAN1 и TRAN2 (это транзисторы так обозначены). Также на шине в единственном экземпляре ставится резистор-терминатор (на схеме не показан)
Но такой транзистор в выключенном состоянии держит напряжение в общей линии (такой транзистор есть во всех двунаправленных устройствах на этой шине), поэтому, напряжение почти не меняется и нагрузочная способность оказывается низкой. Не знаю как это забороть пока что.
(Фоторезист приехал, экспериментировал, всё отлично кроме фотошаблонов: оказывается, лазерный принтер их печатает частично прозрачными и это проблема которая толком не решена. Ничего, пару тестовых плат всё равно завтра соберу)
|
13 Aug 2023 17:51 |
|
|
belfegor96
Fanat
Joined: 09 Jun 2022 00:49 Posts: 83
|
Работает так: переключающий в высокоимпедансное состояние вход сигнал s на диффкаскаде DIFF2 выравнивается и поступает на инвертирующий транзистор 23. Далее транзистор 24 регулирует уровень выходящего полезного сигнала (driver_b) с выравнивающего диффкаскада на транзисторах 22 и 21. Полезный сигнал начинает меняться по высоте (зелёные линии на осциллограмме, частота полезного сигнала 1 ГГц, частота переключающего сигнала bas - розовая линия сверху графика - около 100 МГц). Изменяющийся сигнал в режиме высокого сопротивления становится ниже чем сток с эмитерного повторителя (Vt, обозначен красным пунктиром), выполненного на транзисторах 39 и 38. Вроде-бы, всё ок, но потом сообразил что есть одно "но": Дело в том, что само переключение почему-то не может происходить так же быстро как прохождение обычного сигнала. Видимо, потому что размах переключения в и из высокоимпедансного состояния 0.7 В, то есть, получается намного больше чем размах полезного сигнала (он всего 0.2 В), поэтому такое переключение будет существенно медленнее остальных сигналов, что неприемлемо. Возможно, удастся нагрузить транзистор больше чтобы переключалось всё быстрее, но у них вообще 25 мА максимальный ток и 30 мА пиковый ток Никогда таких сложных транзисторных схем раньше не разрабатывал...
|
22 Aug 2023 09:33 |
|
|
belfegor96
Fanat
Joined: 09 Jun 2022 00:49 Posts: 83
|
Потыкавшись в LogiSim понял что рисовать руками даже простой процессор это очень муторно. А тут получается простой, но всё-таки не совсем.
Надо вкатываться в SystemVerilog. Заказал книгу "Логическое проектирование и верификация систем на SystemVerilog (Томас Дональд)", жду. Приму рекомендации что ещё почитать на эту тему можно
Да, ещё интересно, получится ли синтезатор заставить использовать только нужные мне элементы? (а именно: мультиплексоры и логические вентили)
|
12 Sep 2023 02:12 |
|
|
belfegor96
Fanat
Joined: 09 Jun 2022 00:49 Posts: 83
|
Написал двухфазный тактовый генератор на SystemVerilog, всё ок, осциллограммы красивые выдаются и в iverilog и в verilator.
Но на каком симуляторе его гонять "по полной программе"? Не нашёл ни одного опенсорсного, который бы поддерживал, например, параллельные секвенции. А без этого далеко не уедешь, как мне кажется.
При этом вижу много SV кода на github, значит люди на чём-то гоняют свои модели. Что-то пиратят?
|
19 Sep 2023 15:44 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23357 Location: Silicon Valley
|
что значит "по полной программе"? iverilog и verilator не считаются? ещё yosys есть - он опенсорцный и там тоже конвертер в C++ имеется обычно на верилоге пишут чтобы в FPGA прошить либо чип в ASIC заказать
|
19 Sep 2023 20:20 |
|
|
belfegor96
Fanat
Joined: 09 Jun 2022 00:49 Posts: 83
|
А я хочу симуляцию+верицикацию и потом в виде гейтов вывести (или даже автоматически преобразовать их в схему kicad, но это вряд ли, слишком трудоёмко делать такой код, наверно) iverilog и verilator не поддерживают "sequence": yosys, вроде, требует для симуляции "Verific" - некое проприетарное дополнение Ну и на синтаксис тоже ругается: Код моего (первого в жизни) модуля приложил к сообщению
Last edited by belfegor96 on 20 Sep 2023 05:55, edited 2 times in total.
|
20 Sep 2023 03:43 |
|
|
belfegor96
Fanat
Joined: 09 Jun 2022 00:49 Posts: 83
|
Код модуля чтобы не распаковывать: | | | | Code: module clk_source #(parameter LEN) ( input clk, output bit f1, f2 );
bit[LEN-1:0] q;
for(genvar i = 0; i < LEN-1; i++) always_ff @(posedge clk) q[i+1] <= q[i];
always_ff @(posedge clk) q[0] <= ~q[LEN-1];
assign f1 = q[0] & q[1]; assign f2 = ~(q[0] | q[1]);
initial begin assert(LEN >= 2); end endmodule
module clk_test; logic clk, f1, f2;
clk_source #(5) c (clk, f1, f2);
sequence phases; // <- тут ругается @(posedge clk) f1 ##1 f2; endsequence
//~ assert property (@(posedge clock) phases.triggered);
initial begin //~ $monitor("time=%0d clk=%b f1=%b f2=%b", $time, clk, f1, f2); $dumpfile("clk_output.vcd"); $dumpvars(0, clk_test);
clk = 0; repeat (50) #1 clk = ~clk; end endmodule | | | | |
|
20 Sep 2023 03:52 |
|
|
belfegor96
Fanat
Joined: 09 Jun 2022 00:49 Posts: 83
|
Разобрался: verilator нужно было запускать с такими параметрами: А код проверки должен быть примерно такой: (тут проверяется чтобы две фазы одновременно не включились)
|
20 Sep 2023 11:18 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23357 Location: Silicon Valley
|
Вот есть такая штука - PCBFlow для Yosys, которая из верилога (или даже VHDL) может делать печатную плату с транзисторами https://github.com/cpldcpu/PCBFlow
|
20 Sep 2023 16:16 |
|
|
Who is online |
Users browsing this forum: No registered users and 2 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|