VHDL中的定点乘法

VHDL中的定点乘法,vhdl,multiplication,hdl,fixed-point,Vhdl,Multiplication,Hdl,Fixed Point,对于固定点算术I,用0000 0010101010100110表示0.166,并将其乘以0000 0010101010100110。为此,我用VHDL编写了如下代码。输出以有符号41位的y分配。对于有符号乘法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

对于固定点算术I,用0000 0010101010100110表示0.166,并将其乘以0000 0010101010100110。为此,我用VHDL编写了如下代码。输出以有符号41位的y分配。对于有符号乘法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是
端口(y:签出(40到0));
结束文件1;
file1的体系结构是
信号a:已签名(19到0):=“000000 10101010100110”;
信号b:已签名(19到0):=“000000 10101010100110”;
开始

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

因此,您应该通过将结果扩展到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;
开始

y(39到0)对于规格化,我们是否应该扩展a,b中的位?如何检查任何其他范围的结果位。我在书中读到,我得到的结果应该是a1+a2+1,正如我在问题中所写的。否。若你们扩展a,b,你们将收到42位的结果,当你们需要41位的时候。由于VHDL使用2的数字补码表示法,所以只需在结果的新位(位40)中复制符号(位39)就足够了。a1+a2+1=19+19+1表示无符号!;和+1表示符号:)。所以“+1”表示进位,而“+1”表示符号。请参阅我答案中的最大可能值示例。dk14的答案详细说明了为什么长度是这样的,这是值得的,但更容易记住的是,通常情况下,乘法的结果长度只是
有符号
无符号
的操作数长度之和。20位*20位=40位。如果您真的想要定点,为什么不使用IEEE定点软件包(VHDL-2008增补)中的sfixed?