在VHDL中使用定点表示的乘法

时间:2015-01-22 06:27:38

标签: vhdl multiplication hdl fixed-point

对于固定点算术,我用0000 0010101010100110表示0.166并将其相乘。为此我用VHDL编写代码如下。输出以y分配,符号为41bit。对于带符号的乘法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;

1 个答案:

答案 0 :(得分:2)

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

所以你应该&#34;正常化&#34;结果是将它扩展到1位,这应该等于结果的符号(位#40 =位#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?