#methods #record #vhdl #xilinx
#методы #запись #vhdl #xilinx
Вопрос:
Возможно ли определить что-то вроде метода экземпляра в стиле ООП, чтобы запись в VHDL распознавалась XST?
Для записи типа прямоугольник:
type rectangle is record
x : integer;
y : integer;
width : integer;
height : integer;
end record;
Я хотел бы определить такие методы, как is_square, get_area и т.д.
Можно ли это сделать с помощью атрибутов?
Ответ №1:
Нет, но вы можете приблизиться к protected
типам.
Вот пример, взятый из защищенных общих переменных в VHDL: Стандарт IEEE Std 1076a
type shared_counter is protected body
variable count : integer := 0;
procedure reset is
begin
count := 0;
end procedure reset;
procedure increment (by : integer := 1) is
begin
count := count by;
end procedure increment;
impure function value return integer is
begin
return count;
end function value;
end protected body shared_counter;
Я понятия не имею, можно ли синтезировать концепцию защищенного типа с помощью XST.
Комментарии:
1. хм. они выглядят объектно-ориентированными. Вы пробовали их сами (с помощью какого синтезатора)? Также я обнаружил, что защищенные типы не поддерживаются в ISim xilinx.com/support/answers/33123.htm
2. Да, они довольно ОО. Я использовал их при моделировании с помощью Modelsim. И теперь, когда вы упомянули об этом, я попробовал их с ISIM, и, да, он подавился ими: (
Ответ №2:
Есть ли какая-то причина, по которой вы не хотите просто определять несколько функций вместе с вашими пользовательскими типами?
В дополнение к определению новых функций (таких как ваш is_square, выше), вы можете переопределить существующие функции (такие как , < и т.д.), Если это имеет смысл для вашего кода.
Обычно вы помещаете свои пользовательские типы и функции для управления ими в пакет, который затем используете в своем коде. Смотрите, например, стандартные пакеты VHDL math_real и numeric_std.
Комментарии:
1. причина в том, что такой подход не похож на ООП. Это выглядит более естественно при вызове встроенного атрибута my_std_logic_vector’length вместо get_length(my_std_logic_vector)