10ff 0 7 сентября, 2023 Опубликовано 7 сентября, 2023 · Жалоба Достался в наследство модуль на VHDL, который синтезируется и хорошо работает. Попытался запустить моделирование в Questa и получил ошибку: (vcom-1167) Index value -22 (of type std.STANDARD.NATURAL) is out of range 0 to 2147483647. Ругается на строку в блоке generate: mac_result_scaled_signed(i) <= signed(mac_result_scaled(i)); где ... signal mac_result_scaled_signed : Tarray_of_signed(15 downto 0)(35 downto 0); ... signal mac_result_scaled : Tarray_of_sfixed(15 downto 0)(13 downto -22); Tarray_of_sfixed и Tarray_of_signed объявлены как: ... type tarray_of_sfixed is array (integer range <>) of sfixed; ... type tarray_of_signed is array (integer range <>) of signed; ... Не являюсь знатоком VHDL. Подскажите, как скормить Questa этот модуль? Vivado 2023.1, Questa 2021.1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 7 сентября, 2023 Опубликовано 7 сентября, 2023 · Жалоба посмотрите - может поможет + проверьте на задание i - конечное значение не должно быть больше числа єлементов в массиве - даже изначально заданное если там счетчик задающий - i - ограничьте счет до количества єлементов в массиве как в примере ниже library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity counter is generic ( DATA_WIDTH : integer := 24; MAX_VALUE : integer := 128 -- maximum count value ); port ( clk : in std_logic; -- input clock signal rst : in std_logic; -- asynchronous reset input signal count : out std_logic_vector(DATA_WIDTH-1 downto 0) -- 7-bit count output signal ); end entity counter; architecture rtl of counter is signal reg_count : std_logic_vector(DATA_WIDTH-1 downto 0); -- register to hold the count value begin -- increment the count value on each rising edge of the clock process (all) begin if rst = '1' then reg_count <= (others => '0'); -- reset the count value elsif rising_edge(clk) then if reg_count = std_logic_vector(to_unsigned(MAX_VALUE - 1, reg_count'length)) then reg_count <= (others => '0'); -- reset the count value if it reaches MAX_VALUE else reg_count <= std_logic_vector(unsigned(reg_count) + 1); -- increment the count value end if; end if; end process; -- output the count value count <= reg_count; end rtl; и чило i должно быть unsigned или задающее его - mac_result_scaled Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
10ff 0 7 сентября, 2023 Опубликовано 7 сентября, 2023 · Жалоба Разобрался кажется. Может и кривое решение, но работает. Достаточно добавить функцию to_slv: mac_result_scaled_signed(i) <= signed(to_slv(mac_result_scaled(i))); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться