2016-10-11 49 views
1

我有一个VHDL代码。的ModelSim给我错误无符号VHDL

“长度的预期为32,实际长度为31个”

如何编写代码,这是正确的,我不写向量的长度。 我想在Verilog的工作方式类似: 的Verilog

reg [30:0] smth1 = 2735*12; 
reg [15:0] smth2 = 12*11; 
reg [31:0] smth1_s; 
always (*) 
begin 
smth1_s <= smth1+smth2; 
end 

VHDL:

library ieee; 
    use ieee.std_logic_1164.all; 
    use ieee.std_logic_unsigned.all; 
    use ieee.numeric_std.all; 

entity top is 
end entity; 

architecture top of top is 
    signal smth1 : unsigned(30 downto 0) := to_unsigned(2735,16) * to_unsigned(12,15);  --reg [31:0] smth1 = 12'hAAF * 12; 
    signal smth2 : unsigned(15 downto 0) := to_unsigned(12,16)/to_unsigned(11,16);  --reg [15:0] smth2 = 12*11;     
    signal smth1_s : unsigned(31 downto 0);  

begin       
     smth1_s <= smth1 + smth2;        
end architecture; 
+0

无符号的''+“'接受输入并返回相同长度的输出。一种方法是对输入进行符号扩展:对于无符号数,就是'smth1_s <='0'&smth1 +'0'&smth2;' –

回答

1

结果的从+长度是最长的两个参数,因而30个比特,其被分配到的一个31位的目的地,因此错误。

可以使用调整大小来适应参数,无论是有符号还是无符号都可以使用,但是您需要在添加之前调整大小以便扩展进位位的结果,因为我认为这是意图。

所以通用和维护的代码可能是这样,在那里你可以添加适当的注释描述该大小调整的目的:

smth1_s <= resize(smth1, smth1_s'length) + resize(smth2, smth1_s'length); 

一个很好的综合工具,今天最喜欢的,会因此只有优化电路使用全加器的最小数量,即使通过调整大小看起来更多位正在被添加。