Условная генерация VHDL из make-файла - PullRequest
2 голосов
/ 10 февраля 2010

У меня есть VHDL дизайн, который нужно адаптировать к различным вариантам. Было бы неплохо иметь возможность генерировать конфигурации из make-файла. Makefile для генерации одного проекта готов и работает.

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

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

Есть ли у вас какие-либо предложения о том, как это сделать?

Я пытался использовать внешний прекомпилятор (gcc), но не смог заставить его работать. Более того, я не хочу заставлять других разработчиков устанавливать gcc или файлы vhdl, которые нельзя использовать из среды IDE Xilinx.


Редактировать: Добавление примера

У меня есть два продукта, A и B. Я хочу использовать одни и те же файлы для обоих продуктов, с условными исключениями для некоторых компонентов для продукта B, генерацией конфигураций для различных частей HW и, конечно, для других вещей.

Я хочу сгенерировать конфиги из командной строки: make product_A и make product_B.

Если я добавлю generates в свой vhdl для включения / исключения кода в зависимости от цели, тогда xst должен знать, какая цель создается. Вопрос в том, как передать текущую цель из make-файла в xst.

В C-коде, компилируемом с помощью gcc, я бы добавил исходный код:

#if defined(product_B)
    ...
#elsif defined(product_A)
    ...
#endif

, затем установите определение в make-файле:

product_A: source.c
    gcc -Dproduct_A source.c

product_B: source.c
    gcc -Dproduct_B source.c

Ответы [ 3 ]

7 голосов
/ 10 февраля 2010

Рассматривали ли вы использование оператора GENERATE vhdl и обертывание его вокруг логики, которую вы хотите настроить.

name : FOR N IN 1 TO 8 GENERATE

  concurrent statements here

END GENERATE name;

Затем, если вы добавите некоторые шаблоны конфигурации в файл верхнего уровня, вы сможете контролировать работу генерации.

EDIT

Вы можете установить GENERICS из командной строки в XST, используя:

-generics {имя = значение имя = значение}

Поддержка этого была добавлена ​​только начиная с 9.1.

3 голосов
/ 10 февраля 2010

У вас есть несколько вариантов здесь:

  1. Старайтесь не иметь разные файлы, но реализуйте все разные версии в одном. Это, безусловно, самый надежный подход . В VHDL есть несколько полезных конструкций, которые помогут вам в этом: обобщенные элементы, generate операторы, пакеты, конфигурации и т.
  2. Используйте внешний препроцессор макроса, чтобы иметь «шаблоны» VHDL-файла. Некоторые закаленные юниксоиды используют почтенный инструмент m4. Я бы выбрал другой путь и использовал бы полноценный язык программирования, такой как Python, с некоторой библиотекой шаблонов. Затем вы можете легко включить создание настоящих VHDL-файлов из этих шаблонов в свои make-файлы.

Во что бы то ни стало, попробуйте сначала перейти к варианту (1). Различия могут быть не такими плохими, как вы думаете.

2 голосов
/ 04 марта 2010

Generate - это способ сделать это - чтобы что-то скомпилировать или нет, вам нужно if generate:

product_a_gen: if product_a='1' generate
    -- some code in here
end generate product_a_gen;
product_b_gen: if product_b='1' generate
    -- some code in here
end generate product_b_gen;

VHDL2008 добавляет расширения для генерации, так что вы можете иметь case и else детали. У Дулоса есть аппликация на этом .

Будьте осторожны с XST и передавая дженерики, они ограничены тем, какие типы поддерживаются.

...