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;
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
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
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
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.