Назначение литералов VHDL

Я пытаюсь использовать целые числа без знака в VHDL с четко определенной разрядностью. Кажется, VHDL не нравится, когда я пытаюсь присвоить литеральные значения этим типам, определенным как:

variable LCD_DATA: unsigned(19 downto 0) := 0;

Но в моей среде IDE (Quartus) я получаю жалобу «Тип UNSIGNED не соответствует целочисленному литералу». Я также получаю жалобы на добавление чисел к типам, определенным таким образом. Какое предпочтительное изменение мне нужно сделать?


person Christopher Brown    schedule 18.03.2014    source источник


Ответы (3)


См. другие ответы и обратите внимание, что для ненулевых литералов вы, вероятно, захотите сделать что-то вроде:

variable LCD_DATA: unsigned(19 downto 0) := to_unsigned(n, 20);

Замените литерал на n. Конечно, это работает и для n=0, но не так аккуратно, как (others => '0').

person fru1tbat    schedule 18.03.2014
comment
LCD_DATA'LENGTH не доступен до точки с запятой. IEEE Std 1076-1993 10.3, примечания 2. Правила, определяющие непосредственную область действия, скрытие и видимость, подразумевают, что ссылка на идентификатор, символьный литерал или символ оператора в его собственном объявлении недопустима (за исключением проектных единиц). Идентификатор, символьный литерал или символ оператора скрывают внешние омографы в своей непосредственной области действия, то есть с начала объявления. С другой стороны, идентификатор, символьный литерал или символ оператора видны только после окончания объявления (опять же, за исключением проектных единиц). - person ; 19.03.2014
comment
Для -2008 это Раздел 12.3 Видимость, то же Примечание 2. - person ; 19.03.2014
comment
Первоначальный ошибочный ответ предоставил variable LCD_DATA: unsigned(19 downto 0) := to_unsigned(n, LCD_DATA'length); По существу что-то недоступно, пока оно не будет объявлено, а объявление variable_declaration ::= [ shared ] variable identifier_list : subtype_indication [ := expression ] ;, откуда берется комментарий после точки с запятой. См. IEEE Std 1076-1993 4.3.1.3 (6.4.2.4-2008) Объявления переменных. - person ; 19.03.2014
comment
Да, я так привык использовать эту конструкцию в процессах и т. д., что забыл, что она запрещена в объявлениях. - person fru1tbat; 19.03.2014

--Either 
variable LCD_DATA: unsigned(19 downto 0) := (others => '0');
--Or you can also write it like 
variable LCD_DATA: unsigned(19 downto 0) := "00000000000000000000";

И для 2-й части вашего вопроса при добавлении номера этого типа.

library ieee;
use ieee.std_logic_1164.all;
use IEEE.NUMERIC_STD.ALL;

Проверьте, использовали ли вы вышеуказанные библиотеки в коде или нет.

person user3217310    schedule 18.03.2014

unsigned относится к std_ulogic, где значением элемента будет «0».

variable LCD_DATA: unsigned (19 downto 0) := (others => '0');

который предоставляет агрегат для назначения по умолчанию со всеми элементами, установленными на «0».

Вы не можете назначить один элемент целочисленного типа массиву элементов std_ulogic.

Вы можете добавить знаковое или беззнаковое значение к натуральному (беззнаковому) или целому числу (со знаком), используя функции «+», определенные в пакете numeric_std:

  -- Id: A.5
  function "+" (L: UNSIGNED; R: NATURAL) return UNSIGNED;
  -- Result subtype: UNSIGNED(L'LENGTH-1 downto 0).
  -- Result: Adds an UNSIGNED vector, L, with a non-negative INTEGER, R.

  -- Id: A.6
  function "+" (L: NATURAL; R: UNSIGNED) return UNSIGNED;
  -- Result subtype: UNSIGNED(R'LENGTH-1 downto 0).
  -- Result: Adds a non-negative INTEGER, L, with an UNSIGNED vector, R.

  -- Id: A.7
  function "+" (L: INTEGER; R: SIGNED) return SIGNED;
  -- Result subtype: SIGNED(R'LENGTH-1 downto 0).
  -- Result: Adds an INTEGER, L(may be positive or negative), to a SIGNED
  --         vector, R.

  -- Id: A.8
  function "+" (L: SIGNED; R: INTEGER) return SIGNED;
  -- Result subtype: SIGNED(L'LENGTH-1 downto 0).
  -- Result: Adds a SIGNED vector, L, to an INTEGER, R.
person Community    schedule 18.03.2014