nedoPC.org

Community for electronics hobbyists, established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 09 Dec 2024 10:25



Reply to topic  [ 68 posts ]  Go to page Previous  1, 2, 3, 4, 5  Next
1-битный процессор микрокода на эмиттерно-связанной логике? 
Author Message
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
Замоделировал модуль тактового генератора на 100 МГц

Оказывается, тактовый генератор не такое уж простое дело!

Ещё стало очевидно что захочется несколько частот и нужно будет их переключать. Думаю, 4 частоты достаточно:

  • Очень маленькая, чтобы компьютер красиво переливался светодиодами, ~10 Герц
  • Разумно-маленькая чтобы высокочастотные эффекты не играли роли, 5-10 кГц
  • Основная, 100 МГц
  • Запредельно большая для экспериментов за пределами возможностей осциллографа, 0.2 - 1.5 ГГц (как получится)

Ещё нужен ручной пошаговый режим, причём, лучше всего, в двух видах: полный шаг и фронт-спад

Также замоделировал "безглючный" (glitch-free) переключатель.

Для такого простого очевидного модуля схема получится ого-го! Приблизительно, 40 транзисторов!

Но зато такой модуль станет хорошим испытанием всей концепции, на нём почти всё что нужно будет использовано и протестировано.


Attachments:
File comment: 100 MHz oscillator model
100 MHz oscillator.png
100 MHz oscillator.png [ 25.44 KiB | Viewed 13097 times ]
File comment: Switchable clock oscillator
123.png
123.png [ 35.91 KiB | Viewed 13097 times ]
23 Jul 2023 17:54
Profile
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
Наконец-то сделал конвертеры в CMOS и обратно

Но напрягает тот, который из DCTL в CMOS: сейчас он явно не успевает на частоте 100 МГц ("акулий плавник"), и ещё там вышла какая-то тонкая настройка с резистором 8 Ом. Боюсь, повторяемости не будет. А "правильную" схему с пуш-пулл выходом (как у выходы у TTL) пилить не хочется...

Осталось придумать логику ручного тактирования и можно приступать к KiCADу


Attachments:
File comment: CMOS 3.3V to DCTL translator
TTL2DCTL-A.png
TTL2DCTL-A.png [ 31.28 KiB | Viewed 13049 times ]
File comment: DCTL to CMOS 3.3V translator (weak)
DCTL-A2TTL.png
DCTL-A2TTL.png [ 28.55 KiB | Viewed 13049 times ]
26 Jul 2023 12:52
Profile
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
belfegor96 wrote:
Осталось придумать логику ручного тактирования и можно приступать к KiCADу

Дополнительная логика съедает тонны транзисторов, поэтому обойдусь мультивибратором который уже реализован в схеме.

Принцип простой: если инверсный выход замкнуть со входом то мультивибратор превратится в RS-триггер. Это автоматически даёт возможность руками устанавливать высокий и низкий уровни на выходе чтобы делать "полушаг". Что интересно: при таком превращении гарантируется что последнее переключение мультивибратора произойдёт не в случайный момент времени, а только после половинного разряда или заряда конденсатора (то есть, на границе шага вверх или вниз). То же самое происходит и при размыкании: конденсатору нужно или зарядиться и разрядиться наполовину и потом наоборот - то есть, сделать полный шаг, а не его часть.

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

Короче говоря, для реализации всего этого дополнительных транзисторов не требуется.

Чтобы переключиться на ручное управление нужно будет переключиться на этот генератор, щёлкнуть тумблер ручного режима и далее уже щёлкать кнопочками пошагово.

Всё, наконец-то можно приступать к KiCAD! :rotate:


Attachments:
File comment: Генератор тактовой частоты без гличей на основе ненасыщающегося мультивибратора с возможностью пошагового исполнения и ручного переключения высокий-низкий / Glitch-free clock generator based on a non-saturable multivibrator with stepping and manual high-low switching
clock_with_bystep_and_edges.png
clock_with_bystep_and_edges.png [ 57.21 KiB | Viewed 12989 times ]
28 Jul 2023 12:31
Profile
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
Нарисовал плату с медленным мультивибратором, который будет заодно и пошаговым. Думал - раз всё мелкое, сэкономлю место, но забыл что ЛУТ не умеет дорожки меньше 0.2мм. Придётся переделывать. Но в целом как-то так вот будет выглядеть. Да, сверлильного станка нет поэтому всё будет SMD, включая выводные компоненты :-)

Резисторы справа и сверху от конденсатора - это временный источник напряжений всех сортов что нужны :-)


Attachments:
Oscillators_PCB_v1.png
Oscillators_PCB_v1.png [ 152.91 KiB | Viewed 12859 times ]
31 Jul 2023 11:24
Profile
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
Пока жду фоторезист и принадлежности для него, нарисовал мультиплексор на 4 бита. А потом задумался:

