Почему-то считается, что асинхронную логику нельзя засунуть в традиционную FPGA. Я решил поисследовать этот вопрос. Чем дольше разбираюсь, тем яснее становится, что это просто предубеждение. Я взял популярную плату Digilent Basys3 на основе чипа Xilinx Virtex-7, и стал смотреть, что тут можно сделать.
Основа асинхронной логики - несколько базовых примитивов: C-элемент, арбитр, S-элемент, T-элемент. Все их удалось реализовать на имеющейся FPGA. Вот, к примеру, как выглядит двухвходовый С-элемент Мюллера:

Это трёхвходовый С-элемент:

Арбитр штука более сложная. К счастью, нынешние чипы FPGA, так называемое семейство Xilinx 7 Series, в качестве базового элемента имеют логическую таблицу LUT6_2 с двумя независимыми выходами. Это даёт возможность построить асинхронный арбитр со стабильными характеристиками:

S-элемент и T-элемент представляют собой кирпичики для построения так называемых секвенсеров, блоков управления другими компонентами. В принципе, их можно собирать из С-элементов и базовой логики, но через LUT6_2 получается заметно компактнее:

Т-элемент вообще помещается в одну ячейку LUT6_2:

Основа асинхронной логики - несколько базовых примитивов: C-элемент, арбитр, S-элемент, T-элемент. Все их удалось реализовать на имеющейся FPGA. Вот, к примеру, как выглядит двухвходовый С-элемент Мюллера:

Это трёхвходовый С-элемент:

Арбитр штука более сложная. К счастью, нынешние чипы FPGA, так называемое семейство Xilinx 7 Series, в качестве базового элемента имеют логическую таблицу LUT6_2 с двумя независимыми выходами. Это даёт возможность построить асинхронный арбитр со стабильными характеристиками:

S-элемент и T-элемент представляют собой кирпичики для построения так называемых секвенсеров, блоков управления другими компонентами. В принципе, их можно собирать из С-элементов и базовой логики, но через LUT6_2 получается заметно компактнее:

Т-элемент вообще помещается в одну ячейку LUT6_2:


no subject
Date: 2016-09-12 07:07 (UTC)Так вот а как в асинхронной логике с коммутацией шин данных? Там же по разным битам будут совсем разные задержки ведь. И чего тогда будет? Эти задержки нужно учитывать и анализировать, или же там концепция работы совсем другая?
Ну и да. Вы ссылочки часто даёте весьма полезные. Нет ли где-нибудь какого не шибко сложного Reference Design, что бы посмотреть на практическое применение асинхронной логики?
no subject
Date: 2016-09-12 19:23 (UTC)arbitrate reqA then process_request_A() | reqB then process_request_B() endШина по определению есть соединение, к которому подключено несколько устройств. Здесь нет шин в этом понимании, только соединения точка-точка, называемые каналами. Задержки по разным проводам в канале будут разные, но это несущественно. Сообщение считается добежавшим, когда фронт пришёл по каждой из пар 0/1. Это называется Dual Rail Logic.Законченный практический reference design пока не могу показать. Увы, не нашёл еще.