mikrocontroller.net

Forum: FPGA, VHDL & Co. Compilieren von vhdl-code libraries


Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich arbeite mit Quartus II. Nun habe ich ein Projekt erstellt und möchte 
eine Libray einbinden. Irgendwie muss ich diese aber installieren bin 
aber noch nicht drauf gekommen, was ich tun muss. ..einfach nur in das 
Lib-Verzeichnis wo auch Quartus liegt zu kopieren reicht jedenfalls 
nicht aus:(

Habt ihr vielleicht einen Tipp wie ich da vorgehen muss?

Beste Grüsse und Danke

Geri

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gerhard,

was für eine Lib möchtest du einbinden? Eine VHDL-Lib oder z.B eine 
PCI-Compiler-"Lib" ?
Unter   "Project" -> "Add/Remove Files" kannst du Files oder UserLibs 
hinzufügen.

Vielleicht hilft dir das?

Gruß
R

Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rainer

Vielen Dank für Deinen Hinweis. Es ist eine Library, die in VHDL 
geschrieben ist.

In meinem Program steht am Anfang:

use std.textio.all;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.math_real.all;
use ieee.math_utility_pkg.all;
use ieee.float_pkg.all;

Nun habe ich die ensprechneden Files eingebunden, erhalte aber Fehler 
wie z.B.
Error: VHDL unsupported feature error at numeric_std.vhdl(91): nonobject 
aliases are not supported
Error: VHDL syntax error at numeric_std.vhdl(94) near text "("; 
expecting an identifier, or a string literal
Error: VHDL syntax error at numeric_std.vhdl(94) near text "("; 
expecting an identifier, or a string literal

usw.

Beste Grüsse
Geri

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In deinem VHDL-Code musst du natürlich auf die eingene Lib verweisen.

LIBRARY My_Lib;
USE My_Lib.test_package.all;

Dann holst du über "add/remove files" dieses Package dazu.

Achte darauf, dass es in der Liste der Files an ooberster Stelle steht, 
sonst  findet der Compiler das nicht (kleine Unschönheit bei Altera)

Bei mir funktioniert das einwandfrei!

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleine Ergänzung zu Schlumpf:
Die IEEE und STD sind implizit eingebunden.
Da braucht man nichts mehr machen.

Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Mit den eigenen Libs habe ich die ieee libs gemeint. Es handelt sich 
hier um eine Floating Point Library.

Hmm, muss man da nicht noch was zuerst compilieren und dann 
installiere:)?

Beste Grüsse und vielen Dank für Eure Tipps

Geri

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, ob du so einfach die ieee erweitern kannst, das weiss ich nicht. 
Gibt es einen bestimmten Grund, dass du sie nicht separat in eine eigene 
Library packen willst?

Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Schlumpf

Nein, es gibt keinen Grund. Ich habe mir auch gedacht, einfach ein 
Verzeichnis im Altera lib-Pfad anzulegen und sie IEEE_proposed zu 
nennen.

Ich komme aber eben auf die gleichen Fehler

Beste Grüsse
Geri

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probier´s mal so:
leg dein Package in´s Verzeichnis zu den anderen HDL-Files. Dann holst 
du es mit "add/remove Files" dazu.
Im Desing schreibst du dann:

LIBRARY work;
USE work.test_package.all;

Das sollte auf jeden Fall gehen

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mal ein Beispiel gemacht....

Das ist meine Library und sie liegt in den Verzeichnis 
e:\scratch\mylib\hdl

--#########################################
LIBRARY ieee;
USE ieee.std_logic_1164.all;

PACKAGE mylib_pkg IS
  constant myhigh : std_logic := '1';
END mylib_pkg;
--#########################################

und dann hab ich ein Desing in dem Verzeichnis e:\scratch\mylib_test\hdl

--#########################################
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;

LIBRARY mylib;
USE mylib.mylib_pkg.all;

ENTITY xxx IS
   PORT(
      In0  : IN     std_logic;
      In1  : IN     std_logic;
      Out0 : OUT    std_logic
   );
