Асинхронный арбитр
2016-08-26 12:58![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Столкнулся с необходимостью изобразить на FPGA асинхронный арбитр. Это такая схема, которая определяет, который из двух сигналов поступил раньше. Для ASIC задача решается так:

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

Выглядит как простая цифровая схема, но на самом деле здесь решается нетривиальная проблема фильтраци метастабильного состояния, аналоговая по своей сути. Об эту тему много копий сломано и научных статей написано. Для FPGA качественного решения не существует. В идеале изготовители FPGA должны бы закладывать в архитектуру чипа некоторое количество модулей-арбитров. Увы, в нынешних чипах от Xilinx и Altera их нет, поэтому приходится измышлять решения "на коленке". Пока думаю обойтись двумя вентилями NAND2, а в качестве фильтра метастабильности задействовать пару MUX7. По идее, всё это должно поместиться в один слайс. Еще можно попробовать вместо NAND2 использовать штатную RS-защелку типа FDCPE. У неё есть асинхронные входы для сброса и установки. Да и время выхода из метастабильного состояния должно получиться поменьше.
no subject
Date: 2016-08-26 20:28 (UTC)no subject
Date: 2016-08-26 21:05 (UTC)no subject
Date: 2016-08-26 21:11 (UTC)no subject
Date: 2016-08-26 21:47 (UTC)no subject
Date: 2016-08-26 21:52 (UTC)Идея в том, чтобы как можно сильнее приблизиться к атомарной конструкции. Чем больше элементов, тем больше связей, и тем больше места/времени для осцилляции. А LUT6_2 с фидбеком, который гарантированно будет проведен внутри слайса - это "почти" атомарный элемент-арбитр.
no subject
Date: 2016-08-26 22:18 (UTC)no subject
Date: 2016-08-27 00:19 (UTC)no subject
Date: 2016-08-27 00:49 (UTC)Пожалуй ты прав, LUT6_2 будет хорошим решением. Надо будет проверить на реальном железе.
no subject
Date: 2016-08-27 00:55 (UTC)no subject
Date: 2016-08-27 01:07 (UTC)Типа такого:
no subject
Date: 2016-08-27 01:30 (UTC)Впрочем, если написать
{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.
no subject
Date: 2016-08-27 02:19 (UTC)Это на Spartan входы MUX7 жёстко привязаны к выходам MUX6.
А на Virtex7 они идут к выходам LUT6.
Ровно то, что нужно.
На спартане можно задействовать MUXF5_D.
Можно и второй LUT задействать для фильтра, да.
no subject
Date: 2016-08-27 02:26 (UTC)К выходам двух разных LUT6, а не одной LUT6_2.
no subject
Date: 2016-08-27 06:32 (UTC)