Vivado 状态中的 VHDL 错误"target has 17 bits, source has 33 bits"



我收到一个错误,说我的目标是 17 位,但源是 33 位。我不明白当两个东西加在一起都是 16 位时,情况如何。这应该会产生 17 位的总和。我不确定 33 位是如何出现的。

我尝试将每个加法转换为固定值,因为这就是目标。我已经尝试过没有这种转换。我尝试在每个增补上使用调整大小功能,以保证每个增补件为 16 位。这种方法有效,但创建了不正确的电路。

NI都是值为 4 的泛型整数。

这是问题陈述:

wx12 <= wx(1*(4*N)-1 downto 0*(4*N)) + wx(2*(4*N)-1 downto 1*(4*N));

这是wx以及它是如何定义/填充的:

signal wx : sfixed (4*N*I-1 downto 0);
wx(1*(4*N)-1 downto 0*(4*N)) <= x(1*(2*N)-1 downto 0*(2*N)) * w(1*(2*N)-1 downto 0*(2*N));                                                                       
wx(2*(4*N)-1 downto 1*(4*N)) <= x(2*(2*N)-1 downto 1*(2*N)) * w(2*(2*N)-1 downto 1*(2*N));                                                                       
wx(3*(4*N)-1 downto 2*(4*N)) <= x(3*(2*N)-1 downto 2*(2*N)) * w(3*(2*N)-1 downto 2*(2*N));                                                                       
wx(4*(4*N)-1 downto 3*(4*N)) <= x(4*(2*N)-1 downto 3*(2*N)) * w(4*(2*N)-1 downto 3*(2*N));

这是w及其定义方式:

constant w : sfixed ((2*N*I)-1 downto 0) := to_sfixed(1, N-1, -N) 
& to_sfixed(1, N-1, -N)
& to_sfixed(1, N-1, -N)
& to_sfixed(1, N-1, -N);

这是 x 及其定义方式:

x : in sfixed ((2*N*I)-1 downto 0);

我期望结果为 17 位,但下面的错误显示结果实际上是 33 位。

[合成器 8-690] 分配中的宽度不匹配;目标有 17 位,源有 33 位 ["C:/Users/devon/project_1/project_1.srcs/sources_1/new/neural_network.vhd":104]

如果 N 和 I 是 4,那么你有这个:wx12 <= wx(15 downto 0) + wx(31 downto 16);

默认情况下,fixed_point库的行为与numeric_std不同。

  1. 两个操作数都重新成形为 (max(a,b) 向下 (min(a,b))
  2. 结果是有点增长。

由于 max(a,b) = 31,最小值 (a,b) = 0,因此两个操作数都位扩展到 (31 向下到 0) - 32 位。然后它有一点增长,给出结果。

这都是因为不动点库将索引视为 2^n。 要做你想做的事,你需要自己将第二个操作数重新对齐到 (15 到 0)。

最新更新