Первое, что я столкнулся когда только попробовал - это сумматор в АЛУ БЭСМ6.
Хотя есть и микросхемы сумматоров с быстрым переносом и в FPGA есть готовые блоки DSP, но все-же они не безразмерные и объединить их хочется как в БЕСМ6 с синхронным переносом за один (короткий!) такт.
И сразу напоролся на грабли - по документации операция сложения в среднем происходит за 9 тактов (да по статистике в среднем 9 переносов если брать случайные числа). Но у меня выходит даже без переносов, на выходе будет значение не раньше чем на 3-ем такте:
1- запись значения в регистр В (и если нужно сброс регистра А) на выходе при это еще старое значение А!
2 - неполное суммирование A ^ B и формирования переносов (A & B)<<1. В при этом еще не 0 поэтому результат еще не готов.
3 - то-же, что и в 2, только В уже новый 0-вый (у нас самый простой пример без переносов), тут уже формируется сигнал готовности, но доступен он будет на выходе, только в следующем такте!
4 - сумма на выходе сумматора и данные готовы, аккумулятор может в этом такте уже принимать новые данные, поэтому этот так уже не считается.
Вопрос, что я делаю не так?
Вроде идея понятная:
- реализовать именно аккумулятор, в который можно либо загрузить значение либо добавить/накопить. так как и команды одноадресные и мультиплексор для выбора значения для В лучше ставить только в одном "плече", там где только быстрая "операция" И, при этом оба "плеча" И и XOR по времени прохождения становятся более-менее сбалансированными. И время такта можно сократить до минимума, выжав максимум из железа.
Но:
- почему 3 такта на ровном месте?
- подозреваю, что XOR в "парафазной" логике реализуется быстрее чем обычной с дополнительными инверторами.
- в FPGA борще по барабану что AND что XOR там все на LUTах сделано и задержка теоретически одинакова, в зависимости от количества входов, там и мультиплексоры сольются в один каскад комбинаторной логики.
- а в ASIC-е еще можно городить этажерки мосфетов и склеить НЕИНЕ в один каскад с задержкой распространения примерно как у И и еще подкорректировать площадь затворов, подгоняя время фронтов чтоб вообще сровнять 1:1 скорости.
Тогда вопрос как писать HDL код ? Для рассыпухи один, для ASIC другой а для FPGA вообще третий? А чем нам тогда вообще HDL код на FPGA поможет в разработке ASIC-а если он вообще другой и тайминг другие?
Вот схемка в digit, примерчик аккумулятора, я даже индикаторы пририсовал с права внизу для наглядности:
Буду благодарен если меня кто-то просветит.