Похоже, имеет смысл отказаться от (де)мультиплексоров в пользу введения третьего состояния как у обычных TTL/КМОП микросхем. Это приведёт к бОльшей унификации блоков и гибкости схемы: если не сделать высокоимпедансное состояние то вместо изменения одной линии которая переключает вход на приём или передачу придётся перепиливать целую шину, идущую на мультиплексор или демультиплексор.

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

Вопрос теперь как в этой ЭСЛ-DTL-EFL-логике реализовать это третье состояние.

И ещё мысль:

Я правильно понимаю, что если сделать генератор фаз и поднять частоту тактов в 2 раза то это позволит избавиться от триггеров в пользу защёлок? То есть, по одной фазе мы делаем полезное, по второй фазе защёлкиваем полученное значение (вместо ожидания фронта/спада)

Дело в том что триггеры по фронту/спаду ровно в два раза "дороже" по сравнению с защёлками. Видимо, в этом и есть смысл использования тактовых фаз в процессорах?

(Тогда будет удобно сделать ещё одну кнопку однократного прохода по полному циклу фаз ("полный шаг") - но это мелочи.)


Attachments:
File comment: 3-уровневый мультиплексор / 3-level multiplexor
3lvl_MUX.png
3lvl_MUX.png [ 11.35 KiB | Viewed 12445 times ]
10 Aug 2023 10:48
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23466
Location: Silicon Valley
Reply with quote
обычно двух-фазные триггеры "стабильнее"
но по идее можно и на защёлках :)
третье сосотяние можно в отдельных элементах сделать
по идее всё можно делать на NAND-ах либо на NOR-ах (для унификации так сказать)

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


11 Aug 2023 21:54
Profile WWW
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
Тогда решено - фазам быть!

Третье состояние почти сделал. То есть, логика верная и даже работает если нагрузка невелика - небольшая разница напряжений присутствует при включении Z (отрицательный сигнал на B включает Z-состояние, то есть выключает передачу сигнала A, но оставляет приём сигнала из общей шины через Reverse). У передающего устройства положенные токи стекают из эмиттерных повторителей организованных с помощью TRAN1 и TRAN2 (это транзисторы так обозначены). Также на шине в единственном экземпляре ставится резистор-терминатор (на схеме не показан)

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

(Фоторезист приехал, экспериментировал, всё отлично кроме фотошаблонов: оказывается, лазерный принтер их печатает частично прозрачными и это проблема которая толком не решена. Ничего, пару тестовых плат всё равно завтра соберу)


Attachments:
File comment: Попытка изобрести диффкаскад с высокоимпедансным состоянием
Try to create Z-state diff gate.png
Try to create Z-state diff gate.png [ 13.62 KiB | Viewed 12227 times ]
File comment: Генератор двух непересекающихся фаз / 2 phases non-overlapping clock
phase_splitting.png
phase_splitting.png [ 12.72 KiB | Viewed 12227 times ]
13 Aug 2023 17:51
Profile
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
Quote:
Третье состояние почти сделал

Работает так: переключающий в высокоимпедансное состояние вход сигнал s на диффкаскаде DIFF2 выравнивается и поступает на инвертирующий транзистор 23. Далее транзистор 24 регулирует уровень выходящего полезного сигнала (driver_b) с выравнивающего диффкаскада на транзисторах 22 и 21. Полезный сигнал начинает меняться по высоте (зелёные линии на осциллограмме, частота полезного сигнала 1 ГГц, частота переключающего сигнала bas - розовая линия сверху графика - около 100 МГц). Изменяющийся сигнал в режиме высокого сопротивления становится ниже чем сток с эмитерного повторителя (Vt, обозначен красным пунктиром), выполненного на транзисторах 39 и 38.

Вроде-бы, всё ок, но потом сообразил что есть одно "но":

Дело в том, что само переключение почему-то не может происходить так же быстро как прохождение обычного сигнала. Видимо, потому что размах переключения в и из высокоимпедансного состояния 0.7 В, то есть, получается намного больше чем размах полезного сигнала (он всего 0.2 В), поэтому такое переключение будет существенно медленнее остальных сигналов, что неприемлемо.

Возможно, удастся нагрузить транзистор больше чтобы переключалось всё быстрее, но у них вообще 25 мА максимальный ток и 30 мА пиковый ток

Никогда таких сложных транзисторных схем раньше не разрабатывал...


Attachments:
File comment: ЭСЛ схема с тремя состояниями / Tri-state ECL circuit
export.png
export.png [ 57.63 KiB | Viewed 11936 times ]
22 Aug 2023 09:33
Profile
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
Потыкавшись в LogiSim понял что рисовать руками даже простой процессор это очень муторно. А тут получается простой, но всё-таки не совсем.

