Скрытые особенности VHDL

Первоначальный вопрос:

Каковы некоторые действительно полезные, но эзотерические языковые функции в VHDL, которые вы действительно смогли использовать для полезной работы?

Исходный вопрос был удален, и я просто отвечал. Я думаю, что это интересный вопрос, особенно когда вы сравниваете VHDL с другими (нормальными) языками программирования.

Отказ от ответственности: в VHDL я сделал несколько простых примеров.

Но то, что мне особенно понравилось, по сравнению с другими языками программирования (что, вероятно, не то, о чем вы просите, но я думаю, что для этих целей каждый программист должен знать VHDL):

  • Возможность иметь несколько разных реализаций (архитектур) одного интерфейса и легко их заменять.

  • Низкая служебная информация parallelism, присущая языковой модели. Это напоминает мне языки потока данных.

Ответ 1

Каковы некоторые действительно полезные, но эзотерические языковые функции в VHDL...

Пользовательские физические типы, такие как "angle", "voltage", "temperature_coefficient", где вы можете писать такие вещи, как temp <= 45 deg; или volt <= 3.3 V;.

Ответ 2

Иногда есть несколько способов сделать что-то. Хорошо, в большинстве случаев вы можете делать что-то по-разному в VHDL. Посмотрите на ситуацию, когда вы хотите назначить разные значения сигналу на основе значения другого сигнала.

Выбранное назначение сигнала

Наиболее конкретный способ сделать это - с выбранным назначением сигнала. Основываясь на нескольких возможных значениях b, вы присваиваете значение a. Здесь нет избыточности кода.

with a select b <=
        "1000" when "00",
        "0100" when "01",
        "0010" when "10",
        "0001" when "11";

Условное присвоение сигнала

Конструкция условного назначения сигнала немного более общая. Для каждого варианта вы должны указать условие. Это означает, что вы можете написать любое логическое выражение как условие, которое даст вам больше свободы, чем проверка равенства. Хотя эта конструкция даст вам больше свободы, есть еще немного избыточности. Нам приходилось писать проверку равенства (a =) на каждой строке. Если вы используете сигнал с длинным именем, это сделает ваш код более громоздким. Кроме того, разделитель, используемый в выбранном сигнале, был запятой. В условном сигнале необходимо ключевое слово else. Больше кода для той же функциональности.

b <= "1000" when a = "00" else 
         "1000" when a = "01" else 
         "1000" when a = "10" else 
         "1000" when a = "11";

Комбинационный процесс с выражением о случаях

Наиболее обычно используемая конструкция - это процесс. Внутри этого процесса вы можете написать оператор case или каскад операторов if. Здесь есть еще больше избыточности. Вы скелетный код для процесса (начало, конец) и список чувствительности. Это не большое усилие, но пока я разрабатывал это, я поместил b в список чувствительности вместо a. Легко сделать небольшую ошибку. Вам также необходимо указать, что происходит в случаях other.

process(a)
begin
        case a is
                when "00" => b <= "1000";
                when "01" => b <= "0100";
                when "10" => b <= "0010";
                when "11" => b <= "0001";
                when others => assert "unreachable" severity failure;
        end case;
end process;

Хотя этот последний фрагмент кода является самым большим и, возможно, наиболее подверженным ошибкам, он, вероятно, также является наиболее распространенным. Он использует две знакомые и часто используемые конструкции: процесс и аргументы case.

Проблема с выбранными и условными назначениями сигналов заключается в том, что в их синтаксисе нет системы. Смысл почти идентичен, но синтаксис достаточно разный, чтобы отбросить вас. Я знаю многих инженеров, которые постоянно имеют копию Золотого справочника Doulos для VHDL, лежащего на их столах. Это хорошо для Doulos, потому что их имя постоянно упоминается.

Ответ 3

Лучшая особенность VHDL - это то, что она используется для проектирования и внедрения аппаратного обеспечения.:)

Возможность иметь несколько разных реализаций (архитектур) одного интерфейса и легко их обменивать.

То же самое с OOP в С++: вы можете определить один интерфейс и множество реализаций. В VHDL очень полезно создавать модели моделирования и синтеза для одного и того же устройства.

Низкие издержки parallelism, присущие языковой модели. Это напоминает мне языки потока данных.

