Forum: FPGA, VHDL & Co. VHDL APEX


von Sascha (Gast)


Lesenswert?

Guten Tag...

Ich programmiere seit einigen Wochen unter Quartus II (4.2) mit VHDL.
Für die Ein- und Ausgänge (PORTS) habe ich Integer-Werte genutzt ( Aus
: Integer range 0 to 15). Die Programme funktionieren auch damit.
Jedoch wurde mir gesagt, das dies zufall sei und nicht immer
funktionieren muß. Angeblich würde Quatus einen Integerwert nicht
korrekt auf einen PORT geben können.
Meine Frage ist jetzt, ob dem wirklich so ist; oder ob Quartus II doch
Integer-Werte an Prots umsetzen kann.

Hier ein Prinzipielles Beispiel:


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity test is
  port(
    CLK : in std_logic;
    A : in integer range 0 to 15;
    B : in integer range 0 to 15;
    X : out integer range 0 to 15
    );
end test;
...

...

Process (clk)
 if (CLK'event AND CLK = 1)

    x <= A + B;
 end if;
end process;
...

...

end architecture;

von toddoy (Gast)


Lesenswert?

Normalerweise werden Bit.- oder STD_Logic_vector(xxx downto xxx-yyy)
benutzt, jedenfalls in der Top Entity , um jetzt z.B irgend einem Pin
einem Wert zuzuweisen. Innerhalb deiner Hirarchie kannst du den
Datenaustausch natürlich mit Integern machen. Allerding benötigt ein
Integer ( Datenbereich -2^32 bis 2^32-1 typisch ) 64 Steuerleitungen
innerhalb deines FPGA's, das dürfte in einem Fetten Baustein natürlich
nichts weiter ausmachen, ist aber extrem unökonomisch. Wenn du sowas in
einer Firma machst, würde der Chef mit dir netterweise einen kleinen
Plausch halten wollen, um mit dir Grundlagen der BWL zu Besprechen.
Quintessens: Versuche es mit Vectoren (Bit, Std_logic, Std_ulogic) oder
ähnlichem. Es gibt noch andere Gründe für die Verwendung von Vectoren,
dies sollte aber vorerst genügen.

G. Tobi

von Sascha (Gast)


Lesenswert?

Vielen Dank G. Tobi

Ökonomische Gründe werde ich natürlich gerne berücksichtigen. Ich habe
ja auch nichts dagegen, alles auf STD_LOGIC_Vektoren umzustellen. Ich
fand es nur sehr komisch, daß es angeblich nur zufällig mit den
"Integer-PORTS" funktionieren würde.

LG Sascha

von toddoy (Gast)


Lesenswert?

Jaein

Soweit ich weiss würde es schwierigkeiten machen, wenn du dein VHDL-
Code in deinem Synthese Tool Routen- Mappen würdest. Das Tool würde
wahrscheinlich nicht wissen, wieviele Pins der FPGA benötigt. Im
Extremfall 64. Bei CPLD's ist das extrem Kritisch, da die sowieso nur
ein paar Pins besitzen z.b. Xilinx XC9500 Reihe 32 nutzbare Pins(bei
PLCC44 Gehäuse)
Es gibt ein großen Unterschied ob du nur ein VHDL Programm schreibst,
oder ob du eine Anwendung in einen FPGA oder CPLD implementieren
willst.
Der Standard erlaubt vieles, was dann später nicht mehr sich
synthetisieren läßt. Das kann etwas verwirrend sein.
Es gibt aber die Möglichkeit in der Architectur oder in einem Package
deinem eigenen Integer Typ zu definieren. Den Zahlenbereich
einschränken, soweit es nur irgendwie vertretbar ist, macht die Sache
Resourcenschonend und Anwenderfreundlich.

z.B.
type MY_INT is Integer range -100 to 100 ;
signal var : MY_INT ;

oder direkt einschränken in der architecture
signal var : Integer range 0 to 10  ;

Du kannst übrigens jeden Variablentyp über die Ports austauschen, das
ist nicht komisch, nur in der Top Hierarchie solltest du Vectoren
benutzen, soweit ich mich nicht Irre, ich lasse mich übrigens gerne
etwas besserem belehren. (Nobody is Perfect)

G. Tobi

von Henrik (Gast)


Lesenswert?

Das mit dem integer also Schnittstelle ist ungewöhnlich, aber nicht
unbedingt nicht machbar.
"Allerding benötigt ein Integer ( Datenbereich -2^32 bis 2^32-1
typisch ) 64 Steuerleitungen"
Das ist Standart beim Computer und Maximum bei Logik, aber so wie du es
schreibst nicht richtig. Der "range" Befehle dient dazu, die Zahl der
Leitungen auf ein Minimum  zu reduzieren. Das hat er also schon richtig
gemacht indem er 15 als Max für die Eingangswerte gesetzt hat. Der
Fitter wird daraus 4 Leitungen machen (sollte er zumindest). Aber warum
hat der integer-Ausgang ebenfalls ein Maximum von 15? Das ist wohl ein
kleiner, logischer Fehler und muß 31 sein!
Das da kein Fehler gemeldet wurde wundert mich, da eine
Bereichsüberschreitung sehr einfach möglich ist.

