VHDL问题:数组形状不匹配-没有匹配的元素



我是VHDL的新手,遇到了一个不知道如何解决的问题。当我进行模拟时,问题出现了,但代码编译正确。问题是:

entity fir is
port (  clock : in STD_LOGIC;
reset : in STD_LOGIC;
X : in STD_LOGIC_VECTOR (7 downto 0); -- X = X(n)
Y : out STD_LOGIC_VECTOR (16 downto 0)); -- Y = Y(n)
end fir;
architecture Behavioral of fir is
signal X_s, XZ1, XZ2, XZ3, XZ4, XZ5, XZ6, XZ7 : signed (7 downto 0); -- XZi = X(n-i)
signal Y_s  : signed (16 downto 0);
constant A  : signed(7 downto 0) := "00001011"; -- A=11
(constant B,C,D,E,F,G,H similary to A)
begin
process (clock, reset) 
begin
X_s <= signed(X);
if (rising_edge(clock)) then
if (reset = '1') then
X_s <= (others => '0');
Y_s <= (others => '0');
XZ1, XZ2,XZ3...XZ7 <= (others => '0'); <= (others => '0');
else
XZ1 <= X_s;
XZ2 <= XZ1;
XZ3 <= XZ2;
XZ4 <= XZ3;
XZ5 <= XZ4;
XZ6 <= XZ5;
XZ7 <= XZ6;
end if;
end if;
end process;
Y_s <= (X_s*A) + (XZ1*B) + (XZ2*C) + (XZ3*D) + (XZ4*E) + (XZ5*F) + (XZ6*G) + (XZ7*H);
Y <= std_logic_vector(Y_s);
end Behavioral;

此行:

Y_s <= (X_s*A) + (XZ1*B) + (XZ2*C) + (XZ3*D) + (XZ4*E) + (XZ5*F) + (XZ6*G) + (XZ7*H);

返回此错误:">阵列形状不匹配-没有匹配元素">

我最初认为这是因为它的尺寸,但即使我更换了这条线,问题仍然存在:

Y_s <= (X_s*A) + (XZ1*B) + (XZ2*C) + (XZ3*D) + (XZ4*E) + (XZ5*F) + (XZ6*G) + (XZ7*H);

由这个:

Y_s <= (X_s*A);

然而,它可以使用以下行:(只是为了看看代码的其余部分是否正确(:

Y_s <= (others => '0');

我能做什么?

非常感谢。

您的简单案例:

Y_s <= (X_s*A);

Y_s-17线(16 downto 0)。CCD_ 3-8线CCD_。A-8线(7 downto 0)8 + 8 != 17

复数和:

Y_s <= (X_s*A) + (XZ1*B) + (XZ2*C) + (XZ3*D) + (XZ4*E) + (XZ5*F) + (XZ6*G) + (XZ7*H);

加法和乘法的结果大小:

|  Operation |         Size of result       |
+------------+------------------------------+
| Y <= A + B | Maximum (A'Length, B'Length) |
| V <= A * B | A'Length + B'Length          |

因此,您的总金额为16:Maximum(8+8,8+8,8+8,8+8,8+8,8+8,8+8,8+8)

本页的"已签名"/"未签名"添加而不溢出部分解释了如何解决此问题。

适当调整Y_s的大小应该可以解决您的问题。您还应该移动赋值X_s<=signed(x(并移除x_s<=(其他=>"0"(重置条件内的赋值。

最新更新