Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобраться с библиотеками (VHDL)
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
Elf
Всем привет и с наступающим Новым годом,

Наработав некоторое кол-во проектов (VHDL, Quartus) решил свалить более-менее универсальные компоненты и функции в пользовательскую библиотеку - в результате пришел к выводу, что не знаю как это сделать. Стал читать описания - продвинулся не сильно. Помогите разобраться с некоторыми вопросами:

1) Для примера (VHDL, Quartus)- библиотека парам. модулей: Library- LPM ... package -lpm_components...File - lpm_pack.vhd.
Если открыть файл - то он содежит пакет с объявлениями компонентов, а где хранятся собственно описания? Как вся эта "кухня" работает? Я поймал себя на том, что просто "втыкал" library и use, и не особенно задумывался по этому поводу.

2)Как подобно примеру приведенному выше создать собственную библиотеку.

Понимаю, что вопросы наивны и путанны - помогите внести ясность (разъяснениями, ссылками и т. д.)
В книгах этому вопросу отводят немного.

Спасибо.
Oldring
Про Quartus не скажу ничего. Использовал билиотеки для Моделсима.

Все VHDL модули объекты компилируются в какие-то библиотеки. Новые объекты всегда компилируются в библиотеку с логическим именем WORK. Потом (при компиляции другого модуля) эту библиотеку можно использовать под другим именем как ресурсную библиотеку. Связь логических имен библиотек с путями на диске в принципе должна задаваться в настройках среды для каждого компилируемого модуля - логическое имя библиотеки не хранится в самой библиотеке. Иногда эти настройки глобальные. Директива VHDL 'library' вводит в текущее пространство имен логическое имя библиотеки.

В принципе, после объявления имени библиотеки можно использовать объекты из нее сразу без директивы use - написав полное имя объекта с указанием библиотеки. К сожалению, не все среды это поддерживают, хоть и обязаны. Директива use вводит указанные имена из библиотеки в текущее пространство имен - чтобы можно было использовать эти имена без префикса библиотеки.

Еще в начале каждого модуля неявно написано:

Код
library STD, WORK;
use STD.STANDARD.all;


Пакеты, компоненты и архитектуры - это модули, которые хранятся в библиотеках. В принципе для использования скомпилированной библиотеки текстовые исходники не нужны, описания компонентов хранятся в самих библиотеках в скомпилированном виде. Но, к сожалению, инструментарий для работы с библиотеками, особенно, системными, традиционно крайне скуден. Поэтому текстовые исходники полезны в качестве хелпа.
BSV
Цитата(Oldring @ Dec 29 2006, 20:10) *
Все VHDL модули объекты компилируются в какие-то библиотеки. Новые объекты всегда компилируются в библиотеку с логическим именем WORK.


Вот и неправда Ваша, можно указать ModelSim'у в какую библиотеку компилировать каждый файл. Это очень удобно, например, при поведенческом (до синтеза) моделировании проектов с большим числом компонентов (или состоящие из нескольких ПЛИС) - компоненты компиляем в одну библиотеку (для каждой ПЛИС - в свою), тестбенч - в другую.

Если прописать свою библиотеку в modelsim.ini лежащий в папке с ModelSim'ом, то она будет доступна всегда, каким бы образом моделирование ни запускалось.

Использование своих библиотек при синтезе у Xilinx (про Альтеру не скажу) хоть и возможно вроде (не помню точно достиг я результата в этом или нет, однако неприятный осадок остался), но процесс мне показался слишком утомительным и я решил для себя им впредь не пользоваться.
Oldring
Цитата(BSV @ Dec 29 2006, 23:39) *
Цитата(Oldring @ Dec 29 2006, 20:10) *

Все VHDL модули объекты компилируются в какие-то библиотеки. Новые объекты всегда компилируются в библиотеку с логическим именем WORK.


Вот и неправда Ваша, можно указать ModelSim'у в какую библиотеку компилировать каждый файл. Это очень удобно, например, при поведенческом (до синтеза) моделировании проектов с большим числом компонентов (или состоящие из нескольких ПЛИС) - компоненты компиляем в одну библиотеку (для каждой ПЛИС - в свою), тестбенч - в другую.


А вот и правда моя. У каждой физической библиотеки могут быть разные логические имена. Кроме того, библиотеки бывают рабочими и ресурсными. Рабочей называется та единственная библиотека, в которую компилируется текущий модуль. У нее при компиляции всегда есть логическое имя WORK. Конечно, при компиляции разных модулей это могут быть разные физические библиотеки. Читайте LRM.

