通过移位划分VHDL中的负数

Max*_*mus 1 vhdl

我有一个负数(MSB = 1).如何通过移位VHDL将数字除以2.

例如.转-6应该给我2.

如何推广除法/移位,例如: - -6 - > -3 6 - > 3

Mor*_*mer 5

对于2的补码中的2个数字(正数和正数)除以使用ieee.numeric_std.signed它可以使用shift来完成:

res <= std_logic_vector(shift_right(signed(arg), 1));
Run Code Online (Sandbox Code Playgroud)

shift_right以单个比特移位与签署参数将做算术移位,从而可用于除以2.

正如MatthiasB在评论中指出的那样,也可以使用除法,其中:

res <= std_logic_vector(signed(arg) / 2);
Run Code Online (Sandbox Code Playgroud)

操作上的差异是:

  • Shift(shift_right):向下舍入,因此-7/2 = -4
  • Division(/):向零舍入,因此-7/2 = -3

实施的差异:

  • Shift(shift_right):尺寸和速度的零成本,因为仅使用布线
  • Division(/):由于舍入需要逻辑运算,因此在尺寸和速度上会有一些成本