VHDL 模 2^32 加法
VHDL modulo 2^32 addition
我正在研究 SHA-256 散列函数的 VHDL 实现。
我有一些这样定义的 32 位 unsigned
信号:
SIGNAL a, b : UNSIGNED (31 downto 0);
在 SHA-256 算法的规范中,它表示加法必须以 2^32 为模执行,以便在发生溢出时保留 32 位大小。现在,根据 this 问题的答案,听起来溢出已经在 VHDL 中用模块化加法处理了:
There is no overflow handling, the overflow carry is simply lost. Thus the result is simply the integer result of your operation modulo 2^MAX.
我有两个问题:
- 在我的例子中,
MAX = 31
那么这是否意味着我对 a
和 b
执行的任何加法运算都将用 2^31 进行修改?
- 我需要对 2^32 进行加法运算,这显然没有意义,因为我使用的是 32 位数字,而 2^32 有点太大了。那么它是否以某种方式暗示我实际上应该使用 2^31?
进行改装
你对 unsigned(31 downto 0)
没问题。您引用的 post 中的 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 是非法的,因此你不能用你的无符号表示它很好。
我正在研究 SHA-256 散列函数的 VHDL 实现。
我有一些这样定义的 32 位 unsigned
信号:
SIGNAL a, b : UNSIGNED (31 downto 0);
在 SHA-256 算法的规范中,它表示加法必须以 2^32 为模执行,以便在发生溢出时保留 32 位大小。现在,根据 this 问题的答案,听起来溢出已经在 VHDL 中用模块化加法处理了:
There is no overflow handling, the overflow carry is simply lost. Thus the result is simply the integer result of your operation modulo 2^MAX.
我有两个问题:
- 在我的例子中,
MAX = 31
那么这是否意味着我对a
和b
执行的任何加法运算都将用 2^31 进行修改? - 我需要对 2^32 进行加法运算,这显然没有意义,因为我使用的是 32 位数字,而 2^32 有点太大了。那么它是否以某种方式暗示我实际上应该使用 2^31? 进行改装
你对 unsigned(31 downto 0)
没问题。您引用的 post 中的 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 是非法的,因此你不能用你的无符号表示它很好。