Про асинхронную логику.

May 27, 2006 16:33

Я произвел небольшой эксперимент. На умножитель мне не хватило усидчивости, но до сумматора с групповым переносом я добрался. ;)

Сперва напомню про таблицы истинности.

Для обычной логики они таковы:

X|Y|И|ИЛИ
0|0|0| 0
1|0|0| 1
0|1|0| 1
1|1|1| 1

Для И нулем (z) является 0, для ИЛИ - 1.

В асинхронной логике добавляется состояние N, "не готов." Прямая адаптация таблицы истинности для асинхронной логики будет учитывать свойство нулей (что_угодно {И/ИЛИ} соответствующий_ноль = соответствующий_ноль).

Вот они:

X|Y|И|ИЛИ
N|N|N| N
0|N|0| N - вот...
1|N|N| 1 - и вот - использование соответствующих нулей.
N|0|0| N
0|0|0| 0
1|0|0| 1
N|1|N| 1
0|1|0| 1
1|1|1| 1

Другие авторы используют другие таблицы истинности - там если хотя бы один из входов не готов, то и результат тоже не готов. Это, по-моему, не очень верно.

Теперь можно вернуться к эксперименту.

Я довольно давно написал генератор текста на тикле из описания схем на Хаскеле. ;)

Затем этот текст засасывается моим "графическим" симулятором на все том же тикле и схему можно дергать за ее входы, исследуя то, что будет на выходе.

Сегодня я модифицировал этот симулятор, чтобы он понимал значение "не готов" и добавил кнопочку, которая сбрасывает все выходы схемы и ее внутренние сигналы в это состояние, на диаграмме оно помечается 'x'.

А вот и результаты эксперимента:

i:carry -> _____________------------
i:x_1 -> _------------------------
i:x_2 -> _________________________
i:x_3 -> _------------------------
i:x_4 -> _________________________
i:y_1 -> _________________________
i:y_2 -> _------------------------
i:y_3 -> _________________________
i:y_4 -> _------------------------
o:outcarry -> _xxxxxx______xxxxxx------
o:outpropagate -> _xxxx--------xxxx--------
o:s_1 -> _xxxx--------xxxxx_______
o:s_2 -> _xxxxx-------xxxxxx______
o:s_3 -> _xxxxxxx-----xxxxxxxx____
o:s_4 -> _xxxxx-------xxxxxx______

Глубина схемы, согласно моей программе, 12 вентилей. Однако мы благополучно справляемся за 7-8 шагов по вентилям (7.5 в среднем). Это прямое ускорение на 30%.

Если сравнивать с синхронной схемой, получается вот, что: пусть синхронная схема справлялась за секунду. Мы раздули ее вдвое, и должны были бы справляться за две секунды. Однако, мы справляемся всего за 2*7.5/12=1.25 секунды, то есть, потери по скорости составляют всего 25%, а не все 100%.

Я думаю, что этот результат можно еще слегка улучшить - в настоящей асинхронной схеме инвертирование не имеет накладных расходов, поскольку достигается просто заменой проводов, а этого я в эмулятор еще не внес.

результаты, асинхронный дизайн, важное

Previous post Next post
Up