<?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=0%3A0%3A0%3AFFFF%3A87%3A184%3A238%3A159</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=0%3A0%3A0%3AFFFF%3A87%3A184%3A238%3A159"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/0:0:0:FFFF:87:184:238:159"/>
	<updated>2026-04-11T15:24:45Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Softwarepool&amp;diff=70854</id>
		<title>VHDL Softwarepool</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Softwarepool&amp;diff=70854"/>
		<updated>2013-01-13T18:21:56Z</updated>

		<summary type="html">&lt;p&gt;0:0:0:FFFF:87:184:238:159: /* Sonsige */ Sonstige&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite dient der Sammlung von Code Beispielen in VHDL, die im Forum veröffentlicht wurden.&lt;br /&gt;
&lt;br /&gt;
== Entwicklungs- und Debugging-Hilfen ==&lt;br /&gt;
=== Testbenches ===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/87026 Testbench zum Lesen und Schreiben von BMP-Dateien]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messtechnikprojekte==&lt;br /&gt;
=== Logic Analyzer ===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/156256 Logicanalyzer für Pollin CPLD (HW+SW)]&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/96087 Simple LogicAnalyzer VHDL/Delphi]&lt;br /&gt;
&lt;br /&gt;
== IO und GUI ==&lt;br /&gt;
=== LCD Controller ===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/134713 16x2 LCD Textcontroller / HD44780]&lt;br /&gt;
=== VGA Controller ===&lt;br /&gt;
* [[Projekt_VGA_Core_in_VHDL]]&lt;br /&gt;
&lt;br /&gt;
=== Maus Interface ===&lt;br /&gt;
=== Tastatur Interface===&lt;br /&gt;
&lt;br /&gt;
== Signalerzeugung ==&lt;br /&gt;
=== PWM ===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/199692 PWM mit variabler Auflösung in xilinx CPLD]&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/113547 Schnelle 10Bit-PWM in VHDL mit CPLD mit BASCOM]&lt;br /&gt;
&lt;br /&gt;
=== DDS ===&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler_Funktionsgenerator]]&lt;br /&gt;
* [[Digitale_Sinusfunktion]]&lt;br /&gt;
* [[Digitaler_LaPlace-Funktionsgenerator_im_FPGA]]&lt;br /&gt;
&lt;br /&gt;
=== Zufallszahlen ===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/111667 Zufallsbit Generator]&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler_Zufallszahlengenerator_in_VHDL]]&lt;br /&gt;
* [[Digitaler_Rauschgenerator_im_FPGA]]&lt;br /&gt;
&lt;br /&gt;
== Bus Interfaces ==&lt;br /&gt;
===RS 232===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/87853 RS-232 Interface in VHDL]&lt;br /&gt;
&lt;br /&gt;
===I2C-Slave===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/31387 FPGA-Funktion I2C-Slave VHDL]&lt;br /&gt;
&lt;br /&gt;
== Sonstige ==&lt;br /&gt;
=== RAM, FiFo ===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/153073 Asynchrones FIFO]&lt;br /&gt;
[http://www.mikrocontroller.net/topic/138998 Barrel Shifter und Cache]&lt;br /&gt;
== Audio und Musik ==&lt;br /&gt;
&lt;br /&gt;
= Kategorien =&lt;br /&gt;
[[Kategorie:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>0:0:0:FFFF:87:184:238:159</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL_Softwarepool&amp;diff=70853</id>
		<title>VHDL Softwarepool</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL_Softwarepool&amp;diff=70853"/>
		<updated>2013-01-13T18:20:09Z</updated>

		<summary type="html">&lt;p&gt;0:0:0:FFFF:87:184:238:159: KAT&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite dient der Sammlung von Code Beispielen in VHDL, die im Forum veröffentlicht wurden.&lt;br /&gt;
&lt;br /&gt;
== Entwicklungs- und Debugging-Hilfen ==&lt;br /&gt;
=== Testbenches ===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/87026 Testbench zum Lesen und Schreiben von BMP-Dateien]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messtechnikprojekte==&lt;br /&gt;
=== Logic Analyzer ===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/156256 Logicanalyzer für Pollin CPLD (HW+SW)]&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/96087 Simple LogicAnalyzer VHDL/Delphi]&lt;br /&gt;
&lt;br /&gt;
== IO und GUI ==&lt;br /&gt;
=== LCD Controller ===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/134713 16x2 LCD Textcontroller / HD44780]&lt;br /&gt;
=== VGA Controller ===&lt;br /&gt;
* [[Projekt_VGA_Core_in_VHDL]]&lt;br /&gt;
&lt;br /&gt;
=== Maus Interface ===&lt;br /&gt;
=== Tastatur Interface===&lt;br /&gt;
&lt;br /&gt;
== Signalerzeugung ==&lt;br /&gt;
=== PWM ===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/199692 PWM mit variabler Auflösung in xilinx CPLD]&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/113547 Schnelle 10Bit-PWM in VHDL mit CPLD mit BASCOM]&lt;br /&gt;
&lt;br /&gt;
=== DDS ===&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler_Funktionsgenerator]]&lt;br /&gt;
* [[Digitale_Sinusfunktion]]&lt;br /&gt;
* [[Digitaler_LaPlace-Funktionsgenerator_im_FPGA]]&lt;br /&gt;
&lt;br /&gt;
=== Zufallszahlen ===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/111667 Zufallsbit Generator]&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler_Zufallszahlengenerator_in_VHDL]]&lt;br /&gt;
* [[Digitaler_Rauschgenerator_im_FPGA]]&lt;br /&gt;
&lt;br /&gt;
== Bus Interfaces ==&lt;br /&gt;
===RS 232===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/87853 RS-232 Interface in VHDL]&lt;br /&gt;
&lt;br /&gt;
===I2C-Slave===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/31387 FPGA-Funktion I2C-Slave VHDL]&lt;br /&gt;
&lt;br /&gt;
== Sonsige ==&lt;br /&gt;
=== RAM, FiFo ===&lt;br /&gt;
[http://www.mikrocontroller.net/topic/153073 Asynchrones FIFO]&lt;br /&gt;
[http://www.mikrocontroller.net/topic/138998 Barrel Shifter und Cache]&lt;br /&gt;
&lt;br /&gt;
= Kategorien =&lt;br /&gt;
[[Kategorie:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>0:0:0:FFFF:87:184:238:159</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=VHDL&amp;diff=70852</id>
		<title>VHDL</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=VHDL&amp;diff=70852"/>
		<updated>2013-01-13T18:18:43Z</updated>

		<summary type="html">&lt;p&gt;0:0:0:FFFF:87:184:238:159: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== VHDL als Sprache ==&lt;br /&gt;
&lt;br /&gt;
VHDL ist eine kombinierte Sprache: Sie enthält wie die typischen Programmiersprachen auch, eine Reihe von Konstrukten und Befehlen, die Abläufe und zeitliches Verhalten beschreiben, sowie ferner auch Elemente, die Strukturen und Zusammenhänge definieren. Diese werden genutzt, um das Verhalten der Schaltung zu definieren. Wesentlich ist dabei die funktionelle Abhängigkeit der Ausgänge von Schaltungsmodulen von ihren Eingängen, sowie der Zusammenhang der Eingänge der Module mit den Ausgängen anderer Module. Diese können jeweils direkt oder über FlipFlops verknüpft werden, wodurch die Informationsweitergabe erst im nächsten Takt erfolgt. Mit dieser grundsätlzichen Topologie sind quasi alle wichtigen Grundfunktionen digitaler Schaltungen darstellbar. Letztlich wird das Verhalten der Chipausgänge in Abhängigkeit der Chipeingänge definiert und dabei alle erdenklichen Zustände, in denen sich die Teilschaltungen befinden können, vollumfänglich beschrieben.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist bei VHDL das Verständnis, dass alle ausdrücklichen, zeitlichen Abläufe lediglich während der Simulation so vollzogen werden, wie sie anhand üblicher Regeln der Softwaretechnologie erwartet werden. Bei der Synthese hingegen, bleiben einige zeitliche Konstrukte und Zusammenhänge unberücksichtigt und nur die Strukturen selbst werden in die Schaltung übernommen. Damit ist z.B. die Anordnung des Codes in einem Modul aber auch die Ordnung der Prozesse und Reihenfolge von Signalzuweisungen weitgehend unerheblich.&lt;br /&gt;
&lt;br /&gt;
=== Simulation ===&lt;br /&gt;
&lt;br /&gt;
Bei der Simulation wird der Code in klassischer Weise kompiliert und ausgeführt. Die Anordnung von Codezeilen kann dabei ebenso relevant sein, wie die zeitliche Steuerung von Modulen, die bestimmte Abhängigkeiten von einzelnen Signalen haben. In dieser Funktion wird VHDL hauptsächlich zum Schreiben von Testbenches und Modellen verwendet. Näheres dazu im Artikel [[VHDL Testbench]].&lt;br /&gt;
&lt;br /&gt;
=== Synthese ===&lt;br /&gt;
&lt;br /&gt;
Bei der Synthese wird die Beschreibung von einer Synthesesoftware in eine Netzliste umgesetzt. Der grundlegende Unterschied zur Verwendung von VHDL als Simulationsprache besteht darin, dass man nicht beliebigen Code schreiben kann, sondern sich an bestimmte Strukturen halten muss, die der Synthesizer kennt und in Hardware umsetzen kann. Schleifen z.B. werden zur Compilezeit ausgeführt, um Matritzen, Vektoren oder redundante Strukturen zu beschreiben und besitzen keine zeitliche Relevanz zur Ausführungszeit.&lt;br /&gt;
&lt;br /&gt;
Wie diese Strukturen im allgemeinen aussehen, ist weiter unten beschrieben, Details erfährt man in der Dokumentation der Software, z.&amp;amp;nbsp;B. dem [http://toolbox.xilinx.com/docsan/xilinx9/books/docs/xst/xst.pdf XST User Guide].&lt;br /&gt;
&lt;br /&gt;
==== Grundregeln für synthetisierbaren VHDL-Code ====&lt;br /&gt;
&lt;br /&gt;
Folgende Grundregeln sollten vor allem Anfänger auf jeden Fall einhalten:&lt;br /&gt;
&lt;br /&gt;
* Es darf nur zwei Arten von Prozessen geben:&lt;br /&gt;
*# Rein kombinatorische Prozesse (keine Zustandsspeicher):&lt;br /&gt;
*#* Alle Signale die im Prozess gelesen werden in die sensitivity list eintragen&lt;br /&gt;
*#* Jedes Ausgangssignal muss in jedem if-Zweig einen von sich selbst verschiedenen Wert zugewiesen bekommen, damit keine [[Latch]]es entstehen (mein_signal &amp;lt;= mein_signal; ist unzulässig!)&lt;br /&gt;
*#* Keine Taktflankenabfrage&lt;br /&gt;
*# Rein getaktete Prozesse (Flip-Flops als Zustandsspeicher):&lt;br /&gt;
*#* Nur Clk und asynchroner Reset in die sensitivity list&lt;br /&gt;
*#* Maximal ein [[Reset für FPGA/CPLD | Reset]]&lt;br /&gt;
*#* Nur eine Taktflankenabfrage (rising_edge)&lt;br /&gt;
* Möglichst nur ein einziger Takt im gesamten Design, nur steigende ODER fallende Taktflanke auswerten. Um eine Flanke eines anderen Signals zu erkennen, siehe [[VHDL Flankenerkennung]].&lt;br /&gt;
* Keine Takte herunter teilen, stattdessen [[Taktung FPGA/CPLD#Clock Enable|Clock Enable]]  verwenden.&lt;br /&gt;
* Kein &amp;quot;after&amp;quot;, &amp;quot;wait for&amp;quot; o.ä. verwenden, das ist nicht synthetisierbar&lt;br /&gt;
* Keine shared variables verwenden&lt;br /&gt;
* Variablen nur dann verwenden, wenn man genau verstanden hat, was der Unterschied zu einem Signal ist und sich das Problem nicht auch mit Signalen lösen lässt&lt;br /&gt;
* Kein IEEE.STD_LOGIC_(UN)SIGNED verwenden, sondern IEEE.NUMERIC_STD (siehe [[Rechnen in VHDL]])&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
===&amp;lt;code&amp;gt;CLK=&#039;1&#039; and CLK&#039;event&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;rising_edge()&amp;lt;/code&amp;gt;?===&lt;br /&gt;
&#039;&#039;&#039;Frage:&#039;&#039;&#039;&lt;br /&gt;
Bei der Beschreibung von FlipFlops werden je nach Buch/Programmierer zwei unterschiedliche Konstrukte benutzt:&lt;br /&gt;
&lt;br /&gt;
Variante 1 (klassisch):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
process(clk)&lt;br /&gt;
begin&lt;br /&gt;
  if clk = &#039;1&#039; and clk&#039;event then&lt;br /&gt;
    --snip&lt;br /&gt;
  end if;&lt;br /&gt;
end process;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
und Variante 2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
process(clk)&lt;br /&gt;
begin&lt;br /&gt;
  if rising_edge(clk) then&lt;br /&gt;
    --snip&lt;br /&gt;
  end if;&lt;br /&gt;
end process;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Welche ist zu empfehlen?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Antwort:&#039;&#039;&#039;&lt;br /&gt;
Kurz gesagt bei der Synthese gibt es keine Unterschiede, in der Simulation kleine. Verwende die besser lesbare Variante. Die mit &#039;&#039;rising_edge()&#039;&#039; (bzw. &#039;&#039;falling_edge()&#039;&#039;) gilt allgemein als die bessere (Lesbarkeit und Simulationsgenauigkeit).&lt;br /&gt;
&lt;br /&gt;
Wer es genau wissen will: Die klassische Variante ist nur korrekt für Signale die nur die Werte &#039;1&#039; und &#039;0&#039; annehmen können. Bei Signalen vom Typ std_logic (der Standardtyp für Signale) werden Flanken erkannt, die tatsächlich keine sind.&lt;br /&gt;
Zum Beispiel beim Treiben eines PullUps (&#039;H&#039; -&amp;gt; &#039;1&#039; keine tatsächliche Flanke aber für &#039;&#039;clk = &#039;1&#039; and clk&#039;event&#039;&#039;) oder beim Simulationsstart ohne Initialisierungswert für die Signale (&#039;U&#039; -&amp;gt; &#039;1&#039;).(Signale mit Initialisierungswert werden so deklariert: &#039;&#039;signal a: std_logic := &#039;0&#039;; &#039;&#039;).&lt;br /&gt;
Die Funktionen &#039;&#039;rising_edge()&#039;&#039; und &#039;&#039;falling_edge()&#039;&#039; konvertieren den std_logic Wert vor dem Vergleich auf &#039;1&#039; bzw. &#039;0&#039; und simulieren so keine Flanke wo in der echten Hardware auch keine ist.&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/forum/read-9-391894.html&lt;br /&gt;
&lt;br /&gt;
===Synchroner oder asynchroner Reset===&lt;br /&gt;
Folgende Regeln gelten bei der Überlegung, ob man einen ansynchronen Reset verwenden sollte:&lt;br /&gt;
&lt;br /&gt;
* In FPGAs führt die Nutzung von Resetfunktionen in aller Regel zu einem erhöhten Resourcenverbrauch. Mitunter werden Taktnetze belegt.&lt;br /&gt;
&lt;br /&gt;
* Asynchrone Resets bedürfen besonderer Behandlung, damit die negative RST-Taktflanke nicht genau zur Clk-Flanke kommt, da dies zu inkonsitenten Startbedingungen der FFs im FPGA führen kann.&lt;br /&gt;
&lt;br /&gt;
* Viele FPGAs können per Init-Kommando in VHDL initialisiert werden und benötigen zum Anlaufen gar keinen (Re)set - weder synchron noch aysnchron.&lt;br /&gt;
&lt;br /&gt;
* Oft benötigen FPGAs aus Betriebssicherheitsgründen einen synchronen Reset inmitten des Betriebs durch eine Instanz wie einen Controller, wenn ein Fehler detektiert wurde. In diesen Fällen ist ein asynchroner Reset unnötig.&lt;br /&gt;
&lt;br /&gt;
* asynchrone Resets sollten nur an von einander unabhängigen Punkten der Schaltungselektronik angewendet werden, wie z.B. an verschiedenen Chips, wo man ohnehin keine totale Synchronität unterstellt und Massnahmen zum sicheren Anlaufen aller Schaltungsteile ergreifen muss.&lt;br /&gt;
&lt;br /&gt;
* asynchrone Resets müssen in jeder einzelnen domain getrennt eingetaktet werden, um sie sicher in synchrone Resets zu überführen&lt;br /&gt;
&lt;br /&gt;
* Innerhalb eines FPGAs sollten asnchrones Resets an z.B. PLLs geführt werden, damit deren Reset nicht von einer zweiten PLL abhängig ist.&lt;br /&gt;
&lt;br /&gt;
* Sollen FPGAs in ASICs übersetzt werden und dort unbedingt ein asynchroner Reset verwendet werden müssen, können asynchrone Resets bedingt compilierbar eingebaut werden, sodass sie im FPGA nicht zwangsläufig aktiv sein müssen&lt;br /&gt;
&lt;br /&gt;
==== Standardresetpfad in FPGAs ====&lt;br /&gt;
&lt;br /&gt;
Ein probates und meistens sehr gut funktionierendes Design sieht folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
* externer asynchroner Reset vom IO-PAD (bei nReset über Inverter) direkt im Top-Level an die Master-PLL / bzw den Haupt-DCM, genannt &amp;quot;PLL1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Die &amp;quot;PLL1&amp;quot; generiert neben den Takten ein LOCKED-Signal, das in invertierter Form als Reset für diese domain benutzt wird. Aus dem aynchronen Reset wird dadurch mittels des LOCK-Signals ein interner, synchroner Reset&lt;br /&gt;
&lt;br /&gt;
* Dieser interne Reset wird in jeder einzelnen Teildomain dieser PLL zweimmal einsynchronisiert, um lokale Reset-Signale zu erzeugen. Damit werden die Auswirkungen metastabiler Zustände verhindert, die bei der negativen Resetflanke entstehen könnten, falls die Taktflanken der erzeugten PLL-Takte genau auf dieser Flanke liegen&lt;br /&gt;
&lt;br /&gt;
* Der interne Reset der &amp;quot;PLL1&amp;quot; versorgt zudem auch alle weiteren PLLs der anderen Domains, die sich ihren lokalen Reset auf dieselbe Weise generieren. Der in der domain der PLL1 synchrone reset wirkt bei diesen PLLs quasi asynchron.&lt;br /&gt;
&lt;br /&gt;
Damit wird sichergestellt dass alle PLLs einen eigenen Reset bekommen und sie danach definitiv anlaufen. Es ist nun wichtig, dass beachtet wird, dass der exakte Zeitpunkt der Resets der unterschiedlichen domains unbekannt ist. Daher müssen die locked-signale dieser domains gfs wieder einsynchronsiert werden, damit in der Master-Domain bekannt ist, wenn alle Teilschaltungen angelaufen sind und das Design &amp;quot;starten&amp;quot; kann.&lt;br /&gt;
&lt;br /&gt;
Bei kritischen Applikationen muss gegebenenfalls auch noch dafür gesorgt werden, dass in der Phase zwischen Start des FPGAs und Arbeiten aller PLLs alle FPGA-Ausgänge auf einem passenden Pegel gehalten werden.&lt;br /&gt;
&lt;br /&gt;
===Wann und warum verwendet man Variablen?===&lt;br /&gt;
&lt;br /&gt;
* Variablen sind als Zwischenergebnisse / Synonyme für aus Kombinatorik gewonnene Werte / Signale zu verstehen. Sie erhalten jeweils &amp;quot;sofort&amp;quot; nach der Zuweisung ihren neuen Wert, der direkt an anderer Stelle genutzt werden kann - so, als läge eine direkte Verdrahtung vor. Die Nutzung von Variablen entkoppelt somit jegliche Berechung von den zeitlichen Randbedingungen, speziell dem Takt. Damit ist es möglich, komplexe Architekturen und Modellverhalten innerhalb von Simulationen ohne einen Zeitverlust zu berechnen, siehe Beispiele unten.&lt;br /&gt;
&lt;br /&gt;
* Signale erhalten ihren neu zugewiesenen Wert dagegen erst nach dem vollständigen Abarbeiten eines Prozesses, praktisch nach einem Delta-Delay oder nach einer spezifizierten Zeit. Sie repräsentieren eine physikalische Signalkette mit tatsächlichem Datenfluss. Während Variablen daher in einem Prozess gleich weiterverwendet werden können, sind Signale faktisch erst mit dem nächsten Takt aktuell (das Delta-Delay führt dazu, dass der Wert für diesen Durchlauf noch nicht gilt, der nächste Durchlauf des getakteten Prozesses passiert dann erst einen Clockcycle später.&lt;br /&gt;
&lt;br /&gt;
* Bei asynchronen Prozessen wird der Prozess bei der Verwendung von Signalen dann nochmals gestartet ... (oder so oft, so viele voneinander abhängige Signalzuweisungen drin sind), bei Variablen wird er in einem Durchlauf berechnet (Simulationszeit!).&lt;br /&gt;
&lt;br /&gt;
* Die Benutzung von Variablen gegenüber Signalen hat mitunter Vorteile im Bereich der Ausführungszeit bei Simulationen, wenn umfangreiche Berechnungen nötig sind, die ansonsten mit Vektoren durchgeführt werden müssten.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
==== Beispiel 1 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
-- Nutzung von Signalen&lt;br /&gt;
-- die letzte Anweisung ist gültig und überschreibt alle vorhergehenden Anweisungen&lt;br /&gt;
&lt;br /&gt;
-- steht real in der Signaldefinition über begin&lt;br /&gt;
signal a: std_logic;&lt;br /&gt;
&lt;br /&gt;
process(clk)&lt;br /&gt;
begin&lt;br /&gt;
  if rising_edge(clk) then&lt;br /&gt;
    a &amp;lt;= a and b;&lt;br /&gt;
    a &amp;lt;= a and c;&lt;br /&gt;
  end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-- Ergebnis: a &amp;lt;= a and c, die Zeile zuvor wird ignoriert&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
-- Nutzung von Variablen&lt;br /&gt;
-- Aufeinanderfolgende Anweisungen werden sofort logisch wirksam und in die neue Anweisung einbezogen, die Anweisungen werden somit verkettet&lt;br /&gt;
&lt;br /&gt;
process(clk)&lt;br /&gt;
  variable a: std_logic;&lt;br /&gt;
begin&lt;br /&gt;
  if rising_edge(clk) then&lt;br /&gt;
    a := a and b;&lt;br /&gt;
    a := a and c;&lt;br /&gt;
  end if;&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
-- Ergebnis: a &amp;lt;= a and b and c, Verkettung der Anweisung wie in normalen Programmiersprachen&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Es kann recht unübersichtlich werden, wenn man eine komplexe Berechnung hat und diese mit vielen Klammerebenen verschachtelt direkt in der Signalzuweisung beschreibt. Hier kann es besser sein, den Wert &amp;quot;nach und nach&amp;quot; über Variablen &amp;quot;zusammenzubauen&amp;quot; und erst am Schluss auf ein Signal zuzuweisen.&lt;br /&gt;
&lt;br /&gt;
* Manchmal möchte man gemeinsame Teilausdrücke vorab berechnen, z.&amp;amp;nbsp;B.&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
  Var1 := A + B;&lt;br /&gt;
  Var2 := C + D;&lt;br /&gt;
  Var3 := E + F;&lt;br /&gt;
  Result1 &amp;lt;= Var1 - Var2;&lt;br /&gt;
  Result2 &amp;lt;= Var1 - Var3;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
ist i.d.R. besser als&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
  Result1 &amp;lt;= (A + B) - (C + D);&lt;br /&gt;
  Result2 &amp;lt;= (A + B) - (E + F);&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
Wenns komplexer wird, ist es auch einfacher, daran was zu ändern.&lt;br /&gt;
&lt;br /&gt;
* Verschiedenen Synthesetools können manchmal mehr, manchmal weniger gut optimieren. So kann man z.&amp;amp;nbsp;B. durch das Zusammenfassen eines Teilausdruckes eine bessere Optimierung erreichen (Stichwort Resource-Sharing). Z.B.:&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
  if (opcode = add) then&lt;br /&gt;
    res &amp;lt;= a+b;&lt;br /&gt;
  else -- opcode = sub&lt;br /&gt;
    res &amp;lt;= a-b;&lt;br /&gt;
  end if;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
  if (opcode = add) then&lt;br /&gt;
    var1 := b;&lt;br /&gt;
  else&lt;br /&gt;
    var1 := -b;&lt;br /&gt;
  end if;&lt;br /&gt;
  res &amp;lt;= a+var1;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Fall wird ggf. ein Addierer und ein Subtrahierer (noch&#039;n Addierer) eingebaut und das Ergebniss gemultiplext, im zweiten Fall wird eventuell nur ein Addierer eingebaut und der b-Eingang des Addierers gemultiplext. Sind a und b beispielsweise 32-Bit-Vektoren, dann macht das HW-mäßig schon was aus.&lt;br /&gt;
Gute Synthesetools sollten dies aber mittlerweile automatisch machen, so das in beiden Fällen dasselbe rauskommt (war nicht immer so). (BTW, ich selber tendiere normalerweise zur ersten Variante, da besser lesbar - und man die HW-Implementierung nicht notwendigerweise vorwegnehmen soll, aber da hat jeder seine eigene Meinung zu ...)&lt;br /&gt;
&lt;br /&gt;
==== Beispiel 2 ====&lt;br /&gt;
Bei Analogen Filtern ist es oft notwendig, iterative Schleifen zu verwenden, um die Ergebnisse zu erlangen. Nur die Verwendung von Variablen und Loops gestattet es, komplexe Rechenergebnisse von &amp;quot;analoger&amp;quot; Reaktionsgeschwindigkeit vom Simulator zu erlangen, ohne Simulationszeit oder gar Takte vergehen zu lassen.&lt;br /&gt;
&lt;br /&gt;
==== Geschwindigkeit ====&lt;br /&gt;
Simulatoren rechnen i.d.R. mit Variablen schneller, als mit Signalen. Hat man also viele Prozesse mit Signalen vs. Variablen in einem großen Design, dann kann das schon was ausmachen ... Siehe auch oben bei asynchronen Prozessen, die mit Signalen ggf. wesentlich öfters durchlaufen werden. Auch wenn also ein System mit Signalen abzubilden ist, so empfiehlt sich der Einsatz von Variablen mitunter dennoch.&lt;br /&gt;
&lt;br /&gt;
Ausnahme: I.d.R. sind nur auf Signalen und getakteten Prozessen basierende Modelle voll und leicht synthesierbar. Soll z.&amp;amp;nbsp;B. ein Modell in einem [[HIL]] System getestet werden, ist die Verwendung von Signalen mit entsprechender Berücksichtigung des timing angezeigt.&lt;br /&gt;
&lt;br /&gt;
==== Anfängerprobleme ====&lt;br /&gt;
Anfänger meinen oft, die unmittelbare Zuweisung eines Werts an eine Variable im Prozess gewinnbringend nutzen zu können. So werden dann ausgiebig Variablen verwendet, und eines der Hauptprobleme von Variablen übersehen: sie können nicht in der Sensitivliste eines Prozesses aufgeführt werden. Von diesem Nebeneffekt sind insbesondere &#039;&#039;speichernde&#039;&#039; Variablen betroffen. Im Beitrag &lt;br /&gt;
http://www.mikrocontroller.net/topic/117630 sind dort ein paar Beispiele aufgeführt.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Hauptproblem an diesem Verhalten ist, dass die (fehlerfreie) Simulation nicht mehr zum Syntheseergebnis (das ebenfalls fehlerfrei und ohne Warnungen erzeugt wurde) passt.&lt;br /&gt;
&lt;br /&gt;
=== Kodierschaltungen ===&lt;br /&gt;
Kodierschaltungen (Coder) sind Schaltungen mit einem mehrstelligen Ein- und Ausgang. In der Schaltung werden keine FF oder andere Speicher benutzt. Ein typisches Beispiel ist die Wandlung einer Binärzahl in eine Binär Codierte Dezimalzahl. Eine sehr übersichtliche Schreibweise benutzt ein Konstanten-Feld. &lt;br /&gt;
&lt;br /&gt;
Vor- und Nachteile verschiedener VHDL-Varianten einen Coder zu beschreiben werden [[TTL74185|hier]] besprochen. &lt;br /&gt;
&lt;br /&gt;
===If außerhalb eines Prozesses?===&lt;br /&gt;
If-Bedinungen sind außerhalb eines Prozesses nicht möglich.&lt;br /&gt;
Lösung:&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
 vector_or &amp;lt;= &#039;0&#039; when oder_vector = X&amp;quot;0000&amp;quot; else &#039;1&#039;;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
Dies nennt der Fachmann bedingte Zuweisung (conditional assignment), es ist eine der &#039;&#039;nebenläufigen&#039;&#039; Anweisungen von VHDL. Daneben gibt es zu ähnlichem Zweck eine select-Anweisung:&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
 with vector select&lt;br /&gt;
   bit_pos &amp;lt;= &amp;quot;00&amp;quot; when &amp;quot;0001&amp;quot;,&lt;br /&gt;
              &amp;quot;01&amp;quot; when &amp;quot;0010&amp;quot;,&lt;br /&gt;
              &amp;quot;10&amp;quot; when &amp;quot;0100&amp;quot;,&lt;br /&gt;
              &amp;quot;11&amp;quot; when &amp;quot;1000&amp;quot;,&lt;br /&gt;
              &amp;quot;00&amp;quot; when others;&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für sperrige Fälle, die sich partout nicht lesbar und/oder elegant mittels dieser nebenläufigen Zuweisungen formulieren lassen, bietet sich entweder ein kombinatorischer Prozess an oder man verpackt die Zuweisung in eine Funktion. In beiden Fällen kann man dann den Ergebnisvektor schrittweise mit if-Abfragen zusammenbauen.&lt;br /&gt;
&lt;br /&gt;
=== Alle Leitungen auf &amp;quot;0000..&amp;quot; bzw &amp;quot;1111...&amp;quot; setzen? ===&lt;br /&gt;
&lt;br /&gt;
Auf null setzen:&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
count &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf eins setzen:&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
count &amp;lt;= (others =&amp;gt; &#039;1&#039;);&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vergleich eines std_logic_vector mit einer Konstanten===&lt;br /&gt;
&lt;br /&gt;
Um einen std_logic_vector auf &amp;quot;00000...&amp;quot; oder &amp;quot;1111...&amp;quot; zu vergleichen, kann die (others =&amp;gt; &#039;0&#039;) Schreibweise nicht verwendet werden, weil die Vektorbreite dabei nicht definiert ist. Hier muss also ein Bereich angegeben werden:&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
if VECTOR = (15 downto 0=&amp;gt;&#039;0&#039;) then..&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
if VECTOR = (VECTOR&#039;range=&amp;gt;&#039;0&#039;) then...&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
Diese Schreibweise gilt universell für alle Libs.&lt;br /&gt;
&lt;br /&gt;
Werte ungleich &amp;quot;000..&amp;quot; und &amp;quot;1111...&amp;quot; müssen bei Verwendung der NUMERIC_STD.ALL etwas aufwendiger umgewandelt werden (hier der Wert 77):&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
if VECTOR = std_logic_vector(to_unsigned(77,VECTOR&#039;length)) then...&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird die herstellerabhängige Synopsis-Lib STD_LOGIC_UNSIGNED.ALL verwendet, kann auch einfach so geschrieben werden:&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
if VECTOR = 0 then...&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
Genauso einfach geht ein Vergleich auf z.&amp;amp;nbsp;B. den Wert 77:&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
if VECTOR = 77 then...&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Report von std_logic_vector===&lt;br /&gt;
&lt;br /&gt;
Report kann nur Strings verarbeiten, deswegen muss ein std_logic_vector in einen String verwandelt werden:&lt;br /&gt;
&amp;lt;vhdl&amp;gt;&lt;br /&gt;
report integer&#039;image(to_integer(unsigned(rdata)));&lt;br /&gt;
&amp;lt;/vhdl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===parallel -&amp;gt; seriell: Schieberegister oder Multiplexer?===&lt;br /&gt;
* http://www.mikrocontroller.net/topic/78556&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
&lt;br /&gt;
=== VHDL-Bespiele ===&lt;br /&gt;
* [http://www.lothar-miller.de/s9y/categories/4-FPGA Beispiel von Lothar Miller]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/VHDL_Softwarepool VHDL Software Pool]&lt;br /&gt;
&lt;br /&gt;
===Kurzreferenzen===&lt;br /&gt;
* [http://www.tcnj.edu/~hernande/r/VHDL_QRC__01.pdf VHDL Quick Reference Card]&lt;br /&gt;
* [http://www.lrr.in.tum.de/~acher/tgi/uebung/VHDL-Buch.pdf VHDHL buch als PDF]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment/21066/VHDL_Coding_eng.pdf - Design Rules &amp;amp; Coding Style (PDF)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Online-Bücher===&lt;br /&gt;
http://de.wikibooks.org/wiki/VHDL&lt;br /&gt;
&lt;br /&gt;
====Deutsch====&lt;br /&gt;
* [http://www.nt-nv.fh-koeln.de/Labor/VhdlEasy/index.html VHDL easy] - deutschsprachige VHDL-Einführung von der FH Köln&lt;br /&gt;
* [http://digbib.ubka.uni-karlsruhe.de/volltexte/documents/202594 Schaltungsdesign mit VHDL] - komplettes Buch als PDF&lt;br /&gt;
* [http://tams-www.informatik.uni-hamburg.de/vhdl/doc/kurzanleitung/vhdl.pdf VHDL Kurzanleitung] - Umfangreiches Buch der Uni Hamburg, deutschsprachig, ca. 110 Seiten &lt;br /&gt;
* [http://www.informatik.uni-ulm.de/ni/Lehre/SS03/ProSemFPGA/VHDL-Grundlagen.pdf VHDL Grundlagen] 15 Seiten Grundlagen, Universität Ulm&lt;br /&gt;
* [http://wwwlrh.fh-bielefeld.de/vhdl_vor/VHDL_VOR.htm Schaltungs-Synthese mit VHDL] eine Einfuehrung&lt;br /&gt;
* [http://de.wikibooks.org/wiki/VHDL VHDL - Wiki - Buch] VHDL Syntax mit vielen Beispielen. Da es sich um ein Wiki steht jede Woche mehr (korrigierter) Inhalt zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
====English====&lt;br /&gt;
* [http://tams-www.informatik.uni-hamburg.de/vhdl/ Hamburg VHDL archive]&lt;br /&gt;
* [http://www.ti.informatik.uni-frankfurt.de/Docs/cook/ VHDL Cookbook] - komplettes Buch&lt;br /&gt;
* [http://www.fpga4fun.com/VHDLTips.html VHDL Tips and Tricks]&lt;br /&gt;
* [http://www.doulos.com/knowhow/vhdl_designers_guide/ The Designer&#039;s Guide to VHDL]&lt;br /&gt;
* [http://esd.cs.ucr.edu/labs/tutorial/ VHDL Tutorial: Learn by Example] - viele Beispiele mit Testbenches&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;br /&gt;
[[Category:Programmiersprachen]]&lt;br /&gt;
[[Kategorie:VHDL| ]]&lt;/div&gt;</summary>
		<author><name>0:0:0:FFFF:87:184:238:159</name></author>
	</entry>
</feed>