END xxx ;

ARCHITECTURE test OF xxx IS
BEGIN
  Out0 <= '1' when In0 = myhigh and In1 = myhigh else '0';
END test;
--#########################################

In Quartus habe ich über "add/ remove Files..." diese beiden Dateien 
dazugenommen. Darauf achten, dass das Package oben steht!! und es lässt 
sich fehlerfrei compilieren.





Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Schlumpf

Super, vielen Dank für Deine Tipps. Ich werde es heute mal ausprobieren 
und über das Ergebnis berichten.

Beste Grüsse

Geri

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gern geschehen. Ich hoff, dass du weiterkommst.
Viel Erfolg!

Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Also das Beispiel von Schlumpf habe ich probiert und es funktioniert. 
Nochmals vielen Dank an Dich.

Bei meinem Beispiel hänge ich allerdings immer noch an den Meldungen wie 
oben

Error: VHDL unsupported feature error at numeric_std.vhdl(91): nonobject
aliases are not supported
Error: VHDL syntax error at numeric_std.vhdl(94) near text "(";
expecting an identifier, or a string literal
Error: VHDL syntax error at numeric_std.vhdl(94) near text "(";
expecting an identifier, or a string literal

Das Beispiel (Testbench) kommt eigentlich direkt aus der downgeloadeten 
Library. Die Syntax müsste deshalb ja stimmen. Ich habe in Quartus II 
lediglich ein Projet erstellt.

Wen sich für die math-library interessiert, der findet sie übrigens 
hier:
http://www.eda.org/vhdl-200x/vhdl-200x-ft/packages...

Ganz unter unter IEEE.Float_Pkg

Beste Grüsse

Geri

Autor: G. B. (geri)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

So, ich habe hier mal mein Beispielprogramm angehängt. Wäre super, falls 
jemand von Euch mal einen kritischen Blick darüber werfen würde und mir 
mitteilen könnte, was ich falsch gemacht habe.

Beim Testprogramm handelt es sich um ein Testbench zur darstellung der 
Funktionalität der floating point library.

Vielen Dank im Voraus

Geri

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du dir mal die float_pkg.vhdl angeschaut? Die ist ein bisschen 
"verkrüppelt" ;-)
Ich denke mal, dass der Code, den du da geladen hast, nicht ganz 
vollständig ist.. (sieht zumindest beim ersten drüber blicken so aus)

Ausserdem darfst du bei deinem Projekt die ieee Standard Libraries, die 
Quartus eh schon kennt, nicht nochmal als File einbinden. Könnte sein, 
dass Quartus dann nicht so receht weiss, welche nun gelten soll.



Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es gerade versucht, in Modelsim zu Compilieren, aber es kommen 
hunderte von Fehlermeldungen...
Ich vermute, dass der Code Schrott ist.

Hab die Anweisungen aus der readme befolgt.

Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Schlumpf

Ach super, dass du dir das Programm mal angeschaut hast. Vielen Dank! 
Ich kann es nicht ganz verstehen, denn die Library wurde zuletzt im Juli 
editiert und stammt von einer namhaften Organisation.

Die readme habe ich auch befolgt:).. Die Library schaut echt 
vielversprechend aus.

Beste Grüsse, nochmals vielen Dank für Deine Mühe und ich bleibe an dem 
Thema dran

Geri

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Geri!

Ist gerne geschehen, aber schade, dass es zu keinem Ergebnis geführt 
hat. Wenn du das Ding aber trotzdem mal zum laufen bekommst, kannst ja 
hier mal bescheid geben.

Vielleicht hab auch ich was an dem Code nicht verstanden, aber 
Packagedeklarationen ohne ein "end" am Ende etc. lassen nicht gerade 
hoffen :-)

Ich denke aber sowieso, dass die Floating-Point Geschichten für die 
Simulation ganz okay sind, aber spätestens bei der Synthese auf einen 
Chip wirst du ganz schnell an die Grenzen kommen, wenn du nicht gerade 
nen fetten Stratix verwendest.

