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.

我有两个问题:

  1. 在我的例子中,MAX = 31 那么这是否意味着我对 ab 执行的任何加法运算都将用 2^31 进行修改?
  2. 我需要对 2^32 进行加法运算,这显然没有意义,因为我使用的是 32 位数字,而 2^32 有点太大了。那么它是否以某种方式暗示我实际上应该使用 2^31?
  3. 进行改装

你对 unsigned(31 downto 0) 没问题。您引用的 post 中的 2^MAX 是一个错误,应显示为 2^length31 downto 0的长度是32。

想一想,31 downto 0 可以表示从 0 到 2^32-1 的数字,如果您可以表示更大的数字,那么如果该范围的任何加法都以 2^31 为模,那将没有多大意义数字!

我不确定我是否理解你的第二个问题,但是加法模 2^32 产生的结果在 0 到 2^32-1 的范围内。 2^32 是非法的,因此你不能用你的无符号表示它很好。