На самом деле, есть библиотека SystemC для С++, которая реализует семантику параллельного выполнения. Вы можете легко загрузить и попробовать следующее: http://www.systemc.org. Я работаю над синтезом С++-to-RTL. Поэтому я надеюсь, что через 4-5 лет вся аппаратная разработка будет выполнена с использованием SystemC и С++.

Ответ 4

Что действительно полезно, но эзотерические функции языка в VHDL

Во-первых, я не покупаю теорию о том, что VHDL имеет "эзотерические" функции. Однако преобладающие "стили" VHDL, которые существуют в дикой природе, чаще всего зависят от того, какое подмножество VHDL поддерживается аппаратными синтезаторами.

Уравнение в мире VHDL очень просто: если инструменты поддерживают языковое подмножество, он будет использоваться. Если нет, функция, вероятно, будет недостаточно использоваться.

особенно при сравнении VHDL с другими (нормальными) языками программирования.

Обратите внимание, что VHDL не является языком программирования. Скорее, это язык для описания дискретных систем событий (с "случайным" следствием, что он может использоваться для описания цифрового оборудования). Я полагаю, что сравнение с языками программирования связано с VHDL, похожим на некоторые языки программирования.

Теперь о некоторых действительных ответах на вопрос ОП.

Каковы некоторые действительно полезные, но эзотерические языковые функции в VHDL...

Здесь мой выбор, в определенном порядке.

  • Архитектуры. На сегодняшний день возможность выбора различных архитектур для интерфейса является наиболее полезной функцией VHDL и которая используется в любое время.
  • Генераторы: используя генераторы, вы можете легко описать сложные регулярные аппаратные структуры. Думайте о мультипликаторах, сумматорах, сложных конвейерах и т.п. К сожалению, многие инструменты создают беспорядок из сгенерированного вывода.
  • Блоки: дешевый способ подразделять ваш дизайн на подблоки; не все инструменты поддерживают его, хотя.
  • Разрешение сигнала: очень полезно при моделировании схем и т.п., а не для аппаратного синтеза.
  • Атрибуты: отличный способ приложить инструкции к симулятору/синтезатору, чтобы помочь ему найти лучший способ реализовать вашу схему. Хотя в большинстве случаев это может быть сделано с помощью параметров командной строки для инструментов синтезатора/картографа/p & r, атрибуты чувствуют себя гораздо более естественными, поскольку вся информация, необходимая для создания вашего аппаратного обеспечения, ограничена одним местом.

Ответ 5

Довольно много особенностей "эзотерических" VHDL имеют свое происхождение в Ada. Я упоминаю об этом, потому что я не эксперт в Ada, но изучение Ada значительно улучшило мое видение того, что можно сделать в VHDL.

Ответ 6

Условное присвоение сигнала такое же, как оператор case, т.е. равные весовые ветки. Выбранное назначение сигнала - это структура приоритетного кодера, т.е. Эквивалентна вложенным операторам if/then/else. Обратите внимание, что все операторы параллельного присваивания в vhdl одинаково эквивалентны процессу с списком чувствительности, состоящим из сигналов в правой части оператора присваивания.

Мои любимые эзотерические функции - это конфигурации (которые особенно полезны при наличии нескольких архитектур одного и того же объекта) и типов доступа. Это позволяет создавать динамические структуры данных. Не полезно для аппаратного дизайна, но очень полезно для создания тестовых стендов. Метод, перегружающий мою подпись типа аргумента, также делает очень читаемый код - и это свойство, к сожалению, отсутствует в SystemVerilog.

Павел.

Ответ 7

Самая эзотерическая вещь, которую я знаю, - это комбинация трех принципов:

  • символьный литерал: '\'
  • расширенный идентификатор:\bar\
  • атрибуты: идентификатор атрибута

Теперь, что это выражение: foo '\' bar \ Это атрибут \bar\foo.

Я думаю, что vhdl lexer не выжил.

Ответ 8

  • У вас могут быть сигналы в пакете.

  • Вы можете создавать новые порты в конфигурации.

  • Вы можете перегружать функции на основе типа возврата.

  • Вы можете определять сигналы в сущности, которая может использоваться из архитектуры. Это не полезно ни для чего, что я знаю, но там.