Search
Write a publication
Pull to refresh
10
0
Send message

Я не знаю что такое гигачат. А узнать я хотел всего лишь как устроен логический блок в китайских FPGA, которые пока не вышли за пределы Китая и требуют регистрацию. Таких фирм по крайней мере две - Hercules и Ehiway.

Проблема описана выше, а потом ещё и намёкнуто на то, что она описана выше. У меня нет ни китайского мейла ни китайского номера телефона.

Feedback, в смысле отзывы, предполагают замыкание, не так ли? :) Будем считать это рекламой. Неплохо бы там же разместить набор страниц, выдернутых из документации каждого производителя. На странице нарисован логический блок. Нужно знать куда попадёт код. В то, что производитель покажет как устроен коммутатор я не верю. Надёргать страницы - это работа для волонтёров. С ними я и поделился ссылкой.

Интересно какой отчёт даст Yosys после компиляции того же самого кода. Скорей всего для оптимизации Gowin использует ABC, как и Yosys. Тем временем появился другой (русскоязычный :) оптимизатор

https://arxiv.org/abs/2412.14933

А может взять и посмотреть кто из производителей даёт самый быстрый сумматор в железе? Не по типовой измеренной задержке, а по схемотехнике. Да, эти сумматоры почти одинаковые, а вдруг? Тем более, что некоторые китайские фирмы вдруг ожили и обновили ассортимент. Правда, чтобы скачать документацию (на китайском) нужно зарегистрироваться, а для этого может потребоваться китайский email и/или китайский номер телефона. Вот исчерпывающий список производителей FPGA.

https://github.com/FPGA-Systems/fpga-awesome-list

Философский оффтоп. Когда-то М.Л. Цетлин придумал термин "целесообразное поведение". На предыдущем витке искусственного интеллекта целесообразное поведение описали математически. Представим теперь, что кто-то взял нейросеть и решил её обучить на наследии Черномырдина. Потом, в качестве не гумманитарного (и не гуманного) эксперимента эту нейросеть заставили написать про "сумматор". Как Черномырдин должен реагировать на просьбы? А на конструктивную критику? Какое поведение для Черномырдина является целесообразным?

Запретить - это цензура. Так нельзя, а то пострадает свобода. А как можно? Можно поставить реостат, который ограничивает доступ нейросети к энергии. Человек пишет параграф текста. Если в этом параграфе есть смысл - это увеличивает сопротивление реостата на 10%. Думаю, что я уже подвинул ползунок реостата на середину. Или у кого-то сомнения, в том, что про "сумматор" пишет не нейросеть?

Ваше упрямство достойно лучшего применения. Вы хотите использовать ключи, а по сути отдельные транзисторы? Пожалуйста. Вот относительно хорошая схема сумматора на транзисторах
https://patents.s3.yandex.net/RU2164036C2_20010310.pdf
Переделайте её так, чтобы вместо pMOS и nMOS транзисторов был ключи. Перед этим найдите в схеме два элемента 2ИЛИ-НЕ и инвертор. Потом уже можете почитать описание патента и найти там формулу XOR3 для суммы. Интереснее посмотреть на формулу для переноса, которая после минимизации должна дать MAJ3. В качестве упражнения, можете задать эту схему на уровне транзисторов в Verilog, ведь этот уровень самый низкий. И здесь приходит разочарование. Все эти действия нужны только для того, чтобы научиться их выполнять, в FPGA нет доступа ни к отдельным транзисторам, ни к отдельным ключам. Есть набор примитивов - LUT, MUX, XOR, FF, конкретные названия приведены в файлах производителя. Эти названия используются для программирования "в примитивах" под названием instantiation. После того, как Вы это поймете, попробуйте соединить два LUT одного блока крест-накрест. Получилось? А могло и не получиться. Всё зависит от возможностей коммутатора (switchbox, PIP). Verilog не позволяет управлять коммутатором вручную, нужно что-то специальное. Этим специальным для Xilinx FPGA является язык XDL. Другие производители такой роскоши не предоставляют.

1) Любую декомпозицию можно записать как булеву формулу, потом раскрыть скобки, получить ДНФ и эту ДНФ минимизировать. Я это сделал. Для выхода суммы в Вашей схеме после минимизации НЕ получилось ожидаемое XOR3. Проделайте всё то же самое сами, может быть у Вас получится. Аргумент о том, что только симулятору можно доверять я не принимаю. Доверять можно и нужно уравнениям. Симулятор нужен для того чтобы проверить динамические процессы. Устанавливать его я не собираюсь, он мне не нужен.