Es ist doch einfach so, dass arithmetische Funktionen, die nicht als 
dedizierte Hardware in Form von z.B. Multiplizierern vorhanden sind, mit 
einfachen Logikelementen abgebildet werden müssen und dann stösst man 
sehr schnell an die Ressourcengrenze und auch an die 
Geschwindigkeitsgrenzen des Chips.

Kannst ja mal spasseshalber nen 32 Bit-Multiplizierer (nicht floating) 
synthetisieren. Einmal mit den dedizierten Multiplizierern und einmal 
ohne (man kann in Quartus einstellen, dass er alles in Logik abbilden 
soll).
Die Unterschiede sind frappierend.

Ich musste aktuell auch ein paar Berechnungen mit "Nachkommastellen" 
durchführen und hab diese dann aber besser als Fix-Point operationen 
durchgeführt. Dann muss man das Zahlenformat nicht umrechnen, sondern 
arbeitet mit ganz normalen Vektoren, was oft völlig ausreichend ist.

Also dann viel Glück bei Code-Flicken und Bits schubsen

der Schlumpf



Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Schlumpf

Vielen Dank für Deine ausführliche Rückmeldung und Mühe. Ich habe nun 
versucht an David Bishop, die Ansprechperson eine Mail zu schreiben, 
d.bishop@vhdl.org aber die Mails kommen immer retour.
Wenn ich drauf komme, dann werde ich jedenfalls ein Tutorial 
veröffentlichen. Es kann ja nicht sein, dass eine Sache, die eigentlich 
einfach sein sollte, so ein Problem darstellt.

Bzgl. floating point operationen hast du bestimmt recht. Ich 
experimentiere mit einem Cylcone chip:) Ich bin mir eben nicht sicher, 
ob fixed point arithmethik für meinen Fall auch geht, weil meine Werte 
einen sehr grossen Zahlenbereich abdecken müssen.
Trotzden, du schreibst, dass du mit 32-bit fixed point artithmetik etwas 
gemacht hast. Kannst du mir bitte sagen, welche Library du dafür 
verwendest? Ist sie freeware? Ich möchte eine Funktion realisieren. Sie 
benötigt die +,-,*,%, und sqrt.
Vielleicht könnte man diese auch einfach auf 64 bit erweitern.

Beste Grüsse

Geri

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dazu brauchst du keine spezielle Library!

Wenn du z.B. nen 32 Bit Wert noch mit 16 Nachkommastellen verschönern 
willst, dann machst du einfach einen  48 Bit Vektor draus. 32 + 16.
Damit kannst dann ganz normal binär rechnen.
Und am Ende musst du eben nur für den ganzzahligen Teil die oberen 32 
Bit auswerten.

Genauso, wie wir auch im Dezimalsystem rechen würden... da bedarf es 
auch keiner speziellen Regeln. Ob der Übertrag von den hundertsteln zu 
den zehnteln stattfindet oder von den hundertern zu den tausendern ist 
völlig gleich. Genauso gilt das auch für das binäre System...

Die Kommastelle definierst du dir einfach irgendwo in den Vektor... 
Reine Interpretationssache.

die Wertigkeit der Stellen in dem Vektor ist dann halt:

2^n .... 2^3  2^2  2^1  2^0 , 2^-1  2^-2 etc...

also

    ... 8    4     2     1  , 1/2   1/4   1/8 .....

z.B.

 3,50 dez = 0011,10 binär
+4,75 dez = 0100,11 binär
--------------------------
 8,25 dez = 1000,01 binär

kannst aber auch 001110 + 010011 rechnen und beim Ergebnis das Komma 
setzen...

Ich hoff, du verstehst, auf was ich raus will... rechne ganz normal mit 
vektoren und behalte im Hinterkopf, wo das Komma steht, der "Rest" passt 
von ganz alleine

Hilft dir das?

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Wurzel in Hardware ist "Scheisse" ;-) Aber das ist es so oder so, 
egal in welchem Zahlenformat.

Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Schlumpf

