<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=200.0.233.51</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=200.0.233.51"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/200.0.233.51"/>
	<updated>2026-04-10T23:40:06Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Rechnen_in_VHDL&amp;diff=42436</id>
		<title>Rechnen in VHDL</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Rechnen_in_VHDL&amp;diff=42436"/>
		<updated>2010-01-21T16:39:27Z</updated>

		<summary type="html">&lt;p&gt;200.0.233.51: /* Besser: Rechnen mit numeric_std */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Um in VHDL synthetisierbare Berechnungen zu beschreiben gibt es verschiedene Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
== Rechnen mit Ganzzahlen ==&lt;br /&gt;
&lt;br /&gt;
=== Integer-Variablen ===&lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit die von den meisten Synthesetools unterstützt wird ist das Rechnen im Integer-Bereich. Das heißt entweder man arbeitet von Vornherein mit Integer-Signalen, oder man konvertiert einen std_logic_vector zu einem Integer und benutzt die ganz normalen Rechenoperatoren wie +, -, * usw.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist dabei, den Integertyp auf den Bereich zu begrenzen der auch wirklich benötigt wird, sonst werden alle Berechnungen mit 32 Bit Wortlänge implementiert:&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
variable x: integer range 0 to 100;&lt;br /&gt;
...&lt;br /&gt;
x := x + 1;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Integer bieten sich für interne Berechnungen an, z.B. Zähler die bei erreichen eines bestimmten Zählerstandes einen Ausgang setzen; wenn man dagegen z.B. eine ALU implementiert die mit externen Vektoren einer bestimmten Breite rechnen muss, ist es günstiger/bequemer direkt auf Basis von Vektoren zu rechnen.&lt;br /&gt;
&lt;br /&gt;
=== Schlecht: Direktes Rechnen mit std_logic_vector ===&lt;br /&gt;
&lt;br /&gt;
Die von vielen Synthesetools unterstützten, aber nicht IEEE-standardisierten Packages std_logic_unsigned und std_logic_signed erlauben es, direkt mit std_logic_vector zu rechnen. Je nachdem ob das signed oder unsigned-Package eingebunden wird werden alle (!) Berechnungen als signed oder unsigned interpretiert - das ist natürlich unsauber. Trotzdem werden diese Packages noch häufig verwendet, obwohl es mit numeric_std gar nicht mehr nötig ist.&lt;br /&gt;
&lt;br /&gt;
=== Besser: Rechnen mit numeric_std ===&lt;br /&gt;
&lt;br /&gt;
Das Package numeric_std definiert zwei neue Typen &#039;&#039;&#039;signed&#039;&#039;&#039; und &#039;&#039;&#039;unsigned&#039;&#039;&#039; als Array von std_logic, und definiert für diese Typen alle gebräuchlichen Rechenoperatoren, auch zusammen mit Integern (x + 1):&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
signal x: unsigned(7 downto 0); -- Zahlenbereich: 0 bis 2**8-1&lt;br /&gt;
signal y: signed(7 downto 0); -- Zahlenbereich: -2**7 bis 2**7-1&lt;br /&gt;
...&lt;br /&gt;
x &amp;lt;= x + 1;&lt;br /&gt;
y &amp;lt;= x + y;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur bei der Zuweisung von Integern an unsigned/signed-Signale muss man von Hand konvertieren:&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
x &amp;lt;= to_unsigned(2, x&#039;length);&lt;br /&gt;
y &amp;lt;= to_signed(2, y&#039;length);&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der zweite Parameter gibt die Länge des Vektors an in den konvertiert werden soll.&lt;br /&gt;
&lt;br /&gt;
Um von unsigned/signed zu Integer zu konvertieren gibt es die Funktion to_integer:&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
i &amp;lt;= to_integer(x);&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Umsetzbare Operatoren ===&lt;br /&gt;
&lt;br /&gt;
Egal ob man mit Integern oder unsigned/signed rechnet, die Software kann nur bestimmte Rechenoperationen in Hardware umsetzen. Schiebeoperationen, Additionen und Subtraktionen sind nie ein Problem, Multiplikationen werden in Multiplizierernetzwerke umgesetzt oder auf Hardwaremultiplizierer gemappt. Divisionen und Modulo-Operationen dagegen werden in der Regel nicht oder nur für Zweierpotenzen unterstützt (Xilinx ISE). Werden Divisionen benötigt muss man einen Divisionsalgorithmus von Hand implementieren oder einen entsprechenden IP-Core einbinden.&lt;br /&gt;
&lt;br /&gt;
== Festkommazahlen (Fixed Point) ==&lt;br /&gt;
&lt;br /&gt;
=== numeric_std und Skalierung von Hand ===&lt;br /&gt;
&lt;br /&gt;
Natürlich ist es möglich numeric_std (signed, unsigned) oder Integer zu verwenden und die Skalierung entsprechend der gewünschten Zahleninterpretation von Hand durchzuführen. Wie das geht wird z.B. hier erklärt: http://www.acoustics.hut.fi/teaching/S-89.3510/2006/projektityo/FixedPointDSPDev.pdf&lt;br /&gt;
&lt;br /&gt;
=== IEEE.Fixed_Pkg ===&lt;br /&gt;
&lt;br /&gt;
Für die nächste Version von VHDL ist das Paket IEEE.Fixed_Pkg vorgesehen. Ähnlich wie bei numeric_std werden hier neue Typen definiert, &#039;&#039;&#039;ufixed&#039;&#039;&#039; (unsigned fixed point) und &#039;&#039;&#039;sfixed&#039;&#039;&#039; (signed fixed point). Die Anzahl der Vor- und Nachkommastellen wird bei der Signal-/Variablendeklaration angegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
signal a, b : sfixed (7 downto -6); -- 14 Bit breit, 6 Nachkommastellen&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Vorteil ist, dass man sich die manuelle Skalierung sparen kann, und mit der Funktion resize einfach zwischen verschiedenen Zahlenformaten konvertieren kann.&lt;br /&gt;
&lt;br /&gt;
* Download: http://www.vhdl.org/vhdl-200x/vhdl-200x-ft/packages/files.html&lt;br /&gt;
* Dokumentation: http://www.vhdl.org/vhdl-200x/vhdl-200x-ft/packages/Fixed_ug.pdf&lt;br /&gt;
* Angepasste Versionen für verschiedene Synthesetools: http://www.eda.org/fphdl/vhdl.html&lt;br /&gt;
* Hinweise zur Synthese mit Xilinx ISE: http://www.mikrocontroller.net/topic/75414#new&lt;br /&gt;
&lt;br /&gt;
== Gleitkommazahlen (Floating Point) ==&lt;br /&gt;
&lt;br /&gt;
Gleitkommazahlen haben den Vorteil, dass man große Dynamikbereiche abdecken kann, für die man mit Festkommazahlen riesige Bitlängen benötigen würde. Der Nachteil ist der höhere Rechenaufwand: für die Addition zweier Festkommazahlen reicht ein gewöhnlicher Addierer, bei Gleitkommazahlen sind dazu auch Multiplikationen nötig, wenn die beiden Zahlen verschiedene Exponenten haben. Bei der Realisierung in Hardware (FPGAs) bedeutet das dass mehr Fläche benötigt wird und die Taktrate sinkt (bzw. mehr Zyklen für einen Berechnungsschritt nötig sind).&lt;br /&gt;
&lt;br /&gt;
Als erstes muss gesagt werden, dass VHDL sehr wohl Gleitkommazahlen unterstützt (Typ real), diese aber nicht ohne weiteres synthetisierbar sind. Man muss die Zahlen auf jeden Fall erst in eine std_logic-Darstellung bringen.&lt;br /&gt;
&lt;br /&gt;
=== Rechnen &amp;quot;von Hand&amp;quot; bzw. mit FPU-Cores ===&lt;br /&gt;
&lt;br /&gt;
Auch mit Gleitkommazahlen kann man natürlich &amp;quot;von Hand&amp;quot; arbeiten, indem man beliebige Vektoren in Mantisse und Exponent zerpflückt und diese getrennt verarbeitet. Für Rechnungen mit Gleitkommazahlen gibt es auch verschiedene fertige Cores, z.B. [http://www.opencores.org/projects.cgi/web/fpu100/overview FPU100 bei OpenCores], die Berechnungen in mehreren Zyklen durchführen.&lt;br /&gt;
&lt;br /&gt;
=== IEEE.Float_Pkg ===&lt;br /&gt;
&lt;br /&gt;
Analog zu IEEE.Fixed_Pkg gibt es ein entsprechendes Package für Floating Point. Der Nachteil gegenüber FPU-Cores ist, dass die Berechnungen in diesem Package rein kombinatorisch implementiert sind, das heißt keine getaktete Struktur vorgesehen ist. Auch wenn man die Ein- und Ausgänge einer Rechenoperation mit mehreren Takten verzögert schafft [[Xilinx ISE]] 9.2 es nicht daraus eine Pipelinestruktur zu synthetisieren. Die Folge: die Berechnungen werden sehr groß und sehr langsam. Das ließe sich sicher seitens der Hersteller beheben, aber angesichts der Tatsache, dass Float_Pkg mit vielen Tools noch nicht einmal kompilierbar ist, ist das wohl noch in weiter Ferne.&lt;br /&gt;
&lt;br /&gt;
* Download: http://www.vhdl.org/vhdl-200x/vhdl-200x-ft/packages/files.html&lt;br /&gt;
* Dokumentation: http://www.vhdl.org/vhdl-200x/vhdl-200x-ft/packages/Float_ug.pdf&lt;br /&gt;
* Angepasste Versionen für verschiedene Synthesetools: http://www.eda.org/fphdl/vhdl.html&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;/div&gt;</summary>
		<author><name>200.0.233.51</name></author>
	</entry>
</feed>