我收到一条错误消息,提示我的目标是17位,而源是33位。我不明白当两个东西加在一起都是16位时情况如何。这将导致17位和。我不确定如何使用33位。
我尝试将每个加数转换为固定值,因为这就是目标。我尝试了没有这种转换。我尝试在每个加数上使用resize函数,以确保每个都是16位。此方法有效,但造成电路不正确。
N
和I
都是值为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]
答案 0 :(得分:2)
如果N和我是4,那么您有:
wx12 <= wx(15 downto 0) + wx(31 downto 16);
默认情况下,fixed_point库的行为与numeric_std不同。
因为max(a,b)= 31,并且min(a,b)= 0,所以两个操作数都被扩展为(31降为0)-32位。然后,它有了一点点增长,就产生了结果。
这都是因为定点库将索引视为2 ^ n。要执行您想要的操作,您需要自己将第二个操作数重新对齐为(15到0)。