Пока что здесь ничего сильно выдающегося нет, за исключением того, что публикация напрямую противоречит «бытующим» (так их называют другие) мнениям и распространяемым сведениям, которые не совсем правдивые. В естественной среде (в реальном мире), вопреки им, на асинхронной логике построено всё, и даже жизнь. Пытаться повторить последнее на FPGA разумеется можно только в виде игры, но и её пока что не будет. Хотя публикация имеет место быть, даже с таким объёмом материала, так как её содержание — мой небольшой опыт работы с FPGA, свидетельствует в пользу того, что материал распространённый ранее в сети, по части асинхронной логики, не то что не точный — а полностью не соответствует естественному порядку вещей в действительности, это было‑бы можно объяснять специфичностью FPGA, но никакой такой специфичности на самом деле нет, не было, и вряд‑ли когда будет, поэтому пусть тот материал остаётся сам по себе, и рассматривать его далее, как минимум тут, не стоит. "Вишенкой на торте" в публикации, по воле судьбы, стал полноценный собственный асинхронный триггер без декларирования порта типа Reg (это уже что-то, чего например я в учебниках не встречал, но оно и не мудрено - по асинхронной логике действительно мало материала, и большинство стремится показать изящество кода, а не схемотехники).
На замечания по части статической логики — я принял во внимание и подкорректировал текст публикации, оставив то, что архитектуру реализованную на асинхронной логике можно будет легко перенести на статическую, что не противоречит тексту о предполагаемой реализации на конкретном носителе с его средой распространения сигнала и элементами.
Спасибо за те замечания, которые были справедливы. Единственное, что попробую некоторые из них поправить в свою очередь — Термины «статический»/«динамический», применяемые к комбинационным схемам, не следует путать с этими же терминами, употребляемыми для обозначения запоминающих устройств, например динамического (DRAM) или статического (SRAM) ОЗУ (RAM). С остальными аргументами согласен по части асинхронной логики— был невнимателен и принял перспективу за действительность (хотя, эта перспектива далеко не вершина идеала). В действительности, как мне стало понятно, сравнение статической логики и динамической эквивалентно сравнению диодно‑транзисторной и резисторно‑транзисторной, то‑есть тут весь фокус именно в реализации элементов осуществляющих работу логики на схеме.
По части терминологии с асинхронной логикой - тут всё безошибочно и с этим я никого в ступор ввести не мог, ошибка была только по части упоминания статической логики.
Работал над схемой лаунчера, тестировал диодами (дело в том, что в основном я работаю с Ubuntu, а осцилоскоп — именно такую фичу предоставляет компания Gowin, да и то не для всех плат работает только с самой EDA, а не с openFPGALoader‑а), потому как если верить статьям, то полноценно запустите его на линуксе, да ещё и фряшном (пока вроде так) — та ещё проблема. Да, мной был приобретён миниПК для работы с осцилоскопом, да там это всё работает и вполне компактно получилось, чтобы таскать с собой по командировкам, но пока с Ubuntu на ноутбуке — диодами на плате.
Порой, во время работы над схемой лаунчера, при оглядке назад на материал в сети, казалось что запустить её — не хватит жизни, ибо правду говорят о ограниченности FPGA, да и вообще электронники. Но приобретённый ранее опыт и успешное решение по части алгоритмизации требовали продолжения. В конце концов — лаунчер запустился. Проблему вызвал асинхронный триггер, который я пытался реализовать на базе примитива DLC, казалось он работает, но увы — при наличии на входе сигнала Z он сбрасывался, и хоть у меня есть опыт решения таких поблем — я не стал её решать, отложив этот казус на потом, а просто создал такой асинхронный триггер, по сути слепленный мной из кусков сведений в сети на разных сайтах.
module Trs
(input S, R, output reg Q);
always @(R, S)
begin
if(R)
Q <= 1'b0;
else if(S)
Q <= 1'b1;
end
endmodule
Это работает и не сбоит. Выглядит, во вьювере EDA, схема так
громоздко немного, хотелось изящнее, но то потом, пока что это не столь важно.
Хотя всё-же ... так, как я новичок, решил на замечания по этому поводу - запустить триггер на базе защёлки DLC (делов-то пол-часа час, и то с временем редактирования публикации), которая сбоит при входящем сигнале Z, код не сбоящего триггера на базе DLC выглядит так
Перепробовав множество вариантов, я пришёл всё-же к повтору предыдущего, но уже в другой форме описания схемы и более простым примитивом. Но, ради справедливости стоит отметить, чот мой код (схема) работает без декларирования типа Reg выходного порта. Поэтому повтором это можно назвать с оооочень большой натяжкой.
Код
module Trs
(input S, R,
output Q);
not n2(R1,R);
and a1(G,S,R1);
DLC dlc_01 (Q,G,G,R);
endmodule
.
Лаунчер будет работать с любым из триггеров, просто мне DLATCHRS внешне кажется сильно наворочанным, поэтому всё-же наверное буду использовать асинхронный триггер на базе примитива DLC, в целях экономии средств FPGA в своих проектах. Причина этого успеха заключается в том, что логический элемент AND, при подаче даже сигнала нуля на один из своих входов - уже выдаёт на выходе 0, даже при входящем сигнале Z на втором входе. Скорее всего стабилизировали сигнал в своём триггере исключая состояние Z и разработчики, чем следовали каким-то предположениям о противорчечащих сигналах на входах R и S, так как сигнал сброса игнорирует остальные.
Собственно лаунчер нужен совсем не много — всего лишь для запуска демки конвейера кэша команд, называемого мной теперь так — «Адресный конвейер, или линия автономной дискретной активации ячеек и линия управления дискретностью (асинхронной логики)», но отсутствие опыта подстёгивало желание срочно его приобрести, с учётом того, что без него дальше будет и вовсе трудно, а тем более работа в целом противоречит опыту пользователей и специалистов (некоторые выдавали себя именно за них, причём авторитетных), ну если не опыту — то сведениям ими охотно распространяемым. Поэтому даже на столь незначительной схеме я поупирался, и моё упорство было вознаграждено — все четыре диода зажигаются, что было свидетельством получения стабильной схемы, даже при наличии в ней сигнала Z. Все свои схемы я проверяю и отлаживаю в симуляторе Logisim — это удбная программа и её симулятор достаточно точен и имеет необходимый инструментарий. Задача лаунчера — зажечь диоды именно поочерёдно, потому что, чтобы привести конвейер в действие в демоварианте (собственно тоже активно создаётся только из‑за отсутствия опыта, ну и ранее расбросанных другими сведений), нужно последовательно произвести ряд действий, их хоть для глаз все диоды загораются одновременно — на самом деле это просто поисходит очень быстро.
Итак лаунчер, изначально хотел реализовать каждое звено на двух триггерах, но не смог быстро создать схему генерирующую сигнал повторного запуска цикла управляющих сигналов, которые приходят из блока SetChain (выбран и выделен во вьювере красным контуром, в отличии от остальных элементов схемы) и необходимы для работы активаторов activate. Каждый активатор выдаёт последовательно на, соответствующий действию, контакт сигнал, и потом убирает его, при этом он отправляет на SetChain сигнал повтороный активации, после чего цикл повторяется.
Сам активатор (в схеме выше их четыре справа, перед выходящими пинами лаунчера) во вьювере Gowin EDA выглядит так (открывается просто двойным кликом мыши по элементу, возвращаемся выбрав пункт «Pop » в выпадающем списке при нажатии на свободное пространство ПКМ). *Кстати — при каждой правке кода нужно сохранять изменения, иначе компилятор их просто не увидит при запуске компиляции.
представление не совсем удобное, но чтобы убедиться в правильности расключения всех проводов — этого вполне хватает, разумеется в относительно сложных схемах я тут‑же сверяюсь с отлаженной схемой в Logisim. Прежде чем сливать сюда весь код (если что плата у меня tangnano9k, и распиновку солью позднее) — хочется показать то, как работает сам активатор. Выходящим пином out1 он активирует то что нужно лаунчеру (в данном тест варианте лаунчер просто записывает в триггеры за его пределами единицу, шаг за шагом, выходя которых подключены к диодам, на данной платке они инверсные поэтому следуют за элементов not). Выход onActivate отправляет сигнал запуска повторного цикла управляющей пары сигналов, а выход outFurther просто пропускает (out) и актуализирует (further) управляющие сигналы далее по цепи активаторов.
Как работает активатор — именно он демонстирует больше всего возможности асинхронной — статической логики (оная интересна тем, что реализовать её можно на любом носителе, мной используется бинарная, но вот тут в симуляции как раз и показано то, что имея всего два типа сигналов и в данном случае два входящих контакта, расширять логику можно на большее число контактов без каких‑либо дешифраторов, может это и не весть какая новость — но тем не менее очень интересно). Третий триггер может и не нужен, но я не стал ломать сильно голову над идеальностью схемы, так как предназначение лаунчера, сейчас, достаточно такое — опосредованное. В анимации симуляции всего два активатора, чтобы хоть как‑то было видны метки возле пинов и элементов, а так можно ставить сколько угодно. Анимация созданна в программе Peek. Файл схемы для Logisim https://disk.yandex.ru/d/ao689KWR5D0FWw
Во вьювере тест модуль выглядит так
Код проекта
module Trs
(input S, R, output reg Q);//reg
//reg Q;
always @(R, S)
begin
if(R)
Q <= 1'b0;
else if(S)
Q <= 1'b1;
end
endmodule
module Chain (input on, off, output out);
Trs t1(on,off,out1);
Trs t2(out1,off,out2);
Trs t3(out2,off,out3);
Trs t4(out3,off,out4);
Trs t5(out4,off,out5);
Trs t6(out5,off,out6);
Trs t7(out6,off,out7);
Trs t8(out7,off,out8);
Trs t9(out8,off,out9);
Trs t10(out9,off,out);
endmodule
module SetChain (input on, output out,further);
wire reset0,reset1;
Chain Ch1(on,reset0,out);
Chain Ch2(out,further,reset0);
Chain Ch3(reset0,reset1,further);
Chain Ch4(further,on,reset1);
endmodule
module mkick (output led);
wire w4;
wire w0=0;
Trs trs1(w4,w0,wt);
not n0(led, wt);
Trs trs2(led,w0,w2);
Trs trs3(w2,w0,w3);
Trs trs4(w3,w0,w4);
endmodule
module activate (input out, further, output out1, onActivate,OutFurther);
wire wi0=0;
wire wi1,onout2,onTrsReset,outTrsReset;
bufif1 bf1(on,out,wi1);
Trs Tout(on,wi0,onout1);
bufif1 bf2(onFurth,onout1,further);
Trs TFurth(onFurth,wi0,onWi1);
xor xs1(onout2,onout1,onWi1);
bufif1 bf3(out1,out,onout2);
not n1(wi1, onWi1);
bufif1 bf4(OutFurther,out,onWi1);
Trs TrsReset(onout2,onTrsReset,outTrsReset);
and An1(wA1,outTrsReset,onWi1);
not n2(notfurther,further);
bufif1 bf5(onActivate,wA1,notfurther);
bufif1 bf6(onTrsReset,out,wA1);
endmodule
module Launcher (output Limit,Fills, Unit, Run);
wire zero=0;
wire out;
mkick k1(kick);
bufif1 (on,kick,kick);
Trs t1(on,out,on1);
SetChain Sc1(on1,out,further);
activate act1(out,further,Limit,onActivate0,Outfurther1);//activate act1(out,further,Limit,onActivate0,Outfurther1);
bufif1 (on,onActivate0,onActivate0);//onActivate0);
activate act2(Outfurther1,further,Fills,onActivate1,Outfurther2);
bufif1 (on,onActivate1,onActivate1);
activate act3(Outfurther2,further,Unit,onActivate2,Outfurther3);
bufif1 (on,onActivate2,onActivate2);
activate act4(Outfurther3,further,Run,onActivate3,Outfurther4);
endmodule
module Test (output led0, led1, led2, led3);
wire wi0 = 0;
Launcher La1(on0,on1,on2,on3);
Trs t1(on0,wi0,onled0);
Trs t2(on1,wi0,onled1);
Trs t3(on2,wi0,onled2);
Trs t4(on3,wi0,onled3);
not n0(led0,onled0);
not n1(led1,onled1);
not n2(led2,onled2);
not n3(led3,onled3);
endmodule
Распинова для tangnano9k мало чем отличается от распиновке в примере https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-9K/examples/led.html
На подходе к завершению демка кэша команд процессора, под спойлером тоже вставлю анимацию, проект почти закончен в Verilog, осталось немного. Секундомер для того, чтобы давать описания действий в симуляторе
Скрытый текст
Файл схемы для Logisim
В планах так-же поработать над асинхронным АЛУ для процессора. Вообще планируется полностью отличная архитектура вычислительной машины, основной концепцией которой будет асинхронная логика (с перспективой реализации архитектуры на статической), в которой каждый сигнал будет распространяться с естественной для него скоростью, обусловленной скоростью распространения в среде - носителе. Разумеется плюс-минус обусловленность скоростью срабатывания некоторых элементов, но основной упор в схемах будет на то, что те все будут приведены в нужное состояние перед задействованием. Как минимум архитектура мной будет задействована в планируемом проекте сварочного робота, а там - посмотрим, может ещё где. Началось всё с машинного зрения, потом была алгоритмизация и анализ кода - и потом уже пришёл к выводу, что архитектуру лучше полностью делать свою. Делаю по мере возможностей.
В самом конвейере я конечно использую блок генерации схемы, но тут просто пока не выкладываю код. Генерирует очень хорошо
module Mych(input clk, output wire led0,led1, led2,led3,led4,led5);
wire Zero = 0;
wire [0:0]se[0:5];
wire [0:0]se2[0:5];
wire [0:0]lim[0:5];
wire [0:0]Fills[0:5];
wire [0:0]ActivMemo[0:5];
wire Start0,Start, Start1, Set, Fillsin1, EndFillsin, StartTact1;
wire Finish, FinishTact, Unit,InJamp, StartTact,Deactivation, One;
wire sens, led;
wire limfil,fils;
genvar i;
generate
wire [0:2]OtJam, OutFillsi[0:5], OutStu1[0:5], OutFStu[0:5], OutFStu1[0:5], ORi[0:5], Fini[0:5];
MyCF mycf(Deactivation,StartTact, Set, ResLim, ResFil, fils, limfil, One, Zero, Unit,InJamp,,,,
,fils,se2[0],Fini[0],ORi[0], OutFillsi[0], OutStu1[0], OutFStu[0], OutFStu1[0], ActivMemo[0]);
bufif1 bf0(FinishTact, ActivMemo[0], ActivMemo[0]);
bufif1 bf1(Finish, Fini[0], Fini[0]);
for (i=0; i<4; i=i+1 ) begin:MyC_generation
MyC myc(Deactivation,StartTact, Set, ResLim, ResFil, fils, limfil, One, Zero, Unit, ORi[i], OutFillsi[i], , OutFStu[i], OutFStu1[i]
,Zero,se2[i+1], Fini[i+1],ORi[i+1], OutFillsi[i+1], , OutFStu[i+1], OutFStu1[i+1], ActivMemo[i+1], se2[i]);//OutStu1[i]
bufif1 bf0(FinishTact, ActivMemo[i+1], ActivMemo[i+1]);
bufif1 bf1(Finish, Fini[i+1], Fini[i+1]);
end
MyC myc(Deactivation,StartTact, Set, ResLim, ResFil, fils, limfil, One, Zero, Unit, ORi[4], OutFillsi[4], , OutFStu[4], OutFStu1[4]
, limfil,se2[5], Fini[5],ORi[5], OutFillsi[5], , OutFStu[5], OutFStu1[5], ActivMemo[5], se2[4]);
endgenerate
Run(clk,FinishTact,Finish,StartRun,Deactivation,StartTact,Set);
not (led0 , ActivMemo [0]);
not (led1 , ActivMemo [1]);
not (led2 , ActivMemo [2]);
not (led3 , ActivMemo [3]);
not (led4 , ActivMemo [4]);
not (led5 , ActivMemo [5]);
endmodule
В нём просто поочерёдно будут загораться и гаснуть диоды, с интервалом в секунду.
На этом пока всё, есть куча дел других, поэтому проект демки конвейера, или кэша команд, будет готов примерно через пару недель. Делается всё нормальными темпами — каждый день в будние дни по часу‑два, в выходные примерно так‑же (так как куча других дел), основным тормозом работ было то, что в FPGA я новичок, но это уже постепенно уходит на задний план.
Комментарии (18)
accurate_random Автор
30.10.2024 07:27Поправил публикацию по части статической логики
Спасибо за замечания. Единственное, что попробую некоторые из них поправить в свою очередь — Термины «статический»/«динамический», применяемые к комбинационным схемам, не следует путать с этими же терминами, употребляемыми для обозначения запоминающих устройств, например динамического (DRAM) или статического (SRAM) ОЗУ (RAM). С остальными аргументами согласен по части асинхронной логики— был невнимателен и принял перспективу за действительность (хотя, эта перспектива далеко не вершина идеала). В действительности, как мне стало понятно, сравнение статической логики и динамической эквивалентно сравнению диодно‑транзисторной и резисторно‑транзисторной, то‑есть тут весь фокус именно в реализации элементов осуществляющих работу логики на схеме.
На замечания по части того, что я тут новичок - посчитал справедливым доделать асинхронный триггер на базе примитива DLC. Тут разработчики пошли на техническую хитрость ( на самом деле в нормальных схемах никогда и не прийдёт одновременный сигнал установки единицы и сброса, но они и не обязаны вовсе раскрывать каких-то секретов, да ещё и в документации) - весь фокус в принципе работы элемента AND -
Причина этого успеха заключается в том, что логический элемент AND, при подаче даже сигнала нуля на один из своих входов - уже выдаёт на выходе 0, даже при входящем сигнале Z на втором входе.
Но это моё личное мнение. В подвтерждение оному могу только добавить, что раз одновременно приходит сигнал единицы и на сброс и на запись в триггер - то в такой схеме, возможно, есть и другие ошибки, например в виде приходящих одновременно сигналов нуля и единицы на один провод. Но - это моё личное мнение.
Прав я или не прав со своей логикой - не знаю, но то что я получил, "опираясь" на неё, более изящный асинхронный триггер - факт. Работают они одинаково, а вот примитив DLC будет явно попроще примитива DLATCHSR, который вставляет в синтезируемую схему среда (разработчики).
Thealik
30.10.2024 07:27Вы привели перевод из документации Gowin? Попробуйте найти аналогичный триггер в документации Lattice. Я думаю, что Gowin взял за основу (мягко говоря) их наработки. Ещё можно посмотреть старые Xilinx, типа Spartan 3. В них, насколько я помню, структура CLB такая же, как у Lattice. Кстати, схема триггера почти наверняка реализована на pass-transistor logic. Позволяет ли Gowin tool (как он там называется?) измерить задержку трассировочного соединения? Нет? И задержку элемента непонятно откуда вытаскивать? Что же это за tool такой? :)
engin
30.10.2024 07:27Так же и моя тема которую автор своей терминологией вогнал в ступор общего понимания.
Речь идет об организации работы во времени, когда микропроцессоры делят на синхронные и асинхронные.
Синхронные - микропроцессоры, в которых начало и конец выполнения операций задается таймером, то есть время выполнения любой операции совершенно не зависит от вида команды или величины операндов.
Асинхронные, напротив, выполняют каждую следующую операцию после сигнала окончания выполнения предыдущей операции, то есть по факту. Чтобы повысить эффективность вводят специальные электронные цепи, обеспечивающие автономность работы.
Суть в том, что закончив работу над последней операцией, вырабатывается сигнал запроса, показывающий готовность к выполнению новой операции.
Я предпринял попытку симуляции асинхронного MCU в среде LabView, что в конечном итоге натолкнуло на идею создания софт контролера. В его реализации на уровне работы с аппаратной частью программная часть логического ядра управляет набором настраиваемых FSM, а аппаратная I/O взаимодействует посредством UART, что позволяет конфигурировать топологию периферии и ее типы под довольно большой сегмент алгоритмов в автоматике или робототехнике.checkpoint
30.10.2024 07:27Очень интересно. А можете привести пример простейшего асинхронного КА (FSM), то есть без сигнала тактирования. Как-то в голове не укладывается как такое может работать. :)
Thealik
30.10.2024 07:27Простейшая FSM - это, например, счётчик (делитель частоты на два). По определению в таких FSM может переключаться только один элемент. Другими словами, невозможна ситуация, когда нескольким элементам сразу "выдано разрешение" переключиться. Это последовательные асинхронные схемы. Они, очевидно, мало что могут вычислять, только управлять. С вычисляющими (комбинационными) схемами сложнее. Пример вот
engin
30.10.2024 07:27Конечно автоматы работают под собственным тактированием, что по другому никак не возможно в его жизни, но при этом он автономен и сидит в зале ожидания своей очереди со остальными и ждет когда его примут. В моем случае это внешняя аппаратная команда которая сообщает этому FSM - "Запускайся и делай что тебе положено в соответствии с своей миссией в общем деле".
Попросту говоря ведомый и ведущий где каждый под своим тактированием. Босс у которого свои мозги и бьющееся сердце и подчиненный со своими мозгами и сердцем, причем и тот и другой под собственными, не связанными процессорными платформами, они общаются друг с другом посредством коммуникаций :)Thealik
30.10.2024 07:27Проблем точно не будет? А как же пересечение clock domains? Синхронизатор не нужен? Посмотрите что внутри у GPU. Хотя, я не уверен, что даже производители российских SoC могут найти в схеме синхронизатор и его разновидности. Просто купили (?) IP, какой-нибудь Mali или PowerVR. Для программиста аппаратные "проблемы" выражаются в принудительной синхронизации потоков, использованию атомарных операций и mutex. Это терминология CUDA, я не знаю как в OpenCL называются те же самые вещи. И да, существуют экзотические globally asynchronous locally synchronous, GALS.
engin
30.10.2024 07:27Верно то, что если сигнал не утверждается достаточно долго и не регистрируется, он может оказаться асинхронным на границе входящего тактового сигнала.
Когда сигнал меняется слишком близко к фронту тактового сигнала, существует вероятность, что регистр не "поймает" нужное состояние, и это может привести к неправильной интерпретации данных. Такие ситуации могут вызывать метастабильные состояния, когда регистр оказывается в промежуточном состоянии, что, в свою очередь, может привести к непредсказуемому поведению всей системы. Для предотвращения подобных проблем в цифровых системах часто используются специальные схемы синхронизации, такие как дублирующие регистры или специальные временные задержки, чтобы гарантировать, что сигнал будет стабильным в течение достаточного времени перед тем, как будет обработан. Также важно правильно выбирать параметры временных задержек и тактовой частоты обеих несвязанных систем при их одновременном запуске чтобы минимизировать риск появления асинхронных состояний.
Thealik
30.10.2024 07:27LabView? Высокоуровнево. Интересно, чем этот способ принципиально отличается от блок-схем алгоритмов? Тем, что блоки могут быть произвольной сложности. А качество компиляции какое? Это можно проверить на бенчмарках. Где их взять? Например здесь
engin
30.10.2024 07:27От блок схем он категорически отличается тем что классифицируется сам по себе языковой графической парадигмой и отнесен к языкам линейки G. Это IDE, который на 98% собран на С и имеет встроенный компилятор, на выходе которого получаем *.exe, так же присутствует инструмент для исполнения инсталянта на базе скомпилированных проектов.
То что Вы смотрели в моем линке, это компилянт, весит до неприличия смешной объем и может устанавливаться на очень не требовательные CISC x86 архитектуры от таблетов, IPC и т.д.
Где взять?... Кто дает в опенсорсах, там и брать.
accurate_random Автор
30.10.2024 07:27Так же и моя тема которую автор своей терминологией вогнал в ступор общего понимания.
Согласно описанию асинхронной логики, из книг и учебников мной применяется терминология касательная ее. А что не так? Можно уточнить? Или это была просто такая уникальная претензия - чисто риторическая? А почему бы вам не упражняться искусству риторики было и далее - в своей теме? Я сюда вроде не на огонёк зашёл, тема по предмету проделанной работы, искусствоведения не касался. Или я посягнул на что-то?
engin
30.10.2024 07:27Или это была просто такая уникальная претензия - чисто риторическая? А почему бы вам не упражняться искусству риторики было и далее - в своей теме? Я сюда вроде не на огонёк зашёл, тема по предмету проделанной работы, искусствоведения не касался. Или я посягнул на что-то?
То что я описал в нескольких предложениях, Вами было уж очень витиевато изложено с мало понятной терминологией, в довесок со скриптом, который не всем знаком.
Тема мне близкая, статья Ваша. варюсь в этом далеко не 1 год и от того раз уж ее здесь ее поднимают, мне интересно развивать диалог, иметь адекватные вопросы и называть вещи своими именами. Ежели имена придумывались, то хотя бы подкреплять терминологию примерами на спичках.
Не в претензиях, больше того в свое время я так же имел подобные грабли и с благодарностью воспринимал здоровую критику, учился понимать и называть все так, как всем понятно.
Thealik
Интересные опыты. Правда, выражение "статическая логика" больше известно в другом контексте. В асинхронных схемах своя терминология и свои допущения. Кроме того, в этих схемах исключительную роль играет внешняя среда. Если объединить эти два пункта в одно короткое понятие, то получится "соотношение задержек" (вражеский путь, adversary path). Например, С-элемент можно сделать соединив выход LUT с одним из входов. Такая схема работоспособна, но при определённых соотношениях задержек. Если они не выполняются, то нужно "лезть внутрь" LUT и рассматривать каждый мультиплексор как отдельный элемент. Это было сделано в статье
Towards Hazard-Free Multiplexer Based Implementation of Self-Timed Circuits
Чтобы реализовать эту схему ни одно из известных семейств FPGA не подходит. Lattice, Efinix, Gowin, Anlogic тоже не подходят. Почему? Нужно подсоединиться к точке, к которой подсоединиться нельзя. К счастью, китайцы не всегда копируют известное один-в-один. Xist FPGA подходят, Sealion 2000 называются.
accurate_random Автор
Спасибо.
В плане архитектуры контекст примерно один, а так разумеется различия есть, правда я их пока особо не увидел. Но я не настаиваю - ведь я новичок.
А так вообще вот:
Ну и разумеется реализовывать архитектуры и процессоры со статическим ядром ничего не мешает на обычных FPGA, как минимум тут можно и отладить и увидеть плюсы и минусы, ну и даже использовать потом. А так - это только начало моего пути в мир статической архитектуры, логики, да и вообще FPGA.
Больше комментария в день не могу - ограничения, да, думаю и не надо.
nckma
Может Вам, если Вы новичок, для начала освоить традиционную тактируемую логику в FPGA?
VelocidadAbsurda
Нестыковка в терминологии, на которую вам указали выше, не совсем об этом. Асинхронная и статическая логика - не одно и то же. О статичности в основном говорят как раз в контексте синхронной логики - схема, которой можно безболезненно остановить тактирование, затем возобновить, и она продолжит работать из состояния, которое было в момент останова. Пример навскидку - классический Z80 с остановленным клоком может сохранять состояние сколь угодно долго, пока запитан. Антипример - в DRAM, поставленной на паузу, разрядятся конденсаторы, состояние забудется. При этом и то, и другое - в целом синхронные схемы. Или совсем уж базовый элемент - D-триггер в классической реализации синхронен (нуждается в тактировании) и статичен (сохраняет состояние при остановленном тактировании).
checkpoint
Самый явный пример нестатичного процессора - классический MOS 6502. Минимальная частота тактирования составляет 500 кГц, ниже которой его машина состояний начинает "зависать".
Еще читал у Кена Шерриффа статью про анализ кристалла 80386, там половина ячеек сделана по упрощенной схеме - транзистор + конденсатор. То есть 386-й уже был не статичным.