Почему-то считается, что асинхронную логику нельзя засунуть в традиционную 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: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)