Я работаю над реализацией VHDL функции хеша SHA-256. У меня есть 32-разрядные unsigned
сигналов, определенных в качестве таковых:VHDL modulo 2^32 дополнение
SIGNAL a, b : UNSIGNED (31 downto 0);
в пределах спецификации алгоритма SHA-256, это говорит добавление должно быть выполнено по модулю 2^32, чтобы сохранить размер 32-битную случай переполнения. Теперь, в соответствии с ответом на вопрос this, это звучит как переполнение уже обработано с модульным добавлением в VHDL:
Там нет обработки переполнения, переполнение переноса просто теряются. Таким образом, результатом является просто целочисленный результат вашей работы по модулю 2^MAX.
У меня 2 вопроса:
- В моем случае,
MAX = 31
так ли это, что любая операция сложения я выполняю наa
иb
будет мод с 2^31? - Мне нужно выполнить добавление modulo 2^, который, очевидно, не имеет смысла, так как я работаю с 32-битными номерами, а 2^32 - один бит слишком большой. Так почему-то подразумевается, что я действительно должен быть modding с 2^?
Так что VHDL действительно позаботится о применении mod 2^32 к результату добавления 32-битного без знака, и мне не нужно будет его явно выполнять? –
Да, поведение по умолчанию для беззнакового добавления/подстановки в VHDL по модулю. Обнаружение не-модульного сложения или переполнения на самом деле сложнее, но не очень. –
Целая арифметика компьютера работает над кольцами классов вычетов *. Компьютер не вычисляет mod 2^32. Это просто результат, отбрасывая все биты выше бит 31. Или, другими словами, потому что 32 - это мощность 2 -> mod 2^32, равна младшим 32 битам от бит 0 до 31 :). – Paebbels