对于固定点算术,我用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;
答案 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?