Перейти к содержанию
    

Преобразование sfixed to signed

Достался в наследство модуль на 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

посмотрите - может поможет

+ проверьте на задание 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался кажется. Может и кривое решение, но работает. Достаточно добавить функцию to_slv:

mac_result_scaled_signed(i) <= signed(to_slv(mac_result_scaled(i)));

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...