Вы пытаетесь присвоить o
значение индексированного имени из результата выражения.
Префикс индексированного имени может быть либо именем, либо вызовом функции.
indexed_name ::= prefix ( expression { , expression } )
prefix ::=
name
| function_call
Функции являются выражениями, как и большинство предопределенных атрибутов, например. i'length
или i'left
.
Однако вызов функции имеет определенный формат:
function_call ::=
function_name [ ( actual_parameter_part ) ]
actual_parameter_part ::= parameter_association_list
Учитывая все это, а также используя пакет numeric_std (в данном случае без numeric_std_unsigned), мы получаем:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity indexing is
constant parameter: natural :=7;
end entity;
architecture foo of indexing is
signal o : std_logic;
signal i : signed(parameter downto 0);
constant c : integer := 5;
begin
o <= "-"(i,to_signed(c,i'length)) (i'left);
end architecture;
И, конечно же, вы можете использовать преобразования типов в списке ассоциаций для списка ассоциаций вызова функции "-",
Тип signed
был выбран, потому что ваша константа c
была указана как целочисленный тип. Это мог быть легко тип unsigned или std_logic_vector с использованием пакета numeric_std_unsigned. Выбор типа со знаком отчасти причудлив, o
таким образом указывает знак результата.
Вышеприведенный пример анализирует, уточняет и выполняет, на самом деле не делая ничего интересного, но демонстрируя допустимый синтаксис.
Аналогичным образом можно манипулировать именами фрагментов.
(И да, это будет работать с пакетом Synopsys std_logic_unsigned, без преобразования типов и указания i
типа std_logic_vector. При использовании вызова функции мало преимуществ.)
person
Community
schedule
22.09.2014