Проблема VHDL: несоответствие формы массива - нет соответствующего элемента - PullRequest
0 голосов
/ 30 ноября 2018

Я новичок в 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');

Что я мог сделать?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Правильный подбор Y_s должен решить вашу проблему.Вы также должны переместить назначение X_s <= sign (x) вне оператора процесса и удалить назначение X_s <= (others => '0') внутри условия сброса.

0 голосов
/ 01 декабря 2018

Ваш простой случай:

Y_s <= (X_s*A);

Y_s - 17 проводов (16 downto 0).X_s - 8 проводов (7 downto 0).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).

Раздел «Добавление без подписи / без подписи» без переполнения »на на этой странице объясняется, как решить эту проблему.

...