2015-06-03 63 views
0

我正在研究SHA-256散列函数的VHDL实现。 我有定义为这样的一些32位unsigned信号:VHDL modulo 2^32 addition

SIGNAL a, b : UNSIGNED (31 downto 0); 

的SHA-256算法的规范内,它说除了必须以保留32位大小进行模2^32溢出的情况。现在,根据答案this问题,这听起来像溢出已经与模加在VHDL处理:

没有溢出处理,溢流进位简单地丢失。因此,结果就是您的操作模2^MAX的整数结果。

我有2个问题:

  1. 在我的情况下,MAX = 31这是否意味着,任何加法运算我对ab执行将用2^31改装成的?
  2. 我需要执行加模2^这显然没有意义,因为我正在使用32位数字和2^32是一位太大。那么是不是暗示我实际上应该用2^?

回答

4

你可以用unsigned(31 downto 0)。您引用的帖子中的2^MAX是一个错误,应为2^length31 downto 0的长度为32.

想一想吧,31 downto 0可以表示0到2^32-1之间的数字,如果可以的话,如果有任何范围的加法将是模2^31,没有什么意义代表更大的数字!

我不确定我是否理解你的第二个问题,但加上modulo 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等于位0到31的低32位:)。 – Paebbels