2) FPGA состоит из логических блоков, а каждый блок состоит из LUT, схемы переноса (XOR2 + MUX 2:1), триггеров (защёлок) и настраиваемых связей. Таким образом, инвертора, как отдельного элемента в блоке нет. Чтобы его реализовать нужно использовать LUT целиком. Именно поэтому мне не понятно что Вы хотите сказать схемой из Википедии, где используются AND2 и инверторы. Эта схема предназначена для того, чтобы продемонстрировать функциональную полноту базиза и больше не для чего. Чтобы экономить LUT, а значит площадь, нужно делать декомпозицию во многовходовые элементы (4 или 6 входов, в зависимости от конкретной FPGA). Чтобы реализовать конкретный элемент на конкретной LUT ( по координатам) нужно использовать instantiation. Это самый низкий уровень программирования. Относится ли он к структурному стилю Verilog или нет - не важно, а важно то, что это точная настройка. Про instantiation я уже писал и даже привел конкретный пример для Gowin. Вы не обратили на это внимания.

Да, я не знал о том, что можно прикреплять картинки. Просто потому, что очень редко пишу комментарии на Хабр. Кроме того, у меня не было желания искать как прикрепить картинку. Почему? Потому что я нашёл ошибку в Вашей схеме и исправил её. Вы не сказали мне спасибо, ни за то, ни за другое. Вы всё ещё хотите сделать триггер из сумматора? Могу предложить делитель частоты на два из элементов, составляющих сумматор. Картинка у меня была готовая. Схема на картинке известна с 1956 года и взята из отчёта
J. C. Nelson, "Speed-independent counting circuits," Report no. 71,Digital Computer Laboratory, University of Illinois at Urbana-Champaign, 1956.

1) В ответах нельзя прикреплять картинки. Если Вам лень перевести мои формулы в схему, скопируйте их в Verilog и постройте схему автоматически.

2) Ваш симулятор умеет получать из схемы булевы функции? А минимизировать их? Подсказка - поищите в help-е слова Espresso или ABC. Если таковых нет, подавайте на схему все 8 входных наборов один за другим. Я такими глупостями заниматься не буду, мне достаточно формул, которые после минимизации должны давать XOR3 и MAJ3.

3) Уж коли Вы заговорили об асинхронной схеме, и подаёте входные наборы, то почитайте что такое multiple input change. Неудачное изменение одного набора на другой может привести к состязаниям (hazards). В синхронной схеме состязания заканчиваются к приходу следующего такта. Так специально подбирают. В вашей схеме инвертор на входе мультиплексора - это потенциальная причина состязаний, нужно проверять.

4) Я ожидал, что Вы возразите и скажете, что выходы буферов с переключением в третье состояние можно соединять. Можно, если гарантировать что в 0 или в 1 находится только один из них, а все остальные в Z. Но лучше предусмотреть аппаратную защиту от дурака - либо по управлению, либо запретом на такое соединение. Кроме того, покажите, что китайцы дают возможность подавать на такие буферы сигналы, а не константы.

В заголовке появилось слово "надёжный".
Что ж, проверим. Как? Минимизацией.
Обозначим a=term2; c=term1; b=intransfer;
Тогда два элемента XOR это - d=a^b; e=a^c;
Что такое маленькие треугольнички?
Буферы с выходом в третье состояние? Нет.
Их нельзя соединять по выходу. Это ключи.
А значит имеем два мультиплексора,
которые дают sum=!be+be; carry=!da+dc;
Минимизируем и получаем
sum = !a*c+a*!c; carry = a*b+a*c+b*c;
Перенос правильный, сумма - неправильная.
Как исправить?
Вот так: d=a^b; e=!(a^b); sum=!c*d+c*e; carry=!d*a+d*c;
И чем это лучше встроенного сумматора
d=a^b; sum=d^c; carry=!d*a+d*c ???

А что в этом аниматоре элемента MUX 2:1 нет? Найдите его в схеме сумматора. А потом найдите ещё один такой же.

Сколько слов и всё мимо. Одноразрядный полный сумматор - это две булевы функции, сумма=XOR3 и перенос=MAJ3. Вы это понимаете? Я не уверен. А то, что LUT4 может реализовать любую функцию четырёх и менее переменых Вы понимаете? Я совсем не уверен. Сумматор с минимальной задержкой получится, если реализовать сумму и перенос на двух отдельных LUT4. Зачем Вы используете двухвходовые элементы? Я даже не буду произносить слово декомпозиция. У Вас (среди элементов физически присутствующих в FPGA) есть двухвходовые элементы? Поищите. В лучшем случае найдёте один XOR2 и несколько MUX 2:1. Вы можете подключиться к любому выводу любого элемента? Нет. Всё это делает Вашу схему избыточной, а правильнее сказать, бессмысленной.