Кстати, довольно удобно. Если нескорлько модулей компилируются в одну библиотеку - друг к другу они могут ссылаться через имя библиотеки WORK, а не под тем именем, под которым библиотека будет использоваться потом как ресурсная.
BSV
Вот в чем заключается отличие рабочих и ресурсных библиотек:

Design libraries can be used in two ways: 1) as a local working library that contains the compiled version of your design; 2) as a resource library. The contents of your working library will change as you update your design and recompile. A resource library is typically static and serves as a parts source for your design.

При этом никто не говорит, что рабочих библиотек не может быть несколько.

А вот в чем особенность библиотеки WORK:

The library named "work" has special attributes within QuestaSim; it is predefined in the compiler and need not be declared explicitly (i.e. library work). It is also the library name used by the compiler as the default destination of compiled design units (i.e., it doesn’t need to be mapped). In other words the work library is the default working library.

То есть ее всего лишь можно не объявлять явно и при компиляции явно (vcom -work <library name>) не указывать:

By default, this is the library named work. To change the current working library, you can use vcom -work and specify the name of the desired target library.
Oldring
Цитата(BSV @ Dec 30 2006, 20:05) *
При этом никто не говорит, что рабочих библиотек не может быть несколько.


LRM раздел 11.2. Only one library is the working library during the analysis of any given design unit.

Вообще-то каждая библиотека является рабочей при компиляции входящих в неё модулей. И она всегда для своего модуля имеет логическое имя WORK. Library logical name WORK denotes the current working library during a given analysis Читайте LRM.

Добавлю. Вы, видимо, имеете в виду физическую библиотеку с именем на диске work. Эта библиотека может использоваться любым модулем как ресурсная библиотека под любым логическим именем, не конфликтующим с другими используемыми этим модулем логическими именами библиотек. Логическое имя библиотеки WORK используется в VHDL исключительно для именования рабочей библиотеки - библиотеки, в которую компилируется текущий модуль.
BSV
Цитата(Oldring @ Dec 30 2006, 21:24) *
Логическое имя библиотеки WORK используется в VHDL исключительно для именования рабочей библиотеки - библиотеки, в которую компилируется текущий модуль.


Вы правы, я упустил в первом вашем посте выделенное ключевое слово. Действительно, я спутал физические и логические имена библиотек, сер, необразован, LRM не читал (теперь буду заглядывать) wacko.gif .

Проблема-то у человека была как раз с физическими библиотеками - как из той физической библиотеки, на которую ссылается WORK сделать физическую библиотеку с определенными физическим и логическим именами, да еще, чтобы это синтезатор понял правильно (шут его знает в каком виде они лежат).
De-ep
Всем здравствуйте и с наступающим 2007!

De-ep - это тот же Elf. Я пишу с другого компа, забыл свои данные для входа, пришлось еще раз зарегиться.

Спасибо всем кто отозвался по поводу VHDL библиотек. Когда я увидел что реакция последовала далеко не сразу - понял что с библиотеками вопрос мутный.
Все что я нарыл в Quartus - это три способа организации библиотек:

-In the File Properties dialog box in the Quartus II graphical user interface (GUI)
-In the Quartus Settings File (.qsf) or with a Tcl command
-In the VHDL file itself, using a synthesis directive

Они более менее объяснены в хелпе Quartus в разделе "Organizing a VHDL Design into Libraries"

Мне казалось, что победа рядом, но справиться пока так и не смог.

Интересен последний способ где надо указать директиву типа

-- synthesis library my_lib

my_lib - название библиотеки. Директива указывает куда компилироватьпроект, причем, как заявлено, эта директива "перешибает" дефолтовый WORK и остальные способы задания библиотек.

Однако, задавая подобную директиву и указывая библиотеку не могу ее найти после компиляции.
В другом проекте задаю ее имя для использования но компилятор ругается - нет такой библиотеки.

Решил поизучать как созданы библитеки поставляемые с Quartus, например файл SYN_ARITH.VHD от Synopsys.
Там нашел следующее:
-- Altera Synthesis Directive Attributes
library altera;
use altera.altera_internal_syn.all;

Далее нашел пакет altera_internal_syn и увидел следующий заголовок:

-- Copyright © 2003 by Altera Corp. All rights reserved. --
-- Description: Declares utility package for internal Altera synthesis --
-- support. --
-- *** USER DESIGNS SHOULD NOT INCLUDE THIS PACKAGE DIRECTLY ***

