|
Помогите разобраться с библиотеками (VHDL) |
|
|
|
Dec 27 2006, 11:43
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 23-08-06
Пользователь №: 19 771

|
Всем привет и с наступающим Новым годом,
Наработав некоторое кол-во проектов (VHDL, Quartus) решил свалить более-менее универсальные компоненты и функции в пользовательскую библиотеку - в результате пришел к выводу, что не знаю как это сделать. Стал читать описания - продвинулся не сильно. Помогите разобраться с некоторыми вопросами:
1) Для примера (VHDL, Quartus)- библиотека парам. модулей: Library- LPM ... package -lpm_components...File - lpm_pack.vhd. Если открыть файл - то он содежит пакет с объявлениями компонентов, а где хранятся собственно описания? Как вся эта "кухня" работает? Я поймал себя на том, что просто "втыкал" library и use, и не особенно задумывался по этому поводу.
2)Как подобно примеру приведенному выше создать собственную библиотеку.
Понимаю, что вопросы наивны и путанны - помогите внести ясность (разъяснениями, ссылками и т. д.) В книгах этому вопросу отводят немного.
Спасибо.
Сообщение отредактировал Elf - Dec 27 2006, 11:44
|
|
|
|
|
Dec 29 2006, 20:10
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Про Quartus не скажу ничего. Использовал билиотеки для Моделсима. Все VHDL модули объекты компилируются в какие-то библиотеки. Новые объекты всегда компилируются в библиотеку с логическим именем WORK. Потом (при компиляции другого модуля) эту библиотеку можно использовать под другим именем как ресурсную библиотеку. Связь логических имен библиотек с путями на диске в принципе должна задаваться в настройках среды для каждого компилируемого модуля - логическое имя библиотеки не хранится в самой библиотеке. Иногда эти настройки глобальные. Директива VHDL 'library' вводит в текущее пространство имен логическое имя библиотеки. В принципе, после объявления имени библиотеки можно использовать объекты из нее сразу без директивы use - написав полное имя объекта с указанием библиотеки. К сожалению, не все среды это поддерживают, хоть и обязаны. Директива use вводит указанные имена из библиотеки в текущее пространство имен - чтобы можно было использовать эти имена без префикса библиотеки. Еще в начале каждого модуля неявно написано: Код library STD, WORK; use STD.STANDARD.all; Пакеты, компоненты и архитектуры - это модули, которые хранятся в библиотеках. В принципе для использования скомпилированной библиотеки текстовые исходники не нужны, описания компонентов хранятся в самих библиотеках в скомпилированном виде. Но, к сожалению, инструментарий для работы с библиотеками, особенно, системными, традиционно крайне скуден. Поэтому текстовые исходники полезны в качестве хелпа.
--------------------
Пишите в личку.
|
|
|
|
|
Dec 29 2006, 23:39
|

Знающий
   
Группа: Свой
Сообщений: 541
Регистрация: 11-04-05
Из: Москва
Пользователь №: 4 045

