Почему-то считается, что асинхронную логику нельзя засунуть в традиционную 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:06 (UTC)no subject
Date: 2016-09-12 07:17 (UTC)no subject
Date: 2016-09-12 07:26 (UTC)no subject
Date: 2016-09-12 08:44 (UTC)ERROR: [DRC 23-20] Rule violation (LUTLP-1) Combinatorial Loop - 1 LUT cells form a combinatorial loop. This can create a race condition. Timing analysis may not be accurate. The preferred resolution is to modify the design to remove combinatorial logic loops. To allow bitstream creation for designs with combinatorial logic loops (not recommended), use this command: set_property SEVERITY {Warning} [get_drc_checks LUTLP-1]. NOTE: When using the Vivado Runs infrastructure (e.g. launch_runs Tcl command), add this command to a .tcl file and add that file as a pre-hook for write_bitstream step for the implementation run. c/lut.
Еще софт любит ругаться, когда не все входы LUT задействованы в формуле: "[DRC 23-20] Rule violation (PDCN-1569) LUT equation term check - Used physical LUT pin ... is not included in the LUT equation". Приходится совсем отключать проверку DRC 23-20.
no subject
Date: 2016-09-12 14:01 (UTC)no subject
Date: 2016-09-12 19:04 (UTC)no subject
Date: 2016-09-12 19:20 (UTC)no subject
Date: 2016-09-12 20:11 (UTC)WARNING: [DRC 23-20] Rule violation (PDCN-1569) LUT equation term check - Used physical LUT pin 'A5' of cell m9/m/f/LUT6 (in m9/m/f macro) is not included in the LUT equation: 'O6=(A1*(~A2)*(~A6))+((~A1)*A2*A6)'. If this cell is a user instantiated LUT in the design, please remove connectivity to the pin or change the equation and/or INIT string of the LUT to prevent this issue. If the cell is inferred or IP created LUT, please regenerate the IP and/or resynthesize the design to attempt to correct the issue.
no subject
Date: 2016-09-12 20:22 (UTC)no subject
Date: 2016-09-12 20:25 (UTC)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 пока не могу показать. Увы, не нашёл еще.
no subject
Date: 2016-09-12 09:03 (UTC)no subject
Date: 2016-09-12 19:06 (UTC)С какой скоростью - другой вопрос. Но тут нужно сначала определиться, что мы понимаем под скоростью и как её измерять.
no subject
Date: 2016-09-12 19:16 (UTC)no subject
Date: 2016-09-12 19:34 (UTC)https://pure.tue.nl/ws/files/1586509/515168.pdf
no subject
Date: 2016-09-12 19:28 (UTC)Альтернативно, синтезируешь ту же фунциональность синхронно (без DSP, чтобы честно сравнивать) и смотришь, на какой частоте Xilinx скажет, что оно будет работать.
no subject
Date: 2016-09-12 19:44 (UTC)Надо будет придумать что-нибудь более убедительное.