Похоже, свои бибиотеки интегрированы в Quartus, тогда непонятно есть ли вообще возможность создать что-либо подобное юзерское.


Исходная цель - создать пользовательскую библитеку, что бы потом только указть LIBRARY такая-то и USE пакет такой-то, в системе Quartus пока так и не достигнута.
Если кто что знает пожалуйста пишите.

Всех благ. De-ep он же Elf.
Самурай
Возможно Вам поможет вот такой вариант:

1. Помещаете все свои типы, константы и ф-и в один или несколько пакетов. Описание пакетов размещаете в библиотеке, допустим my_lib.vhd. Для некоторых САПР требуется, чтобы имя библиотеки совпадало с именем файла, в Quartuse, насколько я понял, это не обязательно.

2. Добавляете файл библиотеки в свой проект. После этого для библиотечного файла в окне File Properties в поле Type выбираете VHDL File, а в поле Library указываете название своей библиотеки: my_lib.

Пользоваться своей библиотекой после этого можно, как и любой другой. Там, где это нужно просто объявляете свою библиотеку и все используемые компоненты из нее:

library my_lib;
use my_lib.my_package_1.all;
use my_lib. my_package_2.all;
use my_lib. my_package_3.all;

Насколько такой путь корректен, сложно сказать, но это работаеsmile.gif.

Можно попробовать и немного по другому. В окне Settings, на странице User Libraries (Current Project) в поле Library Name написать имя своей библиотеки и нажать кнопку ADD. При этом файл библиотеки должен быть включен в проект и название библиотеки должно совпадать с именем файла.

Впрочем, судя по содержимому файла *.qsf, эти два варианта абсолютно одинаковые, т.к. приводят к появлению одной и той же команды:

set_global_assignment -name VHDL_FILE my_lib.vhd -library my_lib
De-ep
Самурай <= спасибо. Путь который ты описал, на мой взгляд, вполне корректен.
Но моя проблема более касалась библиотек компонентов - т.е по сути проектов.
Дело в том, что используя package можно указать component declaration, но в package body не указать architecture. В описании VHDL сказано, что Package Body может содержать:
-subprogram declaration
-subprogram body
-type, subtype declaration
-constant declaration
-file declaration
-alias declaration
-use clause

Если в Quartus создавать проект с спользованием ранее созданных компонетов (проектов) - то в Settings->Files предлагается "Select the Design Files You Want to Include to the project". Такми образом можно включить в процесс компиляции исходники ранее созданных компонентов.
Однако используя компоненты поставляемые с Quartus, например параметризованные модули, достаточно указать библиотеку LPM (Library of Parameterized Modules).
Вот я и заинтересовался есть ли инструментарий для создания подобной библиотеки или можно только свалить свои исходники в какой-нибудь каталог и при помощи "Select the Design Files You Want to Include to the project" присоединять необходимые к процессу компиляции.
Похоже, что бибиотеки поставляемые с Quartus интегрированы в него и вряд ли можно создать что-либо подобное пользовательскими средствами.
Что же касается функций, констант, типов и т. д. - то их можно хранить в едином файле и ссылаться на него как на юзерскую библиотеку, как ты и предложил.

Пока получается так - в юзеской библиотеке можно создать component declaration, а архитектуру компонентов подключать через Settings->Files в виде исходников.

Возможно, мои рассуждения некорректны. Все это требует проверки.
Если у кого-то другие мысли по этому поводу - пишите.


Всего наилучшего.
Самурай
Процитирую самого себяsmile.gif, а потом еще немного добавлю:

Цитата
Можно попробовать и немного по другому. В окне Settings, на странице User Libraries (Current Project) в поле Library Name написать имя своей библиотеки и нажать кнопку ADD. При этом файл библиотеки должен быть включен в проект и название библиотеки должно совпадать с именем файла.


Таким способом можно не только сопоставить с *.vhd файлом одноименную библиотеку, но и сказать компилятору в каких директориях он должен искать файлы с architecture body. При этом библиотека с пакетами, в которых описаны компоненты, соответствующие этим architecture body, должна быть подключена так, как я говорил выше.

Библиотеки, подключенные таким образом, могут использоваться только в текущем проекте.
Директории, хранящие библиотеки для всех проектов, задаются на странице Global User Libraries (All Project) в меню Tools/Options/General.

А что касается вот этого:

Цитата
1) Для примера (VHDL, Quartus)- библиотека парам. модулей: Library- LPM ... package -lpm_components...File - lpm_pack.vhd.
Если открыть файл - то он содержит пакет с объявлениями компонентов, а где хранятся собственно описания? Как вся эта "кухня" работает?


