我收到一个错误,说我的目标是 17 位,但源是 33 位。我不明白当两个东西加在一起都是 16 位时,情况如何。这应该会产生 17 位的总和。我不确定 33 位是如何出现的。
我尝试将每个加法转换为固定值,因为这就是目标。我已经尝试过没有这种转换。我尝试在每个增补上使用调整大小功能,以保证每个增补件为 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 位。
[合成器 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不同。
- 两个操作数都重新成形为 (max(a,b) 向下 (min(a,b))
- 结果是有点增长。
由于 max(a,b) = 31,最小值 (a,b) = 0,因此两个操作数都位扩展到 (31 向下到 0) - 32 位。然后它有一点增长,给出结果。
这都是因为不动点库将索引视为 2^n。 要做你想做的事,你需要自己将第二个操作数重新对齐到 (15 到 0)。