"Jedoch wurde mir gesagt, das dies zufall sei und nicht immer
funktionieren muß. Angeblich würde Quatus einen Integerwert nicht
korrekt auf einen PORT geben können."

Ursprünglich war integer inder Tat nur für Simulationzwecke vorgesehen;
die Art der Realisierung auf der Zielhardware war(ist) sehr
herstellerspezifisch. Sollte es keine Probleme bei Simulation und
Fitten geben, sehe ich keinen Grund, warum man das nicht so machen
sollte. Wenn ein Programm das nicht in Hardware umsetzen kann, wird es
sich schon beschweren (denk ich mal).
In meinem Lehrbuch über VDHL  war auch so Beispiel, das intergers so
verwendete, wie du es tust (allerdings beschränkte man sich dort auch
auf Simulation). "Sauberer" wäre es natürlich, wenn du es mit
std_logic_vector machst.

Gruß Henrik

P.S. Ich lerne VHDL auch noch!

von Sascha (Gast)


Lesenswert?

Danke Henrik...

Das Beispiel oben ist so nicht umgesetzt worden. Ich wollte nur einmal
kurz das Prinzip darstellen. Natürlich muß X von 0 bis 31 gehen.
(Kleiner logikfehler von mir mit dem X oben ;-)).

In dem Projekt in der FH habe ich 7 Fir-Filter erstellt, die ein
DTMF-Codiertes (auch MFV Mehrfrequenzwahlverfahren genannt)Signal
Decodieren und anschließend das erkannte Zeichen zur weiterverarbeitung
an einem NIOS (ein "Softcore Processor") geben. Dabei habe ich
Integer-Werte durch die Filter "gejagt" und dementsprechend
fortgefahren. Das Integerformat bot sich an, da die Koeffizienten der
Fir-Filter als Integer in einer Datei vorlagen.
Die FIR-Filter funktionieren auch Fehlerfrei auf einem APEX20KE (ein
FPGA-Entwicklungsboard).

Die Probleme mit dem Synthetisieren habe ich auch schonmal gespürrt.
Anfangs wollte ich ein Array für die FIR-Filterkoeffizienten nutzen.
Doch leider verbaute das Array ca 25% der recoursen. und Funktionierte
nur nach Zufall. So habe ich ein LPM-ROM modul genutzt.

Was auch seltsam ist, ist daß ein LPM_MULT-Modul 437 Logikelemente (LE)
braucht. Ein von mir geschriebener (mit Integer-PORTS) Multiplikator
jedoch nur 177 LE brauchte.
Das sah Anfangs auch alles sehr gut aus. Aber als ich ihn in den
FIR-Filter eingebunden habe bildete er den Multiplikator wieder auf ein
LPM_MULT-Modul ab und brauchte somit wieder 437 LE.

Ist halt immer so eine Sache nach der Synthese und dem Fitten...

Ich werde dann morgen alle Integer auf STD_LOGIC_VECTOR umstellen.
Macht bestimmt einen "Schlankeren Fuß" ;-)

Vielen dank nochmal an alle, die sich gemeldet haben.
Und Viel Erfolg bei euren Projekten.

LG

Sascha

von Hannes Hering (Gast)


Lesenswert?

Hoi,

ich hab mich mit Integern in VHDL noch net so genau beschäftigt, aber
wär's vielleicht net ganz unschlau, wenn man da unsigned-Typen
verwendet? Ich hab ein kleines Projekt in nen CPLD gepackt un der is
davon zu 96 % voll ... des is natürlich blöd ... ;) Deswegen werd ich
die UNSIGNED wohl oder übel auch umbauen in "Handcodierte" Logik ...

MFG

Hannes

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.