【问题标题】:Multiplication with Fixed point representation in VHDL与 VHDL 中的定点表示的乘法
【发布时间】:2015-01-22 06:27:37
【问题描述】:

对于定点算术,我用 0000 0010101010100110 表示 0.166 并将其乘以相同的值。为此,我用 VHDL 编写了如下代码。输出分配在 y 中,它有符号 41 位。对于有符号乘法 A(a1,b1)*A(a2,b2)=A(a1+a2+1,b1+b2)。然而在模拟过程中它给出了一个错误

      Target Size 41 and source size 40 for array dimension 0 does not match. 

代码:

 entity file1 is
    Port ( y : out signed(40 downto 0));
 end file1;

 architecture Behavioral of file1 is

 signal a : signed(19 downto 0) := "00000010101010100110";
 signal b : signed(19 downto 0) := "00000010101010100110";

 begin
    y<= (a*b);    ----error
 end Behavioral;

【问题讨论】:

  • dk14 的回答详细说明了为什么长度是这样的,这是值得的,但可能更容易记住,通常,乘法的结果长度只是操作数长度的总和,对于signedunsigned。 20 位 * 20 位 = 40 位。
  • 如果你真的想要定点,为什么不使用IEEE定点包中的sfixed(VHDL-2008添加)?

标签: vhdl multiplication hdl fixed-point


【解决方案1】:

19+1 位乘以 19+1 位的结果是 39+1 位,而你的端口是 40+1 位长。例如,让我们将 19 位的最大可能值相乘:0x7FFFF * 0x7FFFF = 0x3FFFF00001 - 所以无符号结果为 39 位(19 + 19 + 进位),符号为 +1 位。

因此,您应该通过将结果扩展为多 1 位来“标准化”结果,这应该等于结果的符号 (bit#40 = bit#39),或者只选择 40 位端口作为输出:

Port ( y : out signed(39 downto 0))

如果你真的需要多余的 41 位:

begin
   y(39 downto 0) <= (a*b)
   y(40) <= y(39)
end Behavioral;

或者只使用 resize 函数进行签名:How to convert 8 bits to 16 bits in VHDL?

【讨论】:

  • 为了规范化,我们应该扩展 a,b 中的位吗?如何检查任何其他范围的结果位。我读到我得到的结果应该是 a1+a2+1,正如我所写的那样。
  • 没有。如果您扩展 a,b 您将收到 42 位结果,当您需要 41 时。由于 VHDL 使用数字的二进制补码表示 - 只需将符号(位#39)复制到结果的新位(位#40)中就足够了.
  • a1+a2+1 = 19+19+1 为无符号!;和 + 1 表示符号:)。所以“+1”表示进位,“+1”表示符号。请参阅我的答案中具有最大可能值的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
相关资源
最近更新 更多