В чем разница между индексом (9) и индексом (от 9 до 9) в vhdl?

logic index : unsigned(9 downto 0) ;  
type fft_data  is array (3 downto 0) of unsigned(16 downto 0);  
signal tmp,signal fmax_data :fft_data;  
tmp = fmax_data(to_integer(index(9)));

Приведенная выше часть кода дает следующую ошибку компиляции; "вызов подпрограммы или тип аргумента оператора не соответствуют 87"

если я делаю следующую модификацию, она работает.

logic index : unsigned(9 downto 0) ;  
type fft_data  is array (3 downto 0) of unsigned(16 downto 0);  
signal tmp,signal fmax_data :fft_data;;  
tmp = fmax_data(to_integer(index(**9 downto 9**)));

Может ли кто-нибудь объяснить, в чем разница между двумя вышеуказанными реализациями? Я использую vhdl-93 std и ncvhdl. Спасибо


person user2624915    schedule 03.07.2017    source источник
comment
Одним из них является индексированное имя, представляющее элемент массива, который в данном случае имеет тип std_ulogic. Другой — это имя фрагмента, представляющее массив того же типа, что и массив, содержащий один элемент и имеющий тип unsigned. index(9) и index(9 до 9) — это разные типы. См. IEEE 1076-2008 8. Имена и 9. Выражения, 9.1 EBNF для первичных имен (включая индексированные имена и нарезанные имена) являются выражениями. Префикс тот же, значения выражений разного типа.   -  person    schedule 03.07.2017


Ответы (1)


В numeric_std функция to_integer определена только для типов unsigned и signed.

Без знака происходит от std_logic как type UNSIGNED is array ( NATURAL range <> ) of STD_LOGIC;

Когда вы используете to_integer(index(9)), вы передаете index(9) типа std_logic.

Когда вы используете to_integer(index(9 downto 9)), вы передаете диапазон из index, который имеет размер 1, однако это тип unsigned.

Вы также можете создать свою пользовательскую функцию, если хотите. Чтобы преобразовать std_logic в integer.

function to_integer (ARG : std_logic)
  return integer is
begin
  if ARG = '1' OR ARG = 'H' then
    return 1;
  else
    return 0;
  end if;
end function to_integer;`

ИЛИ обернуть вокруг to_integer

function to_integer (ARG : std_logic)
    return integer is
    variable t : unsigned(0 downto 0) := "0";
begin
    t(0) := ARG;
    return to_integer(t);
end function to_integer;
person Parth Parikh    schedule 03.07.2017
comment
Эта функция неверна. Значения std_logic 'U', 'X', 'Z', 'W', 'L' и 'H' ('-' никогда не является выходом) преобразуются в 0. std_logic не совпадает с bit. - person JHBonarius; 03.07.2017
comment
@JHBonarius О да, ARG = '1' OR ARG='H' было бы идеально. Если вы посмотрите на numeric_std-body.vhd, он по существу интерпретирует остальные только как 0. - person Parth Parikh; 03.07.2017
comment
Можно ли иметь один бит как беззнаковый? Я имею в виду, to_integer(unsigned(index(9))). Нужно ли иметь массив для беззнакового преобразования? - person user2624915; 03.07.2017
comment
@ParthParikh нет, это не совсем так. функции TO_01 преобразуют только '0'/'L' и '1'/'H'. Все остальные значения помечаются как плохие элементы. Они фиксируются путем получения значения, установленного в переменной XMAP, которая по умолчанию установлена ​​​​на «0». Но это не означает, что установка их на 0 является правильной. Это просто исправление... - person JHBonarius; 03.07.2017
comment
@JHBonarius да, я посмотрел на это и предложил его как функцию исправления. Как насчет, return to_integer("" & ARG) ? - person Parth Parikh; 03.07.2017
comment
В numeric_std функция to_integer определена только для беззнакового типа. function TO_INTEGER (ARG : UNRESOLVED_SIGNED) return INTEGER; указано в пакете numeric_std сразу после объявления function TO_INTEGER (ARG : UNRESOLVED_UNSIGNED) return NATURAL;. Вы должны быть осторожны, пытаясь делать общие утверждения. - person ; 03.07.2017
comment
@ParthParikh Тогда вы должны использовать функцию по умолчанию. Но я бы не стал создавать функцию std_logic-›integer вообще. std_logic_arith не зря устарел. Кастинг должен быть в коде: tmp = fmax_data(to_integer(unsigned(index(9))));. Или просто используйте tmp = fmax_data(to_integer(index(9 downto 9)));. В этом нет ничего плохого. - person JHBonarius; 03.07.2017