Надо вкатываться в SystemVerilog. Заказал книгу "Логическое проектирование и верификация систем на SystemVerilog (Томас Дональд)", жду. Приму рекомендации что ещё почитать на эту тему можно

Да, ещё интересно, получится ли синтезатор заставить использовать только нужные мне элементы? (а именно: мультиплексоры и логические вентили)


12 Sep 2023 02:12
Profile
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
Написал двухфазный тактовый генератор на SystemVerilog, всё ок, осциллограммы красивые выдаются и в iverilog и в verilator.

Но на каком симуляторе его гонять "по полной программе"? Не нашёл ни одного опенсорсного, который бы поддерживал, например, параллельные секвенции. А без этого далеко не уедешь, как мне кажется.

При этом вижу много SV кода на github, значит люди на чём-то гоняют свои модели. Что-то пиратят?


19 Sep 2023 15:44
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23466
Location: Silicon Valley
Reply with quote
что значит "по полной программе"?
iverilog и verilator не считаются?
ещё yosys есть - он опенсорцный и там тоже конвертер в C++ имеется
обычно на верилоге пишут чтобы в FPGA прошить либо чип в ASIC заказать

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


19 Sep 2023 20:20
Profile WWW
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
Shaos wrote:
что значит "по полной программе"?
iverilog и verilator не считаются?
ещё yosys есть - он опенсорцный и там тоже конвертер в C++ имеется
обычно на верилоге пишут чтобы в FPGA прошить либо чип в ASIC заказать

А я хочу симуляцию+верицикацию и потом в виде гейтов вывести (или даже автоматически преобразовать их в схему kicad, но это вряд ли, слишком трудоёмко делать такой код, наверно)

iverilog и verilator не поддерживают "sequence":
Code:
 verilator --cc --build --exe --main --timing --trace --main-top-name clk_test clk_gen.sv
%Error-UNSUPPORTED: clk_gen.sv:30:5: Unsupported: sequence
   30 |     sequence phases;
      |     ^~~~~~~~
                    ... For error description see https://verilator.org/warn/UNSUPPORTED?v=5.012
%Error: clk_gen.sv:31:9: syntax error, unexpected '@', expecting TYPE-IDENTIFIER
   31 |         @(posedge clk)
      |         ^
%Error: Cannot continue
        ... See the manual at https://verilator.org/verilator_doc.html for more assistance.


yosys, вроде, требует для симуляции "Verific" - некое проприетарное дополнение

Ну и на синтаксис тоже ругается:
Code:
yosys -r clk_test -o output.blif -p "verific" clk_gen.sv
[...]
Yosys 0.33 (git sha1 2584903a060)


-- Parsing `clk_gen.sv' using frontend ` -sv' --

1. Executing Verilog-2005 frontend: clk_gen.sv
Parsing SystemVerilog input from `clk_gen.sv' to AST representation.
clk_gen.sv:30: ERROR: syntax error, unexpected ';', expecting '(' or '['


Код моего (первого в жизни) модуля приложил к сообщению


Attachments:
File comment: Двухфазный генератор тактового сигнала
clk_gen.7z [968 Bytes]
Downloaded 260 times


Last edited by belfegor96 on 20 Sep 2023 05:55, edited 2 times in total.

20 Sep 2023 03:43
Profile
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
Код модуля чтобы не распаковывать:

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
Profile
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
Разобрался: verilator нужно было запускать с такими параметрами:

Code:
$ verilator +1800-2017ext+sv --assert --cc --build --exe --main --timing --trace --main-top-name clk_test clk_gen.sv


А код проверки должен быть примерно такой:

Code:
    assert property(@(posedge clk) ~(f1 && f2));


(тут проверяется чтобы две фазы одновременно не включились)


20 Sep 2023 11:18
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23466
Location: Silicon Valley
Reply with quote
belfegor96 wrote:
Shaos wrote:
что значит "по полной программе"?
iverilog и verilator не считаются?
ещё yosys есть - он опенсорцный и там тоже конвертер в C++ имеется
обычно на верилоге пишут чтобы в FPGA прошить либо чип в ASIC заказать

А я хочу симуляцию+верицикацию и потом в виде гейтов вывести (или даже автоматически преобразовать их в схему kicad, но это вряд ли, слишком трудоёмко делать такой код, наверно)

Вот есть такая штука - PCBFlow для Yosys, которая из верилога (или даже VHDL) может делать печатную плату с транзисторами :)

https://github.com/cpldcpu/PCBFlow


Attachments:
PCBFlow.png
PCBFlow.png [ 390.94 KiB | Viewed 11087 times ]

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973
20 Sep 2023 16:16
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 68 posts ]  Go to page Previous  1, 2, 3, 4, 5  Next

Who is online

Users browsing this forum: No registered users and 1 guest


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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.