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

VHDL error in Vivado states "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,它是怎样的defined/populated:

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 位。

[Synth 8-690] width mismatch in assignment; target has 17 bits, source has 33 bits ["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. 两个操作数都是re-shaped到(max(a,b)到(min(a,b))
  2. 结果有点增长。

因为max(a,b) = 31, min(a,b) = 0,所以两个操作数都位扩展为(31 downto 0) - 32位。然后它有一点增长,给出结果。

这都是因为定点库将索引视为 2^n。做你想做的事,你需要自己 re-align 第二个操作数(15 到 0)。