我正在尝试实现一个浮点加法器/减法器。我已经实现了可以工作的代码。当我运行模拟时,它按预期工作。
问题是,当我尝试在 Vivado 中综合它时,出现以下错误:“常量表达式在赋值中需要宽度不匹配”和“目标有 279 位,源有 86 位”,一行显示:
my_p_nt_a <= to_unsigned(0, to_integer(abs_exp_diff)) & my_p & to_unsigned(0, 2**NE - 1- to_integer(abs_exp_diff));
这对应于尾数的对齐方式。
更多信息:
signal my_p_nt_a: unsigned(NF + 2**NE-1 downto 0);
signal abs_exp_diff: unsigned(NE downto 0);
NE 是指数的位数。
我不知道如何解决。我尝试了不同的方法,但在合成时我不断遇到问题。
该错误消息的含义是,在 Vivado 综合中,您无法将操作数扩展为多个 0,其中该数字取决于 abs_exp_diff 处的值。仅当 abs_exp_diff 是常量时,此方法才有效。 我预计大多数综合工具都无法做到这一点。
您应该使用此解决方案:
entity test_shift is
end entity test_shift;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
architecture struct of test_shift is
constant NF : natural := 10; -- example value
constant NE : natural := 12; -- example value
signal abs_exp_diff : unsigned(NE downto 0);
signal my_p : unsigned(NF-1 downto 0);
signal my_p_nt_a : unsigned(NF+2**NE-1 downto 0);
begin
process(my_p, abs_exp_diff)
variable my_p_nt_a_v : unsigned(my_p_nt_a'range);
begin
my_p_nt_a_v(my_p'range) := my_p;
my_p_nt_a <= shift_left(my_p_nt_a_v, 2*NE-1-to_integer(abs_exp_diff));
end process;
end architecture;