Vivado中的VHDL错误指出“目标有17位,源有33位”

时间:2019-06-13 19:37:30

标签: vhdl vivado

我收到一条错误消息,提示我的目标是17位,而源是33位。我不明白当两个东西加在一起都是16位时情况如何。这将导致17位和。我不确定如何使用33位。

我尝试将每个加数转换为固定值,因为这就是目标。我尝试了没有这种转换。我尝试在每个加数上使用resize函数,以确保每个都是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位。

  

[Synth 8-690]宽度不匹配;目标有17位,源有33位[“ C:/Users/devon/project_1/project_1.srcs/sources_1/new/neural_network.vhd”:104]

1 个答案:

答案 0 :(得分:2)

如果N和我是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,并且min(a,b)= 0,所以两个操作数都被扩展为(31降为0)-32位。然后,它有了一点点增长,就产生了结果。

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