在 VHDL 中未签名
Unsigned in VHDL
我有一个 VHDL 代码。 Modelsim 给我错误
"Length of expected is 32; length of actual is 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;
+
的结果长度是两个参数中最长的,因此是 30 位,它被分配给 31 位目标,因此是错误。
可以使用调整大小,以适应有符号或无符号的参数,但您需要在添加之前调整大小以扩展进位位的结果,正如我假设的那样。
通用且可维护的代码可能是这样的,您可以在其中添加合适的注释来描述调整大小的目的:
smth1_s <= resize(smth1, smth1_s'length) + resize(smth2, smth1_s'length);
一个好的综合工具,就像今天的大多数工具一样,将优化电路,因此只使用最少数量的全加器,即使看起来由于调整大小而添加了更多位。
我有一个 VHDL 代码。 Modelsim 给我错误
"Length of expected is 32; length of actual is 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;
+
的结果长度是两个参数中最长的,因此是 30 位,它被分配给 31 位目标,因此是错误。
可以使用调整大小,以适应有符号或无符号的参数,但您需要在添加之前调整大小以扩展进位位的结果,正如我假设的那样。
通用且可维护的代码可能是这样的,您可以在其中添加合适的注释来描述调整大小的目的:
smth1_s <= resize(smth1, smth1_s'length) + resize(smth2, smth1_s'length);
一个好的综合工具,就像今天的大多数工具一样,将优化电路,因此只使用最少数量的全加器,即使看起来由于调整大小而添加了更多位。