vak: (Улыбка)
Serge Vakulenko ([personal profile] vak) wrote2016-08-26 12:58 pm

Асинхронный арбитр

Столкнулся с необходимостью изобразить на FPGA асинхронный арбитр. Это такая схема, которая определяет, который из двух сигналов поступил раньше. Для ASIC задача решается так:

Выглядит как простая цифровая схема, но на самом деле здесь решается нетривиальная проблема фильтраци метастабильного состояния, аналоговая по своей сути. Об эту тему много копий сломано и научных статей написано. Для FPGA качественного решения не существует. В идеале изготовители FPGA должны бы закладывать в архитектуру чипа некоторое количество модулей-арбитров. Увы, в нынешних чипах от Xilinx и Altera их нет, поэтому приходится измышлять решения "на коленке". Пока думаю обойтись двумя вентилями NAND2, а в качестве фильтра метастабильности задействовать пару MUX7. По идее, всё это должно поместиться в один слайс. Еще можно попробовать вместо NAND2 использовать штатную RS-защелку типа FDCPE. У неё есть асинхронные входы для сброса и установки. Да и время выхода из метастабильного состояния должно получиться поменьше.

[identity profile] spamsink.livejournal.com 2016-08-27 12:55 am (UTC)(link)
Понятно, что если сначала меняется in[1], а потом почти мгновенно in[0] (пока out[0] еще не успел обернуться через фидбек), то на out[1] будет glitch. Трудность в том, что это невозможно отловить, добавляя буфера или инверторы, поскольку их задержка больше, чем задержка фидбека. Тут надежда на то, что вероятность такой разницы во времени минимальна.

[identity profile] spamsink.livejournal.com 2016-08-27 01:30 am (UTC)(link)
На вЫходе, ты имел в виду? MUXF7 не получится, потому что у них входы фиксированы.
Впрочем, если написать
{3, 0}: out = 1; // in[0] wins

{3, 3}: out = 2; // this means that in[1] came slightly earlier and it should win

то глитч будет не overlapping, а included, дальше можно будет написать
out_final[1] = out[1];
out_final[0] = out[0] & ~out[1];

Т.е. выйдет два LUT6_2, один из которых реально 4->2, а другой 2->2.

[identity profile] spamsink.livejournal.com 2016-08-27 02:26 am (UTC)(link)
А на Virtex7 они идут к выходам LUT6.

К выходам двух разных LUT6, а не одной LUT6_2.