Прямая индексация арифметического результата

Для этой проблемы учтите, что у меня есть следующие сигналы и я использую пакеты Synopsis std_logic_unsigned и std_logic_arith.

signal o : std_logic;
signal i  : std_logic_vector(parameter downto 0);
constant c : integer := 5;

Я хочу установить сигнал o в самый левый бит результата (i-c). Внутри процесса у меня есть что-то вроде:

o <= (i-c)(i'left);

Который не компилируется в моем симуляторе.

Я знаю, что могу решить эту проблему, введя промежуточную переменную, но есть ли синтаксическая конструкция, чтобы сделать это напрямую?


person QuantumRipple    schedule 22.09.2014    source источник


Ответы (1)


Вы пытаетесь присвоить 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
comment
Спасибо, это именно то, что я искал. - person QuantumRipple; 23.09.2014