то посмотрите директорию \quartusxx\libraries\megafunctions. Я думаю, Вы будете немного удивленыsmile.gif, найдя здесь описание ВСЕХ параметризованных модулей и мегафункций Alterы, правда на языке AHDL:).
De-ep
Да действительно - эти файлы там есть.
Причем, когда я пытался разобраться с библиотеками я их видел, но тогда не придал значения, так как искал VHDL файлы.

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


Если у кого есть еще инфа - пишите.


Спасибо. (Отдельное - Самураю). cheers.gif
vleo
Цитата(Oldring @ Dec 30 2006, 00:54) *
А вот и правда моя. У каждой физической библиотеки могут быть разные логические имена. Кроме того, библиотеки бывают рабочими и ресурсными. Рабочей называется та единственная библиотека, в которую компилируется текущий модуль. У нее при компиляции всегда есть логическое имя WORK. Конечно, при компиляции разных модулей это могут быть разные физические библиотеки. Читайте LRM.

Кстати, довольно удобно. Если нескорлько модулей компилируются в одну библиотеку - друг к другу они могут ссылаться через имя библиотеки WORK, а не под тем именем, под которым библиотека будет использоваться потом как ресурсная.


Да, проверил, Вы правы :-) Однако, я бы уточнил - можно собирать сразу в другую библиотеку, указав ее компилятору.

Например, в Aldec AHDL указывается какая библиотека будет рабочей в установках проекта,
в других имеющихся под рукой системах можно указать компилятору в какую библиотеку класть модуль:

ModelSim:
vlib xyz
vcom -93 -work xyz a.vhd,

в GNU-HDL:
ghdl -a --work=xyz a.vhd

в Free-HDL:
gvhdl -l xyz a.vhd

Но создается виртаульная библиотека work, только на время сборки модуля, как синоним. Вот пример этого, считая,
что компилируем вышеуказанными командами:
Код
---------------- a.vhd -----------------
entity E1 is
port (signal a: in bit; signal b: out bit);
end;

architecture A of E1 is
begin
   b <= not a;
end;

------------------------------------------------------

entity E2 is end;

architecture A of E2 is
signal x,y : bit;
begin
  u1: entity work.E1(A)
  port map (x,y);
end;
------------------------------------------------------

library xyz;
entity E3 is end;

architecture A of E3 is
signal x,y : bit;
begin
  u1: entity xyz.E1(A)
  port map (x,y);
end;


Что касается Quartus то смотрите 3 способа: страница 8-13 "Quartus II Version 6.0 Handbook", volume 1.
Самый прямолинейный - в Project Navigator/Design Files ПКМ на файле, Properties/Library - вписывается имя библиотеки,
то есть для нашего примера xyz.
Oldring
Цитата(vleo @ Mar 19 2007, 22:59) *
Да, проверил, Вы правы :-) Однако, я бы уточнил - можно собирать сразу в другую библиотеку, указав ее компилятору.

Например, в Aldec AHDL указывается какая библиотека будет рабочей в установках проекта,
в других имеющихся под рукой системах можно указать компилятору в какую библиотеку класть модуль:


http://electronix.ru/forum/index.php?s=&am...st&p=192511

конструкция library xyz; вводит в пространство имен модуля имя xyz как логическое имя некоторой библиотеки. Любой. Ничего больше. Логическое имя WORK описывать не нужно - оно введено в пространство имен с самого начала.

В разных модулях одна и та же физическая библиотека может быть под разными именами. Согласно стандарту связь между логическими библиотеками и физическими библиотеками задается в настройках VHDL системы. Система должна позволять такую связь устанавливать. Нравится GNU-HDL вводить при компиляции модуля в физическую библиотеку xyz связь логическое имя xyz = физическая библиотека xyz в дополнение к обязательному логическое имя work = физическое имя xyz - это их право. Но VHDL система не обязана так поступать, по крайней мере, без явной просьбы программиста.

Кроме того, если GNU-HDL не позволяет логическое имя xyz связать не с физической библиотекой xyz, а, скажем, с физической библиотекой abc - он нарушает требования LRM.
vleo
Цитата(Oldring @ Mar 19 2007, 23:23) *
http://electronix.ru/forum/index.php?s=&am...st&p=192511



Кроме того, если GNU-HDL не позволяет логическое имя xyz связать не с физической библиотекой xyz, а, скажем, с физической библиотекой abc - он нарушает требования LRM.