|
Цитата(Oldring @ Dec 29 2006, 20:10)  Все VHDL модули объекты компилируются в какие-то библиотеки. Новые объекты всегда компилируются в библиотеку с логическим именем WORK. Вот и неправда Ваша, можно указать ModelSim'у в какую библиотеку компилировать каждый файл. Это очень удобно, например, при поведенческом (до синтеза) моделировании проектов с большим числом компонентов (или состоящие из нескольких ПЛИС) - компоненты компиляем в одну библиотеку (для каждой ПЛИС - в свою), тестбенч - в другую. Если прописать свою библиотеку в modelsim.ini лежащий в папке с ModelSim'ом, то она будет доступна всегда, каким бы образом моделирование ни запускалось. Использование своих библиотек при синтезе у Xilinx (про Альтеру не скажу) хоть и возможно вроде (не помню точно достиг я результата в этом или нет, однако неприятный осадок остался), но процесс мне показался слишком утомительным и я решил для себя им впредь не пользоваться.
--------------------
Дурак, занимающий высокий пост, подобен человеку на вершине горы - все ему кажется маленьким, а всем остальным кажется маленьким он сам. /Законы Мерфи/
|
|
|
|
|
Dec 30 2006, 00:54
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(BSV @ Dec 29 2006, 23:39)  Цитата(Oldring @ Dec 29 2006, 20:10)  Все VHDL модули объекты компилируются в какие-то библиотеки. Новые объекты всегда компилируются в библиотеку с логическим именем WORK.
Вот и неправда Ваша, можно указать ModelSim'у в какую библиотеку компилировать каждый файл. Это очень удобно, например, при поведенческом (до синтеза) моделировании проектов с большим числом компонентов (или состоящие из нескольких ПЛИС) - компоненты компиляем в одну библиотеку (для каждой ПЛИС - в свою), тестбенч - в другую. А вот и правда моя. У каждой физической библиотеки могут быть разные логические имена. Кроме того, библиотеки бывают рабочими и ресурсными. Рабочей называется та единственная библиотека, в которую компилируется текущий модуль. У нее при компиляции всегда есть логическое имя WORK. Конечно, при компиляции разных модулей это могут быть разные физические библиотеки. Читайте LRM. Кстати, довольно удобно. Если нескорлько модулей компилируются в одну библиотеку - друг к другу они могут ссылаться через имя библиотеки WORK, а не под тем именем, под которым библиотека будет использоваться потом как ресурсная.
--------------------
Пишите в личку.
|
|
|
|
|
Dec 30 2006, 21:24
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(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 исключительно для именования рабочей библиотеки - библиотеки, в которую компилируется текущий модуль.
--------------------
Пишите в личку.
|
|
|
|
|
Dec 30 2006, 23:38
|

Знающий
   
Группа: Свой
Сообщений: 541
Регистрация: 11-04-05
Из: Москва
Пользователь №: 4 045

|
Цитата(Oldring @ Dec 30 2006, 21:24)  Логическое имя библиотеки WORK используется в VHDL исключительно для именования рабочей библиотеки - библиотеки, в которую компилируется текущий модуль. Вы правы, я упустил в первом вашем посте выделенное ключевое слово. Действительно, я спутал физические и логические имена библиотек, сер, необразован, LRM не читал (теперь буду заглядывать)  . Проблема-то у человека была как раз с физическими библиотеками - как из той физической библиотеки, на которую ссылается WORK сделать физическую библиотеку с определенными физическим и логическим именами, да еще, чтобы это синтезатор понял правильно (шут его знает в каком виде они лежат).
--------------------
Дурак, занимающий высокий пост, подобен человеку на вершине горы - все ему кажется маленьким, а всем остальным кажется маленьким он сам. /Законы Мерфи/
|
|
|
|
|
Dec 31 2006, 00:09
|
Группа: Новичок
Сообщений: 4
Регистрация: 30-12-06
Пользователь №: 24 020

|
Всем здравствуйте и с наступающим 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.
|
|
|
|
|
Jan 1 2007, 18:10
|
Местный
  
Группа: Участник
Сообщений: 468
Регистрация: 4-03-05
Пользователь №: 3 066

|
Возможно Вам поможет вот такой вариант: 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; Насколько такой путь корректен, сложно сказать, но это работае  . Можно попробовать и немного по другому. В окне Settings, на странице User Libraries (Current Project) в поле Library Name написать имя своей библиотеки и нажать кнопку ADD. При этом файл библиотеки должен быть включен в проект и название библиотеки должно совпадать с именем файла. Впрочем, судя по содержимому файла *.qsf, эти два варианта абсолютно одинаковые, т.к. приводят к появлению одной и той же команды: set_global_assignment -name VHDL_FILE my_lib.vhd -library my_lib
|
|
|
|
|
Jan 2 2007, 13:03
|
Группа: Новичок
Сообщений: 4
Регистрация: 30-12-06
Пользователь №: 24 020

|
Самурай <= спасибо. Путь который ты описал, на мой взгляд, вполне корректен. Но моя проблема более касалась библиотек компонентов - т.е по сути проектов. Дело в том, что используя 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 в виде исходников.
Возможно, мои рассуждения некорректны. Все это требует проверки. Если у кого-то другие мысли по этому поводу - пишите.
Всего наилучшего.
|
|
|
|
|
Jan 2 2007, 20:35
|
Местный
  
Группа: Участник
Сообщений: 468
Регистрация: 4-03-05
Пользователь №: 3 066

|
Процитирую самого себя  , а потом еще немного добавлю: Цитата Можно попробовать и немного по другому. В окне 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. Я думаю, Вы будете немного удивлены  , найдя здесь описание ВСЕХ параметризованных модулей и мегафункций Alterы, правда на языке AHDL:).
|
|
|
|
|
Jan 2 2007, 21:59
|
Группа: Новичок
Сообщений: 4
Регистрация: 30-12-06
Пользователь №: 24 020

|
Да действительно - эти файлы там есть. Причем, когда я пытался разобраться с библиотеками я их видел, но тогда не придал значения, так как искал VHDL файлы. По-моему вопрос решен. Во всяком случае есть способы, может и не идеальные, но вполне применимые. И мне почему-то кажется, что из Quartus большего не выжать. Хотя может я и ошибаюсь. Если у кого есть еще инфа - пишите. Спасибо. (Отдельное - Самураю).
|
|
|
|
|
Mar 19 2007, 22:59
|

Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 8-11-05
Из: Москва
Пользователь №: 10 605

|
Цитата(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.
|
|
|
|
|
Mar 19 2007, 23:23
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(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.
--------------------
Пишите в личку.
|
|
|
|
|
Mar 21 2007, 12:20
|

Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 8-11-05
Из: Москва
Пользователь №: 10 605

|
Цитата(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 стандарт это самый лучший, самый справедливый стандарт в мире, те, кому что-то в нем не нравится - профессионально не пригодны, читать и перечитывать до просветления.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|