Пробежавшись по комментариям, я понял, что люди не понимают что с Вашим сумматором делать дальше, как его встроить во внешнюю среду. С сумматором фон Неймана та же проблема, но хуже. Ему не нужен clock, он работает по принципу запрос-ответ. Что с этим делать? Непонятно. Но интересно. Это и есть ответ на Ваш, надеюсь риторический вопрос, - зачем.

Быстродействие сумматоров улучшают по крайней мере со времен фон Неймана, а именно с 1946 года
A.W. Burks, H.H. Goldstine and J. von Neumann, "Preliminary discussion of the logical design of an electronic computing instrument"
Именно в этой статье получена классическая оценка, что «средняя длина цепочки переносов в последовательном сумматоре это логарифм от количества разрядов». Правда, там не RCA сумматор, для него та же самая оценка получена позднее. Нужно было придумать как математически описать работу детектора завершения переноса (carry completion). И в том и в другом сумматоре такой детектор есть, а значит они являются асинхронными. Принцип работы сумматора фон Неймана (carry storage) хорошо описан в двух источниках:
K. Hwang, Computer Arithmetic: Principles, Architecture, and Design, Wiley, 1979.
G. Schay, "How to Add Fast - on Average," The American Mathematical Monthly, vol. 102, no. 8, pp. 725-730, 1995.
Чтобы проверить "логарифм" численно, нужно генерировать случайные числа с равномерным распределением вероятности. Это удобно делать в Mathematica. Я не буду проводить здесь программу целиком, приведу только функцию сумматора
Recadder[a_Integer, b_Integer, n_Integer] :=
Module[{sum, carry, oldcarry, g, k = -1},
sum = IntegerDigits[a, 2, n + 1];
carry = IntegerDigits[b, 2, n + 1];
oldcarry = Table[1, n + 1];
While[Total[oldcarry] > 0,
g = BitAnd[sum, carry];
sum = BitXor[sum, carry];
carry = PadRight[g, n + 2];
carry = Take[carry, -n - 1];
oldcarry = carry; k++;];
{FromDigits[sum, 2], k}];
Как видно, это линейка из элементов AND, линейка из элементов XOR и сдвиг вправо. Результат готов, когда не выполняется условие while. Кто возьмётся переписать этот код на Verilog? Хотя, наверное, для понимания лучше сначала на Python или C.

Например, в свободном доступе есть вот эти полезные статьи

Accelerating computations on FPGA carry chains by operand compaction

Mapping Arbitrary Logic Functions onto Carry Chains in FPGAs

Названия "summator" и "transfer" вместо "adder" и "carry" говорят о том, Вы либо не спрашивали Google про стандартные реализации "full adder", либо не доверяете Google. И то и другое - зря. Это простой вопрос и реализаций на логических элементах не так много. Более того, можно найти их сравнение по быстродействию, площади и энергопотреблению. А если постараться, то можно найти и какую-то оптимизацию для FPGA. Не думаю, что у кого-то получилось намного лучше, чем сумматор, имеющийся в логическом блоке. У Вас тоже не получилось. Уже только потому, что для инвертора нужно использовать LUT целиком. Не слишком ли расточительно?

Мнимые провода в шине - это баг. Ну, или китайцы решили запутать врага :) А обратная подстановка у них есть? Это когда после трассировки показывается через сколько коммутаторов проходит сигнал. Пишут эквивалентную задержку провода? Нет? Правильно делают, что не пишут, для синхронных схем - это лишняя информация. Длина такта выбирается так, чтобы все переходные процессы завершились. Среди этих процессов могут быть и те, которые приводят к ошибкам. Виновниками ошибок очень даже могут быть задержки. Именно поэтому я уже n (n>1) раз спросил про то, как Verilog ложится в логический блок. Рифма. Что доминирует, задержка проводов или задержка гейтов? Вторая рифма. Можно ли сделать задержку одинаковой по каждому входу LUT с помощью проводов, которые туда идут? Третья рифма.

Уточнение. Асинхронные сумматоры "по готовности переноса" называются carry completion и carry storage. По быстродействию они одинаковые. По сложности на FPGA - судить Вам. Я как-то моделировал carry storage adder с равномерным распределением слагаемых в Mathematica. Принцип работы этого сумматора хорошо описан в двух источниках:
K. Hwang, Computer Arithmetic: Principles, Architecture, and Design, Wiley, 1979.
G. Schay, "How to Add Fast - on Average," The American Mathematical Monthly, vol. 102, no. 8, pp. 725-730, 1995.

Information

Rating
Does not participate
Registered
Activity