Это что-ли наезд на gnu-HDL? Его поведение совершенно аналогично поведению vcom (ModelSim). А уж укладывается ли поведение vcom в IEEE-1076 - Вам виднее. Безусловно, там есть возможность связать любую физическую библиотеку с логическим именем. Но, те, что собраны под определенным именем, в рабочей директории проекта сразу под такими именами доступны, без дополнительных настроек.

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

Если провести аналогию с C, то требование стандарта звучит так, чтобы не было строгой привязки, то есть в
одной программе пишем:

#include <stdio.h>

а в другой пишем
#include <xyz.h>

а имеем в виду одно и тоже. Да на том же VHDL у Вас в одих модулях написаное:
library ieee;
use ieee.std_logic_1164.all;

а в других надо думать:

library xyz;
use xyz.std_logic_1164.all;

Нет, надо думать. Так что требования стандарта сводятся к тому, что на практике, библиотека хранится в каком-то файле или директории на файловой системе, и, можно подменить одну библиотеку другой, а также то, что сама библиотека не должна быть привязана к своем собственном имени.

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

p.s. Делаю, специально для Вас, чтобы на эту тему не дискутировать

VHDL стандарт это самый лучший, самый справедливый стандарт в мире, те, кому что-то в нем не нравится - профессионально не пригодны, читать и перечитывать до просветления.
Oldring
Цитата(vleo @ Mar 21 2007, 12:20) *
Это что-ли наезд на gnu-HDL? Его поведение совершенно аналогично поведению vcom (ModelSim). А уж укладывается ли поведение vcom в IEEE-1076 - Вам виднее. Безусловно, там есть возможность связать любую физическую библиотеку с логическим именем. Но, те, что собраны под определенным именем, в рабочей директории проекта сразу под такими именами доступны, без дополнительных настроек.

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

Если провести аналогию с C, то требование стандарта звучит так, чтобы не было строгой привязки, то есть в
одной программе пишем:

#include <stdio.h>

а в другой пишем
#include <xyz.h>

а имеем в виду одно и тоже. Да на том же VHDL у Вас в одих модулях написаное:
library ieee;
use ieee.std_logic_1164.all;

а в других надо думать:

library xyz;
use xyz.std_logic_1164.all;

Нет, надо думать. Так что требования стандарта сводятся к тому, что на практике, библиотека хранится в каком-то файле или директории на файловой системе, и, можно подменить одну библиотеку другой, а также то, что сама библиотека не должна быть привязана к своем собственном имени.

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


Обычно не нужно, чтобы логические имена библиотек отличались от физических. Но можно. Стандарт почти ничего не пишет и среде исполнения - Вы, конечно, скажете, что это его недостаток, я частично с Вами соглашусь, но нельзя объять необъятное. Стандарт всего-лишь говорит, что логическое имя библиотеки не обязано совпадать с его физическим. В некоторых случаях это может быть критично. Например, при переносе кода в среду исполнения, работающую под MS-DOS, или какой-нибудь другой операционкой, которая накладывает ограничения на имена файлов, неожиданные для первоначального разработчика.

Цитата(vleo @ Mar 21 2007, 12:20) *
p.s. Делаю, специально для Вас, чтобы на эту тему не дискутировать

VHDL стандарт это самый лучший, самый справедливый стандарт в мире, те, кому что-то в нем не нравится - профессионально не пригодны, читать и перечитывать до просветления.


Это Ваше личное мнение - я такого не писал. Приведите конкретную цитату из стандарта, которая Вам не нравится - будет предмет спора по поводу стандарта. До сих пор спор был только о реализациях и о неправильном понимании стандарта. wink.gif

P.S. Кстати, vcom - безусловно, не пример безупречной реализации VHDL. То есть он конечно поддерживает язык лучше, чем большинство синтезаторов. Но ряд не совсем тривиальных конструкций у меня отказывались в нем работать. IMHO если бы MSVC так поддерживал плюсы - компанию-разработчика бы растерзали.

P.P.S Кстати, это интересный вопрос - что произойдет с Вашим примером в моделсиме, если не отмаппировать предварительно логическое имя библиотеки xyz в физическую библиотеку xyz при помощи vmap, или если указать в качестве аргумента vcom -work имя физической библиотеки, начинающееся с цифры, но предварительно отмаппировать xyz в эту библиотеку. Я лично так никогда не пытался делать. Подозреваю, что в первом случае библиотека xyz будет все-таки не найдена, а во втором - будет все нормально.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.