2015-06-03 3 views
0

Я работаю над реализацией 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 вопроса:

  1. В моем случае, MAX = 31 так ли это, что любая операция сложения я выполняю на a и b будет мод с 2^31?
  2. Мне нужно выполнить добавление modulo 2^, который, очевидно, не имеет смысла, так как я работаю с 32-битными номерами, а 2^32 - один бит слишком большой. Так почему-то подразумевается, что я действительно должен быть modding с 2^?

ответ

4

Вы в порядке с unsigned(31 downto 0). 2^MAX в сообщении вы ссылаетесь на ошибку и должны прочитать 2^length. Длина 31 downto 0 составляет 32.

Подумайте об этом, 31 downto 0 может представлять числа от 0 до 2^32-1, это не имеет большого смысла, если бы добавление этого диапазона было бы по модулю 2^31, если вы можете представляют собой большие числа!

Я не уверен, что понимаю ваш второй вопрос, но добавление по модулю 2^32 дает результаты в диапазоне от 0 до 2^32-1. 2^32 является незаконным, поэтому вполне нормально, что вы не можете представлять его без вашего неподписанного.

+0

Так что VHDL действительно позаботится о применении mod 2^32 к результату добавления 32-битного без знака, и мне не нужно будет его явно выполнять? –

+1

Да, поведение по умолчанию для беззнакового добавления/подстановки в VHDL по модулю. Обнаружение не-модульного сложения или переполнения на самом деле сложнее, но не очень. –

+0

Целая арифметика компьютера работает над кольцами классов вычетов *. Компьютер не вычисляет mod 2^32. Это просто результат, отбрасывая все биты выше бит 31. Или, другими словами, потому что 32 - это мощность 2 -> mod 2^32, равна младшим 32 битам от бит 0 до 31 :). – Paebbels