Vielen Dank für Deine Tipps. Das Grundprinzip von fixed point arithmetik 
habe ich schon verstanden.

Ich habe gesehen, von Altera gibt es Multiplizierer und sogar die sqrt- 
Funktion ist implementiert... nur weiss ich noch nicht wie ich das Ganze 
anwenden muss:)

Bei der Floating point library hat mir gefallen dass ich z.B. eine 
Multiplikation ganz einfach

z=x*y codieren kann. So wie ich es aus c gewohnt bin:)

Beste Grüsse und nochmals vielen Dank, echt nett von dir

Geri

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und nochmal ich...

Das Problem mit den großen Zahlenbereichen kannst du folgendermassen 
umgehen:

z.B. 1000 * 0,2 (aber du hast nur ganzzahlige Stellen)

(1000 * (0,2 * 100))/ 100

Der Trick... Du "vergrößerst" die Kleine Zahl, kannst sie ganzzahlig 
Multiplizieren und dividierst dann das Ergebnis wieder um den 
Vergrößerungsfaktor

Im Binärsystem nimmst du dann sinnvollerweise faktoren zur Basis 2 (also 
z.B. 256) dann kannst einfach shiften (shift 8)

z.B. 128 * 0,5 = 64

     01000000 * 00000000,1
=    shift_right(01000000 * shift_left(00000000,1)) = 00100000
=    shift rihgt(01000000 * 00000001) = 00100000

in diesen Fall shift um jeweils eine Stelle

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah okay, also dass der Cyclone Multiplizierer hat, das wusste ich. Das 
mit der Wurzel ist mir neu, aber umso besser für dich

Qaurtus erkennt von selber, wenn du A * B schreibst, dass es hier nen 
Multiplizierer verwenden soll. Darum brauchst dich nicht zu kümmern

die codierung A * B kannst du auch ganz normal z.B.mit der 
ieee.std_logic_arith machen
Du kannst auch mit Integer rechen etc, das geht alles

Behalt nur immer im Hinterkopf, dass die Syntheses das auch irngedwie in 
HW abbilden muss. Also mach es ihr nicht zu schwer ;-)

Also mach nimmer so lange rum es ist schon spät ;-)

Ich geh jetzt schlafen

Grüße
Schlumpf

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mahlzeit Geri!

Ich hab nochmal nachgeschaut. Mit ieee.std_logic_1164 und 
ieee.numeric_std hast du alle Grundfunktionen.
für SQRT gibt es im Megawizard die Möglichkeit einen Block zu 
generieren, den du dann per Schematic oder HDL-Code einbinden kannst. 
Wenn möglich, dann füge ein paar Pipeline-Stufen ein, sonst könnte die 
maximale Taktrate klein sein.
Einen dedizierten "Wurzelzieher" gibt es auch im Cyclone nicht! Der 
setzt das dann eben auch in Logik um.
Zum Thema synthetisierbare Wurzeln kannst ja mal Google bemühen. Da 
haben sich schon viele Leute viele Gedanken drüber gemacht...

So, dann viel Erfolg

Gruß
Schlumpf

Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Schlumpf

Vielen Dank für die Hinweise. So wie ich den aktuellen Fall beurteile 
wird es noch einige Zeit dauern bis ich es schaffe, meinen c-Algorithmus 
nach VHDL oder Verilog zu codieren. Deshalb gehe ich das Problem nun mal 
mit einem ARM9 mit eingebauten Mathematik-Coproessor an. Vielleicht 
reicht mir die Performance für meine Anwendung auch aus.

Parallel dazu werde ich mal ein paar Versuche mit der Standard-Library 
angegehen. Vielleicht kommt dann nach und nach auch eien Erleuchtung:)

Beste Grüsse

Geri

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja wenn du das in einem Arm unterkriegst, dann ist das sicher die 
deutlich kostengünstigere Alternative und entwickelt ist das auch 
deutlich schneller..

Gruß
Schlumpf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.